@lqc123qwe/car-runtime 1.15.0 → 1.15.2

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 CHANGED
@@ -286,7 +286,7 @@ 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 发布中)**
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 已发布)**
290
290
  - **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)。
291
291
  - **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 类型)。
292
292
  - **1.14.1 已发布(2026-10-18,B2 前置消费面,`cdb28d0`)**:npm latest → 1.14.1——ChatStepOptions.reasoning 透传(K-MP-1 消费面:reasoning 仅经直接 adapter.chat 在 1.14.0 不可达,off/缺席 = 字节面零痕迹)+ seam 出面 shouldCompact/applyCompaction + CompactionConfig(K-MP-2 行为 API:自动挂载点在宿主装配层,立即压缩 API 独立可用,append-only 红线随本面)+ assembleModelPool/probePoolMember + PoolMember/RoutingDecision 类型(K-POOL-1 池设置 UI + doctor 端点健康消费面);s54 4/4;seam 35→39 符号;桌面 B2 消费实证(v0.2-S5 终验 12/12 PASS)。
@@ -298,6 +298,7 @@ node --experimental-transform-types --test test/*.spec.ts
298
298
  | `src/seam.ts` + `test/s44` | 1.15-S3:**seam 出面统一**——39→**42 运行时符号**(+MemoryStore/+loadMemoryForInjection/+pendingSteerTurns + 5 类型 MemoryEntry/MemoryOp/MemoryEventPayload/MemoryInjectionResult/PendingSteerTurn);负面清单(不出面):存储引擎内部件(文件读写器/预算计算器/版本栈重放器 #私有)、注入落链执行器(宿主 system ctx 行职责)、消费调度器(宿主 FIFO 续跑职责)、cli 引导接线(非验收必需);dist 重建 s44 dist 检查绿 | 桌面 B4(T-11 记忆面板 / T-18 引导交互)消费面;最窄面纪律(T-6 口径) |
299
299
 
300
300
  - **1.15 工程收口(2026-10-19,S1~S3)**:全量 **439(438 PASS + 1 skip / 0 fail)** = 1.14.1 基线 423 + s55 10 + s56 6;tsc strict 双配置 0 + secrets-scan 0(commit 后复跑)+ contract-check 4/4(golden 不动)+ package-check 3/3;存量 spec 零改动通过 = 兼容验收线(无记忆调用无引导事件时 1.14.1 行为零变化)。1.15.0 发布(S4)后解锁桌面 B4。
301
+ - **1.15.0 正式发布(2026-10-19,桌面 v0.2-B3 批)**:npm `@lqc123qwe/car-runtime@1.15.0` 在架——**dist-tags latest → 1.15.0 + provenance 在案**(npm attestations 2 件:npm v0.1 + SLSA v1——attestations 端点 HTTP 200 实查)。Release `1.15.0`(id 416978495,target_commitish=完整 SHA `94adfac4dfa36932d28787b7136a64103cb308ae`;main push 直连通道两段:45fac7a 三 commits + bump 94adfac)→ **j16 run 39210696386 全 13 步 success**(cosign keyless OIDC+Rekor:**bundle logIndex 3319511581**,integratedTime 06:34:38 UTC 与 j16 窗口吻合)→ **post-publish 全实查**:Release 五件套齐备(tgz/.sig.bundle/release-audit.jsonl/sbom.json/SHA256SUMS)+ 实下载件 **SHA256 MATCH(`9ba612b6464b7bc4…`)与 SHA256SUMS 声明、Rekor body 内制品哈希三方一致**(以 bundle 记录为准口径)+ registry tarball **integrity MATCH**(sha512-4UPADETP0T7qwRVjD…)+ tar 内 `package/dist/seam.js` 在库 + 新符号(MemoryStore/loadMemoryForInjection/pendingSteerTurns)全 FOUND + npm CDN 滞后复查口径后 latest 确认 1.15.0。seam 39→42 运行时符号(+5 类型)。**桌面 B4(v0.2-S6)解锁。**
301
302
  - **1.13.0 正式发布(2026-10-11,桌面 S3-S1)**:npm `@lqc123qwe/car-runtime@1.13.0` 在架——**dist-tags latest → 1.13.0 + provenance 在案**。Release `1.13.0`(id 409512865,target_commitish=完整 SHA;main 推送经 Git Data API 逐字节复刻——blob 9/9 + tree `eea7249` + commit `ab59468` 全 SHA 对拍零分叉;**发布工程事件两项**:①GitHub commit API 保留 author/committer 时区偏移(+08:00 原样入对象)但**消息不自动补尾 `\n`**——payload 须带原文尾换行,否则 SHA 分叉(39477b4 教训,本地 `$()` 吞尾换行加剧排查成本);②registry 元数据 CDN 滞后使本地 `npm install` notarget——cache-buster 复查口径 + `--prefer-online` 安装)→ **run 38122530955 全步 success** → registry tarball dist/seam.js 32 符号文本核验 ✓ + **桌面侧消费验证:car-desktop 装 1.13.0 后 29/29 测试全绿 + SMOKE PASS(seamVersion 1.13.0 · symbolCount 32)**。
302
303
  - **1.0.0 正式发布(2026-09-26,S29/S30)**:npm `@lqc123qwe/car-runtime@1.0.0` 在架——**dist-tag latest → 1.0.0,rc 保留指向 1.0.0-rc.1**(§1.1 口径);SLSA provenance(Actions OIDC,透明日志在案);GitHub Release v1.0.0 六资产(tgz/bundle/SHA256SUMS/SBOM/审计/公钥);**post-publish 全链 13 PASS / 0 DRY-RUN / 0 FAIL** + 外部验证者等价检查(Release 实下载件 SHA256 MATCH + cosign Verified OK)。**宽限期时钟:2026-09-26 起算,2026-12-25 到期 verifier 默认值 warn→enforce 翻转(计划内变更)**。终验报告:`car-docs/10-内核v1/M5-S30-1.0收口终验报告.md`。发布工程事件:j16 首跑 E403(npm 2FA 策略 vs granular token 无 bypass——清单预设回退路径兑现)→ bypass token re-run 绿;G-09 期望 tag 动态化(`4c84b17`)在真实发布兑现价值。
303
304
  - **1.0.0-rc.1 已发布(2026-09-09)**:npm `@lqc123qwe/car-runtime@1.0.0-rc.1`(rc + latest 双 tag,SLSA provenance 在案)+ GitHub Release 6 制品;发布预演 **13 PASS / 0 DRY-RUN / 0 FAIL**(c762b72)。S22 GO 清单已全绿收口。
package/dist/SHA256SUMS CHANGED
@@ -1 +1 @@
1
- 9ba612b6464b7bc4798446987dc683af7f38964846e761b52d0f4f12caa7922e car-runtime-1.15.0.tgz
1
+ e0800ec15d94c8b4e6410a98642f4dc703c2335fa85cf75436003ccc26a2d327 car-runtime-1.15.2.tgz
Binary file
@@ -0,0 +1 @@
1
+ {"base64Signature":"MEUCICbvk8lw/0J5k1bnaKNZCM/xgESEFF1qskK5z/7inngoAiEA5582ex8TI6YiJkKaYNPzuIKkUF7S99dxANZb7kpLwLU=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1akNDQm0yZ0F3SUJBZ0lVSzFtZE02eUltaklTQkxGZ29TY2h3VTlJZXUwd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ESXdNREkwTURJNFdoY05Nall4TURJd01ESTFNREk0V2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwcVF3SVNGV2VndFhBYzI4dzR4dGs3U0lyOFU1TFBKWlBmOHYKbGJvdEFveGszbnI0bWs5YjlLVWRDWmNSRVYzOGdZV0N3YnVkQzZzMXpHMUc4UEJjbGFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpJd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLR1F4TWpaa05EUXlNVGt6TUdVMk5HVTNOV00zTmpZMQpNamcwWmpSbVpHWTNZVEpqWkRnNU5qSXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVFV1TWpBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpJd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENoawpNVEkyWkRRME1qRTVNekJsTmpSbE56VmpOelkyTlRJNE5HWTBabVJtTjJFeVkyUTRPVFl5TUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENoawpNVEkyWkRRME1qRTVNekJsTmpSbE56VmpOelkyTlRJNE5HWTBabVJtTjJFeVkyUTRPVFl5TUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVFV1TWpBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFMUxqSXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2hrTVRJMlpEUTBNakU1TXpCbE5qUmxOelZqTnpZMk5USTROR1kwWm1SbU4yRXlZMlE0T1RZeU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTVNell3TVRZeApPRFE0TDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE5TNHlNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hWeTZETkFBQUJBTUFSekJGCkFpRUFrcWFVMUZQZVhGSzh1bHlCWmdZTFZvWHZRVnpUdThURnIwb0MwVDFXYWlJQ0lFakRpdDZsVXUyUkZRQkUKS04wMFA3TTZrUGlBK25uN1FwM1l4L09NVjYwbk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01BaDJEOXJPSTQ4bApjMUFrM3lnVG1ybWF3VXRsOW9rd2pVcVJkTjVrSmNMcjNKWjdpd0h3VmtCV1N3Vm5Ja09BVUFJd1NiK2dFK2loCm1FZUo3Q0VBNktmSXJad0dzN2c3UFhPS2tyVFBYQWYzYmFUSHJRRFRDbWFSeExibjd5WWFEelJICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K","rekorBundle":{"SignedEntryTimestamp":"MEUCIGu7TqDI7QG1De0ED4bg7V58GvGtV+wwmfbPqrwhlx3vAiEAj917MyoFKHsgkZvu/rLtaR4kd1UzZ7MWzVjP+eUHf00=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlMDgwMGVjMTVkOTRjOGI0ZTY0MTBhOTg2NDJmNGRjNzAzYzIzMzVmYTg1Y2Y3NTQzNjAwM2NjYzI2YTJkMzI3In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQ2J2azhsdy8wSjVrMWJuYUtOWkNNL3hnRVNFRkYxcXNrSzV6Lzdpbm5nb0FpRUE1NTgyZXg4VEk2WWlKa0thWU5QenVJS2tVRjdTOTlkeEFOWmI3a3BMd0xVPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFha05EUW0weVowRjNTVUpCWjBsVlN6RnRaRTAyZVVsdGFrbFRRa3hHWjI5VFkyaDNWVGxKWlhVd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFU1hkTlJFa3dUVVJKTkZkb1kwNU5hbGw0VFVSSmQwMUVTVEZOUkVrMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV3Y1ZGM1NWTkdWMlZuZEZoQll6STRkelI0ZEdzM1UwbHlPRlUxVEZCS1dsQm1PSFlLYkdKdmRFRnZlR3N6Ym5JMGJXczVZamxMVldSRFdtTlNSVll6T0dkWlYwTjNZblZrUXpaek1YcEhNVWM0VUVKamJHRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1V4VEdwSmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUjFGNFRXcGFhMDVFVVhsTlZHdDZUVWRWTWs1SFZUTk9WMDB6VG1wWk1RcE5hbWN3V21wU2JWcEhXVE5aVkVwcVdrUm5OVTVxU1hkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkZWMVRXcEJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVXhUR3BKZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm9hd3BOVkVreVdrUlJNRTFxUlRWTmVrSnNUbXBTYkU1NlZtcE9lbGt5VGxSSk5FNUhXVEJhYlZKdFRqSkZlVmt5VVRSUFZGbDVUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVOb2F3cE5WRWt5V2tSUk1FMXFSVFZOZWtKc1RtcFNiRTU2Vm1wT2Vsa3lUbFJKTkU1SFdUQmFiVkp0VGpKRmVWa3lVVFJQVkZsNVRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkZWMVRXcEJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTVV4cVNYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJoclRWUkpNbHBFVVRCTmFrVTFUWHBDYkU1cVVteE9lbFpxVG5wWk1rNVVTVFJPUjFrd1dtMVNiVTR5UlhsWk1sRTBUMVJaZVUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUVk5lbGwzVFZSWmVBcFBSRkUwVERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU1VE5IbE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaFdlVFpFVGtGQlFVSkJUVUZTZWtKR0NrRnBSVUZyY1dGVk1VWlFaVmhHU3poMWJIbENXbWRaVEZadldIWlJWbnBVZFRoVVJuSXdiME13VkRGWFlXbEpRMGxGYWtScGREWnNWWFV5VWtaUlFrVUtTMDR3TUZBM1RUWnJVR2xCSzI1dU4xRndNMWw0TDA5TlZqWXdiazFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbU5CVFVkUlEwMUJhREpFT1hKUFNUUTRiQXBqTVVGck0zbG5WRzF5YldGM1ZYUnNPVzlyZDJwVmNWSmtUalZyU21OTWNqTktXamRwZDBoM1ZtdENWMU4zVm01SmEwOUJWVUZKZDFOaUsyZEZLMmxvQ20xRlpVbzNRMFZCTmt0bVNYSmFkMGR6TjJjM1VGaFBTMnR5VkZCWVFXWXpZbUZVU0hKUlJGUkRiV0ZTZUV4aWJqZDVXV0ZFZWxKSUNpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19","integratedTime":1792464029,"logIndex":3329865420,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
@@ -24,7 +24,9 @@ export interface MemoryEventPayload {
24
24
  export declare class MemoryStore {
25
25
  #private;
26
26
  readonly dir: string;
27
- constructor(dir: string);
27
+ constructor(dir: string, opts?: {
28
+ now?: () => number;
29
+ });
28
30
  /** 列出全部记忆(updatedAt 降序——最近维护优先);坏文件显式拒绝(带病不静默,loadSessionLog 同纪律) */
