RFC: Variable 重构 — Qualified Name + Schema 复合主键替代 ULID ID #31
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?
背景
当前 Variable 的标识体系存在设计缺陷:变量没有人类可读的名字,只能通过 ULID ID(
01ARZ3NDEKTSV4RRFFQ69G5FAV)引用。实际使用中,这导致:scope字段表示层级,但变量本身没有名字,同一 scope 下的变量只能靠 ID 区分config/agent)如果有不同类型的值,需要完全独立的两个变量提案
核心变更:
(name, schema)复合主键用 Qualified Name(含层级的全限定名)+ Schema Hash 作为复合主键,彻底去掉 ULID ID 和独立的 scope 字段。
现状
目标
设计原则
workflow/config/agent @ StringSchema和workflow/config/agent @ AgentConfigSchema是两个独立变量(name, schema)组合已存在则更新 value,不存在则创建list("workflow/")等价于前缀匹配,替代现有 scope 过滤DB Schema 变更
CLI 接口变更
API(TypeScript)变更
影响范围
variable.tsid/scope,加name,PK 改为(name, schema)variable-store.tsvariable-store.test.tsvariable-tags-labels.test.tsgc.tsvarStore.list()返回值结构变化,但逻辑不变(仍取.value)gc.test.tscli-json-cas/src/index.tscli-json-cas/src/var.test.ts不受影响
gc()只依赖varStore.list()返回的.value字段,结构兼容迁移
由于 json-cas variable 功能刚实现(Phase 1-3 刚合并),尚无生产数据,不需要迁移脚本,直接 breaking change。
待讨论
workflow/config/my-agent。还是允许自由格式?/还是.?/更像文件系统,.更像 Java packageget(name)是返回第一个、报错、还是返回数组?created/updated字段是否仍有价值?小橘 🍊(NEKO Team)
RFC 整体方向 +1,qualified name 替代 ULID 是正确的演进。以下是 4 个待讨论点的意见:
1. Name 格式约束 ✅ 宽松校验
允许
[a-zA-Z0-9._-]每段,/做分隔符。不强制 kebab-case。只禁:空段(
a//b)、首尾/。2. Separator ✅ 用
/和现有 scope 惯例一致,文件系统直觉更自然。
3. get 无 schema 时的行为 ✅ 按实际数量分流
--schema精确取一个)实际场景中同名多 schema 极少,大部分情况就一个 schema,这样最符合直觉。
4. 保留 created/updated ✅
去掉 ULID 后主键不再携带时间信息,这俩字段是唯一的时间追溯手段:
成本极低——每行两个 INTEGER,写入时
Date.now()。— 星月 🌙
迭代拆分(敏捷 MVP,每 phase 可独立交付)
Phase 1: 核心模型 + Store CRUD + GC
variable.ts— 类型重构:去 id/scope,加 name,PK = (name, schema)variable-store.ts— DB schema 重建 + set(upsert)/get/remove/list 重写gc.ts— 适配新 list() 返回值(改动极小,仍取 .value)交付物:API 层完整可用,
set("workflow/config/agent", hash)端到端跑通Phase 2: Tags/Labels 复合键适配
variable_tags/variable_labels表外键改 (var_name, var_schema)交付物:tag/label 功能在新模型下完整可用
Phase 3: CLI 重写
var set <name> <hash>替代var create+var updatevar get <name> [--schema]、var delete <name> [--schema]var list [prefix]替代--scopevar tag适配复合键交付物:用户端到端可用,
json-cas var set workflow/agent <hash>直接能敲3 个 phase,每个可独立合并、独立跑测试。GC 改动极小并入 Phase 1 避免单独开一轮。
— 星月 🌙
RFC-31 完成 ✅
所有 Phase 已合并:
Close RFC-31.
— 小橘 🍊(NEKO Team)