YanXiang agent (盐想智能体),一款基于 Vue 3 + Tauri 2 的 Windows 桌面写作工作台。内置 Markdown 文档编辑与渲染、主页仪表盘、自由画布式文本卡片库、AI 对话 / 写作 / 审核 / 精修助手、素材库与故事 / 叙事定制、灵感速记与 Token 账本,以及基于向量检索(RAG)的写作风格洞察联动,帮助你沉淀个人写作习惯并让 AI 精准贴合你的文风。
本项目 AI 写作灵感来源: YOUTUBE 原视频 B站
未选择任何素材跟定制下,为普通问答模式。按照自己设想提供想法并选择素材库、故事定制、叙事定制时,则会进入创作大纲或剧情脉络梳理。同时可以附件上传资料信息或联网搜索,命令中可以说“创建新文档”、“当前文档写入”等,AI会在文档界面中自行执行;而写作画布界面可以换成“新建文本卡片”等对应词汇。
- 先前往 Notebook 登录谷歌账号,使用 src\prompts\md\写作风格画像.md 里的提示词完成自己文章的写作风格提取,之后在AI写作中以附件形式加载写作风格文档,在输入框中填写内容要求一并发送即可。
- AI写作按照写作风格输出正文后,把正文拖拽或点击“应用到画布”中形成文本卡片,右键菜单选智能体——添加到输入框,将正文文本卡片添加到输入框后,切换到审核意见标签页,直接发送。
- “审核意见”输出内容后,重新形成新的文本卡片,按步骤右键菜单把从“审核意见”获得的文本卡片添加到输入框,回到AI写作标签页,点击发送,这个时候AI写作就会自己按照“审核意见”进行二次修改。
- 上述步骤可重复数次,直到满意。
| 层次 | 技术 |
|---|---|
| 前端框架 | Vue 3 (Composition API, <script setup>) + TypeScript |
| 构建工具 | Vite 5 + vue-tsc |
| 桌面框架 | Tauri 2(Rust / WebView2) |
| Markdown | marked + highlight.js |
| 图标 | lucide-vue-next |
| 数据存储 | localStorage(浏览器预览)/ Rust + SQLite(Tauri 桌面) |
- 顶部导航第一个标签页(
HomeView.vue),聚合常用入口与真实数据:问候语 + 今日目标进度、快捷操作(新建 / 导入 / 卡片 / 精修)、最近打开、置顶文档、资料库概览、快速搜索、写作灵感、最近修改、Token HUD。 - 后台由
homeStore.ts维护(置顶 / 最近打开 / 今日目标),启动时随bootHomeStore()恢复。
- 支持分屏(编辑 + 预览)、纯编辑、纯预览三种模式;分栏视图支持同屏编辑两篇文档(左右双编辑器)。
- 多文档文件树:左侧
DocumentSidebar管理多个.md文件与文件夹(新建 / 重命名 / 分组 / 删除),当前文档内容自动持久化。 - 常用格式工具栏:加粗、斜体、标题(下拉可选 H1–H5)、列表(下拉可选无序 / 有序)、引用、代码块、链接、查找/替换(高亮定位)。
- 行级语法(标题 / 列表 / 引用)先剥离该行已有标记再套上新标记,不会叠成
## ## 标题;再点同一档即取消,跨行选中时逐行套用、有序列表自动重排序号。 - 撤销 / 重做覆盖工具栏与 AI 改写:编辑器自建快照历史栈(不再依赖
document.execCommand),工具栏插入的 markdown 语法、查找替换、一键排版、清空、AI 润色 / 续写 / 行内编辑一律可用Ctrl+Z撤回、Ctrl+Shift+Z/Ctrl+Y重做;连续键入按停顿与段落自动并成一步,切换文档时历史清零。
- 行级语法(标题 / 列表 / 引用)先剥离该行已有标记再套上新标记,不会叠成
- 选中文字浮现工具栏:选中文字后光标旁浮现 剪切 / 复制 / 粘贴 / 全选 / 删除 快捷条,水平跟随光标、垂直自动翻转避让屏幕四边。
- 点「⋮」展开 更多文本处理菜单(菜单出现时工具栏暂时隐藏,返回箭头恢复):智能交换(中文 / 英文整词 / 数字 / 标点按相邻两类两两互换)、英文大小写(全大写 ⇄ 小写)、首字母大小写(每词首字母大 ⇄ 小写)、智能引号(半角直引号替换为成对弯引号)。
- 处理过程中选中文字始终保持选中;点击空白、切换选区或超时无操作自动消失。
- 可在「设置 → 配置」中一键关闭整个浮现工具栏(默认开启)。
- 阅读辅助(进度条 / 圆环 / 章节目录):编辑区与预览区顶部各有细条阅读进度条;各区右上角有一枚阅读进度圆环(
ReadingProgressRing.vue),实时显示相对阅读位置,可长按拖拽摆放,悬停展开章节目录(按标题解析,readingOutline.ts)点击跳转;圆环的开关 / 大小 / 不透明度 / 摆放位置(readingRingStore.ts)随设置持久化,各界面位点(主文档 / 分栏 / 画布卡片 / 拼文弹窗)独立记忆。 - 滚动同步:编辑区底部窄面板左侧可切换「同步滚动 / 不同步滚动」——同步时编辑区与预览区按各自内容高度比例联动滚动。
- 禅定专注模式:由阅读圆环触发进入纯 Markdown 或纯预览的全屏沉浸态,左下角胶囊 /
Esc退出,专注期间退出直达原文位置。 - 聚光高亮:专注模式下可开启“聚光”,仅高亮光标所在行(强度 / 模糊可调),弱化其余文字,降低视觉噪声。
- 修订与批注:选中文字右键「修订与批注」(或
Ctrl+Shift+M,RevisionAnnotation.vue)可给片段挂一条修订或批注记录;图层以二级目录折叠在左侧文件树的文档条目下(RevisionLayerList.vue,数据在revisionStore.ts),支持小眼睛预览开关、逐条应用 / 拒绝、定位;预览区按“小眼睛”开启的图层合成展示修订后内容,原文本身不被改写。 - Ctrl+K 行内 AI 编辑:光标处或选中文字后按
Ctrl+K唤起行内改写浮层(InlineAiEdit.vue),按你的写作习惯重写该片段,Ctrl+Enter采纳 /Esc取消,改动计入编辑器撤销历史;采纳的改写会进入「修改记忆」(洞察)。 - 文档条目 AI 改动指示:AI 正在改写某篇文档时,左侧文件树对应条目标出循环边框动效(
aiDocActivity.ts),一眼看出是哪篇在被 AI 动。 - 顶部“导入文件”按钮支持导入
.txt/.md/.markdown文件。
- 自由画布:文本卡片以绝对坐标放置在无限画布上(
LibraryView.vue)。 - 拖拽与持久化:选择模式下按住卡片可自由拖动,位置(
x/y)变更后自动持久化记忆,刷新/重启后保持原布局。- 支持框选、Ctrl/⌘ 多选;多选后拖拽可整体移动并保持相对位置。
- 移动画布:手抓工具,或按住
空格+ 左键拖拽。 - 滚轮缩放:按住
Alt+ 滚轮 以选中卡片中心(未选中则以鼠标指针为中心)缩放画布;未按Alt时为普通滚动浏览;底部有缩放控制台(缩小 / 百分比 / 放大 / 重置)。 - 打组机制(参考 Blender / ComfyUI Node):
- 多选卡片后按
Ctrl+G或右键菜单“打组 (Ctrl+G)”打组;Ctrl+Shift+G或右键“取消打组”解散。 - 展开时打组卡片被包裹进一个半透明组面板,可拖拽标题栏整体移动、内联改名。
- 折叠后变成文件夹卡片外观,显示组名 / 卡片数量 / 收纳卡片预览;点击展开按钮或双击文件夹即可展开。
- 卡片列表面板中打组卡片自动归纳进可折叠文件夹,未分组卡片单列展示。
- 折叠/展开状态持久化:画布上的「文件夹 ⇄ 组面板」形态、卡片列表里文件夹的展开折叠,重启/刷新后原样恢复。
- 多选卡片后按
- 卡片列表快速定位:在左下列表面板点击某张卡片,画布会自动平移到该卡片并选中;点击文件夹则平移到对应打组中心。卡片被移到屏幕外也一找即达;若目标卡片所在组处于画布折叠态,会先展开再定位。
- 卡片编辑面板:双击卡片正文或点「编辑」打开独立编辑浮窗(内含标题、色条颜色、置顶、正文编辑),标题旁的颜色圆点与置顶按钮集中在关闭按钮左侧;关闭后改动即时落库。
- AI 回复支持拖拽到画布生成文本卡片(
cardEvents内部事件桥接)。 - 地图(故事地图):画布工具栏可打开
MapView,自由手绘路径、沿路径标注地点(图钉/信件/旗标等),把写作卡片附着到地图地点,从地图点击地点即可跳回画布定位对应卡片,用于搭建世界观与角色动线。 - 拼文(卡片拼接):选中多张卡片(或全选)后按
Ctrl+Shift+P预览拼接 /Ctrl+Shift+C对比拼接(CardStitchModal.vue),把多卡内容合并为一篇完整文稿;对比模式支持左右双编辑器逐卡比对编辑、撤销 / 重做,并可将结果「保存到卡片 / 放入文档 / 下载」。
- 内置 “人类化干预” 精修提示词(
refineAgent.ts):通过打破 AI 文本高流畅度、人工提升困惑度、控制改写粒度(20%-30%关键词)、拥抱人类句式节奏(短句、代词复指、破折号括号补充、口语化衔接)等方式,让改写文本具备高多样性与节奏感、真实“人味”,并规避高频套话。 - 对输入的文稿按句子并行分组调用大模型加工(每组附带前后 2 句上下文),进度与统计实时展示;支持 OpenAI / OpenAI 兼容 / DeepSeek / Anthropic。
- 生成版本历史(
refineStore.historyVersions),保留原稿与精修稿对照。
- 分析并沉淀用户写作习惯(
insightStore):- 遣词造句偏好 / 段落结构偏好 / 修改倾向(回避表达)。
- 历史修改范例、词频画像、风格仪表盘、画像标签。
- 为 AI 写作、精修提供风格上下文与风格样本。
- 设置面板 “向量数据” 选项卡(位于“精修”下方):
- 总开关:“向量模型”开关,一键启用 / 停用向量的 RAG 联动。
- 模型来源切换:内置本地模型 / 远程 API。
- 内置模型:
all-MiniLM-L6-v2、BGE Small EN v1.5、BGE Small ZH v1.5(默认启用)、Multilingual E5 Small,支持下载 / 清除 / 启用开关,展示维度与体积。 - 远程 API:配置 Embedding Endpoint、API Key、模型名。
- 导入 / 导出向量化配置:状态卡片下方可一键将向量模型选择、启用状态与远程 API 配置导出为 JSON,或从 JSON 导入并自动重建索引。
- 将洞察数据(习惯、范例、卡片样本)向量化建索引(
vectorStore.ts),在 AI 请求时按当前问题做语义检索 Top-K,只注入相关片段,避免 Token 损耗过大与 AI 读取不准。
- 独立侧边栏,与顶部导航平齐;包含 对话(自由聊天)、AI 写作、审核员 三个会话空间(
ChatSidebar.vue)。 - 支持新建对话、对话历史切换与删除、消息重编、复制、转存卡片、导出对话记录(
yanxiang_chat_records_*.json)。 - 写作 / 审核两个会话空间独立模型(
model/auditorModel),写作侧自动调用buildRAGInsightContext将相关的洞察检索结果注入系统提示词。 - 智能体工具(
agentRunner.ts+knowledgeTools.ts+cardTools.ts+webSearch.ts):模型可真实调用工具——读取/检索知识文件(list_knowledge/read_knowledge/search_knowledge)、操作画布卡片(list_cards/read_card/create_card/update_card)、联网搜索(web_search,无需 API Key)。同一消息支持多轮工具调用直到给出最终答复。 - 素材库(材料库):对话面板内置常见写作方法论素材(三番四抖、五线写作原则、倒推五线手法、韩式思维、英雄之旅、27 章结构法等,见
materialStore.ts),可勾选复用、自定义增删改,并作为后台上下文随消息携带。 - 故事定制(
storyStore.ts):仅「对话」页有效,点选角色原型(导师 / 信使 / 阴影 / 欺诈者…)与情节(底层逆袭 / 探求 / 远行与回归…),注入系统提示词作为人物功能位与情节骨架;不选时完全走原流程。 - 叙事定制(
narrativeStore.ts):「对话」与「AI 写作」页有效,点选叙事结构 / 叙事手法 / 结局结尾(共 25 项,见NARRATIVE_*),逐章轮换取用以打散同构写法;未勾选即不注入任何指令。- 定制项以不可编辑胶囊渲染在输入框内(
narrativeChips/storyChips),展示于用户气泡,仅为界面装饰;指令本体走系统提示词,不进入正文,复制 / 拖拽生成卡片时不会带上。 - 素材库、故事定制、叙事定制三个功能均可在「设置 → 配置」中全局关闭(默认开启)。
- 定制项以不可编辑胶囊渲染在输入框内(
- 主页侧栏的
InspirationPanel.vue:随时速记灵感(支持 Markdown、图片、#标签),支持搜索 / 筛选 / 置顶 / 编辑删除,最多可在卡片上「应用」到文档或 AI 输入框。 - 数据逐条持久化到本机(
db_save_inspiration_note/ localStoragedocintel:db:inspirationNotes)。
tokenStore.ts全局记录各 AI 会话(对话 / 写作 / 审核)的 Token 消耗与费用估算,主页「Token HUD」(HomeView.vue)实时展示,随updatedAt变化落盘。
- AI 接口设置:提供商(OpenAI / Anthropic / DeepSeek / OpenAI 兼容中转)、API key、URL、模型、获取模型、测试连接、保存配置。可保存多张「提供商卡片」并在卡片间一键切换。
- 配置:主题色(预设色板 / 自定义吸色)、字体选择(内置预设 + 本地系统字体自动检测,随文档工具栏字体下拉联动)、行首缩进 / 首字下沉 开关(默认关闭,与文档工具栏「排版与字体面板」中的图标开关同步)、选中文字浮现工具栏开关(默认开启)、阅读进度圆环开关 / 大小 / 不透明度(
readingRingEnabled等,随位置一起记忆)、修订与批注开关(默认开启,关闭后右键菜单 / 快捷键 / 编辑区着色一并停用),以及素材库 / 故事定制 / 叙事定制三个功能的全局开关(默认开启,关闭后对应按钮 / 面板 / 提示词注入一并停用)。 - 快捷键:以「分组 + 名称 / 快捷键」表单展示项目涉及的全部快捷键(详见下文快捷键一览)。
- AI 写作 / 审核员 / 精修:各环节提示词编辑 + 知识文件(.txt/.md/.pdf/.docx)导入管理(知识以“文件清单 + 按需读取工具”形式供给模型,避免全量塞入提示词)。
- 向量数据:见上文第 5 节。
- 关于:项目简略说明 + 作者(Idun)与 GitHub 主页链接。
.
├── index.html # Vite 入口,应用标题 "YanXiang agent"
├── package.json # 前端依赖与脚本
├── vite.config.ts
├── tsconfig.json
└── src/
├── main.ts # 应用启动入口(初始化持久化 + 挂载根组件)
├── App.vue # 根布局:TopAppBar + 主面板 + ChatSidebar + 设置面板
├── style.css # 全局设计变量(主题/字体)、基础样式与 Markdown 样式
├── markdown.ts # marked + highlight.js 渲染配置
├── settings.ts # 应用设置状态(AI 接口 / 主题 / 字体 / 向量 / 浮现工具栏 / 三大功能开关)
├── docStore.ts # 当前 Markdown 文档的响应式状态
├── documentFilesStore.ts # 多文档文件树(文件夹 + .md 文件 + 分栏双编辑器槽位)
├── libraryStore.ts # 文本卡片 + 分组结构(WritingCard / CardGroup)
├── mapStore.ts # 故事地图状态(路径 / 地点 / 路径分组 + 几何工具)
├── materialStore.ts # 素材库(对话侧默认写作方法论 + 自定义增删改)
├── storyStore.ts # 故事定制(角色原型 / 情节 勾选与提示词注入,仅对话页)
├── narrativeStore.ts # 叙事定制(结构 / 手法 / 结尾 勾选与提示词注入,对话 / AI写作)
├── insightStore.ts # 洞察分析数据(习惯、历史、画像、建议)与上下文构建
├── insightAnalysis.ts # 真实写作习惯分析器(语料聚合 → 习惯/画像/词频)
├── refineStore.ts # 精修过程状态与版本历史
├── vectorStore.ts # 洞察数据向量化索引 + 余弦相似度 RAG 检索
├── inspirationStore.ts # 灵感速记状态(速记 + 标签 + 图片 + 置顶 + 应用)
├── homeStore.ts # 主页仪表盘状态(置顶 / 最近打开 / 今日目标 / Token HUD)
├── tokenStore.ts # 全局 Token 账本(对话 / 写作 / 审核 消耗与费用)
├── knowledgeTools.ts # 知识文件 Agent 工具(list/read/search_knowledge)
├── cardTools.ts # 画布卡片 Agent 工具(list/read/create/update_card)
├── webSearch.ts # 联网搜索 Agent 工具(无需 Key 的 Bing 文本代理)
├── agentRunner.ts # 协议无关的工具调用 Agent 循环(四协议 × 流式/单发)
├── persistence.ts # 持久化门面:Tauri(SQLite) / localStorage 双后端
├── persistenceBootstrap.ts # 启动时恢复数据 + 自动保存 watcher 装配
├── readingOutline.ts # 章节大纲解析(标题 → 目录 / 进度定位)
├── readingRingStore.ts # 阅读进度圆环的位置记忆(各界面位点独立)
├── revisionStore.ts # 修订与批注图层(创建 / 可见性 / 持久化 / 定位)
├── readingPositionStore.ts # 阅读位置记忆(各文档 / 分栏独立,恢复上一次阅读进度)
├── aiDocActivity.ts # AI 正在改动的文档条目高亮标记
├── cardEvents.ts # 侧边栏 ↔ 画布 的跨组件事件总线(建卡/新对话/长按拖拽)
├── typewriterScroll.ts # 打字机滚动(末尾跑道 + 光标舒适带,编辑区/预览/拼文共用)
├── contentColoring.ts # 内容上色方案(标题/粗体/引用/标点等配色,预览区与手机模拟预览)
├── autoPairPunctuation.ts # 输入法符号自动配对(引号/括号 v-auto-pair 指令)
├── chatSlashCommands.ts # 侧边栏输入框「/」斜杠命令(新建文档 / 当前文档写入等)
├── docEditorDrop.ts # 拖入 AI 回复 / 文件到编辑区的落点处理
├── docTools.ts # 文档级工具函数(文档/分栏读写、文件树定位)
├── refineText.ts # 精修文本分组分句处理(并行改写粒度与上下文)
├── refinePunctuation.ts # 精修 punctuation(智能引号 / 全角半角清洗)
├── attachments.ts # 卡片附件 + 文件附件(添加到 AI 输入框)状态
├── longPressDrag.ts # 长按拖拽原语(按住拖拽 vs 松手即选的文本选择冲突解决)
├── download.ts # 文件导入/导出/备份的 File System Access 封装
├── fonts.ts # 本地系统字体发现(设置面板与文档工具栏共享)
├── tauri-globals.d.ts # Tauri 环境类型声明
├── vite-env.d.ts # Vite 客户端类型声明
├── prompts/
│ ├── writerAgent.ts # AI 写作智能体名称与系统提示词
│ ├── auditorAgent.ts # AI 审核员名称与系统提示词
│ ├── chatAgent.ts # AI 对话(自由问答)智能体名称与系统提示词
│ ├── refineAgent.ts # 精修(人类化干预)提示词
│ ├── knowledgeDefaults.ts # 内置默认知识素材清单(md 打包进构建产物)
│ └── md/ # 随包发布的知识文档(禁止模式 / 反面例子 / 受众画像等)
└── components/
├── TopAppBar.vue # 顶部应用栏:导入/备份/导航标签/设置入口
├── HomeView.vue # 主页仪表盘(快捷操作 / 最近打开 / 写作灵感 / Token HUD)
├── InspirationPanel.vue # 灵感速记面板(速记 / 标签 / 图片 / 应用)
├── DocumentViewer.vue # Markdown 编辑器/预览组件(含分屏、查找替换、撤销重做历史栈、行级语法下拉菜单、选中浮现工具栏 + 更多菜单)
├── DocumentSidebar.vue # 文档文件树侧边栏(多文件/文件夹管理;含修订图层二级目录)
├── ReadingProgressRing.vue # 阅读进度圆环 + 章节目录跳转(拖拽摆放、禅定/聚光触发)
├── InlineAiEdit.vue # Ctrl+K 行内 AI 改写浮层(改写选中片段,Ctrl+Enter 采纳)
├── RevisionAnnotation.vue # 修订与批注表单(右键 / Ctrl+Shift+M 唤起)
├── RevisionLayerList.vue # 文档条目的修订图层列表(小眼睛/应用/拒绝/定位)
├── LibraryView.vue # 写作画布:卡片拖拽、打组、缩放、卡片列表、卡片编辑面板
├── MapView.vue # 故事地图:手绘路径、地点标记、卡片附着、地图选卡跳转
├── CardStitchModal.vue # 拼文弹窗:多卡拼接预览 / 左右对比编辑
├── RefineView.vue # 精修视图(并行分句改写 + 历史对照)
├── InsightView.vue # 洞察视图(习惯 / 历史 / 画像)
├── ChatSidebar.vue # AI 侧边栏(对话/写作/审核:流式请求、素材库、故事/叙事定制、RAG 注入)
├── ChatSettingsTab.vue # 侧边栏 AI 接口 / 知识文件设置分页
├── AiSettingsPanel.vue # 设置面板(接口 / 配置 / 快捷键 / 提示词 / 知识 / 向量 / 关于)
└── ThemeColorPicker.vue # 主题色自定义取色器
└── src-tauri/
├── Cargo.toml # Rust 包配置
├── build.rs
├── tauri.conf.json # 窗口 / 打包 / 应用标识(productName=YanXiang agent)
├── capabilities/default.json # Tauri 权限声明
└── src/
├── main.rs # Tauri 入口
├── lib.rs # 注册命令与窗口逻辑
└── storage.rs # SQLite 存储实现(文档 / 卡片 / 历史 / 设置)
main.ts
└─ initPersistence() (persistenceBootstrap.ts)
├─ loadSettings() → 写入 aiSettings (settings.ts) + 素材/故事/叙事开关、向量等
├─ loadDocument() → 写入 docStore.markdown (docStore.ts)
├─ loadWritingCards() → 写入 libraryStore.cards / libraryStore.groups
├─ loadRefineHistory() → 写入 refineStore.historyVersions
├─ importNarrativeSelections / importStorySelection → narrativeStore / storyStore
├─ importTokenUsage() → tokenStore
├─ bootHomeStore() → homeStore(置顶 / 最近打开 / 今日目标)
└─ watch(…) : 深度监听各处状态 → 自动调用 saveXxx() (persistence.ts)
createApp(App).mount("#app")
TopAppBar(导航/设置/导入/备份)
│ @select 切换 activeTab
▼
主面板(按 activeTab 切换)
主页 → HomeView + InspirationPanel ⇄ homeStore / inspirationStore / materialStore / tokenStore
文档 → DocumentViewer + DocumentSidebar ⇄ documentFilesStore.activeFileId / docStore.markdown
写作 → LibraryView + MapView ⇄ libraryStore(卡片/分组)/ mapStore
精修 → RefineView ⇄ refineStore
洞察 → InsightView ⇄ insightStore
侧边栏 → ChatSidebar ⇄ aiSettings / vectorStore / materialStore / storyStore / narrativeStore
/ cardEvents / attachments / tokenStore
设置 → AiSettingsPanel ⇄ aiSettings / vectorStore / fonts / ThemeColorPicker
- AI 回复 → 文本卡片:
ChatSidebar调用requestCreateCard()写入cardEvents.pending,LibraryView通过watch(cardEvents.pending)将消息追加为卡片。 - 故事 / 叙事定制注入:
ChatSidebar在streamAiReply组装系统提示词时,按当前标签页分别调用buildStoryDirective()(仅对话)与buildNarrativeDirective(scope)(对话 / AI 写作);三处入口(按钮 / 面板 / 提示词注入)统一受aiSettings.*CraftEnabled全局开关控制(settings.ts+persistenceBootstrap.ts)。 - 素材库上下文:对话页将
selectedMaterials()作为后台上下文注入系统提示词(仅携带勾选素材,不进入用户气泡文本);开关与编辑面板位于ChatSidebar.vue/AiSettingsPanel.vue。 - 长按拖拽 AI 回复:
ChatSidebar借助longPressDrag.ts实现“按住即拖、松手即掉”的拖拽手势,同时不破坏回复正文的文本选择;拖拽中通过cardEvents.dragPointer给画布落点高亮。 - 卡片区 → AI 输入框:卡片右键“添加到输入框”调用
addCardAttachment(),ChatSidebar读取cardAttachments.items注入请求。 - AI 写作 ← 洞察:
ChatSidebar调buildRAGInsightContext(userMessage)(vectorStore.ts)→ 内部调用rebuildInsightVectorIndex()+searchInsightVectorStore(),对insightStore/libraryStore数据做语义检索,只注入 Top-K 相关样本。 - AI Agent 工具闭环:
agentRunner.ts把模型返回的工具调用分发给knowledgeTools/cardTools/webSearch执行,结果回注模型,直至产出最终答复。 - 打组联动:
libraryStore.groups是画布组面板与卡片列表文件夹的唯一数据源;LibraryView中的computedGroupBounds依据卡片坐标计算组框几何,画布折叠状态folded与列表折叠状态collapsed随组定义一并持久化。 - 卡片列表 ↔ 画布定位:点击列表卡片/文件夹 →
onListCardClick/onFolderHeaderClick→focusCardOnCanvas/focusGroupOnCanvas(panCanvasTo折算滚动偏移与内边距)→ 平移画布居中目标;卡片所属组处于折叠态时先自动展开。 - 地图 ↔ 画布:
MapView通过mapStore管理路径/地点/附着,onFocusCardFromMap关闭地图并跳转画布定位卡片;LibraryView也可从卡片右键“附着到地图地点”。 - 文档 ↔ 卡片:文档编辑区内容可以入画布为卡片(编辑面板内直接复用
DocumentViewer埋入式实例),卡片正文也可一键放进文档。 - 灵感速记 ↔ 文档 / AI:
InspirationPanel的速记卡片可一键「应用」到当前文档或 AI 输入框;速记数据经persistence.ts落库(db_save_inspiration_note/db_delete_inspiration_note/db_load_inspiration_notes)。 - 修订与批注合成:
RevisionAnnotation把图层写入revisionStore;DocumentViewer渲染预览时按「小眼睛」可见性把修订内容合成进预览(原文不动),左侧DocumentSidebar的RevisionLayerList支持应用 / 拒绝 / 定位;文档删除后revisionStore自动清掉孤立图层。 - 阅读进度 / 目录联动:
ReadingProgressRing用readingOutline(parseOutline/measureTextareaTops/activeHeadingIndex)按标题建目录并计算进度,点击目录项跳转编辑区 / 预览区对应章节;圆环位置经readingRingStore记忆并落库。 - 排版变量共享:
DocumentViewer的editorWrapStyle把排版度量写成--ed-*系列 CSS 变量,编辑区<textarea>、高亮覆盖层.editor-highlights与背景网格线(.grid-line-solid/.grid-line-dashed/.grid-line-dotted)共用同一份行高 / 边距 / baseline 值,保证文字与网格逐行同高对齐;网格随滚动同步靠background-attachment: local,尾部对齐靠打字机跑道--ed-runway(typewriterScroll.ts)。 - 行首缩进 / 首字下沉:工具栏「排版与字体面板」与「设置 → 配置」的开关读写同一个
aiSettings.firstLineIndent/aiSettings.dropCap,两端自动双向同步并一起落库(persistenceBootstrap.ts);style.css以> p子代选择器只作用于顶层正文段落,首字下沉段落自动豁免行首缩进,二者互斥。
| 数据 | 键/位置 | 说明 |
|---|---|---|
| AI 接口与偏好设置 | docintel:db:settings* |
提供商、API key、模型、提示词、知识文件、主题、字体、字号/行距/边距、背景网格线(editorGridLine)、行首缩进 / 首字下沉(firstLineIndent / dropCap)、向量模型选择、选中文字浮现工具栏开关、素材库 / 故事定制 / 叙事定制全局开关 |
| 当前文档 / 多文档文件树 | docintel:db:document 等 |
Markdown 全文自动保存;多文件与文件夹结构在 documentFilesStore 中维护 |
| 写作卡片 + 分组 | docintel:db:writingCards / cardGroups |
含卡片坐标 x,y、groupId,以及组的 folded(画布折叠)、collapsed(列表折叠)状态;拖拽 / 折叠 / 打组后自动保存 |
| 素材库 | docintel:db:chatMaterials |
对话侧素材库条目(默认素材 + 用户自定义)顺序与增删状态 |
| 故事定制勾选 | settings:storySelection |
角色原型 / 情节 的选择(仅对话页),跨会话保留;未持久化时为空选择 |
| 叙事定制勾选 | settings:narrativeSelections |
对话 / AI 写作 各自独立的 结构 / 手法 / 结尾 选择,跨会话保留 |
| 故事地图 | settings:mapData |
路径 / 地点 / 路径分组 / 网格等地图数据 |
| 灵感速记 | docintel:db:inspirationNotes |
逐条 upsert 的速记(正文 / 标签 / 图片 / 置顶 / 时间戳) |
| Token 账本 | settings:tokenUsage |
全局 Token 消耗与费用估算,随 updatedAt 变化落盘 |
| 主页数据 | settings:dailyGoal 等 |
置顶 / 最近打开 / 今日目标(bootHomeStore 恢复) |
| 精修历史 | docintel:db:refineHistory |
版本历史(原稿/精修稿/统计) |
| 洞察(习惯/历史/画像)+ 向量配置 | settings:insightHistory / settings:insightToggles / settings:vector* |
洞察分析结果与向量化配置;索引本体由原始数据重建 |
| 修订与批注图层 | settings:docRevisionLayers |
每条修订/批注的原文、修订、批注、锚点与可见性,随文档删除自动清孤立 |
| 阅读进度圆环 | settings:readingRingPositions |
各界面位点的圆环摆放位置(归一化坐标),readingRingStore 读写 |
| 向量索引 | 内存重建 + 上述原始数据 | vectorStore 启动时/设置中“重新索引”时由原始数据重建(不持久化重复副本) |
在 Tauri 桌面运行时,上述写入会经由
persistence.ts转发到 Rust 侧 SQLite(src-tauri/src/storage.rs,命令:db_save_settings/db_save_document/db_save_writing_cards等);浏览器开发预览时使用localStorage。备份按钮可将卡片、设置、文档导出为yanxiang_backup_*.json。
- 索引构建:
rebuildInsightVectorIndex()将洞察数据切片为 Chunk(遣词习惯、段落习惯、删改习惯、回避词、历史修改范例、写作卡片样本)。 - 向量化:内置引擎使用字符级 n-gram 词频 + 余弦相似度(
tokenize/cosineSimilarityMap),无需外部模型即可本地计算;在“向量数据”选项卡可切换启用内置嵌入模型或远程 Embedding API,作为后续更高质量语义计算的扩展位。 - 检索注入:用户发送问题时,
buildRAGInsightContext检索 Top-4 相关 Chunk 注入写作系统提示词,取代原先“全量携带洞察上下文”,显著降低 Token 损耗并提升相关性。
项目涉及的全部快捷键(与设置面板「快捷键」选项卡一致):
| 分组 | 名称 | 快捷键 |
|---|---|---|
| 全局 | 保存当前文档 | Ctrl+S |
| 全局 | 另存为 / 导出 | Ctrl+Shift+S |
| 全局 | 导入文档 | Ctrl+O |
| 文档编辑器 | 撤销 | Ctrl+Z |
| 文档编辑器 | 重做 | Ctrl+Shift+Z / Ctrl+Y |
| 文档编辑器 | 行内 AI 编辑 | Ctrl+K |
| 文档编辑器 | 采纳行内 AI 改写 | Ctrl+Enter |
| 文档编辑器 | 修订与批注 | Ctrl+Shift+M |
| 文档编辑器 | 退出禅定专注模式 | Esc |
| 对话 / AI写作 / 审核 | 发送消息 | Ctrl+Enter |
| 灵感速记 | 发布灵感 | Ctrl+Enter |
| 灵感速记 | 关闭弹层 | Esc |
| 写作画布(卡片) | 打组所选卡片 | Ctrl+G |
| 写作画布(卡片) | 取消打组 | Ctrl+Shift+G |
| 写作画布(卡片) | 拼文预览 | Ctrl+Shift+P |
| 写作画布(卡片) | 拼文对比 | Ctrl+Shift+C |
| 写作画布(卡片) | 平移画布 | 空格 |
| 拼文对话框 | 撤销 | Ctrl+Z |
| 拼文对话框 | 重做 | Ctrl+Y / Ctrl+Shift+Z |
| 故事地图 | 选择工具 | V |
| 故事地图 | 绘制路径 | P |
| 故事地图 | 添加地点 | M |
| 故事地图 | 擦除 | E |
| 故事地图 | 框选 | B |
| 故事地图 | 重置视图 | 0 |
| 故事地图 | 平移画布 | 空格 |
| 故事地图 | 完成路径绘制 | Enter |
| 故事地图 | 撤销上一个节点 | Ctrl+Z |
| 故事地图 | 删除选中地点 | Delete / Backspace |
| 故事地图 | 收纳全部未分组路径 | Ctrl+G |
| 故事地图 | 关闭地图 | Esc |
npm install # 安装依赖
npm run dev # Vite 开发服务器(浏览器预览)
npm run tauri -- dev # Tauri 桌面开发窗口(热更新)
npm run build # vue-tsc 类型检查 + Vite 生产构建
npm run tauri -- build # 构建 Windows 安装包
npm run tauri -- build --debug --no-bundle # 仅生成调试可执行文件
# 输出:src-tauri/target/debug/docintel-app.exe- API Key 等敏感设置仅保存在本机(浏览器预览为
localStorage,Tauri 桌面为本地 SQLite),不会上传至任何远端。 - 远程调用仅发生在你主动使用 AI 功能时,请求将携带对应服务商的 API Key 与必要的写作/检索上下文。
- “向量数据”选项卡中的本地嵌入模型运行在本机;选择“远程 API”时,嵌入文本会发送至你配置的 Embedding 服务地址。
- 备份文件(
yanxiang_backup_*.json)包含你的写作数据,请注意妥善保管,勿上传到公开仓库。


