@lqc123qwe/car-runtime 1.9.0 → 1.10.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 (176) hide show
  1. package/README.md +17 -1
  2. package/dist/SHA256SUMS +1 -0
  3. package/dist/authz/authz.d.ts +44 -0
  4. package/dist/authz/authz.js +65 -0
  5. package/dist/car-runtime-1.10.0.tgz +0 -0
  6. package/dist/car-runtime-1.10.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 +79 -0
  44. package/dist/loop/stop.js +151 -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 +40 -0
  65. package/dist/runtime-core/chatStep.js +104 -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 +553 -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 +84 -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 +21 -0
  86. package/dist/seam.js +20 -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/seam.ts +21 -0
  107. package/.gitattributes +0 -11
  108. package/.github/workflows/ci.yml +0 -293
  109. package/.github/workflows/release.yml +0 -54
  110. package/adr/ADR-001.md +0 -4
  111. package/adr/ADR-002.md +0 -5
  112. package/adr/ADR-003.md +0 -35
  113. package/adr/host-onboarding.md +0 -68
  114. package/adr/mlps-audit-checklist.md +0 -41
  115. package/adr/win32-spike.md +0 -45
  116. package/docs/plugin-authoring.md +0 -82
  117. package/native/landlock-run/Makefile +0 -19
  118. package/native/landlock-run/landlock-run.c +0 -162
  119. package/scripts/contract-check.ts +0 -56
  120. package/scripts/invariant-n1.ts +0 -96
  121. package/scripts/package-check.ts +0 -29
  122. package/scripts/ptc-baseline/run-baseline.ts +0 -118
  123. package/scripts/release-artifacts.ts +0 -111
  124. package/scripts/release-pipeline.ts +0 -245
  125. package/scripts/secrets-baseline.ts +0 -33
  126. package/scripts/secrets-scan.ts +0 -56
  127. package/scripts/win32-ffi-debug.ts +0 -143
  128. package/scripts/win32-koffi-spike.ts +0 -537
  129. package/test/contract/eventmap.golden.json +0 -7
  130. package/test/fixtures/hello-plugin.ts +0 -5
  131. package/test/kernel.spec.ts +0 -136
  132. package/test/registry-e2e/run-e2e.ts +0 -213
  133. package/test/s11.spec.ts +0 -129
  134. package/test/s12.spec.ts +0 -135
  135. package/test/s13.spec.ts +0 -117
  136. package/test/s14.spec.ts +0 -117
  137. package/test/s15.spec.ts +0 -80
  138. package/test/s16.spec.ts +0 -133
  139. package/test/s17.spec.ts +0 -102
  140. package/test/s18.spec.ts +0 -81
  141. package/test/s19.spec.ts +0 -138
  142. package/test/s2.spec.ts +0 -245
  143. package/test/s20.spec.ts +0 -241
  144. package/test/s21.spec.ts +0 -231
  145. package/test/s22-m7-store-format.spec.ts +0 -135
  146. package/test/s23-m7-export-index.spec.ts +0 -189
  147. package/test/s24-signature-gate.spec.ts +0 -185
  148. package/test/s25-m8-runtime-core.spec.ts +0 -600
  149. package/test/s26-signature-closeout.spec.ts +0 -349
  150. package/test/s27-host-load-wiring.spec.ts +0 -134
  151. package/test/s28-session-index-followup.spec.ts +0 -236
  152. package/test/s29-otel-producer.spec.ts +0 -252
  153. package/test/s3.spec.ts +0 -179
  154. package/test/s30-release-artifacts.spec.ts +0 -127
  155. package/test/s31-real-model-wiring.spec.ts +0 -329
  156. package/test/s32-telemetry-mcp-ptc.spec.ts +0 -218
  157. package/test/s33-anthropic-adapter.spec.ts +0 -354
  158. package/test/s34-mcp-remote-transport.spec.ts +0 -250
  159. package/test/s35-config-ts-zod.spec.ts +0 -145
  160. package/test/s36-host-tool-surface.spec.ts +0 -250
  161. package/test/s37-projection-dedupe.spec.ts +0 -161
  162. package/test/s38-config-jiti.spec.ts +0 -116
  163. package/test/s39-otlp-span-semantics.spec.ts +0 -100
  164. package/test/s4.spec.ts +0 -169
  165. package/test/s40-metrics-cumulative.spec.ts +0 -67
  166. package/test/s41-mcp-serve-turn-span.spec.ts +0 -148
  167. package/test/s42-traceparent-propagation.spec.ts +0 -415
  168. package/test/s43-remote-http-traceparent.spec.ts +0 -262
  169. package/test/s5.spec.ts +0 -95
  170. package/test/s6.spec.ts +0 -169
  171. package/test/s7.spec.ts +0 -136
  172. package/test/s7b-baseline.spec.ts +0 -20
  173. package/test/s9.spec.ts +0 -89
  174. package/test/sandbox-escape/j17-orchestrate.sh +0 -30
  175. package/test/sandbox-escape/run-matrix.sh +0 -98
  176. 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
