# Changelog

## Unreleased

## 0.3.14 — 2026-10-20
- `/tabmodel` 改用 Pi 原生的模型选择器（同 `/model`）：可输入关键词模糊搜索，列表分页滚动，光标默认停在当前命名模型上。此前模型多时一次铺满整屏，只能逐行下翻。非终端界面仍用普通列表。

## 0.3.13 — 2026-10-16
- 在电脑上用 `pi -r` 打开后台会话时，会话自动交给这个终端，手机端绑定随之转过来，不再出现后台进程和终端同时写同一个会话文件。后台空闲时直接接上；后台还在运行时，输入框上方提示「手机端任务运行中，完成后自动刷新 · 现在查看：/remote reload」（可手动刷新先看进度），期间在电脑上发的消息会被拦下，后台结束后终端自动重新载入会话，显示最新内容。此前 `pi -r` 打开的只是静态快照，不会刷新。
- 标签自动起名偶发失败时自动重试一次；在终端打开起名失败、没有名字的会话（如后台会话）时按首条消息补起一次，每个会话只补一次。此前后台会话起名失败后没有任何提示，`pi -r` 打开时标签只显示 `π`。后台会话起名失败的原因会写进服务日志。
- 空闲时会话改名，标签不再被 Pi 的默认格式「π - 会话名 - 目录」盖掉。
- 修复终端会话留下「幽灵轮次」：Pi 在上一轮还没结束时就开始下一轮（如运行中又发了 `continue`、自动重试），扩展只会回报最后一轮的结果，前面那轮在服务里一直算「运行中」：持续推「N 分钟没有新动作」，「停止」无效，90 分钟后再推一条「任务中断」。现在新一轮登记时，同一终端上更早的轮次直接收掉、不推送，结果由最后一轮带回。
- 终端会话在手机上「停止」后的反馈补全。请求中断后不再推「N 分钟没有新动作」。终端拒绝中断时说明原因：终端其实已空闲（这一轮的结束消息丢了）则直接收掉这一轮，推一条「无需中断」；这一轮还没登记则提示稍后重试。90 秒内仍未停下，会推一条「中断未生效」，分为终端没确认和确认了但没停下两种，请用户到电脑上处理；终端已失联则直接收掉。「状态」会显示中断请求在等待哪一步。终端已失联时「停止」直接回复失败。此前请求中断后可能只看到「等待终端确认」，接着等 90 分钟兜底超时才收到「任务中断」，中途还会收到「已运行 1 小时没有动作」的提醒。需要在电脑上 `/reload` 让扩展更新才能显示拒绝原因，旧扩展只提示「中断未生效」。

## 0.3.12 — 2026-10-14
- 「产物」不超过 3 个时直接发送文件，不再弹多选卡片；超过 3 个仍用卡片选择。
- 提问、确认、选择等弹窗只推送当前绑定的终端会话：此前未绑定的会话（如另开的终端里模型调用 AskUserQuestion）也会把卡片推到企微。未绑定时请求先挂起，之后在手机上切换到该会话会补推卡片，超时从补推时开始计；电脑上先答完则不再推送。未绑定会话的编辑器请求只在电脑上打开，「电脑端在等你操作」提醒也不再发送。
- 提问卡片的说明行开头显示会话名，多个会话同时提问时能分清是哪个；原先说明行里的「可直接回复文字」提示已在「自己写」选项里体现，不再重复。

## 0.3.11 — 2026-10-13
- 兼容 Pi 1.2.0：由扩展消息触发的运行（如子代理完成通知）进入 `before_agent_start` 时不带 `prompt`，此前会抛错导致该轮结果不推送到手机；现按空串处理。

## 0.3.10 — 2026-10-12
- 提问工具转手机新增兼容 AskUserQuestion 类工具（如 `@juicesharp/rpiv-ask-user-question`，参数 `questions[].question / header / multiSelect`）：逐题推卡片，标题带 `（i/n）` 与短标签；多选题直接用多选卡片勾选提交；选项带预览时提示到电脑查看；可点「自己写」或直接回复文字；手机取消即整份取消。答案按工具原 `QuestionnaireResult` 形状交回，模型看到的回答与电脑作答一致。此前这类工具不被识别，手机端只会收到「N 分钟没有新动作」，任务一直等电脑作答。
- 题目超过卡片标题长度时，先发一条完整题目再发卡片。
- `remoteConfirmTimeoutMs` 默认值由 3 分钟改为 10 分钟（提问、选择、确认共用）：离开电脑时有更充裕的时间在手机上作答。配置里显式写了 180000 的需自行修改。
- 超时文案区分「跳过这次提问」与「任务取消」：提问超时改为「⏱️ 超时未答，已跳过提问 · 任务仍在运行 · Agent 会按「未回答」继续」，选择/输入超时同理；卡片上「N 分钟内未答将跳过提问」。确认类文案不变。
- 文本消息里的命令提示改回反引号，显示为行内代码（如 `帮助`、`/remote bind`、`产物`）；进会话欢迎语改发 Markdown 消息（企微欢迎语回复只支持纯文本，反引号会原样显示）。卡片标题与说明不渲染 Markdown，仍用「」。
- 完成消息末尾的产物提示与正文之间留一行空行。
- 兜底：工具执行中弹出认不出的阻塞界面且 30 秒未关闭时，手机收到一次「电脑端在等你操作」提醒，不再无声挂起。

