---
summary: "编码一次转录事件:所有权、传输副本和实现的切片"
read_when:
- "更改转录本摄取、副本、工作传输或订阅者编码"
- "减少转录分配而不改变存储格式"
title: "转录事件字节"
---
# Transcript 事件字节
**设计;实现广播和共享响应切片。** 保留抄本所有者的规范 JSON 并通过读取器和传输器携带编码的有效负载。仅为需要消息字段的消费者进行解码。这补充了 [ 对话记录所有权 ](/refactor/conversation-transcript-ownership):一位作者保持权威,独立于其事件的传输方式。
## 当前分配
这些位置标识当前的所有权边界,而不是暗示每个事件都会访问每条路径。行号指的是该提案介绍中的实施情况。
| 边界 | 目前的工作 | 编码一次切换 |
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `src/llm/providers/stream-wrappers/stream-payload-utils.ts:15` | 修补可变提供者请求;较早的克隆已被删除。 | Lane 1061 拥有提供者请求副本;提供者请求与持久的转录事件不同。 |
| `src/agents/embedded-agent-runner/session-fork.ts:141` | 克隆重播上下文; `:170` 已将最终提供者有效负载保留为 JSON。 | 与通道 1061 协调提供者捕获;保留重播和提示前缀字节。 |
| `src/shared/immutable-data.ts:17` | 将图形遍历为 classify/freeze 纯数据。 | 1065巷拥有入场复用;编码的内部有效负载不需要重复的图形检查。 |
| `src/config/sessions/session-actor-replica.ts:272` | Clones/freezes 热状态,然后串起来进行大小核算; `:300` 还对转录本保留进行字符串化。 | 保留编码的转录体及其已知字节长度;将热门元数据对象留给参与者。 |
| `src/config/sessions/session-actor-transcript-replica.ts:148` | 播种副本上下文时克隆水合事件。 | 保留编码行;仅针对 tree/context 逻辑实现。 |
| `src/config/sessions/session-accessor.sqlite-transcript-message-append.ts:245` | 对权威消息信封进行编码;回退 `:267` 解析收据的提交字节。 | 将提交的编码和规范化的消息一起携带到摄取中。 |
| `src/infra/sqlite-worker-operation-admission.ts:320` | 帖子工作人员通过结构化克隆传输回复对象图。 | Lane 1062 拥有字节传输和延迟回复解码,包括历史传递。 |
| `src/gateway/server-broadcast.ts:67` | 序列化投影的有效负载并组装连接框架。 | 第一个切片对于每个发布共享一个 UTF-8 消息字段;收件人信封保持独立。 |
## 表示和生命周期
摄取拥有外部输入的标准化和验证。规范化后,对规范事件进行一次编码,保留属性顺序、文本和现有存储语义。保留一个小记录,其中包含会话身份、序列、父级、种类、编码 JSON 和字节长度。这是一种流程表示,而不是新模式或持久格式。 SQLite现有的JSON/compressed有效负载列仍然具有权威性。现有的压缩仍然需要输出分配。
提交的收据发布编码事件及其消费者实际需要的字段。 Actor 副本保留相同的不可变编码,受现有 event/byte 限制和 Actor 生成的限制。附加收据以推进该版本; rewrite/reset 替换受影响的条目;演员退休释放了他们。没有独立的缓存、新鲜度探测器或第二转录机构。编辑 replay/context 数据的使用者在该编辑边界处具体化其自己的对象。不要急于构建对象图和字节图来进行转发。
跨工作边界,当发送者放弃所有权时转移专用的 ArrayBuffer。传输会分离发送者的缓冲区:不要传输参与者保留的缓冲区或池化缓冲区后备存储。并发 retention/fanout 需要显式只读共享表示或一个传输拥有的副本;避免声称仅传输就可以使多读者分发零拷贝。 1062巷拥有该合同。 SQLite/native 传输、压缩、WebSocket 成帧和内核仍然可以复制字节。
在发送之前使用当前所有者持有的事实对每个历史页面或订阅者进行授权。编码内容永远不会证明披露权限。对公共消息进行一次编码,然后将其与受众预计的元数据结合起来。仅当观众、序列和接收者标记匹配时才能共享完整的框架。祖先收据和背压结算仍然由连接拥有。
## 第一片和剩余工作
转录本发布者验证同步扇出消息图的所有权。对于该 `session.message` 发布,其接收者投影将 `message` 字段延迟编码为 UTF-8 一次。广播从其新信封中省略该对象,并在组装文本 WebSocket 帧时插入编码字段。这将删除邮件内容的递归字符串化替换程序、长字符串映射和每个收件人 traversal/escaping。普通广播和自定义投影保留其普通 JSON 语义,包括 getter、接收者之间的突变和 `toJSON`。编码随着发布而过期,因此无需维护失效策略。
该切片仍然独立于 SQLite 对消息进行编码,并将字节复制到每个不同的接收者帧中。
### Slice 2:保留拥有的共享响应缓冲区
历史转发已在转录工作程序中准备并编码响应消息数组。工作人员传输这些字节; `SerializedJsonArray` 将它们带入套接字串行器,无需主线程 decode/re-encode. 列表订阅快照类似地注册其所有者的编码行。在工作人员回复之前,已消耗的历史分页元数据将被删除。
`SerializedJsonPayload` 现在保留串行器拥有的帧缓冲区的视图,而不是在保留有效负载之前复制完整帧。帧组件已经将其与输入 row/worker 字节分开。普通字符串响应仍然需要 UTF-8 编码。共享读过期和修订失效继续保留;每个接收者仍然会收到一个单独的响应,其中包含自己的请求 ID 和当前的披露权限。
剩下的工作是将提交的存储编码携带到广播和副本消费者中,他们仍然在其中物化对象。消息传输工作者和转录工作者 GC 仍然是独立的所有者;这个切片两者都没有改变。无需更改架构。
测量采样的分配字节,包括相同合成装置上收集的对象、GC 时间、事件计数和主线程 CPU。报告采样噪声和本机缓冲区分配限制;单独较低的保留堆并不能证明分配。测试涵盖收件人隔离、Unicode 转义、文本框架、序列号、序列化失败和传输报废。