@restregular/dsh-filekit 0.0.0-stage → 0.2.2
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/LICENSE +21 -0
- package/README.md +160 -2
- package/client.js +3385 -0
- package/cordis.patch.yml +10 -0
- package/icon.svg +15 -0
- package/index.js +651 -0
- package/lib/filekit.js +586 -0
- package/lib/notice.js +48 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +65 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 RestRegular
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,161 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-filekit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
FileKit 是 DeepSeek Harness 的**工作区文件工具**插件。它接管右侧「工作区文件」面板,加入右键菜单、拖拽移动、重命名、编辑、复制路径、引用到对话框,以及可恢复删除;同时提供一个独立的 **FileKit 文件管理页**和一个**设置页**。每次从界面发起的修改都会自动作为一条精简的变更提醒注入当前会话的 Agent。
|
|
4
|
+
|
|
5
|
+
> FileKit upgrades the DeepSeek Harness right-sidebar workspace files panel with context menus, drag-to-move, rename, edit, copy path, reference-into-composer, and recoverable deletes, plus a standalone FileKit page and a settings page. UI mutations are reported to the live Agent as a one-line change notice.
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
dsh plugin --profile web add @restregular/dsh-filekit
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
安装并重新打开会话后:
|
|
14
|
+
|
|
15
|
+
- 右侧边栏的**开始页**里,「工作区文件」卡片下方多出一个 **FileKit 文件工具** 按钮:点击会在侧边栏中新开 FileKit 页(不是弹窗);
|
|
16
|
+
- 打开「工作区文件」页:树里的文件/目录支持**右键菜单**和**拖拽移动**;
|
|
17
|
+
- 设置 → **FileKit**:显示隐藏文件、Agent 变更提醒、删除确认、自动刷新、编辑器字号;
|
|
18
|
+
- 预览文件时,文件预览标题栏右侧仍有**编辑 / 引用 / 更多**按钮。
|
|
19
|
+
|
|
20
|
+
## 功能
|
|
21
|
+
|
|
22
|
+
### 工作区文件树(接管原生文件页)
|
|
23
|
+
|
|
24
|
+
| 操作 | 入口 | 说明 |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| 展开 / 收起目录 | 点击目录行 | 懒加载每层目录,展开状态保留 |
|
|
27
|
+
| 打开预览 | 点击文件行 / 右键 | 在侧边栏预览文件 |
|
|
28
|
+
| 右键菜单 | 文件 / 目录 / 空白处 | 新建、重命名、移动、复制、复制路径、引用、删除等 |
|
|
29
|
+
| 拖拽移动 | 拖动行到目录行 / 根目录 | 拖到目录上即移动;禁止把目录拖进自身 |
|
|
30
|
+
| 新建文件 / 文件夹 | 右键菜单 | 在当前目录或目标目录创建 |
|
|
31
|
+
| 重命名 | 右键菜单 | 只改名字,不改变所在目录 |
|
|
32
|
+
| 移动到… | 右键菜单 | 目录选择器 |
|
|
33
|
+
| 复制 / 剪切 | 右键菜单 | 把条目放进 FileKit 剪贴板,不立即改动磁盘 |
|
|
34
|
+
| 粘贴 | 目录 / 空白处右键 | 粘贴到该目录;重名时自动用 `名称 (2).扩展名`,不会覆盖 |
|
|
35
|
+
| 复制路径 | 右键菜单 | 相对路径与绝对路径 |
|
|
36
|
+
| 引用到对话框 | 右键菜单 | 插入 `@相对路径 `;输入框不可用时退回复制 |
|
|
37
|
+
| 删除到回收站 | 右键菜单 | 移动到 `<工作区>/.dsh-trash`,可恢复 |
|
|
38
|
+
| 在 FileKit 中打开 | 右键菜单 / 标题栏按钮 | 打开完整文件管理页 |
|
|
39
|
+
|
|
40
|
+
### FileKit 文件管理页
|
|
41
|
+
|
|
42
|
+
- 独立侧边栏标签页(`filekit` kind),不是浮层弹窗;
|
|
43
|
+
- 面包屑浏览、新建、复制、移动、删除、回收站;
|
|
44
|
+
- 内置文本编辑器(与内置预览同一个 Shiki 高亮器、`Ctrl/Cmd+S` 保存、未保存守卫、保存后刷新);
|
|
45
|
+
- 右键菜单与拖拽移动;
|
|
46
|
+
- 有未保存修改时,关闭标签页会被阻止并提示先保存或放弃。
|
|
47
|
+
|
|
48
|
+
### 设置页
|
|
49
|
+
|
|
50
|
+
设置 → FileKit:
|
|
51
|
+
|
|
52
|
+
| 设置 | 默认 | 作用 |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| 显示隐藏文件 | 开 | 显示以 `.` 开头的条目 |
|
|
55
|
+
| 变更后提醒 Agent | 开 | 关闭后不注入变更提醒,节省上下文 token |
|
|
56
|
+
| 删除前确认 | 开 | 关闭后删除直接进入回收站 |
|
|
57
|
+
| 自动刷新 | 关闭 | 15 / 30 / 60 秒重新读取展开的目录 |
|
|
58
|
+
| 编辑器字号 | 12px | FileKit 文本编辑器字号 |
|
|
59
|
+
|
|
60
|
+
设置保存在浏览器 `localStorage`(`dsh-filekit.settings.v1`),按浏览器/设备生效。
|
|
61
|
+
|
|
62
|
+
## Agent 变更通知
|
|
63
|
+
|
|
64
|
+
从界面发起写操作(新建、保存、重命名、移动、复制、删除、恢复、清空回收站)时,Host 会向该会话的 Agent 注入一条**不唤醒 Agent** 的上下文消息,例如:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
[FileKit · 工作区变更] 移动 docs/a.md → docs/b.md(工作区:D:\project\demo)。需要更多操作可调用 filekit 工具。
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- `inject()` 只把通知放进下一个已准入的步骤,空闲时不会叫醒 Agent;
|
|
71
|
+
- 通知是一条**完整的用户消息**(`id` + `role: "user"` + `content` + `source`)。`inject()` 不会补默认字段,缺字段的对象会被原样写进会话历史,之后每次请求都会失败;
|
|
72
|
+
- 读取、展开目录、刷新、复制路径不会产生通知;
|
|
73
|
+
- 原地移动/重命名(`unchanged`)不会产生通知;
|
|
74
|
+
- 设置里关闭「变更后提醒 Agent」后,界面请求会带 `notify: false`,Host 直接跳过注入。
|
|
75
|
+
|
|
76
|
+
## `filekit` 模型工具
|
|
77
|
+
|
|
78
|
+
Host 同时注册 `filekit` 工具,和界面共用同一套操作实现:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
action: list | read | write | create | rename | move | copy | delete
|
|
82
|
+
trash | restore | purge | emptyTrash
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- `path` / `toDir` 都是工作区相对路径,使用 `/` 分隔;
|
|
86
|
+
- `delete` 是移动到回收站,不是永久删除;
|
|
87
|
+
- `trash` 列出回收站,`restore` / `purge` / `emptyTrash` 管理回收站;
|
|
88
|
+
- `write` 支持 `expectedMtimeMs` 做乐观并发保护,冲突时返回 `conflict`。
|
|
89
|
+
|
|
90
|
+
## 回收站布局
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
<workspace>/
|
|
94
|
+
.dsh-trash/
|
|
95
|
+
<时间戳>-<随机串>/
|
|
96
|
+
meta.json # name / originalPath / kind / deletedAt / size
|
|
97
|
+
item # 被移动的文件或目录
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
恢复会把 `item` 移回 `originalPath`;原路径已被占用时恢复失败,避免覆盖。`.dsh-trash` 在文件树和 FileKit 中隐藏。
|
|
101
|
+
|
|
102
|
+
## 安全与边界
|
|
103
|
+
|
|
104
|
+
- Host 只接受来自回环地址、且 `Origin` 与 `Host` 一致的请求(防 CSRF)。
|
|
105
|
+
- 每个请求都必须给出一个**已注册工作区**根目录,或与请求会话的工作目录完全一致;否则返回 `unknown-workspace`。
|
|
106
|
+
- 写文件是原子写入(同目录临时文件 + rename),并通过 `expectedMtimeMs` 检测外部修改。
|
|
107
|
+
- 文本读取上限 2 MiB;二进制文件(前 8 KiB 含 NUL)只显示元信息,不能用编辑器修改。
|
|
108
|
+
- 不跟随符号链接写文件;指向工作区外的符号链接读取也会被拒绝。
|
|
109
|
+
- 目录移动/复制会检查目标不是自身或其子目录。
|
|
110
|
+
|
|
111
|
+
## 已知限制
|
|
112
|
+
|
|
113
|
+
- 文件树只能操作当前会话的工作区根目录。
|
|
114
|
+
- 回收站恢复要求原父目录仍然存在;父目录被改名或删除时需要先手动恢复目录。
|
|
115
|
+
- Host 路由只监听本机回环地址;如果通过 Pocket/公网隧道在另一台设备上打开页面,界面数据请求会被拒绝(有意的安全边界)。
|
|
116
|
+
- 编辑器按 UTF-8 读写,不做编码转换;超限文件以只读截断方式展示。
|
|
117
|
+
- 文件剪贴板是页面内存状态(不是系统剪贴板),刷新页面或重启 DSH 后清空。
|
|
118
|
+
- 接管文件页后,宿主「在系统中打开目录」按钮不再出现在该页标题栏(宿主把该按钮挂在文件页的子槽位里,接管页不使用该子槽位)。
|
|
119
|
+
|
|
120
|
+
## 故障排查
|
|
121
|
+
|
|
122
|
+
### 会话报 `messages[N]: missing field role`(422)
|
|
123
|
+
|
|
124
|
+
0.2.0 及更早版本的变更通知没有带 `role` / `id`。只要从界面操作过文件,该会话的历史里就会留下一条不合法的 `user/message`,之后每次请求都会被 DeepSeek 以 422 `INVALID_REQUEST` 拒绝(重启也不会恢复,因为坏记录已经落盘)。0.2.1 起通知按完整用户消息构造,并在注入前做结构校验。
|
|
125
|
+
|
|
126
|
+
已经写坏的会话用仓库里的脚本修复(先关闭该会话,或退出 DSH;宿主在会话打开期间持有写锁):
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
node scripts/repair-session-log.mjs --dry-run # 只检查,不写盘
|
|
130
|
+
node scripts/repair-session-log.mjs <session-id> # 修复指定会话
|
|
131
|
+
node scripts/repair-session-log.mjs # 扫描 ~/.dsh/sessions 下全部会话
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
脚本只补 `dsh-filekit` 来源的缺失 `role` / `id`,其余记录保持字节不变;原日志备份为 `session.v4.jsonl.zstd.bak-<时间戳>`,修复后重新打开会话即可继续。
|
|
135
|
+
|
|
136
|
+
### 变更提醒没有生效
|
|
137
|
+
|
|
138
|
+
通知依赖插件 Host 半边加载。修改 `index.js` 后需要重启 DSH(或重新加载插件),客户端 `client.js` 的热更新不会加载 Host 代码。
|
|
139
|
+
|
|
140
|
+
## 开发
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
node --check index.js
|
|
144
|
+
node --check client.js
|
|
145
|
+
node --check scripts/repair-session-log.mjs
|
|
146
|
+
node --test test/*.test.mjs
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Host 入口 `index.js` 负责 `filekit` 工具与 `/dsh-filekit/api` 回环路由;共享操作在 `lib/filekit.js`;浏览器半边 `client.js` 注册:
|
|
150
|
+
|
|
151
|
+
- `sidebarRightTabs`:`files` 扩展类型(接管工作区文件页)与 `filekit` 页面类型;
|
|
152
|
+
- `sidebar.right.pane.tab`:两个页面主体;
|
|
153
|
+
- `sidebar.right.pane.tab.title`:两个标签页标题;
|
|
154
|
+
- `sidebar.right.tab.guide.entry`:开始页「工作区文件」卡片(下方带 FileKit 按钮);
|
|
155
|
+
- `sidebar.right.tab.document.actions`:文件预览头的编辑/引用/更多;
|
|
156
|
+
- `settings.section`:FileKit 设置页;
|
|
157
|
+
- `shell.overlay`:toast。
|
|
158
|
+
|
|
159
|
+
## License
|
|
160
|
+
|
|
161
|
+
MIT © 2026 RestRegular
|