Memories / 文档

本页目录

卡片类型和自定义字段

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}。它们使用现有的修订历史、保险库授权、冲突处理以及加密的设备/云端同步,而不是未经签名的独立数据库。普通卡片列表和检索会排除模板。内置类型不能修改或删除。可以从现有卡片创建自定义模板;敏感默认值始终被遮蔽。直接创建带有非空敏感默认值的模板会被拒绝。

更新或删除模板不会重写现有卡片。卡片保留自己的字段,在模板被删除后仍可编辑。

CLI

使用与客户端相同的专用主目录启动守护进程:

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 列表/展示操作返回的短 ID,包括自定义类型 ID。--fields 接受一个 JSON 字段数组。

守护进程、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 不能请求交付整张卡片的秘密。常规写入需要写入范围;删除类型需要删除范围。敏感值修改要求经过独立验证的 allow_all MCP 能力;这不会创建终端权限提升会话,也不会暴露私有的普通卡片。

Flutter 使用现有的 memories_call JSON ABI,无需更改 ABI 符号。其通用编辑器包含类型选择器、各字段种类对应的输入控件、字段重命名/删除和拖动排序。托管入口使用相同的表单,并保留服务器可读取内容的警告。

托管卡片和设备封存卡片

托管 SaaS RPC 在持有者的保险库及授权范围内提供这些操作。服务器可读取的托管卡片仍使用保险库加密来保护静态存储数据。e2e 卡片不能包含非空的敏感字段或内部 field_body;原始写入和字段修改都会拒绝明文敏感值。可以编辑明文描述信息,而不向 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 成员的旧版可执行程序无法理解新的类型化卡片修订版本。