@lqc123qwe/car-runtime 1.12.0 → 1.13.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 +9 -1
- package/dist/SHA256SUMS +1 -1
- package/dist/authz/authz.d.ts +9 -0
- package/dist/authz/authz.js +15 -0
- package/dist/car-runtime-1.13.0.tgz +0 -0
- package/dist/car-runtime-1.13.0.tgz.sig.bundle +1 -0
- package/dist/loop/stop.d.ts +6 -0
- package/dist/loop/stop.js +5 -2
- package/dist/release-audit.jsonl +4 -4
- package/dist/sandbox/sandbox.d.ts +7 -1
- package/dist/sandbox/sandbox.js +10 -4
- package/dist/sbom.json +7 -7
- package/dist/seam.d.ts +8 -1
- package/dist/seam.js +9 -1
- package/package.json +1 -1
- package/src/authz/authz.ts +16 -0
- package/src/loop/stop.ts +11 -2
- package/src/sandbox/sandbox.ts +20 -5
- package/src/seam.ts +9 -1
- package/dist/car-runtime-1.12.0.tgz +0 -0
- package/dist/car-runtime-1.12.0.tgz.sig.bundle +0 -1
package/README.md
CHANGED
|
@@ -276,9 +276,17 @@ node --experimental-transform-types --test test/*.spec.ts
|
|
|
276
276
|
- **1.11 工程收口(2026-10-07,`5488949`)**:全量 **355(352 PASS + 3 能力门控 skip / 0 fail)** = 基线 341 + s45 8 + s46 6;tsc strict 0 + secrets-scan 0(commit 后复跑)+ contract-check 4/4(golden 不动);存量 spec 零改动通过 = 兼容验收线。规划:`car-docs/10-内核v1/1.11-迭代规划.md`(D-33/D-34)。
|
|
277
277
|
- **1.11.0 正式发布(2026-10-07,S4 收官)**:npm `@lqc123qwe/car-runtime@1.11.0` 在架——**dist-tags latest → 1.11.0、rc 保留 1.0.0-rc.1** + provenance。Release `1.11.0`(id 405567956,agent GCM 凭据 API 创建;**发布工程事件:github.com:443 区域性阻断——main 推送经 Git Data API 逐字节复刻(blob/tree/commit 全 SHA 对拍,2105f42+5488949 与本地零分叉)**)→ **j16 run 37597090647 全步 success** → **post-publish REMOTE_CHECK=1 复跑 13 PASS / 0 DRY-RUN / 0 FAIL**(G-09 provenance 实查 + G-10 五件套实查);外部等价检查 **SHA256 MATCH(`e33ef93a…`)+ Fulcio 证书验签 Verified OK + Rekor 双端一致**(logIndex 3127715428;**登记观察:Rekor 新分片树 UUID 非 sha256(body) 旧口径、SET 公钥验签未过——body/logIndex/integratedTime 对拍已覆盖 GO 判据,沿用 1.5「以 bundle 记录为准」口径**);registry tarball ↔ tag 树 src 面逐字节一致 + dist 产物 1.11 标记核验 ✓(Release tgz = `git archive` 全树源码归档,与 npm files 白名单包为设计内两种制品)。**1.11-GO 第 7 项(真实 provider 端到端 usage 终验,方案 B)待用户终端执行**。
|
|
278
278
|
|
|
279
|
+
## 1.12 状态(seam MCP/PTC 真桥导出面 + jiti epoch 面确认)
|
|
280
|
+
|
|
281
|
+
| `src/seam.ts` | 1.12-S1(D-20/D-35/D-36):**MCP/PTC 真桥出面**——运行时符号 21→27(+McpGateway/createStdioClientTransport/createHttpMcpTransport/resolveMcpHeaders/makePtcToolDefinition/renderSdkFromRegistry)+ 8 类型(ClientTransport/McpServerConfig/McpToolDefinition/StdioServerSpec/HttpMcpServerSpec/McpClientSpanHandle/ToolBridge/PtcRelayHandle);**负面清单保持内部**——runCode/worker-entry/budget/erasable/JSON-RPC 编码层 = PTC 红线单点(erasable-only/预算/授权门仅经 makePtcToolDefinition 行为面可达);D-20 预留的最后一个 1.x 加法前置出清,1.x 主线转入候选池维持项 + 平台 P1 需求拉动 | 平台 MCP/PTC 真桥(C402001 守卫翻转前置,CLI D-18/D-21/D-29 蓝本)+ 平台 D-23 reload(jiti epoch 面自 1.10 可达,D-37 零加法确认) |
|
|
282
|
+
| `test/s47`(8) | 蓝本回归**全经 seam 公共 API 驱动 + 禁深路径 import**(窄面完备性反证):MCP 注册/T-22 缺省 write/traceparent 三态(无 tp 字节面不变、有 tp 双载体同值、BD-02 崩溃隔离)/跨源同名冲突显式;凭据红线 env+headers 双入口 + `${ENV}` fail-visible(明文检测 = 值前缀形态);PTC worker 真执行 + ptcRelay 桥 + 审计结构化;传输工厂构造面(stdio 即刻 spawn/http TLS 门含 loopback 豁免);reload epoch 击穿确认 | 1.12-GO 第 1/5 项承载;平台接线契约对拍基准 |
|
|
283
|
+
|
|
284
|
+
- **1.12 工程收口(2026-10-07,`4fee6da`)**:全量 **363(360 PASS + 3 能力门控 skip / 0 fail)** = 基线 355 + s47 8;tsc strict 0 + secrets-scan 0(commit 后复跑)+ contract-check 4/4(golden 不动);存量 spec 零改动通过 = 兼容验收线。规划:`car-docs/10-内核v1/1.12-迭代规划.md`(D-35~D-38;类型计数勘误 9→8 随文档登记)。
|
|
285
|
+
- **1.12.0 正式发布(2026-10-07,S4 收官)**:npm `@lqc123qwe/car-runtime@1.12.0` 在架——**dist-tags latest → 1.12.0、rc 保留 1.0.0-rc.1** + provenance。Release `1.12.0`(id 405605990;main 推送经 Git Data API 逐字节复刻——github.com:443 阻断延续,4fee6da 与本地零分叉;**发布工程事件:Release API target_commitish 须完整 SHA,短 SHA 校验拒绝**)→ **j16 run 37602262621 全步 success** → **post-publish REMOTE_CHECK=1 复跑 13 PASS / 0 DRY-RUN / 0 FAIL**(G-09 + G-10 实查);外部等价检查 **SHA256 MATCH(`a3d97f3f…`)+ Fulcio 验签 Verified OK + Rekor 双端一致**(logIndex 3128454895,integratedTime 与 j16 窗口吻合);registry tarball ↔ tag 树 src 面逐字节一致(51 文件)+ dist/seam.js 六符号在库 ✓。registry CDN 滞后 ~3 分钟(cache-buster 复查口径,1.2/1.11 同)。
|
|
286
|
+
|
|
279
287
|
## 状态
|
|
280
288
|
|
|
281
|
-
- **版本主线**: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 已发布)**
|
|
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 发布待执行——npm 凭据/既定发布路线)**
|
|
282
290
|
- **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`)在真实发布兑现价值。
|
|
283
291
|
- **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 清单已全绿收口。
|
|
284
292
|
- **轨道 A 三项全部完成**:E-1 WSL2 逃逸矩阵 **20/20 PASS 零逃逸**(2026-09-07,G-07 转 PASS)| E-3 远端发布通道 **13/13 全门禁 PASS**(2026-09-09,G-08/09/10 转 PASS)| E-2 Windows koffi FFI **四判据双环境全 PASS**(S24/S25/S26,2026-09-09~10;本机非提权 + windows-latest 提权 runner 双绿,CI 门禁已接入)。
|
package/dist/SHA256SUMS
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3d4f869b251e48c72c1fe224d549d1a9e37f30dcb16db9775325791f02b0d974 car-runtime-1.13.0.tgz
|
package/dist/authz/authz.d.ts
CHANGED
|
@@ -41,6 +41,15 @@ export declare class AuthzService {
|
|
|
41
41
|
decideByPolicy(req: AuthzRequest, mode: 'readonly' | 'confirm' | 'full'): AuthzDecision;
|
|
42
42
|
/** 会话策略直判(「会话内始终允许」粒度):decidedBy=policy 幂等落链,不入人审通道(审批回调 scope=session 写入 grants 后走此路) */
|
|
43
43
|
decideBySessionPolicy(req: AuthzRequest): AuthzDecision;
|
|
44
|
+
/**
|
|
45
|
+
* 规则直判(1.13.0 K-FS-2):文件/命令/网络规则轴命中后的 policy 双向直判——宿主规则引擎
|
|
46
|
+
* (允许/拒绝档)在授权门内直决,reason 必须携带规则标识(审计可回答「为什么没问人」)。
|
|
47
|
+
* 幂等键同现行(同 authorizationId 返回同一决策);EventKind 冻结面零新增(复用 #commit 形态)。
|
|
48
|
+
*/
|
|
49
|
+
decideByRule(req: AuthzRequest, rule: {
|
|
50
|
+
decision: 'APPROVED' | 'DENIED';
|
|
51
|
+
reason: string;
|
|
52
|
+
}): AuthzDecision;
|
|
44
53
|
/** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
|
|
45
54
|
decideByUser(req: AuthzRequest, approve: (req: AuthzRequest) => Promise<boolean>): Promise<AuthzDecision>;
|
|
46
55
|
}
|
package/dist/authz/authz.js
CHANGED
|
@@ -37,6 +37,21 @@ export class AuthzService {
|
|
|
37
37
|
ts: Date.now(),
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 规则直判(1.13.0 K-FS-2):文件/命令/网络规则轴命中后的 policy 双向直判——宿主规则引擎
|
|
42
|
+
* (允许/拒绝档)在授权门内直决,reason 必须携带规则标识(审计可回答「为什么没问人」)。
|
|
43
|
+
* 幂等键同现行(同 authorizationId 返回同一决策);EventKind 冻结面零新增(复用 #commit 形态)。
|
|
44
|
+
*/
|
|
45
|
+
decideByRule(req, rule) {
|
|
46
|
+
return this.#commit({
|
|
47
|
+
authorizationId: req.authorizationId,
|
|
48
|
+
decision: rule.decision,
|
|
49
|
+
decidedBy: 'policy',
|
|
50
|
+
reason: rule.reason,
|
|
51
|
+
degraded: this.#degraded,
|
|
52
|
+
ts: Date.now(),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
40
55
|
/** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
|
|
41
56
|
async decideByUser(req, approve) {
|
|
42
57
|
const cached = this.#decisions.get(req.authorizationId);
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"base64Signature":"MEYCIQDu5NPROyK/7sliW5k03dzCfSCVM3HhUYFPkWDY6KvMCAIhAIG8ji1zQSA6IOMN8CN7t7dhhnfqNbu392w54ymS7VCO","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc2RENDQm0yZ0F3SUJBZ0lVVHdxNVo4Vi9zK2VZZHZVR3ZnRzNSNzVPejhJd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ERXhNRGMwTnpBM1doY05Nall4TURFeE1EYzFOekEzV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV0b0Nld1FoR2IyaHUrM29vYU1KVmJpQ2xwaTBnOXQ5MXZiM3kKbkxzTUZUekJLQnQwalRkcFhEa2JONVVTWHRSRkVyVmNEVGdPYmFpVGRXbEVobldDU2FPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV6TGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLR0ZpTlRrME5qZzJNVE14WlRWaVl6ZGlNams1WTJGawpNRGxqWVRJNVlURmxOV1JoT1dWbFptTXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVE11TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV6TGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENoaApZalU1TkRZNE5qRXpNV1UxWW1NM1lqSTVPV05oWkRBNVkyRXlPV0V4WlRWa1lUbGxaV1pqTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENoaApZalU1TkRZNE5qRXpNV1UxWW1NM1lqSTVPV05oWkRBNVkyRXlPV0V4WlRWa1lUbGxaV1pqTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVE11TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFekxqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2hoWWpVNU5EWTROakV6TVdVMVltTTNZakk1T1dOaFpEQTVZMkV5T1dFeFpUVmtZVGxsWldaak1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTRNVEl5TlRNdwpPVFUxTDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE15NHdNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hLZTRIOVFBQUJBTUFSekJGCkFpRUF3TnZLcjBnRkxqN1UyZ291bW43Y0N5WEVwY1FmYzczYXQ1UG1yQ21xNW0wQ0lDaVBCendPbG1yb0E0RHAKRE5DWktGRlV6dHdTVmhlV1g5cEEvMVgrK3lReU1Bb0dDQ3FHU000OUJBTURBMmtBTUdZQ01RQ0MrblJlNmNsUwptU3gvVDMrR0hyQk5GMXpiKzlpQnk1MmVLYTdiV1hYZU9zeUo5M2FUNllkTkFma08vcVpYeVVvQ01RQ3pJeFNyClI1R2pQNE9MaDB6Zk03OXlPUlVuZ2pNU1JxdlJ5V09LdUNUSDMxd1FXditwdHJMcUlPdE9ma0hQZFowPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEUCIBWwDsvDPdrIDJmBsIHEQz0vK/SOKhcLFQVQeGzh07Z6AiEAq+28G2Eign0kGlCUHuKJRRQvcEC9K/fsOQWVP5HnXN0=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzZDRmODY5YjI1MWU0OGM3MmMxZmUyMjRkNTQ5ZDFhOWUzN2YzMGRjYjE2ZGI5Nzc1MzI1NzkxZjAyYjBkOTc0In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUR1NU5QUk95Sy83c2xpVzVrMDNkekNmU0NWTTNIaFVZRlBrV0RZNkt2TUNBSWhBSUc4amkxelFTQTZJT01OOENON3Q3ZGhobmZxTmJ1MzkydzU0eW1TN1ZDTyIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzJSRU5EUW0weVowRjNTVUpCWjBsVlZIZHhOVm80Vmk5eksyVlpaSFpWUjNablJ6TlNOelZQZWpoSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUlhoTlJHTXdUbnBCTTFkb1kwNU5hbGw0VFVSRmVFMUVZekZPZWtFelYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVYwYjBObGQxRm9SMkl5YUhVck0yOXZZVTFLVm1KcFEyeHdhVEJuT1hRNU1YWmlNM2tLYmt4elRVWlVla0pMUW5Rd2FsUmtjRmhFYTJKT05WVlRXSFJTUmtWeVZtTkVWR2RQWW1GcFZHUlhiRVZvYmxkRFUyRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1Y2VEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUjBacFRsUnJNRTVxWnpKTlZFMTRXbFJXYVZsNlpHbE5hbXMxV1RKR2F3cE5SR3hxV1ZSSk5WbFVSbXhPVjFKb1QxZFdiRnB0VFhkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkUxMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVjZUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm9hQXBaYWxVMVRrUlpORTVxUlhwTlYxVXhXVzFOTTFscVNUVlBWMDVvV2tSQk5Wa3lSWGxQVjBWNFdsUldhMWxVYkd4YVYxcHFUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVOb2FBcFphbFUxVGtSWk5FNXFSWHBOVjFVeFdXMU5NMWxxU1RWUFYwNW9Xa1JCTlZreVJYbFBWMFY0V2xSV2ExbFViR3hhVjFwcVRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkUxMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGZWt4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJob1dXcFZOVTVFV1RST2FrVjZUVmRWTVZsdFRUTlpha2sxVDFkT2FGcEVRVFZaTWtWNVQxZEZlRnBVVm10WlZHeHNXbGRhYWsxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUUk5WRWw1VGxSTmR3cFBWRlV4VERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUUxNU5IZE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaExaVFJJT1ZGQlFVSkJUVUZTZWtKR0NrRnBSVUYzVG5aTGNqQm5Sa3hxTjFVeVoyOTFiVzQzWTBONVdFVndZMUZtWXpjellYUTFVRzF5UTIxeE5XMHdRMGxEYVZCQ2VuZFBiRzF5YjBFMFJIQUtSRTVEV2t0R1JsVjZkSGRUVm1obFYxZzVjRUV2TVZnckszbFJlVTFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbXRCVFVkWlEwMVJRME1yYmxKbE5tTnNVd3B0VTNndlZETXJSMGh5UWs1R01YcGlLemxwUW5rMU1tVkxZVGRpVjFoWVpVOXplVW81TTJGVU5sbGtUa0ZtYTA4dmNWcFllVlZ2UTAxUlEzcEplRk55Q2xJMVIycFFORTlNYURCNlprMDNPWGxQVWxWdVoycE5VMUp4ZGxKNVYwOUxkVU5VU0RNeGQxRlhkaXR3ZEhKTWNVbFBkRTltYTBoUVpGb3dQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1791704828,"logIndex":3203126009,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|
package/dist/loop/stop.d.ts
CHANGED
|
@@ -50,6 +50,12 @@ export interface TurnPreset {
|
|
|
50
50
|
mode?: 'readonly' | 'confirm' | 'full';
|
|
51
51
|
/** 确认模式审批回调:返回 true 放行 */
|
|
52
52
|
authorize?: (call: ToolCall) => Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* 1.13.0(K-FS-1):authorizeAll=true 将 confirm 模式的授权门扩展到 readonly 类工具
|
|
55
|
+
* (文件安全规则轴的读取面——读取的询问/拒绝规则可达);缺省 false = 既有行为零变化
|
|
56
|
+
* (readonly 模式契约不变:写类一律拒、只读类照常放行;full 整体旁路)。
|
|
57
|
+
*/
|
|
58
|
+
authorizeAll?: boolean;
|
|
53
59
|
maxSteps?: number;
|
|
54
60
|
/** F13:OR/AND 收口可配置(默认 any/all = M1 行为等价) */
|
|
55
61
|
aggregate?: {
|
package/dist/loop/stop.js
CHANGED
|
@@ -60,8 +60,11 @@ export async function runTurn(opts) {
|
|
|
60
60
|
log.append('plugin', 'toolResult', turnId, { id: call.id, error: `unknown tool "${call.tool}"` });
|
|
61
61
|
continue;
|
|
62
62
|
}
|
|
63
|
-
// 权限门(F4 集成点):write 类在 readonly/confirm
|
|
64
|
-
|
|
63
|
+
// 权限门(F4 集成点):write 类在 readonly/confirm 模式需放行;1.13.0(K-FS-1):
|
|
64
|
+
// authorizeAll=true 且 confirm 时 readonly 类同门(规则轴读取面),readonly 模式契约不变
|
|
65
|
+
const gated = preset.mode !== 'full' &&
|
|
66
|
+
(def.declaredSideEffect === 'write' || (preset.authorizeAll === true && preset.mode === 'confirm'));
|
|
67
|
+
if (gated) {
|
|
65
68
|
const granted = preset.mode === 'confirm' ? await (preset.authorize?.(call) ?? Promise.resolve(false)) : false;
|
|
66
69
|
log.append('runtime', 'toolResult', turnId, { id: call.id, error: 'authorization-denied', granted, mode: preset.mode });
|
|
67
70
|
if (!granted) {
|
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":"51 个组件(运行时依赖 0 项)","ts":
|
|
4
|
-
{"stage":"cosign-keyless","detail":"signed car-runtime-1.
|
|
1
|
+
{"stage":"archive","detail":"git archive HEAD → car-runtime-1.13.0.tgz(340714 bytes,树哈希锚定)","ts":1791704827001}
|
|
2
|
+
{"stage":"sha256sums","detail":"SHA256SUMS 3d4f869b251e48c7…(裸字节复核通过)","ts":1791704827002}
|
|
3
|
+
{"stage":"sbom","detail":"51 个组件(运行时依赖 0 项)","ts":1791704827009}
|
|
4
|
+
{"stage":"cosign-keyless","detail":"signed car-runtime-1.13.0.tgz (keyless OIDC + Rekor)","ts":1791704828841}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
|
|
2
|
-
export type Capability = 'fs-write' | 'net' | 'exec' | 'mcp' | 'env-read';
|
|
2
|
+
export type Capability = 'fs-write' | 'net' | 'exec' | 'mcp' | 'env-read' | 'fs-read' | 'fs-delete';
|
|
3
3
|
export interface ProbeResult {
|
|
4
4
|
platform: NodeJS.Platform;
|
|
5
5
|
landlock: boolean;
|
|
@@ -28,6 +28,12 @@ export interface ExecRequest {
|
|
|
28
28
|
/** 运行权限模式(F4):readonly/confirm/full——降级态下 full 亦受限为 confirm */
|
|
29
29
|
permissionMode: 'readonly' | 'confirm' | 'full';
|
|
30
30
|
authorize?: (req: ExecRequest) => Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* 1.13.0(K-SC-1):authorizeAll=true 将 confirm 模式的授权门扩展到非写类 argv
|
|
33
|
+
* (文件/命令规则轴的只读命令面——询问/拒绝规则可达);缺省 false = 既有行为零变化
|
|
34
|
+
* (readonly 模式契约不变:写类一律拒、只读类照常放行;full 整体旁路)。
|
|
35
|
+
*/
|
|
36
|
+
authorizeAll?: boolean;
|
|
31
37
|
timeoutMs?: number;
|
|
32
38
|
}
|
|
33
39
|
export interface ExecResult {
|
package/dist/sandbox/sandbox.js
CHANGED
|
@@ -38,6 +38,10 @@ export async function probeCapabilities(opts = {}) {
|
|
|
38
38
|
? { platform, landlock: true, seccomp: true, degraded: false, reason: null }
|
|
39
39
|
: { platform, landlock: false, seccomp: false, degraded: true, reason: 'landlock-run probe failed(内核 <5.13 或 LSM 未启用)' };
|
|
40
40
|
}
|
|
41
|
+
/** 写类能力判定(1.13.0 收敛单点):fs-delete 为变更面归写类;fs-read 为只读类不归(K-FS-3 分类纪律) */
|
|
42
|
+
function isWriteish(c) {
|
|
43
|
+
return c === 'fs-write' || c === 'net' || c === 'exec' || c === 'mcp' || c === 'fs-delete';
|
|
44
|
+
}
|
|
41
45
|
/**
|
|
42
46
|
* M2-S7 · Seatbelt profile 生成器(darwin 后端)
|
|
43
47
|
*
|
|
@@ -94,7 +98,7 @@ export class SandboxExecutor {
|
|
|
94
98
|
effectivePermission(permissionMode, capabilities) {
|
|
95
99
|
if (!this.degraded)
|
|
96
100
|
return { mode: permissionMode, denied: null };
|
|
97
|
-
const writeish = capabilities.some(c => c
|
|
101
|
+
const writeish = capabilities.some(c => isWriteish(c));
|
|
98
102
|
if (capabilities.includes('env-read'))
|
|
99
103
|
return { mode: 'confirm', denied: 'env-read denied in degraded sandbox(Q-04:一律拒绝)' };
|
|
100
104
|
if (writeish)
|
|
@@ -108,9 +112,11 @@ export class SandboxExecutor {
|
|
|
108
112
|
this.#audit({ kind: 'sandbox-denied', detail: { argv: req.argv, reason: degradedDenial, degraded: true }, ts: Date.now() });
|
|
109
113
|
return { ok: false, stdout: '', stderr: degradedDenial, code: -1, degraded: true, denied: degradedDenial };
|
|
110
114
|
}
|
|
111
|
-
// 权限门:写类能力在 readonly 一律拒;confirm 需审批(降级态强制 confirm
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
// 权限门:写类能力在 readonly 一律拒;confirm 需审批(降级态强制 confirm)。
|
|
116
|
+
// 1.13.0(K-SC-1):authorizeAll=true 且 confirm 时非写类 argv 同样进门(命令规则轴只读面)
|
|
117
|
+
const writeish = req.capabilities.some(c => isWriteish(c));
|
|
118
|
+
const gated = effMode !== 'full' && (writeish || (req.authorizeAll === true && effMode === 'confirm'));
|
|
119
|
+
if (gated) {
|
|
114
120
|
const granted = effMode === 'confirm' ? await (req.authorize?.(req) ?? Promise.resolve(false)) : false;
|
|
115
121
|
if (!granted) {
|
|
116
122
|
this.#audit({ kind: 'sandbox-denied', detail: { argv: req.argv, mode: effMode, degraded: this.degraded }, ts: Date.now() });
|
package/dist/sbom.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CAR-SBOM",
|
|
3
3
|
"specVersion": "0.1",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.13.0",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
7
7
|
"type": "file",
|
|
8
8
|
"path": "src/authz/authz.ts",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "79e892a0149f6302ea838dc96bb3133795807e7edd33e5927097de028dcc4985"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"type": "file",
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
{
|
|
102
102
|
"type": "file",
|
|
103
103
|
"path": "src/loop/stop.ts",
|
|
104
|
-
"sha256": "
|
|
104
|
+
"sha256": "d9290d51abf81211806c4491a65cfc9af5466a1dd8e32a497237f54a76f8c947"
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
"type": "file",
|
|
@@ -196,12 +196,12 @@
|
|
|
196
196
|
{
|
|
197
197
|
"type": "file",
|
|
198
198
|
"path": "src/sandbox/sandbox.ts",
|
|
199
|
-
"sha256": "
|
|
199
|
+
"sha256": "a24e4d23903b6b75bbbbae3d51f81aa66497bf1f53e9a76dff5eebf37625c1e6"
|
|
200
200
|
},
|
|
201
201
|
{
|
|
202
202
|
"type": "file",
|
|
203
203
|
"path": "src/seam.ts",
|
|
204
|
-
"sha256": "
|
|
204
|
+
"sha256": "835acb31893bbfa99d2dbab8fea9a0598608b493c00b8b77094e9d0a14812f83"
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"type": "file",
|
|
@@ -251,12 +251,12 @@
|
|
|
251
251
|
{
|
|
252
252
|
"type": "file",
|
|
253
253
|
"path": "package.json",
|
|
254
|
-
"sha256": "
|
|
254
|
+
"sha256": "0e011fa0b4c3f5eab169670cc185b2d4a2cdfa8d1523d9a8c4467192d659ed3c"
|
|
255
255
|
},
|
|
256
256
|
{
|
|
257
257
|
"type": "file",
|
|
258
258
|
"path": "README.md",
|
|
259
|
-
"sha256": "
|
|
259
|
+
"sha256": "37b32001af9f114bfbcee1a9f34b09a293fb76b1ef70a05ad7a21f95f6386c37"
|
|
260
260
|
}
|
|
261
261
|
],
|
|
262
262
|
"runtimeDependencies": []
|
package/dist/seam.d.ts
CHANGED
|
@@ -12,8 +12,13 @@
|
|
|
12
12
|
* runCode(PTC 红线单点——erasable-only/预算/授权门仅经 makePtcToolDefinition 行为面可达)、JsonRpc 编码层、
|
|
13
13
|
* rawPost/parseTraceparent/formatTraceparent(trace 通道内部件)。jiti epoch 面(D-37):mountPlugin.reloadEpoch
|
|
14
14
|
* 自 1.10.0 起已随本面可达,零加法登记确认。
|
|
15
|
+
* 加法登记:1.13.0 —— 桌面 S3 治理面(文件安全设计 §7 / S3 迭代规划 D-S3-1):K-FS-4 redact 出面(fs_read 落链前
|
|
16
|
+
* 脱敏——链上不得进密钥原文)+ K-S3-1 loadSessionLog/deriveSessionId 出面(审计页历史会话链校验/取证导出的
|
|
17
|
+
* 只读载入面;载入/校验单一权威在内核,桌面禁自实现哈希重算)+ K-S3-3 exportForensicsBundle/verifyBundle 出面
|
|
18
|
+
* (取证包导出 + 读回重验;断链即中止语义随本面)。恢复面 K-S3-2 零登记确认:SessionLog.fromEvents 自 M5 DEC-4
|
|
19
|
+
* 起已随本面可达(fork.ts 生产调用点),S2 D-S2-6 前提修正登记(S3 执行期发现)。
|
|
15
20
|
*/
|
|
16
|
-
export { SessionLog, type SessionEvent, type EventKind, type Actor } from './session/log.ts';
|
|
21
|
+
export { SessionLog, loadSessionLog, deriveSessionId, type SessionEvent, type EventKind, type Actor } from './session/log.ts';
|
|
17
22
|
export { SessionFileStore } from './session/store.ts';
|
|
18
23
|
export { runTurn, type TurnEndReason, type TurnPreset, type TurnResult } from './loop/stop.ts';
|
|
19
24
|
export { chatStep } from './runtime-core/chatStep.ts';
|
|
@@ -33,3 +38,5 @@ export { createHttpMcpTransport, resolveMcpHeaders, type HttpMcpServerSpec } fro
|
|
|
33
38
|
export { makePtcToolDefinition, type ToolBridge } from './ptc/runCode.ts';
|
|
34
39
|
export { renderSdkFromRegistry } from './ptc/sdk.ts';
|
|
35
40
|
export type { McpClientSpanHandle, PtcRelayHandle } from './runtime-core/trace.ts';
|
|
41
|
+
export { redact, type RedactionResult } from './runtime-core/redaction.ts';
|
|
42
|
+
export { exportForensicsBundle, verifyBundle, type ForensicsBundle, type ExportMeta } from './session/export.ts';
|
package/dist/seam.js
CHANGED
|
@@ -12,8 +12,13 @@
|
|
|
12
12
|
* runCode(PTC 红线单点——erasable-only/预算/授权门仅经 makePtcToolDefinition 行为面可达)、JsonRpc 编码层、
|
|
13
13
|
* rawPost/parseTraceparent/formatTraceparent(trace 通道内部件)。jiti epoch 面(D-37):mountPlugin.reloadEpoch
|
|
14
14
|
* 自 1.10.0 起已随本面可达,零加法登记确认。
|
|
15
|
+
* 加法登记:1.13.0 —— 桌面 S3 治理面(文件安全设计 §7 / S3 迭代规划 D-S3-1):K-FS-4 redact 出面(fs_read 落链前
|
|
16
|
+
* 脱敏——链上不得进密钥原文)+ K-S3-1 loadSessionLog/deriveSessionId 出面(审计页历史会话链校验/取证导出的
|
|
17
|
+
* 只读载入面;载入/校验单一权威在内核,桌面禁自实现哈希重算)+ K-S3-3 exportForensicsBundle/verifyBundle 出面
|
|
18
|
+
* (取证包导出 + 读回重验;断链即中止语义随本面)。恢复面 K-S3-2 零登记确认:SessionLog.fromEvents 自 M5 DEC-4
|
|
19
|
+
* 起已随本面可达(fork.ts 生产调用点),S2 D-S2-6 前提修正登记(S3 执行期发现)。
|
|
15
20
|
*/
|
|
16
|
-
export { SessionLog } from './session/log.js';
|
|
21
|
+
export { SessionLog, loadSessionLog, deriveSessionId } from './session/log.js';
|
|
17
22
|
export { SessionFileStore } from './session/store.js';
|
|
18
23
|
export { runTurn } from './loop/stop.js';
|
|
19
24
|
export { chatStep } from './runtime-core/chatStep.js';
|
|
@@ -32,3 +37,6 @@ export { createStdioClientTransport } from './mcp/stdioClient.js';
|
|
|
32
37
|
export { createHttpMcpTransport, resolveMcpHeaders } from './mcp/httpClient.js';
|
|
33
38
|
export { makePtcToolDefinition } from './ptc/runCode.js';
|
|
34
39
|
export { renderSdkFromRegistry } from './ptc/sdk.js';
|
|
40
|
+
// —— 1.13.0:桌面 S3 治理面(文件安全/审计/取证)——
|
|
41
|
+
export { redact } from './runtime-core/redaction.js';
|
|
42
|
+
export { exportForensicsBundle, verifyBundle } from './session/export.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lqc123qwe/car-runtime",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.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/authz/authz.ts
CHANGED
|
@@ -73,6 +73,22 @@ export class AuthzService {
|
|
|
73
73
|
})
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/**
|
|
77
|
+
* 规则直判(1.13.0 K-FS-2):文件/命令/网络规则轴命中后的 policy 双向直判——宿主规则引擎
|
|
78
|
+
* (允许/拒绝档)在授权门内直决,reason 必须携带规则标识(审计可回答「为什么没问人」)。
|
|
79
|
+
* 幂等键同现行(同 authorizationId 返回同一决策);EventKind 冻结面零新增(复用 #commit 形态)。
|
|
80
|
+
*/
|
|
81
|
+
decideByRule(req: AuthzRequest, rule: { decision: 'APPROVED' | 'DENIED'; reason: string }): AuthzDecision {
|
|
82
|
+
return this.#commit({
|
|
83
|
+
authorizationId: req.authorizationId,
|
|
84
|
+
decision: rule.decision,
|
|
85
|
+
decidedBy: 'policy',
|
|
86
|
+
reason: rule.reason,
|
|
87
|
+
degraded: this.#degraded,
|
|
88
|
+
ts: Date.now(),
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
76
92
|
/** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
|
|
77
93
|
async decideByUser(req: AuthzRequest, approve: (req: AuthzRequest) => Promise<boolean>): Promise<AuthzDecision> {
|
|
78
94
|
const cached = this.#decisions.get(req.authorizationId)
|
package/src/loop/stop.ts
CHANGED
|
@@ -48,6 +48,12 @@ export interface TurnPreset {
|
|
|
48
48
|
mode?: 'readonly' | 'confirm' | 'full'
|
|
49
49
|
/** 确认模式审批回调:返回 true 放行 */
|
|
50
50
|
authorize?: (call: ToolCall) => Promise<boolean>
|
|
51
|
+
/**
|
|
52
|
+
* 1.13.0(K-FS-1):authorizeAll=true 将 confirm 模式的授权门扩展到 readonly 类工具
|
|
53
|
+
* (文件安全规则轴的读取面——读取的询问/拒绝规则可达);缺省 false = 既有行为零变化
|
|
54
|
+
* (readonly 模式契约不变:写类一律拒、只读类照常放行;full 整体旁路)。
|
|
55
|
+
*/
|
|
56
|
+
authorizeAll?: boolean
|
|
51
57
|
maxSteps?: number
|
|
52
58
|
/** F13:OR/AND 收口可配置(默认 any/all = M1 行为等价) */
|
|
53
59
|
aggregate?: { concludesTurn?: 'any' | 'all'; terminate?: 'any' | 'all' }
|
|
@@ -124,8 +130,11 @@ export async function runTurn(opts: {
|
|
|
124
130
|
log.append('plugin', 'toolResult', turnId, { id: call.id, error: `unknown tool "${call.tool}"` })
|
|
125
131
|
continue
|
|
126
132
|
}
|
|
127
|
-
// 权限门(F4 集成点):write 类在 readonly/confirm
|
|
128
|
-
|
|
133
|
+
// 权限门(F4 集成点):write 类在 readonly/confirm 模式需放行;1.13.0(K-FS-1):
|
|
134
|
+
// authorizeAll=true 且 confirm 时 readonly 类同门(规则轴读取面),readonly 模式契约不变
|
|
135
|
+
const gated = preset.mode !== 'full' &&
|
|
136
|
+
(def.declaredSideEffect === 'write' || (preset.authorizeAll === true && preset.mode === 'confirm'))
|
|
137
|
+
if (gated) {
|
|
129
138
|
const granted = preset.mode === 'confirm' ? await (preset.authorize?.(call) ?? Promise.resolve(false)) : false
|
|
130
139
|
log.append('runtime', 'toolResult', turnId, { id: call.id, error: 'authorization-denied', granted, mode: preset.mode })
|
|
131
140
|
if (!granted) { denies++; continue }
|
package/src/sandbox/sandbox.ts
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
import { spawn } from 'node:child_process'
|
|
15
15
|
|
|
16
16
|
export type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'
|
|
17
|
-
|
|
17
|
+
// 1.13.0(K-FS-3):加法 'fs-read' | 'fs-delete'——文件安全三轴的审计对象保真(能力×资源);
|
|
18
|
+
// 分类纪律:fs-delete 为写类(变更面,降级态 Q-04 强制 confirm),fs-read 为只读类(五枚举既有语义不动)
|
|
19
|
+
export type Capability = 'fs-write' | 'net' | 'exec' | 'mcp' | 'env-read' | 'fs-read' | 'fs-delete'
|
|
18
20
|
|
|
19
21
|
export interface ProbeResult {
|
|
20
22
|
platform: NodeJS.Platform
|
|
@@ -64,11 +66,22 @@ export interface ExecRequest {
|
|
|
64
66
|
/** 运行权限模式(F4):readonly/confirm/full——降级态下 full 亦受限为 confirm */
|
|
65
67
|
permissionMode: 'readonly' | 'confirm' | 'full'
|
|
66
68
|
authorize?: (req: ExecRequest) => Promise<boolean>
|
|
69
|
+
/**
|
|
70
|
+
* 1.13.0(K-SC-1):authorizeAll=true 将 confirm 模式的授权门扩展到非写类 argv
|
|
71
|
+
* (文件/命令规则轴的只读命令面——询问/拒绝规则可达);缺省 false = 既有行为零变化
|
|
72
|
+
* (readonly 模式契约不变:写类一律拒、只读类照常放行;full 整体旁路)。
|
|
73
|
+
*/
|
|
74
|
+
authorizeAll?: boolean
|
|
67
75
|
timeoutMs?: number
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
export interface ExecResult { ok: boolean; stdout: string; stderr: string; code: number | null; degraded: boolean; denied?: string }
|
|
71
79
|
|
|
80
|
+
/** 写类能力判定(1.13.0 收敛单点):fs-delete 为变更面归写类;fs-read 为只读类不归(K-FS-3 分类纪律) */
|
|
81
|
+
function isWriteish(c: Capability): boolean {
|
|
82
|
+
return c === 'fs-write' || c === 'net' || c === 'exec' || c === 'mcp' || c === 'fs-delete'
|
|
83
|
+
}
|
|
84
|
+
|
|
72
85
|
/**
|
|
73
86
|
* M2-S7 · Seatbelt profile 生成器(darwin 后端)
|
|
74
87
|
*
|
|
@@ -140,7 +153,7 @@ export class SandboxExecutor {
|
|
|
140
153
|
/** Q-04 定稿:降级态运行约束判定(在授权门之前生效) */
|
|
141
154
|
effectivePermission(permissionMode: ExecRequest['permissionMode'], capabilities: Capability[]): { mode: 'readonly' | 'confirm' | 'full'; denied: string | null } {
|
|
142
155
|
if (!this.degraded) return { mode: permissionMode, denied: null }
|
|
143
|
-
const writeish = capabilities.some(c => c
|
|
156
|
+
const writeish = capabilities.some(c => isWriteish(c))
|
|
144
157
|
if (capabilities.includes('env-read')) return { mode: 'confirm', denied: 'env-read denied in degraded sandbox(Q-04:一律拒绝)' }
|
|
145
158
|
if (writeish) return { mode: 'confirm', denied: null } // full 亦受限为 confirm
|
|
146
159
|
return { mode: permissionMode === 'full' ? 'confirm' : permissionMode, denied: null }
|
|
@@ -153,9 +166,11 @@ export class SandboxExecutor {
|
|
|
153
166
|
this.#audit({ kind: 'sandbox-denied', detail: { argv: req.argv, reason: degradedDenial, degraded: true }, ts: Date.now() })
|
|
154
167
|
return { ok: false, stdout: '', stderr: degradedDenial, code: -1, degraded: true, denied: degradedDenial }
|
|
155
168
|
}
|
|
156
|
-
// 权限门:写类能力在 readonly 一律拒;confirm 需审批(降级态强制 confirm
|
|
157
|
-
|
|
158
|
-
|
|
169
|
+
// 权限门:写类能力在 readonly 一律拒;confirm 需审批(降级态强制 confirm)。
|
|
170
|
+
// 1.13.0(K-SC-1):authorizeAll=true 且 confirm 时非写类 argv 同样进门(命令规则轴只读面)
|
|
171
|
+
const writeish = req.capabilities.some(c => isWriteish(c))
|
|
172
|
+
const gated = effMode !== 'full' && (writeish || (req.authorizeAll === true && effMode === 'confirm'))
|
|
173
|
+
if (gated) {
|
|
159
174
|
const granted = effMode === 'confirm' ? await (req.authorize?.(req) ?? Promise.resolve(false)) : false
|
|
160
175
|
if (!granted) {
|
|
161
176
|
this.#audit({ kind: 'sandbox-denied', detail: { argv: req.argv, mode: effMode, degraded: this.degraded }, ts: Date.now() })
|
package/src/seam.ts
CHANGED
|
@@ -12,8 +12,13 @@
|
|
|
12
12
|
* runCode(PTC 红线单点——erasable-only/预算/授权门仅经 makePtcToolDefinition 行为面可达)、JsonRpc 编码层、
|
|
13
13
|
* rawPost/parseTraceparent/formatTraceparent(trace 通道内部件)。jiti epoch 面(D-37):mountPlugin.reloadEpoch
|
|
14
14
|
* 自 1.10.0 起已随本面可达,零加法登记确认。
|
|
15
|
+
* 加法登记:1.13.0 —— 桌面 S3 治理面(文件安全设计 §7 / S3 迭代规划 D-S3-1):K-FS-4 redact 出面(fs_read 落链前
|
|
16
|
+
* 脱敏——链上不得进密钥原文)+ K-S3-1 loadSessionLog/deriveSessionId 出面(审计页历史会话链校验/取证导出的
|
|
17
|
+
* 只读载入面;载入/校验单一权威在内核,桌面禁自实现哈希重算)+ K-S3-3 exportForensicsBundle/verifyBundle 出面
|
|
18
|
+
* (取证包导出 + 读回重验;断链即中止语义随本面)。恢复面 K-S3-2 零登记确认:SessionLog.fromEvents 自 M5 DEC-4
|
|
19
|
+
* 起已随本面可达(fork.ts 生产调用点),S2 D-S2-6 前提修正登记(S3 执行期发现)。
|
|
15
20
|
*/
|
|
16
|
-
export { SessionLog, type SessionEvent, type EventKind, type Actor } from './session/log.ts'
|
|
21
|
+
export { SessionLog, loadSessionLog, deriveSessionId, type SessionEvent, type EventKind, type Actor } from './session/log.ts'
|
|
17
22
|
export { SessionFileStore } from './session/store.ts'
|
|
18
23
|
export { runTurn, type TurnEndReason, type TurnPreset, type TurnResult } from './loop/stop.ts'
|
|
19
24
|
export { chatStep } from './runtime-core/chatStep.ts'
|
|
@@ -34,3 +39,6 @@ export { createHttpMcpTransport, resolveMcpHeaders, type HttpMcpServerSpec } fro
|
|
|
34
39
|
export { makePtcToolDefinition, type ToolBridge } from './ptc/runCode.ts'
|
|
35
40
|
export { renderSdkFromRegistry } from './ptc/sdk.ts'
|
|
36
41
|
export type { McpClientSpanHandle, PtcRelayHandle } from './runtime-core/trace.ts'
|
|
42
|
+
// —— 1.13.0:桌面 S3 治理面(文件安全/审计/取证)——
|
|
43
|
+
export { redact, type RedactionResult } from './runtime-core/redaction.ts'
|
|
44
|
+
export { exportForensicsBundle, verifyBundle, type ForensicsBundle, type ExportMeta } from './session/export.ts'
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"base64Signature":"MEUCIA0UBnqeM+TPTKLaxwsFDiHv1WnpL4aJ5GHqxXzLSbAyAiEAneTvQOA349AWwfG/eCWATHXznws2AYYf/EXE/cVQrGU=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1akNDQm0yZ0F3SUJBZ0lVV204L2E1cGFQWmpYcXRXVmRoUnlDeWMrZk1Jd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1EQTNNRGswTURVMFdoY05Nall4TURBM01EazFNRFUwV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXMFVLYVFXcUF5NjMvZlB4alo4ak83Yndtekk5WmlUNkEwN1YKTXZxTzlxdnJZQjloR2tZaGNWRDcza25jdUpacmQrVkhNL3BJNmEwWDZjR290QzNjNGFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV5TGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLRFJtWldVMlpHRXpNbVZtT1dReU9EbGpaV0k0TUdObQpZekZsTnpNNE0yUXdPVFZpWVRoa05qa3dGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVEl1TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV5TGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENnMApabVZsTm1SaE16SmxaamxrTWpnNVkyVmlPREJqWm1NeFpUY3pPRE5rTURrMVltRTRaRFk1TUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENnMApabVZsTm1SaE16SmxaamxrTWpnNVkyVmlPREJqWm1NeFpUY3pPRE5rTURrMVltRTRaRFk1TUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVEl1TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFeUxqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2cwWm1WbE5tUmhNekpsWmpsa01qZzVZMlZpT0RCalptTXhaVGN6T0ROa01EazFZbUU0WkRZNU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTNOakF5TWpZeQpOakl4TDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE1pNHdNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hGYnpBd1FBQUJBTUFSekJGCkFpQTNSUk0xdk1iZDBmVUU0VUlvMjFYaUo5a0lMYThlUnE1VlBpaHpHcGNybmdJaEFKZlNzQ01GVGpFYk11L0kKdmh1L3VnR1l4d3J2S0dZcGpXVytKUnBtUDF3WU1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01Id3FjdWp4Nm96KwpibTlwZ1E1SWZoTXZmVW1qWUdlaG5vL3EvSU9wSnhsU0hESStxSTljc0lENFltUDhGLzdVa1FJd1ZnMCs3UmFJClRncnR1V2laaFhTQWprdmgvdUU1clhZMUdiZ0FQOGd3RUxhdmFCMTdhbXBORXBhU3Q3Nkw0Tzk0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K","rekorBundle":{"SignedEntryTimestamp":"MEUCIQDK0u1UYH5gd1wwowDNOGkRWm7g3kMOt76q+73QtUfU1gIgI8/8XsM4m3rnPXnGT9A9PmHLMpheIYj76cODbAeO9Ow=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJhM2Q5N2YzZmE3ZWI0NTViYmEwZmVkNzllZDY4NGUwYTMxNGQ5YjMzZWQ3NWVjNGNhN2EzMDAzNzA1ODgxZjEyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQTBVQm5xZU0rVFBUS0xheHdzRkRpSHYxV25wTDRhSjVHSHF4WHpMU2JBeUFpRUFuZVR2UU9BMzQ5QVd3ZkcvZUNXQVRIWHpud3MyQVlZZi9FWEUvY1ZRckdVPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFha05EUW0weVowRjNTVUpCWjBsVlYyMDRMMkUxY0dGUVdtcFljWFJYVm1Sb1VubERlV01yWmsxSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUVROTlJHc3dUVVJWTUZkb1kwNU5hbGw0VFVSQk0wMUVhekZOUkZVd1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZYTUZWTFlWRlhjVUY1TmpNdlpsQjRhbG80YWs4M1luZHRla2s1V21sVU5rRXdOMVlLVFhaeFR6bHhkbkpaUWpsb1IydFphR05XUkRjemEyNWpkVXBhY21RclZraE5MM0JKTm1Fd1dEWmpSMjkwUXpOak5HRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1Y1VEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkZKdFdsZFZNbHBIUlhwTmJWWnRUMWRSZVU5RWJHcGFWMGswVFVkT2JRcFpla1pzVG5wTk5FMHlVWGRQVkZacFdWUm9hMDVxYTNkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkVsMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVjVUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm5NQXBhYlZac1RtMVNhRTE2U214YWFteHJUV3BuTlZreVZtbFBSRUpxV20xTmVGcFVZM3BQUkU1clRVUnJNVmx0UlRSYVJGazFUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVObk1BcGFiVlpzVG0xU2FFMTZTbXhhYW14clRXcG5OVmt5Vm1sUFJFSnFXbTFOZUZwVVkzcFBSRTVyVFVSck1WbHRSVFJhUkZrMVRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkVsMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGZVV4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJjd1dtMVdiRTV0VW1oTmVrcHNXbXBzYTAxcVp6VlpNbFpwVDBSQ2FscHRUWGhhVkdONlQwUk9hMDFFYXpGWmJVVTBXa1JaTlUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUTk9ha0Y1VFdwWmVRcE9ha2w0VERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUUxcE5IZE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaEdZbnBCZDFGQlFVSkJUVUZTZWtKR0NrRnBRVE5TVWsweGRrMWlaREJtVlVVMFZVbHZNakZZYVVvNWEwbE1ZVGhsVW5FMVZsQnBhSHBIY0dOeWJtZEphRUZLWmxOelEwMUdWR3BGWWsxMUwwa0tkbWgxTDNWblIxbDRkM0oyUzBkWmNHcFhWeXRLVW5CdFVERjNXVTFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbU5CVFVkUlEwMUlkM0ZqZFdwNE5tOTZLd3BpYlRsd1oxRTFTV1pvVFhabVZXMXFXVWRsYUc1dkwzRXZTVTl3U25oc1UwaEVTU3R4U1RsamMwbEVORmx0VURoR0x6ZFZhMUZKZDFabk1DczNVbUZKQ2xSbmNuUjFWMmxhYUZoVFFXcHJkbWd2ZFVVMWNsaFpNVWRpWjBGUU9HZDNSVXhoZG1GQ01UZGhiWEJPUlhCaFUzUTNOa3cwVHprMENpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19","integratedTime":1791366054,"logIndex":3128454895,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|