CHANGELOG - WangYajun369/ai-writing-platform GitHub Wiki
-
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 个文档的适用版本基线
-
单词关联网络(
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.ts11 项用例,覆盖图谱构建、截断、孤立节点统计与着色映射
-
启动期偏好被默认值覆盖:
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
-
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
本轮聚焦 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 --libagent 模块零警告、cargo test256 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,导致修改后点击「更新」静默无效。改为传递真正命中的位置,并为两条查找路径统一补充类型校验,避免误把非公式节点当作公式打开编辑
-
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:通过
-
卷软删后恢复章节丢失归属:
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:defaultcapability,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
-
周报统计恒为 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
-
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)
-
导入预览对话框:导入
.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::io28 项全绿(备份指纹 / 幂等 / 对账 / TXT 分章去重 / 导出卷结构 / 版本守卫 / 互斥);计划与规范文档同步(docs/development/import-export-plan.mdA–F 各 Phase 落地说明)
-
写作统计面板:状态栏新增今日写作进度条与连续写作天数徽标,写作统计弹窗展示近 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 行) -
快捷键系统:新增
useShortcuthook 统一管理快捷键监听与清理 - 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 依赖
-
任务卡 · 项目管理模块:书库首页右上角新增「任务卡」入口(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}.rs10 个命令文件共 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_milestones10 张表(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路由
-
英语字典·生词本模块:书库首页右上角新增「英语字典」入口(玫红主题,基于首页头部插件扩展点
HomeHeaderPlugins);VocabularyWindow独立悬浮窗口内置「生词本 / 复习 / 统计」页签,支持添加生词(在线释义查询)、单词详情(音标/例句/读音)、间隔重复式分组复习与掌握度统计;后端新增vocab.rs、vocab_dict.rs命令与vocab_repo.rs/vocab_service.rs(词库、生词簿 CRUD、复习计划与统计聚合) -
TTS 朗读:新增
tts-player.ts(Web Speech 封装)与后端tts.rs命令,生词与复习场景一键朗读,语速/语音可配置(ttsConfigstore 持久化) -
首页插件宿主:新增
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/ttsConfigstore、components/vocabulary/组件目录与生词数据工具
-
日记与个人日程模块:书库首页右侧新增「日记」面板 —— 按月日历 + 当日日记卡片 + 当日个人日程联动;日历上日期上方圆点标示已写日记、下方圆点按颜色区分日程状态(逾期红 / 今天绿 / 未来蓝 / 已完成灰);新增
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 对象)
-
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 原生架构说明
-
Agent Python 后端类型标注全面强化:新增
pyrightconfig.jsonstrict 检查配置(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切换为 langchaincreate_agent新 API,当前时间改为 timezone 感知;tools/db_tools.py用 pydantic v2model_validate替换解包构造 -
导出规范化:
agent/__init__.py及各子包新增__all__与模块 docstring,统一包级导出
- 修复编辑器销毁后应用崩溃: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
-
表格合并/拆分单元格:新增
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 智能体展示
里程碑版本:引入 Python Agent 自动化写作子系统,架构升级为三进程模型;同步完成首轮安全加固(关闭 5 项 P0/P1 安全问题,详见 优化报告 问题 7-11)。
-
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动态密钥
- 新增 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 函数
- 统一使用 TooltipWrap 组件替代原生 title 属性,提升提示交互一致性和可定制性
- LibraryPage 新增 AI 工具箱快捷入口,方便快速访问 AI 辅助写作功能
- StatusBar 全书字数改用 Zustand book store 作为主数据源,确保删除/恢复章节时立即更新,Jotai atom 作为打字实时估算回退
- 大纲面板(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 检测脚本优化
- 新增调试面板(DebugPanel)及调试控制台,增强窗口管理命令(debug/dump/validate)
- 架构重构:引入 Repository/Service 分层,拆分单例模块(ai/io/window 拆为子模块)
- 移除 TrailingNodeExtension,优化编辑器和大纲/世界观面板
- 新增图片处理模块(Rust 侧 process_image 命令),支持格式校验、等比缩放、JPEG 编码和 Base64 输出
- 新增前端 image-utils.ts,封装编辑器图片(1200px/80%)和封面图片(800px/85%)的压缩处理
- 编辑器图片和封面图片统一采用 data: URL 内嵌方案,确保导出/导入完全自包含
- 封面图片从 Blob URL 切换为 data URL(base64),与编辑器内嵌图片方案保持一致,避免跨平台协议兼容性问题
- 移除 BookCard 和 TrashModal 中手动释放 Blob URL 的逻辑,简化内存管理
- 书籍封面支持移除:set_book_cover 传入空路径时清除封面
- 回收站支持封面图片预览显示,使用 Blob URL 渲染并自动回收
- 图片编码方式重构:从逐字符 base64 拼接改为 Blob + FileReader 方案,避免大文件 O(n²) 性能问题
- CSP 安全策略 img-src 新增 blob: 来源,适应 Blob URL 图片渲染
- 数据备份导入导出功能:支持作品数据完整备份与恢复
- AI侧面板支持点击检测连接状态,提升连接诊断体验
- 左侧目录/大纲面板支持拖拽调整面板宽度
- Markdown 转 HTML 工具函数及消息插入编辑器防重复逻辑
- AI 对话前置校验 + 章节总结缓存 + 世界观面板总结管理
- AI 对话滑动窗口上下文管理,优化长对话性能
- 作品大纲与章节大纲功能
- AI Embedding 截断保护 + 错误提示优化 + 网络重试支持
- Node.js 版本管理工具,升级核心依赖至最新版本
- 流式响应增加 RAF 节流,优化自动滚动和组件渲染性能
- AI面板拖拽重构为比例模式,支持窗口自适应缩放
- 独立窗口开关状态从 useState 提升为 Jotai 共享原子
- SnapshotPanel: 移除未使用变量
currentBookId和result,修复 TypeScript 编译错误(TS6133)
- 通用 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 配置、章节摘要等状态字段
- 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 细节
- 编辑器工具栏大幅增强:新增字体颜色选择、标题层级、列表、代码块、任务列表等格式化按钮
- TrailingNodeExtension:新增尾部节点扩展,确保编辑器末尾始终可编辑
- 大纲面板全面重构:支持卷/章节拖拽排序、软删除、插入指示器动画,交互体验大幅提升
- 编辑位置记忆与恢复:滚动位置和光标位置自动保存,切换章节后恢复上次编辑位置
- 版本检查工具:新增 Rust 依赖版本检测(check-rust-versions.ts)和项目完整性检测(check-versions.ts)脚本
- 修复卷/章节排序逻辑在拖拽场景下的边界问题
- 修复章节移动到不同卷时的状态同步问题
- 文档全面更新:所有用户指南和架构文档同步至 v0.4.0 代码现状
- 章节命令模块重构:新增 chapter.rs 独立命令文件,支持章节排序和卷迁移
- 卷操作支持软删除(deletedAt 字段),保留历史数据可恢复
- 全局样式增强:新增 pop-in、pulse-indicator 动画,编辑器 UI 细节打磨
- 编辑器状态管理扩展:saveEditorState 方法支持滚动/光标位置持久化
- 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)
- 图片插入:通过 Tauri 原生文件对话框选择本地图片直接插入编辑器
- 图片缩放:新增 ResizableImage 扩展,支持拖拽控制点和工具栏调整图片尺寸
- 任务列表:新增 TaskList/TaskItem 扩展,支持复选框任务清单
- 编辑器工具栏增强:新增标题、无序列表、有序列表、任务列表、代码块等格式化按钮
- 编辑器实例通过 Jotai atom 共享至工具栏,实现跨组件联动
- 代码块样式重构:自定义字体、圆角、暗色模式适配
- 新增 MIT License 开源许可证
- 优化 macOS 构建签名流程:增加 keychain 签名身份验证步骤
- 修复 GitHub Actions 条件引用方式
- 优化 Apple 代码签名流程
- 修复 macOS 公证步骤
- 精简 AI 服务商为智谱 BigModel + 自定义
- SSE 流处理代码重构
- 应用版本号改为运行时动态获取
- 默认 AI 配置改为智谱 BigModel
- 项目全面重命名:MirageInk → TimeWrite(智写时光)
- 图标资源重新生成
- 更新 version-release 技能配置
- 同步 Cargo.lock 依赖版本号
- RAG 语义检索
- AI 侧边栏重构
- 网格尺寸设置(small/medium/large)
- 编辑器宽度设置(mobile/standard/wide)
- 全局 CSS 样式系统
- 移除打字机模式
- 更新依赖至最新版本
- 工程骨架搭建:Tauri v2 + React 18 + TypeScript + Vite 8 + TailwindCSS
- 书库管理:多作品网格/列表视图、虚拟化滚动
- TipTap 富文本编辑器:完整格式化支持
- 卷-章节两级目录树
- SQLite 数据持久化:6 张表、WAL 模式
- IPC 命令封装:7 个 API 模块
- 双层状态管理:Zustand + Jotai
- 双保险自动保存
- 专注模式
- 世界观资料库:6 种卡片类型
- AI 助手:流式对话 + RAG 检索
- 版本快照
- 导入导出:TXT/MD/HTML
- 主题系统:4 套主题
- 全局字体切换 + 字号自定义
- 插件系统框架
- 完整性检测脚本