CHANGELOG - WangYajun369/ai-writing-platform GitHub Wiki

更新日志

v1.23.0 (2026-10-15) — AI 释义流式上屏 + 关联网络可交互维护 + 模型拉取

新增

  • AI 词典释义流式上屏(dict_explain_stream):新增 SSE 流式命令 + NDJSON 逐行累加器,每解析出一整行即推送 dict-explain-chunk 事件,音标 / 释义 / 例句 / 变形 / 近反义逐行即时填表,消掉整段 JSON 返回前的全程白屏;未收到释义行时回退整段解析(三层回退链的第二层)
  • 释义请求可中途取消:新增 CancelToken(原子标志 + Notify + 全局注册表 + RAII 注销)与 dict_ai_cancel 命令,SSE 读循环用 tokio::select! 与取消信号竞争,关闭弹层即刻断流止损;新增 ErrCode::AiCancelled(E_AI_CANCELLED)标识正常取消而非错误
  • 统一流式传输层:抽出 request_chat_stream_text / request_chat_stream_once(无内容进度超时 45s、心跳注释行不刷新 deadline、传输失败重试 3 次退避 1s/2s),删除约 180 行非流式冗余代码;新增 8 项端到端单测(本地 mini SSE 服务器)覆盖分帧解析 / [DONE] / 断流保留已收内容 / 取消即时返回 / 心跳免疫 / 慢内容不误杀
  • 模型拉取与选择(fetch_ai_models):设置页可 GET {endpoint}/models 拉取全部可用模型(含上下文窗口、输出上限、输入输出模态),结果持久化到新增的 ai_models 配置段,下次启动直接复用;下拉由拉取结果填充,未拉取时回退内置选项且保留当前选中值
  • 图谱内直接维护关联(WordGraphDialog):新增缩放工具栏(放大 / 缩小 / 全景适应 + 实时百分比)与键盘快捷键(+/- 缩放、F 适应、Esc 关闭);potential 节点支持「收录进生词本」(先查 ECDICT 带出音标释义,词库不可用时静默降级),已收录节点支持内联「手动加关联」表单,无需跳出图谱
  • 关联词可跳转详情:VocabRelationsPanel 已收录关联词渲染为可点击链接,WordDetailDialog 支持从关联词原地切换词条(切换时滚回顶部),生词本列表与复习卡片同步接入跳转
  • 近/反义词标签一键建关联(WordTag):知识视图中的近反义标签支持「+加入关联」直接写入 vocab_word_relations;前端 extractEnglishWord 与后端 extract_english_word 同规则(剥离中文小注与括号、含空格词组返回 null),避免建出 take off → take 这类错关联
  • 生词本遗留优化落地:分页虚拟滚动(vocab_list_page)、已掌握词批量回炉(vocab_mastered_sample)、ECDICT 侧车索引消灭全表扫描、SM-2 单测 10 项、生词本进备份载荷(三段导出 + upsert 合并导入)

修复

  • 生词本列表恒空:vocabApi.listPage 传参误用 page_size,Tauri v2 命令参数按 camelCase 匹配导致必填参数缺失、invoke 必 reject;改回 pageSize
  • 历史单词关联表未同步:vocab_service::update_word 提交后补调 sync_auto_relations(幂等 INSERT IGNORE),修复「后来生成 AI knowledge 但关联表未同步」;同步失败仅记日志不影响更新结果
  • 图谱滚轮缩放失效:effect deps 仅 [open] 时 SVG 因条件渲染在数据到达后才挂载,监听器绑在 null 上;补 graph?.nodes.length 依赖
  • 流式回调覆盖手填内容:例句 / 翻译字段改函数式更新(setExample(cur => cur.trim() ? cur : …)),修复闭包捕获过期 state 的问题
  • 关联词收录产出空壳词条:collectWord 收录前先 dictApi.lookup 带出音标与基础释义,词库未命中时静默降级
  • 长响应中途断流:共享 HTTP 客户端对齐 SSE 客户端(关闭 gzip/brotli/deflate + http1_only + tcp_keepalive 120s),规避透明解压失败引发的 error decoding response body
  • 形态判定多一次串行往返:改为先查本地离线词库,命中即由 exchange 取原型并完全跳过云端,未命中才回退 AI 检查;硬编码 AI_CHECK_MODEL 改为 resolveCheckModel() 从 settings/constants.ts 单一真源取 flash 档,DeepSeek 下下发 thinking: disabled 避免思考 token 挤占输出预算

优化

  • 移除设置页语义检索(RAG)入口:后端能力完备但前端零接线(useAiChat 的 ragContext 恒为 undefined),按「仅隐藏入口」处理 —— 后端命令、embeddings 表、chunks_vec、sqlite-vec 依赖与备份载荷字段全部保留(载荷字段序参与 payloadHash 重算,删除会导致存量 v2 备份被判篡改而拒绝导入);删除 RagConfigSection.tsx 及随之无引用的常量,文档口径统一为「后端保留、未接入对话、入口已移除」
  • 清理未引用代码:移除无调用点的 dict_word_count(词条总数已由词典状态命令一并返回)
  • 前后端默认模型名对齐:deepseek-v4-flash(弃用别名)→ deepseek-flash(在售名)
  • IPC 命令 210 → 212(新增 dict_explain_stream / dict_ai_cancel),同步 ipc-api.md 与 23 个文档的适用版本基线

v1.22.0 (2026-10-15) — 单词关联网络 + 词族复习 + 关联图谱

新增

  • 单词关联网络(vocab_word_relations 表):新增第 29 张业务表,支撑近义 / 反义 / 派生 / 变形 / 手动五类关联,UNIQUE(word_id, related_word, relation_type) 去重,word_id 外键 CASCADE 级联删除;SCHEMA_VERSION 升至 3,这也是迁移注册表的首条真实迁移记录
  • 收录时自动建关联:新增单词入库时同步解析关联 —— AI 释义中的近/反义词落为「潜在关联」(source=ai,需人工确认)、ECDICT 变形家族按 lemma 双向落库、存量关系反向激活(此前存为潜在关系且目标词已在库中的,自动转为正式关联)
  • 词条详情「关联」面板(VocabRelationsPanel):按类型分组展示已有关联,支持手动添加与删除;潜在关联与正式关联视觉区分,避免 AI 猜测污染学习路径
  • 顺带复习:复习过程中遇到关联词可一键拉入本轮复习队列,走完整 SM-2 评分链路,不做简化的「看过就算」
  • 词族复习(FamilyReviewDialog):按 ECDICT 原型 lemma 实时聚族(run / running / ran / runner 归为一族),支持批量拉入复习会话;词典未安装时不猜测聚族,直接返回空列表避免误导
  • 关联图谱(WordGraphDialog):d3-force 力导向全屏弹层,节点按掌握状态着色、边按关联类型着色;支持滚轮缩放 / 拖拽平移 / 节点拖拽 / 自适应 fit / 低缩放标签分级;单击弹出信息卡、双击直接打开词条;含状态筛选、潜在关联叶子开关、300 节点截断与孤立词统计(新增依赖 d3-force@^3.0.0)
  • 生词列表关联数徽标:逐词显示已有关联条数,一眼看出哪些词还「没长出关联网络」
  • 7 个新 Tauri 命令:vocab_relations_list / vocab_relations_add / vocab_relations_remove / vocab_relations_suggest / vocab_relations_counts / vocab_family_groups / vocab_relations_graph

优化

  • 图谱数据后端聚合:图谱走后端 build_graph 一次成型(节点按度数降序、封顶 GRAPH_NODE_LIMIT),前端只做力导向布局,避免关联密集时前端 O(n²) 组图;孤立词数由 count_isolated_words 单独统计
  • 关联查询统一走仓储层:新增 vocab_relation_repo 隔离 SQL,vocab_relation_service(848 行)承载业务编排,命令层保持薄壳
  • 词图单测补齐:新增 wordGraph.test.ts 11 项用例,覆盖图谱构建、截断、孤立节点统计与着色映射