29
31
  list(): MemoryEntry[];
30
32
  get(id: string): MemoryEntry | undefined;
@@ -38,8 +38,11 @@ function assertValidId(id) {
38
38
  }
39
39
  export class MemoryStore {
40
40
  dir;
41
- constructor(dir) {
41
+ /** 时钟缝(1.15.2 测试可观测性):缺省 Date.now;spec 注入受控时钟消除同毫秒排序竞态 */
42
+ #now;
43
+ constructor(dir, opts) {
42
44
  this.dir = dir;
45
+ this.#now = opts?.now ?? Date.now;
43
46
  mkdirSync(dir, { recursive: true });
44
47
  }
45
48
  #file(id) {
@@ -100,7 +103,7 @@ export class MemoryStore {
100
103
  if (this.get(id)) {
101
104
  throw new Error(`CAR-E-MEM-EXISTS: 记忆 "${id}" 已存在(write 冲突 fail-visible——修改请走 edit)`);
102
105
  }
103
- const now = Date.now();
106
+ const now = this.#now();
104
107
  const entry = { id, text: input.text, createdAt: now, updatedAt: now };
105
108
  if (input.tags?.length)
106
109
  entry.tags = [...input.tags];
@@ -126,7 +129,7 @@ export class MemoryStore {
126
129
  }
127
130
  // tags 语义:undefined = 不变(payload 不带键,重放取前态);数组 = 整体替换(含空数组 =
128
131
  // 清空,payload 恒带键——重放 [] 与清空同构,禁「带键/缺键」二义)
129
- const next = { ...prev, text, updatedAt: Date.now() };
132
+ const next = { ...prev, text, updatedAt: this.#now() };
130
133
  if (tags !== undefined) {
131
134
  const { tags: _drop, ...rest } = next;
132
135
  void _drop;
@@ -191,7 +194,7 @@ export class MemoryStore {
191
194
  });
192
195
  try {
193
196
  if (target.present) {
194
- const entry = { id, text: target.text, createdAt: target.createdAt, updatedAt: Date.now() };
197
+ const entry = { id, text: target.text, createdAt: target.createdAt, updatedAt: this.#now() };
195
198
  if (target.tags?.length)
196
199
  entry.tags = [...target.tags];
197
200
  if (target.sourceSession)
@@ -1,4 +1,4 @@
1
- {"stage":"archive","detail":"git archive HEAD → car-runtime-1.15.0.tgz(392889 bytes,树哈希锚定)","ts":1792391675984}
2
- {"stage":"sha256sums","detail":"SHA256SUMS 9ba612b6464b7bc4…(裸字节复核通过)","ts":1792391675985}
3
- {"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":1792391675989}
4
- {"stage":"cosign-keyless","detail":"signed car-runtime-1.15.0.tgz (keyless OIDC + Rekor)","ts":1792391678478}
1
+ {"stage":"archive","detail":"git archive HEAD → car-runtime-1.15.2.tgz(395974 bytes,树哈希锚定)","ts":1792464026924}
2
+ {"stage":"sha256sums","detail":"SHA256SUMS e0800ec15d94c8b4…(裸字节复核通过)","ts":1792464026924}
3
+ {"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":1792464026929}
4
+ {"stage":"cosign-keyless","detail":"signed car-runtime-1.15.2.tgz (keyless OIDC + Rekor)","ts":1792464030951}
@@ -164,6 +164,11 @@ const nodeHttpSseFetch = (url, init = {}) => new Promise((resolve, reject) => {
164
164
  const mod = u.protocol === 'https:' ? httpsRequest : httpRequest;
165
165
  const req = mod(u, { method: init.method ?? 'GET', headers: init.headers }, res => {
166
166
  const status = res.statusCode ?? 0;
167
+ // 1.15.2-BUG(桌面 S6 终验实证):取消时 req.destroy(err) 会让**响应流** res 异步 emit
168
+ // 'error'——此前无监听 → Node 抛 unhandled 'error' 事件 → 宿主进程直接退出(Electron
169
+ // utilityProcess 无 uncaughtException 兜底时 = 句柄全失、引导队列被 resume 误标 interrupted)。
170
+ // 迭代器侧已由 streamSsePost 的 catch 按 D-19 静默收口,此处监听仅防进程级未捕获异常
171
+ res.on('error', () => { });
167
172
  resolve({
168
173
  ok: status >= 200 && status < 300,
169
174
  status,
@@ -176,8 +181,13 @@ const nodeHttpSseFetch = (url, init = {}) => new Promise((resolve, reject) => {
176
181
  body: res,
177
182
  });
178
183
  });
184
+ // 1.15.2-BUG(桌面 S6 终验 R-1 实证):取消走 destroy() **不带 Error**——此前
185
+ // `req.destroy(new Error('aborted'))` 在 Electron Node 24 宿主体内表现为进程级未捕获
186
+ // 异常(响应流侧异步派发,无监听 → 宿主 utilityProcess 直接退出,句柄全失、引导队列被
187
+ // resume 误标 interrupted)。取消语义已由 spec.signal / D-19 承载,无需错误对象;
188
+ // res 侧 error 监听为双保险(中断时的取消性错误不再逃逸到进程级)。
179
189
  const onAbort = () => { try {
180
- req.destroy(new Error('aborted'));
190
+ req.destroy();
181
191
  }
182
192
  catch { /* 已完成 */ } };
183
193
  if (init.signal) {
package/dist/sbom.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "bomFormat": "CAR-SBOM",
3
3
  "specVersion": "0.1",
4
- "version": "1.15.0",
4
+ "version": "1.15.2",
5
5
  "components": [
6
6
  {
7
7
  "type": "file",
@@ -126,7 +126,7 @@
126
126
  {
127
127
  "type": "file",
128
128
  "path": "src/memory/store.ts",
129
- "sha256": "656abef78cae852baa6ac21849f206aaf6a0a0e17492a860aeff34ad803f4ca1"
129
+ "sha256": "6390d1bd7739ca7f1d37cc5012cced4870ea9d8aba8310e5eac40d4f340d7b77"
130
130
  },
131
131
  {
132
132
  "type": "file",
@@ -176,7 +176,7 @@
176
176
  {
177
177
  "type": "file",
178
178
  "path": "src/runtime-core/llm.ts",
179
- "sha256": "3d203bae2ade0fdde8094e5a4b181fb759264d043eb020fde5b62ff4220cda1d"
179
+ "sha256": "b61eb6d9373442b5e35476b741184b5048451b6530c3490ea2a178d2982a8cc9"
180
180
  },
181
181
  {
182
182
  "type": "file",
@@ -211,7 +211,7 @@
211
211
  {
212
212
  "type": "file",
213
213
  "path": "src/seam.ts",
214
- "sha256": "b7f817da5184140f1d1b70eb5084ad3f85f7c52607587b51db82063ff7ada9df"
214
+ "sha256": "54cc179a6b863e6e2d0d94a6275bd1ed17fefa46ca0b6de14d1c8e08cd5c1e2d"
215
215
  },
216
216
  {
217
217
  "type": "file",
@@ -271,12 +271,12 @@
271
271
  {
272
272
  "type": "file",
273
273
  "path": "package.json",
274
- "sha256": "d803162bdb3aff9d6a2d71e08fde5ccd17102af97901c7db03e2f4563e30fc0f"
274
+ "sha256": "8504cceeead963e5b78bc07d347fef56432304bb8b2db676c7b0c2a386a9d7c2"
275
275
  },
276
276
  {
277
277
  "type": "file",
278
278
  "path": "README.md",
279
- "sha256": "41bf297bd788a2f13477d0b6e8f3ce74ba9e01dd252177d18ccc8f933f11ec69"
279
+ "sha256": "38d26d31d5f4bf80ea6848132847426b0ca67d2eb080136ab563423ab3e39c3d"
280
280
  }
281
281
  ],
282
282
  "runtimeDependencies": []
package/dist/seam.d.ts CHANGED
@@ -35,6 +35,10 @@
35
35
  * 调度留宿主装配层;投影隔离〔引导不进当前 turn 投影〕在 deriveMessages/chatStep 内建,随既有符号语义可达
36
36
  * 零新符号)。负面清单(不出面):存储引擎内部件(文件读写器/预算计算器/版本栈重放器——#私有方法)、
37
37
  * 记忆注入落链执行器(宿主 system ctx 行职责)、消费调度器(宿主 FIFO 续跑职责)、cli 引导接线(非验收必需)。
38
+ * 加法登记:1.15.1 —— 恢复层出面(K-STEER-1 桌面消费面缺口):recoverInterrupted + RecoveryReport
39
+ * 出面(未闭合 turn 补记 turnEnd=interrupted + 未配对 toolCall 合成 toolResult——桌面 resume 接入
40
+ * R-8 语义:消费前崩溃 → 执行中与引导 turn 均补记 interrupted,渲染层待执行徽标据此消隐;桌面禁
41
+ * 私补内核 = 本出面为唯一合法通道)。
38
42
  */
39
43
  export { SessionLog, loadSessionLog, deriveSessionId, type SessionEvent, type EventKind, type Actor } from './session/log.ts';
40
44
  export { SessionFileStore } from './session/store.ts';
@@ -64,3 +68,4 @@ export { shouldCompact, applyCompaction, type CompactionConfig } from './session
64
68
  export { assembleModelPool, probePoolMember, type PoolMember, type PoolMemberHealth, type RoutingDecision, type RoutingAttempt } from './load/pool.ts';
65
69
  export { MemoryStore, loadMemoryForInjection, type MemoryEntry, type MemoryOp, type MemoryEventPayload, type MemoryInjectionResult } from './memory/store.ts';
66
70
  export { pendingSteerTurns, type PendingSteerTurn } from './session/steer.ts';
71
+ export { recoverInterrupted, type RecoveryReport } from './loop/recover.ts';
package/dist/seam.js CHANGED
@@ -35,6 +35,10 @@
35
35
  * 调度留宿主装配层;投影隔离〔引导不进当前 turn 投影〕在 deriveMessages/chatStep 内建,随既有符号语义可达
36
36
  * 零新符号)。负面清单(不出面):存储引擎内部件(文件读写器/预算计算器/版本栈重放器——#私有方法)、
37
37
  * 记忆注入落链执行器(宿主 system ctx 行职责)、消费调度器(宿主 FIFO 续跑职责)、cli 引导接线(非验收必需)。
38
+ * 加法登记:1.15.1 —— 恢复层出面(K-STEER-1 桌面消费面缺口):recoverInterrupted + RecoveryReport
39
+ * 出面(未闭合 turn 补记 turnEnd=interrupted + 未配对 toolCall 合成 toolResult——桌面 resume 接入
40
+ * R-8 语义:消费前崩溃 → 执行中与引导 turn 均补记 interrupted,渲染层待执行徽标据此消隐;桌面禁
41
+ * 私补内核 = 本出面为唯一合法通道)。
38
42
  */
39
43
  export { SessionLog, loadSessionLog, deriveSessionId } from './session/log.js';
40
44
  export { SessionFileStore } from './session/store.js';
@@ -67,3 +71,5 @@ export { assembleModelPool, probePoolMember } from './load/pool.js';
67
71
  // —— 1.15.0(K-MEM-1 / D-46):白盒记忆面 +(K-STEER-1 / D-47):引导消息排队扫描 ——
68
72
  export { MemoryStore, loadMemoryForInjection } from './memory/store.js';
69
73
  export { pendingSteerTurns } from './session/steer.js';
74
+ // —— 1.15.1(K-STEER-1 桌面消费面缺口):恢复层出面(resume 补记 interrupted = R-8 语义)——
75
+ export { recoverInterrupted } from './loop/recover.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lqc123qwe/car-runtime",
3
- "version": "1.15.0",
3
+ "version": "1.15.2",
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",
@@ -67,9 +67,12 @@ function assertValidId(id: string): void {
67
67
 
68
68
  export class MemoryStore {
69
69
  readonly dir: string
70
+ /** 时钟缝(1.15.2 测试可观测性):缺省 Date.now;spec 注入受控时钟消除同毫秒排序竞态 */
71
+ readonly #now: () => number
70
72
 
71
- constructor(dir: string) {
73
+ constructor(dir: string, opts?: { now?: () => number }) {
72
74
  this.dir = dir
75
+ this.#now = opts?.now ?? Date.now
73
76
  mkdirSync(dir, { recursive: true })
74
77
  }
75
78
 
@@ -132,7 +135,7 @@ export class MemoryStore {
132
135
  if (this.get(id)) {
133
136
  throw new Error(`CAR-E-MEM-EXISTS: 记忆 "${id}" 已存在(write 冲突 fail-visible——修改请走 edit)`)
134
137
  }
135
- const now = Date.now()
138
+ const now = this.#now()
136
139
  const entry: MemoryEntry = { id, text: input.text, createdAt: now, updatedAt: now }
137
140
  if (input.tags?.length) entry.tags = [...input.tags]
138
141
  if (input.sourceSession) entry.sourceSession = input.sourceSession
@@ -156,7 +159,7 @@ export class MemoryStore {
156
159
  }
157
160
  // tags 语义:undefined = 不变(payload 不带键,重放取前态);数组 = 整体替换(含空数组 =
158
161
  // 清空,payload 恒带键——重放 [] 与清空同构,禁「带键/缺键」二义)
159
- const next: MemoryEntry = { ...prev, text, updatedAt: Date.now() }
162
+ const next: MemoryEntry = { ...prev, text, updatedAt: this.#now() }
160
163
  if (tags !== undefined) {
161
164
  const { tags: _drop, ...rest } = next as MemoryEntry & { tags?: string[] }
162
165
  void _drop
@@ -216,7 +219,7 @@ export class MemoryStore {
216
219
  } satisfies MemoryEventPayload)
217
220
  try {
218
221
  if (target.present) {
219
- const entry: MemoryEntry = { id, text: target.text!, createdAt: target.createdAt!, updatedAt: Date.now() }
222
+ const entry: MemoryEntry = { id, text: target.text!, createdAt: target.createdAt!, updatedAt: this.#now() }
220
223
  if (target.tags?.length) entry.tags = [...target.tags]
221
224
  if (target.sourceSession) entry.sourceSession = target.sourceSession
222
225
  this.#writeFile(entry)
@@ -189,6 +189,11 @@ const nodeHttpSseFetch = (url: string, init: { method?: string; headers?: Record
189
189
  const mod = u.protocol === 'https:' ? httpsRequest : httpRequest
190
190
  const req = mod(u, { method: init.method ?? 'GET', headers: init.headers }, res => {
191
191
  const status = res.statusCode ?? 0
192
+ // 1.15.2-BUG(桌面 S6 终验实证):取消时 req.destroy(err) 会让**响应流** res 异步 emit
193
+ // 'error'——此前无监听 → Node 抛 unhandled 'error' 事件 → 宿主进程直接退出(Electron
194
+ // utilityProcess 无 uncaughtException 兜底时 = 句柄全失、引导队列被 resume 误标 interrupted)。
195
+ // 迭代器侧已由 streamSsePost 的 catch 按 D-19 静默收口,此处监听仅防进程级未捕获异常
196
+ res.on('error', () => { /* 取消/中断:由消费侧(streamSsePost catch)收口 */ })
192
197
  resolve({
193
198
  ok: status >= 200 && status < 300,
194
199
  status,
@@ -201,7 +206,12 @@ const nodeHttpSseFetch = (url: string, init: { method?: string; headers?: Record
201
206
  body: res,
202
207
  })
203
208
  })
204
- const onAbort = () => { try { req.destroy(new Error('aborted')) } catch { /* 已完成 */ } }
209
+ // 1.15.2-BUG(桌面 S6 终验 R-1 实证):取消走 destroy() **不带 Error**——此前
210
+ // `req.destroy(new Error('aborted'))` 在 Electron Node 24 宿主体内表现为进程级未捕获
211
+ // 异常(响应流侧异步派发,无监听 → 宿主 utilityProcess 直接退出,句柄全失、引导队列被
212
+ // resume 误标 interrupted)。取消语义已由 spec.signal / D-19 承载,无需错误对象;
213
+ // res 侧 error 监听为双保险(中断时的取消性错误不再逃逸到进程级)。
214
+ const onAbort = () => { try { req.destroy() } catch { /* 已完成 */ } }
205
215
  if (init.signal) {
206
216
  if (init.signal.aborted) onAbort()
207
217
  else init.signal.addEventListener('abort', onAbort, { once: true })
package/src/seam.ts CHANGED
@@ -35,6 +35,10 @@
35
35
  * 调度留宿主装配层;投影隔离〔引导不进当前 turn 投影〕在 deriveMessages/chatStep 内建,随既有符号语义可达
36
36
  * 零新符号)。负面清单(不出面):存储引擎内部件(文件读写器/预算计算器/版本栈重放器——#私有方法)、
37
37
  * 记忆注入落链执行器(宿主 system ctx 行职责)、消费调度器(宿主 FIFO 续跑职责)、cli 引导接线(非验收必需)。
38
+ * 加法登记:1.15.1 —— 恢复层出面(K-STEER-1 桌面消费面缺口):recoverInterrupted + RecoveryReport
39
+ * 出面(未闭合 turn 补记 turnEnd=interrupted + 未配对 toolCall 合成 toolResult——桌面 resume 接入
40
+ * R-8 语义:消费前崩溃 → 执行中与引导 turn 均补记 interrupted,渲染层待执行徽标据此消隐;桌面禁
41
+ * 私补内核 = 本出面为唯一合法通道)。
38
42
  */
39
43
  export { SessionLog, loadSessionLog, deriveSessionId, type SessionEvent, type EventKind, type Actor } from './session/log.ts'
40
44
  export { SessionFileStore } from './session/store.ts'
@@ -69,3 +73,5 @@ export { assembleModelPool, probePoolMember, type PoolMember, type PoolMemberHea
69
73
  // —— 1.15.0(K-MEM-1 / D-46):白盒记忆面 +(K-STEER-1 / D-47):引导消息排队扫描 ——
70
74
  export { MemoryStore, loadMemoryForInjection, type MemoryEntry, type MemoryOp, type MemoryEventPayload, type MemoryInjectionResult } from './memory/store.ts'
71
75
  export { pendingSteerTurns, type PendingSteerTurn } from './session/steer.ts'
76
+ // —— 1.15.1(K-STEER-1 桌面消费面缺口):恢复层出面(resume 补记 interrupted = R-8 语义)——
77
+ export { recoverInterrupted, type RecoveryReport } from './loop/recover.ts'
Binary file
@@ -1 +0,0 @@
1
- {"base64Signature":"MEQCIFcn/dz1pH2TuIhMJ7gmmIeBNWNWzbAZyPkMFDLWWEe5AiBMPsruOYpxxCHS1EcnPe7baqT7OmtF1rUyblO0ucrPLg==","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1ekNDQm0yZ0F3SUJBZ0lVUEI5WUptSStySlBtTWtoL1dPaWZWOG5vREFrd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ERTVNRFl6TkRNM1doY05Nall4TURFNU1EWTBORE0zV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVvdnBUdnpCRHRSemQ4VU9leFM4ck1lanNLVVBhVVVSMzlSR3AKeGNiWFdTV1FSR1Y0NEtpN2JMcUNwWHFxcUwwaWZiSVdPcW1Wa2dQTTJ1NXp3d0pBOHFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLRGswWVdSbVlXTTBaR1poTXpZNU16SmtNamczT0RkaQpOekV6Tm1FMk5ERXdNMk5pTXpBNFlXVXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVFV1TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENnNQpOR0ZrWm1Gak5HUm1ZVE0yT1RNeVpESTROemczWWpjeE16WmhOalF4TUROallqTXdPR0ZsTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENnNQpOR0ZrWm1Gak5HUm1ZVE0yT1RNeVpESTROemczWWpjeE16WmhOalF4TUROallqTXdPR0ZsTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVFV1TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFMUxqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2c1TkdGa1ptRmpOR1JtWVRNMk9UTXlaREk0TnpnM1lqY3hNelpoTmpReE1ETmpZak13T0dGbE1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTVNakV3TmprMgpNemcyTDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE5TNHdNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hVdDZGYUFBQUJBTUFSekJGCkFpRUExZ05kSDdqUXVHTENRcDFZSjhIK0F2TW81Z2xBYWFRM1dNM2JpSFBwT3ZNQ0lHUEM0S29EOTg1aldZQW4KeE81eG9GMDhua3JpSms1bWVvaWhWK0I1VVhXbk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01BNlYwR1hEOFF2SQpKVVNGT3RaTEVQb2ZTVU90cTlhdmZKaFdsK1lzc1VFUldwQnRkbDFZRXB4blpNYm5sc05kQndJeEFMYjQzREFyCjM5cUhZbUdqNmc4cFRxb0VIZkMvelRFMXBpVGdkVTFxWjZaeDRnNHhYcHpXWFZpU2pXaHd5VEc5VEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEQCICyxor/1QbW6qzgO6LFkHPbfLog9AKl0T4iGuJg6wkpWAiA2e8brMg+PWLrEADbTTmmoP2Vm2TGqgJDJNIY7tGMm0g==","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5YmE2MTJiNjQ2NGI3YmM0Nzk4NDQ2OTg3ZGM2ODNhZjdmMzg5NjQ4NDZlNzYxYjUyZDBmNGYxMmNhYTc5MjJlIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRmNuL2R6MXBIMlR1SWhNSjdnbW1JZUJOV05XemJBWnlQa01GRExXV0VlNUFpQk1Qc3J1T1lweHhDSFMxRWNuUGU3YmFxVDdPbXRGMXJVeWJsTzB1Y3JQTGc9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFla05EUW0weVowRjNTVUpCWjBsVlVFSTVXVXB0U1N0eVNsQnRUV3RvTDFkUGFXWldPRzV2UkVGcmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUlRWTlJGbDZUa1JOTTFkb1kwNU5hbGw0VFVSRk5VMUVXVEJPUkUwelYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ2ZG5CVWRucENSSFJTZW1RNFZVOWxlRk00Y2sxbGFuTkxWVkJoVlZWU016bFNSM0FLZUdOaVdGZFRWMUZTUjFZME5FdHBOMkpNY1VOd1dIRnhjVXd3YVdaaVNWZFBjVzFXYTJkUVRUSjFOWHAzZDBwQk9IRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1V4VEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdzd1dWZFNiVmxYVFRCYVIxcG9UWHBaTlUxNlNtdE5hbWN6VDBSa2FRcE9la1Y2VG0xRk1rNUVSWGROTWs1cFRYcEJORmxYVlhkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkZWMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVXhUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm5OUXBPUjBacldtMUdhazVIVW0xWlZFMHlUMVJOZVZwRVNUUk9lbWN6V1dwamVFMTZXbWhPYWxGNFRVUk9hbGxxVFhkUFIwWnNUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVObk5RcE9SMFpyV20xR2FrNUhVbTFaVkUweVQxUk5lVnBFU1RST2VtY3pXV3BqZUUxNldtaE9hbEY0VFVST2FsbHFUWGRQUjBac1RVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkZWMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTVV4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJjMVRrZEdhMXB0Um1wT1IxSnRXVlJOTWs5VVRYbGFSRWswVG5wbk0xbHFZM2hOZWxwb1RtcFJlRTFFVG1wWmFrMTNUMGRHYkUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUVk5ha1YzVG1wck1ncE5lbWN5VERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU1VE5IZE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaFZkRFpHWVVGQlFVSkJUVUZTZWtKR0NrRnBSVUV4WjA1a1NEZHFVWFZIVEVOUmNERlpTamhJSzBGMlRXODFaMnhCWVdGUk0xZE5NMkpwU0ZCd1QzWk5RMGxIVUVNMFMyOUVPVGcxYWxkWlFXNEtlRTgxZUc5R01EaHVhM0pwU21zMWJXVnZhV2hXSzBJMVZWaFhiazFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMUJObFl3UjFoRU9GRjJTUXBLVlZOR1QzUmFURVZRYjJaVFZVOTBjVGxoZG1aS2FGZHNLMWx6YzFWRlVsZHdRblJrYkRGWlJYQjRibHBOWW01c2MwNWtRbmRKZUVGTVlqUXpSRUZ5Q2pNNWNVaFpiVWRxTm1jNGNGUnhiMFZJWmtNdmVsUkZNWEJwVkdka1ZURnhXalphZURSbk5IaFljSHBYV0ZacFUycFhhSGQ1VkVjNVZFRTlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1792391678,"logIndex":3319511581,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}