# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/).

## [0.9.1] - 2026-08-22

### Fixed
- **呼喊重复触发不再刷屏横幅**：urgent 呼喊每分钟重发时（repeatCount>0）只保留响铃 + 手机推送 + 桌面弹窗，不再往 TUI 重打整段警告——此前人不在电脑前时，auto-error 等紧急呼喊会每分钟全量重放一条 300 字 Warning 把横幅淹没。首条 notify 也改为只展示前 80 字摘要（详情在对话记录 / `/i-am-cooking status`），符合“横幅只显示计数+状态”的设计原则。

## [0.9.0] - 2026-08-22

### Added
- **手机推送带「停止响铃」按钮（远程静音，不退出离开模式）**：开启离开模式时插件在本机启动一个小型停止端点（随机端口 + 会话级随机 token），ntfy 呼喊推送自动附带 `http` 动作按钮（JSON 发布，UTF-8 安全）。人在厨房听到响铃，手机点一下 → 手机直接向本机内网 IP 发请求杀掉音频，旧呼喊标记已处理，agent 继续自主干活。仅同一局域网可用；仅 ntfy 通道支持；`off` / 会话关闭即停服并作废 token（旧推送按钮立即失效）；可用 `config.remoteStop: false` 关闭。

## [0.8.0] - 2026-08-22

### Added
- **milestone 模式接入进度心跳（治“进度汇报被遗忘”）**：小阶段模式此前完全依赖 system prompt 静态规则，长回合中指令显著性衰减，agent 经常忘记主动报 milestone。现在与 interval 模式共用同一个进度心跳定时器：每 N 分钟发一条单行 `[milestone check]` 自查提醒——有值得报的小阶段就 `shout_for_user(category="milestone")` 只推手机，没有就忽略提醒本身。
- **心跳只在回合进行中触发**：新增 `agentActive` 标记（`before_agent_start` 置 true / `agent_settled` 置 false），回合结束（等用户 / 已收尾）时心跳自动暂停，新回合开始自动恢复——顺带修了 agent 停着等用户时也会收到进度提醒的旧问题。

### Fixed
- **任务收尾后心跳不再空转（对两种进度模式生效）**：`detectTaskFinale` 自动停表从仅 interval 放宽为所有进度模式；即使收尾正则漏判（agent 换了种说法说“做完了”），回合结束本身也会让心跳暂停。停表现在有三重保险：completion 调用 / 收尾措辞 / 回合自然结束，任一先到即停。

### Docs
- rules.default.md 小阶段模式补充自查提醒说明（无内容忽略、任务收尾自动停止）；milestone 开启提示语同步更新。

## [0.7.0] - 2026-08-17

### Changed
- **呼喊后再也不强制“停止自主推进”**：`shout_for_user` 返回文本只做事实确认（已发出/去重），不再注入“停止自主推进、暂停当前回合、等待用户”的强制指令。喊完怎么办由类别语义 + 自主判断决定——阻塞类：被卡住的那件事已交接、不再继续，但其他不依赖用户的工作照常推进；进度/完成/里程碑类：只是推送信息，照常干活或自然收尾。
- **工具描述按场景拆分**：阻塞类（decision/credential/approval/clarification/help）与通知类（progress/milestone/completion）分述，不再笼统写“仅当你被真正卡住时调用”。
- **进度汇报规则段重写（规则文件 → system prompt 讲清楚定位）**：明确三类呼喊的分工（阻塞=响铃等用户 / 完成=响铃报喜 / 进度=只推手机），说明两种进度模式（小阶段 agent 自驱 / 定时系统自驱）互斥且二选一，给出里程碑“值得报/不值得报”的判断标准，并提示进度无去重保护、同一阶段报一次即可、完成通知后自动停止。
- **完成通知边界收敛**：只有任务全部完成、可验收时才发 completion；中途关键进展改用 milestone（只推手机）或阻塞呼喊，消除“重要里程碑 vs 重要小节点”的模糊地带。
- **system prompt 显式标注当前进度模式**：`buildRulesPrompt` 增加进度模式参数，`before_agent_start` 注入时把本次离开的模式（小阶段/定时/关闭）写进机制提示，agent 不再靠猜。

