
SiYuan v3.6.4 版本升級解析粘貼與排版細節改進、缺陷修復及任務列表新內核 API【免費下載鏈接】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.6.4 中文文檔完整梳理該版本的 15 項功能改進、5 項缺陷修復與 5 項開發者向變更并結合內核源碼Go與前端源碼TypeScript逐一印證新增 API/api/file/workspaceCopyFiles、/api/block/updateTaskListItemMarker、/api/block/batchUpdateTaskListItemMarker、插件 APIgetAllTabs的type參數以及任務列表data-task狀態屬性的真實實現幫助插件開發者與運維用戶理解 v3.6.4 的能力邊界與升級要點。版本概述根據 v3.6.4 變更記錄此版本定位是「改進了一些細節」變更集中在三類編輯器細節粘貼行為、塊標block marker渲染與位置、行級代碼粘貼、優化排版對全角字符的處理界面與布局按鈕陰影、分屏布局、停靠欄面板標題、閃卡管理窗口分頁按鈕位置、云端配置界面加載圖標、集市列表卡片數據與集成塊引用導出、反向鏈接面板粘貼行為、已下載集市包的 README 離線化、macOS 默認工作空間數據丟失修復、若干安全漏洞修復以及面向插件開發者的新內核 API 與屬性約束。改進功能詳解編輯器粘貼與渲染文檔塊菜單新增「復制全文」選項在文檔塊菜單中可以直接復制整篇文檔內容無需手動全選。改進粘貼鏈接優化粘貼鏈接的解析與轉換行為使粘貼過來的鏈接內容更符合預期。改進包含反引號和與號的行級代碼粘貼針對行內代碼inline code中含有反引號或與號時粘貼錯亂的場景做了修正。改進當列表項包含塊引用或提示塊時的塊標渲染復雜嵌套塊列表項內含 callout/提示塊出現時塊標的顯示不再異常。優化排版忽略全角字符排版優化邏輯不再把全角字符納入處理范圍避免中文排版場景下被誤改。改進塊標的顯示位置塊標hover 時顯示的塊操作標記的定位更合理。界面與布局反向鏈接面板中的列表在粘貼后不再自動折疊粘貼操作不會再觸發反向鏈接面板里列表的意外折疊。改進按鈕陰影效果按鈕的陰影樣式統一優化。改進分屏布局分屏split view的布局行為改進。支持顯示完整的停靠欄面板標題和操作按鈕停靠欄面板變窄或標題過長時也能完整展示面板標題與操作按鈕。加載圖標不再覆蓋整個云端配置界面云端配置界面加載態的 loading 圖標尺寸收斂不再鋪滿整個界面。將閃卡管理窗口中的分頁和導航按鈕移動到左上角閃卡flashcard管理窗口的分頁與導航按鈕調整到左上角操作位置更順手。集市與導出改進集市列表卡片集市插件/主題市場的列表卡片樣式改進。改進塊引用導出塊引用block reference導出結果的準確性改進。已下載的集市包不再回退獲取在線 README集市包本地下載后README 直接讀取本地內容不再回退到在線獲取——這也意味著離線環境下集市包的說明文檔可正常展示減少了對網絡的依賴。修復的缺陷macOS 上默認工作空間數據會丟失修復 macOS 平臺默認工作空間數據丟失問題屬數據安全性修復macOS 用戶應優先升級到包含此修復的版本。將塊拖動到反向鏈接面板時會導致報錯拖拽塊到反向鏈接面板的報錯已修復。修復一些安全漏洞批量安全修復建議所有部署尤其是開啟局域網訪問的自托管實例跟進升級。Android 上導入 Markdown.zip 出錯移動端導入 Markdown.zip 歸檔的錯誤已修復。在提示塊內部拖動塊后整個塊會消失提示塊callout內部拖動塊導致塊整體消失的嚴重編輯缺陷已修復。開發者變更源碼級解讀本版本對插件開發者與 API 集成者價值最大的部分是 5 項開發者變更。下面結合內核源碼逐項說明。任務列表支持data-task狀態屬性任務列表項task list item現在有了規范的「任務狀態」表達方式通過塊 IAL 屬性中的data-task讀取任務狀態但修改任務狀態被限制為只能通過專用的 marker API 完成。從源碼結構看這一約束實現在 setNodeAttrs0 中當通過通用的塊屬性設置接口嘗試設置或移除data-task屬性時內核會直接拒絕并返回明確指引setting or removing [data-task] attribute is not allowed via this interface. Please use /api/block/updateTaskListItemMarker or /api/block/batchUpdateTaskListItemMarker to update the task list item marker這一設計把「任務勾選」這類會引發事務transaction與多端廣播的寫操作收斂到單一受控入口避免插件繞過事務機制直接改屬性造成狀態不一致。新增內核 API/api/block/updateTaskListItemMarker該 API 用于更新單個任務列表項的勾選標記marker。請求參數為id塊 ID與marker標記字符實現位于 updateTaskListItemMarker路由注冊見 router.go需通過認證、管理員角色與只讀檢查中間件。從源碼可以看到關鍵的校驗與處理鏈路buildUpdatedTaskListItemBlockDOM 先按id取出塊校驗塊類型必須是NodeListItem再加載所在文檔的語法樹Lute AST定位節點校驗li.ListData.Typ 3確認為任務列表項校驗marker長度必須為 1且不能是[或]防止破壞任務列表語法在 AST 的TaskListItemMarker節點上寫入新標記并以TaskListItemChecked ! marker推導勾選態隨后渲染出更新后的塊 DOM通過事務機制提交構造Action: update的Operation經model.PerformTransactions與model.FlushTxQueue落庫并broadcastTransactions廣播到各端含移動端保證多端同步與歷史記錄history正確。請求示例{ id: 20260909000000-abcdefgh, marker: x }新增內核 API/api/block/batchUpdateTaskListItemMarker批量版本用于一次更新多個任務列表項的標記實現見 batchUpdateTaskListItemMarker。參數為對象數組items每個元素包含id與marker{ items: [ { id: 20260909000000-abcdefgh, marker: x }, { id: 20260909000001-ijklmnop, marker: } ] }從源碼結構看其實現有兩個值得注意的細節同一id重復出現時「保留最后一個 marker」且按去重后的 id 生成操作列表即重復提交是冪等收斂的所有操作合并進一個事務單個Transaction的DoOperations再統一廣播。相比逐條調用單條 API批量接口減少事務次數適合插件做「一鍵完成全部任務」這類批量操作。新增內核 API/api/file/workspaceCopyFiles該 API 提供工作空間內的文件批量復制能力實現位于 workspaceCopyFiles。請求參數srcs字符串數組源文件路徑相對于工作空間destDir目標目錄相對于工作空間不存在時會自動創建。{ srcs: [data/box1/20260909000000-abcdefgh/20260909000000-abcdefgh.md], destDir: data/backup/20260909 }從源碼看該接口在安全邊界上做了多層防護這也呼應了本版本「修復一些安全漏洞」的整體基調每個源路徑都經util.GetAbsPathInWorkspace解析并限定在工作空間內越界路徑直接返回 403util.IsSensitivePath判定為敏感路徑的文件拒絕復制返回code: -2rejectEncryptedBoxPath拒絕涉及加密筆記本的源路徑與目標目錄返回code: -3避免在加密筆記本內創建明文目錄或繞過加密邊界目標若為已存在的 symlink 則拒絕os.Create會跟隨符號鏈接可能寫入加密筆記本內部目標目錄不存在時以0755權限MkdirAll創建且創建前先做加密筆記本目錄攔截復制完成調用model.IncSync()保證文件同步機制感知到變更。這些防護意味著該 API 可以安全地用于插件實現「工作空間內備份/歸檔」類功能而無法被用作越權文件操作通道。插件 APIgetAllTabs新增type參數前端布局工具 getAllTabs 新增可選參數type用于按面板類型篩選標簽頁該函數已導出給插件使用見 API.ts。從源碼實現看type支持的值包括Search、Asset、Editor、Graph、Backlink、Outline以及自定義面板的customModelType。篩選邏輯是雙通道匹配已實例化的 tab 直接比較其model實例類型model instanceof Search等尚未完全初始化的 tab 回退解析頭部元素的data-initdata屬性按instance/customModelType字段匹配。插件使用示例// 僅獲取所有編輯器標簽頁 const tabs getAllTabs(Editor); // 獲取某個自定義類型的面板 const customTabs getAllTabs(myPanelType);此前插件只能拿到全量標簽再自行過濾現在可以在布局層面直接按類型取回簡化了「聚焦當前文檔編輯器」「定位搜索面板」等常見插件邏輯。注意該實現標注了#if !MOBILE桌面端與移動端行為存在條件編譯差異移動端相關邏輯不可用。升級建議與適用前提macOS 用戶本版本修復了默認工作空間數據丟失問題建議盡快升級開啟 API 自托管訪問的用戶本版本包含安全漏洞修復且新增的workspaceCopyFiles等 API 均疊加了認證、管理員角色與只讀檢查見 路由注冊但生產環境仍建議保持最小化端口暴露插件開發者data-task的寫約束意味著此前若有插件通過通用屬性接口寫任務狀態的邏輯需要遷移到updateTaskListItemMarker/batchUpdateTaskListItemMarkergetAllTabs的type參數則為布局類插件提供了更精確的篩選能力。該變更記錄基于當前倉庫中 v3.6.4 的三個語言版本文檔en、zh-CN、zh-TWAPI 行為以源碼kernel/api/目錄當前實現為準由于倉庫為后續版本的源碼個別實現細節可能在更新版本中繼續演進。【免費下載鏈接】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),僅供參考