v1.21.2 (2026-10-14) — 配置写入路径修复(字段级 patch)+ 文档版本标记纠正

修复

  • 启动期偏好被默认值覆盖:useThemeFontInit 从 localStorage 恢复主题/字体时走 preferencesStore 的 setter,而此时后端配置尚未加载完成(configReady=false),导致 gridSize / editorWidth / librarySortBy 等字段以默认值落盘,用户此前的设置被静默重置。现恢复路径改为 setState 直写内存,且 configReady=false 期间一切回写直接丢弃
  • 整段回写截断未持有字段:前端把完整配置对象回写 set_config,后端按整体替换落库;多窗口并发或局部修改时,后端已持久化但前端未持有的字段会被重置。现后端改为字段级 patch(顶层浅合并,显式 null 视为删键),前端各 setter 只发送变更的顶层键
  • env 注入密钥被落盘:读路径注入的临时 API Key 被前端整段回写后存入 app_config 表,密钥来源失控。现写路径在落库前还原用户原密钥或剔除注入值,读写共用同一张 env 覆盖目标表,杜绝字段清单漂移
  • 敏感段解密失败阻断配置读写:ai / tts 段密钥不匹配或密文损坏时直接报错,导致整个配置模块不可用。现回退默认值并经可观测通道上报错误,不阻断用户读取与保存
  • 文档版本标记长期失配:23 个文档的头部标记误写成 **适用版本\1.21.0`(缺闭合 **` 与全角冒号「:」),与刷新脚本的正则不匹配,v1.21.1 发版时的文档同步步骤实际一个文档都没改到,docs 基线自 v1.21.0 起未再更新

新增

  • ErrCode::ConfigCrypto(E_CONFIG_CRYPTO):与普通解析失败区分,便于前端针对「密钥变化 / 数据损坏」给出重置该段配置的针对性提示
  • 配置元信息调试面板(ConfigPanel):调试控制台(?debugwin=1)子面板,展示 app_config 各段的持久化版本与最近更新时间,未持久化的段标注「使用默认值」,用于排查「设置改了没存 / 段版本回退」类问题
  • 文档版本刷新脚本失配告警:refresh-doc-versions.mjs 现在会将格式不合规的文档以 ❌ 显式列出并以退出码 1 结束,防止静默漏刷重演

优化

  • 可持久化字段显式清单:preferencesStore 新增 PERSISTED_KEYS,避免 configReady 等运行时状态被误写进后端配置,也避免新增偏好字段时出现「写了却没落盘」的静默丢失
  • 运行时缓存键白名单:appTypes 用 LOCAL_CACHE_KEYS 统一声明随备份导出/导入的 localStorage 键,未知键一律忽略;移除已迁走后端的 loadAiToolCategories 与相关存储键
  • 默认值字段集一致性守卫:Rust 单测校验后端 Preferences 序列化字段集与前端 prefsDefaults 逐一对应,防止后端漏字段导致前端静默缺失
  • 调试控制台、状态管理、AI 架构、功能清单及三份用户指南同步更新

验证

check.mjs 231/231 通过 | Rust 279/279 | 前端 134/134(11 文件)| tsc --noEmit 0 错误 | 文档版本落后 0

v1.21.1 (2026-10-13) — IPC 参数回归修复 + 架构重构

修复

  • Tauri v2 命令参数结构不匹配(架构重构引入的回归):Rust 端已将命令参数打包为 Args struct,前端仍以散开传参invoke,导致 missing required key args 静默失败。受影响 3 个命令:rag_search、execute_agent_skill、process_image_cropped
  • asset:// URL 格式不兼容:Tauri v2 的 convertFileSrc 在macOS/Linux 输出 asset://localhost/<path>,与 v1 三/四斜杠格式不同,导致「重新裁切」取不到文件路径。现兼容 5 种前缀并补充 host 段剥离兜底分支
  • 裁剪图片资产重复入库:原按「原图 sha256」查重,但裁剪会生成新内容、原图指纹无意义,导致相同裁剪结果反复入库。现改为按裁剪后内容的 sha256 二次查重,命中即删除临时文件复用既有资产
  • 裁剪失败无用户反馈:错误仅 console.error,现补充 toast.error 提示

优化

  • ServiceCtx 模式重构(service 层 6 处):新增 ServiceCtx<'a> { app, db } 结构体(Clone + Copy),消除每个 service 函数签名中重复的 &AppHandle + &AppDb 前缀
  • Args struct 模式推广(repository 11 处 / commands 3 处 / observability 1 处):将业务参数打包进独立结构体,降低函数签名复杂度
  • clippy 警告清零:26 处 too_many_arguments + 4 处其他警告(explicit_auto_deref / type_complexity / doc_lazy_continuation / useless_format)全部修复,cargo clippy -D warnings 输出 0 warnings / 0 errors
  • Commands Args struct 补全 #[serde(rename_all = "camelCase")]:避免 Tauri IPC 反序列化时 camelCase 字段无法映射到 snake_case 造成运行时静默失败
  • 落地页对比卡片金色渐变视觉样式调整

验证

pnpm check 231/231 通过 | cargo check 通过 | cargo clippy 零警告 | Rust 263/263 | 前端 126/126

v1.20.0 (2026-10-05) — 数学公式输入(KaTeX 渲染 + 符号面板)

Agent 引擎重构(2026-10-13)

