记忆层计数 API
wesgine 提供按层计数的 API,与按 scope 统计的运维诊断接口分离。
设计原则
层计数 vs 运维统计
两个端点回答不同的问题:
| 端点 | 问题 | 面向 |
|---|---|---|
GET /memory/counts | "我每层有多少条记忆?" | 用户/前端 |
GET /memory/stats | "哪个存储分区的分布如何?" | 运维/管理员 |
CountByLayer API
请求
GET /cells/{id}/memory/counts?actor=&namespace=
actor:仅对 admin token 生效namespace:可选,按命名空间筛选
响应
{
"environment": 12,
"consensus": 3,
"about_me": 8,
"agent_memory": 45,
"session": 2,
"working": 0,
"unknown": 0
}
关键约束
- 键覆盖全部层含 0:
AllMemoryLayers()七个值全部出现 - 缺键 → 前端渲染成"什么都没有"
- 新增层在 tsc 失败,不在用户屏幕上失败
- 数字是
COUNT,不是逐页折叠 - 数字必须 == 列表长度
为什么不用 Stats
Stats 使用 scope 提问,而:
- L2(consensus)与 L3(about_me)共用
ScopeGlobal - 没有任何
(scope, namespace)对能命名"关于我" - 拿 scope 提问必然拿到两层之和
CountByLayer 使用 layer 提问:
- 谓词与
List下推同一个 - 每层一个精确
COUNT - 不存在歧义
前端消费规则
七层芯片恒定渲染
// wesui MemoryCenter
MEMORY_LAYERS.forEach(layer => {
// 即使 counts[layer] === 0 也渲染芯片
renderChip(layer, counts[layer])
})
- 空层显示
0,不隐藏 - 用户能分清"这层是空的"和"这层不存在"
分组列表只画非空层
// useMemoryCenter 分组循环
for (const layer of MEMORY_LAYERS) {
if (entries[layer].length === 0) continue // 空组不渲染
renderGroup(layer, entries[layer])
}
两者不矛盾:芯片回答"有哪些层",分组回答"现在有什么"。
Stats API(运维诊断)
GET /cells/{id}/memory/stats?actor=&scope=&namespace=
- 作用域抬到
cell:admin - 按 scope 提问,面向运维
- 返回分布统计,非逐条列表
相关不变量
- INV-MEM-52:计数按层按人
- INV-MEM-49:层判定单点
LayerOf - INV-MEM-53:用户面动词不收 scope
相关文档
- 记忆层模型 →
memory-layers.md - 层与 Scope 关系 →
memory-layer-scope-relation.md - 层查询谓词 →
memory-layer-clauses.md