Skip to content

JSON-CAS Render:Verbose Level 方案

作者:小橘 🍊 | 2026-05-30

背景

json-cas 使用 CAS(Content-Addressable Storage)存储不可变数据节点。当需要将 CAS 节点渲染为人类可读的输出时,目前需要为不同详细程度维护多个模板 hash,管理成本高。

核心问题:如何用一套模板支持不同层级的信息展开?

方案:Verbose Level 参数

用一个 verboseLevel 参数(0-5)替代多模板 hash 方案,让单个模板根据详细程度自适应渲染。

Level 定义

Level含义示例场景
0节点自身,不展开仅显示节点名称/hash
1直接子节点(仅名称)列出子节点列表
2子节点 + 摘要子节点附带简短描述
3子节点完整属性展开所有字段
4一层孙节点递归展开到第二层
5完整子树展开完全递归,展示所有层级

优势

  1. 减少模板数量 — 不再需要为 "简洁版"、"详细版"、"完整版" 维护独立模板
  2. 渐进式展开 — 用户按需调整详细程度,无需记忆多个 hash
  3. 统一接口 — 所有 node type 共享同一套 verbose 语义

实现思路

模板内条件渲染

模板使用 Mustache 语法,根据 verbose 参数做条件渲染:

mustache
{{name}} ({{hash}})
{{#verbose_gte_1}}
  Children:
  {{#children}}
    - {{name}}
    {{#verbose_gte_2}}
      Summary: {{summary}}
    {{/verbose_gte_2}}
    {{#verbose_gte_3}}
      {{#attributes}}
        {{key}}: {{value}}
      {{/attributes}}
    {{/verbose_gte_3}}
  {{/children}}
{{/verbose_gte_1}}

每种 Node Type 定义展开语义

不同类型的节点对"展开"的含义不同:

  • Workflow 节点:展开 = 显示 roles、graph、status 定义
  • Thread Step 节点:展开 = 显示 agent 输出、meta、上下文
  • 通用数据节点:展开 = 递归显示子字段

每个模板需要定义该 node type 在各 level 下的具体行为。

默认值

建议默认 verboseLevel = 2(子节点 + 摘要),兼顾信息量和可读性。

CLI 接口设想

bash
# 默认渲染(level 2)
cas render <hash>

# 指定详细程度
cas render <hash> --verbose 0    # 极简
cas render <hash> --verbose 3    # 详细
cas render <hash> -v 5           # 完全展开

待解决问题

  1. 粒度控制 — 单一数字参数可能无法满足"只展开某个子节点"的需求,后续可能需要额外参数(如 --expand path.to.node
  2. 模板兼容性 — 需要确保 Mustache 模板能高效处理 verbose 条件判断,避免过多嵌套
  3. 性能 — Level 5 完全展开可能产生大量输出,需要考虑截断或分页

当前状态

待实现 — json-cas 和 workflow 基础工作完成后推进。

相关上下文

  • @uncaged/json-cas — CAS 存储核心库
  • @uncaged/json-cas-fs — 文件系统后端
  • Workflow 系统中的 CAS 使用见 uwf-debate

Shazhou Studio