本轮聚焦 engine.rs 可维护性提升,行为零变化(256 测试全绿),agent 模块 clippy 零警告。

  • SSE 解析模块提取 → 新增 commands/agent/sse_parser.rs(9 个单元测试):
    • PendingToolCall / PendingToolCalls 类型从 engine.rs 迁移
    • next_line(&mut buffer) → Option<String> — 行缓冲拆分
    • parse_sse_data(json_str, round_content, tool_calls, full_response) → LineParse { done, deltas } — 纯函数,无 AppHandle 依赖,返回解析结果让调用方决定如何 emit
    • flush_remaining_line(buffer, round_content, tool_calls, full_response) → (done, deltas) — 流结束残留处理
    • engine.rs 删除 ~120 行内联 SSE 代码,react_loop 主循环改为 next_line + parse_sse_data + emit_event("chunk", …) 的清晰流水线
  • ReactCtx 收拢 react_loop 参数:新增 engine::ReactCtx { url, api_key, model, temperature, max_tokens, request_id, cancel_token, budget, skill },把 9 个标量参数收拢进结构体。react_loop 签名从 15 参数 → 7 参数(消除 #[allow(clippy::too_many_arguments)] suppressions 中的 3 个)。pipeline.rs 和 run_skill_inner 两个调用点同步改为构造 ReactCtx 传入
  • classify_http_error 提取:从 react_loop 的 map_err 闭包里把 17 行 DNS/连接拒绝/超时/TLS/上游 5xx 模式匹配提取为独立函数 classify_http_error(err_str: &str) → &'static str,主逻辑从 20 行缩到 4 行
  • emit_chunk 合并入 emit_event:原 emit_chunk(app, delta, request_id) 与 emit_event(app, "chunk", delta, request_id) 逻辑完全重复,删除前者;所有事件推送统一走 emit_event(pipeline.rs 也在用它推步骤进度头)
  • 验证:cargo check 零错误、cargo clippy --lib agent 模块零警告、cargo test 256 passed

新增

  • 行内 / 块级数学公式:编辑器集成 @tiptap/extension-mathematics + KaTeX,支持行内公式与独立块级公式;块级公式居中卡片式展示,行内公式随文排布,data-latex 属性持久化,重开章节可无损还原
  • 公式编辑弹窗:工具栏 Sigma 按钮打开居中弹窗(900px 宽),左侧 LaTeX 源码输入 + KaTeX 实时预览(切换行内/块级即时重排),右侧符号面板;⌘+Enter 插入 / 更新,Esc 或点击遮罩关闭;支持双击文档中的公式节点重新打开编辑
  • 分类符号面板:477 个符号 / 11 个分类全部通过 KaTeX strict 校验;采用分类堆叠布局——吸顶分类标题(中文 + 英文)、顶部锚点导航平滑滚动 + 滚动自动高亮当前分类、按 LaTeX 源码长度动态跨列(1/2/3/6 列)避免宽公式挤压;点击符号插入到输入框光标位置
  • 容错与字数统计:非法 LaTeX 以红色源码回显而非崩溃;字数统计排除公式 LaTeX 源码(countWordsFromHtml 移除 [data-type="*-math"] 节点后再取文本)

修复

  • 双击编辑公式更新失效:双击处理器中原先 nodeAt(pos) 未命中时回退到 nodeAt(pos-1),但编辑请求仍写入原始 pos;而 updateInlineMath / updateBlockMath 命令内部同样按 pos 定位并校验节点类型,不匹配时直接 return false,导致修改后点击「更新」静默无效。改为传递真正命中的位置,并为两条查找路径统一补充类型校验,避免误把非公式节点当作公式打开编辑

v1.9.1 (2026-10-04) — Rust 代码质量全面升级

优化

  • Clippy 警告清零(96 → 18):全量运行 cargo clippy --fix 自动修复 + 手动修复,消除 redundant_closure(27)、useless_vec(10)、needless_borrow(5)、let_unit_value(5)、needless_question_mark(3)、type_complexity(2)、ptr_arg、explicit_counter_loop、doc_lazy_continuation、doc_nested_refdefs 等类别;剩余 18 个均为 repo 层 insert 函数的 too_many_arguments(参数直接映射表列,属设计需要)
  • 编译警告清零(5 → 0):5 个 dead_code 函数(run_versioned_migrations、emit_system、trim、pending_audit_count、pending)标注 #[allow(dead_code)](预留框架 / 测试专用),生产构建零警告
  • 类型可读性:新增 TaskCounts(任务统计五元组)与 ChapterBackupRow(备份导出 14 元组)类型别名,消除 type_complexity 警告
  • 代码格式:全量 cargo fmt 格式化,确保风格一致
  • 小修:tts.rs &PathBuf → &Path;import_txt_service.rs 手动计数器循环改用 enumerate();schema.rs / error.rs / uow.rs / task_service.rs 文档注释格式

验证

  • cargo build:通过,0 warnings
  • cargo test:175 passed, 0 failed
  • cargo clippy:18 warnings(仅 too_many_arguments)
  • cargo fmt --check:通过

v1.9.0 (2026-10-04) — 应用内更新与回收站逻辑修复

修复

  • 卷软删后恢复章节丢失归属:volume_repo::soft_delete 原本在软删卷时执行 UPDATE chapters SET volume_id=NULL,但 restore_volume 只清除 deleted_at 不重新关联章节,导致恢复卷后原下属章节全部散落到根目录且不可逆。由于 hard_delete_volume 已在删除前显式调用 chapter_repo::clear_volume_id 解绑(避免 ON DELETE SET NULL 触发 FTS 分词异常),软删时解绑是多余的——移除后章节与卷的归属关系在软删/恢复周期内完整保留
  • 应用内更新失效:主窗口未授予 updater:default capability,plugin-updater 的 check() 被 Tauri 权限层拒绝,「立即更新(应用内静默下载安装)」路径从未真正可用——一直静默降级到 GitHub API 兜底 + 跳转浏览器下载。新增 capabilities/updater.json(仅主窗口,最小权限);经负向验证确认 Tauri 会拒绝非法权限名,机制真实生效
  • 版本号漂移:README.md 头部「当前版本」与亮点块停留在 1.8.0、docs/Home.md 停留在 1.7.0、宣传页 Hero 徽章与页脚停留在 1.8.0——bump 脚本只覆盖了 10 个版本引用点中的 5 个,且无任何一致性校验。已全部对齐并补机制(见下)

新增

  • 启动静默更新检查:主窗口启动 4s 后非阻塞检查更新,命中后书库页页脚显示「新版本 vX.Y.Z」徽标(点击直达设置页),不打断写作
  • 「跳过此版本」:可忽略当前发现的版本,后续静默检查不再打扰;出现更新的版本时自动重新提示,用户手动检查则忽略跳过记录
  • 下载进度与安装反馈:应用内更新的下载进度条(0-100%),安装完成后提示「重启应用以完成更新」
  • src/lib/version.ts(semver 比较 / 跳过版本持久化)、src/lib/updateApi.ts(GitHub 兜底通道)、src/stores/updateAtoms.ts、src/hooks/useUpdateCheck.ts(检查状态机,设置页与启动检查共用)
  • scripts/refresh-doc-versions.mjs:文档「适用版本 / 最后核对」批量刷新(默认预览,--write 落盘;仅刷新日期,--version 才改基线版本)

优化

  • VersionSection.tsx 重构为薄展示层,更新链路与状态机收敛到 useUpdateCheck,消除组件内联的逻辑与重复的 GitHub 检查实现
  • check.mjs 新增两组防漂移断言:版本号一致性(以 package.json 为唯一真源,逐一比对 9 个引用点)与窗口能力覆盖(updater 权限存在且仅限主窗口、sub-windows 覆盖 debug/diary-book)——检查项 205 → 220
  • release.yml:新增「tag 与 tauri.conf.json 版本一致性」校验;更新包签名生成失败改为 fail-fast(此前仅告警并继续,会产出验签失败的 latest.json 导致全量客户端自动更新失效)
  • 测试:新增 src/test/version.test.ts(14 项:三段位比较、v 前缀、预发布后缀、0.0.0 占位、跳过版本语义、持久化),前端测试 23 → 37

v1.8.1 (2026-09-29) — 任务卡数据一致性修复与 Agent IPC 收口

修复

  • 周报统计恒为 0:project_weekly_stats 原按 'completed' 短名匹配日志 action,与写入的 task.created / task.completed 全名不匹配;且逐周用本地日期文本 COUNT BETWEEN 与 UTC 的 created_at 跨时钟域比较,UTC+8 用户周归属错位。改为单条区间查询 + Rust 侧按「本地周一」分桶(list_weekly_actions_since / bucket_by_local_week / local_midnight_utc),2N 次串行查询降为 1 次,并补 2 项时区换算单测
  • 回收站硬删无守卫:hard_delete 未校验记录是否已软删,存在绕过回收站直接抹除有效数据的风险;已加 deleted_at 守卫(仅对已软删记录生效),任务 / 项目两侧均补齐
  • 删除路径非事务化:任务 / 项目硬删与关联数据(附件、子任务、活动日志)清理分散在多次独立写入,中途失败会留下半删状态;改为单事务内完成
  • 活动日志孤儿残留:task_activity_logs 表无外键,硬删与回收站过期清理后日志仍滞留(周报 / 时间线脏数据)。activity_log_repo 新增 delete_by_task / delete_by_project / delete_logs_of_deleted_tasks / delete_logs_of_deleted_projects / delete_logs_of_expired_* / delete_orphan_logs,由 service 显式调用清理
  • 回收站预览可编辑:TaskModal 新增 readOnly 模式(回收站预览已删任务)——编辑控件禁用 + patch 兜底拒绝,此前会对已软删任务发起必然失败的更新请求
  • 监听器竞态:TaskCardsWindow 的 tasks-nav 事件 listen 未 resolve 即卸载时 unlisten 仍为 undefined,造成监听器泄漏;加 disposed 标记,resolve 后立即自行注销
  • 过期快照误报:命令面板跳转后 await 之间复用旧 store 引用,缓存未命中时误报「任务已不存在」;改为 getState() 重取最新快照
  • 刷新广播与加载态:taskCardsStore.refreshAll 成功路径补 notifyChanged()(修复首页角标不更新),失败路径补 set({ loaded: true }) + toast(修复视图永久卡在加载态)

优化

  • Agent IPC 收编:新增 agentApi(executeSkill / cancelSkill / listMemories / updateMemory / deleteMemory / clearMemories)与契约类型,Agent 6 个命令此前绕过 tauri-bridge 直接 invoke,违反「唯一 IPC 入口」约定;useAgent / AgentMemoryPanel / useAiChat 共 7 处调用迁移收编,agent/types.ts 改为 re-export 消除双份契约漂移(bridge API 对象 18 → 19)
  • 共享工具收敛:新增 lib/taskCardsFilters.ts(PRIORITY_RANK / NO_DUE_SENTINEL / matchDue / 日期工具)与 lib/taskCardsHierarchy.ts(collectParentRows),消除任务卡各视图重复的筛选与父任务树计算逻辑;TaskModal 「已保存 ✓」定时器改为 ref 管理并在卸载时清理
  • 测试:新增 src/test/taskCardsHierarchy.test.ts(层次构建 62 项断言)
  • 仓库卫生:移除误入库的 vite.config.js / vite.config.d.ts(tsc 编译产物)并加入 .gitignore;宣传页与文档版本号同步 v1.8.0

v1.8.0 (2026-09-24) — 工程质量强化:DB 版本化、测试体系与 Agent 记忆修复

修复

  • Agent 记忆检索静默失效:get_memories 将 limit 数字直接拼接在 LIMIT ? 占位符后(形成 ?10/?50 编号占位符),触发 InvalidParameterCount;调用方 unwrap_or_default 吞掉错误使记忆检索长期返回空——Agent 记忆注入实际从未生效。已改为统一编号占位符 + limit 参数绑定,并以单测锁定回归(memory.rs)

工程

  • DB 结构版本化:引入 PRAGMA user_version(SCHEMA_VERSION=1)——启动读取版本、高于支持版本拒绝启动(E_DB_VERSION 防降级误写)、幂等 DDL 对齐后写回版本号;预留 run_versioned_migrations 分发框架(db/mod.rs,+3 测试)
  • backup.rs 拆分:2911 行单文件拆为 commands/io/backup/ 目录 7 文件(types / export / import / import_log / reconcile / rollback / mod),28 项 io 测试原样保留、零警告
  • 子窗口权限修复:新增 capabilities/sub-windows.json,补齐 debug / diary-book 窗口最小权限——修复调试控制台 listen('debug-log') 被 core:event 默认拒绝导致事件流静默失效的问题
  • AI SSE 解析去重:提取纯函数 parse_sse_frame(content / reasoning / usage 三要素提取),主循环与 flush_sse_buffer 两处重复解析逻辑收敛为一处
  • 测试体系建立:Rust 测试 32 → 80 项(db 版本化 +3、Agent 全链路 +25、task_service 纯函数与防环校验 +13、ai/chat SSE 解析与重试判定 +7);前端引入 Vitest + jsdom + Testing Library(pnpm test,首批 19 项覆盖 tauri-bridge 契约 / preferencesStore / uiAtoms)

v1.7.0 (2026-09-05) — 数据备份与导入导出 v2

新增

  • 导入预览对话框:导入 .tw 备份前先经只读预检(inspect_backup:文件 → 解密 → 结构/引用 → 内容指纹 → 幂等 → 对账),弹窗展示文件概况 / 幂等提示(「此前已导入过」)/ 校验问题阻断 / 逐表对账清单(一致 / 缺失 / 备份更新 / 目标更新)/ 导入策略单选(智能合并 · 仅补齐缺失 · 覆盖式导入),确认后才执行(ImportPreviewDialog.tsx)
  • v2 备份载荷:导出写入 schemaVersion / appVersion / payloadHash(database 规范化 JSON 的 SHA-256,排除导出时刻等易变字段);导入侧校验指纹与声明一致,篡改文件拒绝导入(零写入);import_log 表记录已导入文件的指纹 / 类型 / 大小(滚动保留最近 20 条)
  • 幂等与去重:同一备份重复导入自动提示「曾于 xx 导入」并对账全 matched;TXT 导入按「书名 + 正文指纹」去重——全文一致跳过、同名不同文自动追加「(导入 N)」,返回值区分 chaptersCreated / chaptersSkipped / chaptersRenamed
  • TXT 导入增强:行级章节识别(第X章 / Chapter / 序章楔子尾声后记番外 +「后续非空行」防正文误判),开篇引言保留为独立「前言」章,空行折叠;≤ 20 MB / ≤ 2,000 章,超限报 E_TXT_TOO_LARGE;分章 + 字数统计单事务原子提交
  • 导出增强:TXT / MD / HTML 导出支持卷结构(==== 卷名 ==== / # 卷名 / <h3>);导出进度事件(export-progress)+ cancel_book_export 取消命令(取消不留半成品);备份与格式导出均改「临时文件 + rename」原子写出;序列化后 > 200 MB 拒绝(E_BACKUP_TOO_LARGE)
  • 导入导出安全收口:导入 / 导出 / 回滚命令级互斥(E_IO_BUSY 防双窗口并发);备份文件主版本高于当前支持(v3+)报 E_BACKUP_VERSION;删除回退点、内容指纹校验等既有检查保留
  • 统一错误码与前端提示:后端全部命令错误序列化为 { code, message }(消息内 E_ 前缀优先提取、无前缀按变体归默认码),io 目录 40+ 内部错误补全 E_BACKUP_* / E_TXT_* / E_EXPORT_* 前缀分类;前端新增统一错误解析层(parseError / errText / adviceFor / showError,兼容对象 / 字符串 / Error 三种形态),导入导出及其余 18 处 alert 收敛为 toast,按 code 追加建议动作(如 E_BACKUP_VERSION 附「前往更新」按钮跳 GitHub Releases)

工程

  • Rust:backup.rs 重写校验/对账/指纹链路(新增 import_log 建表、reconcile_*、record/lookup_import_log、database_canonical_hash);import_txt.rs 重写分章 / 去重 / 事务(Spec §6);export.rs 卷结构 + 进度 + 取消;chapter_repo::list_export_with_volume;commands/io/mod.rs 命令级互斥
  • 前端:新增 ImportPreviewDialog.tsx;LibraryPage.tsx 导入流程改「选文件 → inspect 预览 → 按策略导入」;tauri-bridge.ts 扩展 inspectBackup 报告(payloadHash / duplicateOf / reconcile)、importTxt 去重计数、ExportProgress 与 cancelBookExport
  • 测试:cargo test commands::io 28 项全绿(备份指纹 / 幂等 / 对账 / TXT 分章去重 / 导出卷结构 / 版本守卫 / 互斥);计划与规范文档同步(docs/development/import-export-plan.md A–F 各 Phase 落地说明)

v1.6.0 (2026-09-05)

新增

  • 写作统计面板:状态栏新增今日写作进度条与连续写作天数徽标,写作统计弹窗展示近 30 日写作量曲线(按日净增字数统计:Rust writing_stats 表 + get_writing_stats 命令 + 前端 WritingStatsPanel)
  • AI 对话导出:AI 侧边栏新增「导出对话」菜单,支持导出为 Markdown / JSON(lib/conversationExport.ts,复用 tauri-bridge 导出能力)
  • 大纲树状态对账:恢复 / 清空回收站等操作后自动全量刷新,消除大纲与书库数据的漂移(refreshTree 对账)

修复

  • 写操作全量事务化,杜绝部分写入导致的脏数据(合并入库 / 备份 / 导入 / 回收站等)
  • Agent 任务取消升级为即时中断:取消后立即停止执行并回收子进程资源,而非等待下一次检查点
  • check.mjs 状态管理断言对齐 Phase 3 领域 store 架构(*Slice.ts → *Store.ts),200 项检查全绿

优化

  • 状态管理重构:单一 appStore + slice 拆分为独立领域 store(booksStore / aiStore / preferencesStore,见 appStore.ts 出口),组件按需订阅互不干扰
  • AI 面板逻辑拆分:useAiChat 拆分出 useAgentChatStream(流式事件监听)/ useAiChatMessages / useConversationSummarizer;大纲面板拖拽与对话框逻辑抽取为 useOutlineDnd / useOutlineDialogs(OutlinePanel 944 → 674 行)
  • 快捷键系统:新增 useShortcut hook 统一管理快捷键监听与清理
  • AI 会话离线草稿保护:800ms 防抖持久化 + 窗口卸载 flush,杜绝打字内容丢失
  • sqlite-vec KNN 语义检索取代全量内存余弦相似度,记忆库检索性能与并发稳定提升
  • 动态 SQL 收敛:DynamicUpdate 构建器统一 book / world_card 更新语句;SEARCH_DEFAULT_LIMIT 常量统一;world_card FTS5 无命中自动降级 LIKE 模糊搜索
  • 组件 memo 化减少不必要重渲染;aiStore 流式更新节流

工程

  • Rust:新增 commands/writing_stats.rs、repository/writing_stats_repo.rs、service/writing_stats_service.rs;AI 对话持久化改用 SQLite 防抖存储;Activity / Agent 取消链路重构为即时中断模型
  • 前端:src/stores/*Store.ts 领域化拆分、src/components/ai/hooks/* 与 src/components/outline/hooks/* 抽取、src/hooks/useShortcut.ts、src/lib/conversationExport.ts
  • 构建:bundle targets 增补 deb / appimage;check-npm-versions 锁版本解析修复;Cargo.lock 新增 sqlite-vec 依赖

v1.5.0 (2026-09-03)

新增

  • 任务卡 · 项目管理模块:书库首页右上角新增「任务卡」入口(home-header 插件扩展点,图标高亮 + 今日应办数角标),点击开/关 TasksWindow 独立窗口;支持从全局命令面板(Ctrl/⌘+Shift+P)打开窗口 / 直达今日 / 直达全部任务
    • 项目(Project):以项目为单位管理任务,可设名称 / emoji 图标 / 颜色 / 描述 / 计划起止日期,支持置顶、完成、归档、软删除(回收站);项目卡片实时统计(总数 / 待办 / 进行中 / 已完成 / 逾期)
    • 项目详情看板/列表双视图:三列(待办 / 进行中 / 完成)+ 跨列拖拽改状态(@dnd-kit)、同列手动排序;列表视图聚焦批量勾选;关键词 / 优先级 / 标签 / 截止(今天·本周·已逾期)筛选;逾期任务红色角标强调
    • 任务(Task):标题 + 富文本描述(HTML)、优先级、计划开始 / 截止时间、计划今日、标签多选、子任务清单(勾选联动进度)、附件(本地文件,可打开)、个人备注(纯文本 / 富文本)、重复规则(每天 / 每周指定日 / 每月 / 每 N 间隔 + 结束日期,P2)、任务级提醒(截止前一天 / 当天 / 逾期 / 自定义时间)、完成总结(TipTap 富文本,可跳过,重新打开保留)
    • 今日视图:按「逾期(红)/ 进行中 / 今日截止 / 计划今日 / 今日已完成(折叠)」分区,顶部今日完成率进度条 + 快速添加;卡片可「顺延到明天」(保留原时刻);「计划今日」跨自然日自动滚动清理(task_roll_planned_today)
    • 全部任务视图:全局搜索(标题 / 备注 / 描述 / 标签 / 项目名命中高亮)+ 状态 / 标签 / 优先级 / 截止范围筛选 + 多策略排序
    • 标签管理:新增 / 改名 / 换色 / 启停 / 删除(解除关联);任务可多标签
    • 任务模板:预设标题 / 描述 / 优先级 / 备注 / 标签 / 子任务清单 / 截止日偏移,一键套用建任务(P2)
    • 操作日志与周报:任务 / 项目操作(创建 / 完成 / 重新打开 / 更新 / 删除 / 恢复 / 子任务 / 附件等)写入 task_activity_logs,任务详情内时间线展示(P2);项目周报基于日志生成近 8 周「新增 / 完成」双柱图与动态
    • 提醒中心:系统通知(tauri-plugin-notification)+ 窗口内铃铛中心(未读角标、可直达任务);提醒偏好可配截止前一天 / 当天 / 逾期每日 09:00 与每日待办提醒
    • 日程迁移:任务卡窗口「设置 → 日程迁移」把旧「个人日程」(schedules 表)一键迁移为项目「日程迁移」下的任务(幂等,migrate_schedules 命令)
  • 「看日记」独立窗口化:由书库首页内的书页弹窗升级为 DiaryBookPage 独立窗口(diary-book),按月分章、左右对页翻书、顶栏年月直达,与主窗口并行使用不被遮挡
  • 第二个内置插件:plugins/bootstrap.ts 新增注册「任务卡」插件(plugins/taskCards/),与「英语字典」并列,插件系统落地两个 home-header 入口

优化

  • 日记面板数据源切换:首页右侧由「日记 + 个人日程」改为「日记 + 当日任务」,日历状态点与当日任务列表改为任务卡数据驱动(逾期红 / 今日绿 / 未来蓝 / 已完成灰),跨窗口数据变更经 tasks-data-updated 事件实时同步
  • ScheduleManager 退役:旧「个人日程」UI(添加 / 勾选 / 双击编辑)移除,由任务卡的「当日任务」区替代(轻量勾选完成 + 跳转任务卡窗口做完整操作)

工程

  • Rust:新增 commands/{project,task,tag,task_meta,subtask,attachment,activity,template,reminder,migrate}.rs 10 个命令文件共 55 条命令,repository/ 与 service/ 对应新增 8 / 11 个文件(含 reminder_service.rs 到期扫描与 project_stats_service.rs 周报统计);window/manager.rs 新增任务卡窗口(open/close/is)与看日记窗口(open/close)5 条命令
  • IPC:总命令数 109 → 169;tauri-bridge 新增 taskCardApi(共 17 个 API 对象)
  • 数据表:新增 projects、tasks、tags、task_tags、task_meta、task_subtasks、attachments、task_activity_logs、task_templates、project_milestones 10 张表(schedules 表保留用于历史数据迁移)
  • 前端:新增 stores/taskCardsStore.ts(Zustand,窗口内使用 + 变更广播)、lib/taskCardsTime.ts / taskCardsMeta.ts / recurrence.ts / subtaskGuard.ts 工具、components/taskCards/ 19 个组件文件、components/diary/DayTasksPanel.tsx;windowDetection.ts 新增 taskswin / diarybookwin 路由

v1.4.0 (2026-09-03)

新增

  • 英语字典·生词本模块:书库首页右上角新增「英语字典」入口(玫红主题,基于首页头部插件扩展点 HomeHeaderPlugins);VocabularyWindow 独立悬浮窗口内置「生词本 / 复习 / 统计」页签,支持添加生词(在线释义查询)、单词详情(音标/例句/读音)、间隔重复式分组复习与掌握度统计;后端新增 vocab.rs、vocab_dict.rs 命令与 vocab_repo.rs / vocab_service.rs(词库、生词簿 CRUD、复习计划与统计聚合)
  • TTS 朗读:新增 tts-player.ts(Web Speech 封装)与后端 tts.rs 命令,生词与复习场景一键朗读,语速/语音可配置(ttsConfig store 持久化)
  • 首页插件宿主:新增 PluginHost 与 plugins/bootstrap.ts 插件注册引导(含 vite 配置扩展、插件类型声明),首个内置插件为英语字典,独立窗口状态经 Jotai 跨窗口同步

优化

  • 「看日记」留白页改版:月份开篇/收尾的空白对开页改为素雅「纸张扉页」——纸张质感明暗渐变、内框细线、圆环羽毛笔装饰,居中显示中文年月大字;左侧空白页语「新 的 一 月」、右侧「本 月 终 章」
  • 顶栏按钮提示清理:移除「AI 工具箱」(书库首页)与「AI 助手」(编辑器顶栏)按钮右上角的呼吸小圆点,GradientButton 新增 showDot 开关按需控制

工程

  • Rust:新增 commands/tts.rs、commands/vocab.rs、commands/vocab_dict.rs 与 repository/vocab_repo.rs、service/vocab_service.rs,models/mod.rs 与 db/mod.rs 注册生词相关数据表,window/manager.rs / lib.rs / commands/mod.rs 完成窗口与命令接线
  • IPC:tauri-bridge 新增 vocabApi / ttsApi 等桥接;前端新增 vocabStore / ttsConfig store、components/vocabulary/ 组件目录与生词数据工具

v1.3.0 (2026-09-02)

新增

  • 日记与个人日程模块:书库首页右侧新增「日记」面板 —— 按月日历 + 当日日记卡片 + 当日个人日程联动;日历上日期上方圆点标示已写日记、下方圆点按颜色区分日程状态(逾期红 / 今天绿 / 未来蓝 / 已完成灰);新增 DiaryDialog(TipTap 富文本:标题、颜色、表格、图片、代码块、任务清单,实时字数 + 高频关键字自动提取)、ScheduleManager(添加 / 勾选完成 / 双击编辑 / 删除 / 完成进度)
  • 日记自动保存:300ms 防抖落盘,Esc / Ctrl+S 立即保存,关闭前兜底落盘;内容清空自动删除该日记录,删除需二次确认(误触自动复原)
  • 「看日记」书页式浏览:右上角入口由「今日日记」改为「看日记」(铅笔图标保留写今日快捷);DiaryBookDialog 书页式弹窗一次展开左右两页(左旧右新),只有写过日记的日子占页、自动跳过无日记日期,打开即定位最近日记,支持左右箭头与 ← → 方向键整组翻页,仅展示只读;跨月浏览基于新增 list_all_diaries 命令 + 相邻页预取

工程

  • 数据表:新增 diaries(每天至多一篇,diary_date 唯一)、schedules(某天多条)
  • IPC:新增 commands/diary.rs(5 个)与 commands/schedule.rs(4 个)共 9 条命令,总命令数 81 → 90;前端新增 diaryApi / scheduleApi 桥接模块(tauri-bridge 共 13 个 API 对象)

v1.2.0 (2026-09-02)

优化

  • Agent 引擎全面迁移为 Rust 原生实现:移除 Python FastAPI 子进程服务(agent/ 服务端 24 个文件)与 Rust HTTP Bridge(tiny_http,端口 9876/9877 双进程架构),新增 engine.rs(SSE 流式 ReAct 工具循环 + 任务取消)、prompts.rs(4 大技能 Prompt 内置 Rust)、tools.rs(6 个数据库工具);应用启动不再依赖外部 Python 环境,免除 uvicorn/解释器自检与端口看门狗
  • 记忆库并入主数据库:新增 memories 表(支持书级/技能级记忆的增删改查、关键词提取、语义召回),旧 agent_memory.db 存量记忆在应用启动时自动幂等迁移至 time_write.db
  • 前端 Agent 交互精简:移除 AgentPanel 启停面板与 EmbeddingStatus 索引状态组件,Agent 恒为就绪(无外部进程启停按钮),设置页 RAG 配置/系统检查同步为内置引擎检测
  • 工程与文档同步:删除 setup-agent / check-python-versions 等 Python 运维脚本与 pyrightconfig.json,check.mjs 新增 Rust Agent 模块检查与 Python 迁移防回归断言及 --fast 模式;docs / release.yml / README 全量更新为 Rust 原生架构说明

v1.1.0 (2026-09-02)

优化

  • Agent Python 后端类型标注全面强化:新增 pyrightconfig.json strict 检查配置(venv 指向 agent/.venv),.vscode/settings.json 解释器由 conda 切换为项目 venv
  • API 与生命周期现代化:main.py 由废弃的 on_event(shutdown) 重构为 FastAPI lifespan 上下文管理器;server/routes.py 请求/响应模型补全泛型标注,嵌套路由函数加 pyright ignore 说明
  • 类型安全修复:tracer.py 修复 @trace 无括号用法与 functools.wraps 绑定,async 包装 cast 收窄为 Callable 契约;memory/store.py 提取 _row_to_memory 收窄 sqlite3.Row 索引类型并补 ClassVar/lastrowid 空值防护;summarizer.py 改用 isinstance 收窄类型判断
  • LangChain 新 API 迁移:skills/engine.py 的 create_react_agent 切换为 langchain create_agent 新 API,当前时间改为 timezone 感知;tools/db_tools.py 用 pydantic v2 model_validate 替换解包构造
  • 导出规范化:agent/__init__.py 及各子包新增 __all__ 与模块 docstring,统一包级导出

v1.0.2 (2026-09-01)

修复

  • 修复编辑器销毁后应用崩溃:TipTap destroy() 将 commandManager 置为 null,StrictMode 下残留实例调用 can() 抛异常;新增 src/lib/editor-guard.ts(isEditorUsable)统一校验,EditorToolbar / RichTextEditor / TablePopover / MessageBubble 全部调用点改为安全引用,图片插入/裁剪等异步回调在 await 后重新校验编辑器可用性

优化

  • clean 脚本新增清理 Python 缓存(__pycache__ / .pyc / .mypy_cache),Cargo.lock 版本同步至 1.0.2

v1.0.1 (2026-09-01)

新增

  • 表格合并/拆分单元格:新增 table-utils.ts(canMergeCells / hasSplittableCell 检测)与 TablePopover 合并/拆分操作区,按选区可用性自动禁用按钮
  • 标题按钮合并为下拉菜单:新增 HeadingSelect 组件,一级~四级标题统一为下拉选择,菜单项以字号体现层级,Portal 渲染避免被裁剪

修复

  • 修复窗口缩窄时头部布局变形:顶栏设置最小宽度 min-w-240,各按钮与文字 shrink-0,窗口最小宽度 800 → 960
  • 修复表格列宽调整把手不可用:th/td 增加 position: relative,修复 column-resize-handle 定位错乱,优化拖拽反馈
  • 修复工具栏弹窗与提示被 overflow 容器裁剪遮挡:新增 useAnchorPosition 锚点定位 hook,Tooltip / 表格 / 颜色 / 代码语言弹窗统一 Portal 化

优化

  • 首页移除列表视图,仅保留网格模式(LibraryPage / BookCard 删除 viewMode 分支)
  • 适配 Tailwind CSS v4 类名规范:bg-gradient-to-* → bg-linear-to-*、flex-shrink-0 → shrink-0、z-[60] → z-60,base.css 增加 @reference 声明
  • 删除 tmp/ 历史架构草案文档(RTK/MVVM 旧设想已被 docs/ 权威文档取代)
  • 宣传页同步 v1.0.0 并新增 Agent 智能体展示

v1.0.0 (2026-08-31)

里程碑版本:引入 Python Agent 自动化写作子系统,架构升级为三进程模型;同步完成首轮安全加固(关闭 5 项 P0/P1 安全问题,详见 优化报告 问题 7-11)。

新增 — Python Agent 子系统

  • Python Agent 服务:FastAPI + LangGraph ReAct,端口 9877,由 Rust python/manager.rs 全生命周期管理
  • 4 大写作技能(Skill):写作辅助 writing / 内容分析 analysis / 研究辅助 research / 润色优化 polish
  • 6 个数据库工具链:read_chapter、read_chapter_summary、read_chapter_chunk、list_book_chapters、search_world_cards、get_book_context
  • Rust 数据桥接(Bridge):python/bridge.rs 启动 tiny_http 服务(端口 9876),Agent 反向回调读取 SQLite,确保写操作唯一入口仍在 Rust
  • Agent 记忆体系统:三层记忆(偏好 preference / 决策 decision / 经验 lesson),SQLite 持久化(data/agent_memory.db),关键词匹配 + 类型加权 + 时间衰减检索,Token 预算 600
  • 双模型路由:本地 Ollama(qwen2.5:7b,处理润色)+ 云端 DeepSeek(处理写作/分析/研究),按任务复杂度自动分配
  • 对话历史压缩:超过 6 轮自动触发本地模型压缩,保留最近 4 轮完整对话
  • 前端 Agent 面板:components/agent/(AgentPanel / AgentMessageBubble / AgentMemoryPanel / useAgent),Skill 选择器 + 流式输出 + 记忆管理
  • Agent IPC 命令 9 个:get_agent_status、start_agent、stop_agent、execute_agent_skill、cancel_agent_skill、list_agent_memories、update_agent_memory、delete_agent_memory、clear_agent_memories

新增 — 基础设施

  • commands/system_check.rs + system_check 命令:运行环境自检
  • src-tauri/src/logging.rs:独立日志模块
  • service/(6 个业务服务)与 repository/(6 个数据仓库)严格分层,事务边界与 SQL 审计日志 emit_sql_log
  • FTS5 虚拟表 world_cards_fts,INSERT/UPDATE/DELETE 三触发器自动同步
  • AppError 统一错误枚举(10 种变体),实现 Serialize 可直接作为 Tauri 命令 Err 返回

优化

  • commands/ai.rs 拆分为 ai/{chat,embedding,summarize,test}.rs 四个子模块
  • commands/io、commands/window、commands/agent 同步子模块化
  • 前端 store 由单一 appStore 重构为 slice 模式:booksSlice / aiSlice / preferencesSlice / pluginStore

安全

  • Updater 签名:生成 minisign 签名密钥对,tauri.conf.json 配置真实 pubkey(私钥 ~/.tauri/timewrite.key;发布 CI 需配置 TAURI_PRIVATE_KEY / TAURI_PRIVATE_KEY_PASSWORD 两个 Secret)
  • CSP 收紧:img-src 移除 https: 通配;connect-src 按实际需要仅放行 https://api.github.com;新增 base-uri 'self' / form-action 'self' / frame-ancestors 'self'
  • fs 权限作用域:capabilities/default.json 的 12 项 fs 权限限定 $APPDATA/**、$RESOURCE/**;assetProtocol.scope 同步收窄;移除前端未使用的过宽 http:allow-fetch(https://**)
  • withGlobalTauri 设为 false(前端零使用 window.__TAURI__)
  • 备份加密密钥去硬编码:环境变量 TIMEWRITE_BACKUP_KEY 优先(SHA-256 派生),否则使用 <app_data_dir>/backup.key 随机密钥(Unix 权限 0600)

已知问题(延续)

  • Bridge Server(9876)无鉴权(问题 27)
  • /skills/cancel 为占位实现,无法真正中断任务(问题 28)

已修复的已知问题

以下问题已在本版本安全加固中修复。

  • updater pubkey 占位符 → 已配置真实签名公钥,更新签名校验启用
  • withGlobalTauri: true → 已设为 false
  • 加密备份硬编码密钥 → 已替换为 TIMEWRITE_BACKUP_KEY / backup.key 动态密钥

v0.9.4 (2026-06-11)

新增

  • 新增 ImageCropperDialog 图片裁剪对话框,支持拖拽选区精确裁剪并替换编辑器图片
  • 新增 ImageViewerDialog 图片查看器对话框,支持放大/缩小/拖拽查看高清原图
  • 新增 image-utils.ts 图片处理工具模块,封装裁剪、压缩与 Base64 编码能力
  • 后端新增 process_image_cropped 命令,支持前端传入裁剪参数直接处理图片
  • 后端新增 set_book_cover_data 命令,支持前端直传 Base64 data URL 作为封面,略过后端重复解码

优化

  • 后端 process_image 重构,拆分为 validate_source + encode_image 独立函数,新增 crop_and_encode 裁剪编码函数
  • EditorToolbar 新增图片查看和裁剪快捷按钮入口
  • ImageResizeNodeView 图片节点增强交互体验
  • BookCard/CoverPicker/EditBookDialog/NewBookDialog 全面适配封面直传功能
  • tauri-bridge.ts 新增 setBookCoverData 和 processImageCropped API 函数

v0.9.3 (2026-06-11)

优化

  • 统一使用 TooltipWrap 组件替代原生 title 属性,提升提示交互一致性和可定制性
  • LibraryPage 新增 AI 工具箱快捷入口,方便快速访问 AI 辅助写作功能

v0.9.2 (2026-06-11)

修复

  • StatusBar 全书字数改用 Zustand book store 作为主数据源,确保删除/恢复章节时立即更新,Jotai atom 作为打字实时估算回退

v0.9.1 (2026-06-11)

优化

  • 大纲面板(OutlinePanel)模块化拆分:抽取 DraggableChapter/DraggableVolume/OutlineDialogs/OutlineDragDrop/OutlineRecycleBin 子组件及 types/utils 工具模块
  • 后端 delete_chapter/hard_delete_chapter 增强返回全书字数,RestoreChapterResult 增加 bookWordCount 字段
  • 数据库连接健壮性增强:每个连接启用 PRAGMA foreign_keys=ON 和 journal_mode=WAL
  • 章节删除/恢复 API 前端适配(tauri-bridge 返回类型更新,BookCard/TrashModal 适配)
  • 新增 clean.ts 清理脚本,check.mjs 检测脚本优化

v0.9.0 (2026-06-11)

新增

  • 新增调试面板(DebugPanel)及调试控制台,增强窗口管理命令(debug/dump/validate)

优化

  • 架构重构:引入 Repository/Service 分层,拆分单例模块(ai/io/window 拆为子模块)
  • 移除 TrailingNodeExtension,优化编辑器和大纲/世界观面板

v0.8.3 (2026-06-10)

新增

  • 新增图片处理模块(Rust 侧 process_image 命令),支持格式校验、等比缩放、JPEG 编码和 Base64 输出
  • 新增前端 image-utils.ts,封装编辑器图片(1200px/80%)和封面图片(800px/85%)的压缩处理
  • 编辑器图片和封面图片统一采用 data: URL 内嵌方案,确保导出/导入完全自包含

v0.8.2 (2026-06-10)

优化

  • 封面图片从 Blob URL 切换为 data URL(base64),与编辑器内嵌图片方案保持一致,避免跨平台协议兼容性问题
  • 移除 BookCard 和 TrashModal 中手动释放 Blob URL 的逻辑,简化内存管理

v0.8.1 (2026-06-10)

新增

  • 书籍封面支持移除:set_book_cover 传入空路径时清除封面
  • 回收站支持封面图片预览显示,使用 Blob URL 渲染并自动回收

优化

  • 图片编码方式重构:从逐字符 base64 拼接改为 Blob + FileReader 方案,避免大文件 O(n²) 性能问题
  • CSP 安全策略 img-src 新增 blob: 来源,适应 Blob URL 图片渲染

v0.8.0 (2026-06-10)

新增

  • 数据备份导入导出功能:支持作品数据完整备份与恢复
  • AI侧面板支持点击检测连接状态,提升连接诊断体验
  • 左侧目录/大纲面板支持拖拽调整面板宽度
  • Markdown 转 HTML 工具函数及消息插入编辑器防重复逻辑
  • AI 对话前置校验 + 章节总结缓存 + 世界观面板总结管理
  • AI 对话滑动窗口上下文管理,优化长对话性能
  • 作品大纲与章节大纲功能
  • AI Embedding 截断保护 + 错误提示优化 + 网络重试支持
  • Node.js 版本管理工具,升级核心依赖至最新版本

优化

  • 流式响应增加 RAF 节流,优化自动滚动和组件渲染性能
  • AI面板拖拽重构为比例模式,支持窗口自适应缩放
  • 独立窗口开关状态从 useState 提升为 Jotai 共享原子

v0.7.1 (2026-06-10)

修复

  • SnapshotPanel: 移除未使用变量 currentBookId 和 result,修复 TypeScript 编译错误(TS6133)

v0.7.0 (2026-06-10)

新增

  • 通用 ContextMenu 组件:新增右键菜单系统,支持全局上下文操作
  • AI 请求详情面板:新增 RequestDetailModal 组件,支持查看 AI 请求详情与消息删除
  • AI 工具箱面板:新增 AiToolboxPanel,集成章末总结/续写/扩写等 AI 写作辅助工具
  • 章节摘要头部:新增 ChapterSummaryHeader 组件,展示章节摘要信息
  • AI 对话增强:新增 MessageBubble、useAiChat hook,重构 AiSidePanel 对话流程
  • 回收站管理:新增 TrashModal 组件,支持软删除数据的恢复与永久删除
  • 设置页面全面重构:新增独立配置组件(外观/编辑器/存储/AI/RAG/聊天/工具箱/版本),实现模块化设置管理
  • 版本信息展示:新增 VersionSection,运行时动态展示应用版本与更新信息
  • AI 服务商预设:新增 ChatConfigSection 和 RAGConfigSection,预设常用模型配置

优化

  • 拆分 SettingsPage 为独立配置组件,提取 useResizeHandle 通用 hook
  • 重构快照面板布局与窗口管理,优化编辑器工具栏交互
  • 书籍管理增强:BookCard 右键菜单支持编辑/删除,EditBookDialog 和 NewBookDialog 功能完善
  • AI 后端命令增强:ai.rs 扩展多项 IPC 命令,支持工具箱 API 调用
  • Tauri 窗口管理扩展:window.rs 新增辅助窗口创建与管理能力
  • 状态管理扩展:appStore 新增回收站、AI 配置、章节摘要等状态字段

v0.6.0 (2026-06-09)

新增

  • ErrorBoundary 组件:新增全局错误边界,捕获渲染异常并展示友好提示,提升应用稳定性

优化

  • 升级 Tiptap 编辑器至 v3:RichTextEditor、EditorToolbar 适配新 API,编辑器性能更优
  • 迁移 Tailwind CSS v3 到 v4:移除 tailwind.config.ts,采用 CSS-first 配置,优化构建性能
  • 重构存储层:appStore 状态管理全面重构,优化渲染性能,涉及 App.tsx、EditorPage、LibraryPage、AiSidePanel 等多处适配
  • 核心依赖版本大升级:更新 Rust/Node 依赖至最新版本,移除废弃依赖
  • 样式增强:globals.css 扩展动画与基础样式,提升 UI 细节

v0.5.0 (2026-06-09)

新增

  • 编辑器工具栏大幅增强:新增字体颜色选择、标题层级、列表、代码块、任务列表等格式化按钮
  • TrailingNodeExtension:新增尾部节点扩展,确保编辑器末尾始终可编辑
  • 大纲面板全面重构:支持卷/章节拖拽排序、软删除、插入指示器动画,交互体验大幅提升
  • 编辑位置记忆与恢复:滚动位置和光标位置自动保存,切换章节后恢复上次编辑位置
  • 版本检查工具:新增 Rust 依赖版本检测(check-rust-versions.ts)和项目完整性检测(check-versions.ts)脚本

修复

  • 修复卷/章节排序逻辑在拖拽场景下的边界问题
  • 修复章节移动到不同卷时的状态同步问题

优化

  • 文档全面更新:所有用户指南和架构文档同步至 v0.4.0 代码现状
  • 章节命令模块重构:新增 chapter.rs 独立命令文件,支持章节排序和卷迁移
  • 卷操作支持软删除(deletedAt 字段),保留历史数据可恢复
  • 全局样式增强:新增 pop-in、pulse-indicator 动画,编辑器 UI 细节打磨
  • 编辑器状态管理扩展:saveEditorState 方法支持滚动/光标位置持久化

v0.4.0 (2026-06-08)

新增

  • DeepSeek 对话支持:新增 DeepSeek 服务商选项,支持思考模式(thinking),对话 API Key 按服务商独立管理
  • AI 配置解耦:对话(AiChatConfig)与 RAG/Embedding(RagConfig)配置完全分离,各自独立管理 API Key 和模型
  • 编辑器字体颜色选择:工具栏新增字体颜色按钮,支持预设色板和自定义颜色
  • 作品信息编辑:新增 EditBookDialog 组件,支持编辑书名、封面、简介等作品元信息
  • 产品宣传页:新增 product/ 目录宣传页面,含微信分享合规信息,支持 GitHub Pages 自动部署
  • README 重构为 Wiki 导航,新增赞助与联系方式

修复

  • 修复外观设置持久化缺失:gridSize/editorWidth 分别独立保存,避免覆盖丢失
  • 修复 DeepSeek API 路径拼接:自动补全 /chat/completions 后缀
  • 修复 GitHub Wiki 子目录展平问题,增强部署流程稳健性

优化

  • SettingsPage 重构:新增 RAG 独立配置区,支持连通性测试(test_rag_connection 命令)
  • AI 架构重构:新增 RagConfig/AiChatConfig 分离类型,getChatApiKey/getRagApiKey 工具函数
  • 文档结构重组为 GitHub Wiki,配置 CI 自动部署
  • 添加 GitHub Issue 模板(Bug 报告 & 功能请求)及集成总览文档
  • Vite 构建优化:dependabot 依赖分组,chunk 名称更新(react-markdown/remark-gfm)

v0.3.0 (2026-06-08)

新增

  • 图片插入:通过 Tauri 原生文件对话框选择本地图片直接插入编辑器
  • 图片缩放:新增 ResizableImage 扩展,支持拖拽控制点和工具栏调整图片尺寸
  • 任务列表:新增 TaskList/TaskItem 扩展,支持复选框任务清单
  • 编辑器工具栏增强:新增标题、无序列表、有序列表、任务列表、代码块等格式化按钮

优化

  • 编辑器实例通过 Jotai atom 共享至工具栏,实现跨组件联动
  • 代码块样式重构:自定义字体、圆角、暗色模式适配
  • 新增 MIT License 开源许可证

v0.2.5 (2026-06-08)

优化

  • 优化 macOS 构建签名流程:增加 keychain 签名身份验证步骤

v0.2.4 (2026-06-07)

优化

  • 修复 GitHub Actions 条件引用方式
  • 优化 Apple 代码签名流程
  • 修复 macOS 公证步骤

v0.2.3 (2026-06-07)

优化

  • 精简 AI 服务商为智谱 BigModel + 自定义
  • SSE 流处理代码重构
  • 应用版本号改为运行时动态获取
  • 默认 AI 配置改为智谱 BigModel

v0.2.2 (2026-06-07)

优化

  • 项目全面重命名:MirageInk → TimeWrite(智写时光)
  • 图标资源重新生成

v0.2.1 (2026-06-07)

优化

  • 更新 version-release 技能配置
  • 同步 Cargo.lock 依赖版本号

v0.2.0 (2026-06-07)

新增

  • RAG 语义检索
  • AI 侧边栏重构
  • 网格尺寸设置(small/medium/large)
  • 编辑器宽度设置(mobile/standard/wide)
  • 全局 CSS 样式系统

优化

  • 移除打字机模式
  • 更新依赖至最新版本

v0.1.0 (2026-06-03)

新增

  • 工程骨架搭建:Tauri v2 + React 18 + TypeScript + Vite 8 + TailwindCSS
  • 书库管理:多作品网格/列表视图、虚拟化滚动
  • TipTap 富文本编辑器:完整格式化支持
  • 卷-章节两级目录树
  • SQLite 数据持久化:6 张表、WAL 模式
  • IPC 命令封装:7 个 API 模块
  • 双层状态管理:Zustand + Jotai
  • 双保险自动保存
  • 专注模式
  • 世界观资料库:6 种卡片类型
  • AI 助手:流式对话 + RAG 检索
  • 版本快照
  • 导入导出:TXT/MD/HTML
  • 主题系统:4 套主题
  • 全局字体切换 + 字号自定义
  • 插件系统框架
  • 完整性检测脚本
⚠️ **GitHub.com Fallback** ⚠️