@restregular/dsh-notepad 0.1.0 → 0.2.0
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.md +66 -21
- package/client.js +1342 -217
- package/index.js +4 -2
- package/lib/note-store.js +158 -25
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# dsh-notepad
|
|
2
2
|
|
|
3
|
-
在 DeepSeek Harness
|
|
3
|
+
在 DeepSeek Harness 的会话界面里放一张**属于当前工作区**的分段便签浮窗:一行一个问题、一段一个卡片,回车就能新建下一段;需要时把某一段、或勾选后的多段一起插入 / 替换 / 发送到对话框。
|
|
4
4
|
|
|
5
|
-
> A per-workspace floating notepad for DeepSeek Harness sessions.
|
|
5
|
+
> A per-workspace floating segmented notepad for DeepSeek Harness sessions. Enter creates a new segment card; insert, replace, or send one segment or a multi-selection; sending archives the segment automatically. Notes live in `<workspace>/.dsh/notepad.json` and are shared by every session opened from that workspace.
|
|
6
6
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
@@ -12,43 +12,87 @@ dsh plugin --profile web add @restregular/dsh-notepad
|
|
|
12
12
|
|
|
13
13
|
安装后重启 / 重新打开 DSH(或刷新页面),打开任意一个会话即可看到右下角的「记事本」浮窗。
|
|
14
14
|
|
|
15
|
+
## 界面
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌────────────────────────────────────────────┐
|
|
19
|
+
│ ● 记事本 [workspace] 复制 归档+ 折叠 最小化 │
|
|
20
|
+
│ ☐ 全选 勾选分段可批量操作 ↙ ⇄ ➤ 归档 │
|
|
21
|
+
│ ┌────────────────────────────────────────┐ │
|
|
22
|
+
│ │ ☐ 01 ↙ ⇄ ➤ 归档 │
|
|
23
|
+
│ │ 记录第一段…… │ │
|
|
24
|
+
│ └────────────────────────────────────────┘ │
|
|
25
|
+
│ ┌────────────────────────────────────────┐ │
|
|
26
|
+
│ │ ☐ 02 ↙ ⇄ ➤ 归档 │
|
|
27
|
+
│ │ 记录第二段…… │ │
|
|
28
|
+
│ └────────────────────────────────────────┘ │
|
|
29
|
+
│ 已保存 · 42 字符 · 2 段 Enter 新建分段… │
|
|
30
|
+
└────────────────────────────────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- **回车 / Enter**:把当前分段从光标处拆开,创建一张新的分段卡片(光标前的文字留在原卡片,光标后的文字进入新卡片)。在末尾回车就是新建一个空分段。
|
|
34
|
+
- **Shift + Enter**:分段内换行。
|
|
35
|
+
- **Ctrl / Cmd + Enter**:把当前分段(有勾选时改为勾选的多段)插入对话框。
|
|
36
|
+
- 卡片上的 **↙** 插入此段;**⇄** 用此段替换整个对话框内容;**➤** 直接发送此段。
|
|
37
|
+
|
|
15
38
|
## 功能
|
|
16
39
|
|
|
17
40
|
| 操作 | 入口 | 说明 |
|
|
18
41
|
| --- | --- | --- |
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
42
|
+
| 新建分段 | 标题栏 `+`,或分段末尾按回车 | 新卡片自动获得焦点 |
|
|
43
|
+
| 编辑分段 | 点击卡片文本区 | 停止输入约 0.5 秒后自动保存 |
|
|
44
|
+
| 单段插入 | 卡片上的左下箭头 | 插入到当前会话输入框光标处,不发送 |
|
|
45
|
+
| 多段插入 | 勾选分段 → 工具栏左下箭头,或全选后操作 | 按卡片顺序用空行合并后一次插入 |
|
|
46
|
+
| 替换对话框 | 卡片上的 ⇄,或勾选后工具栏 ⇄ | 用该段 / 多段合并内容替换整个输入框 |
|
|
47
|
+
| 单段发送 | 卡片上的纸飞机 | 直接发进当前会话;发送成功后自动归档该段 |
|
|
48
|
+
| 多段发送 | 勾选分段 → 工具栏纸飞机 | 合并成一条消息发送;发送成功后自动归档这些段 |
|
|
49
|
+
| 全选 | 列表上方「全选」复选框 | 一键选中所有未归档分段,再点一次取消 |
|
|
50
|
+
| 归档 | 卡片上的归档图标,或工具栏归档图标 | 把分段移入归档区(不发送) |
|
|
51
|
+
| 显示 / 隐藏归档 | 标题栏归档图标(带数量角标) | 展开 / 收起归档区,状态按浏览器记忆 |
|
|
52
|
+
| 恢复 | 归档卡片上的恢复图标 | 把归档分段放回未归档列表 |
|
|
53
|
+
| 删除 | 归档卡片上的垃圾桶 | **只有已归档分段可以删除**,可撤销 |
|
|
54
|
+
| 清空归档 | 归档区标题「清空归档」 | 批量删除归档,可撤销 |
|
|
55
|
+
| 复制全部 | 标题栏复制按钮 | 复制所有分段(含归档),用空行合并 |
|
|
56
|
+
| 调整尺寸 | 拖动右下角斜纹手柄 | 宽高按浏览器记忆,最小 320 × 240 |
|
|
57
|
+
| 折叠 / 展开 | 标题栏上下折叠箭头 | 只保留标题栏,内容继续自动保存 |
|
|
58
|
+
| 最小化 / 恢复 | 标题栏最小化图标,或 `Ctrl/Cmd + Shift + N` | 收成右下角小图标,带平滑过渡 |
|
|
59
|
+
| 拖动位置 | 按住标题栏拖动 | 位置按浏览器记忆 |
|
|
26
60
|
|
|
27
61
|
同一个工作区里的不同会话共用同一份笔记:在 A 会话写的内容,切到同工作区的 B 会话仍然在。切换工作区时浮窗自动加载对应工作区的文件。
|
|
28
62
|
|
|
63
|
+
## 深色模式与字体
|
|
64
|
+
|
|
65
|
+
- 浮窗使用 DSH 主题变量(`--dsw-alias-*`)和 DSH 的正文字体变量 `--dsw-font-family`,与系统 / 设置里的界面字体一致,不再使用等宽字体。
|
|
66
|
+
- 深色模式跟随宿主 `body[data-ds-dark-theme]`,对卡片阴影、选中底色、归档弱化等做了单独适配。
|
|
67
|
+
- 折叠、显示 / 隐藏、归档展开都有过渡动画,并尊重 `prefers-reduced-motion`。
|
|
68
|
+
|
|
29
69
|
## 数据与边界
|
|
30
70
|
|
|
31
71
|
- 笔记保存在 **`<工作区>/.dsh/notepad.json`**,是普通 UTF-8 JSON:
|
|
32
72
|
|
|
33
73
|
```json
|
|
34
74
|
{
|
|
35
|
-
"version":
|
|
36
|
-
"
|
|
37
|
-
|
|
75
|
+
"version": 2,
|
|
76
|
+
"segments": [
|
|
77
|
+
{ "id": "seg-1", "text": "遇到的问题\n下一步:补测试" },
|
|
78
|
+
{ "id": "seg-2", "text": "已发送的分段", "archived": true, "archivedAt": "2026-10-23T03:20:00.000Z" }
|
|
79
|
+
],
|
|
80
|
+
"text": "遇到的问题\n下一步:补测试\n\n已发送的分段",
|
|
81
|
+
"updatedAt": "2026-10-23T03:20:01.000Z"
|
|
38
82
|
}
|
|
39
83
|
```
|
|
40
84
|
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
- 每个工作区一份笔记,最多 **512 KB
|
|
85
|
+
`text` 是 `segments` 用空行合并后的副本,方便人工查看,也兼容旧版本。旧版单段文件(只有 `text`)和手动改成纯文本的文件会在读取时迁移成一个分段。
|
|
86
|
+
- 浮窗位置、尺寸、折叠 / 最小化 / 隐藏状态、归档区是否展开保存在浏览器 `localStorage` 的 `dsh-notepad.ui.v1` 中,按浏览器 / 设备生效,不写入工作区。
|
|
87
|
+
- 每个工作区一份笔记,最多 **200 段 / 512 KB**(单段输入框限制 16 万字符)。笔记是纯文本,不做 Markdown 渲染。
|
|
44
88
|
- 浮窗只在**会话视图**出现:打开设置等非会话页面时自动隐藏,回到会话后恢复。
|
|
45
89
|
- 写入走宿主同源回环路由 `/dsh-notepad/api/note`,只接受 127.0.0.1 的同源请求,并且只允许当前会话的 cwd 或已注册工作区,不能用来读写工作区里的其它文件。
|
|
46
90
|
- 窗口重新获得焦点时,如果本地没有未保存的修改,会自动读取磁盘上的最新内容;多窗口同时编辑时以最后一次保存为准。
|
|
47
91
|
|
|
48
92
|
## 实现
|
|
49
93
|
|
|
50
|
-
- **Host**(`index.js` + `lib/note-store.js`):`ctx.inject(['webServer'])` 注册 `/dsh-notepad/api` 下的 `GET/PUT /note`,用临时文件 + rename 原子写入 `.dsh/notepad.json`。
|
|
51
|
-
- **Client**(`client.js`):整个 bundle 包在 IIFE 里;通过 `shell.overlay` 注册浮窗,读取 `uiSession.adapter.current`
|
|
94
|
+
- **Host**(`index.js` + `lib/note-store.js`):`ctx.inject(['webServer'])` 注册 `/dsh-notepad/api` 下的 `GET/PUT /note`,用临时文件 + rename 原子写入 `.dsh/notepad.json`;`GET` 返回 `segments` 与合并后的 `text`,`PUT` 接受 `{ segments: [...] }`,也兼容旧的 `{ text }`。
|
|
95
|
+
- **Client**(`client.js`):整个 bundle 包在 IIFE 里;通过 `shell.overlay` 注册浮窗,读取 `uiSession.adapter.current` 得到当前会话与工作区。插入 / 替换通过会话绑定里的 `inputActions.captureInsertion()/insertText()` 与 `setDraft()`;发送优先走 `sessions.scope(id).conversation.send()`,并回退到 `sessions.binding(id).session.prompt()`。
|
|
52
96
|
- 文案通过宿主 `locale` 服务注册中英文;找不到 locale 时按浏览器语言回退。
|
|
53
97
|
|
|
54
98
|
## 开发
|
|
@@ -72,13 +116,14 @@ node test/package.test.mjs
|
|
|
72
116
|
npm test
|
|
73
117
|
```
|
|
74
118
|
|
|
75
|
-
`test/client-smoke.mjs` 会真正执行 `apply(ctx)`
|
|
119
|
+
`test/client-smoke.mjs` 会真正执行 `apply(ctx)` 并渲染浮窗,覆盖:分段加载、编辑自动保存、回车拆分、单段/多段插入与替换、单段/多段发送与自动归档、归档显示隐藏、归档恢复与删除(含撤销)、全选、折叠、最小化 / 恢复、拖动调整尺寸、全局快捷键、深色模式与字体 CSS、重复执行 bundle 的兼容性。
|
|
76
120
|
|
|
77
121
|
## 已知限制
|
|
78
122
|
|
|
79
|
-
- 浮窗不会自动把内容推给 Agent
|
|
80
|
-
-
|
|
81
|
-
-
|
|
123
|
+
- 浮窗不会自动把内容推给 Agent;发送使用当前会话的排队发送,需要 Agent 可接收消息。
|
|
124
|
+
- 发送按钮依赖 DSH 的会话接口;接口不可用时降级为插入输入框并提示。
|
|
125
|
+
- 不做富文本、附件或跨工作区共享。
|
|
126
|
+
- 位置和尺寸是全局的(不按工作区分别记忆);如果同时打开多个 DSH 窗口,它们在同一个浏览器里共享这份设置。
|
|
82
127
|
|
|
83
128
|
## License
|
|
84
129
|
|