@chatpanel/活动
峡谷聊天小组 事件日志 财务报告和审定财务报表 能力 合同。 纯,无依赖性
无害环境管理——相同的代码在扩展(浏览器、MV3/CSP安全)、网关和
桥,同样的方式 @chatpanel/pii
已经.
两份合同 其他所有继承:
- 活动计划 ——仅附件,永久版本,仅元数据,并订购 无时钟。 。 。 .
- 能力签名 ——一个呼叫会塑造规则,时间表,用户或模型 都一样.
为什么它存在
聊天小组运行应该可以重建: 组装了什么样的环境, 什么样的能力 运行,在哪个班级和运行时间, 什么被编辑, 和什么留下的设备. 那张唱片是值得信赖的 可核对,所以这个包裹 船 与类型并列的变异物.
无时钟订购
import { linearize } from '@chatpanel/events'
按地形类型重放命令事件
causes断开关系(host, seq)以词典 id 顺序显示主机. 墙壁时间从不咨询.
一旦两个主机同时附加一个时间戳不是命令——时钟sskew,以及两个
主机可以印出同样的毫秒. at 具有咨询性并向人类展示; (host, seq)
财务报告和审定财务报表 causes 是权威. linearize() 因此是事件的一个函数 设定没有
它的数组.
持久性事实,而不是流派
市场滴答、直播字幕和DOM变异 没有 事件。 他们生活在一个 in-memory 环缓冲; 只有输入模型请求的窗口集合或 跨越设备边界得到推广。 这是结构性的,没有事件类型 它可以接受一个每条小字串的项目——因为持久地记录一个标题流大约是 每次会议3 MB,每年5.5 GB.
只有元数据
活动 Ref和数,永远不满足:
makeRef({ kind: 'note', id: 'n_88', hash: 'sha256:…', range: { from: 10, to: 40 } })
重放决定 Ref 按散列:匹配 = 精确重建; 不存在或加密
→ verified-but-unavailable它从未默默地取代今天的音符版本.
privacy.redacted 包含每个实体类型中有多少个被修改,而从未
值——所编辑内容的日志本身不得包含所编辑的数据.
能力签名
validateCapability({
id: 'page.actions', version: '1.0.0', class: 'R',
requires: ['tab'], provides: ['page.tools'],
reads: ['page'], writes: ['page'],
egress: 'none', effects: 'non-replayable',
disclose: () => ({ name: 'page.actions', gist: 'Act on the current web page' }),
output: { schema: …, render: (v) => … },
invoke: async (input, ctx) => …,
})
actor 援引是使能力变得独立的原因. requirements
(单位:千美元)maxLatencyMs, (中文(简体) ), deterministic, (中文(简体) ), egress, (中文(简体) ), maxCostUsd路由器发送到..
一定是事实没有 哪个型号 - 和 canSatisfy() 拒绝 而不是说
沉默地超过预算.
类是内在的(一种确定性的保证);耐久性是宿主的. 两人从不 融为一表.
toModelSchema() 是一个 允许列表 从三个字段建起,从不省略列表——所以
invoke, (中文(简体) ), effects, (中文(简体) ), cost, (中文(简体) ), writes 财务报告和审定财务报表 egress 无法泄露到模型请求中.
存储器 — 持久性是一个主机适配器
const log = createLogStore(adapter) // append-only events
const blobs = createBlobStore(adapter) // content-addressed, deduped
这个 语义 住在这里; 每一个主机都提供下面的存储器 — IndexedDB in the 扩展名, SQLite 在网关或守护进程上, 一个被封装的环式缓冲。 记忆 用于测试的适配器船,合用主机和回放带.
append() 实值 事件编号,所以复制到温暖的层次可以重试
安全地——一能键能力的日志级对应机载. 以下各项
移动 倒转 对一个主机来说,它被排斥为一位腐败的作家; 漏洞被允许,因为
驱逐不得破坏日志. cursor() 财务报告和审定财务报表 since() 是复制对.
两家店是分开的 加密- 刷新 工作内容 : blobs.shred(hash) 丢弃
有效载荷和留下一块墓碑, 所以"删除这个会议"可以被尊为..
仅附加日志, 而每个引用它的事件, 以及因果关系链, 保留
完好无损 重放然后报告 verified-but-unavailable。 。 。 .
登记册——效果和被动提供
const reg = createRegistry({ onEvent })
reg.register({ name: 'page-tools', requires: ['tab'], apply(ctx) {
ctx.effect(() => { const off = arm(); return () => off() }) // unwinds automatically
}})
const withdraw = reg.provide('tab', tab) // page-tools activates
withdraw() // page-tools deactivates and unwinds
这是一半的能力合同运行时间: requires编号 :provides 在一个
宣言只是因为有东西把他们绑在这里 有两条规则,
,每个都防止特定错误类:
- LIFO 处置 - 逆向按登记顺序逆向运行,因此,每个逆向均符合 说明自己生产的应用程序.
- 依赖性失效 在此之前 提供者的绑定被删除 - 一个组成部分 因为它的供应商要离开 经常被拆掉 需求 正在撤销的能力(关闭池意味着移交连接) 回来 先去掉捆绑物 然后拆掉的东西就不见了.
失败的组件被记录在自己身上, 打开它注册的任何东西, 然后离开
它的兄弟姐妹们在奔跑 依赖周期只是永久离开其组成部分
不活动——而且与依时间表而定的僵局不同,从宣言中可以看出这一点
一个人,所以 pending() 可以在负载时报告.
无依赖性 决议: 此绑定可用性, 它不会解决版本 .
变化因素
checkInvariants(events) // → [] when the log is sound
| 页:1 | 模式可见输入可以从日志重建 |
| 页:1 | 每一起事件都有记录(controlled: false 授权代理人) |
| 分类 | 非纯粹的援引带有一等之能 |
| 一级 | 每次激活都有反向记录 |
| 第5条 | 永生之流从不成为长久的事实 |
| 编号 | 重放是决定性的 |
I3是额外的结构:非纯度 capability.invoked 没有键失败
validateEvent,因此完全无法输入日志.
A 类 中继转弯 一个对接的电话或伙伴服务器 穿过这台电脑的网关
是一个 turn.ended 网关在主机下写入 gateway 与 relayed: true (单位:千美元) surface
联 合 国 partner:<name> 或者说 phone:<name>: 只计数、 id 和名称 (link-activity.js
拥有完整的外观和阅读器“活动”页面。 其背景汇编于
调用器设备,所以I1不会为此询问网关的日志.
重放带
const report = replay(parseJsonl(log), { blobs })
if (!report.ok) { console.error(formatReport(report)); process.exit(1) }
在CI中运行,决定论的说法不再是评论. 它重现了从
(host, seq) 财务报告和审定财务报表 causes,检查 I1-I6,解决每个居民 Ref 以大麻为原料.
有两个结果值得区分,因为它们看起来相似,而相反 东西:
- 一个blob,即 不见了 (crypto-shreed或被逐出)报告 已核实但无法获取 财务报告和审定财务报表 通过 - 粉碎是一种特征,原木仍能证明寄出的东西;
- 来源 已更改 报告 漂流着 财务报告和审定财务报表 失败,因为另一种选择是 悄悄地用今天的笔记来代替实际发送的笔记.
安装
npm install @chatpanel/events
节点20。 无依取相. node --test tests/*.test.js。 。 。 .
默认 digest 并使用 全球 WebCrypto, 每个浏览器都有它
并且节点从19起就暴露在没有旗帜的情况下——因此20起而不是18起(EOL)
(自2025年4月起)。 两者都是可注射的,所以一个拥有自己密码的宿主从不接触
默认.
许可证
见 自由主义。 。 。 .