@lqc123qwe/car-runtime 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/SHA256SUMS +1 -1
- package/dist/car-runtime-1.18.0.tgz +0 -0
- package/dist/car-runtime-1.18.0.tgz.sig.bundle +1 -0
- package/dist/load/config.d.ts +3 -1
- package/dist/load/config.js +6 -1
- package/dist/release-audit.jsonl +4 -4
- package/dist/sbom.json +5 -5
- package/dist/session/compact.d.ts +20 -3
- package/dist/session/compact.js +20 -2
- package/package.json +1 -1
- package/src/load/config.ts +8 -2
- package/src/session/compact.ts +32 -4
- package/dist/car-runtime-1.17.0.tgz +0 -0
- package/dist/car-runtime-1.17.0.tgz.sig.bundle +0 -1
package/README.md
CHANGED
|
@@ -286,7 +286,8 @@ node --experimental-transform-types --test test/*.spec.ts
|
|
|
286
286
|
|
|
287
287
|
## 状态
|
|
288
288
|
|
|
289
|
-
- **版本主线**:S1-S4 48/48 | M2 89/89(v0.2.0)| M3 127/127(v0.3.0)| M4 139/139(**1.0.0-rc.1 已发布**)| M5 156/156(DEC-4 预埋项转正)| M6 179/179(2026-09-15 收口)| M7 全量 195(192 PASS + 3 能力门控 skip,2026-09-19 收口)| **M5-S28 装载签名门 全量 204(201 PASS + 3 skip,2026-09-26)** | **M8 运行时底座 全量 231(228 PASS + 3 skip,2026-09-26 收口,§3.2 八模块全部收口)** | **1.1 签名收尾最小集 全量 249(246 PASS + 3 skip,2026-09-27 收口,1.1.0 已发布,enforce 翻转准备就绪)** | **1.2 会话/遥测小项 全量 263(260 PASS + 3 skip,2026-09-27 收口,1.2.0 已发布)** | **1.3 发布资产自动化 全量 270(267 PASS + 3 skip,2026-09-27 收口,1.3.0 已发布,全链零人工拖拽兑现)** | **1.4 真实模型接入 全量 282(279 PASS + 3 skip,2026-09-27 收口,1.4.0 已发布)** | **1.5 provider 扩展+远程 MCP+配置完整形态 全量 300(297 PASS + 3 skip,2026-09-28 收口,1.5.0 已发布)** | **1.6 宿主工具面+投影收敛+jiti 载体 全量 318(315 PASS + 3 skip,2026-09-28 收口,1.6.0 已发布)** | **1.7 OTLP span 语义收口+metrics 时序修正+mcp-serve span 面 全量 328(325 PASS + 3 skip,2026-09-28 收口,1.7.0 已发布)** | **1.8 W3C traceparent 跨进程传播+LLM 出站通道修复 全量 335(332 PASS + 3 skip,2026-09-29 收口,1.8.0 已发布)** | **1.9 远程 MCP traceparent 传播(HTTP 头通道) 全量 339(336 PASS + 3 skip,2026-09-29 收口,1.9.0 已发布)** | **1.10 KernelSeam 公开导出面+库构建产物 全量 341(338 PASS + 3 skip,2026-09-29 收口,1.10.0 已发布)** | **1.11 seam authz 导出+usage 事件计量采集 全量 355(352 PASS + 3 skip,2026-10-07 收口,1.11.0 已发布)** | **1.12 seam MCP/PTC 真桥导出面+jiti epoch 面确认 全量 363(360 PASS + 3 skip,2026-10-07 收口,1.12.0 已发布)** | **1.13 桌面 S3 治理面(K-FS-1/2/3+K-SC-1 authorizeAll/decideByRule/fs-read·fs-delete 能力 + seam 出面 redact/loadSessionLog/exportForensicsBundle;恢复面 K-S3-2 零登记确认——fromEvents 自 M5 在产) 全量 374(371 PASS + 3 skip,2026-10-11 收口,1.13.0 已发布)** | **1.14 模型参数/压缩/分段/模型池/PluginManager 五候选(K-MP-1 reasoning 透传 + K-MP-2 压缩面 append-only context/compact + K-MP-2b 分段计量 + K-POOL-1 模型池 routing/decide 落链 + K-S4-1 seam 出面装载报告面;D-43 裁决登记 strict 期限不引入 sigstore——engines 硬不兼容见评估报告) 全量 419(416 PASS + 3 skip,2026-10-18 收口,1.14.0 已发布)** | **1.14.1 B2 前置消费面(ChatStepOptions.reasoning 透传 + shouldCompact/applyCompaction + assembleModelPool/probePoolMember 出面,seam 35→39 符号) 全量 423(420 PASS + 3 skip,2026-10-18,1.14.1 已发布)** | **1.15 白盒记忆+引导消息双候选(K-MEM-1 记忆 CRUD 落链 + 链即版本库 rollback + 注入装载预算门控 + K-STEER-1 投影隔离 + pendingSteerTurns 排队扫描;seam 39→42 符号) 全量 439(438 PASS + 1 skip,2026-10-19 收口,1.15.0 已发布)** | **1.16 子 Agent config schema(D-K2-2:llm.subagent 三键 model/maxConcurrent/maxCumulative 嵌套 strict zod——compaction 先例;空对象拒禁静默 no-op + 未登记键 CAR-E-CONFIG 带路径;SubagentConfig 类型面、运行时符号 43 零加法;D-1 KEY_SPACES 误写 llm.modelPool.* 勘误闭环) 全量 446(443 PASS + 3 skip,2026-10-24 收口,1.16.0 已发布)**
|
|
289
|
+
- **版本主线**:S1-S4 48/48 | M2 89/89(v0.2.0)| M3 127/127(v0.3.0)| M4 139/139(**1.0.0-rc.1 已发布**)| M5 156/156(DEC-4 预埋项转正)| M6 179/179(2026-09-15 收口)| M7 全量 195(192 PASS + 3 能力门控 skip,2026-09-19 收口)| **M5-S28 装载签名门 全量 204(201 PASS + 3 skip,2026-09-26)** | **M8 运行时底座 全量 231(228 PASS + 3 skip,2026-09-26 收口,§3.2 八模块全部收口)** | **1.1 签名收尾最小集 全量 249(246 PASS + 3 skip,2026-09-27 收口,1.1.0 已发布,enforce 翻转准备就绪)** | **1.2 会话/遥测小项 全量 263(260 PASS + 3 skip,2026-09-27 收口,1.2.0 已发布)** | **1.3 发布资产自动化 全量 270(267 PASS + 3 skip,2026-09-27 收口,1.3.0 已发布,全链零人工拖拽兑现)** | **1.4 真实模型接入 全量 282(279 PASS + 3 skip,2026-09-27 收口,1.4.0 已发布)** | **1.5 provider 扩展+远程 MCP+配置完整形态 全量 300(297 PASS + 3 skip,2026-09-28 收口,1.5.0 已发布)** | **1.6 宿主工具面+投影收敛+jiti 载体 全量 318(315 PASS + 3 skip,2026-09-28 收口,1.6.0 已发布)** | **1.7 OTLP span 语义收口+metrics 时序修正+mcp-serve span 面 全量 328(325 PASS + 3 skip,2026-09-28 收口,1.7.0 已发布)** | **1.8 W3C traceparent 跨进程传播+LLM 出站通道修复 全量 335(332 PASS + 3 skip,2026-09-29 收口,1.8.0 已发布)** | **1.9 远程 MCP traceparent 传播(HTTP 头通道) 全量 339(336 PASS + 3 skip,2026-09-29 收口,1.9.0 已发布)** | **1.10 KernelSeam 公开导出面+库构建产物 全量 341(338 PASS + 3 skip,2026-09-29 收口,1.10.0 已发布)** | **1.11 seam authz 导出+usage 事件计量采集 全量 355(352 PASS + 3 skip,2026-10-07 收口,1.11.0 已发布)** | **1.12 seam MCP/PTC 真桥导出面+jiti epoch 面确认 全量 363(360 PASS + 3 skip,2026-10-07 收口,1.12.0 已发布)** | **1.13 桌面 S3 治理面(K-FS-1/2/3+K-SC-1 authorizeAll/decideByRule/fs-read·fs-delete 能力 + seam 出面 redact/loadSessionLog/exportForensicsBundle;恢复面 K-S3-2 零登记确认——fromEvents 自 M5 在产) 全量 374(371 PASS + 3 skip,2026-10-11 收口,1.13.0 已发布)** | **1.14 模型参数/压缩/分段/模型池/PluginManager 五候选(K-MP-1 reasoning 透传 + K-MP-2 压缩面 append-only context/compact + K-MP-2b 分段计量 + K-POOL-1 模型池 routing/decide 落链 + K-S4-1 seam 出面装载报告面;D-43 裁决登记 strict 期限不引入 sigstore——engines 硬不兼容见评估报告) 全量 419(416 PASS + 3 skip,2026-10-18 收口,1.14.0 已发布)** | **1.14.1 B2 前置消费面(ChatStepOptions.reasoning 透传 + shouldCompact/applyCompaction + assembleModelPool/probePoolMember 出面,seam 35→39 符号) 全量 423(420 PASS + 3 skip,2026-10-18,1.14.1 已发布)** | **1.15 白盒记忆+引导消息双候选(K-MEM-1 记忆 CRUD 落链 + 链即版本库 rollback + 注入装载预算门控 + K-STEER-1 投影隔离 + pendingSteerTurns 排队扫描;seam 39→42 符号) 全量 439(438 PASS + 1 skip,2026-10-19 收口,1.15.0 已发布)** | **1.16 子 Agent config schema(D-K2-2:llm.subagent 三键 model/maxConcurrent/maxCumulative 嵌套 strict zod——compaction 先例;空对象拒禁静默 no-op + 未登记键 CAR-E-CONFIG 带路径;SubagentConfig 类型面、运行时符号 43 零加法;D-1 KEY_SPACES 误写 llm.modelPool.* 勘误闭环) 全量 446(443 PASS + 3 skip,2026-10-24 收口,1.16.0 已发布)** | **1.17 缓存断点 P1 + 闸门熔断(D-48 toAnthropic system 单块 + cache_control ephemeral 传输层注解〔N1 零影响〕,off = CAR_LLM_PROMPT_CACHE=off / --no-prompt-cache;D-50 G8 denyBreaker=3 拒绝累计熔断 + G9 repeatFailureBreaker=2 同签名连击不派发成对落链 + V2-a blockOnDeny 随档位收敛〔readonly 恒 true〕;D-49 观察项 s50-11 长会话端到端触发证据;TurnPreset 可选键类型面,运行时符号 43 零加法) 全量 457(454 PASS + 3 skip,2026-10-24 收口,1.17.0 已发布)**
|
|
290
|
+
- **1.17.0 已发布(2026-10-24,K4 批——缓存断点 P1 + 闸门 G8/G9/G10)**:npm latest → 1.17.0 + provenance 在案。Release `1.17.0`(id 422609668,target_commitish = `4594857` 完整 SHA)→ j16 run 40078304990 success(13 步)→ ci success。**通道注记**:github.com:443 直连再度阻断——push 走 Git Data API 逐字节复刻(`tools/gitdata-push.mjs`;本地以 commit-tree 无尾换行形态对齐,双仓零分叉 IDENTICAL)。post-publish:registry src 面 53 文件 blob SHA 与 tag 树全一致;dist/seam.js 43 符号零 subagent 面;G8 于 registry dist 实探生效(blocked + gate=denyBreaker + denies=3);llm.subagent 实解析;tarball CDN 滞后 ~3 分钟(元数据先行,二进制 404→200)。
|
|
290
291
|
- **1.16.0 已发布(2026-10-24,K3 批——子 Agent config schema,D-K2-2 触发)**:npm latest → 1.16.0 + SLSA provenance 在案。Release `1.16.0`(id 422584868,target_commitish = `c8f6476` 完整 SHA)→ j16 run 40074395764 全 13 步 success(五件套上传齐:tgz + sig.bundle + SHA256SUMS + sbom + release-audit)→ ci success。post-publish 对拍:registry 包 src 面 53 文件与 tag 树逐字节一致(common 55 文件全同,含 package.json/README);registry dist/seam.js 43 运行时符号零 subagent 面 + `llm.subagent.model` 实解析生效(本地 dist 探针);本地 release-pipeline 预演 11 PASS / 2 DRY-RUN / 0 FAIL(干净 env——会话凭据 env 残留会使内嵌全量假红,既知纪律)。s58 5/5 + 全量 446(443 pass / 0 fail / 3 skip zstd 能力门控)。桌面消费批 K3-C 已随批落地(car-desktop `ec5d356`:SubagentManager 三键消费 + 池/端点压过口径 + k2 spec 13/13 + SMOKE seam 1.16.0)。
|
|
291
292
|
- **1.15 状态(白盒记忆 + 引导消息双候选,桌面 v0.2-B3 批)**:S1 K-MEM-1(`be08c3e`)+ S2 K-STEER-1(`2f1a466`)+ S3 seam 出面(39→42 运行时符号:+MemoryStore/+loadMemoryForInjection/+pendingSteerTurns + 5 类型;负面清单:存储引擎内部件/注入落链执行器/消费调度器不出面);dist 重建 s44 检查绿;规划与执行注记:`car-docs/10-内核v1/1.15-迭代规划.md`(D-46/D-47/D-48)。
|
|
292
293
|
- **1.14.0 正式发布(2026-10-18,桌面 v0.2-B1 批)**:npm `@lqc123qwe/car-runtime@1.14.0` 在架——**dist-tags latest → 1.14.0 + SLSA provenance 在案**(npm transparency log 3308759260)。Release `1.14.0`(id 416323415,target_commitish=完整 SHA `92a35904c5179a99cdb69d82542953f82fb920ba`;main 推送**首次直连通道**——90c653c→92a3590 共 13 commits,WorkBuddy 沙箱代理 502 根因落档后直连常态化,Git Data API 复刻通道退役为应急预案)→ **j16 run 全 13 步 success**(cosign keyless OIDC+Rekor:tgz bundle logIndex 3308757191)→ **post-publish REMOTE_CHECK 13 PASS / 0 DRY-RUN / 0 FAIL**(G-09 npm 在架 latest + SLSA provenance ✓ / G-10 Release 五件套齐备 / G-04 audit 0);外部等价检查:Release 实下载件 SHA256 MATCH(cb43ec0b9b1f7ad4…)+ cosign verify-blob **Verified OK**(Fulcio + Rekor tlog)+ registry tarball ↔ tag 树 src 面逐字节一致(51 文件)+ dist 面语义等价(去引号逐字节一致——CI `npx -y -p typescript` 未钉版引号发射差异,登记非偏差)+ dist/seam.js 35 符号在库 ✓。seam 32→35 运行时符号(+8 类型)。
|
package/dist/SHA256SUMS
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
0a4e4ecf1ec5249bb7a121a288bb9739fa1261385debca722ba52167c751981a car-runtime-1.18.0.tgz
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"base64Signature":"MEQCICVHnKG2MTF2xtkFObwIE4tEU2yH84N10KFvKpjzHcMeAiAMn+pb37rc0n+LfWDkxPWXE0qGYuG7J1qqolXvlXhJrQ==","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1ekNDQm02Z0F3SUJBZ0lVRGpkUmtkUVd3WW51M3BxWmZ0bUxEaEJMNXlrd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ESTBNRGt6TkRBMFdoY05Nall4TURJME1EazBOREEwV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVEdFBwS0dYb2ppOHpENkJwUDBBNDZheUNIMTZrMUx5TmxsSHQKaGMvZjd4VC9idDlhajB4N0hYQWgwSGdnRlVPNWV0bUZ5dm5YWWxQWSt5Mm5FbkpkNGFPQ0JZMHdnZ1dKTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakU0TGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLR1F4WW1FNE9UVmhNek14TVdFMllUTm1NV0UyTVRWbApaams1TjJZMk1XTTNNbU5qWlRBMVptTXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVGd1TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakU0TGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENoawpNV0poT0RrMVlUTXpNVEZoTm1FelpqRmhOakUxWldZNU9UZG1OakZqTnpKalkyVXdOV1pqTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENoawpNV0poT0RrMVlUTXpNVEZoTm1FelpqRmhOakUxWldZNU9UZG1OakZqTnpKalkyVXdOV1pqTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVGd1TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFNExqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2hrTVdKaE9EazFZVE16TVRGaE5tRXpaakZoTmpFMVpXWTVPVGRtTmpGak56SmpZMlV3Tldaak1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6UXdNRGd5TkRVMgpORFkwTDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE9DNHdNSUdMQmdvckJnRUVBZFo1QWdRQ0JIMEVld0I1QUhjQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hiVUtkcEFBQUJBTUFTREJHCkFpRUEyNzZzWkcvaU5JL2tDZGcvVmtHUytFREc0elZEaHlaclVYVmsrc1M0Y3VFQ0lRQ2g3dUUyRkxEU3JhemUKS2N6WjNGODBQZUVZRythcDM0OURXbi85TEJkUlREQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQkdLa1NjYVFWegp5ckF1N0g4c3pCcjZzUmZOZXA5TCtVdU81cExLUm5DSDJwTTVpdmZDcnBNbzZCOHJ2STdpUjZzQ01IR01jUytlCkx6RjNpVFA1TWxoY1VqOVQ3T2Z4QkdNZ0hPWWRBK3hRU2JvV1AyZ2RGTlRNUVhGczZ2VTRKWjVuMlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEYCIQDpdxwVxvYZUSg9v/St15GLmqkaC6goRr3tHfFjFknSXAIhAKNmGkkqx1WcmFfQiphXX73ca7G1y3KanVmi/WX0UDDG","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwYTRlNGVjZjFlYzUyNDliYjdhMTIxYTI4OGJiOTczOWZhMTI2MTM4NWRlYmNhNzIyYmE1MjE2N2M3NTE5ODFhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQ1ZIbktHMk1URjJ4dGtGT2J3SUU0dEVVMnlIODROMTBLRnZLcGp6SGNNZUFpQU1uK3BiMzdyYzBuK0xmV0RreFBXWEUwcUdZdUc3SjFxcW9sWHZsWGhKclE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFla05EUW0wMlowRjNTVUpCWjBsVlJHcGtVbXRrVVZkM1dXNTFNM0J4V21aMGJVeEVhRUpNTlhscmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFU1RCTlJHdDZUa1JCTUZkb1kwNU5hbGw0VFVSSk1FMUVhekJPUkVFd1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZFZEZCd1MwZFliMnBwT0hwRU5rSndVREJCTkRaaGVVTklNVFpyTVV4NVRteHNTSFFLYUdNdlpqZDRWQzlpZERsaGFqQjROMGhZUVdnd1NHZG5SbFZQTldWMGJVWjVkbTVZV1d4UVdTdDVNbTVGYmtwa05HRlBRMEpaTUhkbloxZEtUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1UwVEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUjFGNFdXMUZORTlVVm1oTmVrMTRUVmRGTWxsVVRtMU5WMFV5VFZSV2JBcGFhbXMxVGpKWk1rMVhUVE5OYlU1cVdsUkJNVnB0VFhkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkdkMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVTBUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm9hd3BOVjBwb1QwUnJNVmxVVFhwTlZFWm9UbTFGZWxwcVJtaE9ha1V4V2xkWk5VOVVaRzFPYWtacVRucEthbGt5VlhkT1YxcHFUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVOb2F3cE5WMHBvVDBSck1WbFVUWHBOVkVab1RtMUZlbHBxUm1oT2FrVXhXbGRaTlU5VVpHMU9ha1pxVG5wS2Fsa3lWWGRPVjFwcVRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkdkMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTkV4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJoclRWZEthRTlFYXpGWlZFMTZUVlJHYUU1dFJYcGFha1pvVG1wRk1WcFhXVFZQVkdSdFRtcEdhazU2U21wWk1sVjNUbGRhYWsxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlVYZE5SR2Q1VGtSVk1ncE9SRmt3VERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU5RE5IZE5TVWRNUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJTUVWbGQwSTFRVWhqUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaGlWVXRrY0VGQlFVSkJUVUZUUkVKSENrRnBSVUV5TnpaeldrY3ZhVTVKTDJ0RFpHY3ZWbXRIVXl0RlJFYzBlbFpFYUhsYWNsVllWbXNyYzFNMFkzVkZRMGxSUTJnM2RVVXlSa3hFVTNKaGVtVUtTMk42V2pOR09EQlFaVVZaUnl0aGNETTBPVVJYYmk4NVRFSmtVbFJFUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV1UVVSQ2EwRnFRa2RMYTFOallWRldlZ3A1Y2tGMU4wZzRjM3BDY2paelVtWk9aWEE1VEN0VmRVODFjRXhMVW01RFNESndUVFZwZG1aRGNuQk5ielpDT0hKMlNUZHBValp6UTAxSVIwMWpVeXRsQ2t4NlJqTnBWRkExVFd4b1kxVnFPVlEzVDJaNFFrZE5aMGhQV1dSQkszaFJVMkp2VjFBeVoyUkdUbFJOVVZoR2N6WjJWVFJLV2pWdU1sRTlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1792834445,"logIndex":3438969996,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|
package/dist/load/config.d.ts
CHANGED
|
@@ -8,8 +8,10 @@ export interface SandboxSigConfig {
|
|
|
8
8
|
export interface CompactionConfig {
|
|
9
9
|
/** 缺省 false = 行为零变化(1.13 兼容线) */
|
|
10
10
|
enabled?: boolean;
|
|
11
|
-
/**
|
|
11
|
+
/** 距上次压缩以来的新增事件数阈值(事实计数非估算);缺省 200 */
|
|
12
12
|
thresholdEvents?: number;
|
|
13
|
+
/** 1.18-K5(D-51):token 维度阈值(provider 报告事实,非估算);与事件阈值 OR;缺省缺席不生效 */
|
|
14
|
+
thresholdTokens?: number;
|
|
13
15
|
/** 保护最近 N 个 turn 不折叠;缺省 4 */
|
|
14
16
|
protectLastTurns?: number;
|
|
15
17
|
}
|
package/dist/load/config.js
CHANGED
|
@@ -125,11 +125,14 @@ const rawSchema = z.object({
|
|
|
125
125
|
.refine(v => Number.isFinite(v) && Number.isInteger(v) && v > 0, { message: '必须为正整数' })
|
|
126
126
|
.optional(),
|
|
127
127
|
allowEnvFallback: z.boolean({ invalid_type_error: '必须为布尔', required_error: '必须为布尔' }).optional(),
|
|
128
|
-
// 1.14-S2(K-MP-2 / D-40):历史压缩策略(阈值事实计数,非 token
|
|
128
|
+
// 1.14-S2(K-MP-2 / D-40):历史压缩策略(阈值事实计数,非 token 估算);
|
|
129
|
+
// 1.18-K5(D-51):thresholdTokens = provider 报告事实维度(最近 usage 全上下文,非估算)
|
|
129
130
|
compaction: z.object({
|
|
130
131
|
enabled: z.boolean({ invalid_type_error: '必须为布尔', required_error: '必须为布尔' }).optional(),
|
|
131
132
|
thresholdEvents: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
132
133
|
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
134
|
+
thresholdTokens: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
135
|
+
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
133
136
|
protectLastTurns: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
134
137
|
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
135
138
|
}).strict().optional(),
|
|
@@ -202,6 +205,8 @@ function parseCarConfig(raw) {
|
|
|
202
205
|
cp.enabled = d.llm.compaction.enabled;
|
|
203
206
|
if (d.llm.compaction.thresholdEvents !== undefined)
|
|
204
207
|
cp.thresholdEvents = d.llm.compaction.thresholdEvents;
|
|
208
|
+
if (d.llm.compaction.thresholdTokens !== undefined)
|
|
209
|
+
cp.thresholdTokens = d.llm.compaction.thresholdTokens;
|
|
205
210
|
if (d.llm.compaction.protectLastTurns !== undefined)
|
|
206
211
|
cp.protectLastTurns = d.llm.compaction.protectLastTurns;
|
|
207
212
|
llm.compaction = cp;
|
package/dist/release-audit.jsonl
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"stage":"archive","detail":"git archive HEAD → car-runtime-1.
|
|
2
|
-
{"stage":"sha256sums","detail":"SHA256SUMS
|
|
3
|
-
{"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":
|
|
4
|
-
{"stage":"cosign-keyless","detail":"signed car-runtime-1.
|
|
1
|
+
{"stage":"archive","detail":"git archive HEAD → car-runtime-1.18.0.tgz(412568 bytes,树哈希锚定)","ts":1792834443858}
|
|
2
|
+
{"stage":"sha256sums","detail":"SHA256SUMS 0a4e4ecf1ec5249b…(裸字节复核通过)","ts":1792834443859}
|
|
3
|
+
{"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":1792834443866}
|
|
4
|
+
{"stage":"cosign-keyless","detail":"signed car-runtime-1.18.0.tgz (keyless OIDC + Rekor)","ts":1792834445397}
|
package/dist/sbom.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CAR-SBOM",
|
|
3
3
|
"specVersion": "0.1",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.18.0",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
7
7
|
"type": "file",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
{
|
|
57
57
|
"type": "file",
|
|
58
58
|
"path": "src/load/config.ts",
|
|
59
|
-
"sha256": "
|
|
59
|
+
"sha256": "529e2c5d000e9cdb8835a554263c4f8881a1eed594176571c5eca53dddd17f47"
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
"type": "file",
|
|
@@ -226,7 +226,7 @@
|
|
|
226
226
|
{
|
|
227
227
|
"type": "file",
|
|
228
228
|
"path": "src/session/compact.ts",
|
|
229
|
-
"sha256": "
|
|
229
|
+
"sha256": "06226ddf7d24e4fd67a08ddef06ebd12c3525d5c02590b414321daccc2d1e087"
|
|
230
230
|
},
|
|
231
231
|
{
|
|
232
232
|
"type": "file",
|
|
@@ -271,12 +271,12 @@
|
|
|
271
271
|
{
|
|
272
272
|
"type": "file",
|
|
273
273
|
"path": "package.json",
|
|
274
|
-
"sha256": "
|
|
274
|
+
"sha256": "4152ba6a1827d3fe8cf06f5f6b631927cd71c6d66cd432fbbd9adcf9f1e94b9b"
|
|
275
275
|
},
|
|
276
276
|
{
|
|
277
277
|
"type": "file",
|
|
278
278
|
"path": "README.md",
|
|
279
|
-
"sha256": "
|
|
279
|
+
"sha256": "4fd84a935856faa9193971e6bf87f24195083b11e7e0974ff872b18e76e8e95a"
|
|
280
280
|
}
|
|
281
281
|
],
|
|
282
282
|
"runtimeDependencies": []
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
* 禁静默成功;摘要生成产物非非空字符串 → CAR-E-COMPACT-SUMMARY 显式报错;
|
|
17
17
|
* - **零新依赖**:摘要缺省为确定性生成器(轮次意图 + 工具调用统计 + 收口状态——事实拼装,
|
|
18
18
|
* 禁估算);宿主可注入 LLM 摘要(summarize 缝——内核不依赖 LLM 做压缩);
|
|
19
|
-
* - **触发面**:shouldCompact 判定(thresholdEvents
|
|
20
|
-
*
|
|
19
|
+
* - **触发面**:shouldCompact 判定(thresholdEvents 事实计数 + thresholdTokens provider 报告
|
|
20
|
+
* 事实——两维度均禁 tokenizer 估算)+ applyCompaction 立即 API;自动挂载点在宿主装配层
|
|
21
|
+
* (runTurn 之间调用,内核不改 runTurn 语义)。
|
|
21
22
|
*/
|
|
22
23
|
import type { SessionEvent, SessionLog } from './log.ts';
|
|
23
24
|
export interface CompactionConfig {
|
|
@@ -25,6 +26,17 @@ export interface CompactionConfig {
|
|
|
25
26
|
enabled?: boolean;
|
|
26
27
|
/** 距上次压缩以来的新增事件数阈值(事实计数,非 token 估算);缺省 200 */
|
|
27
28
|
thresholdEvents?: number;
|
|
29
|
+
/**
|
|
30
|
+
* 1.18-K5(D-51):token 维度阈值——事实源 = 链上最近一条 'usage' 事件(provider 报告,
|
|
31
|
+
* 禁 tokenizer 估算)的 input + cacheRead + cacheCreation 之和(两族归一化后统一口径
|
|
32
|
+
* = 最近一次请求的全上下文:openai prompt_tokens 含 cached 已减法归一、anthropic
|
|
33
|
+
* input_tokens 天然不含 cache——types.ts §1.1)。与 thresholdEvents **任一命中即触发**(OR)。
|
|
34
|
+
* 缺省缺席 = 行为零变化;≤ 0 不生效。补的缺口:真实使用若长期 10~30 轮,事件阈值
|
|
35
|
+
* 永不触及而上下文持续增长到撞 provider 上限(设计 §10.4-2 附带发现)。
|
|
36
|
+
* 子链甄别(实核消解):K2 子 Agent 子链为独立 SessionLog,其 usage 事件只落子链
|
|
37
|
+
* (汇总走 system kind 防双计)——主链日志内 'usage' 事件必然全部来自主链请求,无污染。
|
|
38
|
+
*/
|
|
39
|
+
thresholdTokens?: number;
|
|
28
40
|
/** 保护最近 N 个 turn 不折叠;缺省 4 */
|
|
29
41
|
protectLastTurns?: number;
|
|
30
42
|
}
|
|
@@ -36,7 +48,12 @@ export interface CompactionPlan {
|
|
|
36
48
|
/** 折叠区间事件引用(供摘要生成;只读) */
|
|
37
49
|
events: readonly SessionEvent[];
|
|
38
50
|
}
|
|
39
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* shouldCompact:事件阈值 OR token 阈值任一命中(enabled 缺省关 = 零变化)。
|
|
53
|
+
* 事件维度 = 距上次压缩的新增事件数 ≥ thresholdEvents;
|
|
54
|
+
* token 维度(D-51)= 最近一条 usage 事实的全上下文(input+cacheRead+cacheCreation)
|
|
55
|
+
* ≥ thresholdTokens——无 usage(首轮前)不触发;非数值字段容错按 0(stop.ts 聚合同纪律)。
|
|
56
|
+
*/
|
|
40
57
|
export declare function shouldCompact(log: SessionLog, cfg: CompactionConfig | undefined): boolean;
|
|
41
58
|
/**
|
|
42
59
|
* planCompaction:计算折叠区间(纯函数,不落链)。
|
package/dist/session/compact.js
CHANGED
|
@@ -10,12 +10,30 @@ function lastCompactedUpTo(log) {
|
|
|
10
10
|
}
|
|
11
11
|
return last;
|
|
12
12
|
}
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* shouldCompact:事件阈值 OR token 阈值任一命中(enabled 缺省关 = 零变化)。
|
|
15
|
+
* 事件维度 = 距上次压缩的新增事件数 ≥ thresholdEvents;
|
|
16
|
+
* token 维度(D-51)= 最近一条 usage 事实的全上下文(input+cacheRead+cacheCreation)
|
|
17
|
+
* ≥ thresholdTokens——无 usage(首轮前)不触发;非数值字段容错按 0(stop.ts 聚合同纪律)。
|
|
18
|
+
*/
|
|
14
19
|
export function shouldCompact(log, cfg) {
|
|
15
20
|
if (!cfg || cfg.enabled !== true)
|
|
16
21
|
return false;
|
|
17
22
|
const threshold = cfg.thresholdEvents ?? 200;
|
|
18
|
-
|
|
23
|
+
if (log.events.length - lastCompactedUpTo(log) >= threshold)
|
|
24
|
+
return true;
|
|
25
|
+
const thresholdTokens = cfg.thresholdTokens;
|
|
26
|
+
if (typeof thresholdTokens === 'number' && thresholdTokens > 0) {
|
|
27
|
+
for (let i = log.events.length - 1; i >= 0; i--) {
|
|
28
|
+
const e = log.events[i];
|
|
29
|
+
if (e.kind !== 'usage')
|
|
30
|
+
continue;
|
|
31
|
+
const p = (e.payload ?? {});
|
|
32
|
+
const num = (v) => (typeof v === 'number' ? v : 0);
|
|
33
|
+
return num(p.input) + num(p.cacheRead) + num(p.cacheCreation) >= thresholdTokens;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
19
37
|
}
|
|
20
38
|
/**
|
|
21
39
|
* planCompaction:计算折叠区间(纯函数,不落链)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lqc123qwe/car-runtime",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"description": "Composable Agent Runtime (CAR) - microkernel plugin system with sandboxed PTC, append-only hashed session log, and MCP host bridge",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
package/src/load/config.ts
CHANGED
|
@@ -38,8 +38,10 @@ export interface SandboxSigConfig {
|
|
|
38
38
|
export interface CompactionConfig {
|
|
39
39
|
/** 缺省 false = 行为零变化(1.13 兼容线) */
|
|
40
40
|
enabled?: boolean
|
|
41
|
-
/**
|
|
41
|
+
/** 距上次压缩以来的新增事件数阈值(事实计数非估算);缺省 200 */
|
|
42
42
|
thresholdEvents?: number
|
|
43
|
+
/** 1.18-K5(D-51):token 维度阈值(provider 报告事实,非估算);与事件阈值 OR;缺省缺席不生效 */
|
|
44
|
+
thresholdTokens?: number
|
|
43
45
|
/** 保护最近 N 个 turn 不折叠;缺省 4 */
|
|
44
46
|
protectLastTurns?: number
|
|
45
47
|
}
|
|
@@ -239,11 +241,14 @@ const rawSchema = z.object({
|
|
|
239
241
|
.refine(v => Number.isFinite(v) && Number.isInteger(v) && v > 0, { message: '必须为正整数' })
|
|
240
242
|
.optional(),
|
|
241
243
|
allowEnvFallback: z.boolean({ invalid_type_error: '必须为布尔', required_error: '必须为布尔' }).optional(),
|
|
242
|
-
// 1.14-S2(K-MP-2 / D-40):历史压缩策略(阈值事实计数,非 token
|
|
244
|
+
// 1.14-S2(K-MP-2 / D-40):历史压缩策略(阈值事实计数,非 token 估算);
|
|
245
|
+
// 1.18-K5(D-51):thresholdTokens = provider 报告事实维度(最近 usage 全上下文,非估算)
|
|
243
246
|
compaction: z.object({
|
|
244
247
|
enabled: z.boolean({ invalid_type_error: '必须为布尔', required_error: '必须为布尔' }).optional(),
|
|
245
248
|
thresholdEvents: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
246
249
|
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
250
|
+
thresholdTokens: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
251
|
+
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
247
252
|
protectLastTurns: z.number({ invalid_type_error: '必须为正整数', required_error: '必须为正整数' })
|
|
248
253
|
.refine(v => Number.isInteger(v) && v > 0, { message: '必须为正整数' }).optional(),
|
|
249
254
|
}).strict().optional(),
|
|
@@ -308,6 +313,7 @@ function parseCarConfig(raw: unknown): { config: CarConfig; error?: string } {
|
|
|
308
313
|
const cp: CompactionConfig = {}
|
|
309
314
|
if (d.llm.compaction.enabled !== undefined) cp.enabled = d.llm.compaction.enabled
|
|
310
315
|
if (d.llm.compaction.thresholdEvents !== undefined) cp.thresholdEvents = d.llm.compaction.thresholdEvents
|
|
316
|
+
if (d.llm.compaction.thresholdTokens !== undefined) cp.thresholdTokens = d.llm.compaction.thresholdTokens
|
|
311
317
|
if (d.llm.compaction.protectLastTurns !== undefined) cp.protectLastTurns = d.llm.compaction.protectLastTurns
|
|
312
318
|
llm.compaction = cp
|
|
313
319
|
}
|
package/src/session/compact.ts
CHANGED
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
* 禁静默成功;摘要生成产物非非空字符串 → CAR-E-COMPACT-SUMMARY 显式报错;
|
|
17
17
|
* - **零新依赖**:摘要缺省为确定性生成器(轮次意图 + 工具调用统计 + 收口状态——事实拼装,
|
|
18
18
|
* 禁估算);宿主可注入 LLM 摘要(summarize 缝——内核不依赖 LLM 做压缩);
|
|
19
|
-
* - **触发面**:shouldCompact 判定(thresholdEvents
|
|
20
|
-
*
|
|
19
|
+
* - **触发面**:shouldCompact 判定(thresholdEvents 事实计数 + thresholdTokens provider 报告
|
|
20
|
+
* 事实——两维度均禁 tokenizer 估算)+ applyCompaction 立即 API;自动挂载点在宿主装配层
|
|
21
|
+
* (runTurn 之间调用,内核不改 runTurn 语义)。
|
|
21
22
|
*/
|
|
22
23
|
import type { SessionEvent, SessionLog } from './log.ts'
|
|
23
24
|
|
|
@@ -26,6 +27,17 @@ export interface CompactionConfig {
|
|
|
26
27
|
enabled?: boolean
|
|
27
28
|
/** 距上次压缩以来的新增事件数阈值(事实计数,非 token 估算);缺省 200 */
|
|
28
29
|
thresholdEvents?: number
|
|
30
|
+
/**
|
|
31
|
+
* 1.18-K5(D-51):token 维度阈值——事实源 = 链上最近一条 'usage' 事件(provider 报告,
|
|
32
|
+
* 禁 tokenizer 估算)的 input + cacheRead + cacheCreation 之和(两族归一化后统一口径
|
|
33
|
+
* = 最近一次请求的全上下文:openai prompt_tokens 含 cached 已减法归一、anthropic
|
|
34
|
+
* input_tokens 天然不含 cache——types.ts §1.1)。与 thresholdEvents **任一命中即触发**(OR)。
|
|
35
|
+
* 缺省缺席 = 行为零变化;≤ 0 不生效。补的缺口:真实使用若长期 10~30 轮,事件阈值
|
|
36
|
+
* 永不触及而上下文持续增长到撞 provider 上限(设计 §10.4-2 附带发现)。
|
|
37
|
+
* 子链甄别(实核消解):K2 子 Agent 子链为独立 SessionLog,其 usage 事件只落子链
|
|
38
|
+
* (汇总走 system kind 防双计)——主链日志内 'usage' 事件必然全部来自主链请求,无污染。
|
|
39
|
+
*/
|
|
40
|
+
thresholdTokens?: number
|
|
29
41
|
/** 保护最近 N 个 turn 不折叠;缺省 4 */
|
|
30
42
|
protectLastTurns?: number
|
|
31
43
|
}
|
|
@@ -50,11 +62,27 @@ function lastCompactedUpTo(log: SessionLog): number {
|
|
|
50
62
|
return last
|
|
51
63
|
}
|
|
52
64
|
|
|
53
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* shouldCompact:事件阈值 OR token 阈值任一命中(enabled 缺省关 = 零变化)。
|
|
67
|
+
* 事件维度 = 距上次压缩的新增事件数 ≥ thresholdEvents;
|
|
68
|
+
* token 维度(D-51)= 最近一条 usage 事实的全上下文(input+cacheRead+cacheCreation)
|
|
69
|
+
* ≥ thresholdTokens——无 usage(首轮前)不触发;非数值字段容错按 0(stop.ts 聚合同纪律)。
|
|
70
|
+
*/
|
|
54
71
|
export function shouldCompact(log: SessionLog, cfg: CompactionConfig | undefined): boolean {
|
|
55
72
|
if (!cfg || cfg.enabled !== true) return false
|
|
56
73
|
const threshold = cfg.thresholdEvents ?? 200
|
|
57
|
-
|
|
74
|
+
if (log.events.length - lastCompactedUpTo(log) >= threshold) return true
|
|
75
|
+
const thresholdTokens = cfg.thresholdTokens
|
|
76
|
+
if (typeof thresholdTokens === 'number' && thresholdTokens > 0) {
|
|
77
|
+
for (let i = log.events.length - 1; i >= 0; i--) {
|
|
78
|
+
const e = log.events[i]!
|
|
79
|
+
if (e.kind !== 'usage') continue
|
|
80
|
+
const p = (e.payload ?? {}) as { input?: unknown; cacheRead?: unknown; cacheCreation?: unknown }
|
|
81
|
+
const num = (v: unknown) => (typeof v === 'number' ? v : 0)
|
|
82
|
+
return num(p.input) + num(p.cacheRead) + num(p.cacheCreation) >= thresholdTokens
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false
|
|
58
86
|
}
|
|
59
87
|
|
|
60
88
|
/**
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"base64Signature":"MEUCIGgexNsJf84aA4UdxElf74Okk3NjA/df7MjypGaQeOnwAiEAu6ME/UhRd96P7cGfvMoZRra9khCag//m4FRvCbfb3SY=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1ekNDQm0yZ0F3SUJBZ0lVTFh4SHA4dllIOU9jMFg1RjdrUkZCMlBIdlEwd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ESTBNRGd6TURNNFdoY05Nall4TURJME1EZzBNRE00V2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNSmUxZFBlaXJsS2ErdU1KMlZjcmhCbHdkS0dPVW1xNXJHSW8KQkJTRG1DNG1zQ2lEdlMxWDluQmM4RmQ5dGdsVnRTYkpYVS9BdHNyMjNHL2psb0xheHFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUzTGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLRFExT1RRNE5UY3lPRFJtTmpNMU1qTTNZemc0TjJFMQpPR0poWXpKaU56azFNV0prTVdJMVlXWXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVGN1TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUzTGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENnMApOVGswT0RVM01qZzBaall6TlRJek4yTTRPRGRoTlRoaVlXTXlZamM1TlRGaVpERmlOV0ZtTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENnMApOVGswT0RVM01qZzBaall6TlRJek4yTTRPRGRoTlRoaVlXTXlZamM1TlRGaVpERmlOV0ZtTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVGN1TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFM0xqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2cwTlRrME9EVTNNamcwWmpZek5USXpOMk00T0RkaE5UaGlZV015WWpjNU5URmlaREZpTldGbU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6UXdNRGM0TXpBMApPVGt3TDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE55NHdNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hiUWlKVmdBQUJBTUFSekJGCkFpQTVsWHl6aXdtMDV0MHIvamV4ajdMbGRQVUdDMHJ6bmxCa0dlYUVzMTNoUkFJaEFQbXJIeTlZN1c5WnNGT2QKTUtBdjk2QVhPQW8xZjcrTFltcGE2cUVpRGlvbE1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01Dd2VzYkoyMDU5QQp2VDhXL1A5a2hYbFdEK1dLdi9FMG1xcjA0Y0syZzkveCsyL3Y2ZGdzNXd0dyt3T2lCaC9oMGdJeEFKTStoOWt3CjRuY0hwNk1reFRWS1d2bVFKQk1VbzlXaGQ3MzBUczBDVWNsMGFiV3I5V0N6YjhMb09ZWDIxQStQcXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEUCIBRv/i7GyGNRzCBGRdS2TE1uopY0+xqxl6topqmnyYZEAiEA++PwUNO1URlr7gcj6bdwPwrcOxbXLNKdnn1t6qleiPg=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNDEwOTY1NjQ2NzlhZmMwOTFkNDExODJhM2RkZGRkNDk3MGU3OWI2YzQwMjJmYTQ2ZDUzNjNhYWQ0ZDJiZWNkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJR2dleE5zSmY4NGFBNFVkeEVsZjc0T2trM05qQS9kZjdNanlwR2FRZU9ud0FpRUF1Nk1FL1VoUmQ5NlA3Y0dmdk1vWlJyYTlraENhZy8vbTRGUnZDYmZiM1NZPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFla05EUW0weVowRjNTVUpCWjBsVlRGaDRTSEE0ZGxsSU9VOWpNRmcxUmpkclVrWkNNbEJJZGxFd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFU1RCTlJHZDZUVVJOTkZkb1kwNU5hbGw0VFVSSk1FMUVaekJOUkUwMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZOU21VeFpGQmxhWEpzUzJFcmRVMUtNbFpqY21oQ2JIZGtTMGRQVlcxeE5YSkhTVzhLUWtKVFJHMURORzF6UTJsRWRsTXhXRGx1UW1NNFJtUTVkR2RzVm5SVFlrcFlWUzlCZEhOeU1qTkhMMnBzYjB4aGVIRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1V6VEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkZFeFQxUlJORTVVWTNsUFJGSnRUbXBOTVUxcVRUTlplbWMwVGpKRk1RcFBSMHBvV1hwS2FVNTZhekZOVjBwclRWZEpNVmxYV1hkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkdOMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVXpUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm5NQXBPVkdzd1QwUlZNMDFxWnpCYWFsbDZUbFJKZWs0eVRUUlBSR1JvVGxSb2FWbFhUWGxaYW1NMVRsUkdhVnBFUm1sT1YwWnRUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVObk1BcE9WR3N3VDBSVk0wMXFaekJhYWxsNlRsUkplazR5VFRSUFJHUm9UbFJvYVZsWFRYbFphbU0xVGxSR2FWcEVSbWxPVjBadFRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkdOMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTTB4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJjd1RsUnJNRTlFVlROTmFtY3dXbXBaZWs1VVNYcE9NazAwVDBSa2FFNVVhR2xaVjAxNVdXcGpOVTVVUm1sYVJFWnBUbGRHYlUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlVYZE5SR00wVFhwQk1BcFBWR3QzVERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU1NU5IZE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaGlVV2xLVm1kQlFVSkJUVUZTZWtKR0NrRnBRVFZzV0hsNmFYZHRNRFYwTUhJdmFtVjRhamRNYkdSUVZVZERNSEo2Ym14Q2EwZGxZVVZ6TVROb1VrRkphRUZRYlhKSWVUbFpOMWM1V25OR1QyUUtUVXRCZGprMlFWaFBRVzh4WmpjclRGbHRjR0UyY1VWcFJHbHZiRTFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMURkMlZ6WWtveU1EVTVRUXAyVkRoWEwxQTVhMmhZYkZkRUsxZExkaTlGTUcxeGNqQTBZMHN5WnprdmVDc3lMM1kyWkdkek5YZDBkeXQzVDJsQ2FDOW9NR2RKZUVGS1RTdG9PV3QzQ2pSdVkwaHdOazFyZUZSV1MxZDJiVkZLUWsxVmJ6bFhhR1EzTXpCVWN6QkRWV05zTUdGaVYzSTVWME42WWpoTWIwOVpXREl4UVN0UWNYYzlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1792830639,"logIndex":3438526446,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|