## 0.3.9 — 2026-10-04
- 新增「产物」/ `art`：列出当前会话生成的 html/md/pdf/docx/xlsx/pptx/png/svg 文件，可多选发送；完成消息在产物数量变化时于正文末尾提示。
- 「历史会话」默认隐藏 subagent 会话（如 `explorer#9b4afaa8`），发「历史会话 全部 [关键词]」才显示。

## 0.3.8 — 2026-10-03
- 手机端主动「停止」后的回执正文改为「任务已停止」。
- 修复主动「停止」时，除回执外还会多收到一条「任务失败 · 模型请求失败」的问题：中止引发的模型错误不再当作失败推送。

## 0.3.7 — 2026-10-03
- 手机端回复的三段式 head 改为三级标题并合入会话名（会话名截断为 10 字）；受理消息正文引用用户消息摘要，按显示宽度（汉字算 2）截断到约一行，并与「已送达，完成后推送」之间留空行。

## 0.3.6 — 2026-10-03
- 手机端新增「重启」/ `restart [force]`：无需回电脑执行 `/remote restart`，直接重启手机遥控后台服务加载新代码。非 launchd 托管运行时会拒绝并提示手动重启；有任务运行时默认拒绝并列出占用会话，`重启 force` 可强制中断。重启完成后会主动发一条「已连接」确认，不必再靠发命令试探。

## 0.3.5 — 2026-10-03
- 各处提示与卡片里的指引去掉「切换」前缀：统一写 `模型` / `目录` / `思考强度`（长说法仍可用）。
- 后台会话被「停止」且没有任何文本产出时，不再重复推送一条「（无文本输出）」的已中断消息。
- 新增「压缩会话」/ `compact [说明]`（中文 `压缩 [说明]`）：手动压缩当前会话上下文，可附一句说明作为压缩重点；完成后回卡片显示压缩前后 token 数（如 150k → 32.0k）。终端与后台会话均支持，运行中会话不可压缩；自动压缩仍由 Pi 负责，不做推送。
- 手机中文说法新增短别名：`模型 [关键词]`、`目录 [别名]`（原来分别只有「切换模型」「切换目录」），以及 `新建后台会话`（对齐已有的「新建会话」）；「思考强度」原本就是 `think` 的说法，本次与短别名一起作为帮助面板的推荐写法。长说法全部保留。这些词现在会被当命令解析，不再作为普通对话投递；「帮助」面板与 README 的中文列同步改用短别名展示。
- 新增「切换思考强度」/ `think [强度]`：卡片列出当前模型支持的级别（与 Pi 规则一致，如 xhigh / max 仅在模型声明时出现），也可直接 `切换思考强度 high` 或中文 `切换思考强度 高`；终端与后台会话均支持，只影响当前会话、不改全局默认。模型不支持推理时提示换模型；终端扩展过旧时提示 /reload。
- 新增「切换目录」/ `cd [别名]`：卡片列出 `~` 与目录别名（不存在的目录不显示），选中后作为之后 `创建会话` / `创建后台会话` 不带目录时的默认目录，跨 daemon 重启保留；已有会话不受影响。也可直接 `切换目录 别名或路径`。
- 「状态」改为展示 Pi 内置 footer 同款信息：目录与 git 分支、模型与思考强度、上下文、累计花费，以及其他扩展经 `setStatus` 写入的状态项（去除颜色与图标字符）；不依赖任何 footer 扩展，没有状态项时该行不显示；用 `setFooter` 自定义的 footer 不会照搬，仍按内置格式展示。终端会话现场向扩展取数，3 秒未响应沿用上次上报。去掉「调用 N 次」。