+ 9e1d9d1865f469064fce724d646b8a3c9b87c897868c59a348800c0c64cb9ef9 car-runtime-1.10.0.tgz
@@ -0,0 +1,44 @@
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
+ /** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
43
+ decideByUser(req: AuthzRequest, approve: (req: AuthzRequest) => Promise<boolean>): Promise<AuthzDecision>;
44
+ }
@@ -0,0 +1,65 @@
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
+ /** 人审(confirm 模式):120s 超时默认拒绝(timeout-default-deny) */
30
+ async decideByUser(req, approve) {
31
+ const cached = this.#decisions.get(req.authorizationId);
32
+ if (cached)
33
+ return cached; // 幂等:同 id 返回同一决策(防重放不一致)
34
+ let approved;
35
+ try {
36
+ approved = await Promise.race([
37
+ approve(req),
38
+ new Promise(resolve => setTimeout(() => resolve(false), this.#timeoutMs)),
39
+ ]);
40
+ }
41
+ catch {
42
+ approved = false;
43
+ }
44
+ const decision = {
45
+ authorizationId: req.authorizationId,
46
+ decision: approved ? 'APPROVED' : 'EXPIRED',
47
+ decidedBy: approved ? 'user' : 'timeout',
48
+ reason: approved ? 'user approved within timeout' : `approval timeout after ${this.#timeoutMs}ms (default-deny)`,
49
+ degraded: this.#degraded,
50
+ ts: Date.now(),
51
+ };
52
+ return this.#commit(decision);
53
+ }
54
+ #commit(d) {
55
+ const existing = this.#decisions.get(d.authorizationId);
56
+ if (existing)
57
+ return existing;
58
+ this.#decisions.set(d.authorizationId, d);
59
+ // 授权留痕:authorization/* 事件(写会话日志先于执行——先落日志后放行由调用方保证顺序)
60
+ this.#log.append('runtime', 'turnEnd', `authz:${d.authorizationId}`, {
61
+ authorizationId: d.authorizationId, decision: d.decision, decidedBy: d.decidedBy, degraded: d.degraded,
62
+ }, { reason: d.reason });
63
+ return d;
64
+ }
65
+ }
Binary file
@@ -0,0 +1 @@
1
+ {"base64Signature":"MEUCIQC9Eb4tjZzDe1mzgXUycmzYBYKgL6Jy5Hk2QNYQDXwEAQIgYQ8bVRThONnvlokYD1GdQgBQ3KxeKvH2RtK4/0VZSz4=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhFakNDQnBtZ0F3SUJBZ0lVVkJKazAvbWwrckMvZ01PcVlOVk1vSVpTbEV3d0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZd09USTVNRGN6TWpNeFdoY05Nall3T1RJNU1EYzBNak14V2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVLS2lkTGZWTUR6RGZJT1hocTRRanhkbjZUdUJhK0xBSXRMQVcKZFVMWkJoRnFLTFgzSGg0MlJCdWorOWVCQmZ3cDhtbjJDRmJvbWcya1NJN1lGUkg3V2FPQ0JiZ3dnZ1cwTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWRCZ05WSFE0RUZnUVVFMlA0CkNEd3Rta0ZPVTJwNEhoNk5iU1NRM3Bvd0h3WURWUjBqQkJnd0ZvQVUzOVBwejFZa0VaYjVxTmpwS0ZXaXhpNFkKWkQ4d1lRWURWUjBSQVFIL0JGY3dWWVpUYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJ4eFl6WXlOQzlqWVhJdApjblZ1ZEdsdFpTOHVaMmwwYUhWaUwzZHZjbXRtYkc5M2N5OXlaV3hsWVhObExubHRiRUJ5WldaekwyaGxZV1J6CkwyMWhhVzR3T1FZS0t3WUJCQUdEdnpBQkFRUXJhSFIwY0hNNkx5OTBiMnRsYmk1aFkzUnBiMjV6TG1kcGRHaDEKWW5WelpYSmpiMjUwWlc1MExtTnZiVEFmQmdvckJnRUVBWU8vTUFFQ0JCRjNiM0pyWm14dmQxOWthWE53WVhSagphREEyQmdvckJnRUVBWU8vTUFFREJDaGtaRGswWlRCaFpETmpNbUZqWmpFM1kyRTNOelpqTWpreVpEUTFZV0UzCk9EazFNV1ZtWTJWbE1CVUdDaXNHQVFRQmc3OHdBUVFFQjNKbGJHVmhjMlV3SUFZS0t3WUJCQUdEdnpBQkJRUVMKYkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTUIwR0Npc0dBUVFCZzc4d0FRWUVEM0psWm5NdmFHVmhaSE12YldGcApiakE3QmdvckJnRUVBWU8vTUFFSUJDME1LMmgwZEhCek9pOHZkRzlyWlc0dVlXTjBhVzl1Y3k1bmFYUm9kV0oxCmMyVnlZMjl1ZEdWdWRDNWpiMjB3WXdZS0t3WUJCQUdEdnpBQkNRUlZERk5vZEhSd2N6b3ZMMmRwZEdoMVlpNWoKYjIwdmJIRmpOakkwTDJOaGNpMXlkVzUwYVcxbEx5NW5hWFJvZFdJdmQyOXlhMlpzYjNkekwzSmxiR1ZoYzJVdQplVzFzUUhKbFpuTXZhR1ZoWkhNdmJXRnBiakE0QmdvckJnRUVBWU8vTUFFS0JDb01LR1JrT1RSbE1HRmtNMk15CllXTm1NVGRqWVRjM05tTXlPVEprTkRWaFlUYzRPVFV4WldaalpXVXdIUVlLS3dZQkJBR0R2ekFCQ3dRUERBMW4KYVhSb2RXSXRhRzl6ZEdWa01EVUdDaXNHQVFRQmc3OHdBUXdFSnd3bGFIUjBjSE02THk5bmFYUm9kV0l1WTI5dApMMnh4WXpZeU5DOWpZWEl0Y25WdWRHbHRaVEE0QmdvckJnRUVBWU8vTUFFTkJDb01LR1JrT1RSbE1HRmtNMk15CllXTm1NVGRqWVRjM05tTXlPVEprTkRWaFlUYzRPVFV4WldaalpXVXdId1lLS3dZQkJBR0R2ekFCRGdRUkRBOXkKWldaekwyaGxZV1J6TDIxaGFXNHdHZ1lLS3dZQkJBR0R2ekFCRHdRTURBb3hNell4TVRreU56RTBNQ2tHQ2lzRwpBUVFCZzc4d0FSQUVHd3daYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJ4eFl6WXlOREFZQmdvckJnRUVBWU8vCk1BRVJCQW9NQ0RZNU1qTTBOVFkwTUdNR0Npc0dBUVFCZzc4d0FSSUVWUXhUYUhSMGNITTZMeTluYVhSb2RXSXUKWTI5dEwyeHhZell5TkM5allYSXRjblZ1ZEdsdFpTOHVaMmwwYUhWaUwzZHZjbXRtYkc5M2N5OXlaV3hsWVhObApMbmx0YkVCeVpXWnpMMmhsWVdSekwyMWhhVzR3T0FZS0t3WUJCQUdEdnpBQkV3UXFEQ2hrWkRrMFpUQmhaRE5qCk1tRmpaakUzWTJFM056WmpNamt5WkRRMVlXRTNPRGsxTVdWbVkyVmxNQ0VHQ2lzR0FRUUJnNzh3QVJRRUV3d1IKZDI5eWEyWnNiM2RmWkdsemNHRjBZMmd3V1FZS0t3WUJCQUdEdnpBQkZRUkxERWxvZEhSd2N6b3ZMMmRwZEdoMQpZaTVqYjIwdmJIRmpOakkwTDJOaGNpMXlkVzUwYVcxbEwyRmpkR2x2Ym5NdmNuVnVjeTh6TmpVek56SXlOalV5Ck5DOWhkSFJsYlhCMGN5OHhNQllHQ2lzR0FRUUJnNzh3QVJZRUNBd0djSFZpYkdsak1FOEdDaXNHQVFRQmc3OHcKQVJnRVFRdy9jbVZ3Ynpwc2NXTTJNalJBTmpreU16UTFOalF2WTJGeUxYSjFiblJwYldWQU1UTTJNVEU1TWpjeApORHB5WldZNmNtVm1jeTlvWldGa2N5OXRZV2x1TUlHSkJnb3JCZ0VFQWRaNUFnUUNCSHNFZVFCM0FIVUEzVDB3CmFzYkhFVEpqR1I0Y21XYzNBcUpLWHJqZVBLMy9oNHB5Z0M4cDdvNEFBQUdnN0JSYVZRQUFCQU1BUmpCRUFpQUgKRlJxT20zUlk4TWJ6RVhPS08vQjRNSW9PR1ZpSk5McW9UaE0rUERRd3hnSWdIczJLKzZKelJyT1h6OGwya3JJVgpXdzBKRktTcExXNEJUbDhvcHhrbTJSSXdDZ1lJS29aSXpqMEVBd01EWndBd1pBSXdJWXorK3FLMi9sZHJ4TmxuCnpvU2FlcTl6UWorOE1odnFOWXVXbVV4MVArN1VFc2pNcTh2cjlZZkg4Y09WNnR3ZEFqQUIyWExlZFlFNlRXdmYKbEI4Wk1xNVVodEQwR01nZXJLREhibGR6d0xFcHg2YnM3QUJTbEdXb1RyajdBbVJibzNVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEYCIQCQSshImz2LhSdIM0EyENAxTY1e+WvxVUnnr33WAxBy8wIhAIS1JWDTUupB9GK+eAdIDUt9uJeziuzX8v1UjrNl+r8j","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5ZTFkOWQxODY1ZjQ2OTA2NGZjZTcyNGQ2NDZiOGEzYzliODdjODk3ODY4YzU5YTM0ODgwMGMwYzY0Y2I5ZWY5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUM5RWI0dGpaekRlMW16Z1hVeWNtellCWUtnTDZKeTVIazJRTllRRFh3RUFRSWdZUThiVlJUaE9ObnZsb2tZRDFHZFFnQlEzS3hlS3ZIMlJ0SzQvMFZaU3o0PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaEZha05EUW5CdFowRjNTVUpCWjBsVlZrSkthekF2Yld3cmNrTXZaMDFQY1ZsT1ZrMXZTVnBUYkVWM2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVU1RWTlJHTjZUV3BOZUZkb1kwNU5hbGwzVDFSSk5VMUVZekJOYWsxNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZMUzJsa1RHWldUVVI2UkdaSlQxaG9jVFJSYW5oa2JqWlVkVUpoSzB4QlNYUk1RVmNLWkZWTVdrSm9SbkZMVEZnelNHZzBNbEpDZFdvck9XVkNRbVozY0RodGJqSkRSbUp2YldjeWExTkpOMWxHVWtnM1YyRlBRMEppWjNkbloxY3dUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZGTWxBMENrTkVkM1J0YTBaUFZUSndORWhvTms1aVUxTlJNM0J2ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDFsUldVUldVakJTUVZGSUwwSkdZM2RXV1ZwVVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKNGVGbDZXWGxPUXpscVdWaEpkQXBqYmxaMVpFZHNkRnBUT0hWYU1td3dZVWhXYVV3elpIWmpiWFJ0WWtjNU0yTjVPWGxhVjNoc1dWaE9iRXh1YkhSaVJVSjVXbGRhZWt3eWFHeFpWMUo2Q2t3eU1XaGhWelIzVDFGWlMwdDNXVUpDUVVkRWRucEJRa0ZSVVhKaFNGSXdZMGhOTmt4NU9UQmlNblJzWW1rMWFGa3pVbkJpTWpWNlRHMWtjR1JIYURFS1dXNVdlbHBZU21waU1qVXdXbGMxTUV4dFRuWmlWRUZtUW1kdmNrSm5SVVZCV1U4dlRVRkZRMEpDUmpOaU0wcHlXbTE0ZG1ReE9XdGhXRTUzV1ZoU2FncGhSRUV5UW1kdmNrSm5SVVZCV1U4dlRVRkZSRUpEYUd0YVJHc3dXbFJDYUZwRVRtcE5iVVpxV21wRk0xa3lSVE5PZWxwcVRXcHJlVnBFVVRGWlYwVXpDazlFYXpGTlYxWnRXVEpXYkUxQ1ZVZERhWE5IUVZGUlFtYzNPSGRCVVZGRlFqTktiR0pIVm1oak1sVjNTVUZaUzB0M1dVSkNRVWRFZG5wQlFrSlJVVk1LWWtoR2FrNXFTVEJNTWs1b1kya3hlV1JYTlRCaFZ6RnNUVUl3UjBOcGMwZEJVVkZDWnpjNGQwRlJXVVZFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0FwaWFrRTNRbWR2Y2tKblJVVkJXVTh2VFVGRlNVSkRNRTFMTW1nd1pFaENlazlwT0haa1J6bHlXbGMwZFZsWFRqQmhWemwxWTNrMWJtRllVbTlrVjBveENtTXlWbmxaTWpsMVpFZFdkV1JETldwaU1qQjNXWGRaUzB0M1dVSkNRVWRFZG5wQlFrTlJVbFpFUms1dlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1KSVJtcE9ha2t3VERKT2FHTnBNWGxrVnpVd1lWY3hiRXg1Tlc1aFdGSnZaRmRKZG1ReU9YbGhNbHB6WWpOa2Vrd3pTbXhpUjFab1l6SlZkUXBsVnpGelVVaEtiRnB1VFhaaFIxWm9Xa2hOZG1KWFJuQmlha0UwUW1kdmNrSm5SVVZCV1U4dlRVRkZTMEpEYjAxTFIxSnJUMVJTYkUxSFJtdE5NazE1Q2xsWFRtMU5WR1JxV1ZSak0wNXRUWGxQVkVwclRrUldhRmxVWXpSUFZGVjRXbGRhYWxwWFZYZElVVmxMUzNkWlFrSkJSMFIyZWtGQ1EzZFJVRVJCTVc0S1lWaFNiMlJYU1hSaFJ6bDZaRWRXYTAxRVZVZERhWE5IUVZGUlFtYzNPSGRCVVhkRlNuZDNiR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Nbmg0V1hwWmVVNURPV3BaV0VsMFkyNVdkV1JIYkhSYVZFRTBRbWR2Y2tKblJVVkJXVTh2VFVGRlRrSkRiMDFMUjFKclQxUlNiRTFIUm10Tk1rMTVDbGxYVG0xTlZHUnFXVlJqTTA1dFRYbFBWRXByVGtSV2FGbFVZelJQVkZWNFdsZGFhbHBYVlhkSWQxbExTM2RaUWtKQlIwUjJla0ZDUkdkUlVrUkJPWGtLV2xkYWVrd3lhR3haVjFKNlRESXhhR0ZYTkhkSFoxbExTM2RaUWtKQlIwUjJla0ZDUkhkUlRVUkJiM2hOZWxsNFRWUnJlVTU2UlRCTlEydEhRMmx6UndwQlVWRkNaemM0ZDBGU1FVVkhkM2RhWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREo0ZUZsNldYbE9SRUZaUW1kdmNrSm5SVVZCV1U4dkNrMUJSVkpDUVc5TlEwUlpOVTFxVFRCT1ZGa3dUVWROUjBOcGMwZEJVVkZDWnpjNGQwRlNTVVZXVVhoVVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVUtXVEk1ZEV3eWVIaFplbGw1VGtNNWFsbFlTWFJqYmxaMVpFZHNkRnBUT0hWYU1td3dZVWhXYVV3elpIWmpiWFJ0WWtjNU0yTjVPWGxhVjNoc1dWaE9iQXBNYm14MFlrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyaHJXa1JyTUZwVVFtaGFSRTVxQ2sxdFJtcGFha1V6V1RKRk0wNTZXbXBOYW10NVdrUlJNVmxYUlROUFJHc3hUVmRXYlZreVZteE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFJS1pESTVlV0V5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzVjFGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWt4RVJXeHZaRWhTZDJONmIzWk1NbVJ3WkVkb01RcFphVFZxWWpJd2RtSklSbXBPYWtrd1RESk9hR05wTVhsa1Z6VXdZVmN4YkV3eVJtcGtSMngyWW01TmRtTnVWblZqZVRoNlRtcFZlazU2U1hsT2FsVjVDazVET1doa1NGSnNZbGhDTUdONU9IaE5RbGxIUTJselIwRlJVVUpuTnpoM1FWSlpSVU5CZDBkalNGWnBZa2RzYWsxRk9FZERhWE5IUVZGUlFtYzNPSGNLUVZKblJWRlJkeTlqYlZaM1lucHdjMk5YVFRKTmFsSkJUbXByZVUxNlVURk9hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFdRVTFVVFRKTlZFVTFUV3BqZUFwT1JIQjVXbGRaTm1OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVbEhTa0puYjNKQ1owVkZRV1JhTlVGblVVTkNTSE5GWlZGQ00wRklWVUV6VkRCM0NtRnpZa2hGVkVwcVIxSTBZMjFYWXpOQmNVcExXSEpxWlZCTE15OW9OSEI1WjBNNGNEZHZORUZCUVVkbk4wSlNZVlpSUVVGQ1FVMUJVbXBDUlVGcFFVZ0tSbEp4VDIwelVsazRUV0o2UlZoUFMwOHZRalJOU1c5UFIxWnBTazVNY1c5VWFFMHJVRVJSZDNoblNXZEljekpMS3paS2VsSnlUMWg2T0d3eWEzSkpWZ3BYZHpCS1JrdFRjRXhYTkVKVWJEaHZjSGhyYlRKU1NYZERaMWxKUzI5YVNYcHFNRVZCZDAxRVduZEJkMXBCU1hkSldYb3JLM0ZMTWk5c1pISjRUbXh1Q25wdlUyRmxjVGw2VVdvck9FMW9kbkZPV1hWWGJWVjRNVkFyTjFWRmMycE5jVGgyY2psWlprZzRZMDlXTm5SM1pFRnFRVUl5V0V4bFpGbEZObFJYZG1ZS2JFSTRXazF4TlZWb2RFUXdSMDFuWlhKTFJFaGliR1I2ZDB4RmNIZzJZbk0zUVVKVGJFZFhiMVJ5YWpkQmJWSmliek5WUFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSJ9fX19","integratedTime":1790667152,"logIndex":2995741508,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};