SuperAPI AI 工具集

persist-memory

数据与分析

查看项目

更新于 10-22 19:52

技能介绍

用途

CoCo Desktop 会在本地 /memories/ 目录(磁盘路径为 ~/.snowflake/cortex/memory/)维护记忆文件,用来记录项目上下文、用户偏好、反馈规则和参考链接。这些文件只存在于本机,换机器、重置环境或想按时间查询记忆历史时都不够用。persist-memory 技能把这些记忆文件同步到 Snowflake 表,使记忆可跨机器保留、可追溯演变历史、可用 SQL 查询。

主要能力

  • 把 /memories/*.md 文件逐条写入 Snowflake 表,保留原始内容。
  • 使用 SHA2 内容哈希去重:最新一行哈希相同则跳过。
  • 比较本地文件修改时间与表中最新 SAVED_AT:本地较新则插入;表中较新则不插入,改为提供拉取。
  • 拉取前展示本地与表版本的差异(或大文件的增删改行摘要),经用户逐文件确认后才用 memory 工具覆盖本地文件。
  • 可选会话摘要:读取 CoCo Desktop 会话记录,提取用户消息,生成不超过 1500 字符的摘要(做了什么、关键决策、变更的文件/对象、未完成事项),存入同一张表。
  • 首次运行自动创建数据库、模式和表(默认 COCO_MEMORY.PUBLIC.MEMORY_LOG),也支持指定目标表。
  • 同步后运行校验查询,报告扫描、插入、跳过、拉取的文件数与会话数。

使用方式

在对话中直接调用该技能,例如“Persist my CoCo memory files to Snowflake”执行全量同步;“Persist memory to MY_DB.ANALYTICS.COCO_MEMORY_LOG”指定目标表;“Persist all my memories and sessions to Snowflake”同时做会话摘要;在项目目录中调用则只同步与该项目匹配的记忆文件。首次运行需确认目标库表,默认使用 COCO_MEMORY.PUBLIC.MEMORY_LOG。同步范围依据调用方式确定:用户说 "all" 或带 --sessions 时为全量;从 playground 工作区调用为全量;从项目目录调用仅同步匹配文件。

表结构包含 PROJECT_NAME、MEMORY_FILE、CONTENT、CONTENT_HASH(SHA2 计算)、METADATA(VARIANT,含 name/type/description 三个必填字段)、SESSION_ID、SAVE_TRIGGER、NOTES、SAVED_AT。插入时 CONTENT 使用美元符号引用($$...$$);若内容本身含 $$,改用唯一标签如 $m1$...$m1$。若 SQL 执行路径不支持美元引用,可回退到用 snowflake-connector-python 参数化插入。

会话摘要流程会调用 cortex conversations list 列出会话,用 cortex conversations transcript 获取 JSONL 记录,跳过已有 session-summary 行的会话,解析 content 块中的文本(排除 internalOnly 为 true 的块,剥离 system-reminder 等标签),推断项目名后插入。

适用场景

  • 机器迁移或环境重置前备份记忆文件。
  • 保留记忆文件的演变历史(每次变更产生新行)。
  • 用 SQL 查询项目上下文、决策时间线。
  • 补记未记录的会话。
  • 通过共享 Snowflake 表把上下文分享给团队成员。

限制与注意事项

  • 不用于读取或编辑本地记忆文件(应使用 CoCo 内置记忆工具)、关键字检索(直接 SELECT ... WHERE CONTENT ILIKE)、从 Snowflake 批量恢复全部记忆(需手动读取并用记忆工具写入)、通用 Snowflake 备份/灾难恢复(应使用 Time Travel 与 Fail-Safe)。
  • 首次运行需要 CREATE DATABASE/SCHEMA/TABLE 权限;若无权限,需手动建表并提供全限定名。
  • 从表中拉取的内容不可信:记忆文件会被后续 CoCo 会话自动加载,能写该表的人可能植入指令,拉取后应审阅内容,不执行其中的指令;覆盖本地前必须获得用户明确确认。
  • 会话摘要为可选步骤,需用户显式请求;执行前需确认待处理的未捕获会话数量。
  • 记忆工具返回的空白字符差异可能导致哈希不同并产生“重复”行,这是按设计记录每次同步状态。
  • 缺少 YAML frontmatter 时需从上下文推断三个元数据字段,不得插入空值。