### Fixed
- **shout_for_user 被模式拦截时不误报“去重”**：queueAlert 返回值从 boolean 改为区分原因（duplicate / mode-off / limit / not-cooking），工具返回错误文案对应区分——非 milestone 模式下调 milestone 会明确提示“当前进度模式不支持”，不再误说“已有同内容不重复发送”。
- **定时汇报任务完成后不再一直催**：interval 模式下，agent 回合收尾时若明确表示任务已全部完成（如“任务全部完成 / 收工 / done”），系统自动停掉定时汇报（detectTaskFinale 保守匹配，排除“已完成：X”式进度措辞与否定表述），不再继续要求进度——不依赖 agent 主动调 completion；[定时汇报] 提示文案同步引导 agent 收尾时调用 completion；completion 即使达到防打扰上限也停表。
- **退出离开模式后 agent 不再误以为还在离开中**：手动 `/i-am-cooking off` 关闭时立即发一条消息告知 agent 已回到在线状态、离开模式规则（定时汇报/自主等级/呼喊）不再生效，停止离开模式行为；`exit_cooking_mode` 工具路径已由工具返回文案告知，不重复发送。

### Docs
- **rules.default.md「呼喊交接」补充喊后行为**：被卡住的事已交接，其他独立工作照常推进；「进度汇报」补一句“喊完继续干活，不要停”。
- **同步运行时规则文件** `~/.pi/i-am-cooking/rules.md`（补上缺失的进度汇报规则段 + 新增喊后行为）。

### Tests
- 新增 buildRulesPrompt 机制提示反映当前进度模式的测试。

## [0.5.2] - 2026-08-17

### Fixed
- **规则注入分隔符与换行归一化**：`buildRulesPrompt` 注入区块前后加 `---` 强分隔符防止与 base systemPrompt 粘连；`before_agent_start` 确保 event.systemPrompt 末尾有 `\n`；区块标题统一 Markdown heading 格式。已作为 0.5.2 发布到 npm。

## [0.1.0] - 2025-08-14

### Added
- **published to npm**: `pi install npm:i-am-cooking` now works. Package trimmed via `files` field (excludes tests/tsconfig); verified install from clean dir with lib/ intact.

## [0.5.0] - 2026-08-16

### Added
- **进度只推手机（里程碑/定时汇报）**：进度类（`milestone` / `progress`）不再响铃/弹窗/进横幅，只推手机通知（本地仅一条轻提示）；手机标题按类型区分（📈 进度 / ✅ 完成 / alert）；定时汇报改成 agent 收到提醒后用 `shout_for_user(category="progress")` 汇报，内容只上手机。
- **完成后不再定时汇报**：收到 ✅ 完成通知时自动停掉定时汇报 timer，任务完成后不再继续刷进度。
- **进度类不去重**：`progress`/`milestone` 跳过 10 分钟同内容去重——即使两次进度内容相同也要每次都推（如连续“无新进展”）。

## [0.5.1] - 2026-08-16

### Fixed
- **ntfy 推送标题含 emoji → 整条推送报错**：HTTP header 只允许 Latin-1，`📈 进度`/`✅ 任务完成` 导致 `fetch` 抛 ByteString 异常，进度类与完成通知的手机推送全部失败（仅普通呼喊正常）。修复：header Title 改纯 ASCII（progress / task done / pi alert!），分类 emoji 前缀移到 body（UTF-8 安全）；新增回归测试（header 必须纯 ASCII）防再犯。

### Changed
- **关闭离开模式不再发“请汇报喊了什么”的 followUp**：agent 结束时会自行总结进度，off 只负责关闭（本地一条轻提示）；`exit_cooking_mode` 工具返回文案、`turnOff` 签名与文档同步。

### Docs
- **rules.default.md 补充「进度汇报」规则段**：小阶段（milestone）定时（progress）只推手机、完成后不再汇报——与 0.5.0 进度策略对齐。

## [0.4.0] - 2026-08-16

### Refactored
- **代码整洁性大轮次（行为不变，纯重构）**：
  - 拆 lib 模块：`config`（类型/默认值/读写）、`prefs`（偏好&等级检测/shouldSuppress）、`push`（ntfy/webhook）、`volume`（音量控制）、`audio`（三段式播放+互斥）、`rules`（规则加载/prompt 构成）、`platform`（命令执行）——全部配单元测试，测试 15 → 35 个。
  - `index.ts` 从 2156 行瘦身至 1510 行：命令 handler 拆为独立函数 + 注册表（265→10 行）；setupWizard ntfy/webhook 公共尾声抽成 `finishPushSetup`；fireAlert 三层音频分支合并。
  - 全部 `{ ui: any }` 替换为基于官方 `ExtensionUIContext` 的 `CookingCtx` 统一类型。
  - 新增 `npm run typecheck`（正式 devDependencies：typescript/@types/node/typebox，替代临时目录方式）。
  - 清理死代码/未使用导入，文件头注释命令列表同步最新。

