卡片類型與自訂欄位
Memories 知識卡片除了既有標題、文件內文、標籤與連結,也支援具有順序與類型的欄位。內建類型為 note、contact、link、snippet、checklist、event 與 credential。類型提供初始欄位,不會限制卡片能包含哪些額外欄位。
結構描述
Content.card_type 是選用字串:可為內建名稱或自訂範本 ID。Content.fields 是有序陣列:
{"id":"work-email","name":"Work email","kind":"email","value":"name@example.com"}
欄位 ID 在重新命名與調整順序後保持不變。支援的種類:
| 種類 | 值 |
|---|---|
text, multiline, sensitive |
字串 |
number |
JSON 數字 |
date |
有效曆法日期,YYYY-MM-DD |
url |
絕對 HTTP 或 HTTPS URL |
email, phone |
已驗證的字串 |
checkbox |
JSON 布林值 |
single_select |
options 中的一個字串 |
multi_select |
options 中不重複的字串 |
null 表示空白(或敏感欄位已遮蔽)。選擇種類需要非空且值不重複的 options 陣列;其他種類必須省略 options。卡片最多有 64 個欄位,ID 必須唯一,名稱與值的大小均有上限。
加密與授權
每個修訂都以既有保管庫加密方式加密完整 Content。一般卡片的敏感值會從 fields 移除,並儲存在內部 field_body 中;它是該加密修訂內以 base64url 編碼的結構化內文,類似憑證內文。Base64url 本身不是加密。一般讀取/列舉/顯示操作絕不會傳回 field_body,敏感欄位值會顯示為 null。文件內文維持不變且可搜尋;敏感值不會放入文件內文或檢索快取。差異只顯示描述項與非敏感欄位。
明確呼叫 card_fields 並設定 reveal: true,需要已驗證的 CLI/行動端權限提升,或 MCP allow_all 能力。明文傳回前,交付意圖會先經過稽核並提交。MCP 能力絕不繼承終端機的權限提升。行動端顯示具類型欄位時,還需要成功的系統生物辨識/PIN 檢查,即使選用的快速解鎖已停用也一樣;取消或無法執行檢查時,不會取得敏感值。桌面瀏覽器編輯器刻意不提供秘密顯示或密碼端點;請使用已驗證的原生應用程式或 CLI 存取敏感值。
可重複使用的範本
範本是私有、加密且簽署的卡片修訂,包含 type_template: {id, name, fields}。它們使用既有修訂歷史紀錄、保管庫授權、衝突處理與加密裝置/雲端同步,而非未簽署的獨立資料庫。一般卡片清單/檢索會省略範本。內建類型無法修改或刪除。可以從既有卡片建立自訂範本;敏感預設值一律遮蔽。直接建立具有非 null 敏感預設值的範本會遭拒。
更新或刪除範本不會重寫既有卡片。卡片保留自己的欄位,在範本刪除後仍可編輯。
CLI
使用與用戶端相同的專用 home 啟動 daemon:
memories daemon
memories type list VAULT
memories type create VAULT Project --from-card CARD
memories type show VAULT TYPE
memories type update VAULT TYPE Project --fields template-fields.json
memories type delete VAULT TYPE
memories card create VAULT --title Ada --type contact
memories card put VAULT --title Notes --type note --input notes.md
memories card field add VAULT CARD Team --id team --kind text --value Core
memories card field add VAULT CARD Status --kind single_select --option Open --option Done
memories card field set VAULT CARD team Platform
memories card field rename VAULT CARD team "Working team"
memories card field mv VAULT CARD team 0
memories card field rm VAULT CARD team
memories card field list VAULT CARD
memories sudo
memories card field add VAULT CARD Key --kind sensitive
memories card field list VAULT CARD --reveal
敏感值使用隱藏輸入的終端機提示,絕不透過命令列值傳入。數字、核取方塊與多選值使用 JSON 語法。請使用 CLI list/show 傳回的短 ID,包括自訂類型 ID。--fields 接受 JSON 欄位陣列。
Daemon、FFI 與 MCP
共用 JSON/C ABI 支援 type_list、type_show、type_create、type_update、type_delete、card_create、card_fields 與 card_field。card_field.operation 使用 action: add|remove|reorder|rename|set,分別搭配欄位、ID、從零開始的索引、新名稱或值。原生表單儲存也使用 replace,以原子方式儲存有序欄位陣列,同時保留已遮蔽的既有敏感值。這些操作會附加簽署修訂,並保留原始資產種類。
MCP 工具的範本操作使用相同名稱,使用 card_fields 進行遮蔽檢視,並使用 card_field_add|remove|reorder|rename|set 進行修改。card_field_reveal 需要單一 field ID、intent: "reveal_plaintext"、簡短 reason,以及 allow_all 範圍。MCP 無法請求交付整張卡片的秘密。一般寫入需要 write 範圍;類型刪除需要 delete 範圍。敏感修改需要獨立驗證的 allow_all MCP 能力;這不會建立終端機權限提升工作階段,也不會暴露私人一般卡片。
Flutter 使用既有 memories_call JSON ABI:不需要更改 ABI 符號。通用編輯器包含類型選擇器、各種類的輸入控制項、欄位重新命名/移除,以及拖曳調整順序。託管項目使用相同表單,並保留伺服器可讀取的警告。
託管與裝置封存卡片
託管 SaaS RPC 在 bearer 所屬保管庫與範圍內提供這些操作。伺服器可讀取的託管卡片仍使用保管庫靜態加密。e2e 卡片不能包含非 null 敏感欄位或內部 field_body;原始 put 與欄位修改都會拒絕明文敏感值。可以編輯明文描述項,而不將敏感值傳送至 Center。
已配對裝置的行動端封存表單只傳送加密封套。一般卡片使用以下在用戶端建構的封套明文:
{"memories.card":1,"meta":{"card_type":"contact","fields":[
{"id":"key","name":"Key","kind":"sensitive","value":null}
]},"body":{"text":"notes","sensitive":{"key":"value"}}}
Center 收到的是封套,而非該明文。memories device sealed-get
--vault V --card C --field key --reveal 會在可信任的已配對裝置上讀取單一欄位。仍支援舊版原始秘密與結構化憑證封套。
相容性
缺少的類型與欄位成員會以預設值反序列化。既有未指定類型的卡片視為 note,不會重寫內文。舊版憑證視為 credential;讀取時,明文中繼資料對應為一般欄位,秘密內文值對應為敏感欄位。憑證欄位編輯會保留既有結構化憑證內文,讓複製、OTP 與注入使用端繼續運作。二進位舊版憑證會拒絕通用文字欄位移轉,避免捨棄其位元組。先前簽署修訂仍保留於歷史紀錄。
交換新結構描述前,請升級所有裝置:拒絕未知 JSON 成員的舊版執行檔無法理解新的具類型卡片修訂。