Merge remote-tracking branch 'origin/main' into feat/export-service
# Conflicts: # backend/app/routes.py
This commit is contained in:
@@ -235,3 +235,9 @@ rag.search
|
||||
- RAG Benchmark 已建立:`POST /api/benchmarks/rag/runs` 创建即返回 queued、后台 Task 执行,
|
||||
通过 SSE 实时推送进度,报告含逐 Case 结果与 `total_cases` / `successful_cases` / `failed_cases` / `failure_rate`。
|
||||
- Agent Benchmark 暂缓,待 Agent Runtime 完成后交付。
|
||||
|
||||
## 2026-09-06 实现补充
|
||||
|
||||
上文的 MVP 同步说明是早期基线。当前打开 Vault 和 HTTP PATCH 保存已拆分即时元数据 / FTS 与后台向量计算;手动全量重建仍等待完成。生产 Embedding 使用实际模型和隔离向量空间,HashEmbedding 仅用于测试。
|
||||
|
||||
后续维护以 [工作区后台索引与保存开发说明](工作区后台索引与保存开发说明.md) 的实现边界、状态和验证步骤为准。
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# Markdown 渲染检查
|
||||
|
||||
日期:2026-09-05。范围为当前工程启用的 CommonMark、GFM、Milkdown Crepe 扩展及静态 Markdown 预览,不代表所有 Markdown 方言。
|
||||
|
||||
## 本次修复
|
||||
|
||||
- 行内代码:保留普通输入规则,为绕过 `handleTextInput` 的浏览器文本输入与输入法组合结束增加单反引号补偿处理。跳过代码节点、已有代码标记、转义反引号;不改写文件中的转义文本。同时识别先输入空反引号对、再移入填字的路径,并在转换后保留继续输入的代码标记;空反引号对序列化时的转义不会阻断识别。回归测试覆盖缺失事件数据、替换文本、延迟组合结束与粘贴/撤销排除。独立浏览器编辑器已实测逐字输入、段落/行内换行,以及先输入反引号对再向中间填入 s。
|
||||
- 工具栏:未选中文字时,行内代码按钮可切换后续输入的代码标记;此前上游命令在空选区直接返回。
|
||||
- 样式:工作区与静态预览使用主题代码背景、文字及边框变量,避免行内代码与正文难以区分。
|
||||
- 静态预览:补齐 `$...$`、`$$...$$` 和编辑器保存的 `LaTeX` 围栏公式;代码中的公式符号保持原文。公式使用 KaTeX,禁用可信 HTML 命令并经过最终清理。
|
||||
- 静态表格:恢复 GFM 中间、右侧对齐,避免通用单元格样式覆盖对齐属性。
|
||||
|
||||
## 检查矩阵
|
||||
|
||||
| 格式 | 工作区编辑 | 静态预览 | 验证 |
|
||||
| --- | --- | --- | --- |
|
||||
| H1–H6 | 标题节点 | 标题元素 | 新增格式矩阵 |
|
||||
| 粗体、斜体、删除线 | 标记渲染 | strong / em / del | 新增格式矩阵 |
|
||||
| 单反引号、多反引号代码 | 行内代码;保存保留定界符 | code,转义内容不执行 | 加载、普通键入、组合输入、工具栏与序列化 |
|
||||
| 有序、无序、嵌套列表 | 列表节点 | ol / ul | 新增格式矩阵 |
|
||||
| 任务列表 | GFM 任务项 | 禁用复选框 | 格式矩阵及 GFM 输出 |
|
||||
| 引用、分割线 | 原生节点 | blockquote / hr | 新增格式矩阵 |
|
||||
| 链接、引用式链接、图片 | Crepe 原生组件 | 安全链接及图片 | 静态格式矩阵;图片实际加载受路径可访问性影响 |
|
||||
| GFM 表格 | 表格组件 | table;主题边框和对齐 | 格式矩阵、对齐规则检查 |
|
||||
| 硬换行、转义符 | 编辑器保留 Markdown 语义 | br / 转义文本 | 静态格式矩阵 |
|
||||
| 围栏代码、未知语言 | CodeMirror / Shiki | Shiki;未知语言回退纯文本 | 既有语言测试与新增回退测试 |
|
||||
| 行内、块级数学公式 | Crepe LaTeX | KaTeX | 编辑器格式矩阵与新增静态公式测试 |
|
||||
| Mermaid | 图形预览 | SVG 图形 | 既有主题、错误回退、大图文字及缩放测试 |
|
||||
| YAML 元数据 | 独立属性栏 | 普通 Markdown 场景不视为属性表单 | 既有标题、标签、引号、锚点、编码与往返测试 |
|
||||
| 自定义字号 span | 装饰渲染 | 清理后 HTML | 既有字号标记测试 |
|
||||
| 原始 HTML | 编辑器按自身 HTML 节点规则保留 | 清理后展示,脚本及事件属性移除 | 新增安全 HTML 测试 |
|
||||
|
||||
源码模式展示 Markdown 原文,不隐藏反引号、星号和围栏。脚注、定义列表、Wiki 双链、图表以外的自定义围栏等未作为独立渲染扩展启用,不在“已支持”范围内。
|
||||
|
||||
2026-09-06 补充:GitHub alerts 与 Obsidian callout 已在工作区和静态预览接入,包含常用类型/别名、自定义标题、嵌套与折叠。语法、命令接口与验证方法见 [警告框与桌面编辑命令开发说明](警告框与桌面编辑命令开发说明.md)。
|
||||
|
||||
自动检查覆盖解析、DOM 输出、部分编辑交互、保存往返和主题变量。尚未完成所有浏览器、所有输入法及每个主题的逐页截图比对;不能据此宣称像素级视觉验收通过。测试使用隔离样例,没有修改用户笔记。
|
||||
|
||||
## 2026-09-06 Mermaid 补充
|
||||
|
||||
补齐大图居中与完整适配、显示宽度缩放基准、滚轮速度限制、鼠标位置补偿及重开滚动位置清理。修复 Milkdown 段落内边距挤出 foreignObject 标签框的问题,浏览器核对 1、many、contains 完整显示。
|
||||
|
||||
实现原理、测试命令和视觉复核步骤见 [Mermaid 预览与缩放开发说明](Mermaid预览与缩放开发说明.md)。
|
||||
@@ -0,0 +1,48 @@
|
||||
# Markdown 语法预设与外部文件刷新
|
||||
|
||||
日期:2026-09-06。
|
||||
|
||||
## 1. 设置入口与范围
|
||||
|
||||
“设置 → 编辑器 → Markdown 语法预设”管理语法与编辑行为,独立于“标题样式”的字号、字体和字重设置。
|
||||
|
||||
支持 ATX/Setext 标题、无序列表标记、有序列表递增、代码围栏、裸链接识别、数学公式、警告框、Mermaid、代码行号、自动换行、缩进和工具栏新建代码块的默认语言。Setext 只作用于 H1/H2。提供扩展、GitHub 和基础三组内置配置,支持最多 20 个命名自定义预设,同名保存替换旧配置。
|
||||
|
||||
配置保存在本机 localStorage 的 `markdown-preferences`,读取时校验。静态预览即时应用;写作编辑器在下次打开时应用,避免切换设置重建正在编辑的文档。写作模式保存会统一整篇正文的语法标记,源码模式保留手写语法。关闭扩展后对应内容按普通 Markdown/代码展示。
|
||||
|
||||
本次不是完整复制 Typora:未提供上下标、高亮、智能标点、physics 包及导出公式选项。基础配置仍支持现有 GFM 表格等功能。
|
||||
|
||||
## 2. 主题与折叠
|
||||
|
||||
六个主题共用语义颜色和表单控件。内置浅色、深色、护眼更新为 1.3.0;纸间时光 1.8.0;Ocean Blue 1.5.0;Midnight Purple 2.3.0。社区预览增加语法控件和标题折叠样本。
|
||||
|
||||
标题箭头使用统一 CSS 形状,默认隐藏,悬停标题或键盘聚焦按钮时显示;无悬停能力的触摸设备保持可见。用户自定义标题外观独立于主题配色。
|
||||
|
||||
## 3. 外部文件刷新与保存保护
|
||||
|
||||
Web 当前采用串行后台轮询:前一次完成后间隔两秒,在窗口聚焦时也检查。隐藏页面暂停读取,卸载移除监听。此机制不是原生文件事件监听;第三阶段可由 Tauri 文件事件替代。
|
||||
|
||||
`GET /workspace/tree` 检查磁盘新增、删除和重命名,为新文件登记元数据及全文索引,向量任务继续后台执行。前端保留文件夹展开状态,并丢弃过期请求响应。读取失败保留旧树并显示重试入口。
|
||||
|
||||
当前打开且未修改的文件检测到外部正文变化后更新编辑器;存在本地编辑时保留缓冲区,停止自动保存并提示冲突。重新加载磁盘版本需要用户确认。原文件删除或移动后,隐藏不可用的重新加载入口,提供下载当前 Markdown 副本和确认关闭笔记;取消关闭或确认期间正文改变时保留缓冲区。关闭后可重新选择其他文件,不再阻塞导航。`PATCH /notes/{note_id}` 新增可选 `expected_content_hash`(原始正文 UTF-8 SHA-256,64 位小写十六进制),保存前校验,不匹配返回 `NOTE_CONTENT_CONFLICT`,防止覆盖外部修改。
|
||||
|
||||
范围限制:现有文件的外部正文修改会刷新当前编辑器,但本轮目录检查不会据此重建其搜索索引;可通过重建索引同步检索内容。
|
||||
|
||||
## 4. 验证方法
|
||||
|
||||
```powershell
|
||||
cd frontend
|
||||
npm run test
|
||||
npm run build
|
||||
cd ..
|
||||
backend/.venv/Scripts/python.exe -m pytest backend/tests/test_workspace.py backend/tests/test_workspace_background.py -q -p no:cacheprovider
|
||||
```
|
||||
|
||||
手工验证:
|
||||
|
||||
1. 保存并重新应用命名预设,刷新后确认保留;重新打开笔记,检查 Setext、列表和代码围栏的源码。
|
||||
2. 切换六个主题,在社区预览和工作区检查控件、警告框、标题箭头;移出标题后箭头隐藏,Tab 聚焦仍可操作。
|
||||
3. 在系统文件管理器新增、重命名、删除 Markdown 文件,保持前端可见,确认树自动更新且目录展开状态保留。
|
||||
4. 分别在正文未修改、有未保存编辑时从外部修改同一文件,验证自动加载与冲突保护;拒绝重新加载应保留编辑内容。
|
||||
|
||||
本次自动验证覆盖预设持久化、解析选项隔离、写作语法输出、标题折叠、树刷新竞态、外部文件登记及保存冲突。
|
||||
@@ -0,0 +1,46 @@
|
||||
# Mermaid 预览与缩放开发说明
|
||||
|
||||
> 本文档用于前端开发和图表渲染联调。
|
||||
>
|
||||
> 更新日期:2026-09-06。代码基线:`a5c44c4`。
|
||||
|
||||
## 当前实现
|
||||
|
||||
工作区和静态 Markdown 通过 `mermaidService.ts` 串行渲染,使用主题变量与 Mermaid strict 模式。工作区由 `mermaidPreview.ts` 发布当前版本预览;`DiagramInteractions.vue` 提供缩放和大图交互。
|
||||
|
||||
- 行内按钮在悬停或键盘焦点进入时显示;触屏保留操作入口。
|
||||
- 行内中键点击 SVG 后进入滚轮缩放,移动鼠标或窗口失焦退出。
|
||||
- 大图直接使用滚轮缩放,缩放范围为 20%~500%。
|
||||
- 行内首次缩放以实际显示宽度为基准,避免受容器限制的图表跳回原始宽度。
|
||||
- 大图打开时根据原始比例与可用窗口宽高确定 100% 基准,清除旧滚动位置并居中;100% 不一定等于 SVG 原始像素宽度。
|
||||
- 滚轮增量按时间和 delta 限制,宽度变化使用 180ms 过渡;支持减少动态效果偏好。
|
||||
- 过渡期间根据鼠标位置补偿内外滚动容器。受滚动边界限制时,不能保证鼠标锚点在任意位置绝对不动。
|
||||
|
||||
## 文字裁切的原因与修复
|
||||
|
||||
Mermaid 的 HTML 标签放在固定尺寸的 SVG `foreignObject` 中。Milkdown 的正文段落规则会给内部 p 增加上下各 4px 内边距,导致关系标注超出文字框。工作区现在对图表内部 p 清除段落内边距和外边距,并继承图表行高、字重。
|
||||
|
||||
大图复制 SVG 时保留 `foreignObject`,先清理嵌入 HTML,再清理整个 SVG,移除脚本及事件属性。不能为了保留标签而关闭安全清理。
|
||||
|
||||
类图未声明方法时,其方法区为空是正常结构。排查时应先对照源码,再检查 DOM 标签、尺寸和裁切范围。
|
||||
|
||||
## 验证方法
|
||||
|
||||
在 frontend 目录执行:
|
||||
|
||||
```powershell
|
||||
pnpm exec vitest run src/components/common/DiagramInteractions.spec.ts src/features/editor/diagramIntegration.spec.ts src/features/editor/mermaidPreview.spec.ts
|
||||
pnpm exec vue-tsc -b
|
||||
```
|
||||
|
||||
使用 Vault 中“功能演示/03 Mermaid 图表集.md”手动检查:
|
||||
|
||||
1. 检查流程图、时序图、类图、状态图、ER 图和甘特图。
|
||||
2. 类图的 1、many、contains 应完整显示;查看内部 p 的 padding 应为 0。
|
||||
3. 甘特图大图初始应完整适配;放大后可通过滚动条查看超出部分。
|
||||
4. 连续滚轮输入不应首次跳大;移动鼠标后行内滚轮模式退出。
|
||||
5. 关闭并重开大图,不保留上次滚动位置。
|
||||
|
||||
浏览器实测中,关系标注文字高度约 16.5px,对应 16.5px 的 SVG 标签框;contains 约 24px,对应 24px 框。该结果不替代所有主题、字体、浏览器的视觉验收。
|
||||
|
||||
相关格式范围见 [Markdown 渲染检查](Markdown渲染检查.md)。
|
||||
@@ -115,3 +115,9 @@ pnpm build
|
||||
阶段 D 测试覆盖注册/注销生命周期、位置过滤、参数与 Context 校验、上下文裁剪、设置影响命令执行、声明式 Secret Resolver 与越权拒绝、真实 MCP Command Target 与 Agent Tool 隔离、必填 Secret 传递、外部 Schema 引用拒绝、定长 Secret Reference、篡改引用的跨命名空间阻断、Secret 删除与卸载失败回滚、Provider/通用凭据命名空间隔离、五类设置字段、Schema 版本冲突、Secret 密文与清理、损坏存储、空 Command 列表等无效贡献文件、OpenAPI 路径、前端 Service 请求格式、Host 状态展示和动态 Secret 表单。
|
||||
|
||||
生产构建仍会报告现有大 Chunk 警告,不影响构建成功;该问题属于前端按路由和 Markdown 依赖拆包的后续性能任务。
|
||||
|
||||
## 2026-09-06 安装状态补充
|
||||
|
||||
ZIP 导入和安装日志已接入。安装路径、包摘要、启用状态及 Plugin 授权可以在本地恢复;用户目录安装源与受管理 ZIP 解压目录使用不同卸载边界。功能示例包已入库,远程社区服务仍属计划。
|
||||
|
||||
详见 [扩展安装持久化与社区包开发说明](扩展安装持久化与社区包开发说明.md)。
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# 主题组件覆盖检查(2026-09-05)
|
||||
|
||||
本次检查仓库内 3 个内置主题和 3 个社区预设,共扫描 105 个前端源文件的组件与语义样式变量。用户自行导入的第三方 CSS 不在仓库中,不据此声称已验收。
|
||||
|
||||
## 范围与结果
|
||||
|
||||
扫描到 70 个颜色、字体、间距、圆角、阴影、动效和行高变量引用,修复后未定义引用数为 0。颜色及控件样式由共享 token、组件样式和主题覆盖共同提供;继承共享样式不等于未适配。新增 `themeCoverage.spec.ts` 保持全源文件变量引用检查,并检查社区预设的交互色、Markdown 色及 color-scheme。
|
||||
|
||||
| 主题 | 新版本 | 修正 |
|
||||
| --- | --- | --- |
|
||||
| Light / Dark | 1.1.1 | 原生表单控件底色及浏览器 color-scheme |
|
||||
| Sepia | 1.1.1 | 控件底色、焦点、按下态、柔和悬停色 |
|
||||
| Ocean Blue | 1.3.1 | 活动态、反色文字、禁用色、Markdown 表格与标记色 |
|
||||
| Midnight Purple | 2.1.1 | 深色 color-scheme、原生控件及上述交互/Markdown 色 |
|
||||
| 纸间时光 | 1.6.1 | 新增分模型统计、缓存说明、数据提示及大图查看样式 |
|
||||
|
||||
MCP JSON 编辑器错误引用的 `--font-family-mono` 已改为共享 `--font-ui-mono`。全局原生控件底色使用零优先级选择器,组件和主题仍可覆盖。旧版社区主题需在主题页点击“更新”;不会覆盖用户自行修改的已安装 CSS。
|
||||
|
||||
这是全仓库静态样式覆盖和功能回归检查,不是所有屏幕尺寸下的逐页视觉验收,也不把变量有定义等同于对比度全部达标。
|
||||
|
||||
## 用量与交互
|
||||
|
||||
柱状图按日期和来源聚合,再以 Provider ID + 模型 ID 分割同柱。模型分段之和与来源总计一致;同一来源使用色彩深浅区分,提供商柱保留斜纹。缺失计数仍显示“未提供”,不补估历史值。
|
||||
|
||||
缓存命中率只对同时提供命中和未命中计数的请求计算:命中合计除以这些请求的输入合计;缺少输入时分母使用命中加未命中。本次本地记录检查中的两次 DeepSeek 调用,厂商明确报告命中 0,未命中分别为 1015、1219,写入缺失。没有新增外部模型调用。
|
||||
|
||||
AI 对话 Enter 发送,Shift+Enter 换行,输入法确认和长按 Enter 不触发重复发送。Mermaid 普通预览控件在悬停/键盘聚焦时显示,触屏保留按钮;大图可直接滚轮缩放,普通预览需中键启用。滚轮归一化并按时间限制缩放速度,每秒连续输入不会无限叠加瞬时倍率。
|
||||
|
||||
|
||||
## 下拉与折叠控件补充
|
||||
|
||||
编辑器外观行统一为标签、38px 控件、说明三层,避免只有代码主题字段带说明时将其他控件拉偏。补齐所有原生 details 的 `ui-disclosure` 样式,统一折叠箭头、展开背景和边框。下拉框增加共享箭头、选项配色、焦点及禁用态;支持 `appearance: base-select` 的浏览器使用可主题化选项面板,其他浏览器保留原生选择行为并应用可支持的颜色。原生系统弹出层的完整装饰不能仅靠 CSS 在所有浏览器中保证。
|
||||
|
||||
## 6107b7f 后续遗漏修复
|
||||
|
||||
- 任务、MCP、主题导入、社区预览、Agent 权限确认接入 AppDialog:原生顶层遮罩、内部滚动、祖先滚动锁及焦点归还。滚动锁使用引用计数,嵌套弹窗关闭不会提前解锁背景。权限确认禁止 Escape/点击遮罩隐式关闭;MCP 忙碌时禁止隐式关闭。人设弹窗补用同一滚动锁。
|
||||
- 修复音视频三处、请求 JSON 一处 textarea 的单行高度覆盖;使用 textarea 样式、最小高度和纵向拉伸。单行高度规则仅匹配 input.input 与 select。
|
||||
- Agent 工具原文和 Trace 完整数据接入 ui-disclosure,并合并重复容器规则。Provider 预设选中态使用主题强调色。
|
||||
- 音视频页面标题和内容宽度对齐共享布局。纸间时光补充工具选择卡片的轻量纸张边框,版本 1.6.2;旧版更新入口及应用后 CSS 刷新已有自动测试。其余社区主题复用公共控件修复,未无意义提升包版本。
|
||||
- 安装前预览加载真实 tokens.css 与 features.css,并增加多行/单行/下拉/禁用/展开折叠/错误标签/Markdown/图表配色及长标识样例;保留无脚本 sandbox 与 CSP,不改宿主主题。
|
||||
|
||||
验证:六主题在 1280、600、360 像素浏览器窗口下检查;样例 iframe 内容宽度分别为 660、508、268px,均无水平溢出,多行框均为 100px。实际任务页弹窗矩形覆盖 1280×720 全视口,焦点进入表单,Escape 关闭后回到新建按钮;实际术语校对框为 100px 并支持纵向拉伸。
|
||||
|
||||
可重复的隔离浏览器入口与操作说明位于 `frontend/tests/visual/README.md`,支持六主题、长内容弹窗和真实编辑器输入。测试不访问用户笔记或调用模型。组件样例矩阵并不等同于所有业务数据、浏览器和完整色彩对比度验收;不声称完成未执行的全页面截图或性能优化。
|
||||
|
||||
最终验证:56 个测试文件、323 项前端测试通过;生产构建通过。复扫结果:未接入共享样式的 details 为 0,误用 input 类的 textarea 为 0。
|
||||
@@ -0,0 +1,43 @@
|
||||
# 前端构建分块优化开发说明
|
||||
|
||||
> 更新日期:2026-09-06。基于 main 的 64af068 进行构建对比;以下结果为本地生产构建,不是网络耗时或性能评分。
|
||||
|
||||
## 当前方案
|
||||
|
||||
- Mermaid 由静态导入改成第一次渲染或校验图表时动态导入。复用加载 Promise,加载失败清除缓存以允许重试,主题初始化与渲染继续串行执行。
|
||||
- CodeMirror 基础模块、ProseMirror 和 Milkdown 分组缓存。仅显式选中的模块进入手动分组,不吸收所有传递依赖。
|
||||
- CodeMirror 语言解析器、全部 Shiki 语法和 Mermaid 图型继续按需加载。不能将所有语言打入 editor vendor,否则会反而增加编辑器的首次加载量。
|
||||
- KaTeX 按实际安装版本分组,避免合并项目版本和依赖内版本。不强制升级第三方依赖的数学解析器。
|
||||
- 启用 Vite manifest,并提供 build:report 脚本用于持续比较入口静态依赖。
|
||||
|
||||
## 构建观察
|
||||
|
||||
数值按十进制 kB 计算。静态闭包包括入口 JS 与递归 imports,去重后求和;不包含 CSS、字体、运行时动态导入或浏览器缓存。gzip 为每个 JS 文件压缩后求和,不代表服务器必然启用该压缩。
|
||||
|
||||
| 检查项 | 优化前 | 优化后 |
|
||||
| --- | --- | --- |
|
||||
| 聊天页静态 JS 闭包 | 约 1563.5 kB | 约 894 kB |
|
||||
| 聊天页闭包 gzip | 约 451.6 kB | 约 292 kB |
|
||||
| VisualMarkdownEditor 单包 | 约 1145.8 kB | 约 20 kB,核心依赖转入独立块 |
|
||||
| 首屏静态 JS 闭包 | 约 409.7 kB | 约 409 kB,基本不变 |
|
||||
|
||||
组件单包缩小不等于整个编辑器只需要 20 kB。编辑器仍需要加载基础框架、核心依赖和实际用到的语法。此次主要减少普通 Markdown 页对 Mermaid 的提前加载,并改善模块缓存边界;未测量真实启动耗时,不能声称首屏提速比例。
|
||||
|
||||
## 验证方法
|
||||
|
||||
在 frontend 目录执行:
|
||||
|
||||
```powershell
|
||||
pnpm build
|
||||
pnpm build:report
|
||||
pnpm test
|
||||
pnpm exec vite preview --host 127.0.0.1 --port 4173
|
||||
```
|
||||
|
||||
build:report 读取 dist/.vite/manifest.json,输出入口闭包大小与最大的 15 个 JS 块。对比时保存相同构建环境的两份输出;更新依赖后需重新测量。
|
||||
|
||||
本轮前端 345 项测试通过,类型检查及生产构建通过。已在生产预览打开工作区和真实 Mermaid 示例笔记,确认编辑器与 SVG 加载,未发现控制台 error。Shiki 全语言覆盖仍由既有语言测试检查。
|
||||
|
||||
## 保留的大块与边界
|
||||
|
||||
C++、Emacs Lisp 等语法、Oniguruma WASM、部分 Mermaid 图型及 Mermaid 核心仍可能超过 500 kB。这些资源保留按需加载,不裁减语言支持,也不提高警告阈值来隐藏问题。首次打开复杂图表或对应语言仍有加载成本;后续可基于真实请求和设备数据评估 Worker、资源预热及库版本升级。
|
||||
@@ -144,3 +144,11 @@ cd backend
|
||||
.venv/Scripts/python scripts/local-model-smoke.py qwen3-asr --download --audio C:/path/to/speech.wav
|
||||
.venv/Scripts/python scripts/local-model-smoke.py eres2netv2 --download --audio C:/path/to/speech.wav --reference C:/path/to/reference.wav
|
||||
```
|
||||
|
||||
|
||||
## 2026-09-05 长录音与 Provider 状态补充
|
||||
|
||||
- 附件上传上限为 128 MiB。超过 25 MiB 的音频必须明确选择 `local_only=true`;可联网任务仍限制为 25 MiB,前后端及路由均检查。解码时长仍限制为一小时。
|
||||
- 本地解码允许跳过少量损坏音频包,按包中可取得的时长补静音,并返回 `MEDIA_CORRUPT_PACKETS_SKIPPED:<数量>`。超过 100 个损坏包则失败;缺少有效包时长时无法承诺时间对齐,应结合原音频复核。此处理不能恢复丢失语音。
|
||||
- Provider 卡片显示“已启用/已停用”,支持直接启停。保存成功后更新状态;失败保留原状态。停用或保存期间禁用测试与刷新模型操作。
|
||||
- 37 分 16 秒的用户录音已完成 CUDA 转写、片段级说话人聚类、笔记生成、本地向量索引及检索命中。无参考标注,不报告准确率。详见《阶段F收尾验收记录》的长录音补充;此前短样本记录保留为历史证据。
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
# 工作区后台索引与保存开发说明
|
||||
|
||||
> 本文档用于团队开发和联调,说明 Web Workspace 的打开、保存与后台向量更新边界。
|
||||
>
|
||||
> 更新日期:2026-09-06。代码基线:`a5c44c4`,已随 PR #31 合并到 `main`。
|
||||
|
||||
## 当前实现
|
||||
|
||||
打开知识库和保存正文不再等待 Embedding 推理。Markdown 是正文载体;SQLite 元数据和 FTS 可先使用,向量结果随后更新。这里的后台任务是 AI Core 进程内的 asyncio 任务,不是独立队列服务,也不是 Tauri 后台服务。
|
||||
|
||||
| 操作 | 请求完成前 | 后台阶段 |
|
||||
| --- | --- | --- |
|
||||
| 打开 Vault | 校验配置路径;路径集合变化时登记新文件、删除失效记录并返回真实文件树 | 标记需要更新时自动全量计算向量 |
|
||||
| HTTP PATCH 保存笔记 | 写正文、解析元数据、更新 FTS、清理旧向量并持久化待处理标记 | 按笔记计算向量,核对版本后写入 |
|
||||
| 手动全量重建 | HTTP 请求仍等待全量重建结果 | 推理期间不持有 Vault 写锁,提交阶段原子替换 |
|
||||
|
||||
`note_service.update_note` 的 `defer_vectors` 默认仍为 `False`;HTTP PATCH 路由显式传入 `True`。创建、移动及其他内部调用不能据此宣称已经全部后台化。
|
||||
|
||||
## 代码入口
|
||||
|
||||
| 文件 | 职责 |
|
||||
| --- | --- |
|
||||
| `backend/app/services/workspace_service.py` | 文件登记、打开工作区、触发后台任务 |
|
||||
| `backend/app/services/note_service.py` | 正文保存、即时元数据与全文索引 |
|
||||
| `backend/app/services/index_service.py` | 后台任务去重、全量与单笔记向量更新、状态与关闭 |
|
||||
| `backend/app/services/coordination.py` | Vault 写入互斥 |
|
||||
| `frontend/src/features/vault/VaultEntry.vue` | 等待提示、超时错误及重试 |
|
||||
| `frontend/src/stores/editor.ts` | 保存快照、状态及连续输入补存 |
|
||||
| `frontend/src/components/common/AppShell.vue` | 每轮请求结束后间隔 5 秒刷新索引状态 |
|
||||
|
||||
## 一致性与恢复
|
||||
|
||||
- 文件登记和保存的待处理标记与索引写入使用同一 SQLite 事务。
|
||||
- `workspace_vectors_pending=1` 表示工作区全量向量需要更新;`note_vectors_pending:<note_id>=1` 表示该笔记有待处理工作。
|
||||
- 模型推理在写锁外执行;提交前重新核对磁盘快照或笔记记录。版本不一致时不写入旧结果,后台循环重新处理。
|
||||
- 保存接口成功后,“已保存”代表正文和全文索引已写入,不代表向量已经就绪。向量不可用期间,语义检索可能尚未覆盖刚保存的内容。
|
||||
- 模型失败保留待处理标记,正文不会因后台失败回滚。重新打开 Vault 可再次调度;不是保证持续重试的生产任务队列。
|
||||
- 关闭后端会取消进程内后台任务;持久化标记保留。任务详情、活动任务 ID 和错误信息仍主要保存在内存,重启后不会保留完整任务历史。
|
||||
- 前端保存期间继续输入时,当前请求完成后仍保持 dirty,并安排后续自动保存;落盘失败显示 save_failed。
|
||||
|
||||
## 状态与接口
|
||||
|
||||
`GET /api/index/status` 新增 `vector_refresh_required: boolean`,表示仍有待处理标记。它与 `status` 一起使用:失败、等待和运行中都可能需要向量更新。`pending_jobs` 不是百分比或剩余笔记数。
|
||||
|
||||
打开 Vault 请求超时为 15 秒;诊断和状态请求为 10 秒。超时表示前端停止等待,不保证服务端操作已经取消,不应因此认定保存成功或失败。
|
||||
|
||||
## 验证方法
|
||||
|
||||
在 backend 目录执行:
|
||||
|
||||
```powershell
|
||||
uv run pytest tests/test_workspace.py tests/test_workspace_background.py -q -p no:cacheprovider
|
||||
```
|
||||
|
||||
在 frontend 目录执行:
|
||||
|
||||
```powershell
|
||||
pnpm exec vitest run src/services/apiClient.spec.ts src/stores/editorSave.spec.ts
|
||||
```
|
||||
|
||||
回归覆盖:模型等待期间仍可打开工作区和创建目录、重复打开去重、快照变化重算、连续保存保留最新标题和标签、模型失败不回滚正文、重新打开恢复处理、请求超时及自动补存。
|
||||
|
||||
手动联调请使用测试 Vault:新增 Markdown 后打开;计算期间修改并保存两次;重新打开确认最后内容;在隔离配置中模拟模型不可用,核对正文保留与索引错误分别显示。
|
||||
|
||||
## 当前限制
|
||||
|
||||
路径登记按磁盘与数据库的路径集合判断变化,不等同于完整外部文件监听。多进程后台调度、生产任务队列、完整失败历史和原生文件监听属于后续工作。不要把当前进程内互斥用于推断多实例安全性。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 扩展安装持久化与社区包开发说明
|
||||
|
||||
> 本文档用于 Skill、Plugin 安装及社区示例包开发。
|
||||
>
|
||||
> 更新日期:2026-09-06。代码基线:`a5c44c4`;社区服务仍处于第三阶段规划。
|
||||
|
||||
## 当前实现
|
||||
|
||||
`backend/app/extensions/archive.py` 解析上传 ZIP,`installed.py` 为运行时增加本地安装日志。`extension-installations.sqlite3` 位于 data_dir 下,记录包路径、内容摘要、启用状态、插件授权及受管理目录;成功解压的包保存在 `extension-packages`,供后续命令读取。
|
||||
|
||||
| 环节 | 行为 |
|
||||
| --- | --- |
|
||||
| 安装 ZIP | 最大 10 MiB,解压总量最大 50 MiB,最多 2048 条目 |
|
||||
| 路径检查 | 拒绝目录穿越、链接、特殊文件、加密条目、重复及大小写冲突路径 |
|
||||
| 包布局 | 根目录或唯一顶层目录包含 skill.yaml / plugin.yaml |
|
||||
| 重启恢复 | 校验目录和内容摘要后恢复安装状态;插件恢复授权 |
|
||||
| 包内容变化 | 不自动启用变化后的包,需重新安装并检查权限 |
|
||||
| 卸载 | 受管理 ZIP 目录可清理;用户目录安装源不删除 |
|
||||
|
||||
安装持久化不等于操作系统级沙箱、签名验证或远程社区服务上线。生产隔离、社区发布治理与签名机制仍按第三阶段规划推进。
|
||||
|
||||
## 社区示例
|
||||
|
||||
源码与打包入口位于 `backend/extensions/community/`。`note-reviewer` 为笔记审阅 Skill,`markdown-workbench` 为可执行 Plugin。功能、安装和测试输入见该目录 README 与各包 README。
|
||||
|
||||
重新打包:
|
||||
|
||||
```powershell
|
||||
cd backend
|
||||
uv run python extensions/community/build_packages.py
|
||||
```
|
||||
|
||||
仅在需要更新社区示例产物时执行,并核对 dist 中 ZIP 和 index.json 是否与源码一致。
|
||||
|
||||
## 验证方法
|
||||
|
||||
在 backend 目录执行:
|
||||
|
||||
```powershell
|
||||
uv run pytest tests/test_extension_archive.py tests/test_installed_extensions.py tests/test_community_packages.py -q -p no:cacheprovider
|
||||
```
|
||||
|
||||
手动使用测试数据目录安装示例包,启用并调用;重启后端后确认状态恢复。对包副本修改内容再重启,应出现恢复失败提示。卸载目录安装包时,原目录应继续存在。
|
||||
|
||||
生产社区规划见 [第三阶段实施规划](../architecture/第三阶段实施规划.md),命令和设置接口见 [Plugin Command 与 Settings 开发说明](Plugin-Command与Settings开发说明.md)。
|
||||
@@ -0,0 +1,52 @@
|
||||
# 标题折叠与样式开发说明
|
||||
|
||||
日期:2026-09-06。范围为工作区写作模式的章节折叠,以及正文标题外观偏好。
|
||||
|
||||
## 1. 章节边界与交互
|
||||
|
||||
H1–H6 标题旁在悬停时显示统一折叠箭头;键盘聚焦也显示,触摸设备保持可见。章节从标题之后开始,结束于同一容器内下一个同级或更高级标题;末尾没有后续内容的标题不显示按钮。引用等容器中的标题只影响所在容器,不折叠外部正文。
|
||||
|
||||
- 工具栏使用单个按钮:有可见章节展开时显示“全部折叠”,否则显示“全部展开”。父章节隐藏的子章节不影响按钮判断,其自身折叠状态仍保留。无可折叠章节时按钮禁用。
|
||||
- 折叠父章节不会清空子章节的折叠状态。
|
||||
- 折叠时若选区在将隐藏的正文中,光标先移到标题。
|
||||
- 从大纲、查找或键盘跳到隐藏内容时,展开包含目标的章节,避免隐藏光标。
|
||||
- 折叠只影响当前编辑器视图,不修改 Markdown,不触发文档脏状态,也不占用撤销历史。重开文件恢复展开;源码模式与静态预览不进行章节折叠。
|
||||
|
||||
实现位于 `headingFolding.ts`:插件状态保存标题位置,通过事务映射跟随文档编辑;删除或改成正文的标题会从状态中清理。Decoration 隐藏完整块,widget 提供可聚焦的折叠按钮。章节范围按标题栈计算,并按不可变文档缓存;隐藏范围合并后遍历节点,避免每个节点重复扫描全部标题。
|
||||
|
||||
## 2. 标题样式设置
|
||||
|
||||
入口为“设置 → 编辑器 → 标题样式”,主题页“编辑器外观”中也提供同一组件。
|
||||
|
||||
- 默认跟随当前主题,不覆盖主题字号、字体与粗细。
|
||||
- 启用自定义后,分别调整 H1–H6 字号(12–72 px)和字重(400–800 的五个档位)。
|
||||
- 标题字体可跟随正文,或使用系统衬线、无衬线、等宽字体。
|
||||
- 面板即时预览,工作区正文和静态 Markdown 预览使用同一偏好。
|
||||
- 不影响笔记属性栏的标题、侧栏大纲字号或页面标题,不改写源文件中的标题级别。
|
||||
- “恢复跟随主题”清除自定义覆盖;主题页“恢复默认”也重置标题设置。
|
||||
|
||||
偏好由 `headingAppearance` store 保存到本机 `editor-heading-appearance`。读取时校验字体枚举、字重与字号范围;应用 CSS 前再次规范化,避免空输入、无效存储或异常大数影响布局。刷新后恢复设置,切换主题保留自定义偏好。用户显式启用的覆盖只作用于 Markdown 标题,优先于主题规则;颜色继续跟随主题。
|
||||
|
||||
## 3. 桌面命令预留
|
||||
|
||||
既有 `editorCommandService` v1 增加三个可执行 ID:
|
||||
|
||||
| 命令 | 行为 |
|
||||
| --- | --- |
|
||||
| editor.heading.toggle-fold | 切换选区所在章节的折叠状态 |
|
||||
| editor.heading.fold-all | 折叠所有有内容的章节 |
|
||||
| editor.heading.unfold-all | 展开所有章节 |
|
||||
|
||||
均不需要参数,沿用活动文档、模式与冲突检查。原生快捷键仍由第三阶段容器绑定,此处不注册系统级快捷键。
|
||||
|
||||
## 4. 验证
|
||||
|
||||
```sh
|
||||
cd frontend
|
||||
npm run test -- src/features/editor/headingFolding.spec.ts src/features/editor/VisualMarkdownEditor.spec.ts src/features/editor/HeadingStyleSettings.spec.ts src/stores/headingAppearance.spec.ts
|
||||
npm run build
|
||||
```
|
||||
|
||||
自动检查覆盖章节边界、嵌套容器、隐藏选区迁移、父子折叠状态、大纲目标展开、序列化保持、设置保存恢复、输入校验和面板恢复默认。
|
||||
|
||||
手动检查:打开“功能演示 / 01 Markdown 与大纲”,依次折叠 H2 与 H1,再从大纲跳转;确认隐藏内容重新显示。打开设置调整 H1 字号与 H2 粗细,返回笔记检查外观,刷新后检查偏好仍在;关闭自定义后依次切换六个主题核对主题原有样式。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 模型上下文管理
|
||||
|
||||
核对日期:2026-09-05。
|
||||
|
||||
Provider 表单按精确模型 ID 保存 `context_policies`,包含窗口、输出预留、触发比例、处理模式和摘要提示词。旧配置默认空列表,未配置模型保持原行为。窗口是用户设置的预算,不会改变厂商限制;同一厂商的不同模型、地域和部署不能共用推测的窗口规格。
|
||||
|
||||
## 请求行为
|
||||
|
||||
- 发送前对系统提示词、文本历史、工具定义、调用参数和输出格式进行 UTF-8 长度估算(字节数 / 2 向上取整,加 64)。这是启发式检测,不能替代厂商 tokenizer,也不能准确预测隐藏思考开销。
|
||||
- 输入预算为窗口减去输出预留;请求输出上限和自定义输出、思考参数会纳入预算。未指定输出上限时使用配置的输出预留。
|
||||
- 达到输入预算的触发比例后,“检测”模式停止请求并提示调整配置或新建会话。“压缩”模式额外调用当前模型,摘要仅替换本次请求中的旧历史,数据库原始记录不变。每次超阈值请求重新生成摘要,摘要调用单独计入用量。
|
||||
- 压缩保留系统消息和最近两个用户回合;只有两个回合时保留最新回合。摘要作为用户角色的参考材料,不提升为系统指令。
|
||||
- 无旧历史、附件、工具调用链、摘要请求超限、空摘要或压缩未缩短等情况停止,不截断原文、不循环重试。摘要失败仍可能产生已发生的厂商用量。
|
||||
- 流式聊天通过 `ContextStatus` 提示成功压缩,通过 `Error` / `Done` 提示检测失败。此实现不是厂商原生 compaction,也不通过缓存命中率判断是否压缩。
|
||||
|
||||
## 官方文档依据
|
||||
|
||||
表单提供对应文档链接。只有核对到精确模型 ID 的值用于建议;未识别型号显示可编辑的 32,768 初始预算,并明确其不是厂商规格。
|
||||
|
||||
| 预设 | 参考文档与限制 |
|
||||
| --- | --- |
|
||||
| OpenAI Chat / Responses | [上下文状态](https://developers.openai.com/api/docs/guides/conversation-state):输入、输出和推理共用模型窗口,原生压缩是独立功能。 |
|
||||
| Anthropic | [上下文窗口](https://platform.claude.com/docs/en/build-with-claude/context-windows)、[Compaction](https://platform.claude.com/docs/en/build-with-claude/compaction):原生压缩有独立的模型与接口约束。 |
|
||||
| DeepSeek | [模型规格](https://api-docs.deepseek.com/quick_start/pricing/):按实际模型核对窗口和输出上限,不根据缓存计数猜测压缩。 |
|
||||
| Ollama | [Context length](https://docs.ollama.com/context-length):实际窗口还受服务端配置和设备资源限制。 |
|
||||
| Kimi | [Chat API](https://platform.kimi.com/docs/api/chat):按具体模型核对请求限制。 |
|
||||
| 百炼 Qwen | [文本模型](https://help.aliyun.com/zh/model-studio/text-generation-model):型号和地域影响上下文、输入、输出限制。 |
|
||||
| 智谱 GLM | [模型概览](https://docs.bigmodel.cn/cn/guide/start/model-overview):按具体模型填写。 |
|
||||
| 火山方舟 | [官方文档入口](https://www.volcengine.com/docs/82379):接入点需以实际部署型号为准,本次不预填统一容量。 |
|
||||
| 硅基流动 | [文本生成](https://docs.siliconflow.cn/docs/userguide/capabilities/text-generation):各模型 context_length 不同,以模型广场为准。 |
|
||||
| 百度千帆 | [上下文管理](https://cloud.baidu.com/doc/qianfan-docs/s/Imkdq47r5):部分思考模型 max_tokens 仅限制回答,max_completion_tokens 包含思考。 |
|
||||
| 腾讯混元 | [官方产品动态](https://cloud.tencent.com/document/product/1729/97765):不同型号存在独立输入、输出限制,不预填厂商统一容量。 |
|
||||
| MiniMax | [OpenAI 兼容接口](https://platform.minimaxi.com/docs/api-reference/text-openai-api):M3 为 1,000,000;文档列出的 M2.x 为 204,800。仅对列出的精确 ID 提供建议。 |
|
||||
| 阶跃星辰 | [模型概览](https://platform.stepfun.com/docs/zh/guides/models/overview):按实际型号核对。 |
|
||||
|
||||
## 验证范围
|
||||
|
||||
离线测试覆盖预算触发、模型隔离、无副作用压缩、工具历史保护、单条输入超限、无效摘要、输出覆盖参数、流式错误事件以及配置校验。前端覆盖保存恢复与切换地址清理配置。没有调用用户的真实厂商账号进行收费验收。
|
||||
|
||||
|
||||
## 全局人设
|
||||
|
||||
`GET /api/settings/persona` 和 `PUT /api/settings/persona` 管理此 AI Core 的唯一全局人设,保存在 SQLite 中。包含名称、系统提示词、结构化 user/assistant 对话对和乐观锁版本。设置页“通用”及聊天页均可打开同一表单。头像仍仅保存在本机浏览器。
|
||||
|
||||
所有通过 ProviderFactory 创建的模型调用(普通对话与智能体、流式与非流式)在上下文预算检查前读取最新全局配置,将非空系统人设与对话示例追加到调用方原有系统提示词,保留 RAG 和任务约束。浏览器不再拼接本地人设,因此不会因更换浏览器丢失或重复注入。清空并保存后不再注入。厂商测试推理同样经过此边界;应用内部的历史摘要生成使用独立摘要提示词,避免人设干扰摘要格式。Mock 演示适配器不模拟真实系统提示词执行效果。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 第二阶段补充验收工具
|
||||
|
||||
这些工具补充证据采集,不以生成报告代替验收。没有标注的录音不能计算准确率;连接测试通过也不等于 Provider 全协议通过。
|
||||
|
||||
## 本地开发启动与扩展恢复
|
||||
|
||||
在 backend 目录执行 `.venv/Scripts/python.exe scripts/dev-server.py`。热重载仅监听 app,ZIP 解压目录不触发重载。
|
||||
|
||||
扩展安装库为应用数据目录下的 extension-installations.sqlite3。重启恢复前校验包摘要;包缺失或变化不会沿用原权限启动,管理页显示恢复提示。重新安装前需检查文件和权限。ZIP 卸载仅清理由导入器登记的管理目录,从目录安装不会删除用户源码。
|
||||
|
||||
## 转写参考数据评分
|
||||
|
||||
参考与预测文件均为 UTF-8 JSON 数组,每条包含秒单位的 start、end、text、speaker。参考必须来自人工校对或获准标注集,不能把同一份模型输出复制为参考。
|
||||
|
||||
也支持应用作业 JSON 的 segments 数组以及原生 start_time / end_time 字段,时间单位仍为秒。
|
||||
|
||||
```json
|
||||
[{"start": 0, "end": 2.5, "text": "你好 世界", "speaker": "speaker_A"}]
|
||||
```
|
||||
|
||||
```powershell
|
||||
.venv/Scripts/python.exe scripts/score-transcript.py reference.json hypothesis.json --output scores.json
|
||||
```
|
||||
|
||||
报告只保存聚合分数,不保存正文。CER 做 NFC 归一化并忽略空白;WER 按空白分词,中文连续文本优先看 CER。大小写和标点保留。空参考拒绝评分;空文本分母显示 null,不冒充 0%。比较超过 2000 万单元时拒绝,需分成较短且分别人工标注的录音进行验收。
|
||||
|
||||
说话人评分按全时间轴、零 collar、包含重叠语音计算 DER,使用一对一最优说话人映射,不要求预测编号与参考编号相同。最多 12 个说话人 ID;缺标签时不可用。该口径必须随结果保留,不能与不同 collar/UEM 规则的第三方分数直接比较。
|
||||
|
||||
脚本不设虚构达标阈值,quality_gate 固定 not_evaluated。阈值需在验收集和任务要求确定后另行批准。FAR/FRR 属于说话人验证专项,不能用这里的 DER 代替。当前 ASR 仍无逐字强制对齐和重叠分离,不因可对重叠参考评分就变成支持这些能力。
|
||||
|
||||
## Provider 专项证据
|
||||
|
||||
```powershell
|
||||
.venv/Scripts/python.exe scripts/provider-acceptance.py --provider 已配置ID --model 已配置模型ID --output provider-plan.json
|
||||
```
|
||||
|
||||
默认只生成待验收矩阵,不调用厂商。确认测试账号及可能费用后添加 `--execute`,经本地 AI Core 执行一次连接测试,不读取密钥,也不保存远端原始错误、请求头或响应正文。最多一次测试请求,不自动重试。
|
||||
|
||||
模型发现、工具往返、思考/正文流、取消、缓存命中/未命中、上下文限制、压缩仍逐项 pending,需要专门真实场景补证。overall 保持 not_accepted,禁止仅凭连接成功签署全部通过。当前用户录音无标注、各厂商专项未完整实测的状态保持不变。
|
||||
|
||||
## 浏览器回归
|
||||
|
||||
启动 frontend 后打开 `/tests/visual/mermaid-matrix.html`,使用真实 Mermaid 服务串行渲染 6 种图型 × 6 种内置/社区主题;顶部给出完成数和逐项结果。`?theme=paper-moments` 可单独检查该主题的最终外观。
|
||||
|
||||
该矩阵检查 SVG、可见尺寸、文本存在和错误;不把 DOM 文本存在当成所有字形都可见的截图结论。还需观察大图、缩放与窄屏。`/tests/visual/index.html?case=dialog` 用于弹窗内部滚动与焦点;主题预览样例涵盖输入、下拉、折叠、卡片、表格与代码。
|
||||
@@ -0,0 +1,90 @@
|
||||
# 警告框与桌面编辑命令开发说明
|
||||
|
||||
日期:2026-09-06。范围为前端渲染与命令边界;不包含 Tauri IPC、原生菜单或系统级快捷键注册。
|
||||
|
||||
## 1. 格式与渲染
|
||||
|
||||
使用引用块语法。GitHub 的 NOTE、TIP、IMPORTANT、WARNING、CAUTION 均可渲染;同时支持 Obsidian 的常用类型、别名、标题、嵌套与折叠。
|
||||
|
||||
```markdown
|
||||
> [!WARNING]- 自定义标题
|
||||
> 提示正文,支持 **粗体**、`行内代码`、列表等 Markdown。
|
||||
>
|
||||
> > [!TIP]+ 嵌套提示
|
||||
> > 展开内容
|
||||
```
|
||||
|
||||
无 `+` / `-` 时不可折叠;`+` 默认展开,`-` 默认折叠。点击折叠只改变本次显示状态,不自动改写源文件中的默认状态。标题作为文本显示,不执行 HTML。未知类型使用 note 外观并保留类型名。
|
||||
|
||||
| 规范类型 | 兼容别名 |
|
||||
| --- | --- |
|
||||
| note | — |
|
||||
| abstract | summary、tldr |
|
||||
| info、todo | — |
|
||||
| tip | hint |
|
||||
| important | — |
|
||||
| success | check、done |
|
||||
| question | help、faq |
|
||||
| warning | caution、attention |
|
||||
| failure | fail、missing |
|
||||
| danger | error |
|
||||
| bug、example | — |
|
||||
| quote | cite |
|
||||
|
||||
工作区顶部“提示框”选择器可插入模板。编辑器保留原生 blockquote 文档节点,以 NodeView 展示标题与折叠按钮,装饰隐藏标记;选区进入标记时显示原文以便修改。序列化仅取消引用首行提示标记的转义,避免保存后退回普通引用。代码中的标记不转换。写作模式会规范化 Markdown 转义;需要永久展示字面标记时使用行内代码或围栏代码。
|
||||
|
||||
静态预览使用 marked 的 blockquote renderer,折叠使用原生 details / summary,内容仍经过 DOMPurify。两个入口共享 `callouts.ts` 与 `callouts.css`;颜色继承主题的 info、warning、success、error、surface 和 text 变量,不另存固定浅色配色。因此已有主题和符合主题规范的导入主题均可继承。
|
||||
|
||||
## 2. 桌面命令边界 v1
|
||||
|
||||
入口:`frontend/src/services/editorCommandService.ts`。
|
||||
|
||||
- `editorCommandVersion`:当前版本 1。
|
||||
- `getEditorCommandCapabilities()`:返回每个稳定命令 ID 的 supported 与 enabled。预留 ID 不等于已经实现。
|
||||
- `executeEditorCommand(id, params?)`:返回 `{ ok: true }` 或 `{ ok: false, reason }`。reason 为 unsupported、unavailable、invalid-params、failed。
|
||||
- `registerEditorCommands(target)`:由活动编辑器注册处理器,返回注销函数。旧组件注销不清除替代组件的注册。
|
||||
|
||||
成功表示处理器接受并执行了命令;具体格式操作仍遵循编辑器的选区规则。命令不直接写磁盘,变更进入既有脏状态、撤销与自动保存链路。无活动文件、源码模式、只读、冲突、编辑器加载中或文件已切换时禁用当前处理器。
|
||||
|
||||
| 已接入 ID(统一加 editor. 前缀) | params |
|
||||
| --- | --- |
|
||||
| bold、italic、ordered-list、bullet-list、inline-code、code-block、inline-math、math-block、paragraph | 无 |
|
||||
| heading | 整数 1–6 |
|
||||
| font-size | 有限数值 8–96,单位 px;作用于选区 |
|
||||
| insert-markdown | 非空 Markdown 字符串,最多 100000 字符 |
|
||||
| callout | `{ type, title?, body?, fold? }`;fold 为空串、+ 或 -;标题不可换行 |
|
||||
|
||||
目录还预留删除线、任务列表、引用、Mermaid、链接、图片、表格、分隔线、硬换行、引用式链接、HTML、撤销/重做,以及 `editor.import-note-properties`、`editor.metadata.edit`、`editor.metadata.title`、`editor.metadata.tags`。这些单独的处理器尚未接入,返回 unsupported;现阶段复杂格式可通过 insert-markdown 插入。元数据不得通过普通正文插入接口冒充属性导入。
|
||||
|
||||
第三阶段由 Host 将原生菜单/快捷键映射到上述 ID。快捷键表需支持平台差异与用户改键,过滤表单、输入法组合与弹窗焦点;不要重复绑定浏览器和 Milkdown 已有按键。宿主只能调用允许的命令,不执行任意脚本。元数据处理器须按已有桌面需求完成无损 YAML 合并、版本检查、冲突提示及属性/正文一并撤销后才可标记 supported。
|
||||
|
||||
## 3. 验证方法
|
||||
|
||||
在 frontend 运行:
|
||||
|
||||
```sh
|
||||
npm run test -- src/utils/callouts.spec.ts src/services/editorCommandService.spec.ts src/features/editor/VisualMarkdownEditor.spec.ts
|
||||
npm run build
|
||||
```
|
||||
|
||||
- callouts:逐个类型与别名、大小写、嵌套、默认折叠、空正文、未知类型、标题注入、普通引用和代码排除。
|
||||
- 编辑器:初始解析、直接输入标记、按钮折叠、序列化往返、命令参数校验和冲突禁用。
|
||||
- 命令服务:能力查询、无活动目标、未知命令、未实现命令和旧目标注销隔离。
|
||||
- 启动开发服务器,访问 `/tests/visual/callouts.html?theme=paper-moments`;依次替换 light、dark、sepia、ocean-blue、midnight-purple。左右分别是工作区和静态预览,核对边框、标题、正文、嵌套与折叠;缩窄窗口检查换行。
|
||||
|
||||
此项不宣称支持所有 Markdown 方言;脚注、定义列表、Wiki 双链及 `:::` 等其他警告框语法仍需独立扩展。原生快捷键和元数据转换属于第三阶段验收。
|
||||
|
||||
## 4. 六主题适配补充
|
||||
|
||||
主题新增 `--color-callout-info/success/warning/danger/important/quote` 六个语义变量。每种类型继续使用共享组件结构,标题、边框与淡色背景取同一语义配色。未知导入主题未定义这些变量时,默认继承其已有状态色。折叠标题补齐悬停、键盘焦点与不可折叠标题状态。
|
||||
|
||||
| 主题 | 本次版本 | 外观 |
|
||||
| --- | --- | --- |
|
||||
| light、dark、sepia | 1.2.0 | 分别使用浅色、深色、暖色配色 |
|
||||
| paper-moments | 1.7.0 | 纸张边框、虚线内描边和轻投影;嵌套取消重复投影 |
|
||||
| ocean-blue | 1.4.0 | 海蓝与低亮度状态色 |
|
||||
| midnight-purple | 2.2.0 | 深色表面与高亮度状态色 |
|
||||
|
||||
修正工作区基础选择器覆盖类型颜色的问题,默认色使用低优先级规则。社区预览 iframe 同步载入共享 callouts CSS,并展示 14 种规范类型、默认展开/折叠及嵌套样例。主题安装与预览使用同一 CSS 来源,纸间时光下载包的清单和样式同步更新;已安装旧版可通过主题页既有更新入口升级。
|
||||
|
||||
验证增加六主题 × 六配色在实际 8% 混色背景上的标题对比度检查(至少 4.5:1),工作区选择器覆盖回归,以及六主题预览结构检查。此检查针对不透明 sRGB 配色,不代替每个平台的字体与截图验收。
|
||||
@@ -47,9 +47,29 @@ CPU 与 CUDA 分别创建隔离 Vault、附件目录和 SQLite,只读取固定
|
||||
|
||||
## 未关闭的专项验收
|
||||
|
||||
- 带参考转写和说话人标注的真实课程长录音尚未提供,不能报告 CER/WER、DER、阈值或长音频吞吐达标。
|
||||
- 已提供无标注长录音,CUDA 功能与单次耗时验证见下文。参考转写和说话人标注仍缺失,不能报告 CER/WER、DER、阈值或业务吞吐达标。
|
||||
- 现阶段时间戳为片段级;逐字强制对齐、同段多人/重叠语音仍未实现,不将片段聚类视为完整说话人分离。
|
||||
- 外部供应商特殊 JSON 的兼容性,需要在目标账号和模型上点击实际推理验证;离线协议通过不替代厂商验收。
|
||||
- Tauri/Rust Host 和生产 MCP 沙箱按后续阶段安排;本轮数据持久化在后端 SQLite/Vault,为桌面集成保留稳定接口。
|
||||
|
||||
结论:阶段 F 本轮工程收尾已实现并完成 CPU/CUDA 功能验收;上述质量及外部服务专项保持待验收状态,不标记为全部通过。分支仍需独立审阅后决定合并。
|
||||
|
||||
|
||||
## 2026-09-05 长录音补充验收
|
||||
|
||||
用户授权使用本机 CUDA,只做本地处理。使用隔离的 SQLite、附件目录与 Vault,读取已安装的固定 revision 权重;原音频、转写正文和独立运行报告保留在被忽略的 `.local-plans`,不入库。
|
||||
|
||||
| 观察项 | 本次结果 |
|
||||
| --- | --- |
|
||||
| 输入 | MP3,89,424,101 字节,2235.60 秒(约 37 分 16 秒) |
|
||||
| 转写与片段聚类 | completed;441 个片段,5 个说话人聚类 |
|
||||
| 两环节总耗时 | 约 661 秒(轮询含最多约 10 秒误差),RTF 约 0.296 |
|
||||
| Qwen3-ASR 实际设备 / 加载 / 推理 | cuda:0 / 10.52 秒 / 607.78 秒 |
|
||||
| ERes2NetV2 实际设备 / 加载 / 推理 | cuda:0 / 3.97 秒 / 28.88 秒 |
|
||||
| 后续链路 | Markdown 笔记生成、本地 Bekko 索引、向量检索命中均通过 |
|
||||
| 隐私标记 | 导出笔记保留 `embedding_local_only: true` |
|
||||
| 警告 | 1 个损坏音频包按时长补静音;说话人结果为片段级 |
|
||||
|
||||
最初实测暴露了 25 MiB 限制和单个损坏 MP3 包导致整任务失败,已修复并用同一输入重新跑通。5 个聚类不是已确认的真实人数;没有参考转写或说话人标注,因此不计算 CER/WER、DER 或 FAR/FRR。单次耗时也不作为跨设备吞吐承诺。逐字对齐、重叠语音和目标厂商真实验收仍未关闭。
|
||||
|
||||
本轮自动化基线:后端 577 项、前端 280 项通过,前端类型与生产构建通过;构建仍有既有大 chunk 提示。离线 Provider 测试不代替目标账号实测。
|
||||
|
||||
Reference in New Issue
Block a user