本页是以下集成运行时的契约级参考:
- Godot Path Mode 客户端,
- 嵌入式/完整 NoteMD 工作流,
- Markdown 索引/分块/渲染管线。
- Sidecar HTTP:
http://127.0.0.1:<port>(默认3000) - PathBridge WS:
ws://127.0.0.1:<bridgePort>(默认9876) - 运行时清单字段:
baseUrlbridgeWsUrlauthTokenportbridgePort
若配置了 NOTE_CONNECTION_AUTH_TOKEN:
- 所有
/api/*路由受保护, - 图谱产物文件受保护,
- token 可通过以下任一方式传递:
X-NoteConnection-Token,Authorization: Bearer <token>。
Godot WS 的 identify 载荷也可携带 token。
GET /api/notemd/settings- 成功返回:
success: truesettings: NotemdSettingsoperationSummary: { total, running }
- 成功返回:
POST /api/notemd/settings- body:完整 settings 对象,或
{ settings: ... } - 成功返回:
{ success: true, settings }
- body:完整 settings 对象,或
GET /api/notemd/workspace- 成功返回:
{ success: true, workspace } - workspace 字段:
filePathfolderPathoutputFilePathoutputFolderPath
- 成功返回:
POST /api/notemd/workspace- body:
workspacepatch 或直接 patch 对象 - 支持 workspace 字段的 camel/snake 别名
- 成功返回:
{ success: true, workspace }
- body:
GET /api/path-mode/settings- 成功返回:
{ success: true, settings }
- 成功返回:
POST /api/path-mode/settings- body:
{ settings: ... }或直接设置对象 - 成功返回:
{ success: true, settings }
- body:
path_mode 归一化约束:
bg_brightness:0.01..10.0reading_mode:window | fullscreenreader_render_mode:render | sourcereader_media_scale:0.1..3.0node_spacing:100..600
GET /api/frontend/settingsPOST /api/frontend/settings
frontend_settings.reading 归一化约束:
markdown_engine:legacy | pulldown | autochunk_block_size:1..4096prefetch_blocks:0..1024index_cache_ttl_sec:5..86400max_doc_bytes:262144..2147483648
所有 markdown 响应都包含 markdownProtocolVersion(当前基线 1.0.0)。
请求体:
{
"filePath": "E:/.../Knowledge_Base/Topic/a.md",
"forceRebuild": false
}成功载荷:
success: trueindexIdfilePathfileVersiontotalBytestotalLinesblocksSummary: { totalBlocks, chunkBlockSize }anchorsSummary: { count }wikiLinksSummary: { count }engine: legacy | pulldown- 可选
fallbackReason markdownProtocolVersion
错误条件:
400:缺少filePath403:访问被拒绝(KB 沙箱/鉴权)404:文件不存在500:运行时/worker 错误
请求体:
{
"indexId": "<index-id>",
"startBlock": 0,
"blockCount": 36
}成功载荷:
success: trueblocks[](包含文本切片与块范围)nextStartBlockhasMoremarkdownProtocolVersion
错误条件:
400:缺少indexId500:索引丢失/过期或其他服务端错误
请求体:
{
"nodeId": "vector-space",
"currentFilePath": "E:/.../current.md"
}成功载荷:
success: truefilePathindexIdtargetBlockIdstartLineendLine- 可选
anchorId markdownProtocolVersion
错误条件:
400:缺少nodeId403:访问被拒绝404:文件不存在500:节点无法解析或服务端错误
请求体:
{
"wikiTarget": "Knowledge Base#Heading|Alias",
"currentFilePath": "E:/.../current.md"
}成功载荷:
success: truefilePathindexId- 可选
targetBlockId - 可选
anchorId matchType: exact | alias | heading | fallback- 可选
candidates[] markdownProtocolVersion
错误条件:
400:缺少wikiTarget或currentFilePath403:访问被拒绝404:文件不存在500:服务端错误
长任务在服务端维护操作状态:
- 生命周期:
running -> done | cancelled | error - 取消接口:
POST /api/notemd/cancel,携带operationId
取消返回语义:
400缺少operationId404未找到操作200success: false(操作已非运行态)200success: true(取消成功)
满足以下任一条件即开启流式:
- 请求
Accept包含text/event-stream,或 - query 包含
stream=1。
SSE 事件类型:
operationstatuslogwarningerrordone
POST /api/notemd/test-llm- body:
{ providerName? }
- body:
POST /api/notemd/process-file- body:
{ filePath, outputPath?, createConceptNotes?, dryRun?, operationId? }
- body:
POST /api/notemd/process-folder- body:
{ folderPath, outputFolderPath?, createConceptNotes?, dryRun?, operationId? }
- body:
POST /api/notemd/generate-content- body:
{ title?, filePath?, context?, outputPath? }
- body:
POST /api/notemd/translate-file- body:
{ filePath, targetLanguage?, outputPath? }
- body:
POST /api/notemd/translate-folder- body:
{ folderPath, targetLanguage? }
- body:
POST /api/notemd/fix-mermaid- body:
{ filePath, inPlace? }
- body:
POST /api/notemd/fix-formulas- body:
{ filePath, inPlace? }
- body:
POST /api/notemd/check-duplicates- body:
{ filePath }
- body:
POST /api/notemd/extract-concepts- body:
{ filePath, operationId? },支持 SSE
- body:
POST /api/notemd/one-click-extract- body:
{ filePath, operationId? }
- body:
POST /api/notemd/batch-fix-mermaid- body:
{ folderPath, inPlace? }
- body:
POST /api/notemd/generate-folder-content- body:
{ folderPath }
- body:
安全不变量:
- 文件/目录路径在 I/O 前必须通过 KB 根路径沙箱校验。
请求字段:
source(必填)displayMode(默认 true)maxWidth、maxHeight、renderScale(可选)
返回包含 pngBase64 与尺寸信息的渲染结果。
请求字段:
source(必填)- 可选:
maxWidth、maxHeight、renderScaleincludeStages、includeSvgrenderer(frontend|bridge|local|auto)
运行时行为:
- 非显式
local时优先 frontend bridge 渲染, auto模式下 frontend 不可用则回退本地resvg。
Obsidian 兼容性基线:
- Mermaid 的权威输入格式为 fenced Markdown:
- 起始 fence 独占一行:三个反引号后接
mermaid - 结束 fence 独占一行:三个反引号
- 起始 fence 独占一行:三个反引号后接
- 该基线必须在 markdown 索引/分块管线,以及 Godot/Web Reader 渲染链路中持续兼容。
- 数学分隔符后立即拼接 Mermaid 起始 fence 的同行模式属于 malformed 内容(非标准 fenced 起始),预期会导致块类型识别失败。
- 推荐修复方式:将数学分隔符与 Mermaid 起始 fence 拆成两行,或执行:
npm run fix:markdown:mermaid:fence -- Knowledge_Base/testconcept
- Reader 运行时快速自检:打开 Markdown 阅读器时,渲染前会对这类数学分隔符加 Mermaid fence 的同行拼接做轻量自动修复。
POST /api/clipboard/image-binary- raw PNG body
- 成功:
{ ok: true, transport: "binary" }
POST /api/clipboard/image- JSON
{ pngBase64 } - 成功:
{ ok: true }
- JSON
接受并归一化的消息类型包括:
openNotemd/open_notemd-> 广播openNotemdexitPathMode-> 广播exitPathModerequestAppShutdown/request_app_shutdown-> 广播requestAppShutdownsetWindowVisible-> 广播setWindowVisible
前端 path_app.js 行为:
openNotemd触发嵌入式/完整 NoteMD 打开路径。exitPathMode恢复图谱主视图(配置允许时同步恢复 Tauri 窗口)。requestAppShutdown在可用时调用 Tauri 关闭命令。
Godot Mermaid 消费必须保持 PNG 优先:
- 运行时显示路径必须有
pngBase64, - SVG 仅可用于诊断,
- 不允许存在 SVG-only 的 Godot 运行时回退链路。
这是硬性兼容规则,原因是 Godot 在不同设备/运行时上的 SVG 稳定性不足。
当变更上述任一端点/消息时:
- 同步更新
docs/diataxis下 EN 与 ZH 文档, - 请求/响应示例必须与真实字段同步版本化,
- 必须保留文件/目录输入的 KB 沙箱校验,
- 必须保留受保护路由的 auth-token 行为,
- 必须保留长任务的 NoteMD 取消 + SSE 语义,
- 必须保留 markdown 响应中的协议版本字段。