@lqc123qwe/car-runtime 1.9.0 → 1.11.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.
Files changed (182) hide show
  1. package/README.md +17 -1
  2. package/dist/SHA256SUMS +1 -0
  3. package/dist/authz/authz.d.ts +46 -0
  4. package/dist/authz/authz.js +76 -0
  5. package/dist/car-runtime-1.11.0.tgz +0 -0
  6. package/dist/car-runtime-1.11.0.tgz.sig.bundle +1 -0
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.js +825 -0
  9. package/dist/dx/doctor.d.ts +62 -0
  10. package/dist/dx/doctor.js +127 -0
  11. package/dist/governance/dump.d.ts +47 -0
  12. package/dist/governance/dump.js +17 -0
  13. package/dist/host/facade.d.ts +13 -0
  14. package/dist/host/facade.js +154 -0
  15. package/dist/host/hostGateway.d.ts +117 -0
  16. package/dist/host/hostGateway.js +65 -0
  17. package/dist/host/mappings.d.ts +27 -0
  18. package/dist/host/mappings.js +52 -0
  19. package/dist/host/stdio.d.ts +14 -0
  20. package/dist/host/stdio.js +83 -0
  21. package/dist/kernel/context.d.ts +76 -0
  22. package/dist/kernel/context.js +203 -0
  23. package/dist/kernel/events.d.ts +37 -0
  24. package/dist/kernel/events.js +82 -0
  25. package/dist/load/config.d.ts +79 -0
  26. package/dist/load/config.js +285 -0
  27. package/dist/load/loader.d.ts +72 -0
  28. package/dist/load/loader.js +162 -0
  29. package/dist/load/registry.d.ts +44 -0
  30. package/dist/load/registry.js +58 -0
  31. package/dist/load/report.d.ts +98 -0
  32. package/dist/load/report.js +301 -0
  33. package/dist/load/sigGate.d.ts +22 -0
  34. package/dist/load/sigGate.js +68 -0
  35. package/dist/load/sign.d.ts +25 -0
  36. package/dist/load/sign.js +47 -0
  37. package/dist/load/verifier.d.ts +35 -0
  38. package/dist/load/verifier.js +56 -0
  39. package/dist/loop/goal.d.ts +31 -0
  40. package/dist/loop/goal.js +34 -0
  41. package/dist/loop/recover.d.ts +17 -0
  42. package/dist/loop/recover.js +39 -0
  43. package/dist/loop/stop.d.ts +82 -0
  44. package/dist/loop/stop.js +184 -0
  45. package/dist/mcp/gateway.d.ts +96 -0
  46. package/dist/mcp/gateway.js +69 -0
  47. package/dist/mcp/httpClient.d.ts +27 -0
  48. package/dist/mcp/httpClient.js +196 -0
  49. package/dist/mcp/stdioClient.d.ts +8 -0
  50. package/dist/mcp/stdioClient.js +73 -0
  51. package/dist/ptc/budget.d.ts +21 -0
  52. package/dist/ptc/budget.js +36 -0
  53. package/dist/ptc/erasable.d.ts +14 -0
  54. package/dist/ptc/erasable.js +27 -0
  55. package/dist/ptc/runCode.d.ts +65 -0
  56. package/dist/ptc/runCode.js +140 -0
  57. package/dist/ptc/schemaRender.d.ts +15 -0
  58. package/dist/ptc/schemaRender.js +90 -0
  59. package/dist/ptc/sdk.d.ts +27 -0
  60. package/dist/ptc/sdk.js +23 -0
  61. package/dist/ptc/worker-entry.d.ts +1 -0
  62. package/dist/ptc/worker-entry.js +71 -0
  63. package/dist/release-audit.jsonl +4 -0
  64. package/dist/runtime-core/chatStep.d.ts +43 -0
  65. package/dist/runtime-core/chatStep.js +121 -0
  66. package/dist/runtime-core/credentials.d.ts +49 -0
  67. package/dist/runtime-core/credentials.js +118 -0
  68. package/dist/runtime-core/errors.d.ts +30 -0
  69. package/dist/runtime-core/errors.js +36 -0
  70. package/dist/runtime-core/llm.d.ts +76 -0
  71. package/dist/runtime-core/llm.js +638 -0
  72. package/dist/runtime-core/redaction.d.ts +39 -0
  73. package/dist/runtime-core/redaction.js +79 -0
  74. package/dist/runtime-core/telemetry.d.ts +88 -0
  75. package/dist/runtime-core/telemetry.js +332 -0
  76. package/dist/runtime-core/tools.d.ts +15 -0
  77. package/dist/runtime-core/tools.js +12 -0
  78. package/dist/runtime-core/trace.d.ts +55 -0
  79. package/dist/runtime-core/trace.js +137 -0
  80. package/dist/runtime-core/types.d.ts +104 -0
  81. package/dist/runtime-core/types.js +13 -0
  82. package/dist/sandbox/sandbox.d.ts +68 -0
  83. package/dist/sandbox/sandbox.js +153 -0
  84. package/dist/sbom.json +263 -0
  85. package/dist/seam.d.ts +24 -0
  86. package/dist/seam.js +23 -0
  87. package/dist/security/secrets-baseline.d.ts +43 -0
  88. package/dist/security/secrets-baseline.js +176 -0
  89. package/dist/security/secrets.d.ts +45 -0
  90. package/dist/security/secrets.js +138 -0
  91. package/dist/session/export.d.ts +55 -0
  92. package/dist/session/export.js +81 -0
  93. package/dist/session/fork.d.ts +51 -0
  94. package/dist/session/fork.js +63 -0
  95. package/dist/session/format.d.ts +21 -0
  96. package/dist/session/format.js +49 -0
  97. package/dist/session/indexStore.d.ts +44 -0
  98. package/dist/session/indexStore.js +265 -0
  99. package/dist/session/log.d.ts +79 -0
  100. package/dist/session/log.js +157 -0
  101. package/dist/session/store.d.ts +9 -0
  102. package/dist/session/store.js +37 -0
  103. package/dist/telemetry/metrics.d.ts +25 -0
  104. package/dist/telemetry/metrics.js +26 -0
  105. package/package.json +17 -1
  106. package/src/authz/authz.ts +12 -0
  107. package/src/loop/stop.ts +43 -10
  108. package/src/runtime-core/chatStep.ts +22 -2
  109. package/src/runtime-core/llm.ts +96 -13
  110. package/src/runtime-core/types.ts +22 -1
  111. package/src/seam.ts +24 -0
  112. package/src/session/log.ts +1 -1
  113. package/.gitattributes +0 -11
  114. package/.github/workflows/ci.yml +0 -293
  115. package/.github/workflows/release.yml +0 -54
  116. package/adr/ADR-001.md +0 -4
  117. package/adr/ADR-002.md +0 -5
  118. package/adr/ADR-003.md +0 -35
  119. package/adr/host-onboarding.md +0 -68
  120. package/adr/mlps-audit-checklist.md +0 -41
  121. package/adr/win32-spike.md +0 -45
  122. package/docs/plugin-authoring.md +0 -82
  123. package/native/landlock-run/Makefile +0 -19
  124. package/native/landlock-run/landlock-run.c +0 -162
  125. package/scripts/contract-check.ts +0 -56
  126. package/scripts/invariant-n1.ts +0 -96
  127. package/scripts/package-check.ts +0 -29
  128. package/scripts/ptc-baseline/run-baseline.ts +0 -118
  129. package/scripts/release-artifacts.ts +0 -111
  130. package/scripts/release-pipeline.ts +0 -245
  131. package/scripts/secrets-baseline.ts +0 -33
  132. package/scripts/secrets-scan.ts +0 -56
  133. package/scripts/win32-ffi-debug.ts +0 -143
  134. package/scripts/win32-koffi-spike.ts +0 -537
  135. package/test/contract/eventmap.golden.json +0 -7
  136. package/test/fixtures/hello-plugin.ts +0 -5
  137. package/test/kernel.spec.ts +0 -136
  138. package/test/registry-e2e/run-e2e.ts +0 -213
  139. package/test/s11.spec.ts +0 -129
  140. package/test/s12.spec.ts +0 -135
  141. package/test/s13.spec.ts +0 -117
  142. package/test/s14.spec.ts +0 -117
  143. package/test/s15.spec.ts +0 -80
  144. package/test/s16.spec.ts +0 -133
  145. package/test/s17.spec.ts +0 -102
  146. package/test/s18.spec.ts +0 -81
  147. package/test/s19.spec.ts +0 -138
  148. package/test/s2.spec.ts +0 -245
  149. package/test/s20.spec.ts +0 -241
  150. package/test/s21.spec.ts +0 -231
  151. package/test/s22-m7-store-format.spec.ts +0 -135
  152. package/test/s23-m7-export-index.spec.ts +0 -189
  153. package/test/s24-signature-gate.spec.ts +0 -185
  154. package/test/s25-m8-runtime-core.spec.ts +0 -600
  155. package/test/s26-signature-closeout.spec.ts +0 -349
  156. package/test/s27-host-load-wiring.spec.ts +0 -134
  157. package/test/s28-session-index-followup.spec.ts +0 -236
  158. package/test/s29-otel-producer.spec.ts +0 -252
  159. package/test/s3.spec.ts +0 -179
  160. package/test/s30-release-artifacts.spec.ts +0 -127
  161. package/test/s31-real-model-wiring.spec.ts +0 -329
  162. package/test/s32-telemetry-mcp-ptc.spec.ts +0 -218
  163. package/test/s33-anthropic-adapter.spec.ts +0 -354
  164. package/test/s34-mcp-remote-transport.spec.ts +0 -250
  165. package/test/s35-config-ts-zod.spec.ts +0 -145
  166. package/test/s36-host-tool-surface.spec.ts +0 -250
  167. package/test/s37-projection-dedupe.spec.ts +0 -161
  168. package/test/s38-config-jiti.spec.ts +0 -116
  169. package/test/s39-otlp-span-semantics.spec.ts +0 -100
  170. package/test/s4.spec.ts +0 -169
  171. package/test/s40-metrics-cumulative.spec.ts +0 -67
  172. package/test/s41-mcp-serve-turn-span.spec.ts +0 -148
  173. package/test/s42-traceparent-propagation.spec.ts +0 -415
  174. package/test/s43-remote-http-traceparent.spec.ts +0 -262
  175. package/test/s5.spec.ts +0 -95
  176. package/test/s6.spec.ts +0 -169
  177. package/test/s7.spec.ts +0 -136
  178. package/test/s7b-baseline.spec.ts +0 -20
  179. package/test/s9.spec.ts +0 -89
  180. package/test/sandbox-escape/j17-orchestrate.sh +0 -30
  181. package/test/sandbox-escape/run-matrix.sh +0 -98
  182. package/tsconfig.json +0 -18