## 0.3.4 — 2026-09-30
- 兼容 Pi 示例的提问工具 `question` / `questionnaire`（`ctx.ui.custom`）：终端会话中不论电脑或手机发起的轮次，问题都只推一张企微卡片，选项带编号与说明；允许自由作答时可点「自己写」或直接回复文字（点「自己写」后重新计时）。questionnaire 多题逐题推送，答案按工具原结果形状交回；电脑先答则收回手机卡片。按参数形状识别，不绑定工具名；后台会话不支持（示例工具在非 TUI 模式直接报错）。
- 附件单件上限 20MB 改为 100MiB（104,857,600 字节），对齐企微智能机器人文件与视频的回调上限（官方标注为「100M」，未给出精确字节定义）；上限抽为 `MAX_ATTACHMENT_BYTES` 并由下载与投递两处共用。
- 修复：批次中途失败时（某件超限、下载失败或 URL 非法）整条消息不投递，但先前已落盘的附件不会被任何清理路径回收；写入中途失败（如磁盘满）还会留下残片。现在 `prepare()` 跟踪本批独占创建的文件并在失败时回滚（`EEXIST` 表示文件非本批创建，不登记也不删除）。
- 「每次最多 4 件」仍为本项目限制，企微无此约束；出站方向（长结果回传）另受 SDK 分片上传约 50MiB 限制，未做变更。

## 0.3.3 — 2026-09-30
- 后台会话也自动命名：daemon 接收会话名更新，创建后台会话同样最多等待 nameWaitMs；终端标题与动画仍仅终端会话。
- 会话命名等待默认 3 秒改为 5 秒；精简命名 prompt 与输入长度，关闭推理；模型输出不再截断，仅去首尾空白，空输出视为失败。
- 新增「切换会话」指令词，等同「活跃会话」。

## 0.3.2 — 2026-09-29
- 后台会话去掉只读限制：不再禁用 write/edit、不拦截 bash 写操作，并加载用户扩展，能力与终端会话一致。
- 扩展弹窗转手机：手机发起的任务里，扩展的 confirm/select 以企微卡片确认，终端会话电脑与手机谁先回答用谁的；input/editor 无法在手机填写，后台会话自动取消并提示，终端会话仍可在电脑上填写。
- 扩展在后台会话启动阶段请求确认时（RPC 此时无法应答），立即报错并提示改用终端会话，不再等 30 秒超时。daemon 重启时终端会话的弹窗退回只等电脑，并有本地超时兜底。
- 新增 `remoteConfirm`（`ask-then-allow` 默认 / `ask` / `allow`）与 `remoteConfirmTimeoutMs`（默认 3 分钟）；超时 confirm 按策略处理，其余取消，任务不再卡住。
- 弹窗内容放入代码块推送，避免 `$` 被企微渲染为公式。

## 0.3.1 — 2026-09-29
- 切换模型：默认列表仍按 scope（enabledModels / --models）展示；「切换模型 关键词」改为在全部已认证模型中检索，配置 scope 时副标题提示「筛选所有模型」。

## 0.3.0 — 2026-09-29
- 首次发布到 npm；截图不再打入 npm 包，README 改用 GitHub 图片地址。
- 为社区发布补充中英文文档、贡献指南、来源说明与 GitHub 自动检查，移除对内网发布入口的依赖。
- 维护者确认主流程和主要指令已通过真机验收；未扩大为所有终端与异常场景均已验收。
- 绑定码绑定主人：`/remote setup` 默认不再要求手填 userid，在企微单聊发送本机显示的 6 位绑定码即可；新增 `/remote bind` 重新绑定。手动填写 userid 与已有配置保持兼容。
- 绑定成功发送模板卡片（活跃会话 / 查看帮助快捷入口），失败降级为文字；卡片发送失败记录企微 errcode。
- 未开自动命名（未选 /tabmodel 或关闭 tabTitleEnabled）时，创建会话不再等待会话名（原默认 3 秒），直接用首条输入作标题。
- 附件确认语改为「随后将和附件一并发送」；帮助 Tips 去掉附件说明，新增 /tabmodel 自动命名提示。

## 0.2.0 — 2026-09-29
- 历史检索只读会话名与首条输入前 100 字，并识别后期改名；不再匹配文件名。
- 版本号统一读取 package.json。
- 补充安装、迁移、六种终端配置、安全边界与发布检查。
- iTerm2 在创建 tab 时绑定启动命令，避免焦点切换导致误投递。
- kitty 支持显式 kittySocket，供无 TTY 的 daemon 探测与启动。
- 增加终端参数/转义回归测试、敏感信息与包完整性检查、CNB 持续验证。

## 0.1.0
- 首版：官方企微 SDK 长连接直连本机 daemon，替代原云端 agent + 隧道链路。
- 原生卡片会话列表与选择，卡片回调防串会话；msgid 去重；持久发件箱退避重试。
- 多 TUI + 后台 RPC 会话路由，TUI 可手机中断；附件下载投递，超长结果转 Markdown 附件。
- 随包 tab 命名与状态图标、目录别名、launchd 服务管理、首次连接欢迎消息。
- 历史会话按相关性排序；原版本记录已完成企微真机验收；本次发布未重新执行真机验收。