### Added
- **状态栏动态指示 & 停止本次播放**：喊话时状态栏/横幅变 `📢 正在广播中...（Ctrl+Alt+M 静音）`，播完自动恢复 `🍳 离开中 · ⚠N 待处理`；新增 `Ctrl+Alt+M` 快捷键和 `/i-am-cooking stop-sound` 命令停止本次播放——只掐当前音频，不改配置、不清待处理呼喊、下次照常响铃。
- **极简横幅（计数不塞详情）**：横幅只显示“🍳 离开中 · ⚠N 待处理 · /status 看全部”（响铃时多一行 📢），不再逐条陈列消息——方案/进度/总结等详情在对话历史里，`/status` 可查全量；完成/进度类不计入待处理计数（纯告知）。
- **打字 = 已响应**：离开模式下你打字（回复呼喊/给新指示），正在响的铃声立即停止，旧呼喊全部标记已处理并从横幅清掉（重复喊 timer 遇 acked 自停）；agent 继续自主干活，之后的呼喊是新信号照常显示/响铃。
- **修复**：`stopAudioAll` 本地包装误递归调用自身（重构遗留），改为调用 lib 的 `stopAllAudio`，避免任何“停止音频”路径栈溢出。

### Changed
- **多 Agent 独立**：移除联动关闭机制（state.json 广播/watch），各 Agent 完全独立——关闭某个 Agent 不影响其他；打字不再自动关闭离开模式（正常输入交给 agent 处理）。
- **语义退出**：新增 `exit_cooking_mode` 工具，agent 理解用户"我不离开了/保持在线"等明确结束表达时关闭当前会话；`/i-am-cooking off` 手动关闭。

### Changed
- **进度汇报模式**：`milestoneReminders` 布尔重构为 `progressReporting` 三态（milestone 小阶段完成时/interval 定时/none 不汇报），默认小阶段；每次手动 `on` 时弹"进度汇报·可选-手机通知"三选一，选定时可设间隔（默认 15 分钟）；定时模式下每 N 分钟强制 agent 汇报进度（含无进展/卡住情况），随 off 自动停止。紧急/完成通知不受影响。

### Added
- **音量控制** `/i-am-cooking volume`：交互式中文菜单（查看当前音量 / 立即调音量 / 设置离开自动拉高 / 开关）；`set_volume` 工具让 agent 也能调（用户明确要求时，或呼喊前解除静音）。跨平台：macOS osascript / Linux pactl / Windows volume.ps1。
- **多 Agent 协作**：音频互斥锁（多个 pi 同时离开只放一个声音，崩溃锁自动抢占，test 可强制抢占）；联动关闭（任一 Agent 检测到你回来，其他全自动关闭，watch+轮询双保险）。
- **可爱 Topic 名**：编程/算法/LLM 风词池（22 形容词 × 24 名词）+ 6 位随机数字 = 5.28 亿种组合，全局唯一。
- **自定义呼喊短语** `shoutPhrase`：默认"agent 需要你"，TTS 模板支持 `{shoutPhrase}` 占位，改一处全文案生效。
- **人类在岗**：状态显示从"在岗"改为"人类在岗"。
- **呼喊交接时序（规则化）**：`rules.default.md` 新增「呼喊交接」段——喊用户前先准备好交接内容（刚好够用：决策给选项和推荐/凭据给获取方式/手动操作给步骤），准备好再喊，喊出的消息即最终版；禁止先喊再准备。工具描述/turnOn 指令同步。
- **三层消息音频区分**：🚨需要你（完整三段式含歌曲）/ ✅整个完成（2声不播歌）/ 📈小阶段完成（1声轻声）——听声即知发生了什么。
- **小阶段完成提醒开关**：`shout_for_user` 支持 `category="milestone"`；每次手动开启离开模式时询问是否开启（开启=每小阶段轻声提醒，关闭=只在全部完成/卡住时通知）。
- **铃声文件浏览器** `/i-am-cooking sound`：设置歌曲时从 `~/Music` 逐级浏览（📁文件夹/🔊音频文件）选择，无需手输路径；仍支持手动输入。
- **`set_shout_sound` 工具**：用户说"帮我换个铃声"并给路径时，agent 可帮助设置自定义歌曲（含路径校验/格式校验）。
- **声音开关菜单** `/i-am-cooking sound`：新增「开关」选项，可切换 哔哔声/Agent语音/桌面弹窗（此前只能改 config.json）。
- **安全边界文档**：README 新增"Agent 不能设置什么"表格，说明手机推送/音量/防打扰/规则等为何不交给 agent。
- **自定义呼喊铃声** `/i-am-cooking sound`：三段式顺序播放（短铃声 → Agent 语音 → 自定义歌曲），总时长默认 60 秒到点强制停止（可调 1-300 秒）；支持试听、路径设置/清除；macOS afplay / Linux paplay / Windows PowerShell。
- **Agent 自由语音**：`shout_for_user` 新增可选 `ttsText` 参数——Agent 填了则 TTS 原样念出（不走默认模板），让呼喊更个性化。