package/README.md CHANGED
@@ -250,9 +250,25 @@ node --experimental-transform-types --test test/*.spec.ts
250
250
  - **1.8.0 正式发布(2026-09-29,S5 收官)**:npm `@lqc123qwe/car-runtime@1.8.0` 在架——**dist-tags latest → 1.8.0、rc 保留 1.0.0-rc.1** + provenance(slsa.dev/provenance/v1——registry attestations 端点实查,npm 形态演进登记)。Release `1.8.0`(id 398799183,agent GCM 凭据 API 创建,全 SHA 挂载——插曲:短 SHA 被拒)→ **j16 run 36517038845 全步 success**(构建/keyless 签名/自动上传五件套/npm publish)→ **post-publish 13 PASS / 0 DRY-RUN / 0 FAIL(全实查)**;外部等价检查 **SHA256 MATCH(`15c5e2cf…`)+ Rekor 交叉验证**(logIndex 2992647008 双端一致 + integratedTime 1790652315 + 透明日志 body 内制品哈希三方一致——tree 键形态差异延续 1.6/1.7 登记口径,详见收口报告 §6)。
251
251
  - **遗留登记(1.9 候选池)**:远程 MCP(Streamable HTTP)traceparent 传播——HTTP `traceparent` 头通道(D-21 通道既有,1.8 延后登记);mcp-serve 响应路径回传 span 上下文(D-30 登记不适用——宿主消费面不存在);MCP legacy HTTP+SSE 维持不追溯(D-21);写类工具人审外推(D-25 口径维持);插件 jiti 轨维持观察;metrics 多标签 dataPoints 维持。规划:`car-docs/10-内核v1/1.8-迭代规划.md`;收口报告:`car-docs/10-内核v1/1.8-收口终验报告.md`。
252
252
 
253
+ ## 1.9 状态(远程 MCP traceparent 传播:Streamable HTTP 头通道)
254
+
255
+ | `src/mcp/gateway.ts` + `src/mcp/httpClient.ts` | 1.9-S1(D-32)**远程 MCP 头通道**:ClientTransport.send 加法可选第二参 opts.traceparent(既有 `send(req)` 实现结构兼容零改动;stdio 忽略 opts——`_meta` 载体 1.8 不变);httpClient tools/call 请求头加法 `traceparent`(W3C Trace Context HTTP 载体惯例——远程 server 主消费面);parseTraceparent 校验 fail-open(畸形/全零/CRLF 拼接形态/空串不注入不抛——兼防头注入越权面);配置 headers 字面同名注入优先(登记);initialize/notifications/tools/list 不注入(无 span 上下文边界);**otel 关 = 头与 `_meta` 双载体零注入(请求头面与字节面不变)**;`_meta` 1.8 字节面维持——otel 开时双载体同值(头为主消费面,登记) | client 传播三载体闭环(stdio `_meta` / HTTP 头 / PTC 桥);cli.ts 装配层零改动 |
256
+ | `test/s43` | 4 测:头注入形态 + 双载体同值 + 缺省零注入 / 畸形 fail-open 全集(garbage + CRLF 越权 + 全零 + 空串)/ 配置同名注入优先 / E2E car run 远程 MCP 全链三点闭合(头回显 ↔ OTLP car.mcp.tool spanId + traceId)+ 双载体同值生产实查 + 零内容 | 1.9-GO-5 生产调用点核查承载 |
257
+
258
+ - **1.9 工程收口(2026-09-29,`179ab10`)**:1.8 候选池首选项出清(HTTP-TP 单块——gateway 透传 + httpClient 头注入)。全量 **339(336 PASS + 3 能力门控 skip / 0 fail)** + tsc strict 0 + secrets-scan 122 文件 0 命中(commit 后复跑)+ contract-check 4/4(golden 不动)+ 零依赖静态断言保持;存量 s32/s34/s42 零改动通过 = 兼容验收线。
259
+ - **1.9.0 正式发布(2026-09-29,S3 收官)**:npm `@lqc123qwe/car-runtime@1.9.0` 在架——**dist-tags latest → 1.9.0、rc 保留 1.0.0-rc.1** + provenance(slsa.dev/provenance/v1,attestations 端点实查)。Release `1.9.0`(id 398819949,agent GCM 凭据 node https 创建——插曲-1 口径:curl 内联中文转码破坏弃用;全 SHA 挂载)→ **j16 run 36521015983 全步 success**(构建/keyless 签名/自动上传五件套/npm publish with provenance)→ **G-04 npm audit 0 findings**;外部等价检查 **SHA256 MATCH(`f6fb9609…`)+ Rekor 交叉验证**(logIndex 2993391827 双端一致 + integratedTime 1790655493 + 透明日志 body 内制品哈希三方一致——tree 键形态差异延续登记;Rekor 双记录澄清:2993392722 = provenance 声明记录,2993391827 = 制品签名记录,对拍以 bundle 记录为准,详见收口报告 §3/§6)。
260
+ - **遗留登记(1.x 候选池,仅余维持项)**:mcp-serve 响应路径回传 span 上下文(D-30 登记不适用);MCP legacy HTTP+SSE 维持不追溯(D-21);写类工具人审外推(D-25 口径维持);插件 jiti 轨维持观察;metrics 多标签 dataPoints 维持;trace 面演进观察(MCP 官方 trace 规范落键名时复核 `_meta` 键位对齐——D-29 观察项)。规划:`car-docs/10-内核v1/1.9-迭代规划.md`;收口报告:`car-docs/10-内核v1/1.9-收口终验报告.md`。
261
+
262
+ ## 1.10 状态(KernelSeam 公开导出面 + 库构建产物)
263
+
264
+ | `src/seam.ts` | 1.10-S1:**KernelSeam 公开导出面**(19 符号窄面——SessionLog/SessionFileStore/runTurn/chatStep/RuntimeCore/CredentialService/双适配器/mountPlugin/Context/loadCarConfig 族/沙箱/遥测族)+ `tsconfig.build.json`(`rewriteRelativeImportExtensions`——`.ts` 后缀 import 编译期重写为 `.js`,dist 产物 1:1 镜像 src)+ `test/s44` 2 测(src 符号面完整 / dist 独立装载 + 符号一致 + SessionLog 冒烟) | 平台层(car-platform)KernelSeam 适配器消费面;D16 T-6 冻结面 semver 承诺载体 |
265
+ | `package.json` + CI | **库形态补全**:`main`/`types`/`exports`(`.` → dist/seam,`./src/*` 通配保留深路径向后兼容——加法非破坏)/ `files`(dist+src)/ `scripts.build`;ci.yml j01 增库构建验证步(扫描后防生成物干扰);release.yml 构建步前置(tgz 打包 `files` 含 dist) | **执行期关键发现:Node 硬禁 node_modules 内 type-stripping(ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING,本机 23.5 与 CI 22.19 同)——「源码直发即可被库消费」假设不成立,dist 产物为库消费唯一通路** |
266
+
267
+ - **1.10 工程收口(2026-09-29)**:全量 **341(338 PASS + 3 能力门控 skip / 0 fail)** = 1.9 基线 339 + s44 2 测;tsc strict 0;dist 构建装载冒烟过。**1.10 = 平台层 S3 前置(car-platform KernelSeam 实挂依赖本导出面);内核运行时行为零改动(存量 339 测试零改动通过 = 兼容验收线)**。
268
+
253
269
  ## 状态
254
270
 
255
- - **版本主线**: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 已发布)**
271
+ - **版本主线**: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 已发布)**
256
272
  - **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`)在真实发布兑现价值。
257
273
  - **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 清单已全绿收口。
258
274
  - **轨道 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 门禁已接入)。
@@ -0,0 +1 @@
1
+ e33ef93a776d291064c40692465fcc09d4281343d4f5ef06d38989d9dc95922f car-runtime-1.11.0.tgz
@@ -0,0 +1,46 @@
1
+ /**
2
+ * F4 · 授权服务:幂等决策 + 超时默认拒绝 + 能力标签 deny-by-default + 审计留痕
3
+ *
4
+ * 口径(《系统设计》§7.2.5 / 安全设计 §2.2 / US-3):
5
+ * - 授权对象 = 「能力 × 资源」;能力标签五枚举,未声明即无该能力(deny-by-default)
6
+ * - 幂等键 authorizationId:重复请求返回同一决策(防决策重放不一致,T-10)
7
+ * - 审批等待 120s 超时默认拒绝(timeout-default-deny;测试可注入短超时)
8
+ * - 决策 100% 写审计日志(US6「凭什么」的凭据);降级态决策带 degraded=true
9
+ */
10
+ import type { SessionLog } from '../session/log.ts';
11
+ import type { Capability } from '../sandbox/sandbox.ts';
12
+ export type Decision = 'APPROVED' | 'DENIED' | 'EXPIRED';
13
+ export interface AuthzRequest {
14
+ authorizationId: string;
15
+ actor: string;
16
+ capability: Capability;
17
+ resource: string;
18
+ reason?: string;
19
+ }
20
+ export interface AuthzDecision {
21
+ authorizationId: string;
22
+ decision: Decision;
23
+ decidedBy: 'user' | 'policy' | 'timeout';
24
+ reason: string;
25
+ degraded: boolean;
26
+ ts: number;
27
+ }
28
+ export interface DeclaredCapabilities {
29
+ capabilities?: Capability[];
30
+ }
31
+ /** 能力标签检查:manifest 未声明的能力 = deny(T-22:未声明按最高约束) */
32
+ export declare function checkCapability(declared: DeclaredCapabilities, needed: Capability): boolean;
33
+ export declare class AuthzService {
34
+ #private;
35
+ constructor(opts: {
36
+ log: SessionLog;
37
+ timeoutMs?: number;
38
+ degraded?: boolean;
39
+ });
40
+ /** 声明式放行(policy):readonly 模式下写类一律 DENIED,无需人审 */
41
+ decideByPolicy(req: AuthzRequest, mode: 'readonly' | 'confirm' | 'full'): AuthzDecision;
42
+ /** 会话策略直判(「会话内始终允许」粒度):decidedBy=policy 幂等落链,不入人审通道(审批回调 scope=session 写入 grants 后走此路) */
43
+ decideBySessionPolicy(req: AuthzRequest): AuthzDecision;
44
+ /** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
45
+ decideByUser(req: AuthzRequest, approve: (req: AuthzRequest) => Promise<boolean>): Promise<AuthzDecision>;
46
+ }
@@ -0,0 +1,76 @@
1
+ /** 能力标签检查:manifest 未声明的能力 = deny(T-22:未声明按最高约束) */
2
+ export function checkCapability(declared, needed) {
3
+ return declared.capabilities?.includes(needed) === true;
4
+ }
5
+ export class AuthzService {
6
+ #decisions = new Map();
7
+ #log;
8
+ #timeoutMs;
9
+ #degraded;
10
+ constructor(opts) {
11
+ this.#log = opts.log;
12
+ this.#timeoutMs = opts.timeoutMs ?? 120_000;
13
+ this.#degraded = opts.degraded ?? false;
14
+ }
15
+ /** 声明式放行(policy):readonly 模式下写类一律 DENIED,无需人审 */
16
+ decideByPolicy(req, mode) {
17
+ const writeish = req.capability !== 'env-read' && req.capability !== 'mcp';
18
+ const decision = {
19
+ authorizationId: req.authorizationId,
20
+ decision: mode === 'full' ? 'APPROVED' : 'DENIED',
21
+ decidedBy: 'policy',
22
+ reason: mode === 'full' ? 'auto-allowed (full mode)' : `write-class capability "${req.capability}" denied in ${mode} mode`,
23
+ degraded: this.#degraded,
24
+ ts: Date.now(),
25
+ };
26
+ void writeish;
27
+ return this.#commit(decision);
28
+ }
29
+ /** 会话策略直判(「会话内始终允许」粒度):decidedBy=policy 幂等落链,不入人审通道(审批回调 scope=session 写入 grants 后走此路) */
30
+ decideBySessionPolicy(req) {
31
+ return this.#commit({
32
+ authorizationId: req.authorizationId,
33
+ decision: 'APPROVED',
34
+ decidedBy: 'policy',
35
+ reason: `session policy grant (always-allow): ${req.resource}`,
36
+ degraded: this.#degraded,
37
+ ts: Date.now(),
38
+ });
39
+ }
40
+ /** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
41
+ async decideByUser(req, approve) {
42
+ const cached = this.#decisions.get(req.authorizationId);
43
+ if (cached)
44
+ return cached; // 幂等:同 id 返回同一决策(防重放不一致)
45
+ let approved;
46
+ try {
47
+ approved = await Promise.race([
48
+ approve(req),
49
+ new Promise(resolve => setTimeout(() => resolve(false), this.#timeoutMs)),
50
+ ]);
51
+ }
52
+ catch {
53
+ approved = false;
54
+ }
55
+ const decision = {
56
+ authorizationId: req.authorizationId,
57
+ decision: approved ? 'APPROVED' : 'EXPIRED',
58
+ decidedBy: approved ? 'user' : 'timeout',
59
+ reason: approved ? 'user approved within timeout' : `approval timeout after ${this.#timeoutMs}ms (default-deny)`,
60
+ degraded: this.#degraded,
61
+ ts: Date.now(),
62
+ };
63
+ return this.#commit(decision);
64
+ }
65
+ #commit(d) {
66
+ const existing = this.#decisions.get(d.authorizationId);
67
+ if (existing)
68
+ return existing;
69
+ this.#decisions.set(d.authorizationId, d);
70
+ // 授权留痕:authorization/* 事件(写会话日志先于执行——先落日志后放行由调用方保证顺序)
71
+ this.#log.append('runtime', 'turnEnd', `authz:${d.authorizationId}`, {
72
+ authorizationId: d.authorizationId, decision: d.decision, decidedBy: d.decidedBy, degraded: d.degraded,
73
+ }, { reason: d.reason });
74
+ return d;
75
+ }
76
+ }
Binary file
@@ -0,0 +1 @@
1
+ {"base64Signature":"MEUCIBJoQ5rJ6ym7jD0dTnLKCFq7LU6CGJEe2ZC8VCzjZPELAiEA+kGBiQ/PYJKPCrZJ7szsJ70Fnff7/bn+lCzovNHu/MM=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1ekNDQm02Z0F3SUJBZ0lVTThaMW1YN01CSjVNU1VpRndobFRhMkxYdm04d0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1EQTNNRGcxTmpBM1doY05Nall4TURBM01Ea3dOakEzV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVlUkFjM0hsRTgzSXRxTnRBR1NlWVNJck5RMUczVWFGTWlYdzYKRmlBYXVvY0hxd2VCVllPeVptSko5SFdBcTZtd2ZhTC9lSlVxRHBBV2VzeHBHcG5pWktPQ0JZMHdnZ1dKTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV4TGpBd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLRFUwT0RnNU5EbGxZelpoWmpFd1pqSTNNVGsxWm1VMwpZVFl3TURGa016SmxObVUyT0dVMk5EVXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVEV1TURBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakV4TGpBd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENnMQpORGc0T1RRNVpXTTJZV1l4TUdZeU56RTVOV1psTjJFMk1EQXhaRE15WlRabE5qaGxOalExTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENnMQpORGc0T1RRNVpXTTJZV1l4TUdZeU56RTVOV1psTjJFMk1EQXhaRE15WlRabE5qaGxOalExTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVEV1TURBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFeExqQXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2cxTkRnNE9UUTVaV00yWVdZeE1HWXlOekU1TldabE4yRTJNREF4WkRNeVpUWmxOamhsTmpRMU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTNOVGszTURrdwpOalEzTDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE1TNHdNSUdMQmdvckJnRUVBZFo1QWdRQ0JIMEVld0I1QUhjQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hGWlBCSHdBQUJBTUFTREJHCkFpRUExaVV6NGxjb3BTbXpHdTJRWFlGeXhCS2pyOFA3MEVsWU1XMW4wYmNnKzIwQ0lRQ0YvUUZxUWV4clhFWDYKR0RKVzEwRUJuOVQ2OVlBMjZWM05FeElGdm8zeWpqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQjRsMSs4S2RpbgpNcjhlaDBKMVE4b2JkT0RVSHVaUXB3cmM4cTM1b2ZGODQ2dHhJcnZyMlcweFlhNkNxb1JCcTZFQ01Ec1VyQ24vCkc4NFFURmVwaG16VnhYazNwMmRmcVhlVysyUDdWN200R2FEaDhuR1VNaHBXNWQ5aGVrYTk1RXJuV1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEYCIQDPLFWM6cbJ0BeT07DwUHQQPG8+WRftcTmRfg0JDi30ZQIhAOulABgNNSxNARfT+9V5QdCEh9M6830SCxriJs8m4kFh","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlMzNlZjkzYTc3NmQyOTEwNjRjNDA2OTI0NjVmY2MwOWQ0MjgxMzQzZDRmNWVmMDZkMzg5ODlkOWRjOTU5MjJmIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQkpvUTVySjZ5bTdqRDBkVG5MS0NGcTdMVTZDR0pFZTJaQzhWQ3pqWlBFTEFpRUEra0dCaVEvUFlKS1BDclpKN3N6c0o3MEZuZmY3L2JuK2xDem92Tkh1L01NPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFla05EUW0wMlowRjNTVUpCWjBsVlRUaGFNVzFZTjAxQ1NqVk5VMVZwUm5kb2JGUmhNa3hZZG0wNGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUVROTlJHY3hUbXBCTTFkb1kwNU5hbGw0VFVSQk0wMUVhM2RPYWtFelYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZsVWtGak0waHNSVGd6U1hSeFRuUkJSMU5sV1ZOSmNrNVJNVWN6VldGR1RXbFlkellLUm1sQllYVnZZMGh4ZDJWQ1ZsbFBlVnB0U2tvNVNGZEJjVFp0ZDJaaFRDOWxTbFZ4UkhCQlYyVnplSEJIY0c1cFdrdFBRMEpaTUhkbloxZEtUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1Y0VEdwQmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkZVd1QwUm5OVTVFYkd4WmVscG9XbXBGZDFwcVNUTk5WR3N4V20xVk13cFpWRmwzVFVSR2EwMTZTbXhPYlZVeVQwZFZNazVFVlhkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkVWMVRVUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVjRUR3BCZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm5NUXBPUkdjMFQxUlJOVnBYVFRKWlYxbDRUVWRaZVU1NlJUVk9WMXBzVGpKRk1rMUVRWGhhUkUxNVdsUmFiRTVxYUd4T2FsRXhUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVObk1RcE9SR2MwVDFSUk5WcFhUVEpaVjFsNFRVZFplVTU2UlRWT1YxcHNUakpGTWsxRVFYaGFSRTE1V2xSYWJFNXFhR3hPYWxFeFRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkVWMVRVUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGZUV4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJjeFRrUm5ORTlVVVRWYVYwMHlXVmRaZUUxSFdYbE9la1UxVGxkYWJFNHlSVEpOUkVGNFdrUk5lVnBVV214T2FtaHNUbXBSTVUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUTk9WR3N6VFVScmR3cE9hbEV6VERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUUxVE5IZE5TVWRNUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJTUVWbGQwSTFRVWhqUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaEdXbEJDU0hkQlFVSkJUVUZUUkVKSENrRnBSVUV4YVZWNk5HeGpiM0JUYlhwSGRUSlJXRmxHZVhoQ1MycHlPRkEzTUVWc1dVMVhNVzR3WW1Obkt6SXdRMGxSUTBZdlVVWnhVV1Y0Y2xoRldEWUtSMFJLVnpFd1JVSnVPVlEyT1ZsQk1qWldNMDVGZUVsR2RtOHplV3BxUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV1UVVSQ2EwRnFRalJzTVNzNFMyUnBiZ3BOY2pobGFEQktNVkU0YjJKa1QwUlZTSFZhVVhCM2NtTTRjVE0xYjJaR09EUTJkSGhKY25aeU1sY3dlRmxoTmtOeGIxSkNjVFpGUTAxRWMxVnlRMjR2Q2tjNE5GRlVSbVZ3YUcxNlZuaFlhek53TW1SbWNWaGxWeXN5VURkV04yMDBSMkZFYURodVIxVk5hSEJYTldRNWFHVnJZVGsxUlhKdVYxRTlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1791363367,"logIndex":3127715428,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};