思源笔记 v3.7.0 版本详解:CLI 命令行、内核插件系统与 AI 知识库的源码级解读
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
本文基于思源笔记(SiYuan)v3.7.0 中文变更记录(app/changelogs/v3.7.0/v3.7.0.zh-CN.md)撰写,系统梳理这一"全面焕新"版本的五大核心方向——界面重设计、移动端速记、内核插件系统、命令行接口与 AI 知识库,并结合当前仓库中 kernel/cli、kernel/plugin、kernel/agent 等目录的源码实现,说明每一项能力在代码层面如何落地,帮助读者完整掌握该版本的功能边界与自动化集成方案。
版本总览:一次面向"人与智能体协作"的焕新
v3.7.0 的官方概述用五个关键词概括了本次版本的主题:更美观的界面、更强的扩展能力、以及朝智能化方向的关键一步。具体包括:
| 核心方向 | 一句话定位 | 仓库中的对应实现 |
|---|---|---|
| 重新设计的用户界面 | 整体更美观,视觉层级更清晰 | app/assets 中的前端样式与 app/appearance/themes 主题体系 |
| 移动端速记 | 长按应用图标即开即写,保存为带时间戳的笔记,路径可自定义 | kernel/cli/cmd/inbox.go、app/src/layout/dock/Inbox.ts |
| 内核插件系统 | 插件常驻内核运行,成为单一数据源,消除多窗口数据冲突 | kernel/plugin 目录(goja 运行时、RPC、沙箱) |
| 命令行接口 | 无需启动图形界面直连内核数据层,支撑脚本与自动化 | kernel/cli/cmd 下 26 个命令文件 |
| AI 知识库 | 智能体与嵌入向量搜索进入公开测试 | kernel/agent、kernel/model/embedding.go |
重新设计的用户界面
本版本对整体界面进行了重设计:视觉层级更清晰,并引入了新的默认外观图标与新的默认外观主题,同时配套全新的设置界面(对应"新的设置界面"引入特性)。
从仓库结构看,界面焕新的落点包括:
- 主题文件位于 app/appearance/themes/daylight 与 app/appearance/themes/midnight,每个主题目录包含
theme.css与元数据json,是内置主题的存放位置; - 前端外观样式集中在 app/assets(50 余个 SCSS 文件),编辑器核心样式在 app/stage/protyle;
- 变更记录中还有大量与界面交互相关的细节改进,例如"合并顶部标题栏和标签栏""改进外观底部停靠栏""改进拖拽块时显示的工具提示""块标支持在上方或下方快速插入块"等,均属于本次界面焕新的组成部分。
移动端速记:长按图标即开即写
官方描述:灵感来时,长按应用图标即可即开即写,内容保存为带时间戳的笔记,保存路径可自定义,碎片想法不再溜走。
从源码结构看,速记(Shorthand)相关的配置类型定义在 app/src/types/config.d.ts 中,而收集箱(Inbox)作为碎片内容的汇集地,其桌面端实现见 app/src/layout/dock/Inbox.ts,CLI 侧则提供 kernel/cli/cmd/inbox.go 供脚本读取收集箱内容。本次版本同时修复了 Android 上引用不可用的问题、改进了 Android 上的内核后台进程,移动端"跟随系统锁屏"选项也是这一版的产物。
内核插件系统:以内核为单一数据源
这是 v3.7.0 最具架构意义的变化:插件从"渲染进程内的扩展"迁移为"常驻内核运行的组件",作为单一数据源使多个窗口和实例之间始终保持一致,彻底告别多窗口场景下的数据冲突。
从 kernel/plugin 目录的实现可以看到其骨架:
- kernel/plugin/plugin.go 基于
goja(JavaScript 引擎)构建插件运行时,定义了插件状态机(ready / loading / running / stopping / stopped / error),并通过两个 EventBus 主题与内外通信:plugin(到内核插件层)与runtime(到 JavaScript 运行时); - kernel/plugin/manager.go 负责插件的生命周期管理,
serve子命令启动时会以go plugin.InitManager()方式异步拉起(见 kernel/cli/cmd/serve.go 第 88 行); - kernel/plugin/api_rpc.go 与 kernel/plugin/rpc.go 提供 RPC 方法注册与调用通道,
RpcMethod结构体将 JS 侧goja.Callable暴露给内核调用; - kernel/plugin/sandbox.go 提供沙箱能力,kernel/plugin/api_secrets_vars.go 让插件可以安全地引用下文所述的密钥与变量。
对插件开发者而言,本次版本还带来多项改进:插件安装、卸载、启用或禁用后全局快捷键注册/注销失效的问题被修复,addDock允许在任意生命周期阶段调用,LocalStorage 相关 API 得到改进,并新增了"提供用于导出文件的插件函数"。
命令行接口:不启动界面直连数据层
官方定位:无需启动思源即可直连内核数据层,可用于脚本与自动化任务,例如批量导入导出、定时处理、外部系统集成。
命令组织与全局参数
CLI 实现位于 kernel/cli/cmd,基于 cobra 构建,根命令定义在 kernel/cli/cmd/root.go。所有子命令共享四个全局参数:
| 参数 | 简写 | 说明 |
|---|---|---|
--workspace | -w | 工作空间路径;缺省时依次取环境变量SIYUAN_WORKSPACE_PATH,再取默认值~/SiYuan |
--format | -f | 输出格式:table(默认)或json,便于脚本解析 |
--dry-run | - | 干跑模式:只校验并打印将要执行的操作,不做实际变更 |
--log-level | -v | 日志级别:off / trace / debug / info / warn / error / fatal;CLI 一次性命令默认 warn |
初始化流程(root.go 的PersistentPreRunE)会先探测工作目录(必须包含appearance/langs,兼容打包后的resources/与开发态布局),随后依次初始化配置、三个 SQLite 数据库(主库、历史库、资产内容库),并调用model.PrepareEmbeddingSearch()让一次性命令也能命中语义搜索——因为语义索引器StartEmbeddingIndexer是常驻死循环,不适用于立即退出的 CLI 进程,故 CLI 走的是"只检查表与配置、不启动后台循环"的轻量路径(见 kernel/model/embedding.go 第 120-122 行注释)。
命令执行完毕后的PersistentPostRunE会统一调用model.FlushTxQueue()与sql.FlushQueue()落库——CLI 单次命令没有后台 cron 定期 flush 机制,这一步保证"写完即可搜索"(kernel/cli/cmd/root.go 第 46-59 行)。
子命令覆盖面
从各命令文件的Use声明可以梳理出完整的子命令体系,足以覆盖日常自动化场景:
- block:
get / children / breadcrumb / dom / kramdown / stat / insert / append / prepend / update / delete / move / batch-get / batch-kramdown(kernel/cli/cmd/block.go); - search:
search <query>,支持全文、语义与资产文件内容检索(kernel/cli/cmd/search.go); - document / notebook / dailynote / database / ref / tag / outline / template:文档与笔记本 CRUD、日记、数据库块、块引用、标签、大纲、模板;
- import / export / file / asset / history / sync / system / sql / workspace:导入导出、文件与资产、历史快照、同步、系统信息与只读 SQL 查询。
其中search子命令的参数设计最能体现"与界面搜索对齐"的思路(见 kernel/cli/cmd/search.go 第 205-214 行):
# 关键词/SQL/正则/语义四种搜索方式,0=keyword 1=query-syntax 2=sql 3=regex 4=semantic --method, -m 0 # 笔记本 ID 过滤(可重复) --notebook, -n # 块类型过滤(可重复):document heading paragraph list listItem codeBlock mathBlock table ... --type, -t # 块子类型过滤:o u t --subtype # 排序:0=type 1=created-asc 2=created-desc 3=updated-asc 4=updated-desc 5=content 6=relevance-asc 7=relevance-desc --order-by, -o # 分页 --page, -p加密笔记本的安全边界
一个值得注意的实现细节:CLI 在入口处通过rejectEncryptedNotebookCLI显式拒绝针对加密笔记本的一切操作(检查notebook / box / id / ids / parent / previous / block等标志及文件路径),报错信息为 "CLI does not support encrypted notebook"(kernel/cli/cmd/root.go 第 124-194 行)。从源码注释看,其意图是避免 CLI 进程成为密文文件的旁路入口——加密笔记本只能通过应用内专用流程解锁和操作。
破坏性变更:内核服务需显式serve子命令
这是 v3.7.0 唯一的"破坏性变更":内核服务现在需要显式使用serve子命令启动。对应实现见 kernel/cli/cmd/serve.go:serve命令携带了原来内核直启的全部参数,并绕过根命令的一次性初始化,走完整的util.BootWithFlags启动流程:
--wd 工作目录(默认为内核可执行文件所在目录的上一级) --port HTTP 服务端口 --readonly 只读模式 --accessAuthCode 访问授权码 --lang ar/de/en/es/fr/he/hi/id/it/ja/ko/nl/pl/pt-BR/ru/sk/th/tr/uk/zh-CN/zh-TW --mode dev / prod --ssl 启用 https 与 wss(对应"本地 HTTPS + HTTP/2 支持") --attach-ui 将内核生命周期绑定到桌面 UI 进程(Electron 使用) --safe-mode 以安全模式启动(对应"桌面端支持以安全模式启动")启动后serve会依次初始化 JWT 密钥、配置、数据库,然后并行拉起同步、资产监听、表情/主题监听、插件管理器(plugin.InitManager)与嵌入索引器(model.StartEmbeddingIndexer),最后进入HandleSignal等待退出信号——这与桌面端、Docker 等部署形态共享同一条启动路径。
AI 知识库:智能体与嵌入向量搜索公开测试
官方描述:思源智能体与嵌入向量搜索开始公开测试,用自然语言与笔记对话,用语义检索管理知识。
从源码看,这一能力由三块组成:
- 智能体(Agent):kernel/agent/agent.go 内置了完整的系统提示词,将"块(Block)"定义为核心领域概念,规定了块树结构、容器块/叶子块分类、嵌套列表规则、hPath 与 ID 路径的区别,以及"查找 → 浏览 → 创建 → 修改 → 组织"的工具使用模式;kernel/agent/tools.go 定义工具集,kernel/agent/session.go 管理会话,kernel/agent/compaction.go 负责上下文压缩;
- 嵌入索引:kernel/model/embedding.go 中的
StartEmbeddingIndexer是常驻索引循环(内部用 CAS 保证只启动一个),PrepareEmbeddingSearch则供 CLI 一次性命令在退出前完成语义检索;kernel/model/rerank.go 提供重排序能力; - 密钥与变量:AI 调用所需的密钥以"配置密钥和变量"的形式引入。实现见 kernel/conf/secrets.go:全局密钥库
Secrets以 AES 加密落盘、运行时为明文,并支持{{secrets.NAME}}占位符解析(正则\{\{secrets\.([^}]+)\}\}),供智能体 http_request 工具、MCP 服务 headers 等以模板方式引用;kernel/conf/variables.go 提供变量机制,kernel/plugin/api_secrets_vars.go 向插件暴露该能力。
完整变更记录
以下为 v3.7.0 的详细变更(按原变更记录分类,条目与 app/changelogs/v3.7.0/v3.7.0.zh-CN.md 保持一致)。
引入特性
- 新的默认外观图标
- 移动端速记
- 新的默认外观主题
- 支持内核插件系统
- 命令行接口
- 新的设置界面
- 支持配置密钥和变量
改进功能
- 支持跨文档撤销
- 改进外观底部停靠栏
- 支持在超级块中拖拽调整块宽度
- 根据字体文件自动调整编辑器字体字重
- 支持数据库筛选器组合
- 合并顶部标题栏和标签栏
- 数据库条目支持"创建副本"
- 改进包含合并单元格的表格的粘贴体验
- 为 mermaid/graphviz 图表添加缩放和平移选项
- 支持在移动端进行多块选择
- 改进数据库日期字段输入格式
- 支持拖拽排序文档标签
- 数据库多选字段值支持拖拽排序
- 在表格中撤销编辑时保留水平滚动位置
- 支持在移动端切换手机界面和桌面界面
- 改进拖拽块时显示的工具提示
- 数据库页脚字段计算支持基于模板的计算
- 修复拖拽越过视口后再滚动回来时选择起点发生偏移的问题
- 改进工作区丢失后的启动提示
- 修复鼠标移离笔记本后工具提示不会隐藏的问题
- 改进通过
Alt+Enter在列表末尾插入新项的体验 - 使用动态滚动条跳转到底部时,内容填满视口
- 新增 Markdown 导出参数对话框
- 修复 macOS 上 GPU 使用异常
- 支持通过文件名搜索从数据快照中返回文件列表
- 桌面端文件导出不再依赖浏览器下载
- 不再向浏览器暴露绝对工作区路径
- 改进空标题的边缘情况
- 向编辑器粘贴大量
text/siyuan内容时,渲染进程不再崩溃 - 改进行级公式和图片的复制,并使剪切行为与复制保持一致
- 改进字数统计
- 移动端文件导出不再依赖浏览器下载
- 表格中的键盘方向键导航不再绕过合并单元格
- 新增乌克兰语支持
- 为 Linux 新增 rpm 发布包
- 为搜索新增标题和列表子类型筛选器
- 改进微信助手批量消息的稳定性
- 改进数据索引稳定性
- 改进行级元素解析
- 支持在平板上拖拽
- 修复段落开头为自定义表情时键盘导航和 Delete 键失效的问题
- 修复推送通知标题变更后窗口标题未能更新的问题
- 支持在移动端使用"跟随系统锁屏"
- 支持将图片从收集箱拖拽到编辑器
- 支持在移动端拖拽
- 改进嵌入块中标题层级的导出
- 修复三指选择后无法立即复制的问题
- 新增印地语、印度尼西亚语、荷兰语、泰语支持
- 改进 Android 上的内核后台进程
- 添加递归折叠/展开块功能
- 改进 IFrame 块
- 通过发布服务提供在线用户指南
- 改进 PDF 导出预览界面
- 字体菜单支持搜索
- 将"访问授权码"重命名为"锁屏密码"
- 避免数据仓库清理过程中退出时的长时间等待
- 防止关闭 Markdown 标记后输入时的样式泄漏
- 改进删除块时的编辑器状态同步
- 改进块标
- 修复复制到微信公众号时列表的左缩进问题
- 修复发布服务中禁用插件时侧边栏布局错乱
- 改进导出预览的 HTML 复制
- 嵌入块支持就地编辑
- 包卡片上将 contenteditable="false">【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作
项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考