# chat-message-export [English](README.md) | 中文 一个把对话内容导出为 Markdown 文件的 DeepSeek Harness 插件。 | 位置 | 操作 | 产物 | |---|---|---| | 每条已完成的助手回复的操作条 | 下载这条回复 | `deepseek-reply-<时间戳>.md` | | 会话标题栏 | 下载整个可见对话 | `deepseek-conversation-<时间戳>.md` | 整个对话的导出读取 Chat store 中可见节点的顺序:用户消息和补充消息变成 `## User` 小节,每一轮(Turn)只贡献它的最终回复 —— 工具调用和思考过程会被跳过,所以导出的文件读起来像一份对话记录,而不是事件日志。 ## 为什么用户气泡上没有单独的按钮 Harness 只通过 `conversation.chat.assistant-actions` 这一个插槽提供逐条消息的操作,而它只对已完成的助手消息触发。用户行上的控件(复制、时间戳)是内置在宿主组件里的,没有对外暴露扩展位,要在那里加按钮就必须整体重写用户行 —— 包括附件、图片、引用、待发送和本地回显等状态,还要跟着上游的标记结构走。因此用会话标题栏的"导出整个对话"来覆盖用户消息这一侧。 ## 安装 在 DeepSeek Harness 会话中,让 `plugin_manager` 指向本目录: ``` plugin_manager { action: "install_bundle", target: "<绝对路径>/chat-message-export" } ``` 安装后包会被链接进当前 profile,对该 profile 下的所有会话生效,并且重启后仍然保留。安装完成后刷新 Web 页面;浏览器会在页面加载时装配客户端模块。 本地开发时可以不用刷新页面:Web 客户端会监视插件自己的 bundle,重新构建的 `client.js` 可以热重载。 ## 目录结构 ``` client.js 浏览器端:插槽注册、Markdown 渲染、文件下载 index.js 宿主端(空实现;所有界面都在浏览器里渲染) cordis.patch.yml Loader 行,用于插入这个包 package.json dsh.bundle.patch + dsh.client 元数据 locale/en.json 显示元数据和界面文案(英文) locale/zh.json 显示元数据和界面文案(中文) icon.svg 插件图标 ``` 纯 JavaScript 实现 —— 无需构建、无第三方依赖。浏览器端通过 `window.__ModuleLoader__.load` 注册,并向两个插槽贡献条目: - `conversation.chat.assistant-actions`,id `export`,order `20` - `conversation.session.header.actions`,id `export-conversation`,order `30` 界面文案走客户端 locale 服务(`ctx.locale.register`);样式只使用 `--dsw-alias-*` 主题 token,因此按钮会跟随明暗主题。下载通过临时 `` 加 object URL 完成,不经过宿主路由、也不写文件;插件卸载时样式标签会被移除。 ## 包名 `@local/chat-message-export` 是私有、未发布的 scope。如果改名,请同步修改 `package.json`、`client.js`、`cordis.patch.yml` 以及 locale 里的 `meta`。 ## 许可证 [MIT](LICENSE)