分享会话 · @local/dsh-share
把当前会话完整整理成一页可分享的内容,并给出一个别人真的能点开的链接。
装好之后,会话头部的视图页签里会多一个 分享会话:点进去就是这次对话的 概览、对话主线、结论、待办、工具与文件、时间线,页首那一条负责把它交给别人。
先说清楚「链接」这件事
Harness 的 Web 服务只绑在 127.0.0.1。127.0.0.1 的意思是「我自己这台机器」,
所以把那个地址发给别人,在他电脑上打开的是他自己的机器 —— 必然打不开。
本插件因此提供两种分享,各管一种场景:
| 方式 | 谁能看 | 怎么用 |
|---|---|---|
| 局域网链接 | 同一 Wi-Fi / 内网的人 | 点「生成局域网链接」,插件在本机开一个只读端口,按随机 token 提供冻结快照;复制链接发过去即可 |
| 下载 HTML / Markdown | 任何网络的人 | 存成文件发过去。HTML 是自包含单文件,无外链无脚本,双击就能看 |
局域网链接默认 30 分钟到期(可选 10 分钟 / 30 分钟 / 1 小时 / 3 小时),也可以随时点
「停止分享」立刻作废。链接一旦停止或到期,打开只会看到 link expired or unknown。
外网(互联网)访问不到这个端口。要让不在同一网络的人看到,用下载。
面板上的按钮
| 按钮 | 结果 |
|---|---|
| 生成局域网链接 | 起一个只读端口,返回形如 http://192.168.x.x:xxxxx/dsh-share/s/<token> 的地址 |
| 复制链接 | 复制上面那条地址(页面上也会显示,含到期时间) |
| 停止分享 | 立即作废该链接 |
| 复制 Markdown | 同样的内容以 Markdown 进剪贴板 |
| 下载 HTML | 下载单文件 HTML,文件名形如 对话分享-<话题>-20261031-0812.html |
| 下载 Markdown | 下载 .md,同名不同后缀 |
| 本机预览 | 新标签页打开本机页面(自己看,不是给别人) |
下载文件名是人能读的:对话分享-<会话话题>-<年月日-时分>.html。话题里 Windows /
macOS / Linux 都禁止的字符会被去掉,其余保留;中文用 RFC 5987 编码,现代浏览器显示正常。
页面里有什么
页首一句话先概括这次对话的规模,然后依次是:
- 概览:轮次、用户消息、助手消息、工具调用、耗时、Tokens
- 对话主线:你按顺序提出的每一条要求(仅你打的字)
- 完整对话:日志里的每一条消息,按时间顺序,一条不删
- 结论 / 待办 / 工具使用 / 涉及文件 / 时间线 / 异常:结构化摘要
关于「完整对话」
早期版本只保留 source.kind === 'user' 的消息,结果把子代理发回来的报告当成注入噪音丢掉了——
一个多 agent 会话里最重的三份审计报告(54K 字)会从分享里消失。现在不过滤:
| 角色 | 来源 | 说明 |
|---|---|---|
| 你 | user |
你打的字 |
| 助手 | assistant/message |
模型回答(含思考步骤之间的短句) |
| 队友 | agent-message |
队友通过 send_message 发回来的内容 |
| 子代理完成 | subagent-settled |
后台子代理的收尾报告 |
| 系统上下文 | runtime-context / skill-catalog / time-context / user-approval |
Harness 自己喂给模型的内容,保留但标注,让读者知道那不是人说的话 |
正文按 Markdown 解析后渲染:标题、加粗、列表、表格、代码块、引用都会正常显示,
不会再把 **这样** 原样露出来。面板与网页用的是同一份解析结果,两边不会不一致。
超过 40,000 字的单条消息和 300,000 字的整段对话会被截断并标记「已截断」—— 不是静默丢弃。
内容是怎么来的
一次对会话日志的确定性折叠,不调用模型:
- 轮次来自
turn/start/turn/end; - 正文来自
user/message与assistant/message的文本块(不含思考过程); - 文件与待办来自
tool/call的参数; - 失败来自
tool/result的error。
同样的会话,永远得到同一页。内容全部来自会话日志,没有额外存储,也没有隐藏状态。
Host 路由
GET /dsh-share/api/analysis?sessionId=<id>&lang=zh|en 分析 JSON + 完整对话块 + Markdown + 文件名
GET /dsh-share/page?sessionId=<id>&lang=zh|en[&download=1] 只读页面
GET /dsh-share/md?sessionId=<id>&lang=zh|en[&download=1] 同一页的 Markdown
POST /dsh-share/api/lan/start {sessionId, lang, minutes} 生成局域网链接
POST /dsh-share/api/lan/stop {token} 停止分享
GET /dsh-share/api/lan/status 当前链接与地址
/page 与 /md 只从当前进程里已加载的会话语取日志(ctx.sessions.get(id));
刷新页面或重新打开该会话即可。局域网端口只提供 /dsh-share/s/<token>,别的一律 404。
隐私边界
分享页是给别人看的,所以在分析入口就把不该外传的东西换掉了——不是靠界面上遮一遮, 而是脱敏发生在解析之前,面板、网页、Markdown、下载文件名四者拿到的都是脱敏后的内容, 不存在第二处能把真实路径还原回去。
| 内容 | 变成 |
|---|---|
家目录路径 C:\Users\<你>\Desktop\x.docx |
~/x.docx |
其它盘的用户目录 D:\Users\<你>\…、/home/<你>/…、/Users/<你>/… |
~/… |
项目内绝对路径 D:\projects\demo\报告.md |
…/demo/报告.md(保留文件名,隐藏上层目录) |
| 你的账号名单独出现(命令输出、引号里的文件名、正文里提到) | <user> |
| 标题 / 下载文件名里的路径 | 整段去掉,只留你真正问的那句话 |
http://… 这类 URL 不会被误伤(盘符正则带了边界判断)。
另外仍然不包含:系统提示、思考(reasoning)过程、工具返回的正文。 只保留你在对话里说的话、模型回答的正文,以及工具名/文件名这类结构性信息。
提醒:工具名、文件文件名、队友报告正文属于对话内容,会照常出现。 如果某个文件名本身就敏感,发之前自己扫一眼。
局域网链接是冻结快照:生成之后你继续聊,别人看到的仍是生成时的那一页;这也意味着 「停止分享」是真的撤回了内容,而不是把链接关掉而已。
文件
index.js Host 半:折叠 + 只读路由 + 局域网监听
client.js Client 半:conversation.view 面板
cordis.patch.yml bundle patch
locale/*.json Plugin Manager 里的标题与描述
icon.svg 面板图标
GitHub 安装与验证
仓库:https://github.com/991206772-debug/dsh-share
桌面版可在插件管理中使用仓库地址安装;命令行版在自己的 Profile 中安装:
dsh plugin --profile web add github:991206772-debug/dsh-share
公开源码不包含用户配置、笔记、真实会话、凭据或 node_modules。验证使用隔离目录,不主动重载正在运行的 DSH。
许可证
自有源码采用 MIT,署名 991206772-debug。
No comments yet. Be the first to write one.