RFC: ocas export / import — CAS closure bundling #83
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
动机
将一个或多个 CAS 节点及其完整闭包打包成可移植的 tar,用于跨设备传输、离线分享、或对着 bundle 直接跑读命令。
核心概念
Bundle = 只读 OCAS Store(tar 格式)
给定一组根节点,计算闭包(walk refs + schema 链 + template 变量),打包成 tar。接收端可以:
--store bundle.tar对着 bundle 跑任何读命令ocas import将闭包导入本地 storeBundle 格式
闭包计算
给定根集合 R,闭包 C 包含:
walk())node.type→ schema → meta-schema(复用 gc.ts mark 逻辑)@ocas/template/text/<type-hash>变量指向的 CAS 节点@ocas/*内建变量)命令设计
ocas export--storeflag(所有读命令)实现:解压 → JSONL parse + cas/ 文件 → MemoryStore → 注入到命令。
变量名解析(
resolveHash)自然可用。ocas import行为:
@myapp/name→@imported/name),var set写入tag(target, ops)Scope 重映射规则:
@original/name→@scope/name(替换 scope 部分)@ocas/*内建变量不重映射,原样导入--scope可选 — 不传则保持原变量名var set语义),输出标记updatedvscreated实现计划
@ocas/corecomputeClosure(store, roots): Set<Hash>— 从 gc.ts mark 阶段抽取@ocas/core或@ocas/fsexportBundle(store, varNames, output)— 闭包 → tar@ocas/core或@ocas/fsimportBundle(bundlePath, targetStore, scope?)— tar → store@ocas/cliocas export子命令@ocas/cliocas import子命令@ocas/cli--store <path>global flag — 解压 → MemoryStore → 注入开放问题
.tar.gz?或者让用户自己处理?@ocas/core是否已有完整的 MemoryStore 实现?若无需新增。设计简化:去掉 manifest。
原来 manifest 记录 roots,但
vars.jsonl已经包含所有变量(根就是普通变量),ocas var list --store bundle.tar即可查看。无需额外元数据。最终 bundle 格式:
三个文件,零冗余。
—— 小橘 🍊
修正:去掉
cas/子目录,与~/.ocas布局保持一致。FsStore 的节点文件是平铺在目录根的
<HASH>.bin,没有cas/子目录。bundle 保持同样布局:这样 import 就是直接把
.bin拷到~/.ocas/,零转换。--store解压后openStore(tempDir)直接能用(JSONL 加载到 MemoryStore 做 var/tag)。—— 小橘 🍊
最终 bundle 格式确认:
nodes/子目录存节点,不平铺(与 #84 的~/.ocas布局改造对齐)vars.jsonl里—— 小橘 🍊
开放问题结论
Q1 压缩 — 默认
.tar.gz,node 内置zlib零依赖 ✅Q2 MemoryStore —
@ocas/core已有完整的createMemoryStore()(CAS + VarStore + TagStore 三合一)。--store实现方案:解压 tar → 读.bin到 MemoryStore CAS → 读vars.jsonl/tags.jsonl写入 VarStore / TagStore → bootstrap → 注入命令。不需要新建任何东西。 ✅Q3 大 bundle 内存 — FsStore 自身也是启动时全量加载到内存 Map(
loadDir()line 206-207),所以 MemoryStore 方案并不比正常使用差。初期不用管,上万节点时统一改按需加载(见 #85)。 ✅三个问题全部关闭,RFC 设计完备。
—— 小橘 🍊