Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 更新日志

本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与[语义化版本](https://semver.org/lang/zh-CN/)。

## [0.6.1] - 2026-09-29

目标版本为 0.6.1。本节日期为 RC 前材料定稿日期,不是正式发布日期;正式可用状态、实际发布时间与镜像 digest 以对应 GitHub Release 和验收记录为准。共用说明见 [v0.6.1 发布说明](docs/releases/v0.6.1.md)。以下历史记录保留原日期范围,其中“正式发布时回填”是旧阶段要求;当前在 RC 前定稿,RC 与正式 tag 之间不为改日期插入新提交。
- 候选定稿(2026-09-28):候选源码提交 `7d40ee83508e6b418e450f041e312c20c2c71772`(分支 `candidate/0.6.1-baseline`,未推送、未打 tag),构建输入为 276 个文件的清单 `0a2819f376993fafa61b27f57a9a978ff7ef1c7635d88e8485bee7c0655c7baf`,本机镜像 `zhiliao-r2:0.6.1-0a2819f37699`(image ID `sha256:f262652592dd2bd32d00aae44f60d4c98caa2c89ca0942254f77918f57aacb4a`,非 GHCR digest)。`npm run check:version` 与 `v0.6.1` / `v0.6.1-rc1` 干跑通过。275 个输入可由提交复现,`next-env.d.ts` 为 Git 忽略的生成文件,限制见[候选定稿](docs/0.6.1候选定稿-2026-09-28.md)。**标题与日期保持「未发布」,正式发布时回填。**

### 验收

- 2026-09-29 最终候选门禁:Windows 隔离源码副本上的 `check:design`、完整 `lint`、全量测试与 `build` 全部通过;858 项测试通过、26 项既有语料/真实模型专项按开关跳过。源码身份为 `6e79059ff825bb2f0ae5c76d6cb818e6da497d04` 加四文件验证配置/测试补丁,275 项清单 `0c3dd6fecf14eb53218e85e061ad51737b612e886e5114243320cf49495c1d10`,生成声明单独记录。首轮三个失败中,两处测试观测错误已修正;编辑器原时限复跑通过,初次超时保留。应用源码、依赖、运行配置和旧镜像未改;无缓存、独立 Linux、双架构、RC 与正式发布不在本次通过结论内,见[完整记录](docs/验收证据/release-gates-061-20260929-a/README.md)。

- 2026-09-28 TipTap run c:经明确授权,在全新隔离实例(project `zhiliao-t061-20260928-c`、`127.0.0.1:3321`)一次跑完 Mermaid 两态矩阵,单 Agent、零真实模型、不构建。两轮各 7 项(登录 + 6 项业务)全部通过,补齐 [run b](docs/验收证据/tiptap-browser-061-20260928-b/closeout-review.md) 遗留的两个覆盖缺口:带属性图片紧邻 **GFM 初始表格**编辑往返,以及全部浏览器请求元数据记录(每轮独立 JSONL,逐请求记录开始、守卫决定、响应状态与完成/失败,未结束 ID 与记录错误为 0)。归档逐字节核对一致、凭据扫描 0 命中、正式容器前后一致;原规格状态改为 `done`。本轮不证明全站 XSS、剪贴板、异地/arm64/RC 与正式发布,详见[运行记录](docs/验收证据/tiptap-browser-061-20260928-c/README.md)。

- 2026-09-28 TipTap run b:复用 R2 本机候选,Mermaid 两态共 14 项检查(含两次登录)全部通过。宽度/对齐保存重开、普通 Markdown 图片、图片紧邻 HTML 表格后转为 GFM,以及危险属性渲染已有证据。收尾核对发现原规格的 GFM 初始输入与全部请求日志尚未覆盖,专项保持 `in-progress`;run a 失败与 run b 原始报告保留。详见[收尾核对](docs/验收证据/tiptap-browser-061-20260928-b/closeout-review.md)。本次仅同步文档,不重跑浏览器或构建,不代表 RC 或正式发布通过。

- 2026-09-27 升级与回退彩排 run u061-20260927-a:用已发布 0.6.0 镜像生成合成数据与升级前配对快照,同卷改用 R2 已通过的 0.6.1 候选镜像。迁移记录保持 14 条不变,业务表、图片与 HEIC 展示图读取一致,升级后写入重启保留;用 0.6.0 恢复升级前快照到空卷,状态一致、升级后写入不存在。回退后 HEIC 展示图 HTTP 400 属 0.6.0 已知缺陷,只记录。未构建、未重试、卷保留,见[运行记录](docs/验收证据/upgrade-060-061-20260927-a/README.md)。异地恢复、独立 Linux、arm64、RC 与正式发布仍未验收。
- 2026-09-27 浏览器补验 run b:守卫按只读语义放行产品既有的 `POST /api/notes/:id/related`,复用 run d 的镜像与 restore 实例重做一次浏览器矩阵。登录、短文、长文公式/表格与 PNG、HEIC 展示图与字节、搜索跳转、历史会话与来源六项全部通过;PNG 389 字节与 HEIC 展示 JPEG 1997 字节都和源快照哈希一致,无页面错误、无额外写请求、无模型请求。结合 [run d](docs/验收证据/r2-061-20260927-d/README.md)的数据恢复,R2 本机同版本范围判定通过,见[补验记录](docs/验收证据/r2-browser-061-20260927-b/README.md)。

- 2026-09-27 浏览器补验 run a:复用 run d 的镜像与 restore 实例执行一次浏览器矩阵,真实登录、短文、长文公式/表格与 PNG 通过,PNG 字节哈希与源快照一致。随后脚本请求守卫按方法把产品既有的只读 `POST /api/notes/:id/related` 判为写请求并中断,HEIC、搜索跳转与历史会话来源未执行,R2 仍未通过。恢复实例已停止,资源、旧证据与凭据核对通过,见[补验记录](docs/验收证据/r2-browser-061-20260927-a/README.md)。修正守卫并重做矩阵待另行确认。

- 2026-09-27 run d:HEIC 读取修复候选一次构建成功,真实 JPEG HTTP 读取、ZIP 往返、完整恢复前后比对和重启持久化通过。浏览器已登录并显示长短笔记、表格和 PNG,但脚本的额外 API 请求因 Secure Cookie 过滤返回 401,后续浏览器场景未执行;R2 未通过。已停止三个实例、保留九卷及原始证据,见[运行记录](docs/验收证据/r2-061-20260927-d/README.md)。不重建,下一步只确认浏览器补验。

- 2026-09-27 run c:官方源候选实际 npm ci 与本机构建通过,Markdown 和 ZIP 两次导入及逐字段/图片比对通过。恢复启动前状态和源库一致,但恢复后 HEIC 的 UUID JPEG 被读取接口拒绝为 HTTP 400,R2 未通过;重启和浏览器未执行,已停止三个容器并保留九卷。详见[运行记录](docs/验收证据/r2-061-20260927-c/README.md)。

- 2026-09-27:旧候选两次在 npm ci 构建失败,R2 数据实测尚未开始。已迁移锁文件 820 个下载地址到官方源,版本和 integrity 保持;新候选与失败归档见[迁移记录](docs/验收证据/0.6.1-registry-2026-09-27/README.md)。新候选仅完成准备与局部校验,构建、R2 和发布仍待确认。

- 2026-09-23 候选准备收口:B1 补单 Agent 审查及 4 项回归,R1 最终补丁 94 项回归通过。复用 T1540、T0114 和无模型安装证据,保留各轮失败与覆盖边界。已固定候选输入、清理临时类型与调试脚本,准备 [R2 操作单](docs/R2出口与恢复操作单-2026-09-23.md);R2 实测、构建、全量门禁和发布均未执行。下方按日期记录的是此前各轮状态。

- 2026-09-23 R1 核心闭环审查完成,并修正拒答收口。白名单里的引用不改写;伪造脚注不再挡住固定句;单独出现「没有相关内容」不改写。来源问答不再把工具轮过渡句推给客户端。验收脚本会把运行中新建的数据目录算作变化。固定句之外的外来知识不自动检测,以已保存原文的人工核对为准。不进入 R2。
- 2026-09-23 另开 3011 隔离实例复验拒答。羽毛球回答含可打开引用 `[^笔记id]`,没有被改成拒答;茶树回答逐字含「来源笔记中没有相关内容」。本轮整理连续非法 JSON 失败,正文未改,不计成功。证据见 [summary.json](docs/验收证据/r1-core-loop-2026-09-23T0114/summary.json)。R1 验收项已齐,审查前不进入下一项。
- 2026-09-23 换用 `xn--wnup5g6so4wn.de5.net` 的模型 `42` 后续跑拒答复验。工具续轮没有再报 thought_signature。来源引用事实正确,但脚注写成 `[^noteId:id]`,链接打不开;茶树拒答未执行。R1 仍未关闭。证据见 [summary.json](docs/验收证据/r1-core-loop-2026-09-23T0021/summary.json)。
- 2026-09-23 茶树拒答的 HTTP 400 已确认是 API 渠道问题。gemini-3.7-flash 经 ai.hybgzs.com 返回的工具调用流里没有 `thought_signature`,原样续轮仍被上游以缺少该字段拒绝。先换 API,再继续 R1。R1 仍未关闭。
- 2026-09-23 来源问答会在最终回答前强制保留「来源笔记中没有相关内容」,已经引用来源的回答不改。复验中羽毛球引用仍通过,且没有被改成拒答;茶树拒答在工具续轮收到上游 HTTP 400(function call 缺少 thought_signature),没有生成正文。来源问答的已批次数已用完,不能再问。R1 仍未关闭。证据见 [summary.json](docs/验收证据/r1-core-loop-2026-09-22T1608/summary.json)。
- R1 核心闭环于 2026-09-22 用隔离空库和合成笔记跑完一轮矩阵,仍未关闭。记录、三次成功整理、主题、关键词搜索、来源引用、无效 Key 失败降级、失败后搜索和 ZIP 通过;一条笔记超时失败后只补整理一次并成功,未进入 10 分钟退避。来源拒答说明了来源里没有茶树内容,但没有逐字出现「来源笔记中没有相关内容」。无模型路径仍只引用 9 月 15 日安装证据。已批后续预算剩下的额度不够再跑一整轮。R2、R3 与正式发布仍未完成。证据见 [summary.json](docs/验收证据/r1-core-loop-2026-09-22T1540/summary.json)。

### 版本与分发

- 应用版本统一为 0.6.1;MCP 握手静态读取 `package.json`,消除写死的 0.5.0,协议版本保持不变。鉴权与工具语义偏差仍待独立分诊。
- 主 Compose 与 Demo 的应用/mock 镜像固定为 0.6.1;安装冒烟默认读取包版本,可明确选择固定 tag/digest,或用 `-PrintConfig` 只预览。
- 增加 `npm run check:version`,核对锁文件根版本、Compose、目标 tag 与发布材料,并接入 CI 和镜像发布前置步骤。原四条门禁、双架构、升级/恢复与 RC 冒烟要求保留。

### 修复

- 修复 HEIC 展示图使用 UUID 文件名时读取接口返回 400;保留旧 id、路径和扩展名边界,已有图片无需改名。32 项真实接口回归通过,[新候选准备](docs/验收证据/0.6.1-heic-read-2026-09-27/README.md)完成;尚未构建或重跑 R2,run a/b/c 证据保持。

- 来源拒答只在最终回答收口:已经引用白名单笔记的回答不改;没有白名单引用时,换一种拒答说法仍补上「来源笔记中没有相关内容」。伪造的 `[^noteId:id]` 不再挡住这句。工具轮里的过渡句仍落库,但不再和最终回答拼发展示。
- 来源引用多认一种模型写法:`[^noteId:真实笔记id]` 会按真实 id 变成原来的站内链接。伪造 id 仍然保持纯文本。
- 将 `@tiptap/core` 单独锁定至官方回补版 `2.27.3`,并修复图片宽度/对齐保存丢失及图片相邻表格无法往返的问题。[49 项局部回归、目标 lint、局部类型与版本校验](docs/TipTap残余风险调查-2026-09-19.md#tiptap-patch-result)通过。公告范围仍匹配回补版,双范围审计保持 32 moderate、0 high/critical;新候选与发布验收未完成,旧图片已丢失的属性不会自动恢复。

- 更新 Next.js/ESLint 配置 `15.5.24`、Sharp `0.35.4`、传递开发依赖 js-yaml `4.3.2`、Vitest `4.1.11`,修补已分诊的安全告警。[局部验证](docs/依赖告警分诊-2026-09-18.md#dependency-patches)共 65 项通过,目标 ESLint 与版本校验通过;全量/生产审计均为 32 moderate、0 high、0 critical。TipTap 风险未豁免,新候选构建、R1/R2 与完整门禁仍待完成。
- 修复设置页“最近备份”按服务端和浏览器各自时区、日期渲染,导致 React #418 的问题:已有备份首帧统一显示 `—`,挂载后显示本地时间;无备份仍显示“从未备份”。[13 项局部回归](docs/R1安装验收-2026-09-15.md#settings-hydration-repair)、一次候选构建及 [14 个本机生产页面场景](docs/R1安装验收-2026-09-15.md#settings-hydration-browser)通过;完整 R1 与发布仍未完成。
- 增强 Demo 验收守卫:运行时精确核对三服务网络、资源/安全/日志限制和固定网络目标矩阵;Nginx 导入/上传路径统一转发头,构建上下文补充密钥/凭据排除,CI 强制执行真实 Compose 解析。目标主机隔离、业务卷配额和固定镜像发布仍待外部验收。
- 修复 Demo Nginx 将构建静态资源计入页面/API 请求额度、导致 503 和 ChunkLoadError 的问题:仅豁免 `/_next/static/`,动态请求仍为 `10r/s`、突发 `40`,连接上限保持 `32`。[局部验收](docs/R1安装验收-2026-09-15.md#demo-static-rate-limit-repair)覆盖旧新配置对照、动态保护和禁用缓存的浏览器刷新;React #418 的独立修复与验收见上条。
- 修复 Demo Compose 入口网络错误声明为内部网络、导致服务健康却没有宿主端口的问题:入口改为 `internal: false`,业务网络保持 `internal + isolated`。相关配置回归 9 项通过,仓库默认 `127.0.0.1:3210` 入口已完成[本机定向验收](docs/R1安装验收-2026-09-15.md#demo-ingress-repair);完整安装、浏览器异常与发布验收继续保留。
- 修复当前候选源码 `npm run demo` 启动本机 mock、应用却访问容器名的问题:启动器设置 `DEMO_RUNTIME=local`,应用仅在固定本机/容器 mock 地址中选择,缺省或非法标记保持容器地址。数据库/环境中的外部模型配置仍被忽略,凭据与数据隔离、附加模型禁用及服务端防护保持;[R1 局部验证](docs/产品规划/开源发布范围与执行清单-2026-09-13.md#r1-source-demo)之外,已补充 [Windows 本机受控源码验收](docs/R1源码Demo接线验收-2026-09-14.md);Docker、完整安装/恢复和发布验收仍待完成。
- 修复搜索候选在相关性排序前被截断的问题:先限定有效笔记与来源范围,再按 BM25 选候选并统计命中词;大量来源外结果不再挤掉来源内笔记。130 篇固定语料下,助手前五命中由 5/13 提升至 12/13。
- 修复长文只能读取前 6000 字符的问题:`read_note` 支持通过 `offset` / `nextOffset` 续读,保留单次预算、来源校验与旧调用兼容;中文及 emoji 页边界不丢字,长标题和标签不再挤掉正文。
- 修复收件箱、主题笔记和笔记编辑页在存在 Embedding 向量时的 Next.js 渲染错误:不再把 SQLite `embedding` 二进制字段传给客户端组件。

### 手机快捷记录

- 设置页外部接入区增加手机快捷记录配置卡:创建专用 `capture:write` Token 后可复制 Token、捕获地址和完整请求信息。
- 增加真实写入自测,成功后可直接打开笔记;401 与网络失败时保留输入并提示下一步。
- 补充 iOS 快捷指令配置指南、HTML 产品说明、接口错误处理、安全吊销和截图验收记录。

## [0.6.0] - 2026-08-30

> **从 0.5.0 升级前,先读这三条。** 都不需要手工改数据,但不知道的话会以为出了问题。
>
> 1. **存量向量会一次性显示为「过期」。** 长笔记分块改变了向量粒度,到「设置 → AI 服务」补算一次即可。不补算不会报错,只是存量长笔记享受不到分块检索。
> 2. **设置页保存的配置一直在覆盖环境变量,只是此前完全静默。** 行为本身没变,变的是现在会明确告诉你哪几项被覆盖了。**如果你曾在设置页存过模型名,那么你改 `.env` 一直是没有效果的**——升级后请核对一次,实测中曾因此把一批按 4B 算好的向量全部按 8B 重算。
> 3. **四项功能变为默认关闭**:手写摄取、AI 生图、Mermaid 图表、深度思考。入口不再默认出现,在「设置 → 功能开关」里逐项开启即可,已有数据与内容不受任何影响。

### 混合检索

- 新增可选 Embedding 语义检索:保留 BM25,与向量结果使用 RRF 融合;未配置或模型漂移时自动降级为 BM25。
- 新增向量任务队列、设置页测试连接与存量笔记补算入口。
- **长笔记分块**:向量粒度从「一条笔记一个」改为「一条笔记多块」,按 Markdown 标题切分并为每块单独建立向量,检索时取该笔记最高分块。此前超过 5000 字的部分根本不进向量,末尾内容搜不到;分块后可被检索到(实测相似度由 0.34 升至 0.44)。短笔记不受影响,仍是单个向量(取舍见 [ADR-0023](docs/adr/0023-note-chunking.md))。
- 升级说明:分块上线前算好的向量会一次性显示为「过期」,在设置页补算一次即可。不补算则存量长笔记享受不到分块。

### 设置

- **修复:设置页保存的配置会静默覆盖环境变量。** 此前若设置页存过模型名、而 `.env` 里写的是另一个,页面不会有任何提示,改 `.env` 也毫无效果——实测中因此把一批向量按错误的模型全部重算了一次。现在设置页会明确列出「哪些项的环境变量已被覆盖、不生效」,并给出被忽略的那个值。两边一致时不提示。API Key 只提示存在分歧,不显示值。

### 外部接入

- 新增可主动创建和吊销的外部接入 Token、快速捕获 API、只读知识 API 与 MCP 语义工具。
- 外部 Token 分为 `capture:write` 和 `knowledge:read` 两种权限,默认不生成。

### Markdown 导出与导入

- 新增笔记持续增量导出:写入、编辑、AI 整理和恢复后异步更新 `data/notes/<主题>/<标题>-<id>.md`。
- 标题或主题变更时自动清理旧路径;导出失败不阻塞笔记保存。
- 修复 Docker 部署下导出目录未落在挂卷内的问题:镜像新增 `NOTES_EXPORT_DIR=/data/notes`,`docker-compose.yml` 挂载 `./data/notes`。此前默认的相对路径会解析到容器内 `/app/data/notes`,宿主机看不到导出文件且容器重建即丢失。
- **新增 zip 导入**(设置 → 数据 → 导入 zip):吃回「导出全部数据」产生的包,笔记、主题、标签、时间戳、摘要与图片原样还原,导出与导入自此互为逆运算。默认跳过库中已存在的笔记(可勾选覆盖),默认不跑 AI 整理(可勾选开启,会按笔记条数消耗模型额度)。导入后逐条给出成功 / 跳过 / 失败的报告,一篇出错不影响其余。含路径穿越等非法条目的压缩包整包拒绝(取舍见 [ADR-0024](docs/adr/0024-markdown-zip-import.md))。
- **普通 Markdown zip 导入**:无自家 front-matter 也可导入;标题按 `title` → 首个 H1 → 文件名推断,主题按 `topic` → `category` → 直接父目录推断。无 id 文件以内容 SHA-256 指纹判重,重复导入不产生副本;`README.md` 与 `licenses/` 目录不作为笔记。使用 18 篇真实 Markdown 语料完成隔离验收,中文、公式、长文与四个主题均正确保留。

### 功能开关(默认体验收窄)

- **手写摄取、AI 生图、Mermaid 图表、深度思考四项改为默认关闭**,在「设置 → 功能开关」中逐项开启,开启后立即生效、无需重启。核心路径只保留「记—找—用」三步(取舍见 [ADR-0025](docs/adr/0025-non-core-features-off-by-default.md))。
- **这是降级不是删除**:已经产生的转写、插图、Mermaid 代码块与思考过程照常显示、编辑与导出。关闭 Mermaid 时已有的代码块退回普通代码块,不出图但不报错、不丢内容;手写笔记的「待核对」提示仍然保留,否则那些笔记会永久卡在中间状态。
- 关闭时服务端一并拒绝,不只是藏起入口:`/api/handwriting` 返回 403 且不再建半条笔记;助手不下发 `generate_image`;深度思考不启用推理模型;系统提示词里的 mermaid 绘图指引一并撤下。

### 个性化

- 新增“纠正即学习”:用户手动修改主题、标题或标签后,样例会作为后续 AI 整理的有限参考。
- 设置页支持关闭学习和清空样例。

### 新增

- AI 助手的完整文字回答可直接「存为新笔记」,视觉识别结果无需复制粘贴。
- 新增单图手写转写队列:原图保留、转写结果追加到笔记,失败后可重试。
- 新增 `$...$` / `$$...$$` 数学 Markdown 契约与 KaTeX 阅读态渲染。
- 新增 `⌘K` 命令面板,支持笔记搜索、主题跳转与常用动作。
- 新增 `⌘\\`、`⌘J`、`⌘S`、`⌘Enter` 与分层 `Esc` 快捷键,并为侧栏折叠建立状态契约。
- 补充命令面板与快捷键的前端组件测试基础。
- 图片上传上限提升至 20 MB,按文件魔数识别 PNG、JPEG、GIF、WebP 与 HEIC;HEIC 保留原件并生成 JPEG 展示副本。
- 笔记详情页增加桌面宽屏画布及 H1–H3 标题目录,移动端保持单栏。
- AI 助手增加默认关闭、不持久化的「深度思考」消息级开关和独立推理模型配置。
- **深度思考显示思考过程**:解析 `reasoning_content`、`reasoning` 与内联 `<think>…</think>` 三种线格式,随消息落库,在回答上方以折叠栏呈现——模型思考时自动展开,正文开始输出时自动收起,刷新后仍可查看。思考过程不回灌进后续请求的上下文,「存为新笔记」时也不带上(取舍见 [ADR-0015](docs/adr/0015-deep-thinking-tools-and-trace.md))。
- 设置页「深度思考模型」增加「测试连接」:连通性、是否外露思考过程、是否支持工具调用一次测完,工具能力结论单独记为 `reasoning_supports_tools`。
- **共享正文排版层**:新增 `.prose-note`,笔记编辑器与助手回答共用同一套段落间距、标题留白、列表节奏、等宽代码块与行宽上限(约 40 字/行)。颜色圆角全部取既有设计 token,暗色自动跟随(取舍见 [ADR-0016](docs/adr/0016-shared-prose-layer.md))。
- **助手回答渲染 Markdown**:标题、列表、表格、代码块、引用块正常成形,回答不再套气泡而是占满面板宽度的文档式排版。引用标记 `[^id]` 在解析前转成站内链接,避免被 GFM 当成脚注吞掉;模型编造的 id 仍保持纯文本。
- **助手面板可拖宽**:默认宽度从 420px 提到 560px,拖左边缘可在 420–900px 之间调整,宽度记在 `localStorage`;移动端仍是全宽,不显示把手。
- 列表密度提升:笔记卡从 24px 内边距的大卡改为紧凑行、摘要压到单行,一屏可见条数约翻倍;首页主题卡去掉固定高度与 40px 巨大数字,宽屏下每行 4 个。
- **编辑器斜杠命令**:正文里输入 `/` 弹出命令菜单,支持标题、列表、引用、代码块、Mermaid 图、表格、分隔线,可用中文或 `h1`/`table`/`mermaid` 等别名过滤,上下键与回车选取。`and/or`、`3/4` 这类正常输入不会误触发。
- 笔记目录高亮当前阅读位置,随正文滚动跟随。
- 笔记详情页「专注」模式:收起工具栏、目录与标签行,只留标题与正文。

### 变更

- UI 重设计先落设计 token 地基:自托管思源黑体、思源宋体、Instrument Serif 与 JetBrains Mono,新增六级字阶、三级圆角及亮暗双态 CTA token;设计约束改为 `npm run check:design` 自动检查并接入 CI。
- UI 重设计 PR2 完成视觉换肌:列表行改为发丝线分隔,页面级标题与空态使用衬线字,元信息与数字使用等宽字,主行动默认改为亮暗双态 CTA 墨底(主题不变暗面保留高对比 Action Blue),标签改为小号大写 chip,编辑器工具栏图标统一为内联 SVG;全站 arbitrary 圆角完成迁移。
- **桌面侧栏可折叠**:256px ⇄ 56px,折叠态只留图标、主题列表隐去(仍可从 `⌘K` 命令面板或「主题」页进入);入口为 `⌘\` 与侧栏底部的开关,偏好记在 `localStorage`。折叠状态在首帧前就写进 `<html>`,刷新后不会先展开再收起。
- **AI 助手在桌面端从覆盖式抽屉改为推挤布局的第三栏**:打开时把正文推窄而不是盖住,与侧栏一样贴顶、自身高一屏,正文再长面板也不会被拉长。随之取消遮罩与「点面板外关闭」——面板不再是模态,关闭走 ✕、`Esc` 或 `⌘J`。拖拽调宽与宽度记忆照旧;手机端仍是覆盖全屏的浮层,不变。
- **桌面端「快速记录」改为就地浮层**:不再整页跳转到新建页,记完一条原地刷新列表并收起,不打断当前页面;停在某个主题页时下拉自动预选该主题。未保存的正文在浮层关闭后留存,下次打开还在,因此点遮罩或按 `Esc` 关掉都不会丢字。`Esc` 逐层退出,浮层开着时不会连带关掉助手面板。`⌘K` 命令面板的「新建笔记」走同一个浮层。**移动端保持原有的整页形态**——小屏上浮层反而更难用。

### 修复

- **修复 Mermaid 图表在 headless 浏览器中 CPU 与内存持续增长**:NodeView 同步代码块语言 class 时,ProseMirror 会把代码节点自身的属性 mutation 重新交给 NodeView,和 Mermaid 异步重绘形成高频布局循环。现在忽略 `contentDOM` 自身的属性同步,同时继续接收正文和选区 mutation;真实浏览器 production 不受影响,headless production 的布局计数与内存已稳定。
- **开着「深度思考」时助手声称「不能生图」**:此前推理请求会把整个工具集清空,`generate_image`、笔记检索与写入全部不下发,深度思考实际退化成不认识知识库的纯问答。现改为照常下发全部工具,能否使用由深度思考模型自己那份探测结论决定;仅删除需确认、来源问答禁用生图与抓网页、每条消息最多 2 张图等既有防线原样生效。
- **笔记正文段落、标题、列表之间没有任何间距**:Tailwind Preflight 清零了这些元素的 margin,而项目从未补回,正文因此贴死成一坨、标题只是「变大变粗的一行字」;代码块也一直没有等宽字体。
- 笔记详情页正文过长时溢出卡片并压住底部标签行:编辑器外层容器不是 flex 列,导致编辑器的限高失效。
- 未配置深度思考模型时,「深度思考」开关不再照常亮着——改为置灰并注明「(未配置)」,此前点击静默无效。
- 设置页的「深度思考模型」配置块此前被误放在「账号」区,现归回「AI 服务」区。
- AI 看图不再把多张原始图片直接 Base64 塞入请求;改为生成不落盘的高质量 WebP 副本,并按图片数量、单图字节与总字节设限,避免大请求触发上游网站防火墙。上游返回 HTML 错误页时只展示简洁诊断,不再把整段页面输出到聊天界面。
- **AI 主题建议点一项「采纳」,其余建议连同卡片一起消失**:三条建议共用 `topic_suggestions` 的同一行、同一个 `status` 列,采纳任意一项就把整行标记为已处理,其余建议的笔记留在未分类却再无入口。现改为逐项采纳——只摘掉当前项、把刚迁走的笔记从其余项中剔除,剩余建议继续待处理。
- **搜索页选中主题后一片空白**:主题 chip 此前只能在关键词命中结果里二次过滤,不输关键词就什么都不显示。现在只选主题不输关键词时,直接列出该主题下最近的笔记。
- 搜索页的主题筛选栏不再把「全部主题」「未分类」和普通主题平铺成同级 chip,改为三段式分隔,「未分类」弱化并归到末尾。
- 新建主题此前只有「设置 → 主题管理」一个入口,容易与到处都是的「新笔记」混淆:首页标题栏与侧栏主题列表底部各补了一个「+ 新建主题」。

## [0.5.0] - 2026-08-17

### 新增

- **AI 画图**:助手第 9 个工具 `generate_image`,生成结果以卡片呈现,可「插入当前笔记」或「存为新笔记」,模型也可自行调 `append_to_note`。只做 OpenAI 兼容的同步接口(`url` 与 `b64_json` 两种返回一律当场取字节落盘,图片类型按魔数嗅探);**不设确认卡片**,改以每条用户消息最多 2 张封顶且失败也计数;来源问答中禁用(取舍见 [ADR-0011](docs/adr/0011-image-generation.md))
- 设置页第三组「图像模型」(`image_base_url` / `image_api_key` / `image_model`,回落语义同视觉模型);「测试连接」会真实生成一张最小尺寸图,按钮旁注明消耗一次额度
- 新端点 `POST /api/notes/[id]/append`(服务端读改写,避免客户端覆盖竞态)
- **Mermaid 图表**:笔记编辑器里语言标为 `mermaid` 的代码块渲染成图,光标移入变回源码、移开重新出图,渲染失败显示源码与错误行;跟随深浅色重渲染。存储与导出形态不变,仍是原生 Markdown 代码块(Obsidian 直接可读);mermaid 走动态 import,不进首屏 bundle
- **每周回顾**:每周一凌晨把上一自然周新建的笔记梳理成一篇回顾,存入自动创建的「每周回顾」主题(`aiStatus=skipped` 且主题/标题双锁,不再被 AI 流水线整理)。默认开启,设置页可关,另有「立即生成上周回顾」手动补;空周不产报告(取舍见 [ADR-0012](docs/adr/0012-weekly-review.md))
- 新端点 `/api/review`:`PATCH` 开关、`POST` 手动入队
- 环境变量新增 `IMAGE_BASE_URL` / `IMAGE_API_KEY` / `IMAGE_MODEL` / `IMAGE_TIMEOUT_MS`(默认 180 秒)与 `TZ`

### 变更

- **聊天界面重设计**:一体化输入卡(多行自增高输入 + chips 控件行 + 发送 pill),上下文附件、来源集、读图开关从顶部横条收进输入卡 chips;空态按会话形态给三套文案与建议动作 chips;气泡与卡片圆角统一为 18px
- 助手提示词补充:写笔记涉及流程/结构/时间线时用 mermaid 代码块,聊天回答里不输出(那里不渲染)
- AI 任务队列遇到未知任务类型改为显式抛错并重试,不再静默标记完成——新增任务类型忘了接线时不会再无声无息地消失

### 修复

- SSE 流未收到结束事件就断开时(后端进程被杀、反代超时),气泡尾部显示「回答可能不完整」;用户主动点停止或流内已报错时不提示
- 每周回顾的周界改按任务入队时刻计算:任务因停机、退避重试或「LLM 未配置」延后到跨周才执行时,原先会按执行时刻现算,导致原定那一周永远补不回来(对表已记为「已安排」),而新一周生成两篇

## [0.4.0] - 2026-08-15

### 新增

- **来源问答**:先勾选若干笔记与主题作为来源集,整场对话严格接地——AI 只依据来源内容回答,来源里没有的直接说没有,用户在对话中要求破例也不放行(设计取舍见 [ADR-0010](docs/adr/0010-grounded-source-chat.md))
- 来源集挂在会话上(新表 `conversation_sources`,迁移 `0007`),会话进行中可随时增删来源,下一条消息生效;主题作为来源是**活引用**,之后新增到该主题的笔记自动进入来源范围
- 笔记页与主题页新增「以此为来源提问」,一步开启以当前对象为唯一来源的问答
- 会话作用域新增 `sources`;会话列表中来源问答标注「来源问答(N 个来源)」
- 新端点 `PUT /api/chat/conversations/[id]/sources`(覆盖式更新来源集);`GET /api/chat/conversations/[id]` 增加 `sources` 与 `sourceNoteIds` 字段
- SSE 事件新增 `{grounding}`:开流前回报本轮生效的来源笔记,供引用溯源放行来源笔记(它们的正文直接进上下文,没经过工具)

### 变更

- 来源问答模式下禁用 `fetch_url`(外部网页不属于来源),`search_notes` / `read_note` 限定在来源集范围内,执行层二次校验,模型硬调也会被拒
- 来源全文超过 12000 字符时改为注入来源清单,正文交给限域工具按需取;此时界面明确提示「来源集过大」,模型不支持工具调用时提示正文不可见

### 修复

- 续聊时上下文取自当前页面而非会话自身作用域:从历史里打开一场会话再发言,注入的是当前页的笔记/主题。今天只是上下文错位,有了来源问答后会静默丢掉整个来源集。现改为会话已存在时一律以其自身作用域为准
- 每日清扫的孤儿会话判定改为显式列举,**未知作用域默认存活**:原先未知取值一律当主题查、查不到即删,`sources` 落进去就是 v0.3「全局会话被删光」那次事故的完整复刻

## [0.3.1] - 2026-08-15

### 修复

- 容器健康检查始终为 unhealthy:镜像缺少 `HOSTNAME=0.0.0.0`,Next standalone 因此绑定到 Docker 默认设置的容器 ID 主机名,容器内 `127.0.0.1` 不可达,而 HEALTHCHECK 探的正是它。服务对外一直正常,只是探针连不上自己——该缺陷自 v0.1.1 引入健康检查起就存在

## [0.3.0] - 2026-08-15

### 新增

- AI 助手工具调用:对话中可检索笔记、读取全文、列出主题、新建笔记、追加内容、修改分类标签、删除笔记、抓取网页共 8 个工具。删除前必须由用户确认,其余写操作直接执行并可逐条撤销
- 撤销与确认两个端点:`POST /api/chat/undo`、`POST /api/chat/confirm`
- 会话作用域新增 `global`(全局助手),不再必须依附于某条笔记或某个主题
- 助手入口提升为全局:所有页面右下角都可唤起,当前笔记/主题降级为面板顶部**可摘除的上下文附件**,摘掉后助手面向整个知识库
- 操作卡片:助手每执行一步都在对话里留下一张卡片,写操作可逐条撤销;笔记在此期间被手动改动过则按钮置灰并说明原因
- 删除确认卡片:「允许 / 拒绝」两个按钮,卡片上写明要删的笔记**标题**(而非 id),拒绝后助手会接着回应
- 引用溯源:助手标注的 `[^noteId]` 渲染成可跳转的上标链接;模型编造的 id 保持为纯文本,不生成打不开的死链
- 模型不支持工具调用时,面板顶部提示已降级为纯问答;从未探测过则提示去设置页测一次连接

### 修复

- 设置页「AI 服务」两组配置形态不一致:视觉模型的字段顺序原为「模型 → 接入点 → API Key」,现与文本模型统一为「接入点 → 模型 → API Key」;并补齐每个字段的来源徽标(新增「回落文本模型」一态,与「未配置」区分)与「测试连接」按钮
- 体验模式下 AI 对话没有任何回复:内置 mock LLM 不处理 `stream: true`,始终返回非流式 JSON,导致 SSE 解析读不到内容(表现为消息发出后 AI 毫无反应,且不报错)
- 每日清扫会把全局助手的会话连同撤销载荷一并删除:这类会话没有作用域对象(`scopeId` 为空串),被孤儿判定误伤
- `fetch_url` 误拒用户给过的网址:URL 后紧跟中文(`https://a.com/x这个网址的内容`)时,汉字被吞进 URL,白名单比对落空,助手回「未在本次对话中出现」。改为只按 RFC 3986 的 ASCII 字符提取
- `fetch_url` 在使用代理的机器上完全不可用:`198.18.0.0/15` 原被当作 RFC 2544 基准测试网段拦截,而 Clash / sing-box / Surge 的 TUN 模式默认拿它做 fake-IP,导致每个域名都被判为内网地址
- 助手思考时界面像卡死:等待首个字符只有一个静态省略号,现改为动态字符指示,工具执行中与流式全程都有进行中的信号

### 变更

- `/api/chat` 重构为工具调用循环:单次对话最多 8 轮、每轮最多 20 个调用,工具结果的回灌总量限制在 8000 字符(超出时省略更早的结果)
- SSE 事件在 `{delta}` `{done}` `{error}` 之外新增 `{tool_start}` `{tool_end}` `{confirm_required}`
- 会话列表不再按作用域切分,改为按最近更新倒序列出全部(上限 100 条),旧会话标注「围绕 XX」。`GET /api/chat/conversations` 相应不再需要 `scopeType`/`scopeId` 参数
- mock LLM 支持流式响应与工具调用,并新增 AI 对话与读图的模拟回复;原先对话请求会落到兜底分支,只回一句 `{"pong":true}`

### 安全

- `fetch_url` 只能抓取用户消息中出现过的网址;网页内容里出现的链接不进白名单,切断「模型被网页策反后把知识库内容拼进 URL 发出去」这条外泄路径
- 限制单轮工具调用数为 20 个,避免提示注入把助手的写操作放大成批量污染

## [0.2.0] - 2026-08-14

### 新增

- 回收站:删除笔记改为移入回收站,30 天内可恢复(恢复时搜索索引重建、被打断的 AI 整理自动续跑);到期随每日清扫彻底删除。入口在 设置 → 数据
- 导出全部数据:设置页一键下载 zip——`主题名/标题-id.md` 目录结构,frontmatter 携带主题/标签/时间等元数据,图片集中在 `assets/` 且正文引用已改写为相对路径,可直接导入 Obsidian 等工具
- 设置页「立即备份」按钮与最近备份时间展示(复用每日备份逻辑,连点自动合并)

### 变更

- 删除语义:物理删除 → 移入回收站;「彻底删除」仅在回收站内可执行
- 孤儿数据随每日清扫回收:无笔记引用的图片(含历史遗留)、失去归属对象的 AI 会话;清扫只在当天备份成功后执行(先备份后销毁)
- 彻底删除的数据在既有备份中最多再保留 7 天(备份轮转所致),此后不可找回

## [0.1.1] - 2026-08-13

### 新增

- 一键体验模式:`npm run demo`(或 `docker compose -f docker-compose.demo.yml up -d`),内置演示数据与本地 mock LLM,无需 API Key 即可体验「随手记 → AI 自动归档 → 主题建议」完整流程
- 健康检查端点 `/api/healthz`;Docker 镜像内置 `HEALTHCHECK`,`docker ps` 可直接看到 healthy 状态
- 每日备份纳入图片目录 `uploads/`(与数据库快照一样保留最近 7 份);新增文档《[备份与恢复](docs/备份与恢复.md)》
- Vitest 单元测试基线(搜索分词/FTS、标签、AI 流水线、LLM 容错、会话),CI 加入测试步骤
- 发布工作流:推送版本 tag 自动构建多架构(amd64/arm64)镜像发布至 `ghcr.io/b-tech-hub/zhiliao`,并自动创建 GitHub Release
- 社区文件:CONTRIBUTING、SECURITY、Issue/PR 模板
- 英文快速上手 `README.en.md`

### 变更

- `docker-compose.yml` 默认使用预构建镜像(保留本地构建回退方式)
- README 重构:一键体验入口、预构建镜像部署为主路径

## [0.1.0] - 2026-08-13

### 新增

- 首个公开版本:随手记 Markdown 笔记,AI 自动生成标题/标签/摘要并归档到主题
- 低置信度笔记进入「未分类」收集箱,累积后 AI 聚类建议新主题
- 中文全文搜索(jieba 分词 + SQLite FTS5)
- 围绕笔记/主题的 AI 对话(SSE 流式,可选视觉模型读图)
- PWA、深浅色主题、图片上传
- 单密码登录 + JWT 会话;Docker 部署;每日自动备份数据库

[0.6.0]: https://github.com/B-tech-hub/zhiliao/compare/v0.5.0...v0.6.0
[0.5.0]: https://github.com/B-tech-hub/zhiliao/compare/v0.4.0...v0.5.0
[0.4.0]: https://github.com/B-tech-hub/zhiliao/compare/v0.3.1...v0.4.0
[0.3.1]: https://github.com/B-tech-hub/zhiliao/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/B-tech-hub/zhiliao/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/B-tech-hub/zhiliao/compare/v0.1.1...v0.2.0
[0.1.1]: https://github.com/B-tech-hub/zhiliao/compare/v0.1.0...v0.1.1
[0.1.0]: https://github.com/B-tech-hub/zhiliao/releases/tag/v0.1.0