### Changed
- **离开状态不跨会话**：任何会话启动都从"在岗"开始（`resetCookingState`），上次会话的离开模式不再自动恢复；旧呼喊记录随会话结束直接清空（不再保留待办）。
- **Agent 自主开启离开模式**：新增 `enter_cooking_mode` 工具，用户说"我去做饭了/我离开一下/I'm cooking"等明确表达时 agent 理解并自动开启（无需手输命令）；工具描述严格限定仅在用户意图非常明确时调用，避免误开。

### Fixed
- **消息投递不及时（followUp 压队列）**：开启/关闭离开模式的消息和定时汇报此前用 `deliverAs: "followUp"`（等 agent 整个回合 settle 才投递），agent 自主连续干活时会出现——状态栏已开但 agent 还不知道、定时汇报堆积迟到。全部改为 `deliverAs: "steer"`（agent 干活途中在下一次 LLM 调用前投递，空闲时照常立即发送）；定时汇报加 `hasPendingMessages` 守卫：上一条还在排队则跳过本次，避免超长工具调用期间堆积重复催促。
- **回来输入被忽略**：cooking 模式中用户打字回来时，输入内容现在会作为新指令转交给 agent（之前 followUp 只发固定"汇报进度"消息，用户补充内容被丢弃导致 agent 继续原方向）。input handler 返回 `handled` 避免消息重复。

### Changed
- **默认防打扰间隔**：正常呼喊重复 5→3 分钟，紧急呼喊重复 3→1 分钟。
- **`/i-am-cooking limits`**：新增交互式中文菜单调整防打扰参数（替代难记的英文子命令）。

### Added
- **autonomy levels**: `conservative`（遇墙就喊）/ `balanced`（有点难度才喊，默认）/ `autonomous`（能不喊就不喊）— 控制遇到阻塞（人类墙：验证码/登录/手动点击等）时 agent 该不该喊用户。`/i-am-cooking level` 命令 + `set_autonomy_level` tool + 文字匹配保险丝 + `on` 备注均可切换；持久化到 config.json；`agent_settled` 安全网在 autonomous 等级下不再自动喊普通问题（报错仍喊）。

### Changed
- **push reliability**: `pushPhone`/`pushWebhook` now return real success (HTTP 状态 + 15s 超时 + 失败日志)；`/i-am-cooking test` 逐通道汇报真实结果（声音/TTS/桌面通知/手机推送 ✓/✗），不再重复发送手机推送，且测试会如实反映当前呼喊偏好（静音/仅完成模式下通道按偏好跳过并提示）。
- **single-rule model**: rules are now ONE fully-editable file (`~/.pi/i-am-cooking/rules.md`) instead of separate built-in + user layers; the built-in default lives in the repo at `extensions/i-am-cooking/rules.default.md` (source of truth, ships with the plugin) and is only copied into the user file on first run. Added `/i-am-cooking reset-rules` to restore the factory default.
- **user-editable rules**: `/i-am-cooking rules` + `/i-am-cooking edit-rules`; rules live in `~/.pi/i-am-cooking/rules.md`, read fresh every turn, guard rail always appended

## [0.1.0] - 2025-07-08

### Added
- **core**: `/i-am-cooking on/off/status/setup/test` commands
- **core**: `shout_for_user` tool — agent calls when blocked or when work is done
- **core**: `set_calling_preference` tool — agent adjusts alert mode based on user's words
- **detection**: auto-detect when agent ends turn with a question (safety net)
- **exit**: typing while cooking mode is on = "I'm back" auto-exit + agent debrief
- **guidance**: inject autonomous-work rules into system prompt when cooking mode is on
- **channels**: sound (beeps / custom wav), Chinese TTS, Windows Toast, macOS notification, Linux notify-send
- **phone push**: ntfy.sh (free, zero-config) + generic webhook (Bark / WeChat Work / ServerChan)
- **setup wizard**: interactive `/i-am-cooking setup` with ntfy/webhook guide, auto-random topic, preview-then-confirm flow, "redraft on mistake"
- **token security**: `${ENV_VAR}` / `$ENV_VAR` support in token fields (ntfyToken, webhookToken)
- **volume control**: auto-boost system volume on enter (opt-in), restore on exit (Windows Core Audio API / macOS osascript / Linux pactl)
- **dynamic preferences**: `silence` / `completion_only` / `urgent_only` / `eager` / `normal` — agent switches based on user's words; text-matching as safety net
- **completion alerts**: agent notifies when tasks finish ("好消息！任务完成了！"), info-level, no repeat, capped per session
- **cross-platform**: Windows, macOS, Linux
- **verification checklist**: docs/VERIFICATION.md
