mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-10-26 16:55:08 +00:00
Merge pull request #6598 from deepseek-harness/persistence-schema-digest-keys
refactor(scripts): key persistence schema nodes by subgraph digest
This commit is contained in:
commit
5a66e46c4f
70 files changed
+13168
-662274
No files matched your search
@@ -9,14 +9,14 @@
|
||||
en: c8e926bfc65d7195
|
||||
zh: e0e007960b68fe80
|
||||
/agent-note-in-tree-persistence-type-history/decision:
|
||||
en: 94be3d6c7df3063b
|
||||
zh: 7e8fb08d7fd95f85
|
||||
en: 3d4b2935c4db54b2
|
||||
zh: eb0da7083e301ef4
|
||||
/agent-note-in-tree-persistence-type-history/decision/finalized-checkpoints:
|
||||
en: b508035a163340a3
|
||||
zh: ba5b2b7e8cef4b2f
|
||||
/agent-note-in-tree-persistence-type-history/alternatives-considered:
|
||||
en: 1cf6d0a5555ae50a
|
||||
zh: 70ea1ba535e09442
|
||||
en: a581d63455788d48
|
||||
zh: 0a3781d2f827e35d
|
||||
/agent-note-in-tree-persistence-type-history/consequences:
|
||||
en: 672c8cb59d291dc2
|
||||
zh: cbec90fbca92320a
|
||||
@@ -16,6 +16,8 @@ One normalized type model supplies the readable persistence catalog, the complet
|
||||
|
||||
The dedicated [persistence-change records](../../../../docs/persistence-changes/README.md) bind acknowledgement to the after digest of each affected root. A generated companion stores complete after schemas. The initial record covers all roots; later records name each root's predecessor. A predecessor's after schema supplies the next before schema. Verification rejects ambiguous history and requires current source to match the terminal recorded state without consulting Git history or remote services.
|
||||
|
||||
Every schema file stores one node table keyed by a 16-hexadecimal-digit prefix of each node's canonical subgraph digest; roots and types locate their graphs through their own digests. A type change therefore rewrites only the changed nodes, their ancestors, and the affected digests. Parsers accept only the exact generated text, and all committed files share this layout.
|
||||
|
||||
Automatic classification permits optional body additions, required-to-optional body changes, and ordinary event additions within one version. The scoped [source-attribution policy](2026-09-17-persistence-schema-review.md) also permits qualified new producer kinds when both saved schemas opt in. The [event-payload version rule](../../../../docs/persistence-changes/README.md#compatibility-rules) admits higher numeric payload versions when every old alternative remains readable and records the older-reader limitation. Other structural changes require an explicit same-version choice in the recording CLI or an increasing header version. Every structural difference needs an acknowledgement; its Compatibility and Verification sections explain both reader directions and executed checks. CI validates saved decisions without inferring how they were authored. The [format-version procedure](../../../../docs/cookbook/adding-a-session-format-version.md) owns adjacent migration work when a bump is required.
|
||||
|
||||
The persistence-change document kind preserves compatibility reasoning and evidence for a historical type transition. Agent Notes retain mechanism-level decisions; they do not become a growing inventory of individual acknowledgements. Machine declarations remain identical across the bilingual pair and are parsed once.
|
||||
@@ -44,6 +46,8 @@ Finalization records acceptance independently of publication. The [status record
|
||||
|
||||
**Infer behavior from types or require proof of human review.** A type graph cannot establish replay semantics, and a recorded choice cannot establish how it was authored. The checker validates declared transitions and header-version constraints. Reviewers inspect actual reader behavior and the acknowledgement’s explanation independently.
|
||||
|
||||
**Keep positional node indices or also read the previous layout.** Positional indices renumber every later node when a union gains a variant, and per-root graphs repeat shared types, so a one-variant change rewrote thousands of lines. Digest-keyed nodes keep diffs proportional to the change. Reading two layouts would leave two parsers to maintain and two accepted texts per inventory; migrating every committed file once keeps a single format.
|
||||
|
||||
## Consequences
|
||||
|
||||
Authors retain one snapshot per affected root per accepted transition and resolve history forks when integrating competing changes to that root. Independent roots can advance without rewriting unrelated acknowledgements. The [cookbook](../../../../docs/cookbook/reviewing-persistence-type-changes.md) provides the local authoring and verification procedure.
|
||||
|
||||
@@ -16,6 +16,8 @@ Status: implemented
|
||||
|
||||
专用的[持久化变更记录](../../../../docs/persistence-changes/README.zh.md)将确认绑定到每个受影响根的变更后摘要。生成的伴随文件保存完整的变更后 schema。初始记录覆盖所有根;后续记录为每个根指定前驱。前驱的变更后 schema 提供下一次的变更前 schema。验证拒绝有歧义的历史,并要求当前源码匹配最终记录状态,无需查询 Git 历史或远端服务。
|
||||
|
||||
每个 schema 文件保存一张节点表,以每个节点规范子图摘要的 16 位十六进制前缀为键;根与类型通过各自的摘要定位其图。因此类型变更只改写发生变化的节点、其祖先节点以及受影响的摘要。解析器只接受精确生成的文本,所有已提交文件共用此布局。
|
||||
|
||||
自动分类允许可选事件体新增、事件体属性从必选改为可选,以及普通事件新增保持同一版本。当双方保存的 schema 均声明支持时,受限的[消息源归属策略](2026-09-17-persistence-schema-review.zh.md)也允许添加符合条件的生产者 kind。[事件载荷版本规则](../../../../docs/persistence-changes/README.zh.md#compatibility-rules)允许在每个旧分支仍可读取时增加更高的数字载荷版本,并记录旧读取器限制。其他结构变更要求在记录 CLI 中显式选择同版本,或递增头版本。每个结构差异都需要确认;其兼容性与验证部分说明两个方向的读取器行为及已执行检查。CI 验证保存的决策,不推断其编写方式。需要升版本时,[格式版本流程](../../../../docs/cookbook/adding-a-session-format-version.zh.md)负责相邻迁移工作。
|
||||
|
||||
持久化变更文档类型保留历史类型转换的兼容性说明和证据。Agent Note 保留机制层面的决策,不积累单次确认清单。双语对中的机器声明保持相同,且只解析一次。
|
||||
@@ -44,6 +46,8 @@ Status: implemented
|
||||
|
||||
**从类型推断行为,或要求人类评审证明。** 类型图无法证明回放语义,所记录的选择也无法证明其编写方式。检查器验证声明的转换与头版本约束。评审者独立检查实际读取器行为与确认说明。
|
||||
|
||||
**保留按位置编号的节点索引,或同时读取旧布局。** 联合类型新增分支时,按位置编号的索引会为其后的每个节点重新编号,而逐根图会重复共享类型,因此单个分支变更曾改写数千行。以摘要为键的节点使差异规模与变更成正比。同时读取两种布局需要维护两个解析器,且每个清单会有两种可接受文本;将所有已提交文件一次性迁移后只保留单一格式。
|
||||
|
||||
## 影响
|
||||
|
||||
作者为每次已接受转换中的每个受影响根保留一份快照,并在集成该根的竞争变更时解决历史分叉。独立根可以演进而不改写无关确认。[实操手册](../../../../docs/cookbook/reviewing-persistence-type-changes.zh.md)提供本地编写与验证流程。
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
en: 5fca19ac2bb1ddac
|
||||
zh: 00d78fe7e80ba4f7
|
||||
/cookbook-reviewing-persistence-type-changes/optional-inspect-the-change:
|
||||
en: 14049617e3de750d
|
||||
zh: 200456cf72bef77b
|
||||
en: 841a75ed33db17bd
|
||||
zh: ed4e80aae708bfb9
|
||||
/cookbook-reviewing-persistence-type-changes/1-record-the-change:
|
||||
en: de16b6e1ac883317
|
||||
zh: 21d367bb78e799d1
|
||||
|
||||
@@ -43,7 +43,7 @@ A recorded decision does not hide the transition from this comparison. `--check`
|
||||
|
||||
Record the commits supplying those files with the report. Add `--json` for structured output. This read-only comparison groups shared changes with their affected roots and uses actual literal `kind`/`form` values instead of union positions. Ambiguous alternatives remain separate additions and removals. Its compatibility section copies every root's authoritative classifier result; the structural explanation does not replace acknowledgement checks. Current catalog labels and declaration names are descriptive metadata; structural anchors and fingerprints identify types.
|
||||
|
||||
The current machine inventory stores complete graphs in `roots`. A `types` entry contains `digest`, `names`, and `sources`, plus an explicit `schema` when roots cannot reconstruct that graph exactly. Readers resolve omitted graphs from root subgraphs by digest and validate explicit graphs directly, preserving every type and its metadata. Historical full entries remain readable. `formatVersion` identifies normalization rules; storage compaction does not change root fingerprints or require an acknowledgement.
|
||||
Every inventory uses the [node-table layout](../persistence-changes/README.md#files-and-ownership); both comparison inputs must be generated by the current tooling. `formatVersion` identifies normalization rules; the storage layout does not change root fingerprints or require an acknowledgement.
|
||||
|
||||
<a id="acknowledge"></a>
|
||||
## 1. Record the change
|
||||
|
||||
@@ -43,7 +43,7 @@ pnpm --silent run persistence-review --before .artifacts/base.schema.json --afte
|
||||
|
||||
在报告旁记录这些文件对应的 commit。添加 `--json` 可获取结构化输出。此只读比较将共享变更与受影响的根类型归组,使用实际字面量 `kind`/`form` 值代替联合类型位置。无法唯一匹配的候选项保留为独立的新增与删除。兼容性部分复制每个根类型的权威分类结果;结构说明不替代确认检查。当前目录标签和声明名称是描述元数据;结构锚点和指纹标识类型。
|
||||
|
||||
当前机器清单在 `roots` 中保存完整图。每个 `types` 条目包含 `digest`、`names` 和 `sources`;若根无法精确重建该图,条目还会保存显式 `schema`。读取器按摘要从根的子图恢复省略的图,并直接验证显式图,保留每个类型及其元数据。历史完整条目仍然可读。`formatVersion` 标识规范化规则;存储压缩不改变根指纹,也不需要确认记录。
|
||||
所有清单都使用[节点表布局](../persistence-changes/README.zh.md#files-and-ownership);两个比较输入都必须由当前工具生成。`formatVersion` 标识规范化规则;存储布局不改变根指纹,也不需要确认记录。
|
||||
|
||||
<a id="acknowledge"></a>
|
||||
## 1. 记录变更
|
||||
|
||||
+524
-13552
File diff suppressed because it is too large.
Load diff
+53
-905
@@ -1,910 +1,58 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:tool/ptc-dispatch",
|
||||
"kind": "event",
|
||||
"event": "tool/ptc-dispatch",
|
||||
"surface": false,
|
||||
"digest": "b5d66eaebed4da391b13498623b11142222149fbf5e025975dbc6d94f0d06796",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 29,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 30,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "arguments",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "content",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "error",
|
||||
"type": 28,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "isError",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "parentCallId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "rootCallId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "subCallId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "opaque",
|
||||
"reason": "unknown"
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 4
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
5,
|
||||
9,
|
||||
11,
|
||||
13,
|
||||
15,
|
||||
25
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "content",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "isError",
|
||||
"type": 6,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "toolCallId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-result"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "reasoning"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 12,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "text"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "arguments",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 14,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-call"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 24,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mediaType",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 7,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "originalDimensions",
|
||||
"type": 23,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/gif"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/jpeg"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/png"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/webp"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 26,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 27,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "file"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "code",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "reason",
|
||||
"type": 7,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool/ptc-dispatch"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "event:tool/result",
|
||||
"kind": "event",
|
||||
"event": "tool/result",
|
||||
"surface": true,
|
||||
"digest": "3a803805bdeb805f32b229e399fb7258be8e32a89f89063a7c99957cfea942f7",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 37,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sourceEventSeqs",
|
||||
"type": 38,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "surfaceOp",
|
||||
"type": 39,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 43,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "error",
|
||||
"type": 2,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "message",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "meta",
|
||||
"type": 33,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "step",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "turn",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "code",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "reason",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "content",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "role",
|
||||
"type": 30,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "source",
|
||||
"type": 31,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "tuple",
|
||||
"elements": [
|
||||
{
|
||||
"type": 6,
|
||||
"optional": false,
|
||||
"rest": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "content",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "isError",
|
||||
"type": 28,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "toolCallId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 29,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 8
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
6,
|
||||
9,
|
||||
11,
|
||||
13,
|
||||
15,
|
||||
25
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "text"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 12,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "reasoning"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "arguments",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 14,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-call"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 24,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mediaType",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "originalDimensions",
|
||||
"type": 23,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/gif"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/jpeg"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/png"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/webp"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 26,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 27,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "file"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-result"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "user"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "callId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 32,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
3,
|
||||
17,
|
||||
28,
|
||||
34,
|
||||
35,
|
||||
36
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 33
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [],
|
||||
"indices": [
|
||||
{
|
||||
"key": 3,
|
||||
"value": 33
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 17
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
40,
|
||||
41
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "append"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "endSeq",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "op",
|
||||
"type": 42,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "startSeq",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "replace"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool/result"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:tool/ptc-dispatch","kind":"event","event":"tool/ptc-dispatch","surface":false,"digest":"b5d66eaebed4da391b13498623b11142222149fbf5e025975dbc6d94f0d06796"},
|
||||
{"key":"event:tool/result","kind":"event","event":"tool/result","surface":true,"digest":"3a803805bdeb805f32b229e399fb7258be8e32a89f89063a7c99957cfea942f7"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0e560aad8fa9f338": {"kind":"array","element":"e1161343902a8da6"},
|
||||
"0f46153645c29784": {"kind":"object","properties":[{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"1f0133217eeeffd8": {"kind":"literal","value":"tool-call"},
|
||||
"277b61f9c6f81704": {"kind":"literal","value":"file"},
|
||||
"28aa673866746f44": {"kind":"object","properties":[{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"message","type":"966fad765834f620","optional":false},{"name":"meta","type":"c592ce75aab73fca","optional":true},{"name":"step","type":"0657d3ca5ac4e7bf","optional":false},{"name":"turn","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"2f1e6a7ebace43d7": {"kind":"union","types":["3f74ba74acd10644","58f94390b982f8a5","de30b1fa12c75f81","ebb768d85ec87fb6"]},
|
||||
"335e242de1fcc17b": {"kind":"union","types":["bcf0caf62d964b2f","e438a9d4fb883b3e"]},
|
||||
"3a803805bdeb805f": {"kind":"object","properties":[{"name":"data","type":"28aa673866746f44","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"sourceEventSeqs","type":"5d03ba38734809bc","optional":true},{"name":"surfaceOp","type":"335e242de1fcc17b","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"570e850224346133","optional":false}],"indices":[]},
|
||||
"3c2535ca0a2062f1": {"kind":"literal","value":"reasoning"},
|
||||
"3f74ba74acd10644": {"kind":"literal","value":"image/jpeg"},
|
||||
"4c12ebe118c00be8": {"kind":"object","properties":[{"name":"arguments","type":"bbc5696e3f13c758","optional":false},{"name":"content","type":"0e560aad8fa9f338","optional":false},{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"isError","type":"aa93010d0e521ad7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"parentCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"subCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"4e44c9118152f682": {"kind":"literal","value":"text"},
|
||||
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
|
||||
"529e0ccd0e34079a": {"kind":"object","properties":[],"indices":[{"key":"4cd48f3e5108bd6e","value":"c592ce75aab73fca"}]},
|
||||
"570e850224346133": {"kind":"literal","value":"tool/result"},
|
||||
"58f94390b982f8a5": {"kind":"literal","value":"image/png"},
|
||||
"5d03ba38734809bc": {"kind":"array","element":"0657d3ca5ac4e7bf"},
|
||||
"5eedf09e88b5ed9c": {"kind":"tuple","elements":[{"type":"9bdd77f2b39d9ae4","optional":false,"rest":false}]},
|
||||
"68f44f59e91c4139": {"kind":"literal","value":"user"},
|
||||
"72ec79127a9c0d02": {"kind":"array","element":"c592ce75aab73fca"},
|
||||
"814d9434e1ddf907": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"3c2535ca0a2062f1","optional":false}],"indices":[]},
|
||||
"8ef06dd236128246": {"kind":"object","properties":[{"name":"attachment","type":"b0b0eb1b16490f6b","optional":false},{"name":"type","type":"fb8b6a2e53cb9cf4","optional":false}],"indices":[]},
|
||||
"938f7c7357bc403e": {"kind":"primitive","type":"null"},
|
||||
"966fad765834f620": {"kind":"object","properties":[{"name":"content","type":"5eedf09e88b5ed9c","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"role","type":"68f44f59e91c4139","optional":false},{"name":"source","type":"d9c462b9f62fdd3e","optional":false}],"indices":[]},
|
||||
"9bdd77f2b39d9ae4": {"kind":"object","properties":[{"name":"content","type":"0e560aad8fa9f338","optional":false},{"name":"isError","type":"aa93010d0e521ad7","optional":true},{"name":"toolCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"e5244812c495a80c","optional":false}],"indices":[]},
|
||||
"a13d8f379222ece8": {"kind":"literal","value":"tool"},
|
||||
"a81059ca06999da1": {"kind":"object","properties":[{"name":"code","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"reason","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
|
||||
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
|
||||
"b0b0eb1b16490f6b": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"mediaType","type":"2f1e6a7ebace43d7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":true},{"name":"originalDimensions","type":"0f46153645c29784","optional":true},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"b5d66eaebed4da39": {"kind":"object","properties":[{"name":"data","type":"4c12ebe118c00be8","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"fb5e0517050d2c6d","optional":false}],"indices":[]},
|
||||
"bbc5696e3f13c758": {"kind":"opaque","reason":"unknown"},
|
||||
"bcf0caf62d964b2f": {"kind":"object","properties":[{"name":"endSeq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"op","type":"f6cb462f808309e3","optional":false},{"name":"startSeq","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"c1f0f17b6493b85d": {"kind":"object","properties":[{"name":"arguments","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"1f0133217eeeffd8","optional":false}],"indices":[]},
|
||||
"c592ce75aab73fca": {"kind":"union","types":["0657d3ca5ac4e7bf","4cd48f3e5108bd6e","529e0ccd0e34079a","72ec79127a9c0d02","938f7c7357bc403e","aa93010d0e521ad7"]},
|
||||
"d9c462b9f62fdd3e": {"kind":"object","properties":[{"name":"callId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"a13d8f379222ece8","optional":false}],"indices":[]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"de30b1fa12c75f81": {"kind":"literal","value":"image/gif"},
|
||||
"e1161343902a8da6": {"kind":"union","types":["4e88776858652856","814d9434e1ddf907","8ef06dd236128246","9bdd77f2b39d9ae4","c1f0f17b6493b85d","f2da0f27c1e6add5"]},
|
||||
"e438a9d4fb883b3e": {"kind":"literal","value":"append"},
|
||||
"e5244812c495a80c": {"kind":"literal","value":"tool-result"},
|
||||
"ebb768d85ec87fb6": {"kind":"literal","value":"image/webp"},
|
||||
"f19bee84bf3d2090": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"f2da0f27c1e6add5": {"kind":"object","properties":[{"name":"attachment","type":"f19bee84bf3d2090","optional":false},{"name":"type","type":"277b61f9c6f81704","optional":false}],"indices":[]},
|
||||
"f6cb462f808309e3": {"kind":"literal","value":"replace"},
|
||||
"fb5e0517050d2c6d": {"kind":"literal","value":"tool/ptc-dispatch"},
|
||||
"fb8b6a2e53cb9cf4": {"kind":"literal","value":"image"}
|
||||
}
|
||||
}
|
||||
+10
-71
@@ -1,76 +1,15 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:working-directory/change",
|
||||
"kind": "event",
|
||||
"event": "working-directory/change",
|
||||
"surface": false,
|
||||
"digest": "124aa62078ca3311353b39cc3bf6c75da281338be6bbf672f8b361d828cddca3",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "cwd",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "working-directory/change"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:working-directory/change","kind":"event","event":"working-directory/change","surface":false,"digest":"124aa62078ca3311353b39cc3bf6c75da281338be6bbf672f8b361d828cddca3"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"124aa62078ca3311": {"kind":"object","properties":[{"name":"data","type":"da60ed58a8fa23d7","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"d4c799e3d51cae10","optional":false}],"indices":[]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"d4c799e3d51cae10": {"kind":"literal","value":"working-directory/change"},
|
||||
"da60ed58a8fa23d7": {"kind":"object","properties":[{"name":"cwd","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true}
|
||||
}
|
||||
}
|
||||
+232
-8473
File diff suppressed because it is too large.
Load diff
@@ -1,72 +1,14 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:workspace/changes",
|
||||
"kind": "event",
|
||||
"event": "workspace/changes",
|
||||
"surface": false,
|
||||
"digest": "e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "turn",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "workspace/changes"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:workspace/changes","kind":"event","event":"workspace/changes","surface":false,"digest":"e308ccf867a5398e316e0af8cb6ce238a8d33a63b9b384c8250a686786285f72"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"8e8155594e078123": {"kind":"literal","value":"workspace/changes"},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"e308ccf867a5398e": {"kind":"object","properties":[{"name":"data","type":"f90eb4ab2d3897bc","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"8e8155594e078123","optional":false}],"indices":[]},
|
||||
"f90eb4ab2d3897bc": {"kind":"object","properties":[{"name":"turn","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]}
|
||||
}
|
||||
}
|
||||
+351
-16207
File diff suppressed because it is too large.
Load diff
+25
-297
@@ -1,302 +1,30 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:schedule/change",
|
||||
"kind": "event",
|
||||
"event": "schedule/change",
|
||||
"surface": false,
|
||||
"digest": "a0a2e5c42e1c929445ecd1cd70f49be6b66441894ec72c08e8ae332821d4a3cb",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 19,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 20,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
2,
|
||||
6,
|
||||
8,
|
||||
9
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "acceptedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "operation",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "dispatch"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "operation",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "delete"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "operation",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "operation",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "schedule",
|
||||
"type": 11,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "create"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
12,
|
||||
15,
|
||||
17
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "afterSeconds",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 14,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "prompt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "title",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "after"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "everySeconds",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "prompt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "title",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "every"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "id",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "prompt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "title",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "at"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "schedule/change"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:schedule/change","kind":"event","event":"schedule/change","surface":false,"digest":"a0a2e5c42e1c929445ecd1cd70f49be6b66441894ec72c08e8ae332821d4a3cb"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0e7b2a97f54f1afd": {"kind":"literal","value":"schedule/change"},
|
||||
"17aae616ef020b8b": {"kind":"literal","value":"at"},
|
||||
"18dc21f12bbac8ad": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"d0fbb0ca1bbba059","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"26c879bdd130e8b8": {"kind":"literal","value":"dispatch"},
|
||||
"2e3523541e942ef6": {"kind":"union","types":["18dc21f12bbac8ad","8e8e91646a5cae3f","e6063d0451dc0202","eea687d437880bd5"]},
|
||||
"3fdf9582c3b5597d": {"kind":"object","properties":[{"name":"afterSeconds","type":"0657d3ca5ac4e7bf","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"5b232a9b9bfcc0fc","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
|
||||
"4b1e632e05776982": {"kind":"union","types":["3fdf9582c3b5597d","a926dc71814edd01","b63b089a00b3b935"]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"5b232a9b9bfcc0fc": {"kind":"literal","value":"after"},
|
||||
"7624ca28c61ca0ea": {"kind":"literal","value":"create"},
|
||||
"8e8e91646a5cae3f": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"26c879bdd130e8b8","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"a0a2e5c42e1c9294": {"kind":"object","properties":[{"name":"data","type":"2e3523541e942ef6","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"0e7b2a97f54f1afd","optional":false}],"indices":[]},
|
||||
"a926dc71814edd01": {"kind":"object","properties":[{"name":"everySeconds","type":"0657d3ca5ac4e7bf","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"e42b0f40b5d0b628","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
|
||||
"b63b089a00b3b935": {"kind":"object","properties":[{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"17aae616ef020b8b","optional":false},{"name":"prompt","type":"4cd48f3e5108bd6e","optional":false},{"name":"scheduledAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"title","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
|
||||
"d0fbb0ca1bbba059": {"kind":"literal","value":"delete"},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"e42b0f40b5d0b628": {"kind":"literal","value":"every"},
|
||||
"e6063d0451dc0202": {"kind":"object","properties":[{"name":"acceptedAt","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"operation","type":"26c879bdd130e8b8","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"eea687d437880bd5": {"kind":"object","properties":[{"name":"operation","type":"7624ca28c61ca0ea","optional":false},{"name":"schedule","type":"4b1e632e05776982","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"f88f1b7b6bb733f6": {"kind":"literal","value":1}
|
||||
}
|
||||
}
|
||||
+23
-285
@@ -1,290 +1,28 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:subagent/catalog",
|
||||
"kind": "event",
|
||||
"event": "subagent/catalog",
|
||||
"surface": false,
|
||||
"digest": "53750b9abf61efb7992b0aadc3e247ec927449c63266df28230fd1139f5590ac",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 17,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
2,
|
||||
7,
|
||||
9,
|
||||
12,
|
||||
14,
|
||||
15
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "continuable"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 0
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 11,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "external"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 2
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "one-shot"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "unknown"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "subagent/catalog"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:subagent/catalog","kind":"event","event":"subagent/catalog","surface":false,"digest":"53750b9abf61efb7992b0aadc3e247ec927449c63266df28230fd1139f5590ac"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"05a2796621b1ee6c": {"kind":"literal","value":"unknown"},
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0e10d7c096b47e61": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
|
||||
"44c8c77aa9aa100b": {"kind":"literal","value":"subagent/catalog"},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"53750b9abf61efb7": {"kind":"object","properties":[{"name":"data","type":"f731ffe80810b028","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44c8c77aa9aa100b","optional":false}],"indices":[]},
|
||||
"5d542ac7bdf13310": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
|
||||
"93d38436347f67c9": {"kind":"literal","value":0},
|
||||
"a0f25b5aeeebf2bf": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"05a2796621b1ee6c","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"a0f906856fc06f1c": {"kind":"literal","value":2},
|
||||
"b6896938660a1dfe": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"cbbe8377ee744964": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"fc351843b8ecbd05","optional":false},{"name":"version","type":"a0f906856fc06f1c","optional":false}],"indices":[]},
|
||||
"d28765f87d6b6ab4": {"kind":"literal","value":"one-shot"},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"e2ad8f5bcd813f26": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"e5d3828df1ec3e2a": {"kind":"literal","value":"continuable"},
|
||||
"f731ffe80810b028": {"kind":"union","types":["0e10d7c096b47e61","5d542ac7bdf13310","a0f25b5aeeebf2bf","b6896938660a1dfe","cbbe8377ee744964","e2ad8f5bcd813f26"]},
|
||||
"f88f1b7b6bb733f6": {"kind":"literal","value":1},
|
||||
"fc351843b8ecbd05": {"kind":"literal","value":"external"}
|
||||
}
|
||||
}
|
||||
+20
-245
@@ -1,250 +1,25 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:subagent/catalog",
|
||||
"kind": "event",
|
||||
"event": "subagent/catalog",
|
||||
"surface": false,
|
||||
"digest": "3abae7324356f155cb42450c00b806d134ec93bd6439d2063b8d724162d58604",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 14,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 15,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
2,
|
||||
7,
|
||||
9,
|
||||
11,
|
||||
12
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "continuable"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 0
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "one-shot"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "childCreatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "childId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "unknown"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "subagent/catalog"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:subagent/catalog","kind":"event","event":"subagent/catalog","surface":false,"digest":"3abae7324356f155cb42450c00b806d134ec93bd6439d2063b8d724162d58604"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"05a2796621b1ee6c": {"kind":"literal","value":"unknown"},
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0e10d7c096b47e61": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
|
||||
"1de64ea9a0849ce6": {"kind":"union","types":["0e10d7c096b47e61","5d542ac7bdf13310","a0f25b5aeeebf2bf","b6896938660a1dfe","e2ad8f5bcd813f26"]},
|
||||
"3abae7324356f155": {"kind":"object","properties":[{"name":"data","type":"1de64ea9a0849ce6","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44c8c77aa9aa100b","optional":false}],"indices":[]},
|
||||
"44c8c77aa9aa100b": {"kind":"literal","value":"subagent/catalog"},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"5d542ac7bdf13310": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"93d38436347f67c9","optional":false}],"indices":[]},
|
||||
"93d38436347f67c9": {"kind":"literal","value":0},
|
||||
"a0f25b5aeeebf2bf": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"05a2796621b1ee6c","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"b6896938660a1dfe": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":true},{"name":"mode","type":"d28765f87d6b6ab4","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"d28765f87d6b6ab4": {"kind":"literal","value":"one-shot"},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"e2ad8f5bcd813f26": {"kind":"object","properties":[{"name":"childCreatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"childId","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"mode","type":"e5d3828df1ec3e2a","optional":false},{"name":"version","type":"f88f1b7b6bb733f6","optional":false}],"indices":[]},
|
||||
"e5d3828df1ec3e2a": {"kind":"literal","value":"continuable"},
|
||||
"f88f1b7b6bb733f6": {"kind":"literal","value":1}
|
||||
}
|
||||
}
|
||||
+232
-11400
File diff suppressed because it is too large.
Load diff
+24
-292
@@ -1,297 +1,29 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:job/registered",
|
||||
"kind": "event",
|
||||
"event": "job/registered",
|
||||
"surface": false,
|
||||
"digest": "f5520c1d261ca86ea03735799c311a0a9ede8babb588cf0a65422576d2ee0ad1",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 5,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "jobId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "owner",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "startedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "toolCall",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "callId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "rootCallId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "job/registered"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "event:job/settled",
|
||||
"kind": "event",
|
||||
"event": "job/settled",
|
||||
"surface": false,
|
||||
"digest": "edd37b1e4974af648633014435572089b1e8fb71910468a0767a7e28fdd22abf",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 14,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 15,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "cause",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "detail",
|
||||
"type": 6,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "finishedAt",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "jobId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "label",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "owner",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "producerReported",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "startedAt",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "status",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "toolCall",
|
||||
"type": 13,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
3,
|
||||
4,
|
||||
5
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "producer"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "teardown"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "kill"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
10,
|
||||
11,
|
||||
12
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "completed"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "failed"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "killed"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "callId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "rootCallId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "job/settled"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:job/registered","kind":"event","event":"job/registered","surface":false,"digest":"f5520c1d261ca86ea03735799c311a0a9ede8babb588cf0a65422576d2ee0ad1"},
|
||||
{"key":"event:job/settled","kind":"event","event":"job/settled","surface":false,"digest":"edd37b1e4974af648633014435572089b1e8fb71910468a0767a7e28fdd22abf"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"1ebc6f9ff3aa9e3a": {"kind":"literal","value":"completed"},
|
||||
"24a8188c4d61b70a": {"kind":"literal","value":"job/registered"},
|
||||
"347de3380f2da308": {"kind":"literal","value":"job/settled"},
|
||||
"39cf2d3ff8bac81c": {"kind":"object","properties":[{"name":"callId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"5cb63db9fe57dc09": {"kind":"literal","value":"teardown"},
|
||||
"611d82d2dc50df70": {"kind":"object","properties":[{"name":"cause","type":"750a2b129d67704d","optional":false},{"name":"detail","type":"4cd48f3e5108bd6e","optional":true},{"name":"finishedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"jobId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"owner","type":"4cd48f3e5108bd6e","optional":false},{"name":"producerReported","type":"aa93010d0e521ad7","optional":false},{"name":"startedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"status","type":"c2f49004d9ae38a9","optional":false},{"name":"toolCall","type":"39cf2d3ff8bac81c","optional":true}],"indices":[]},
|
||||
"6cf082d0fb6034de": {"kind":"literal","value":"producer"},
|
||||
"750a2b129d67704d": {"kind":"union","types":["5cb63db9fe57dc09","6cf082d0fb6034de","bab6865794007548"]},
|
||||
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
|
||||
"b57a2889408de36e": {"kind":"literal","value":"failed"},
|
||||
"bab6865794007548": {"kind":"literal","value":"kill"},
|
||||
"c2f49004d9ae38a9": {"kind":"union","types":["1ebc6f9ff3aa9e3a","b57a2889408de36e","ef226a90ddac6cd8"]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"e3056e0dda3a379e": {"kind":"object","properties":[{"name":"jobId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"4cd48f3e5108bd6e","optional":false},{"name":"label","type":"4cd48f3e5108bd6e","optional":false},{"name":"owner","type":"4cd48f3e5108bd6e","optional":false},{"name":"startedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"toolCall","type":"39cf2d3ff8bac81c","optional":true}],"indices":[]},
|
||||
"edd37b1e4974af64": {"kind":"object","properties":[{"name":"data","type":"611d82d2dc50df70","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"347de3380f2da308","optional":false}],"indices":[]},
|
||||
"ef226a90ddac6cd8": {"kind":"literal","value":"killed"},
|
||||
"f5520c1d261ca86e": {"kind":"object","properties":[{"name":"data","type":"e3056e0dda3a379e","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"24a8188c4d61b70a","optional":false}],"indices":[]}
|
||||
}
|
||||
}
|
||||
+42
-452
@@ -1,457 +1,47 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:tool/ptc-dispatch",
|
||||
"kind": "event",
|
||||
"event": "tool/ptc-dispatch",
|
||||
"surface": false,
|
||||
"digest": "d66e11dddf5dfa3c71547e2cbd7b0608824cd8d6243fc16f532017ff28e8fba5",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 29,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 37,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "arguments",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "content",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "error",
|
||||
"type": 31,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "isError",
|
||||
"type": 32,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "meta",
|
||||
"type": 33,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "parentCallId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "rootCallId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "subCallId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "opaque",
|
||||
"reason": "unknown"
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 4
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
5,
|
||||
8,
|
||||
10,
|
||||
13,
|
||||
15,
|
||||
19,
|
||||
21
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "reasoning"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "text"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "tool",
|
||||
"type": 11,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "toolName",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 12,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "never"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-addition"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "toolName",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 14,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-removal"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "file"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "arguments",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 20,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool-call"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachment",
|
||||
"type": 22,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "offloaded",
|
||||
"type": 29,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 30,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "attachmentId",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "bytes",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "mediaType",
|
||||
"type": 23,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 6,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "originalDimensions",
|
||||
"type": 28,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/gif"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/jpeg"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/png"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image/webp"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "height",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "width",
|
||||
"type": 17,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "image"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "code",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "reason",
|
||||
"type": 6,
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
6,
|
||||
17,
|
||||
32,
|
||||
34,
|
||||
35,
|
||||
36
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "array",
|
||||
"element": 33
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [],
|
||||
"indices": [
|
||||
{
|
||||
"key": 6,
|
||||
"value": 33
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "tool/ptc-dispatch"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:tool/ptc-dispatch","kind":"event","event":"tool/ptc-dispatch","surface":false,"digest":"d66e11dddf5dfa3c71547e2cbd7b0608824cd8d6243fc16f532017ff28e8fba5"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0f46153645c29784": {"kind":"object","properties":[{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"12d5808fac1996b9": {"kind":"object","properties":[{"name":"attachment","type":"b0b0eb1b16490f6b","optional":false},{"name":"offloaded","type":"dacf3d5f3e4ff619","optional":true},{"name":"type","type":"fb8b6a2e53cb9cf4","optional":false}],"indices":[]},
|
||||
"1f0133217eeeffd8": {"kind":"literal","value":"tool-call"},
|
||||
"277b61f9c6f81704": {"kind":"literal","value":"file"},
|
||||
"2f1e6a7ebace43d7": {"kind":"union","types":["3f74ba74acd10644","58f94390b982f8a5","de30b1fa12c75f81","ebb768d85ec87fb6"]},
|
||||
"3c2535ca0a2062f1": {"kind":"literal","value":"reasoning"},
|
||||
"3f74ba74acd10644": {"kind":"literal","value":"image/jpeg"},
|
||||
"43e311235aa537df": {"kind":"object","properties":[{"name":"toolName","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"83d6916021eede8f","optional":false}],"indices":[]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"4e44c9118152f682": {"kind":"literal","value":"text"},
|
||||
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
|
||||
"529e0ccd0e34079a": {"kind":"object","properties":[],"indices":[{"key":"4cd48f3e5108bd6e","value":"c592ce75aab73fca"}]},
|
||||
"58f94390b982f8a5": {"kind":"literal","value":"image/png"},
|
||||
"72ec79127a9c0d02": {"kind":"array","element":"c592ce75aab73fca"},
|
||||
"8064c03c87c357fd": {"kind":"union","types":["12d5808fac1996b9","43e311235aa537df","4e88776858652856","814d9434e1ddf907","8e611bf46821e500","c1f0f17b6493b85d","f2da0f27c1e6add5"]},
|
||||
"814d9434e1ddf907": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"3c2535ca0a2062f1","optional":false}],"indices":[]},
|
||||
"83d6916021eede8f": {"kind":"literal","value":"tool-removal"},
|
||||
"85f9b505b7bdff1f": {"kind":"literal","value":"tool-addition"},
|
||||
"8e611bf46821e500": {"kind":"object","properties":[{"name":"tool","type":"fcf427290c6213c2","optional":true},{"name":"toolName","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"85f9b505b7bdff1f","optional":false}],"indices":[]},
|
||||
"938f7c7357bc403e": {"kind":"primitive","type":"null"},
|
||||
"a81059ca06999da1": {"kind":"object","properties":[{"name":"code","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"reason","type":"4cd48f3e5108bd6e","optional":true}],"indices":[]},
|
||||
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
|
||||
"b0b0eb1b16490f6b": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"height","type":"0657d3ca5ac4e7bf","optional":false},{"name":"mediaType","type":"2f1e6a7ebace43d7","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":true},{"name":"originalDimensions","type":"0f46153645c29784","optional":true},{"name":"width","type":"0657d3ca5ac4e7bf","optional":false}],"indices":[]},
|
||||
"b52f215a6cd69105": {"kind":"array","element":"8064c03c87c357fd"},
|
||||
"bbc5696e3f13c758": {"kind":"opaque","reason":"unknown"},
|
||||
"c1f0f17b6493b85d": {"kind":"object","properties":[{"name":"arguments","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"1f0133217eeeffd8","optional":false}],"indices":[]},
|
||||
"c592ce75aab73fca": {"kind":"union","types":["0657d3ca5ac4e7bf","4cd48f3e5108bd6e","529e0ccd0e34079a","72ec79127a9c0d02","938f7c7357bc403e","aa93010d0e521ad7"]},
|
||||
"cef171adf021a186": {"kind":"object","properties":[{"name":"arguments","type":"bbc5696e3f13c758","optional":false},{"name":"content","type":"b52f215a6cd69105","optional":false},{"name":"error","type":"a81059ca06999da1","optional":true},{"name":"isError","type":"aa93010d0e521ad7","optional":false},{"name":"meta","type":"c592ce75aab73fca","optional":true},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"parentCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"rootCallId","type":"4cd48f3e5108bd6e","optional":false},{"name":"subCallId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"d66e11dddf5dfa3c": {"kind":"object","properties":[{"name":"data","type":"cef171adf021a186","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"fb5e0517050d2c6d","optional":false}],"indices":[]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"de30b1fa12c75f81": {"kind":"literal","value":"image/gif"},
|
||||
"ebb768d85ec87fb6": {"kind":"literal","value":"image/webp"},
|
||||
"f19bee84bf3d2090": {"kind":"object","properties":[{"name":"attachmentId","type":"4cd48f3e5108bd6e","optional":false},{"name":"bytes","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"f2da0f27c1e6add5": {"kind":"object","properties":[{"name":"attachment","type":"f19bee84bf3d2090","optional":false},{"name":"type","type":"277b61f9c6f81704","optional":false}],"indices":[]},
|
||||
"fb5e0517050d2c6d": {"kind":"literal","value":"tool/ptc-dispatch"},
|
||||
"fb8b6a2e53cb9cf4": {"kind":"literal","value":"image"},
|
||||
"fcf427290c6213c2": {"kind":"primitive","type":"never"}
|
||||
}
|
||||
}
|
||||
+234
-11469
File diff suppressed because it is too large.
Load diff
+215
-2985
File diff suppressed because it is too large.
Load diff
+23
-226
@@ -1,231 +1,28 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:web/deepseek-search-llm-request",
|
||||
"kind": "event",
|
||||
"event": "web/deepseek-search-llm-request",
|
||||
"surface": false,
|
||||
"digest": "0c556c9b9f2a96238a6b9bbb99e748206cbff2ed6203041c9571f04ae5802f52",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 17,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 18,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "apiVersion",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "endpoint",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "max_tokens",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "messages",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "model",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "thinking",
|
||||
"type": 11,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "tools",
|
||||
"type": 13,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "tuple",
|
||||
"elements": [
|
||||
{
|
||||
"type": 6,
|
||||
"optional": false,
|
||||
"rest": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "content",
|
||||
"type": 7,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "role",
|
||||
"type": 10,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "tuple",
|
||||
"elements": [
|
||||
{
|
||||
"type": 8,
|
||||
"optional": false,
|
||||
"rest": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "text",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "text"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "user"
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "type",
|
||||
"type": 12,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "disabled"
|
||||
},
|
||||
{
|
||||
"kind": "tuple",
|
||||
"elements": [
|
||||
{
|
||||
"type": 14,
|
||||
"optional": false,
|
||||
"rest": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "max_uses",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": 15,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 16,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "web_search"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "web_search_20250305"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "web/deepseek-search-llm-request"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:web/deepseek-search-llm-request","kind":"event","event":"web/deepseek-search-llm-request","surface":false,"digest":"0c556c9b9f2a96238a6b9bbb99e748206cbff2ed6203041c9571f04ae5802f52"}
|
||||
],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {
|
||||
"0116b1f89c05221d": {"kind":"literal","value":"web_search_20250305"},
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"0b9b8facbe2c1977": {"kind":"literal","value":"disabled"},
|
||||
"0c556c9b9f2a9623": {"kind":"object","properties":[{"name":"data","type":"abd6ca62a5ab1665","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"6f611bed14b21065","optional":false}],"indices":[]},
|
||||
"2d11ca7b0d4493e2": {"kind":"object","properties":[{"name":"max_uses","type":"0657d3ca5ac4e7bf","optional":false},{"name":"name","type":"935c8d486292b13c","optional":false},{"name":"type","type":"0116b1f89c05221d","optional":false}],"indices":[]},
|
||||
"37ff65426bcf130f": {"kind":"object","properties":[{"name":"type","type":"0b9b8facbe2c1977","optional":false}],"indices":[]},
|
||||
"4aed17ec726b5397": {"kind":"tuple","elements":[{"type":"2d11ca7b0d4493e2","optional":false,"rest":false}]},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"4e44c9118152f682": {"kind":"literal","value":"text"},
|
||||
"4e88776858652856": {"kind":"object","properties":[{"name":"text","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"4e44c9118152f682","optional":false}],"indices":[]},
|
||||
"68f44f59e91c4139": {"kind":"literal","value":"user"},
|
||||
"6f611bed14b21065": {"kind":"literal","value":"web/deepseek-search-llm-request"},
|
||||
"8f6d609794bf5afc": {"kind":"tuple","elements":[{"type":"4e88776858652856","optional":false,"rest":false}]},
|
||||
"935c8d486292b13c": {"kind":"literal","value":"web_search"},
|
||||
"9a2a9029f8d7ede0": {"kind":"object","properties":[{"name":"content","type":"8f6d609794bf5afc","optional":false},{"name":"role","type":"68f44f59e91c4139","optional":false}],"indices":[]},
|
||||
"9c001ecb5e1d3c38": {"kind":"object","properties":[{"name":"max_tokens","type":"0657d3ca5ac4e7bf","optional":false},{"name":"messages","type":"b993441f8ce7d27b","optional":false},{"name":"model","type":"4cd48f3e5108bd6e","optional":false},{"name":"thinking","type":"37ff65426bcf130f","optional":true},{"name":"tools","type":"4aed17ec726b5397","optional":false}],"indices":[]},
|
||||
"abd6ca62a5ab1665": {"kind":"object","properties":[{"name":"apiVersion","type":"4cd48f3e5108bd6e","optional":false},{"name":"body","type":"9c001ecb5e1d3c38","optional":false},{"name":"endpoint","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"b993441f8ce7d27b": {"kind":"tuple","elements":[{"type":"9a2a9029f8d7ede0","optional":false,"rest":false}]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true}
|
||||
}
|
||||
}
|
||||
+236
-11554
File diff suppressed because it is too large.
Load diff
@@ -15,8 +15,8 @@
|
||||
en: 1ba6efaa0b5d6e47
|
||||
zh: 6e216391ad24c541
|
||||
/persistence-type-change-records/files-and-ownership:
|
||||
en: 6cd0f79a9455bdf2
|
||||
zh: a5978b7834c0802b
|
||||
en: 41d4ab88aac68e7e
|
||||
zh: 062d65578a1dbb53
|
||||
/persistence-type-change-records/compatibility-rules:
|
||||
en: 218b28a5096b5e7d
|
||||
zh: 5b987c852e204893
|
||||
|
||||
@@ -28,6 +28,8 @@ For complete schemas grouped by Session format, use the [format references](hist
|
||||
|
||||
The generated [catalog](../persistence-catalog.md) provides readable declarations and digests; the [schema inventory](../persistence-schema.json) contains the normalized types. Roots cover the logical Session header, the physical JSONL header line, the event envelope, and every repository-declared event. Referenced types contribute transitively to each affected root's digest.
|
||||
|
||||
Each `.schema.json` file stores one node table keyed by the first 16 hexadecimal digits of each node's subgraph digest, with one root, type, or node per line. Roots and types locate their graphs through their own digests, so a type change rewrites only the changed nodes, their ancestors, and the affected digests. Generators own the exact text; verifiers reject any other layout.
|
||||
|
||||
Each dated record has four sibling files:
|
||||
|
||||
| File | Owner |
|
||||
|
||||
@@ -28,6 +28,8 @@ description: "审阅和维护已记录的会话持久化类型变更、对应 sc
|
||||
|
||||
生成的[目录](../persistence-catalog.zh.md)提供可读声明和摘要;[schema 清单](../persistence-schema.json)包含规范化类型。根覆盖逻辑会话头、物理 JSONL 头行、事件封装以及每个仓库内声明的事件。被引用类型的变更会传递到每个受影响根的摘要。
|
||||
|
||||
每个 `.schema.json` 文件存储一张节点表,键为节点子图摘要的前 16 位十六进制字符,每个根、类型或节点占一行。根和类型通过自身摘要定位其图,因此类型变更只改写变化的节点、其祖先节点以及受影响的摘要。生成器决定确切文本;校验器拒绝其他布局。
|
||||
|
||||
每条带日期的记录有四个同目录文件:
|
||||
|
||||
| 文件 | 职责 |
|
||||
|
||||
+887
-49302
File diff suppressed because it is too large.
Load diff
+887
-49405
File diff suppressed because it is too large.
Load diff
+929
-56460
File diff suppressed because it is too large.
Load diff
+997
-61301
File diff suppressed because it is too large.
Load diff
+727
-39862
File diff suppressed because it is too large.
Load diff
+788
-43336
File diff suppressed because it is too large.
Load diff
+255
-19446
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
+118
-5314
File diff suppressed because it is too large.
Load diff
+287
-21252
File diff suppressed because it is too large.
Load diff
+24
-411
@@ -1,417 +1,30 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:permission/preset",
|
||||
"kind": "event",
|
||||
"event": "permission/preset",
|
||||
"surface": false,
|
||||
"digest": "7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 7,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "origin",
|
||||
"type": 2,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "preset",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
3,
|
||||
4,
|
||||
5
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "inferred"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "selection"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "permission/preset"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:permission/preset","kind":"event","event":"permission/preset","surface":false,"digest":"7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22"}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"digest": "0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "19a9088b778dbc75c9c3158d0145b3e1d3b9bba253821e249f869db82e98b713",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "inferred"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/attachment/attachment/src/brand.ts#AttachmentId",
|
||||
"packages/compaction/compaction/src/brand.ts#CompactionId",
|
||||
"packages/core/session/src/types.ts#SessionId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamMessageId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamTaskId",
|
||||
"packages/goal/goal/src/types.ts#GoalId",
|
||||
"packages/host/apiproxy/src/api/rpc.ts#RpcId",
|
||||
"packages/interaction/commands/src/brand.ts#CommandId",
|
||||
"packages/interaction/user-approval/src/types.ts#ApprovalRequestId",
|
||||
"packages/llm/llm-retry/src/brand.ts#RetryId",
|
||||
"packages/llm/llm/src/brand.ts#CallId",
|
||||
"packages/llm/llm/src/brand.ts#MessageId",
|
||||
"packages/llm/llm/src/brand.ts#ProviderRequestId",
|
||||
"packages/llm/llm/src/brand.ts#ReasoningEffortId",
|
||||
"packages/schedule/schedule/src/types.ts#ScheduleId",
|
||||
"packages/session/session-title/src/index.ts#SessionTitleProviderId",
|
||||
"packages/workflow/workflow/src/types.ts#WorkflowRunId"
|
||||
],
|
||||
"sources": [
|
||||
"packages/attachment/attachment/src/brand.ts",
|
||||
"packages/compaction/compaction/src/brand.ts",
|
||||
"packages/core/session/src/types.ts",
|
||||
"packages/experimental/agent-team/src/types.ts",
|
||||
"packages/goal/goal/src/types.ts",
|
||||
"packages/host/apiproxy/src/api/rpc.ts",
|
||||
"packages/interaction/commands/src/brand.ts",
|
||||
"packages/interaction/user-approval/src/types.ts",
|
||||
"packages/llm/llm-retry/src/brand.ts",
|
||||
"packages/llm/llm/src/brand.ts",
|
||||
"packages/schedule/schedule/src/types.ts",
|
||||
"packages/session/session-title/src/index.ts",
|
||||
"packages/workflow/workflow/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "6c5d5215ad72616561350f3be63f968e321e75360d9de2a9408994d45d3be76f",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
1,
|
||||
2,
|
||||
3
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "inferred"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "selection"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"event:permission/preset[0].data.origin"
|
||||
],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 7,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 8,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "origin",
|
||||
"type": 2,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "preset",
|
||||
"type": 6,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
3,
|
||||
4,
|
||||
5
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "inferred"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "selection"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "permission/preset"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"event:permission/preset",
|
||||
"event:permission/preset[0]"
|
||||
],
|
||||
"sources": [
|
||||
"packages/core/session/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "78d7455eb6b3c8da4d70c104eadd69d4a60df1c449e855517a60673b889e03fa",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "selection"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "ae63d9d1080ed8945031594d93f8d96651d7101b848719cc3e1475875cd3d649",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "permission/preset"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "d66ba5eb62ddba9fc264067c47d1152ca3bd8c2bdf2ededb66695e04ab588550",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "default"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "ebaac53bc4e8eb2ef8870c1ac58976a8a54987e3e412126b9f617f42bcd49829",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "origin",
|
||||
"type": 1,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "preset",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "inferred"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "selection"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"event:permission/preset[0].data"
|
||||
],
|
||||
"sources": [
|
||||
"packages/interaction/permission-presets/src/index.ts"
|
||||
]
|
||||
}
|
||||
]
|
||||
{"digest":"0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7","names":[],"sources":[]},
|
||||
{"digest":"19a9088b778dbc75c9c3158d0145b3e1d3b9bba253821e249f869db82e98b713","names":[],"sources":[]},
|
||||
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/agent-team/src/types.ts#TeamId","packages/experimental/agent-team/src/types.ts#TeamMessageId","packages/experimental/agent-team/src/types.ts#TeamTaskId","packages/goal/goal/src/types.ts#GoalId","packages/host/apiproxy/src/api/rpc.ts#RpcId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#CallId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/attachment/attachment/src/brand.ts","packages/compaction/compaction/src/brand.ts","packages/core/session/src/types.ts","packages/experimental/agent-team/src/types.ts","packages/goal/goal/src/types.ts","packages/host/apiproxy/src/api/rpc.ts","packages/interaction/commands/src/brand.ts","packages/interaction/user-approval/src/types.ts","packages/llm/llm-retry/src/brand.ts","packages/llm/llm/src/brand.ts","packages/schedule/schedule/src/types.ts","packages/session/session-title/src/index.ts","packages/workflow/workflow/src/types.ts"]},
|
||||
{"digest":"6c5d5215ad72616561350f3be63f968e321e75360d9de2a9408994d45d3be76f","names":["event:permission/preset[0].data.origin"],"sources":[]},
|
||||
{"digest":"7271e4b771406aaf06014c2269edd6cb68055bb8b8686571730813ce0ababc22","names":["event:permission/preset","event:permission/preset[0]"],"sources":["packages/core/session/src/types.ts"]},
|
||||
{"digest":"78d7455eb6b3c8da4d70c104eadd69d4a60df1c449e855517a60673b889e03fa","names":[],"sources":[]},
|
||||
{"digest":"ae63d9d1080ed8945031594d93f8d96651d7101b848719cc3e1475875cd3d649","names":[],"sources":[]},
|
||||
{"digest":"d66ba5eb62ddba9fc264067c47d1152ca3bd8c2bdf2ededb66695e04ab588550","names":[],"sources":[]},
|
||||
{"digest":"dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521","names":[],"sources":[]},
|
||||
{"digest":"ebaac53bc4e8eb2ef8870c1ac58976a8a54987e3e412126b9f617f42bcd49829","names":["event:permission/preset[0].data"],"sources":["packages/interaction/permission-presets/src/index.ts"]}
|
||||
],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"19a9088b778dbc75": {"kind":"literal","value":"inferred"},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"6c5d5215ad726165": {"kind":"union","types":["19a9088b778dbc75","78d7455eb6b3c8da","d66ba5eb62ddba9f"]},
|
||||
"7271e4b771406aaf": {"kind":"object","properties":[{"name":"data","type":"ebaac53bc4e8eb2e","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"ae63d9d1080ed894","optional":false}],"indices":[]},
|
||||
"78d7455eb6b3c8da": {"kind":"literal","value":"selection"},
|
||||
"ae63d9d1080ed894": {"kind":"literal","value":"permission/preset"},
|
||||
"d66ba5eb62ddba9f": {"kind":"literal","value":"default"},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"ebaac53bc4e8eb2e": {"kind":"object","properties":[{"name":"origin","type":"6c5d5215ad726165","optional":true},{"name":"preset","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]}
|
||||
}
|
||||
}
|
||||
+351
-29666
File diff suppressed because it is too large.
Load diff
+881
-48423
File diff suppressed because it is too large.
Load diff
+881
-49341
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
+217
-17636
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
+441
-38672
File diff suppressed because it is too large.
Load diff
+31
-777
@@ -1,783 +1,37 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [
|
||||
{
|
||||
"key": "event:feedback/message-delete",
|
||||
"kind": "event",
|
||||
"event": "feedback/message-delete",
|
||||
"surface": false,
|
||||
"digest": "3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-delete"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "event:feedback/message-put",
|
||||
"kind": "event",
|
||||
"event": "feedback/message-put",
|
||||
"surface": false,
|
||||
"digest": "3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 8,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "item",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "createdAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "note",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "rating",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "updatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
6,
|
||||
7
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-put"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{"key":"event:feedback/message-delete","kind":"event","event":"feedback/message-delete","surface":false,"digest":"3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796"},
|
||||
{"key":"event:feedback/message-put","kind":"event","event":"feedback/message-put","surface":false,"digest":"3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1"}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"digest": "0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/core/session/src/types.ts#SessionSeq"
|
||||
],
|
||||
"sources": [
|
||||
"packages/core/session/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
1,
|
||||
2
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackRating"
|
||||
],
|
||||
"sources": [
|
||||
"packages/feedback/message-feedback/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 8,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 9,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "item",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "createdAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "note",
|
||||
"type": 4,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "rating",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "updatedAt",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
6,
|
||||
7
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-put"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"event:feedback/message-put",
|
||||
"event:feedback/message-put[0]"
|
||||
],
|
||||
"sources": [
|
||||
"packages/core/session/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "data",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "ignorable",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "seq",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"type": 5,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-delete"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"event:feedback/message-delete",
|
||||
"event:feedback/message-delete[0]"
|
||||
],
|
||||
"sources": [
|
||||
"packages/core/session/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "44818000e56acb97afdb5045ce235eb55e3fb1ccabc9fc7d0750bb38f36a7f8e",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-delete"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/api/session-controller/src/types.ts#SessionRequestId",
|
||||
"packages/attachment/attachment/src/brand.ts#AttachmentId",
|
||||
"packages/compaction/compaction/src/brand.ts#CompactionId",
|
||||
"packages/core/session/src/types.ts#SessionId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamMessageId",
|
||||
"packages/experimental/agent-team/src/types.ts#TeamTaskId",
|
||||
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion",
|
||||
"packages/goal/goal/src/types.ts#GoalId",
|
||||
"packages/interaction/commands/src/brand.ts#CommandId",
|
||||
"packages/interaction/user-approval/src/types.ts#ApprovalRequestId",
|
||||
"packages/llm/llm-retry/src/brand.ts#RetryId",
|
||||
"packages/llm/llm/src/brand.ts#MessageId",
|
||||
"packages/llm/llm/src/brand.ts#ProviderRequestId",
|
||||
"packages/llm/llm/src/brand.ts#ReasoningEffortId",
|
||||
"packages/llm/llm/src/brand.ts#ToolCallId",
|
||||
"packages/schedule/schedule/src/types.ts#ScheduleId",
|
||||
"packages/session/session-title/src/index.ts#SessionTitleProviderId",
|
||||
"packages/session/session-title/src/types.ts#SessionTitleProviderId",
|
||||
"packages/webhook/webhook/src/brand.ts#WebhookDeliveryId",
|
||||
"packages/webhook/webhook/src/brand.ts#WebhookRuleId",
|
||||
"packages/webhook/webhook/src/brand.ts#WebhookSourceId",
|
||||
"packages/workflow/workflow/src/types.ts#WorkflowRunId"
|
||||
],
|
||||
"sources": [
|
||||
"packages/api/session-controller/src/types.ts",
|
||||
"packages/attachment/attachment/src/brand.ts",
|
||||
"packages/compaction/compaction/src/brand.ts",
|
||||
"packages/core/session/src/types.ts",
|
||||
"packages/experimental/agent-team/src/types.ts",
|
||||
"packages/feedback/message-feedback/src/types.ts",
|
||||
"packages/goal/goal/src/types.ts",
|
||||
"packages/interaction/commands/src/brand.ts",
|
||||
"packages/interaction/user-approval/src/types.ts",
|
||||
"packages/llm/llm-retry/src/brand.ts",
|
||||
"packages/llm/llm/src/brand.ts",
|
||||
"packages/schedule/schedule/src/types.ts",
|
||||
"packages/session/session-title/src/index.ts",
|
||||
"packages/session/session-title/src/types.ts",
|
||||
"packages/webhook/webhook/src/brand.ts",
|
||||
"packages/workflow/workflow/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "6cda0d6d3b4336d83998fe580628426df81c2afbab5d768b8813b56d569120e8",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "feedback/message-put"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "7c6129b6961cf4b2a030f36c78d2b0a5be38617651a9b81322e054ee512bee06",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackDelete"
|
||||
],
|
||||
"sources": [
|
||||
"packages/feedback/message-feedback/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "b1f62380f6746fedd629e71065e3583cef83334875b499ac9665c2eb87acfbf5",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "cb1df23dfd315032b6d34b3c5fe2c4e3d07f7b60334ab9afd9f17da48ad09379",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "item",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "sessionId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "createdAt",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "note",
|
||||
"type": 3,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "rating",
|
||||
"type": 4,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "updatedAt",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
5,
|
||||
6
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackPut"
|
||||
],
|
||||
"sources": [
|
||||
"packages/feedback/message-feedback/src/types.ts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"digest": "dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "df5d9709b7db2a72510dc52052a23f0c38f39730af1504bab8bccabc14fae528",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [],
|
||||
"sources": []
|
||||
},
|
||||
{
|
||||
"digest": "e68568d70fde1c0701e8d3e7645e5bb796f856ca42f349b5479032c254f27375",
|
||||
"schema": {
|
||||
"root": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"kind": "object",
|
||||
"properties": [
|
||||
{
|
||||
"name": "createdAt",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "messageId",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "note",
|
||||
"type": 2,
|
||||
"optional": true
|
||||
},
|
||||
{
|
||||
"name": "rating",
|
||||
"type": 3,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "updatedAt",
|
||||
"type": 1,
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": 2,
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"indices": []
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"kind": "primitive",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"kind": "union",
|
||||
"types": [
|
||||
4,
|
||||
5
|
||||
]
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "negative"
|
||||
},
|
||||
{
|
||||
"kind": "literal",
|
||||
"value": "positive"
|
||||
}
|
||||
]
|
||||
},
|
||||
"names": [
|
||||
"packages/feedback/message-feedback/src/types.ts#MessageFeedbackItem"
|
||||
],
|
||||
"sources": [
|
||||
"packages/feedback/message-feedback/src/types.ts"
|
||||
]
|
||||
}
|
||||
]
|
||||
{"digest":"0657d3ca5ac4e7bf79b00bcf860b1c7159d01a9da137497221ec2f1776e365f7","names":["packages/core/session/src/types.ts#SessionSeq"],"sources":["packages/core/session/src/types.ts"]},
|
||||
{"digest":"390eed1028aba02774f14408647acec10ec5516e97d4f15ecde2b9989d5a69f2","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackRating"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
|
||||
{"digest":"3b04fde0dc763cf84fbde7b6611b3194dd56d95d0c0bf0204311640468d586e1","names":["event:feedback/message-put","event:feedback/message-put[0]"],"sources":["packages/core/session/src/types.ts"]},
|
||||
{"digest":"3ee93b06f3a125850337602bcdf155d2538c43a5c944ec55b1b3c365152d6796","names":["event:feedback/message-delete","event:feedback/message-delete[0]"],"sources":["packages/core/session/src/types.ts"]},
|
||||
{"digest":"44818000e56acb97afdb5045ce235eb55e3fb1ccabc9fc7d0750bb38f36a7f8e","names":[],"sources":[]},
|
||||
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/api/session-controller/src/types.ts#SessionRequestId","packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/agent-team/src/types.ts#TeamId","packages/experimental/agent-team/src/types.ts#TeamMessageId","packages/experimental/agent-team/src/types.ts#TeamTaskId","packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion","packages/goal/goal/src/types.ts#GoalId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/llm/llm/src/brand.ts#ToolCallId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/session/session-title/src/types.ts#SessionTitleProviderId","packages/webhook/webhook/src/brand.ts#WebhookDeliveryId","packages/webhook/webhook/src/brand.ts#WebhookRuleId","packages/webhook/webhook/src/brand.ts#WebhookSourceId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/api/session-controller/src/types.ts","packages/attachment/attachment/src/brand.ts","packages/compaction/compaction/src/brand.ts","packages/core/session/src/types.ts","packages/experimental/agent-team/src/types.ts","packages/feedback/message-feedback/src/types.ts","packages/goal/goal/src/types.ts","packages/interaction/commands/src/brand.ts","packages/interaction/user-approval/src/types.ts","packages/llm/llm-retry/src/brand.ts","packages/llm/llm/src/brand.ts","packages/schedule/schedule/src/types.ts","packages/session/session-title/src/index.ts","packages/session/session-title/src/types.ts","packages/webhook/webhook/src/brand.ts","packages/workflow/workflow/src/types.ts"]},
|
||||
{"digest":"6cda0d6d3b4336d83998fe580628426df81c2afbab5d768b8813b56d569120e8","names":[],"sources":[]},
|
||||
{"digest":"7c6129b6961cf4b2a030f36c78d2b0a5be38617651a9b81322e054ee512bee06","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackDelete"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
|
||||
{"digest":"b1f62380f6746fedd629e71065e3583cef83334875b499ac9665c2eb87acfbf5","names":[],"sources":[]},
|
||||
{"digest":"cb1df23dfd315032b6d34b3c5fe2c4e3d07f7b60334ab9afd9f17da48ad09379","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackPut"],"sources":["packages/feedback/message-feedback/src/types.ts"]},
|
||||
{"digest":"dacf3d5f3e4ff619c1320e64a48dec5e7ecd7870bece65fbd449a0e63adfa521","names":[],"sources":[]},
|
||||
{"digest":"df5d9709b7db2a72510dc52052a23f0c38f39730af1504bab8bccabc14fae528","names":[],"sources":[]},
|
||||
{"digest":"e68568d70fde1c0701e8d3e7645e5bb796f856ca42f349b5479032c254f27375","names":["packages/feedback/message-feedback/src/types.ts#MessageFeedbackItem"],"sources":["packages/feedback/message-feedback/src/types.ts"]}
|
||||
],
|
||||
"nodes": {
|
||||
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
|
||||
"390eed1028aba027": {"kind":"union","types":["b1f62380f6746fed","df5d9709b7db2a72"]},
|
||||
"3b04fde0dc763cf8": {"kind":"object","properties":[{"name":"data","type":"cb1df23dfd315032","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"6cda0d6d3b4336d8","optional":false}],"indices":[]},
|
||||
"3ee93b06f3a12585": {"kind":"object","properties":[{"name":"data","type":"7c6129b6961cf4b2","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"44818000e56acb97","optional":false}],"indices":[]},
|
||||
"44818000e56acb97": {"kind":"literal","value":"feedback/message-delete"},
|
||||
"4cd48f3e5108bd6e": {"kind":"primitive","type":"string"},
|
||||
"6cda0d6d3b4336d8": {"kind":"literal","value":"feedback/message-put"},
|
||||
"7c6129b6961cf4b2": {"kind":"object","properties":[{"name":"messageId","type":"4cd48f3e5108bd6e","optional":false},{"name":"sessionId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"b1f62380f6746fed": {"kind":"literal","value":"negative"},
|
||||
"cb1df23dfd315032": {"kind":"object","properties":[{"name":"item","type":"e68568d70fde1c07","optional":false},{"name":"sessionId","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]},
|
||||
"dacf3d5f3e4ff619": {"kind":"literal","value":true},
|
||||
"df5d9709b7db2a72": {"kind":"literal","value":"positive"},
|
||||
"e68568d70fde1c07": {"kind":"object","properties":[{"name":"createdAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"messageId","type":"4cd48f3e5108bd6e","optional":false},{"name":"note","type":"4cd48f3e5108bd6e","optional":true},{"name":"rating","type":"390eed1028aba027","optional":false},{"name":"updatedAt","type":"0657d3ca5ac4e7bf","optional":false},{"name":"version","type":"4cd48f3e5108bd6e","optional":false}],"indices":[]}
|
||||
}
|
||||
}
|
||||
+377
-24591
File diff suppressed because it is too large.
Load diff
+75
-2126
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"roots": [],
|
||||
"types": []
|
||||
"types": [],
|
||||
"nodes": {}
|
||||
}
|
||||
Generated
+1296
-26171
File diff suppressed because it is too large.
Load diff
@@ -21,7 +21,7 @@ import { collectPluginRecords, type PluginRecordEntry } from './plugin-record-ca
|
||||
|
||||
export { annotateSurface, collectEventEnvelopeTypes, collectLogEvents, collectSurfaceEventTypes } from './persistence-catalog-source.ts'
|
||||
export type { AnnotatedLogEventEntry, EventEnvelopeTypeEntry, LogEventEntry } from './persistence-catalog-source.ts'
|
||||
import { persistenceSchemaSnapshot, type PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
import { encodePersistenceSnapshot, type PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
import { renderPersistenceSchemaDefinitions, renderPersistenceSchemaIndex } from './render-persistence-schema.ts'
|
||||
|
||||
const root = resolve(import.meta.dirname, '..')
|
||||
@@ -225,7 +225,7 @@ export function persistenceCatalogArtifacts(scanRoot: string, schema: Persistenc
|
||||
...renderPersistencePair(scanRoot, OUT, render(events, envelope, schema), render(events, envelope, schema, 'zh')),
|
||||
...renderPersistencePair(scanRoot, OUT_PLUGIN_RECORDS, renderPluginRecordCatalog(pluginRecords), renderPluginRecordCatalog(pluginRecords, 'zh')),
|
||||
{ path: OUT_RUNTIME_TYPES, content: renderKnownEventTypes(events) },
|
||||
{ path: OUT_SCHEMA, content: `${JSON.stringify(persistenceSchemaSnapshot(schema), null, 2)}\n` },
|
||||
{ path: OUT_SCHEMA, content: encodePersistenceSnapshot(schema) },
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -2085,11 +2085,10 @@
|
||||
"ebe146aded1e6f3e71f166a7f88720e560b336bbb92d19cea0b2bdab58c46f8a": 1
|
||||
},
|
||||
"scripts/persistence-changes.ts": {
|
||||
"2c01874686204d2e1723ae4a9c54f15c98a53cc1e88682b0b432f79f91dd28ac": 3,
|
||||
"2c01874686204d2e1723ae4a9c54f15c98a53cc1e88682b0b432f79f91dd28ac": 1,
|
||||
"eff6e18c764150f86c2db750beb6df4dc99d4ae44bbd9c745d092afda3f45982": 1
|
||||
},
|
||||
"scripts/persistence-developer.spec.ts": {
|
||||
"325d28707ea86aa06f716bd3c4bd21d9c4e91727a778513fe4271bfd2c04c3c5": 1,
|
||||
"908e86b966e23795a88c1adc8a8b0326a1dbbd40f03c48104ca7acb3f4f08157": 1
|
||||
},
|
||||
"scripts/persistence-releases.ts": {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSyn
|
||||
import { tmpdir } from 'node:os'
|
||||
import { join, posix, resolve } from 'node:path'
|
||||
import { afterEach, describe, expect, it } from 'vitest'
|
||||
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest } from './persistence-schema-model.ts'
|
||||
import type { PersistenceRoot, PersistenceSchemaInventory, SchemaNode, SchemaProperty, SourceCompatibility } from './persistence-schema-model.ts'
|
||||
import { extractPersistenceSchema } from './persistence-schema.ts'
|
||||
import { persistenceCatalogArtifacts } from './gen-persistence-catalog.ts'
|
||||
@@ -25,7 +25,7 @@ function runPersistenceChanges(
|
||||
args: readonly string[], root: string, extract: (root: string) => PersistenceSchemaInventory,
|
||||
): string {
|
||||
return executePersistenceChanges(args, root, extract, (_root, current) => [{
|
||||
path: 'docs/persistence-schema.json', content: JSON.stringify(current, null, 2) + '\n',
|
||||
path: 'docs/persistence-schema.json', content: encodePersistenceSnapshot(current),
|
||||
}])
|
||||
}
|
||||
|
||||
@@ -102,6 +102,25 @@ function entry(
|
||||
}
|
||||
}
|
||||
|
||||
interface SnapshotText {
|
||||
formatVersion: number
|
||||
roots: Record<string, unknown>[]
|
||||
types: Record<string, unknown>[]
|
||||
nodes: Record<string, Record<string, unknown>>
|
||||
}
|
||||
|
||||
/** Encode a snapshot, then apply one invalid edit to its committed JSON fields. */
|
||||
function tamper(snapshot: PersistenceSchemaInventory, change: (value: SnapshotText) => void): string {
|
||||
const value = JSON.parse(encodePersistenceSnapshot(snapshot)) as SnapshotText
|
||||
change(value)
|
||||
return JSON.stringify(value)
|
||||
}
|
||||
|
||||
/** Replace the node that the first root graph starts from. */
|
||||
function replaceRootNode(node: Record<string, unknown>): (value: SnapshotText) => void {
|
||||
return (value) => { value.nodes[String(value.roots[0]!.digest).slice(0, 16)] = node }
|
||||
}
|
||||
|
||||
const BASE_ID = '2026-09-11-baseline'
|
||||
const NEXT_ID = '2026-09-11-change'
|
||||
|
||||
@@ -126,7 +145,7 @@ describe('historical persistence snapshot parsing', () => {
|
||||
const root = snapshot.roots[0]!
|
||||
const sources = ['packages/core/example/src/types.ts']
|
||||
const complete = { ...snapshot, types: [{ schema: root.schema, digest: root.digest, names: ['Example'], sources }] }
|
||||
expect(parseHistoricalPersistenceSnapshot(complete)).toEqual(complete)
|
||||
expect(parseHistoricalPersistenceSnapshot(encodePersistenceSnapshot(complete))).toEqual(complete)
|
||||
})
|
||||
|
||||
it.each([':8', ':8:3', '#L8', '#L8-L12'])('rejects source coordinates %s only in historical inventories', (suffix) => {
|
||||
@@ -134,29 +153,31 @@ describe('historical persistence snapshot parsing', () => {
|
||||
const root = snapshot.roots[0]!
|
||||
const sources = [`packages/core/example/src/types.ts${suffix}`]
|
||||
const complete = { ...snapshot, types: [{ schema: root.schema, digest: root.digest, names: [], sources }] }
|
||||
expect(() => parseHistoricalPersistenceSnapshot(complete)).toThrow('historical schema sources must omit line numbers')
|
||||
expect(parsePersistenceSnapshot(complete)).toEqual(complete)
|
||||
expect(() => parseHistoricalPersistenceSnapshot(encodePersistenceSnapshot(complete))).toThrow('historical schema sources must omit line numbers')
|
||||
expect(parsePersistenceSnapshot(encodePersistenceSnapshot(complete))).toEqual(complete)
|
||||
})
|
||||
|
||||
it('admits optional surface operations only through the historical parser', () => {
|
||||
const snapshot = historicalSurface('optional')
|
||||
expect(() => parsePersistenceSnapshot(snapshot)).toThrow('surface metadata')
|
||||
expect(parseHistoricalPersistenceSnapshot(snapshot)).toEqual(snapshot)
|
||||
expect(parsePersistenceSnapshot(historicalSurface('required'))).toEqual(historicalSurface('required'))
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot(snapshot))).toThrow('surface metadata')
|
||||
expect(parseHistoricalPersistenceSnapshot(encodePersistenceSnapshot(snapshot))).toEqual(snapshot)
|
||||
expect(parsePersistenceSnapshot(encodePersistenceSnapshot(historicalSurface('required')))).toEqual(historicalSurface('required'))
|
||||
})
|
||||
|
||||
it('still rejects absent operations, mismatched event tags, and invalid roots', () => {
|
||||
expect(() => parseHistoricalPersistenceSnapshot(historicalSurface('absent'))).toThrow('surface metadata')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(historicalSurface('optional', 'wrong/tag'))).toThrow('type does not match')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(encodePersistenceSnapshot(historicalSurface('absent')))).toThrow('surface metadata')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(encodePersistenceSnapshot(historicalSurface('optional', 'wrong/tag')))).toThrow('type does not match')
|
||||
const snapshot = historicalSurface('optional')
|
||||
expect(() => parseHistoricalPersistenceSnapshot({ ...snapshot, roots: snapshot.roots.map(root => ({ ...root, key: 'event:wrong/key' })) })).toThrow('invalid event root key')
|
||||
expect(() => parseHistoricalPersistenceSnapshot({ ...snapshot, roots: snapshot.roots.map(root => ({ ...root, surface: false })) })).toThrow('surface metadata')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(tamper(snapshot, (value) => { value.roots[0]!.key = 'event:wrong/key' }))).toThrow('invalid event root key')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(tamper(snapshot, (value) => { value.roots[0]!.surface = false }))).toThrow('surface metadata')
|
||||
})
|
||||
|
||||
it('preserves graph and digest validation in historical mode', () => {
|
||||
const snapshot = historicalSurface('optional')
|
||||
expect(() => parseHistoricalPersistenceSnapshot({ ...snapshot, roots: snapshot.roots.map(root => ({ ...root, digest: 'f'.repeat(64) })) })).toThrow('digest mismatch')
|
||||
expect(() => parseHistoricalPersistenceSnapshot({ ...snapshot, roots: snapshot.roots.map(root => ({ ...root, schema: { root: 0, nodes: [{ kind: 'array', element: 9 }] } })) })).toThrow('unknown schema node')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(tamper(snapshot, (value) => {
|
||||
value.roots[0]!.digest = String(value.roots[0]!.digest).slice(0, 16) + 'f'.repeat(48)
|
||||
}))).toThrow('digest mismatch')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(tamper(snapshot, replaceRootNode({ kind: 'array', element: '9'.repeat(16) })))).toThrow('unknown schema node')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -312,10 +333,10 @@ describe('accepted persistence baseline', () => {
|
||||
const current = inventory({ value: version === 4 ? 'number' : 'boolean' }, version)
|
||||
if (version === 5) runPersistenceChanges(['--record', FUTURE_ID, '--prose', proseFile(root)], root, () => current)
|
||||
const snapshotPath = join(root, `docs/persistence-changes/${FINALIZED_ID}.schema.json`)
|
||||
const snapshot = JSON.parse(readFileSync(snapshotPath, 'utf8')) as PersistenceSchemaInventory
|
||||
const snapshot = parsePersistenceSnapshot(readFileSync(snapshotPath, 'utf8'))
|
||||
const replacement = typeRoot('event:example/value', { value: 'number', extra: 'string' })
|
||||
const original = snapshot.roots.find(root => root.key === replacement.key)!
|
||||
writeFileSync(snapshotPath, JSON.stringify({ ...snapshot,
|
||||
writeFileSync(snapshotPath, encodePersistenceSnapshot({ ...snapshot,
|
||||
roots: snapshot.roots.map(root => root.key === replacement.key ? replacement : root) }))
|
||||
for (const suffix of ['.md', '.zh.md']) {
|
||||
const path = join(root, `docs/persistence-changes/${FINALIZED_ID}${suffix}`)
|
||||
@@ -375,7 +396,7 @@ function finishDocuments(root: string, id: string): void {
|
||||
}
|
||||
|
||||
function commitCurrent(root: string, schema: PersistenceSchemaInventory): void {
|
||||
writeFileSync(join(root, 'docs/persistence-schema.json'), JSON.stringify(schema, null, 2) + '\n')
|
||||
writeFileSync(join(root, 'docs/persistence-schema.json'), encodePersistenceSnapshot(schema))
|
||||
}
|
||||
|
||||
function baseline(root: string, schema = inventory()): void {
|
||||
@@ -624,15 +645,12 @@ describe('persistence history verification', () => {
|
||||
|
||||
it('rejects malformed references, unknown schema variants, digest tampering, and extra snapshot roots', () => {
|
||||
const schema = inventory()
|
||||
const malformed: { roots: readonly { schema: { nodes: readonly unknown[] }; digest: string }[] } = structuredClone(schema)
|
||||
malformed.roots[0]!.schema.nodes = [{ kind: 'array', element: 99 }]
|
||||
expect(() => parsePersistenceSnapshot(malformed)).toThrow('unknown schema node')
|
||||
malformed.roots[0]!.schema.nodes = [{ kind: 'future' }]
|
||||
expect(() => parsePersistenceSnapshot(malformed)).toThrow('unknown schema node kind')
|
||||
const tampered = structuredClone(schema)
|
||||
Object.assign(tampered.roots[0]!, { digest: '0'.repeat(64) })
|
||||
expect(() => parsePersistenceSnapshot(tampered)).toThrow('digest mismatch')
|
||||
expect(() => parsePersistenceSnapshot({ ...schema, formatVersion: 3 })).toThrow('normalization version')
|
||||
expect(() => parsePersistenceSnapshot(tamper(schema, replaceRootNode({ kind: 'array', element: '9'.repeat(16) })))).toThrow('unknown schema node')
|
||||
expect(() => parsePersistenceSnapshot(tamper(schema, replaceRootNode({ kind: 'future' })))).toThrow('unknown schema node kind')
|
||||
expect(() => parsePersistenceSnapshot(tamper(schema, (value) => {
|
||||
value.roots[0]!.digest = String(value.roots[0]!.digest).slice(0, 16) + '0'.repeat(48)
|
||||
}))).toThrow('digest mismatch')
|
||||
expect(() => parsePersistenceSnapshot(tamper(schema, (value) => { value.formatVersion = 3 }))).toThrow('normalization version')
|
||||
const next = entry(NEXT_ID, onlyEvent(inventory({ value: 'string', 'label?': 'string' })), BASE_ID)
|
||||
expect(() => validatePersistenceHistory([entry(BASE_ID, schema, null, true), { ...next, snapshot: inventory() }])).toThrow('snapshot roots')
|
||||
})
|
||||
@@ -951,7 +969,7 @@ describe('recorded source compatibility policy', () => {
|
||||
expect(after.digest).not.toBe(before.digest)
|
||||
expect(classifyPersistenceChange(before, after)).toEqual([expect.objectContaining({ kind: 'attribution-kind-added', requiresCompatibilityReview: false })])
|
||||
const snapshot: PersistenceSchemaInventory = { formatVersion: 2, roots: [after], types: [] }
|
||||
expect(parsePersistenceSnapshot(JSON.parse(JSON.stringify(snapshot)))).toEqual(snapshot)
|
||||
expect(parsePersistenceSnapshot(encodePersistenceSnapshot(snapshot))).toEqual(snapshot)
|
||||
})
|
||||
|
||||
it('allows ordinary optional fields in an existing group alongside a qualified addition', () => {
|
||||
@@ -1017,25 +1035,30 @@ describe('recorded source compatibility policy', () => {
|
||||
it.each(['auto-review', 'compact-basic', 'ptc-mode'])('rejects saved qualification of reserved producer kind %s', (kind) => {
|
||||
const root = attributedRoot([EXISTING_SOURCE, { kind }], { policy: attributionPolicy([kind]) })
|
||||
const snapshot: PersistenceSchemaInventory = { formatVersion: 2, roots: [root], types: [] }
|
||||
expect(() => parsePersistenceSnapshot(snapshot)).toThrow('invalid source compatibility')
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot(snapshot))).toThrow('invalid source compatibility')
|
||||
})
|
||||
|
||||
it('rejects old-format policy fields, policy tampering, unsupported promises and invalid bindings', () => {
|
||||
const root = attributedRoot([EXISTING_SOURCE])
|
||||
const snapshot: PersistenceSchemaInventory = { formatVersion: 2, roots: [root], types: [] }
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, formatVersion: 1 })).toThrow('unknown field compatibility')
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot({ ...snapshot, formatVersion: 1 }))).toThrow('unknown field compatibility')
|
||||
const patchPolicy = (patch: Record<string, unknown>) => (value: SnapshotText): void => {
|
||||
const properties = Object.values(value.nodes).flatMap(node => node.kind === 'object' ? node.properties as Record<string, unknown>[] : [])
|
||||
Object.assign(properties.find(property => property.compatibility !== undefined)!.compatibility as object, patch)
|
||||
}
|
||||
for (const patch of [{ version: 2 }, { policy: 'arbitrary' }, { discriminator: 'type' }, { unknownKinds: 'discard' }]) {
|
||||
const tampered = JSON.parse(JSON.stringify(snapshot)) as PersistenceSchemaInventory
|
||||
const property = tampered.roots[0]!.schema.nodes.flatMap(node => node.kind === 'object' ? node.properties : []).find(property => property.compatibility !== undefined)!
|
||||
Object.assign(property.compatibility!, patch)
|
||||
expect(() => parsePersistenceSnapshot(tampered)).toThrow('unsupported source compatibility')
|
||||
expect(() => parsePersistenceSnapshot(tamper(snapshot, patchPolicy(patch)))).toThrow('unsupported source compatibility')
|
||||
}
|
||||
const wrongRole = attributedRoot([EXISTING_SOURCE], { policy: attributionPolicy([], 'developer') })
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, roots: [wrongRole] })).toThrow('invalid source compatibility')
|
||||
const changedQualification = attributedRoot([EXISTING_SOURCE], { policy: attributionPolicy([EXISTING_SOURCE.kind]) })
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, roots: [{ ...changedQualification, digest: root.digest }] })).toThrow('digest mismatch')
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot({ ...snapshot, roots: [wrongRole] }))).toThrow('invalid source compatibility')
|
||||
expect(() => parsePersistenceSnapshot(tamper(snapshot, patchPolicy({ attributionKinds: [EXISTING_SOURCE.kind] })))).toThrow('key does not match')
|
||||
const qualified: PersistenceSchemaInventory = { formatVersion: 2, types: [],
|
||||
roots: [attributedRoot([EXISTING_SOURCE, NEW_SOURCE, { kind: 'other-attribution' }], { policy: attributionPolicy([NEW_SOURCE.kind, 'other-attribution']) })] }
|
||||
for (const kinds of [['other-attribution', NEW_SOURCE.kind], [NEW_SOURCE.kind, NEW_SOURCE.kind, 'other-attribution']]) {
|
||||
expect(() => parsePersistenceSnapshot(tamper(qualified, patchPolicy({ attributionKinds: kinds })))).toThrow('node is not canonical')
|
||||
}
|
||||
const unknownKind = attributedRoot([EXISTING_SOURCE], { policy: attributionPolicy(['absent']) })
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, roots: [unknownKind] })).toThrow('invalid source compatibility')
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot({ ...snapshot, roots: [unknownKind] }))).toThrow('invalid source compatibility')
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
+142
-130
@@ -4,9 +4,15 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from
|
||||
import { basename, join, resolve } from 'node:path'
|
||||
import { parseArgs } from 'node:util'
|
||||
import { JSON_SCHEMA, load } from 'js-yaml'
|
||||
import { canonicalizeSchema, reachableSchemaTypes, schemaDigest } from './persistence-schema-model.ts'
|
||||
import {
|
||||
SCHEMA_NODE_KEY_LENGTH, canonicalizeSchema, encodePersistenceSnapshot, renderPersistenceSnapshot,
|
||||
schemaChildren, schemaDigest, schemaTableEntry, serializeSchemaNode,
|
||||
} from './persistence-schema-model.ts'
|
||||
import { matchingSourceCompatibility, sourceKindGroups, validSourceCompatibility } from './persistence-source-policy.ts'
|
||||
import type { CanonicalSchema, PersistenceRoot, PersistenceSchemaInventory, SchemaNode, SchemaTupleElement } from './persistence-schema-model.ts'
|
||||
import type {
|
||||
CanonicalSchema, PersistenceRoot, PersistenceSchemaInventory, PersistenceType,
|
||||
SchemaNode, SchemaProperty, SchemaTupleElement, SourceCompatibility,
|
||||
} from './persistence-schema-model.ts'
|
||||
import { extractPersistenceSchema } from './persistence-schema.ts'
|
||||
import { persistenceCatalogArtifacts } from './gen-persistence-catalog.ts'
|
||||
import { renderPersistencePair } from './persistence-artifacts.ts'
|
||||
@@ -169,128 +175,138 @@ function digest(value: unknown, label: string): string {
|
||||
return result
|
||||
}
|
||||
|
||||
function reference(value: unknown, count: number, label: string): number {
|
||||
if (!Number.isSafeInteger(value) || (value as number) < 0 || (value as number) >= count) throw new Error(`${label} references an unknown schema node`)
|
||||
return value as number
|
||||
function parseNode(value: unknown, label: string, formatVersion: 1 | 2, ref: (value: unknown) => number): SchemaNode {
|
||||
const node = record(value, label)
|
||||
switch (node.kind) {
|
||||
case 'primitive':
|
||||
keys(node, ['kind', 'type'], label)
|
||||
if (!['null', 'boolean', 'number', 'string', 'never'].includes(String(node.type))) throw new Error(`${label}: invalid primitive`)
|
||||
return { kind: 'primitive', type: node.type as Extract<SchemaNode, { kind: 'primitive' }>['type'] }
|
||||
case 'literal':
|
||||
keys(node, ['kind', 'value'], label)
|
||||
if (!['string', 'boolean', 'number'].includes(typeof node.value)
|
||||
|| typeof node.value === 'number' && !Number.isFinite(node.value)) throw new Error(`${label}: invalid literal`)
|
||||
return { kind: 'literal', value: node.value as string | number | boolean }
|
||||
case 'opaque':
|
||||
keys(node, ['kind', 'reason'], label)
|
||||
if (!['any', 'unknown'].includes(String(node.reason))) throw new Error(`${label}: invalid opaque reason`)
|
||||
return { kind: 'opaque', reason: node.reason as 'any' | 'unknown' }
|
||||
case 'array':
|
||||
keys(node, ['kind', 'element'], label)
|
||||
return { kind: 'array', element: ref(node.element) }
|
||||
case 'tuple':
|
||||
keys(node, ['kind', 'elements'], label)
|
||||
return { kind: 'tuple', elements: array(node.elements, label).map((rawElement): SchemaTupleElement => {
|
||||
const element = record(rawElement, label)
|
||||
keys(element, ['type', 'optional', 'rest'], label)
|
||||
return { type: ref(element.type), optional: bool(element.optional, label), rest: bool(element.rest, label) }
|
||||
}) }
|
||||
case 'object': {
|
||||
keys(node, ['kind', 'properties', 'indices'], label)
|
||||
const names = new Set<string>()
|
||||
const properties = array(node.properties, label).map((rawProperty): SchemaProperty => {
|
||||
const property = record(rawProperty, label)
|
||||
keys(property, ['name', 'type', 'optional'], label, formatVersion === 2 ? ['compatibility'] : [])
|
||||
if (typeof property.name !== 'string') throw new Error(`${label}: property name must be a string`)
|
||||
const name = property.name
|
||||
if (names.has(name)) throw new Error(`${label}: duplicate property ${name}`)
|
||||
names.add(name)
|
||||
return { name, type: ref(property.type), optional: bool(property.optional, label),
|
||||
...(property.compatibility === undefined ? {} : { compatibility: parseCompatibility(property.compatibility, label) }) }
|
||||
})
|
||||
const indices = array(node.indices, label).map((rawIndex) => {
|
||||
const entry = record(rawIndex, label)
|
||||
keys(entry, ['key', 'value'], label)
|
||||
return { key: ref(entry.key), value: ref(entry.value) }
|
||||
})
|
||||
return { kind: 'object', properties, indices }
|
||||
}
|
||||
case 'union':
|
||||
keys(node, ['kind', 'types'], label)
|
||||
if (array(node.types, label).length === 0) throw new Error(`${label}: empty union`)
|
||||
return { kind: 'union', types: (node.types as unknown[]).map(ref) }
|
||||
default:
|
||||
throw new Error(`${label}: unknown schema node kind ${String(node.kind)}`)
|
||||
}
|
||||
}
|
||||
|
||||
function parseSchema(value: unknown, label: string, formatVersion: 1 | 2): CanonicalSchema {
|
||||
const input = record(value, label)
|
||||
keys(input, ['root', 'nodes'], label)
|
||||
if (input.root !== 0) throw new Error(`${label}.root must be zero`)
|
||||
const nodes = array(input.nodes, `${label}.nodes`)
|
||||
if (nodes.length === 0) throw new Error(`${label}.nodes must not be empty`)
|
||||
const ref = (value: unknown): number => reference(value, nodes.length, label)
|
||||
for (const [index, raw] of nodes.entries()) {
|
||||
const node = record(raw, `${label}.nodes[${index}]`)
|
||||
switch (node.kind) {
|
||||
case 'primitive':
|
||||
keys(node, ['kind', 'type'], label)
|
||||
if (!['null', 'boolean', 'number', 'string', 'never'].includes(String(node.type))) throw new Error(`${label}: invalid primitive`)
|
||||
break
|
||||
case 'literal':
|
||||
keys(node, ['kind', 'value'], label)
|
||||
if (!['string', 'boolean', 'number'].includes(typeof node.value)
|
||||
|| typeof node.value === 'number' && !Number.isFinite(node.value)) throw new Error(`${label}: invalid literal`)
|
||||
break
|
||||
case 'opaque':
|
||||
keys(node, ['kind', 'reason'], label)
|
||||
if (!['any', 'unknown'].includes(String(node.reason))) throw new Error(`${label}: invalid opaque reason`)
|
||||
break
|
||||
case 'array':
|
||||
keys(node, ['kind', 'element'], label)
|
||||
ref(node.element)
|
||||
break
|
||||
case 'tuple':
|
||||
keys(node, ['kind', 'elements'], label)
|
||||
for (const rawElement of array(node.elements, label)) {
|
||||
const element = record(rawElement, label)
|
||||
keys(element, ['type', 'optional', 'rest'], label)
|
||||
ref(element.type)
|
||||
bool(element.optional, label)
|
||||
bool(element.rest, label)
|
||||
}
|
||||
break
|
||||
case 'object': {
|
||||
keys(node, ['kind', 'properties', 'indices'], label)
|
||||
const names = new Set<string>()
|
||||
for (const rawProperty of array(node.properties, label)) {
|
||||
const property = record(rawProperty, label)
|
||||
keys(property, ['name', 'type', 'optional'], label, formatVersion === 2 ? ['compatibility'] : [])
|
||||
if (property.compatibility !== undefined) {
|
||||
const policy = record(property.compatibility, `${label} source compatibility`)
|
||||
keys(policy, ['version', 'policy', 'binding', 'discriminator', 'unknownKinds', 'attributionKinds'], label)
|
||||
if (policy.version !== 1 || policy.policy !== 'session-source-attribution'
|
||||
|| !['session.user-message.source', 'session.developer-message.source'].includes(String(policy.binding))
|
||||
|| policy.discriminator !== 'kind' || policy.unknownKinds !== 'preserve') {
|
||||
throw new Error(`${label}: unsupported source compatibility policy`)
|
||||
}
|
||||
for (const kind of array(policy.attributionKinds, label)) textValue(kind, label)
|
||||
}
|
||||
if (typeof property.name !== 'string') throw new Error(`${label}: property name must be a string`)
|
||||
const name = property.name
|
||||
if (names.has(name)) throw new Error(`${label}: duplicate property ${name}`)
|
||||
names.add(name)
|
||||
ref(property.type)
|
||||
bool(property.optional, label)
|
||||
}
|
||||
for (const rawIndex of array(node.indices, label)) {
|
||||
const entry = record(rawIndex, label)
|
||||
keys(entry, ['key', 'value'], label)
|
||||
ref(entry.key)
|
||||
ref(entry.value)
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'union':
|
||||
keys(node, ['kind', 'types'], label)
|
||||
if (array(node.types, label).length === 0) throw new Error(`${label}: empty union`)
|
||||
for (const item of node.types as unknown[]) ref(item)
|
||||
break
|
||||
default:
|
||||
throw new Error(`${label}: unknown schema node kind ${String(node.kind)}`)
|
||||
}
|
||||
function parseCompatibility(value: unknown, label: string): SourceCompatibility {
|
||||
const policy = record(value, `${label} source compatibility`)
|
||||
keys(policy, ['version', 'policy', 'binding', 'discriminator', 'unknownKinds', 'attributionKinds'], label)
|
||||
if (policy.version !== 1 || policy.policy !== 'session-source-attribution'
|
||||
|| (policy.binding !== 'session.user-message.source' && policy.binding !== 'session.developer-message.source')
|
||||
|| policy.discriminator !== 'kind' || policy.unknownKinds !== 'preserve') {
|
||||
throw new Error(`${label}: unsupported source compatibility policy`)
|
||||
}
|
||||
const schema = input as unknown as CanonicalSchema
|
||||
for (const node of schema.nodes) {
|
||||
if (node.kind !== 'object') continue
|
||||
for (const property of node.properties) {
|
||||
if (property.compatibility !== undefined && !validSourceCompatibility(schema.nodes, node, property)) {
|
||||
throw new Error(`${label}: invalid source compatibility binding or attribution kinds`)
|
||||
}
|
||||
}
|
||||
}
|
||||
const canonical = canonicalizeSchema(schema.nodes, schema.root)
|
||||
if (JSON.stringify(canonical) !== JSON.stringify(schema)) throw new Error(`${label}: schema is not canonical`)
|
||||
return schema
|
||||
return { version: 1, policy: 'session-source-attribution', binding: policy.binding, discriminator: 'kind', unknownKinds: 'preserve',
|
||||
attributionKinds: array(policy.attributionKinds, label).map(kind => textValue(kind, label)) }
|
||||
}
|
||||
|
||||
/** Parse full or compact inventories, restoring type graphs and rejecting invalid digests.
|
||||
* @param value - JSON read from the current inventory or an enforced acknowledgement snapshot.
|
||||
* @returns the validated inventory.
|
||||
/** Parse the committed current inventory or an enforced acknowledgement snapshot.
|
||||
* @param text - JSON text in the layout written by encodePersistenceSnapshot.
|
||||
* @returns the validated inventory with canonical graphs.
|
||||
*/
|
||||
export function parsePersistenceSnapshot(value: unknown): PersistenceSchemaInventory {
|
||||
return parseSnapshot(value, false)
|
||||
export function parsePersistenceSnapshot(text: string): PersistenceSchemaInventory {
|
||||
return parseSnapshot(text, false)
|
||||
}
|
||||
|
||||
/** Parse a historical inventory with path-only source references and optional surface operations.
|
||||
* @param value - JSON captured from a historical source tree.
|
||||
* @param text - JSON text captured from a historical source tree.
|
||||
* @returns the validated inventory; current acknowledgements use the strict parser.
|
||||
*/
|
||||
export function parseHistoricalPersistenceSnapshot(value: unknown): PersistenceSchemaInventory {
|
||||
return parseSnapshot(value, true)
|
||||
export function parseHistoricalPersistenceSnapshot(text: string): PersistenceSchemaInventory {
|
||||
return parseSnapshot(text, true)
|
||||
}
|
||||
|
||||
function parseSnapshot(value: unknown, historical: boolean): PersistenceSchemaInventory {
|
||||
const input = record(value, 'schema inventory')
|
||||
keys(input, ['formatVersion', 'roots', 'types'], 'schema inventory')
|
||||
function parseSnapshot(text: string, historical: boolean): PersistenceSchemaInventory {
|
||||
const parsed: unknown = JSON.parse(text)
|
||||
const input = record(parsed, 'schema inventory')
|
||||
keys(input, ['formatVersion', 'roots', 'types', 'nodes'], 'schema inventory')
|
||||
const formatVersion = input.formatVersion
|
||||
if (formatVersion !== 1 && formatVersion !== 2) throw new Error('unsupported persistence schema normalization version')
|
||||
const table = record(input.nodes, 'schema nodes')
|
||||
const nodeKeys = Object.keys(table)
|
||||
const positions = new Map(nodeKeys.map((key, index) => [key, index]))
|
||||
const position = (value: unknown, label: string): number => {
|
||||
const found = typeof value === 'string' ? positions.get(value) : undefined
|
||||
if (found === undefined) throw new Error(`${label} references an unknown schema node`)
|
||||
return found
|
||||
}
|
||||
const graph = nodeKeys.map(key =>
|
||||
parseNode(table[key], `schema node ${key}`, formatVersion, value => position(value, `schema node ${key}`)))
|
||||
for (const [index, key] of nodeKeys.entries()) {
|
||||
const node = graph[index] as SchemaNode
|
||||
if (node.kind === 'object') {
|
||||
for (const property of node.properties) {
|
||||
if (property.compatibility !== undefined && !validSourceCompatibility(graph, node, property)) {
|
||||
throw new Error(`schema node ${key}: invalid source compatibility binding or attribution kinds`)
|
||||
}
|
||||
}
|
||||
}
|
||||
const [canonicalKey, canonical] = schemaTableEntry(graph, index)
|
||||
if (canonicalKey !== key) throw new Error(`schema node ${key}: key does not match its subgraph digest`)
|
||||
if (JSON.stringify(canonical) !== JSON.stringify(table[key])) throw new Error(`schema node ${key}: node is not canonical`)
|
||||
}
|
||||
const used = new Set<number>()
|
||||
const graphOf = (graphDigest: string, label: string): CanonicalSchema => {
|
||||
const prefix = graphDigest.slice(0, SCHEMA_NODE_KEY_LENGTH)
|
||||
const index = positions.get(prefix)
|
||||
if (index === undefined) throw new Error(`${label}: no schema node for digest prefix ${prefix}`)
|
||||
const pending = [index]
|
||||
while (pending.length > 0) {
|
||||
const next = pending.pop() as number
|
||||
if (used.has(next)) continue
|
||||
used.add(next)
|
||||
pending.push(...schemaChildren(graph[next] as SchemaNode))
|
||||
}
|
||||
const schema = canonicalizeSchema(graph, index)
|
||||
if (graphDigest !== schemaDigest(schema)) throw new Error(`${label}: schema digest mismatch`)
|
||||
return schema
|
||||
}
|
||||
const names = new Set<string>()
|
||||
const schemas: CanonicalSchema[] = []
|
||||
for (const rawRoot of array(input.roots, 'schema roots')) {
|
||||
const roots = array(input.roots, 'schema roots').map((rawRoot): PersistenceRoot => {
|
||||
const root = record(rawRoot, 'schema root')
|
||||
keys(root, ['key', 'kind', 'digest', 'schema'], 'schema root', ['event', 'surface'])
|
||||
keys(root, ['key', 'kind', 'digest'], 'schema root', ['event', 'surface'])
|
||||
const key = textValue(root.key, 'root key')
|
||||
if (names.has(key)) throw new Error(`duplicate schema root ${key}`)
|
||||
names.add(key)
|
||||
@@ -300,26 +316,17 @@ function parseSnapshot(value: unknown, historical: boolean): PersistenceSchemaIn
|
||||
} else if ((root.kind !== 'header' || !['SessionHeader', 'JsonlHeaderLine'].includes(key))
|
||||
&& (root.kind !== 'envelope' || key !== 'SessionEventEnvelope')) throw new Error(`invalid schema root ${key}`)
|
||||
if (root.kind !== 'event' && (root.event !== undefined || root.surface !== undefined)) throw new Error(`${key}: non-event metadata`)
|
||||
const schema = parseSchema(root.schema, key, formatVersion)
|
||||
const schema = graphOf(digest(root.digest, `${key} digest`), key)
|
||||
if (root.kind === 'event') validateEventMetadata(schema, String(root.event), root.surface === true, historical)
|
||||
if (digest(root.digest, `${key} digest`) !== schemaDigest(schema)) throw new Error(`${key}: schema digest mismatch`)
|
||||
schemas.push(schema)
|
||||
}
|
||||
let reachable: Map<string, CanonicalSchema> | undefined
|
||||
const types = array(input.types, 'schema types').map((rawType) => {
|
||||
return root.kind === 'event'
|
||||
? { key, kind: 'event', event: root.event as string, surface: root.surface as boolean, digest: root.digest as string, schema }
|
||||
: { key, kind: root.kind, digest: root.digest as string, schema }
|
||||
})
|
||||
const types = array(input.types, 'schema types').map((rawType): PersistenceType => {
|
||||
const type = record(rawType, 'schema type')
|
||||
keys(type, ['digest', 'names', 'sources'], 'schema type', ['schema'])
|
||||
keys(type, ['digest', 'names', 'sources'], 'schema type')
|
||||
const typeDigest = digest(type.digest, 'shared digest')
|
||||
let schema: CanonicalSchema
|
||||
if ('schema' in type) {
|
||||
schema = parseSchema(type.schema, 'shared schema', formatVersion)
|
||||
if (typeDigest !== schemaDigest(schema)) throw new Error('shared schema digest mismatch')
|
||||
} else {
|
||||
reachable ??= reachableSchemaTypes(schemas)
|
||||
const found = reachable.get(typeDigest)
|
||||
if (found === undefined) throw new Error(`shared schema digest ${typeDigest} is not reachable from roots`)
|
||||
schema = found
|
||||
}
|
||||
const schema = graphOf(typeDigest, `shared schema ${typeDigest}`)
|
||||
const typeNames = array(type.names, 'type names').map(name => textValue(name, 'type name'))
|
||||
const sources = array(type.sources, 'type sources').map((source) => {
|
||||
const location = textValue(source, 'type source')
|
||||
@@ -330,7 +337,13 @@ function parseSnapshot(value: unknown, historical: boolean): PersistenceSchemaIn
|
||||
})
|
||||
return { digest: typeDigest, schema, names: typeNames, sources }
|
||||
})
|
||||
return { ...input as unknown as PersistenceSchemaInventory, types }
|
||||
const orphan = nodeKeys.find((_, index) => !used.has(index))
|
||||
if (orphan !== undefined) throw new Error(`schema node ${orphan} is not reachable from any root or type`)
|
||||
const inventory: PersistenceSchemaInventory = { formatVersion, roots, types }
|
||||
const serialized = new Map(nodeKeys.map((key, index) =>
|
||||
[key, serializeSchemaNode(graph[index] as SchemaNode, child => nodeKeys[child] as string)]))
|
||||
if (renderPersistenceSnapshot(inventory, serialized) !== text) throw new Error('schema inventory is not in canonical layout')
|
||||
return inventory
|
||||
}
|
||||
|
||||
function validateEventMetadata(schema: CanonicalSchema, event: string, surface: boolean, historical: boolean): void {
|
||||
@@ -654,7 +667,7 @@ function readPersistenceEntries(root: string, allowIncompleteId?: string): Persi
|
||||
const change = parseDocument(source, filename, allowIncomplete)
|
||||
const snapshotName = `${change.id}.schema.json`
|
||||
if (!snapshots.delete(snapshotName)) throw new Error(`${filename}: missing schema snapshot ${snapshotName}`)
|
||||
const snapshot = parsePersistenceSnapshot(JSON.parse(readFileSync(join(directory, snapshotName), 'utf8')))
|
||||
const snapshot = parsePersistenceSnapshot(readFileSync(join(directory, snapshotName), 'utf8').replaceAll('\r\n', '\n'))
|
||||
const translatedName = `${change.id}.zh.md`
|
||||
if (!files.includes(translatedName)) throw new Error(`${filename}: missing Chinese counterpart`)
|
||||
const translated = readFileSync(join(directory, translatedName), 'utf8').replaceAll('\r\n', '\n')
|
||||
@@ -705,8 +718,7 @@ export function verifyPersistenceChanges(root: string, current: PersistenceSchem
|
||||
if (!existsSync(committedPath)) {
|
||||
throw new PersistenceChangeFailure(`${CURRENT_SCHEMA} is missing; regenerate the persistence catalog`, 'generated-artifact-missing', differences, transitions)
|
||||
}
|
||||
const committed = parsePersistenceSnapshot(JSON.parse(readFileSync(committedPath, 'utf8')))
|
||||
if (JSON.stringify(committed) !== JSON.stringify(current)) {
|
||||
if (readFileSync(committedPath, 'utf8') !== encodePersistenceSnapshot(current)) {
|
||||
throw new PersistenceChangeFailure(`${CURRENT_SCHEMA} is stale; regenerate the persistence catalog`, 'stale-artifacts', differences, transitions)
|
||||
}
|
||||
if (differences.length !== 0) {
|
||||
@@ -812,7 +824,7 @@ function executeCommand(
|
||||
const operation = commandOperation(args)
|
||||
if (operation === 'check' && values.prose !== undefined) throw new Error('--prose requires --baseline, --record, or --update')
|
||||
const prose = values.prose === undefined ? undefined : parsePersistenceProse(JSON.parse(readFileSync(resolve(root, values.prose), 'utf8')))
|
||||
const current = parsePersistenceSnapshot(extract(root))
|
||||
const current = parsePersistenceSnapshot(encodePersistenceSnapshot(extract(root)))
|
||||
if (operation === 'check') {
|
||||
const history = verifyPersistenceChanges(root, current)
|
||||
return { schemaVersion: 1, ok: true, operation,
|
||||
@@ -867,7 +879,7 @@ function executeCommand(
|
||||
parseDocument(chinese, `${id}.md`, prose === undefined && existing === undefined)
|
||||
const recordFiles = [
|
||||
...renderPersistencePair(root, `${HISTORY_DIRECTORY}/${id}.md`, english, chinese),
|
||||
{ path: `${HISTORY_DIRECTORY}/${id}.schema.json`, content: JSON.stringify(snapshot, null, 2) + '\n' },
|
||||
{ path: `${HISTORY_DIRECTORY}/${id}.schema.json`, content: encodePersistenceSnapshot(snapshot) },
|
||||
]
|
||||
if (!update && recordFiles.some(file => existsSync(join(root, file.path)))) throw new Error(`${id}: acknowledgement file already exists`)
|
||||
const outputs = [...artifacts(root, current), ...recordFiles]
|
||||
|
||||
@@ -9,7 +9,7 @@ import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
|
||||
import { classifyPersistenceChange, parsePersistenceSnapshot } from './persistence-changes.ts'
|
||||
|
||||
function toolAdditionSchema() {
|
||||
const inventory = parsePersistenceSnapshot(JSON.parse(readFileSync(new URL('../docs/persistence-schema.json', import.meta.url), 'utf8')) as unknown)
|
||||
const inventory = parsePersistenceSnapshot(readFileSync(new URL('../docs/persistence-schema.json', import.meta.url), 'utf8'))
|
||||
const before = inventory.roots.find(root => root.key === 'event:developer/message')!
|
||||
const nodes = [...structuredClone(before.schema.nodes)]
|
||||
const blockIndex = nodes.findIndex(node => node.kind === 'object' && node.properties.some((property) => {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { dump } from 'js-yaml'
|
||||
import { afterEach, describe, expect, it } from 'vitest'
|
||||
import { loadPersistenceFormats, runPersistenceFormats } from './persistence-formats.ts'
|
||||
import { parseHistoricalPersistenceSnapshot } from './persistence-changes.ts'
|
||||
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest } from './persistence-schema-model.ts'
|
||||
import type { PersistenceRoot, PersistenceSchemaInventory, PersistenceType, SchemaNode } from './persistence-schema-model.ts'
|
||||
|
||||
const temporary: string[] = []
|
||||
@@ -57,7 +57,12 @@ function schemaPath(version: number, currentVersion: number): string {
|
||||
}
|
||||
|
||||
function replaceSnapshot(root: string, version: number, currentVersion: number, snapshot: PersistenceSchemaInventory): void {
|
||||
write(root, schemaPath(version, currentVersion), JSON.stringify(snapshot))
|
||||
write(root, schemaPath(version, currentVersion), encodePersistenceSnapshot(snapshot))
|
||||
}
|
||||
|
||||
/** Keep a digest's node-table prefix while changing the full digest. */
|
||||
function driftDigest(digest: string): string {
|
||||
return digest.slice(0, 16) + '0'.repeat(48)
|
||||
}
|
||||
|
||||
function saveReference(root: string, version: number, currentVersion: number, snapshot = inventory(version)): void {
|
||||
@@ -125,14 +130,14 @@ describe('archive current persistence format', () => {
|
||||
|
||||
expect(runPersistenceFormats(['--archive', '3'], root)).toBe('Archived Session format v3 to docs/persistence-changes/historical-formats/v3.schema.json.')
|
||||
const serialized = readFileSync(join(root, 'docs/persistence-changes/historical-formats/v3.schema.json'), 'utf8')
|
||||
const archived = parseHistoricalPersistenceSnapshot(JSON.parse(serialized))
|
||||
const archived = parseHistoricalPersistenceSnapshot(serialized)
|
||||
expect(archived).toEqual({
|
||||
...original,
|
||||
types: types.map(type => ({ ...type, sources: [
|
||||
'packages/example/src/types.ts', 'packages/other/src/types.ts', 'packages/plain/src/types.ts', 'packages/fragment/src/types.ts',
|
||||
] })),
|
||||
})
|
||||
expect(serialized).toBe(JSON.stringify(archived, null, 2) + '\n')
|
||||
expect(serialized).toBe(encodePersistenceSnapshot(archived))
|
||||
expect(readFileSync(join(root, 'docs/persistence-schema.json'), 'utf8')).toBe(before)
|
||||
expect(existsSync(join(root, 'docs/persistence-changes/historical-formats/v3.md'))).toBe(false)
|
||||
|
||||
@@ -146,7 +151,7 @@ describe('archive current persistence format', () => {
|
||||
const root = fixture(0)
|
||||
rmSync(join(root, 'docs/persistence-changes/historical-formats'), { recursive: true })
|
||||
expect(runPersistenceFormats(['--root', root, '--archive', '0'])).toBe('Archived Session format v0 to docs/persistence-changes/historical-formats/v0.schema.json.')
|
||||
expect(JSON.parse(readFileSync(join(root, 'docs/persistence-changes/historical-formats/v0.schema.json'), 'utf8'))).toEqual(inventory(0))
|
||||
expect(parseHistoricalPersistenceSnapshot(readFileSync(join(root, 'docs/persistence-changes/historical-formats/v0.schema.json'), 'utf8'))).toEqual(inventory(0))
|
||||
})
|
||||
|
||||
it.each(['-1', '1.5', '01', '3junk', '9007199254740992'])('rejects an invalid archive version %s', (version) => {
|
||||
@@ -178,7 +183,7 @@ describe('archive current persistence format', () => {
|
||||
const root = fixture()
|
||||
const original = inventory(3)
|
||||
if (variant === 'invalid-json') write(root, 'docs/persistence-schema.json', '{')
|
||||
else if (variant === 'digest-drift') replaceSnapshot(root, 3, 3, { ...original, roots: [{ ...original.roots[0]!, digest: '0'.repeat(64) }, ...original.roots.slice(1)] })
|
||||
else if (variant === 'digest-drift') replaceSnapshot(root, 3, 3, { ...original, roots: [{ ...original.roots[0]!, digest: driftDigest(original.roots[0]!.digest) }, ...original.roots.slice(1)] })
|
||||
else if (variant === 'missing-type') replaceSnapshot(root, 3, 3, { ...original, types: original.types.slice(1) })
|
||||
else if (variant === 'missing-source-metadata') edit(root, 'docs/persistence-schema.json', ',"sources":[]', '')
|
||||
else replaceSnapshot(root, 3, 3, inventory(2))
|
||||
@@ -378,11 +383,14 @@ describe('complete persistence format references', () => {
|
||||
const root = fixture()
|
||||
const original = inventory(1)
|
||||
const first = original.roots[0]!
|
||||
const changed = variant === 'duplicate-root' ? { ...original, roots: [...original.roots, first] }
|
||||
: variant === 'invalid-digest' ? { ...original, roots: [{ ...first, digest: '0'.repeat(64) }, ...original.roots.slice(1)] }
|
||||
: variant === 'invalid-graph' ? { ...original, roots: [{ ...first, schema: { root: 0, nodes: [{ kind: 'array', element: 99 }] } }, ...original.roots.slice(1)] }
|
||||
: { ...original, extra: true }
|
||||
write(root, schemaPath(1, 3), JSON.stringify(changed))
|
||||
if (variant === 'duplicate-root') replaceSnapshot(root, 1, 3, { ...original, roots: [...original.roots, first] })
|
||||
else if (variant === 'invalid-digest') replaceSnapshot(root, 1, 3, { ...original, roots: [{ ...first, digest: driftDigest(first.digest) }, ...original.roots.slice(1)] })
|
||||
else {
|
||||
const changed = JSON.parse(encodePersistenceSnapshot(original)) as { nodes: Record<string, unknown>; extra?: boolean }
|
||||
if (variant === 'invalid-graph') changed.nodes[first.digest.slice(0, 16)] = { kind: 'array', element: '9'.repeat(16) }
|
||||
else changed.extra = true
|
||||
write(root, schemaPath(1, 3), JSON.stringify(changed))
|
||||
}
|
||||
expect(() => loadPersistenceFormats(root)).toThrow(variant === 'duplicate-root' ? 'duplicate schema root' : variant === 'invalid-digest' ? 'schema digest mismatch' : variant === 'invalid-graph' ? 'unknown schema node' : 'unknown field extra')
|
||||
})
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import { JSON_SCHEMA, load } from 'js-yaml'
|
||||
import { readCurrentSessionFormatVersion } from './gen-session-format-catalog.ts'
|
||||
import { parseHistoricalPersistenceSnapshot, parsePersistenceSnapshot } from './persistence-changes.ts'
|
||||
import { persistenceFormatFactArtifacts } from './persistence-format-facts.ts'
|
||||
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest } from './persistence-schema-model.ts'
|
||||
import type { PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
import { withoutPersistenceSourceLines } from './persistence-source-metadata.ts'
|
||||
|
||||
@@ -166,7 +166,7 @@ export function loadPersistenceFormats(root: string): PersistenceFormats {
|
||||
if (block !== machineBlock(chinese, document.replace(/\.md$/u, '.zh.md'))) throw new Error(`v${version}: bilingual machine records differ`)
|
||||
record = parseRecord(block, version)
|
||||
}
|
||||
const inventory = (current ? parsePersistenceSnapshot : parseHistoricalPersistenceSnapshot)(JSON.parse(read(schemaPath)))
|
||||
const inventory = (current ? parsePersistenceSnapshot : parseHistoricalPersistenceSnapshot)(read(schemaPath))
|
||||
validateInventory(inventory, version, current)
|
||||
const recordedRoots = record?.roots
|
||||
if (recordedRoots !== undefined && (recordedRoots.size !== inventory.roots.length
|
||||
@@ -190,11 +190,11 @@ function archiveCurrentInventory(root: string, requestedVersion: string): string
|
||||
if (version !== currentVersion) throw new Error(`Cannot archive v${version}: current writer is v${currentVersion}`)
|
||||
const path = `${DIRECTORY}/v${version}.schema.json`
|
||||
if (existsSync(join(root, path))) throw new Error(`Cannot archive v${version}: ${path} already exists`)
|
||||
const inventory = parsePersistenceSnapshot(JSON.parse(readFileSync(join(root, CURRENT_SCHEMA), 'utf8')))
|
||||
const inventory = parsePersistenceSnapshot(readFileSync(join(root, CURRENT_SCHEMA), 'utf8'))
|
||||
const reachable = validateInventory(inventory, version, true)
|
||||
const archive = withoutPersistenceSourceLines({ ...inventory, types: inventory.types.filter(type => reachable.has(type.digest)) })
|
||||
mkdirSync(join(root, DIRECTORY), { recursive: true })
|
||||
writeFileSync(join(root, path), JSON.stringify(archive, null, 2) + '\n', { flag: 'wx' })
|
||||
writeFileSync(join(root, path), encodePersistenceSnapshot(archive), { flag: 'wx' })
|
||||
return `Archived Session format v${version} to ${path}.`
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import { join } from 'node:path'
|
||||
import { dump } from 'js-yaml'
|
||||
import { afterEach, describe, expect, it } from 'vitest'
|
||||
import { parsePersistenceSnapshot } from './persistence-changes.ts'
|
||||
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest } from './persistence-schema-model.ts'
|
||||
import type { PersistenceRoot, PersistenceSchemaInventory, PersistenceType, SchemaNode } from './persistence-schema-model.ts'
|
||||
import { loadPersistenceReleases, runPersistenceReleases } from './persistence-releases.ts'
|
||||
import type { PersistenceReleaseManifest, PersistenceReleaseRecord } from './persistence-releases.ts'
|
||||
@@ -108,14 +108,14 @@ function fixture(): Fixture {
|
||||
writeFileSync(join(directory, 'manifest.json'), JSON.stringify(manifest))
|
||||
for (const [index, record] of records.entries()) {
|
||||
saveRecord(directory, record)
|
||||
writeFileSync(join(directory, record.tag + '.schema.json'), JSON.stringify(snapshots[index]))
|
||||
writeFileSync(join(directory, record.tag + '.schema.json'), encodePersistenceSnapshot(snapshots[index]!))
|
||||
writeFileSync(join(directory, record.tag + '.i18n.yaml'), 'schemaVersion: 1\n')
|
||||
}
|
||||
return { root, directory, manifest, records, snapshots }
|
||||
}
|
||||
|
||||
function replaceSnapshot(fixture: Fixture, index: number, snapshot: PersistenceSchemaInventory): void {
|
||||
writeFileSync(join(fixture.directory, TAGS[index]! + '.schema.json'), JSON.stringify(snapshot))
|
||||
writeFileSync(join(fixture.directory, TAGS[index]! + '.schema.json'), encodePersistenceSnapshot(snapshot))
|
||||
}
|
||||
|
||||
describe('pinned persistence releases', () => {
|
||||
@@ -148,7 +148,7 @@ describe('pinned persistence releases', () => {
|
||||
expect(archive.entries[1]!.differences).toEqual([expect.objectContaining({ root: 'event:example/value', kind: 'type-changed', requiresCompatibilityReview: true })])
|
||||
expect(archive.entries[2]!.roots).toEqual(archive.entries[1]!.roots)
|
||||
expect(archive.entries[2]!.differences).toEqual([])
|
||||
expect(() => parsePersistenceSnapshot(data.snapshots[1])).toThrow('surface metadata')
|
||||
expect(() => parsePersistenceSnapshot(encodePersistenceSnapshot(data.snapshots[1]!))).toThrow('surface metadata')
|
||||
})
|
||||
|
||||
it.each(['.md', '.zh.md', '.i18n.yaml', '.schema.json'])('rejects a missing manifest release companion %s', (suffix) => {
|
||||
@@ -369,7 +369,7 @@ describe('release facts', () => {
|
||||
const data = fixture()
|
||||
const snapshotPath = join(data.directory, TAGS[2] + '.schema.json')
|
||||
const snapshot = readFileSync(snapshotPath, 'utf8')
|
||||
writeFileSync(snapshotPath, snapshot.replace('"formatVersion":1', '"formatVersion":3'))
|
||||
writeFileSync(snapshotPath, snapshot.replace('"formatVersion": 1', '"formatVersion": 3'))
|
||||
const corrupt = directoryBytes(data.directory)
|
||||
expect(() => runPersistenceReleases(['--write'], data.root)).toThrow('normalization version')
|
||||
expect(directoryBytes(data.directory)).toEqual(corrupt)
|
||||
|
||||
@@ -206,7 +206,7 @@ export function loadPersistenceReleases(root: string): PersistenceReleases {
|
||||
const chinese = machineBlock(read('.zh.md'), `${release.tag}.zh.md`)
|
||||
if (english !== chinese) throw new Error(`${release.tag}: bilingual machine records differ`)
|
||||
const record = parseRecord(english, release, entries.at(-1)?.release.tag ?? null)
|
||||
const snapshot = parseHistoricalPersistenceSnapshot(JSON.parse(read('.schema.json')))
|
||||
const snapshot = parseHistoricalPersistenceSnapshot(read('.schema.json'))
|
||||
validateTypes(snapshot, release.tag)
|
||||
const afterRoots = new Map(snapshot.roots.map(root => [root.key, root]))
|
||||
const expectedRoots = record.changes.filter(change => change.after !== null).map(change => change.root).sort()
|
||||
|
||||
@@ -5,7 +5,7 @@ import { tmpdir } from 'node:os'
|
||||
import { join } from 'node:path'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { classifyPersistenceChange } from './persistence-changes.ts'
|
||||
import { canonicalizeSchema, schemaDigest, type PersistenceSchemaInventory, type SchemaNode, type SchemaProperty } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest, type PersistenceSchemaInventory, type SchemaNode, type SchemaProperty } from './persistence-schema-model.ts'
|
||||
import { renderPersistenceReview, reviewPersistenceSchemas, runPersistenceReview } from './persistence-review.ts'
|
||||
|
||||
function fixture(options: {
|
||||
@@ -116,8 +116,8 @@ describe('persistence review', () => {
|
||||
try {
|
||||
const before = join(directory, 'before.json')
|
||||
const after = join(directory, 'after.json')
|
||||
const oldText = JSON.stringify(fixture())
|
||||
const newText = JSON.stringify(fixture({ extraKind: true }))
|
||||
const oldText = encodePersistenceSnapshot(fixture())
|
||||
const newText = encodePersistenceSnapshot(fixture({ extraKind: true }))
|
||||
writeFileSync(before, oldText)
|
||||
writeFileSync(after, newText)
|
||||
const args = ['--before', before, '--after', after]
|
||||
|
||||
@@ -215,7 +215,7 @@ export function renderPersistenceReview(report: PersistenceReview): string {
|
||||
export function runPersistenceReview(args: readonly string[]): string {
|
||||
const { values } = parseArgs({ args: [...args], options: { before: { type: 'string' }, after: { type: 'string' }, json: { type: 'boolean' } }, strict: true, allowPositionals: false })
|
||||
if (values.before === undefined || values.after === undefined) throw new Error('persistence review: --before and --after inventory paths are required')
|
||||
const read = (path: string): PersistenceSchemaInventory => parsePersistenceSnapshot(JSON.parse(readFileSync(path, 'utf8')))
|
||||
const read = (path: string): PersistenceSchemaInventory => parsePersistenceSnapshot(readFileSync(path, 'utf8'))
|
||||
const report = reviewPersistenceSchemas(read(values.before), read(values.after))
|
||||
return values.json ? JSON.stringify(report, null, 2) + '\n' : renderPersistenceReview(report)
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Source-independent JSON type graphs and canonical persistence fingerprints.
|
||||
* Numeric references are local to one graph; names and source locations are metadata.
|
||||
* Numeric references are local to one in-memory graph; serialized snapshots reference nodes by digest prefix.
|
||||
* Names and source locations are metadata.
|
||||
*/
|
||||
|
||||
import { createHash } from 'node:crypto'
|
||||
import { isDeepStrictEqual } from 'node:util'
|
||||
|
||||
/** Recorded reader promise for explicitly attributed source additions. */
|
||||
export interface SourceCompatibility {
|
||||
@@ -72,51 +72,108 @@ export interface PersistenceSchemaInventory {
|
||||
readonly types: readonly PersistenceType[]
|
||||
}
|
||||
|
||||
/** Type metadata with an explicit graph when roots cannot reconstruct it exactly. */
|
||||
export interface PersistenceTypeIndex extends Omit<PersistenceType, 'schema'> {
|
||||
readonly schema?: CanonicalSchema
|
||||
}
|
||||
/** Serialized node: the node fields with every reference replaced by a node key. */
|
||||
export type SerializedSchemaNode =
|
||||
| Extract<SchemaNode, { kind: 'primitive' | 'literal' | 'opaque' }>
|
||||
| { readonly kind: 'array'; readonly element: string }
|
||||
| { readonly kind: 'tuple'; readonly elements: readonly (Omit<SchemaTupleElement, 'type'> & { readonly type: string })[] }
|
||||
| {
|
||||
readonly kind: 'object'
|
||||
readonly properties: readonly (Omit<SchemaProperty, 'type'> & { readonly type: string })[]
|
||||
readonly indices: readonly { readonly key: string; readonly value: string }[]
|
||||
}
|
||||
| { readonly kind: 'union'; readonly types: readonly string[] }
|
||||
|
||||
/** Compact inventory representation; formatVersion still pins normalization. */
|
||||
export interface PersistenceSchemaSnapshot {
|
||||
readonly formatVersion: PersistenceSchemaInventory['formatVersion']
|
||||
readonly roots: readonly PersistenceRoot[]
|
||||
readonly types: readonly PersistenceTypeIndex[]
|
||||
/** Length of the digest prefix that names a node in a serialized node table. */
|
||||
export const SCHEMA_NODE_KEY_LENGTH = 16
|
||||
|
||||
/**
|
||||
* Name a node by the digest prefix of the canonical subgraph it roots.
|
||||
* @param nodes - graph containing the node.
|
||||
* @param index - node to name.
|
||||
* @returns key shared by every bisimilar node in any graph.
|
||||
*/
|
||||
export function schemaNodeKey(nodes: readonly SchemaNode[], index: number): string {
|
||||
return schemaDigest(canonicalizeSchema(nodes, index)).slice(0, SCHEMA_NODE_KEY_LENGTH)
|
||||
}
|
||||
|
||||
/**
|
||||
* Index every normalized type reachable from the supplied graphs.
|
||||
* @param schemas - complete canonical root graphs.
|
||||
* @returns canonical subgraphs keyed by their structural digest.
|
||||
* Produce the node-table entry for one node from its canonical subgraph.
|
||||
* @param nodes - graph containing the node; its node may be non-canonical.
|
||||
* @param index - node to serialize.
|
||||
* @returns the node key and canonical serialized node.
|
||||
*/
|
||||
export function reachableSchemaTypes(schemas: readonly CanonicalSchema[]): Map<string, CanonicalSchema> {
|
||||
const types = new Map<string, CanonicalSchema>()
|
||||
for (const schema of schemas) {
|
||||
for (const [index] of schema.nodes.entries()) {
|
||||
const type = canonicalizeSchema(schema.nodes, index)
|
||||
types.set(schemaDigest(type), type)
|
||||
export function schemaTableEntry(nodes: readonly SchemaNode[], index: number): readonly [string, SerializedSchemaNode] {
|
||||
const canonical = canonicalizeSchema(nodes, index)
|
||||
const node = serializeSchemaNode(canonical.nodes[0] as SchemaNode, child => schemaNodeKey(canonical.nodes, child))
|
||||
return [schemaDigest(canonical).slice(0, SCHEMA_NODE_KEY_LENGTH), node]
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace node references with node keys, ordering unordered references by key.
|
||||
* @param node - graph node.
|
||||
* @param key - key of a referenced node index.
|
||||
* @returns the serialized node.
|
||||
*/
|
||||
export function serializeSchemaNode(node: SchemaNode, key: (index: number) => string): SerializedSchemaNode {
|
||||
switch (node.kind) {
|
||||
case 'array': return { kind: 'array', element: key(node.element) }
|
||||
case 'tuple': return { kind: 'tuple', elements: node.elements.map(element => ({ type: key(element.type), optional: element.optional, rest: element.rest })) }
|
||||
case 'object': return {
|
||||
kind: 'object',
|
||||
properties: node.properties.map(property => ({ name: property.name, type: key(property.type), optional: property.optional,
|
||||
...(property.compatibility === undefined ? {} : { compatibility: property.compatibility }) })),
|
||||
indices: node.indices.map(index => ({ key: key(index.key), value: key(index.value) }))
|
||||
.sort((left, right) => compare(left.key, right.key) || compare(left.value, right.value)),
|
||||
}
|
||||
case 'union': return { kind: 'union', types: node.types.map(key).sort(compare) }
|
||||
case 'primitive':
|
||||
case 'literal':
|
||||
case 'opaque': return node
|
||||
default: return assertNever(node)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize an inventory with one node table keyed by subgraph digest prefix.
|
||||
* Roots and types locate their graph through their digest prefix,
|
||||
* so a type change rewrites only the changed node, its ancestors, and their digests.
|
||||
* @param inventory - validated inventory with canonical graphs.
|
||||
* @returns JSON text with one root, type, or node per line.
|
||||
*/
|
||||
export function encodePersistenceSnapshot(inventory: PersistenceSchemaInventory): string {
|
||||
const table = new Map<string, SerializedSchemaNode>()
|
||||
for (const { schema } of [...inventory.roots, ...inventory.types]) {
|
||||
for (const index of schema.nodes.keys()) {
|
||||
const [key, node] = schemaTableEntry(schema.nodes, index)
|
||||
const existing = table.get(key)
|
||||
if (existing !== undefined && JSON.stringify(existing) !== JSON.stringify(node)) {
|
||||
throw new Error(`persistence schema: node key collision ${key}`)
|
||||
}
|
||||
table.set(key, node)
|
||||
}
|
||||
}
|
||||
return types
|
||||
return renderPersistenceSnapshot(inventory, table)
|
||||
}
|
||||
|
||||
/**
|
||||
* Omit type graphs exactly reconstructable from roots, retaining all other graphs.
|
||||
* @param inventory - expanded inventory, including types erased from roots by normalization.
|
||||
* @returns a lossless snapshot preserving root graphs, type order, and declaration metadata.
|
||||
* Render inventory metadata and a node table in the committed text layout.
|
||||
* @param inventory - root and type metadata; their graphs are not read.
|
||||
* @param table - every node reachable from the roots and types.
|
||||
* @returns JSON text with keys sorted and one root, type, or node per line.
|
||||
*/
|
||||
export function persistenceSchemaSnapshot(inventory: PersistenceSchemaInventory): PersistenceSchemaSnapshot {
|
||||
const reachable = reachableSchemaTypes(inventory.roots.map(root => root.schema))
|
||||
return {
|
||||
formatVersion: inventory.formatVersion,
|
||||
roots: inventory.roots,
|
||||
types: inventory.types.map(({ digest, schema, names, sources }) => ({
|
||||
digest,
|
||||
...(isDeepStrictEqual(schema, reachable.get(digest)) ? {} : { schema }),
|
||||
names,
|
||||
sources,
|
||||
})),
|
||||
}
|
||||
export function renderPersistenceSnapshot(inventory: PersistenceSchemaInventory, table: ReadonlyMap<string, SerializedSchemaNode>): string {
|
||||
const lines = (values: readonly string[], open: string, close: string): string =>
|
||||
values.length === 0 ? open + close : `${open}\n${values.map(value => ` ${value}`).join(',\n')}\n ${close}`
|
||||
const roots = inventory.roots.map(root => JSON.stringify({ key: root.key, kind: root.kind,
|
||||
...(root.event === undefined ? {} : { event: root.event }),
|
||||
...(root.surface === undefined ? {} : { surface: root.surface }), digest: root.digest }))
|
||||
const types = inventory.types.map(type => JSON.stringify({ digest: type.digest, names: type.names, sources: type.sources }))
|
||||
const nodes = [...table].sort(([left], [right]) => compare(left, right)).map(([key, node]) => `${JSON.stringify(key)}: ${JSON.stringify(node)}`)
|
||||
return `{\n "formatVersion": ${String(inventory.formatVersion)},\n`
|
||||
+ ` "roots": ${lines(roots, '[', ']')},\n`
|
||||
+ ` "types": ${lines(types, '[', ']')},\n`
|
||||
+ ` "nodes": ${lines(nodes, '{', '}')}\n}\n`
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/** Compact inventories retain root fingerprints and restore shared recursive type graphs. */
|
||||
/** Snapshot text stores one node table keyed by subgraph digest and restores every root and type graph. */
|
||||
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { parseHistoricalPersistenceSnapshot, parsePersistenceSnapshot } from './persistence-changes.ts'
|
||||
import { canonicalizeSchema, persistenceSchemaSnapshot, schemaDigest, type PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, schemaDigest, type PersistenceSchemaInventory, type SchemaNode } from './persistence-schema-model.ts'
|
||||
import { reviewPersistenceSchemas } from './persistence-review.ts'
|
||||
import { renderPersistenceSchemaDefinitions, renderPersistenceSchemaIndex } from './render-persistence-schema.ts'
|
||||
import { renderPersistenceSchemaDefinitions } from './render-persistence-schema.ts'
|
||||
|
||||
function inventory(): PersistenceSchemaInventory {
|
||||
const schema = canonicalizeSchema([
|
||||
@@ -22,22 +22,51 @@ function inventory(): PersistenceSchemaInventory {
|
||||
}
|
||||
}
|
||||
|
||||
describe('compact persistence snapshots', () => {
|
||||
it('stores only root graphs and restores shared recursive definitions without changing reports', () => {
|
||||
interface SnapshotJson {
|
||||
roots: Record<string, unknown>[]
|
||||
types: Record<string, unknown>[]
|
||||
nodes: Record<string, Record<string, unknown>>
|
||||
}
|
||||
|
||||
function edit(text: string, change: (value: SnapshotJson) => void): string {
|
||||
const value = JSON.parse(text) as SnapshotJson
|
||||
change(value)
|
||||
return JSON.stringify(value)
|
||||
}
|
||||
|
||||
describe('persistence snapshot text', () => {
|
||||
it('stores each shared node once and restores graphs without changing reports', () => {
|
||||
const original = inventory()
|
||||
const snapshot = persistenceSchemaSnapshot(original)
|
||||
expect(snapshot.roots).toEqual(original.roots)
|
||||
expect(snapshot.types).toEqual(original.types.map(({ digest, names, sources }) => ({ digest, names, sources })))
|
||||
const restored = parsePersistenceSnapshot(JSON.parse(JSON.stringify(snapshot)))
|
||||
const text = encodePersistenceSnapshot(original)
|
||||
const parsed = JSON.parse(text) as SnapshotJson
|
||||
expect(Object.keys(parsed.nodes)).toHaveLength(3)
|
||||
expect(parsed.roots[0]).toEqual({ key: 'SessionHeader', kind: 'header', digest: original.roots[0]!.digest })
|
||||
expect(text.split('\n').every(line => !/"type": \d/u.test(line))).toBe(true)
|
||||
const restored = parsePersistenceSnapshot(text)
|
||||
expect(restored).toEqual(original)
|
||||
expect(reviewPersistenceSchemas(original, restored)).toEqual(reviewPersistenceSchemas(original, original))
|
||||
for (const rendering of ['current', 'historical'] as const) {
|
||||
expect(renderPersistenceSchemaIndex(restored, 'en', undefined, 2, rendering))
|
||||
.toBe(renderPersistenceSchemaIndex(original, 'en', undefined, 2, rendering))
|
||||
expect(renderPersistenceSchemaDefinitions(restored, 'en', undefined, 2, rendering))
|
||||
.toBe(renderPersistenceSchemaDefinitions(original, 'en', undefined, 2, rendering))
|
||||
expect(parseHistoricalPersistenceSnapshot(text)).toEqual(original)
|
||||
expect(encodePersistenceSnapshot(restored)).toBe(text)
|
||||
})
|
||||
|
||||
it('changes only the new node and its ancestors when a union gains a variant', () => {
|
||||
const graph = (variants: readonly string[]): PersistenceSchemaInventory => {
|
||||
const nodes: SchemaNode[] = [
|
||||
{ kind: 'object', properties: [{ name: 'other', type: 1, optional: false }, { name: 'source', type: 2, optional: false }], indices: [] },
|
||||
{ kind: 'object', properties: [{ name: 'value', type: 3, optional: false }], indices: [] },
|
||||
{ kind: 'union', types: variants.map((_, index) => 4 + index) },
|
||||
{ kind: 'primitive', type: 'number' },
|
||||
...variants.map((value): SchemaNode => ({ kind: 'literal', value })),
|
||||
]
|
||||
const schema = canonicalizeSchema(nodes, 0)
|
||||
return { formatVersion: 1, roots: [{ key: 'SessionHeader', kind: 'header', digest: schemaDigest(schema), schema }], types: [] }
|
||||
}
|
||||
expect(parseHistoricalPersistenceSnapshot(snapshot)).toEqual(original)
|
||||
const keys = (value: PersistenceSchemaInventory): string[] =>
|
||||
Object.keys((JSON.parse(encodePersistenceSnapshot(value)) as SnapshotJson).nodes)
|
||||
const before = new Set(keys(graph(['a', 'c'])))
|
||||
const after = keys(graph(['a', 'b', 'c']))
|
||||
expect(after.filter(key => !before.has(key))).toHaveLength(3)
|
||||
expect([...before].filter(key => !after.includes(key))).toHaveLength(2)
|
||||
})
|
||||
|
||||
it.each([true, false])('retains independent recursive types with root graphs=%s', (withRoots) => {
|
||||
@@ -48,45 +77,57 @@ describe('compact persistence snapshots', () => {
|
||||
], 0)
|
||||
const independent = { digest: schemaDigest(schema), schema, names: ['example.ts#Independent', 'example.ts#Alias'], sources: ['example.ts'] }
|
||||
const original = { ...base, roots: withRoots ? base.roots : [], types: [independent, ...base.types] }
|
||||
const snapshot = persistenceSchemaSnapshot(original)
|
||||
expect(snapshot.types[0]).toEqual(independent)
|
||||
if (withRoots) expect(snapshot.types.slice(1).every(type => type.schema === undefined)).toBe(true)
|
||||
else expect(snapshot.types).toEqual(original.types)
|
||||
const restored = parsePersistenceSnapshot(JSON.parse(JSON.stringify(snapshot)))
|
||||
const restored = parsePersistenceSnapshot(encodePersistenceSnapshot(original))
|
||||
expect(restored).toEqual(original)
|
||||
expect(parseHistoricalPersistenceSnapshot(snapshot)).toEqual(original)
|
||||
expect(persistenceSchemaSnapshot(restored)).toEqual(snapshot)
|
||||
expect(renderPersistenceSchemaDefinitions(restored)).toBe(renderPersistenceSchemaDefinitions(original))
|
||||
})
|
||||
|
||||
it('reads legacy full graphs and keeps partial acknowledgement inventories empty', () => {
|
||||
const original = inventory()
|
||||
expect(parsePersistenceSnapshot(JSON.parse(JSON.stringify(original)))).toEqual(original)
|
||||
const partial = { ...original, types: [] }
|
||||
expect(parsePersistenceSnapshot(persistenceSchemaSnapshot(partial))).toEqual(partial)
|
||||
it('rejects tampered node keys, unknown references, orphan nodes, and digest mismatches', () => {
|
||||
const text = encodePersistenceSnapshot(inventory())
|
||||
const rootKey = inventory().roots[0]!.digest.slice(0, 16)
|
||||
const second = Object.keys((JSON.parse(text) as SnapshotJson).nodes).find(key => key !== rootKey)!
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => {
|
||||
value.nodes = Object.fromEntries(Object.entries(value.nodes).map(([key, node]) => [key === rootKey ? 'f'.repeat(16) : key, node]))
|
||||
}))).toThrow('key does not match')
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.nodes[rootKey] = { kind: 'array', element: '0'.repeat(16) } })))
|
||||
.toThrow('unknown schema node')
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.nodes[second] = { kind: 'primitive', type: 'number' } })))
|
||||
.toThrow('key does not match')
|
||||
expect(() => parsePersistenceSnapshot(edit(encodePersistenceSnapshot({ ...inventory(), roots: [] }), (value) => { value.types = [] })))
|
||||
.toThrow('not reachable from any root or type')
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.roots[0]!.digest = 'f'.repeat(64) }))).toThrow('no schema node for digest prefix')
|
||||
})
|
||||
|
||||
it('rejects compact digests that do not identify a root subgraph', () => {
|
||||
const snapshot = persistenceSchemaSnapshot(inventory())
|
||||
const schema = canonicalizeSchema([{ kind: 'literal', value: 'unreachable' }], 0)
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, types: [{ digest: schemaDigest(schema), names: [], sources: [] }] }))
|
||||
.toThrow('is not reachable from roots')
|
||||
it('rejects node entries whose properties or union members are not in canonical order', () => {
|
||||
const text = encodePersistenceSnapshot(inventory())
|
||||
const nodes = (JSON.parse(text) as SnapshotJson).nodes
|
||||
const [objectKey] = Object.entries(nodes).find(([, node]) => ((node.properties as unknown[] | undefined)?.length ?? 0) > 1)!
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => {
|
||||
(value.nodes[objectKey]!.properties as unknown[]).reverse()
|
||||
}))).toThrow('node is not canonical')
|
||||
const unionSchema = canonicalizeSchema([
|
||||
{ kind: 'union', types: [1, 2] }, { kind: 'literal', value: 'a' }, { kind: 'literal', value: 'b' },
|
||||
], 0)
|
||||
const union = encodePersistenceSnapshot({ formatVersion: 1, roots: [],
|
||||
types: [{ digest: schemaDigest(unionSchema), schema: unionSchema, names: [], sources: [] }] })
|
||||
const [unionKey] = Object.entries((JSON.parse(union) as SnapshotJson).nodes).find(([, node]) => node.kind === 'union')!
|
||||
expect(() => parsePersistenceSnapshot(edit(union, (value) => {
|
||||
const types = value.nodes[unionKey]!.types as string[]
|
||||
value.nodes[unionKey]!.types = [types[0], ...types]
|
||||
}))).toThrow('node is not canonical')
|
||||
})
|
||||
|
||||
it('still validates explicit legacy graphs instead of replacing them with root graphs', () => {
|
||||
const original = inventory()
|
||||
const schema = canonicalizeSchema([{ kind: 'primitive', type: 'number' }], 0)
|
||||
expect(() => parsePersistenceSnapshot({ ...original, types: original.types.map(type => ({ ...type, schema })) }))
|
||||
.toThrow('shared schema digest mismatch')
|
||||
it('rejects valid content outside the canonical text layout', () => {
|
||||
const text = encodePersistenceSnapshot(inventory())
|
||||
expect(() => parsePersistenceSnapshot(JSON.stringify(JSON.parse(text), null, 2) + '\n')).toThrow('canonical layout')
|
||||
})
|
||||
|
||||
it('rejects invalid metadata and malformed explicit schemas in compact inventories', () => {
|
||||
const snapshot = persistenceSchemaSnapshot(inventory())
|
||||
const type = snapshot.types[0]!
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, types: [{ ...type, names: [3] }] })).toThrow('type name')
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, types: [{ ...type, sources: [3] }] })).toThrow('type source')
|
||||
expect(() => parsePersistenceSnapshot({ ...snapshot, types: [{ ...type, schema: null }] })).toThrow('shared schema')
|
||||
expect(() => parseHistoricalPersistenceSnapshot({ ...snapshot, types: [{ ...type, sources: ['types.ts:3'] }] }))
|
||||
it('rejects invalid type metadata', () => {
|
||||
const text = encodePersistenceSnapshot(inventory())
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.types[0]!.names = [3] }))).toThrow('type name')
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.types[0]!.sources = [3] }))).toThrow('type source')
|
||||
expect(() => parsePersistenceSnapshot(edit(text, (value) => { value.types[0]!.schema = {} }))).toThrow('unknown field schema')
|
||||
expect(() => parseHistoricalPersistenceSnapshot(edit(text, (value) => { value.types[0]!.sources = ['types.ts:3'] })))
|
||||
.toThrow('must omit line numbers')
|
||||
})
|
||||
})
|
||||
@@ -5,7 +5,7 @@ import { afterEach, describe, expect, it } from 'vitest'
|
||||
import { collectLogEvents } from './gen-persistence-catalog.ts'
|
||||
import { extractPersistenceSchema } from './persistence-schema.ts'
|
||||
import { classifyPersistenceChange, parsePersistenceSnapshot } from './persistence-changes.ts'
|
||||
import { canonicalizeSchema, isArbitraryJsonSchema, schemaDigest, type PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
import { canonicalizeSchema, encodePersistenceSnapshot, isArbitraryJsonSchema, schemaDigest, type PersistenceSchemaInventory } from './persistence-schema-model.ts'
|
||||
|
||||
const roots: string[] = []
|
||||
afterEach(() => {
|
||||
@@ -63,7 +63,7 @@ describe('persistent source type extraction', () => {
|
||||
expect(inventory.types.some(type => type.names.includes('packages/domain/payload/src/types.ts#Section'))).toBe(true)
|
||||
expect(inventory.types.some(type => type.names.length === 0 && type.sources.includes('packages/domain/payload/src/types.ts:2'))).toBe(true)
|
||||
expect(inventory.types.some(type => type.schema.nodes[0]?.kind === 'array' && type.names.length === 0)).toBe(true)
|
||||
expect(parsePersistenceSnapshot(inventory)).toEqual(inventory)
|
||||
expect(parsePersistenceSnapshot(encodePersistenceSnapshot(inventory))).toEqual(inventory)
|
||||
})
|
||||
|
||||
it('ignores alias names, files, documentation, readonly, brands and property order', () => {
|
||||
@@ -421,7 +421,7 @@ describe('source compatibility authoring', () => {
|
||||
discriminator: 'kind', unknownKinds: 'preserve', attributionKinds: ['attribution'] })
|
||||
expect(classifyPersistenceChange(before.roots.find(root => root.kind === 'event')!, root))
|
||||
.toEqual([expect.objectContaining({ kind: 'attribution-kind-added', requiresCompatibilityReview: false })])
|
||||
expect(parsePersistenceSnapshot({ ...after, types: [] })).toEqual({ ...after, types: [] })
|
||||
expect(parsePersistenceSnapshot(encodePersistenceSnapshot({ ...after, types: [] }))).toEqual({ ...after, types: [] })
|
||||
})
|
||||
|
||||
it('binds inherited source declarations only on explicitly eligible required roles', () => {
|
||||
|
||||
Reference in new issue
Block a user