发布浏览器只读对话链接
sivtr publish 可以把本地的一段 Agent 对话变成一个浏览器链接。查看者不需要安装 Sivtr,也不需要登录;你的电脑关机后,链接仍然可以打开。
它发布的是一次性的“快照”,不是实时共享。对话之后再发生变化,旧链接不会自动更新,需要重新生成一个新链接。
先记住三件事
Section titled “先记住三件事”- 已保存的 WorkSet 名称可以直接使用,不需要
@:sivtr publish share_ready。 sivtr publish preview会打开现有 workspace TUI;选择结果可以直接预览,发布时仍复用同一个 WorkSet 选择。- 链接本身就是查看凭据。拿到完整链接的人都可以查看,不要把链接放到公开 issue 或不可信群聊中。
先配置 endpoint
Section titled “先配置 endpoint”[publish].endpoint 默认是 https://share.hnnulwh.cn。自建或改用 Cloudflare Worker 时,在 config.toml 里改成你的服务地址即可。CLI 不会在多个后端之间自动切换。
[publish]endpoint = "https://share.hnnulwh.cn"第一步:确认 CLI 版本
Section titled “第一步:确认 CLI 版本”先检查当前终端实际使用的是不是包含 publish 的版本:
sivtr --versionsivtr publish --help如果看到:
error: unrecognized subcommand 'publish'说明当前 sivtr.exe 太旧。升级后,publish --help 应该能看到默认发布、preview、list、link 和 revoke。
第二步:准备一段要分享的对话
Section titled “第二步:准备一段要分享的对话”publish 的输入是 WorkSet。最常见的流程是从一个 Codex session 取出一段连续轮次并保存:
sivtr search codex/<session-id> --sort oldest --latest 50 --save share_ready --refs把 <session-id> 换成实际的 session ID。例如:
sivtr search codex/abc123 --sort oldest --latest 50 --save share_ready --refs--latest 50 先取该 session 最近 50 轮(搜索在未指定 --latest/--limit 时默认只留 5 条)。--sort oldest 让保存下来的 WorkSet 按时间正序,方便预览;publish 自己也会再按 record index 排序。
保存成功后,WorkSet 名字就是 share_ready。发布时可以直接写这个名字:
sivtr publish share_ready如果已经有合适的 WorkSet,也可以直接使用它的名字,例如 sivtr publish review。
选择范围时的建议
Section titled “选择范围时的建议”尽量只选择真正需要分享的连续对话轮次。不要直接使用混合了多个 session 的 @last,否则发布时会被拒绝。也不要把终端日志、远程 workspace 或多个 Agent session 混在一起。带关键词的 BM25 搜索可能会跳过中间轮次,那种 WorkSet 不能直接 publish。
原子选择:预览时精确到 part
Section titled “原子选择:预览时精确到 part”当一整轮里只有部分内容适合公开,或需要把工具输出、Skill、Thinking 一起纳入快照时,直接运行交互式预览:
sivtr publish preview预览选择器只接受单个本地 Agent session。不能选择 terminal、remote、group,也不能把不同 provider 或不同 session 拼在一起。按 Enter(Dialogues)或 y(Content)返回选择并生成本地公开快照预览;按 p 打开有效期浮板,默认焦点在有效期列表,按 Tab 跳到可选的 WorkSet 名称输入框。名称为空时只使用内存选择;输入名称后按 Enter 会先保存一次该 WorkSet,再继续裸 sivtr 的发布或 publish preview 的本地预览;不会自动生成变量名,也不会覆盖 @last。
选择器里的操作
Section titled “选择器里的操作”选择器从 Dialogues 视图打开。常用操作如下;按 ? 可在当前版本查看完整帮助:
| 位置 | 操作 | 发布含义 |
|---|---|---|
| Dialogues | Space 标记当前轮;a 切换全部轮次 |
选择整轮,展开为该轮的全部原子 |
| Content | Space 标记当前块;点击块左侧标记点 |
只选择标记的原子 |
| Content | v 选择块区间;J / K 翻到下一个 / 上一个已选轮次 |
支持轮内部分选择和跨页选择 |
| Content | Tab 切换 Input / Output;Enter 折叠或展开光标块 |
选择仍以完整原子为边界 |
| Dialogues | Enter 提交整轮选择;Content 用 y 提交当前或已标记块 |
返回预览并生成选择结果 |
| 任意视图 | q / Esc 退出选择器 |
取消本次预览,不保存选择 |
不要拖拽只覆盖半个原子的字符范围来“凑”选择。发布选择需要完整 block;只产生文本范围而没有完整 block anchor 时,会明确报 发布选择为空,不会擅自扩大成整轮。
原子边界和排序
Section titled “原子边界和排序”- User、Assistant、Skill、Thinking 各自是一个原子。
- 同一工具调用的 ToolCall 和 ToolResult 是一个不可拆分的 Tool 原子;选中其中一端会展开为完整的调用与结果。
- 父级 run 被选中时,会展开为其中全部子原子;不会只发布折叠标签。
- 可以跨轮次、跨页、非连续选择。Sivtr 会按原始 record index 和 part 顺序去重、排序;未选中的区间不会自动补入。
- 如果非连续选择前方存在未分享内容,schema v2 会设置
gap_before: true,查看器显示“部分内容未分享”,但不会暴露缺口数量或本地位置。
交互式预览结束后默认不会自动保存 WorkSet;只有在发布浮板的名称输入框中填写名称时,才会按该名称保存一次。否则若要复用选择,请在进入 picker 前用已有的 search、filter 或 var 命令显式保存 WorkSet;公开快照不会包含 WorkRef、session ID、record/part 序号、路径或 cwd。
什么时候会生成 v1 或 v2
Section titled “什么时候会生成 v1 或 v2”| 输入 | 快照 schema | 内容 | 选择限制 |
|---|---|---|---|
全 record WorkSet(例如 search --save) |
v1 | 连续整轮中的 User / Assistant | 同 provider、同 session、record index 连续 |
| 纯 part-anchor WorkSet | v2 | 选中的 User、Assistant、Tool、Skill、Thinking 原子 | 同一 provider、同一 session;ToolCall 与 ToolResult 必须成对 |
| whole record 与 part anchor 混用 | 拒绝 | — | 明确报错,避免范围含义不确定 |
如果原子选择为空、工具调用缺少配对结果,或者保存的 WorkSet 后来被手工混入 whole/part 两种 anchor,预览和创建都会拒绝,不会生成“看起来完整但语义不确定”的链接。
第三步:本地预览
Section titled “第三步:本地预览”preview 完全在本地运行,不会上传内容:
sivtr publish preview share_ready --format human不指定 source 时,preview 会进入 TUI 选择内容,再在退出 TUI 后打印最终脱敏快照:
sivtr publish preview预览会告诉你:
- 标题和来源 provider;
- 将发布多少轮对话和多少个公开项(v2 中公开项是原子,不等同于消息条数);
- 将使用 schema v1 还是 v2;
- 快照大小和有效期;
- 自动脱敏了多少项;
- 是否发现路径、邮箱、内网地址等风险提示。
预览内容时重点检查:
- 是否包含不想公开的 User 消息或 Assistant 回复;
- 是否包含文件路径、邮箱、内网地址;
- 是否有不应该出现的密钥或账号信息;
- 对话起止范围是否正确。
识别出的 token、私钥、Bearer 和 secret assignment 会自动替换成 [REDACTED]。路径、邮箱和内网地址默认只警告,不会擅自改写正常对话。
查看器对 v1/v2 的显示
Section titled “查看器对 v1/v2 的显示”v1 的 User / Assistant 会按原顺序直接显示。v2 仍按原始时间顺序显示,但 Tool、Skill、Thinking 默认折叠,展开后可查看其脱敏后的 parts;Tool 原子会同时显示 call 和 result。非连续原子之间显示“部分内容未分享”。Markdown、链接和工具输出仍经过查看器的安全清理。
同一个已保存的 WorkSet,preview 和随后 publish 的内容 SHA-256 会保持一致;发布时间和过期时间属于 envelope 元数据,不会改变内容哈希。
第四步:创建链接
Section titled “第四步:创建链接”确认预览没有问题后,创建一个 7 天有效的链接:
sivtr publish share_ready --expires 7d --yes有效期可以选择:
2h 2 小时1d 1 天3d 3 天7d 7 天,默认值30d 30 天没有永久链接选项。
如果风险报告里还有未自动处理的路径、邮箱或内网地址警告,无论是否在交互终端,都必须加上 --allow-warnings:
sivtr publish share_ready --expires 7d --yes --allow-warnings在 TUI 中按 p 发布时使用同一条规则;如果存在这些警告,选择器结束后还会要求一次明确的隐私确认。
发布成功后,完整链接会输出到 stdout,方便复制。链接 host 来自 [publish].endpoint,通常类似:
https://share.hnnulwh.cn/s/7d_xxxxxxxxxxxxxxxxxxxxxx#k=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx其中 #k=... 是解密密钥。它位于 URL fragment,不会发送给服务器;但是浏览器地址栏中的完整链接持有者可以查看内容。
在 PowerShell 中保存链接
Section titled “在 PowerShell 中保存链接”如果想把链接保存到变量而不立即打印:
$link = sivtr publish share_ready --expires 7d --yes --allow-warnings$link不要把 $link 写入公开日志、issue 或聊天记录。
查看、查找和撤销链接
Section titled “查看、查找和撤销链接”查看本机发布记录;在交互式终端中 active 链接可直接点击:
sivtr publish list使用 JSON 输出:
sivtr publish list --json需要重新打印某个完整链接时,可以直接交互选择,也可以使用 publication ID:
sivtr publish linksivtr publish link 7d_xxxxxxxxxxxxxxxxxxxxxx提前撤销:
sivtr publish revokesivtr publish revoke 7d_xxxxxxxxxxxxxxxxxxxxxx --yeslist 在交互式终端中显示可点击的 active 链接。link 和 revoke 没有 ID 时会交互选择;revoke --yes 只跳过确认提示,非交互撤销时必须使用。撤销会立即让链接不可访问。v1 和 v2 的管理凭据都只保存在本机的 publication-state.db 中;如果数据库丢失,管理 token 无法恢复,也就无法通过 CLI 撤销链接。
publish 和 share 的区别
Section titled “publish 和 share 的区别”| 功能 | publish |
share |
|---|---|---|
| 结果 | 不可变的浏览器只读快照 | 实时 workspace mount |
| 查看者 | 不需要 Sivtr,不需要登录 | 通常需要 Sivtr/daemon 和授权 |
| 分享者是否需要在线 | 不需要 | 通常需要 |
| 内容变化 | 不会自动更新,需创建新链接 | 读取共享 workspace 的当前内容 |
| 服务端看到的内容 | 加密密文,以及 publication ID、X-Sivtr-Management-Token 和 X-Sivtr-Published-At 等发布请求元数据 |
按远程共享协议提供数据 |
数据会不会经过你的服务器?
Section titled “数据会不会经过你的服务器?”不会把完整的本地 WorkSet 原样上传,但 publish <SOURCE> 也不是“完全离线”。准确的过程是:本地生成和加密,服务器保存密文,查看者浏览器解密。
本地 WorkSet ↓ 本地筛选、脱敏、生成公开快照 ↓ 本地 AES-256-GCM 加密你的服务器 ↓ 返回加密 envelope查看者浏览器 ↓ 使用链接 fragment 中的密钥解密显示 User / Assistant 对话哪些步骤只在本地发生
Section titled “哪些步骤只在本地发生”sivtr publish preview(包括无 source 的 TUI 选择)完全在本地运行,不联网;- WorkSet materialize、连续轮次校验和敏感信息扫描在本地完成;
- 原始对话、WorkSet、WorkRef、
cwd、session path 不会上传; - 明文快照先在本地压缩,再用独立的 AES-256-GCM 密钥加密。
服务器会保存什么
Section titled “服务器会保存什么”你的 share.hnnulwh.cn 服务器会收到并保存加密后的 envelope,另外保存发布所需的期限、创建时间、版本和管理 token 哈希。服务器不能从这些内容还原对话,也不会保存标题、provider 或来源 refs。
查看链接时,浏览器会从服务器取回密文。#k=... 位于 URL fragment,不会随 HTTP 请求发送给服务器;真正的解密发生在查看者浏览器中。因此分享者电脑可以关机,但查看者打开链接时服务器仍需在线。
服务器及 Nginx 仍可能知道:
- publication ID、请求时间、IP、状态码和响应大小;
- 某个链接被创建、查看或撤销;
- 到期时间和密文文件本身。
应用日志不会记录请求体、管理 token、fragment 密钥或解密内容;但服务器上的 Nginx 默认访问日志仍可能记录请求路径和访问 IP。
需要注意的安全边界
Section titled “需要注意的安全边界”- 完整链接就是查看凭据。 拿到完整链接的人不需要登录即可查看。浏览器历史、剪贴板、聊天软件同步、截图和浏览器扩展都可能造成链接泄露。
- 服务器被攻破时仍有 Viewer 完整性风险。 正常服务器拿不到 fragment 密钥;但如果攻击者能替换服务器上的 Viewer JavaScript,就可能读取浏览器地址栏中的密钥。因此这是应用层加密,不代表能抵御已经被入侵的服务器。
- 本机状态库保存密钥。
publication-state.db保存查看密钥和撤销用的管理 token,不保存公开快照明文。能读取你 Sivtr 数据目录的人可能重新取得链接或执行撤销。 - 脱敏不是绝对保证。 已知 token、私钥、Bearer 和 secret assignment 会自动替换;路径、邮箱、内网地址只警告;未识别的敏感内容仍可能进入快照。
- 高敏感对话优先使用
--expires 1d;阅读完成后立即撤销; - 不要把完整链接写入公开 issue、公共群聊或公开日志;
- 保护 Windows 用户账户和
publication-state.db,不要将其同步到公开云盘或代码仓库; - 保持 HTTPS 证书、Nginx 和 Node 服务更新,并定期轮换、清理访问日志;
- 第一次使用时先发布不含敏感信息的测试对话。
内容边界:v1 与 v2
Section titled “内容边界:v1 与 v2”全 record 输入仍按 v1 处理:只支持同一 provider、同一 session 中连续的本地 Agent 对话轮次,并只保留 User 和 Assistant 文本。交互式 TUI 选择产生 part anchors 后,v2 可以公开更多原子类型,但以下边界对两个版本都有效:
- Terminal 记录;
- remote/group 内容;
- 跨 session 或跨 provider 内容;
- WorkSet、WorkRef、
cwd、session path; - provider 原始事件、附件和图片。
在 v1 中,ToolCall、ToolResult、Thinking、Skill 不进入公开快照;在 v2 中它们分别投影为 Tool、Thinking、Skill 原子(ToolCall 与 ToolResult 必须成对)。所有原子内容经过同一套凭据脱敏、路径/邮箱/内网地址风险检查。
unrecognized subcommand 'publish'
Section titled “unrecognized subcommand 'publish'”当前终端使用的是旧版 sivtr.exe。执行:
sivtr --versionGet-Command sivtr -All确认 PATH 中实际使用的二进制已经升级,并重新打开一个 PowerShell 窗口。
[publish].endpoint is not set
Section titled “[publish].endpoint is not set”config.toml 里的 [publish].endpoint 被改成了空字符串。写成实际服务地址后再创建,例如默认的 https://share.hnnulwh.cn。
failed to resolve publication source 'share_ready'
Section titled “failed to resolve publication source 'share_ready'”本机没有名为 share_ready 的 WorkSet。先执行搜索并保存:
sivtr search codex/<session-id> --sort oldest --latest 50 --save share_ready --refs然后直接使用:sivtr publish share_ready。
publication cannot mix agent sessions
Section titled “publication cannot mix agent sessions”你选择的 WorkSet 包含多个 Agent session。缩小搜索范围,只选择一个 session 中连续的对话轮次,再重新保存 WorkSet。
publication record indices must be strictly continuous
Section titled “publication record indices must be strictly continuous”WorkSet 里的轮次排序后仍有缺口(例如关键词搜索跳过了中间几轮)。改成按 session 取一段连续窗口:--sort oldest --latest N,不要混入不相关命中。
发布选择为空
Section titled “发布选择为空”选择器没有收到完整 dialogue 或 block anchor。回到 Dialogues 用 Space 选择整轮,或在 Content 用 Space / v 标记完整块;不要只拖选半个原子的字符。
publication selection must include complete tool atoms
Section titled “publication selection must include complete tool atoms”工具调用和结果不可拆分。重新选择该工具块的完整 call/result;选择器通常会在选中一端时自动展开另一端,手工修改 WorkSet 时则必须保留两端。
publication cannot mix whole-record and part anchors
Section titled “publication cannot mix whole-record and part anchors”同一个 WorkSet 不能同时表达“整轮”和“原子片段”。重新保存一个纯整轮 WorkSet(走 v1)或纯 part-anchor WorkSet(走 v2)。
publication picker requires exactly one local agent session
Section titled “publication picker requires exactly one local agent session”原子选择器一次只处理一个本地 Agent session。不要把 terminal、remote/group、不同 provider 或多个 session 的记录放进 picker 输入。
non-interactive publish requires --yes
Section titled “non-interactive publish requires --yes”脚本或重定向环境不是交互终端,创建时加上:
--yespublish with privacy warnings requires --allow-warnings
Section titled “publish with privacy warnings requires --allow-warnings”预览仍有未自动处理的路径、邮箱或内网地址。看完预览并确认可以公开后,显式加上:
--allow-warnings交互终端里只回答确认提示是不够的;有警告时必须带这个 flag。
隐私和数据位置
Section titled “隐私和数据位置”本机的 publication-state.db 保存标题、来源摘要、期限、查看密钥和撤销凭据,但不保存公开快照明文。
服务器只保存加密后的 envelope 和撤销/过期所需的元数据。服务器不能从 URL 请求中得到 #k=... fragment,也不会生成标题预览或搜索引擎内容。
如果对话包含高敏感内容,建议使用更短的 1d 有效期,并在确认查看者完成阅读后主动撤销。