dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Park thoughts while the AI is working — without interrupting the conversation.
⚠️ Disclaimer / 免责声明
Plugins run third-party code on your machine. Review the source before installing — this project is a community plugin, not affiliated with DeepSeek. / 插件会在你的机器上执行第三方代码,安装前请自行审阅源码;本项目为社区插件,与 DeepSeek 官方无关联。
Scenario — 你在和 AI 对话的过程中,突然想到"这个也想和 AI 聊聊"。
一句话:在"现在说会打断"和"晚点说会忘"之间,缺一个零成本的中间态。
稍后说 在输入框上方放了一条常驻便签条:想到什么,点开随手记一条(回车即可,不打断正在进行的对话),然后继续专注当前的事。等这轮聊完、你想聊那个话题了,一键把便签带进输入框草稿(只填草稿、不自动发送),确认后发送即可。
While the agent is busy writing, you think of something worth raising later.
稍后说 gives you a tiny strip above the composer: jot the thought, forget
about it, and when the current exchange is over push the parked items straight
into your next draft (never sent automatically), then delete them with one
click.
Requires the web profile (dsh web). / 需要 web 版 dsh(dsh web)。
# from a git checkout / 从 Git 仓库安装
dsh plugin --profile web add github:kevin-zx/dsh-park-notes
# or once published to npm / 或发布 npm 后:
dsh plugin --profile web add dsh-park-notes
Restart dsh web (or refresh the page after the live patch reload), and the
💡 稍后说 strip appears above the message composer in every session. /
重启 dsh web(或刷新页面),输入框上方即出现 💡 稍后说 条带。
Manual alternative — in $DSH_HOME/profiles/web/cordis.patch.yml / 手动方式:
- insert:
- id: park-notes
name: 'dsh-park-notes'
Use either the bundle install (dsh plugin add ...) or the manual
row — not both, or the row id collides. / 二选一,不能同时用,否则行 id 冲突。
One command pulls the latest main commit — then restart dsh web. / 一条
命令拉取 main 最新提交,然后重启 dsh web。
dsh plugin --profile web update dsh-park-notes
# then: Ctrl+C in the dsh web terminal, and start it again
Restarting is required, not optional. A page refresh is not enough: the
running host keeps the browser bundles it read at startup, and after a pnpm
re-install the bundle lives at a new store path, so the client-HMR file watcher
(which still watches the previous path) never notices the change. Restarting
re-reads both halves. / 必须重启,刷新页面不够:运行中的进程持有启动时读取的
浏览器 bundle 快照,而 pnpm 重新安装后 bundle 位于新的存储路径,客户端 HMR
的文件监视仍指向旧路径,因此永远发现不了变化;重启会重新读取两半边。
Check what is installed / 查看当前版本:
dsh-park-notes with its version. /
网页界面 设置 → 插件 里能看到 dsh-park-notes 的版本号。dsh web --dump-config | grep park-notes confirms the row is mounted. /
该命令可确认挂载行存在。Notes / 说明:
github:kevin-zx/dsh-park-notes) keeps tracking
main, so updates just work. Installing a pinned ref
(...#v0.5.0) freezes the version — re-add the unpinned spec to follow
again. / 不加 ref 安装才会跟随 main 更新;装了固定 tag(...#v0.5.0)
就冻结在那个版本,需要重新用不带 ref 的形式 add 一次。$env:HTTPS_PROXY="http://127.0.0.1:1080" style) or install a tarball. /
GitHub 不通时先设置代理环境变量,或改用 tarball 安装。/note <text> — type it in the composer and press Enter: the text is parked
as a pending note, the command runs directly against the agent (no model
message is created) and its result row confirms it. Keyboard-only and fully
non-interrupting. / /note 内容 — 在输入框直接敲,回车即记录;命令直接
对 agent 执行、不产生模型消息,结果行给出确认。纯键盘、零打断。Alt+N — reveal and focus the capture box without touching the mouse. /
Alt+N — 打开并聚焦记录框,不用鼠标。💡 稍后说 (2) — always visible, shows the pending count. /
折叠:常驻条带,显示待聊数量。Enter records (IME-safe, Shift+Enter newline), Esc collapses. /
Enter 记录(支持中文输入法,Shift+Enter 换行),Esc 收起。Enter saves, Esc cancels). /
二次编辑:点击条目文字就地编辑(Enter 保存、Esc 取消)。+图片 to attach images to a note; thumbnails
show in the note, click one to enlarge, and the enlarged view can copy the
image to the clipboard or save it to a file. / 图片:粘贴、拖入或点
+图片 给便签附上图片;缩略图显示在条目里,点击放大;放大后可复制到剪贴板
或保存到本地文件。Ctrl+V to attach it. Dragging a thumbnail straight into the
composer is the always-available manual route. / 带入含图便签:文字进
草稿,插件会先尝试自动把图片交给输入框(向编辑区派发一次合成粘贴,并用
输入框自己的图片列表校验是否成功);被拒绝时退回复制首图到剪贴板(会转成
PNG,因为异步剪贴板只接受 PNG)→ 按 Ctrl+V 即成附件。把缩略图直接拖进
输入框 始终可用的手动通道。park-notes-YYYY-MM-DD.md). / 导出:把本会话全部便签导出为 Markdown 文件。已带入 section, tagged
已带入 / 已发送 (a note flips to 已发送 once the draft carrying it is
actually submitted), with 重新带入 / 删除 / 清空. / 历史:带入过的内容收进
折叠的「已带入」区,标注「已带入 / 已发送」(真正把草稿发出去后自动标记),
支持重新带入、删除、清空。localStorage per session (key
dsh-park-notes:v1:<sessionId>); server restarts don't affect it. Notes
written by the pre-rename dsh-idea-note build migrate automatically. /
数据存浏览器 localStorage(按会话隔离),服务器重启不影响;旧版
dsh-idea-note 的便签自动迁移。A DSH web plugin = one package with a host half and a browser half. / DSH 网页插件 = 一个包,含 host 半边和浏览器半边。
lib/index.js — host half: registers the /note slash command through the
host commands service; the command runs directly against the agent and never
creates a model message.lib/client.js — browser half: a window.__ModuleLoader__.load(...)
bundle (same hand-written format as shipped dsh-client-ui-* packages, no
build step). It declares inject: ["slots", "locale"] — the inject
export is the Cordis dependency declaration; without it apply runs before
the slots service exists and fails silently.command/run with name === "note" and parks
the text, deduplicated by command id so a replayed history cannot duplicate a
note.package.json → dsh.client is how client-modules discovers and serves
the bundle over /plugins; dsh.bundle.patch is what dsh plugin add
uses to mount the row automatically.conversation.input.dock (order 15), the same slot family
as Todo / Goal / queue docks.ctx.inject([name], cb), not ctx.get(name).
A service provided by a later row (the command registry, the conversation
UI) may not exist yet when apply runs; a plain ctx.get guard then returns
silently and the contribution never happens. ctx.inject suspends the fiber
until the service is available.inject. Without that dependency
declaration the browser half applies before the slots service exists and
disappears without an error — the classic "works after hot reload, gone after
a refresh" symptom.Verified against the Harness plugin contracts as of dsh 0.2.1-alpha.2 (and running on a 0.1.7 profile). The surface this plugin depends on is deliberately small, and every piece of it is still current: / 已对照 dsh 0.2.1-alpha.2 的 插件契约核验(当前运行在 0.1.7 profile 上)。本插件依赖的接口刻意保持很小, 且每一项在新版仍然有效:
| Used here / 使用的接口 | Status in 0.2.x |
|---|---|
dsh.bundle.patch manifest + inserted row / 清单与插入行 | unchanged / 未变 |
Host export function apply(ctx) + export const inject | unchanged / 未变 |
ctx.commands.register({ name, description, input: { hint }, handler }) | unchanged (new fields definitionId, recordInput, input.attachments are optional) / 未变(新增字段均为可选) |
Client window.__ModuleLoader__.load({ id, factory }) + exports["./client"] | unchanged / 未变 |
Module-level inject: ["slots", "locale", "uiConversation"] (service names) | unchanged — official plugins declare the same way / 未变,官方插件同样用法 |
Slot conversation.input.dock | still rendered, and the official Goal plugin registers there too / 仍在,官方 Goal 插件也用 |
Standard props useInput, inputActions, sessionId, t | unchanged / 未变 |
ctx.uiConversation.events.register(definition) (command/run records) | unchanged / 未变 |
Display metadata locale/*.json meta.title/meta.description + ./icon | required by the new Plugin Manager/Settings inventory — provided since v0.6.0 / 新版清单要求,v0.6.0 起已提供 |
Known soft spot / 已知薄弱点: the automatic image hand-off dispatches a synthetic
paste into the composer's editor. That is not an official extension point (the
docs advise against cross-plugin DOM coupling), so a future composer rewrite can
disable it — the clipboard and drag routes remain as fallbacks. / 图片"自动进
附件"是向编辑区派发合成粘贴事件,属于非官方扩展点,未来输入框改版可能失效;
剪贴板与拖拽两条兜底通道不受影响。
lib/client.js is plain JavaScript — edit it; a running dsh web picks the
change up via client HMR (or Ctrl+Shift+R). Syntax check: node --check lib/client.js.
/ lib/client.js 是纯 JS,直接编辑即可,开发热更新自动生效。
MIT