# Gaster Code v0.2.1

这是一个以 IM 接入、桌面通知、上下文统计和桌面运行稳定性为主的版本。

相比 `v0.2.0`，本次最大的变化是把桌面端的外部协作链路做实：微信和钉钉成为一等 IM 通道，移动端权限审批更顺手，IM adapter sidecar 更稳定；同时桌面系统通知、诊断导出、上下文用量和终端工作目录也做了集中补强。

这个版本也修复了一批 release 前人工测试中最容易踩到的问题：微信回复不可见、钉钉解绑不清凭据、IM 权限审批在手机上难操作、Telegram sidecar 残留导致收不到消息、桌面 context 用量在回复后下降、空会话显示误导性 loading、macOS 通知权限看似成功但没有真实系统通知等。

## Highlight

- IM 接入进入可用阶段：微信和钉钉成为一等 IM 通道，飞书、Telegram、微信、钉钉的配对、权限审批和默认项目行为进一步统一。
- IM sidecar 更稳定：各 IM 平台独立 sidecar 运行，并在启动前清理 stale adapter，降低 Telegram 长轮询被旧进程抢占的问题。
- 桌面通知更可信：macOS 通知改为原生 UserNotifications 桥接，权限、测试通知和前台展示都能被真实验证。
- 上下文用量更接近真实会话：`/context`、桌面 composer 和离线 transcript fallback 统一统计口径，避免回复后用量反而下降。
- 诊断与启动错误更可排查：CLI 启动失败、runtime 退出和桌面 API 错误会保留更有用的脱敏上下文。

## 主要更新

- 新增微信 IM adapter：支持扫码绑定、配对码、文本消息、图片 / 文件候选提取、回复发送、typing 状态和权限审批。
- 新增钉钉 IM adapter：支持 Stream 接入、扫码注册、AI Card 流式输出、权限卡片模板，以及没有模板时的文本授权 fallback。
- IM 接入设置页补齐飞书、微信、钉钉、Telegram 四个平台的配置入口、配对管理、默认项目和中英文文案。
- IM 权限审批对移动端更友好：单个待审批请求可以用短回复完成 allow / always / deny，多请求并发时仍保留 requestId 防歧义。
- 每个 IM 平台现在以独立 sidecar 进程运行，避免 Telegram、飞书、微信、钉钉共享进程时互相影响 SDK loop 或长轮询消费。
- 桌面端新增系统通知能力：权限请求、定时任务完成和长任务最终回复都可以触发桌面通知，并复用去重和冷却逻辑。
- 桌面端 composer 新增更准确的上下文用量显示，支持活跃 CLI inspection、空会话初始状态、断开会话的 transcript fallback 和模型窗口变化。
- 终端页和会话内终端会优先在用户当前工作目录打开，提升为独立终端 tab 后仍保留 cwd。
- 诊断页可以查看最近错误、复制错误摘要、打开日志目录、清理日志，并导出脱敏诊断包。

## 问题修复

- 修复钉钉机器人解绑后 Client ID / Secret 仍残留的问题；现在通过显式 unbind endpoint 清理凭据，不再依赖会丢失 `undefined` 字段的通用配置合并。
- 修复微信 agent 回复不可见的问题：发送消息和 typing API 现在会校验 iLink 业务 ret code，失败时会重试或把队列错误反馈到会话。
- 修复微信长任务期间 typing 状态过早消失的问题，长工具执行期间会持续维护 typing，并在完成或失败后取消。
- 修复钉钉权限请求后最终答案可能更新到旧 AI Card 上方的问题；权限请求现在会结束当前流式卡片，审批后新建卡片展示结果。
- 修复 Telegram 等 IM adapter 因旧 sidecar 残留或多平台共享进程导致长轮询被抢占的问题；桌面端会清理 stale sidecar，并把每个 IM 平台拆成独立 sidecar 进程。
- 修复 IM adapter credential 文件权限和配对文件写入安全问题，配置目录和凭据文件会尽量使用 owner-only 权限。
- 修复空桌面会话 context snapshot 全为 0 时显示成 0% 的误导状态。
- 修复桌面 context 用量在 assistant 回复完成后下降的问题；统计会把最新输出 token 纳入下一轮上下文，并用本地估算作为下限。
- 修复断开会话的 transcript fallback 与 live `/context` 统计口径不一致的问题，现在复用同一套当前上下文 token 总量逻辑。
- 修复 prewarm CLI 还没连上 SDK socket 时就发送 context inspection，导致 composer spinner 或首次 context 请求超时的问题。
- 修复空会话误报 “CLI session is not running” 的问题，未发送首轮消息时会保持更明确的待计算状态。
- 修复会话删除失败后可能污染后续 chat startup 的问题，删除文件失败会回滚删除标记，避免旧会话存在但无法继续启动。
- 修复 desktop rewind resume 的稳定性问题，rewind 前会等待 CLI 退出并排空输出，空 transcript 占位会话仍保留 canonical workDir。
- 修复桌面权限 prompt 在切换权限模式后可能不可见的问题，权限模式变更会重启 CLI 并保持 prompt 可见。
- 修复 macOS 通知插件权限状态不可信的问题；macOS 现在通过原生 UserNotifications 获取授权、展示前台通知并发送测试通知。
- 修复底层 auth env 策略不一致和 secret 误展示问题，避免 Settings JSON 编辑时误保存占位符。
- 修复 `/context` 对不同模型上下文窗口显示不准确的问题，补齐内置模型窗口解析。

## 文档与测试

- 更新微信和钉钉 IM 文档，补充扫码绑定、配对码、默认项目、命令发现和移动端权限审批说明，并加入对应截图。
- `docs/im` 总览补齐四个平台的配置入口和安全模型说明。
- 新增和扩展 context 统计、IM permission、WeChat typing、DingTalk stream state、desktop notifications、adapter config redaction 等回归测试。
- 本地 PR 质量门禁覆盖 desktop、server、adapters、native 和 docs；真实微信、钉钉、飞书、Telegram 等 IM 平台仍建议维护者在发布前用真实账号做 smoke test。

## 其他说明

- GitHub Release 正文继续以 `release-notes/v0.2.1.md` 作为来源，发布时无需再手动复制 Markdown。
- PR 质量门禁默认不会调用真实模型；微信 / 钉钉 / 飞书 / Telegram 端到端消息仍需要维护者显式验证。
- macOS 通知现在默认更保守，用户需要在设置中开启桌面通知，并完成系统授权后才会收到权限请求、任务完成或长任务回复通知。

## 安装说明

### macOS

首次打开如果提示“已损坏”或“无法验证开发者”，请执行：

```bash
xattr -cr /Applications/Gaster\ Code.app
```
