@emilia-protocol/gate 0.11.0 → 0.14.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 (425) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +310 -0
  3. package/action-control-manifest.js +3 -268
  4. package/action-escrow-custodian.js +3 -394
  5. package/action-escrow-evidence.js +3 -858
  6. package/action-escrow-package.js +3 -1668
  7. package/action-escrow-postgres.js +3 -337
  8. package/action-escrow-state.js +3 -396
  9. package/action-escrow-verifiers.js +3 -331
  10. package/action-escrow.js +3 -2447
  11. package/action-packs.js +3 -140
  12. package/adapters/_kit.js +3 -104
  13. package/adapters/aws.js +3 -108
  14. package/adapters/cloudflare.js +3 -54
  15. package/adapters/gcp.js +3 -70
  16. package/adapters/github.js +3 -109
  17. package/adapters/jira.js +3 -55
  18. package/adapters/k8s.js +3 -70
  19. package/adapters/linear.js +3 -55
  20. package/adapters/salesforce.js +3 -55
  21. package/adapters/stripe.js +3 -81
  22. package/adapters/supabase.js +3 -121
  23. package/adapters/terraform.js +3 -59
  24. package/adapters/vercel.js +3 -84
  25. package/aec-execution.js +3 -312
  26. package/breakglass.js +3 -582
  27. package/capability-receipt.js +4 -0
  28. package/cf1-conformance.js +3 -106
  29. package/challenge-store.js +3 -69
  30. package/control-plane.js +3 -340
  31. package/coverage.js +3 -721
  32. package/demo.mjs +1 -1
  33. package/deployment-attestation.js +3 -247
  34. package/dist/action-control-manifest.d.ts +82 -0
  35. package/dist/action-control-manifest.d.ts.map +1 -0
  36. package/dist/action-control-manifest.js +422 -0
  37. package/dist/action-control-manifest.js.map +1 -0
  38. package/dist/action-escrow-custodian.d.ts +74 -0
  39. package/dist/action-escrow-custodian.d.ts.map +1 -0
  40. package/dist/action-escrow-custodian.js +363 -0
  41. package/dist/action-escrow-custodian.js.map +1 -0
  42. package/dist/action-escrow-evidence.d.ts +130 -0
  43. package/dist/action-escrow-evidence.d.ts.map +1 -0
  44. package/dist/action-escrow-evidence.js +1012 -0
  45. package/dist/action-escrow-evidence.js.map +1 -0
  46. package/dist/action-escrow-package.d.ts +10 -0
  47. package/dist/action-escrow-package.d.ts.map +1 -0
  48. package/dist/action-escrow-package.js +1583 -0
  49. package/dist/action-escrow-package.js.map +1 -0
  50. package/dist/action-escrow-postgres.d.ts +62 -0
  51. package/dist/action-escrow-postgres.d.ts.map +1 -0
  52. package/dist/action-escrow-postgres.js +339 -0
  53. package/dist/action-escrow-postgres.js.map +1 -0
  54. package/dist/action-escrow-state.d.ts +141 -0
  55. package/dist/action-escrow-state.d.ts.map +1 -0
  56. package/dist/action-escrow-state.js +413 -0
  57. package/dist/action-escrow-state.js.map +1 -0
  58. package/dist/action-escrow-verifiers.d.ts +65 -0
  59. package/dist/action-escrow-verifiers.d.ts.map +1 -0
  60. package/dist/action-escrow-verifiers.js +421 -0
  61. package/dist/action-escrow-verifiers.js.map +1 -0
  62. package/dist/action-escrow.d.ts +112 -0
  63. package/dist/action-escrow.d.ts.map +1 -0
  64. package/dist/action-escrow.js +2661 -0
  65. package/dist/action-escrow.js.map +1 -0
  66. package/dist/action-packs.d.ts +54 -0
  67. package/dist/action-packs.d.ts.map +1 -0
  68. package/dist/action-packs.js +143 -0
  69. package/dist/action-packs.js.map +1 -0
  70. package/dist/adapters/_kit.d.ts +50 -0
  71. package/dist/adapters/_kit.d.ts.map +1 -0
  72. package/dist/adapters/_kit.js +98 -0
  73. package/dist/adapters/_kit.js.map +1 -0
  74. package/dist/adapters/aws.d.ts +158 -0
  75. package/dist/adapters/aws.d.ts.map +1 -0
  76. package/dist/adapters/aws.js +136 -0
  77. package/dist/adapters/aws.js.map +1 -0
  78. package/dist/adapters/cloudflare.d.ts +116 -0
  79. package/dist/adapters/cloudflare.d.ts.map +1 -0
  80. package/dist/adapters/cloudflare.js +75 -0
  81. package/dist/adapters/cloudflare.js.map +1 -0
  82. package/dist/adapters/gcp.d.ts +139 -0
  83. package/dist/adapters/gcp.d.ts.map +1 -0
  84. package/dist/adapters/gcp.js +69 -0
  85. package/dist/adapters/gcp.js.map +1 -0
  86. package/dist/adapters/github.d.ts +123 -0
  87. package/dist/adapters/github.d.ts.map +1 -0
  88. package/dist/adapters/github.js +105 -0
  89. package/dist/adapters/github.js.map +1 -0
  90. package/dist/adapters/jira.d.ts +109 -0
  91. package/dist/adapters/jira.d.ts.map +1 -0
  92. package/dist/adapters/jira.js +54 -0
  93. package/dist/adapters/jira.js.map +1 -0
  94. package/dist/adapters/k8s.d.ts +139 -0
  95. package/dist/adapters/k8s.d.ts.map +1 -0
  96. package/dist/adapters/k8s.js +69 -0
  97. package/dist/adapters/k8s.js.map +1 -0
  98. package/dist/adapters/linear.d.ts +109 -0
  99. package/dist/adapters/linear.d.ts.map +1 -0
  100. package/dist/adapters/linear.js +54 -0
  101. package/dist/adapters/linear.js.map +1 -0
  102. package/dist/adapters/salesforce.d.ts +109 -0
  103. package/dist/adapters/salesforce.d.ts.map +1 -0
  104. package/dist/adapters/salesforce.js +54 -0
  105. package/dist/adapters/salesforce.js.map +1 -0
  106. package/dist/adapters/stripe.d.ts +116 -0
  107. package/dist/adapters/stripe.d.ts.map +1 -0
  108. package/dist/adapters/stripe.js +77 -0
  109. package/dist/adapters/stripe.js.map +1 -0
  110. package/dist/adapters/supabase.d.ts +127 -0
  111. package/dist/adapters/supabase.d.ts.map +1 -0
  112. package/dist/adapters/supabase.js +112 -0
  113. package/dist/adapters/supabase.js.map +1 -0
  114. package/dist/adapters/terraform.d.ts +109 -0
  115. package/dist/adapters/terraform.d.ts.map +1 -0
  116. package/dist/adapters/terraform.js +58 -0
  117. package/dist/adapters/terraform.js.map +1 -0
  118. package/dist/adapters/vercel.d.ts +114 -0
  119. package/dist/adapters/vercel.d.ts.map +1 -0
  120. package/dist/adapters/vercel.js +81 -0
  121. package/dist/adapters/vercel.js.map +1 -0
  122. package/dist/aec-execution.d.ts +107 -0
  123. package/dist/aec-execution.d.ts.map +1 -0
  124. package/dist/aec-execution.js +334 -0
  125. package/dist/aec-execution.js.map +1 -0
  126. package/dist/breakglass.d.ts +205 -0
  127. package/dist/breakglass.d.ts.map +1 -0
  128. package/dist/breakglass.js +627 -0
  129. package/dist/breakglass.js.map +1 -0
  130. package/dist/capability-receipt.d.ts +601 -0
  131. package/dist/capability-receipt.d.ts.map +1 -0
  132. package/dist/capability-receipt.js +1177 -0
  133. package/dist/capability-receipt.js.map +1 -0
  134. package/dist/cf1-conformance.d.ts +83 -0
  135. package/dist/cf1-conformance.d.ts.map +1 -0
  136. package/dist/cf1-conformance.js +94 -0
  137. package/dist/cf1-conformance.js.map +1 -0
  138. package/dist/challenge-store.d.ts +20 -0
  139. package/dist/challenge-store.d.ts.map +1 -0
  140. package/dist/challenge-store.js +62 -0
  141. package/dist/challenge-store.js.map +1 -0
  142. package/dist/control-plane.d.ts +136 -0
  143. package/dist/control-plane.d.ts.map +1 -0
  144. package/dist/control-plane.js +349 -0
  145. package/dist/control-plane.js.map +1 -0
  146. package/dist/coverage.d.ts +156 -0
  147. package/dist/coverage.d.ts.map +1 -0
  148. package/dist/coverage.js +768 -0
  149. package/dist/coverage.js.map +1 -0
  150. package/dist/deployment-attestation.d.ts +93 -0
  151. package/dist/deployment-attestation.d.ts.map +1 -0
  152. package/dist/deployment-attestation.js +262 -0
  153. package/dist/deployment-attestation.js.map +1 -0
  154. package/dist/eg1-conformance.d.ts +286 -0
  155. package/dist/eg1-conformance.d.ts.map +1 -0
  156. package/dist/eg1-conformance.js +379 -0
  157. package/dist/eg1-conformance.js.map +1 -0
  158. package/dist/enterprise.d.ts +88 -0
  159. package/dist/enterprise.d.ts.map +1 -0
  160. package/dist/enterprise.js +194 -0
  161. package/dist/enterprise.js.map +1 -0
  162. package/dist/evidence-postgres.d.ts +123 -0
  163. package/dist/evidence-postgres.d.ts.map +1 -0
  164. package/dist/evidence-postgres.js +343 -0
  165. package/dist/evidence-postgres.js.map +1 -0
  166. package/dist/evidence.d.ts +113 -0
  167. package/dist/evidence.d.ts.map +1 -0
  168. package/dist/evidence.js +369 -0
  169. package/dist/evidence.js.map +1 -0
  170. package/dist/execution-binding.d.ts +49 -0
  171. package/dist/execution-binding.d.ts.map +1 -0
  172. package/dist/execution-binding.js +243 -0
  173. package/dist/execution-binding.js.map +1 -0
  174. package/dist/formal-runtime-map.d.ts +42 -0
  175. package/dist/formal-runtime-map.d.ts.map +1 -0
  176. package/dist/formal-runtime-map.js +23 -0
  177. package/dist/formal-runtime-map.js.map +1 -0
  178. package/dist/index.d.ts +1003 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +1737 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/key-registry.d.ts +60 -0
  183. package/dist/key-registry.d.ts.map +1 -0
  184. package/dist/key-registry.js +144 -0
  185. package/dist/key-registry.js.map +1 -0
  186. package/dist/mcp.d.ts +53 -0
  187. package/dist/mcp.d.ts.map +1 -0
  188. package/dist/mcp.js +112 -0
  189. package/dist/mcp.js.map +1 -0
  190. package/dist/metering.d.ts +80 -0
  191. package/dist/metering.d.ts.map +1 -0
  192. package/dist/metering.js +227 -0
  193. package/dist/metering.js.map +1 -0
  194. package/dist/metrics.d.ts +68 -0
  195. package/dist/metrics.d.ts.map +1 -0
  196. package/dist/metrics.js +242 -0
  197. package/dist/metrics.js.map +1 -0
  198. package/dist/network-witness.d.ts +167 -0
  199. package/dist/network-witness.d.ts.map +1 -0
  200. package/dist/network-witness.js +520 -0
  201. package/dist/network-witness.js.map +1 -0
  202. package/dist/proposal-to-effect.d.ts +146 -0
  203. package/dist/proposal-to-effect.d.ts.map +1 -0
  204. package/dist/proposal-to-effect.js +427 -0
  205. package/dist/proposal-to-effect.js.map +1 -0
  206. package/dist/protocol-state.d.ts +141 -0
  207. package/dist/protocol-state.d.ts.map +1 -0
  208. package/dist/protocol-state.js +106 -0
  209. package/dist/protocol-state.js.map +1 -0
  210. package/dist/receipt-program.d.ts +59 -0
  211. package/dist/receipt-program.d.ts.map +1 -0
  212. package/dist/receipt-program.js +1053 -0
  213. package/dist/receipt-program.js.map +1 -0
  214. package/dist/reliance-kernel.d.ts +66 -0
  215. package/dist/reliance-kernel.d.ts.map +1 -0
  216. package/dist/reliance-kernel.js +103 -0
  217. package/dist/reliance-kernel.js.map +1 -0
  218. package/dist/reliance-packet.d.ts +67 -0
  219. package/dist/reliance-packet.d.ts.map +1 -0
  220. package/dist/reliance-packet.js +176 -0
  221. package/dist/reliance-packet.js.map +1 -0
  222. package/dist/remedy-program-postgres.d.ts +37 -0
  223. package/dist/remedy-program-postgres.d.ts.map +1 -0
  224. package/dist/remedy-program-postgres.js +291 -0
  225. package/dist/remedy-program-postgres.js.map +1 -0
  226. package/dist/remedy-program-receipt.d.ts +97 -0
  227. package/dist/remedy-program-receipt.d.ts.map +1 -0
  228. package/dist/remedy-program-receipt.js +817 -0
  229. package/dist/remedy-program-receipt.js.map +1 -0
  230. package/dist/remedy-program.d.ts +76 -0
  231. package/dist/remedy-program.d.ts.map +1 -0
  232. package/dist/remedy-program.js +1346 -0
  233. package/dist/remedy-program.js.map +1 -0
  234. package/dist/reports/art14.d.ts +101 -0
  235. package/dist/reports/art14.d.ts.map +1 -0
  236. package/dist/reports/art14.js +340 -0
  237. package/dist/reports/art14.js.map +1 -0
  238. package/dist/reports/assurance-package.d.ts +197 -0
  239. package/dist/reports/assurance-package.d.ts.map +1 -0
  240. package/dist/reports/assurance-package.js +313 -0
  241. package/dist/reports/assurance-package.js.map +1 -0
  242. package/dist/reports/auditor-workpaper.d.ts +194 -0
  243. package/dist/reports/auditor-workpaper.d.ts.map +1 -0
  244. package/dist/reports/auditor-workpaper.js +545 -0
  245. package/dist/reports/auditor-workpaper.js.map +1 -0
  246. package/dist/reports/external-verification.d.ts +76 -0
  247. package/dist/reports/external-verification.d.ts.map +1 -0
  248. package/dist/reports/external-verification.js +209 -0
  249. package/dist/reports/external-verification.js.map +1 -0
  250. package/dist/reports/reperform.d.ts +122 -0
  251. package/dist/reports/reperform.d.ts.map +1 -0
  252. package/dist/reports/reperform.js +432 -0
  253. package/dist/reports/reperform.js.map +1 -0
  254. package/dist/reports/underwriter.d.ts +127 -0
  255. package/dist/reports/underwriter.d.ts.map +1 -0
  256. package/dist/reports/underwriter.js +348 -0
  257. package/dist/reports/underwriter.js.map +1 -0
  258. package/dist/retention.d.ts +88 -0
  259. package/dist/retention.d.ts.map +1 -0
  260. package/dist/retention.js +90 -0
  261. package/dist/retention.js.map +1 -0
  262. package/dist/roster.d.ts +113 -0
  263. package/dist/roster.d.ts.map +1 -0
  264. package/dist/roster.js +261 -0
  265. package/dist/roster.js.map +1 -0
  266. package/dist/runtime-monitor.d.ts +132 -0
  267. package/dist/runtime-monitor.d.ts.map +1 -0
  268. package/dist/runtime-monitor.js +197 -0
  269. package/dist/runtime-monitor.js.map +1 -0
  270. package/dist/settlement.d.ts +68 -0
  271. package/dist/settlement.d.ts.map +1 -0
  272. package/dist/settlement.js +306 -0
  273. package/dist/settlement.js.map +1 -0
  274. package/dist/siem.d.ts +261 -0
  275. package/dist/siem.d.ts.map +1 -0
  276. package/dist/siem.js +247 -0
  277. package/dist/siem.js.map +1 -0
  278. package/dist/store-postgres.d.ts +107 -0
  279. package/dist/store-postgres.d.ts.map +1 -0
  280. package/dist/store-postgres.js +152 -0
  281. package/dist/store-postgres.js.map +1 -0
  282. package/dist/store.d.ts +95 -0
  283. package/dist/store.d.ts.map +1 -0
  284. package/dist/store.js +202 -0
  285. package/dist/store.js.map +1 -0
  286. package/dist/strict-json.d.ts +14 -0
  287. package/dist/strict-json.d.ts.map +1 -0
  288. package/dist/strict-json.js +132 -0
  289. package/dist/strict-json.js.map +1 -0
  290. package/dist/trust-program-adapters.d.ts +122 -0
  291. package/dist/trust-program-adapters.d.ts.map +1 -0
  292. package/dist/trust-program-adapters.js +802 -0
  293. package/dist/trust-program-adapters.js.map +1 -0
  294. package/dist/trust-program-postgres.d.ts +41 -0
  295. package/dist/trust-program-postgres.d.ts.map +1 -0
  296. package/dist/trust-program-postgres.js +346 -0
  297. package/dist/trust-program-postgres.js.map +1 -0
  298. package/dist/trust-program-revocation.d.ts +206 -0
  299. package/dist/trust-program-revocation.d.ts.map +1 -0
  300. package/dist/trust-program-revocation.js +600 -0
  301. package/dist/trust-program-revocation.js.map +1 -0
  302. package/dist/trust-program.d.ts +197 -0
  303. package/dist/trust-program.d.ts.map +1 -0
  304. package/dist/trust-program.js +1351 -0
  305. package/dist/trust-program.js.map +1 -0
  306. package/dist/witness-postgres.d.ts +43 -0
  307. package/dist/witness-postgres.d.ts.map +1 -0
  308. package/dist/witness-postgres.js +92 -0
  309. package/dist/witness-postgres.js.map +1 -0
  310. package/dist/zk-range-proof.d.ts +78 -0
  311. package/dist/zk-range-proof.d.ts.map +1 -0
  312. package/dist/zk-range-proof.js +228 -0
  313. package/dist/zk-range-proof.js.map +1 -0
  314. package/eg1-conformance.js +3 -404
  315. package/enterprise.js +3 -180
  316. package/ep-assure.mjs +1 -0
  317. package/evidence-postgres.js +3 -356
  318. package/evidence.js +4 -360
  319. package/execution-binding.js +3 -212
  320. package/formal-runtime-map.js +4 -0
  321. package/index.js +4 -1249
  322. package/key-registry.js +3 -134
  323. package/mcp.js +3 -109
  324. package/metering.js +3 -226
  325. package/metrics.js +3 -231
  326. package/network-witness.js +3 -499
  327. package/package.json +35 -4
  328. package/proposal-to-effect.js +4 -0
  329. package/receipt-program.js +4 -0
  330. package/reliance-kernel.js +3 -112
  331. package/reliance-packet.js +3 -175
  332. package/remedy-program-postgres.js +4 -0
  333. package/remedy-program-receipt.js +4 -0
  334. package/remedy-program.js +4 -0
  335. package/reports/art14.js +0 -0
  336. package/reports/assurance-package.js +2 -312
  337. package/reports/auditor-workpaper.js +3 -537
  338. package/reports/external-verification.js +3 -222
  339. package/reports/reperform.js +3 -424
  340. package/reports/underwriter.js +3 -339
  341. package/retention.js +3 -84
  342. package/roster.js +3 -264
  343. package/runtime-monitor.js +4 -0
  344. package/settlement.js +3 -299
  345. package/siem.js +3 -235
  346. package/src/action-control-manifest.ts +424 -0
  347. package/src/action-escrow-custodian.ts +427 -0
  348. package/src/action-escrow-evidence.ts +1178 -0
  349. package/src/action-escrow-package.ts +1821 -0
  350. package/src/action-escrow-postgres.ts +366 -0
  351. package/src/action-escrow-state.ts +498 -0
  352. package/src/action-escrow-verifiers.ts +484 -0
  353. package/src/action-escrow.ts +3039 -0
  354. package/src/action-packs.ts +170 -0
  355. package/src/adapters/_kit.ts +117 -0
  356. package/src/adapters/aws.ts +142 -0
  357. package/src/adapters/cloudflare.ts +78 -0
  358. package/src/adapters/gcp.ts +71 -0
  359. package/src/adapters/github.ts +110 -0
  360. package/src/adapters/jira.ts +56 -0
  361. package/src/adapters/k8s.ts +71 -0
  362. package/src/adapters/linear.ts +56 -0
  363. package/src/adapters/salesforce.ts +56 -0
  364. package/src/adapters/stripe.ts +82 -0
  365. package/src/adapters/supabase.ts +122 -0
  366. package/src/adapters/terraform.ts +60 -0
  367. package/src/adapters/vercel.ts +85 -0
  368. package/src/aec-execution.ts +354 -0
  369. package/src/breakglass.ts +647 -0
  370. package/src/capability-receipt.ts +1258 -0
  371. package/src/cf1-conformance.ts +120 -0
  372. package/src/challenge-store.ts +70 -0
  373. package/src/control-plane.ts +374 -0
  374. package/src/coverage.ts +832 -0
  375. package/src/deployment-attestation.ts +259 -0
  376. package/src/eg1-conformance.ts +471 -0
  377. package/src/enterprise.ts +195 -0
  378. package/src/evidence-postgres.ts +374 -0
  379. package/src/evidence.ts +367 -0
  380. package/src/execution-binding.ts +236 -0
  381. package/src/formal-runtime-map.ts +24 -0
  382. package/src/index.ts +2127 -0
  383. package/src/key-registry.ts +150 -0
  384. package/src/mcp.ts +120 -0
  385. package/src/metering.ts +237 -0
  386. package/src/metrics.ts +232 -0
  387. package/src/network-witness.ts +585 -0
  388. package/src/proposal-to-effect.ts +571 -0
  389. package/src/protocol-state.ts +143 -0
  390. package/src/protocol-state.typecheck.ts +94 -0
  391. package/src/receipt-program.ts +1105 -0
  392. package/src/reliance-kernel.ts +119 -0
  393. package/src/reliance-packet.ts +206 -0
  394. package/src/remedy-program-postgres.ts +367 -0
  395. package/src/remedy-program-receipt.ts +891 -0
  396. package/src/remedy-program.ts +1388 -0
  397. package/src/reports/art14.ts +361 -0
  398. package/src/reports/assurance-package.ts +330 -0
  399. package/src/reports/auditor-workpaper.ts +558 -0
  400. package/src/reports/external-verification.ts +232 -0
  401. package/src/reports/reperform.ts +441 -0
  402. package/src/reports/underwriter.ts +356 -0
  403. package/src/retention.ts +100 -0
  404. package/src/roster.ts +273 -0
  405. package/src/runtime-monitor.ts +217 -0
  406. package/src/settlement.ts +313 -0
  407. package/src/siem.ts +247 -0
  408. package/src/store-postgres.ts +167 -0
  409. package/src/store.ts +214 -0
  410. package/src/strict-json.ts +115 -0
  411. package/src/trust-program-adapters.ts +847 -0
  412. package/src/trust-program-postgres.ts +429 -0
  413. package/src/trust-program-revocation.ts +751 -0
  414. package/src/trust-program.ts +1460 -0
  415. package/src/witness-postgres.ts +106 -0
  416. package/src/zk-range-proof.ts +250 -0
  417. package/store-postgres.js +3 -161
  418. package/store.js +4 -198
  419. package/strict-json.js +3 -102
  420. package/trust-program-adapters.js +4 -0
  421. package/trust-program-postgres.js +4 -0
  422. package/trust-program-revocation.js +4 -0
  423. package/trust-program.js +4 -0
  424. package/witness-postgres.js +3 -96
  425. package/zk-range-proof.js +4 -0
@@ -1,107 +1,4 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /**
3
- * CF-1 Consequence Firewall Conformance — the category badge above EG-1.
4
- *
5
- * EG-1 answers "does this integration ENFORCE the gate?" (eight runtime checks).
6
- * CF-1 answers the category question "is this a Consequence Firewall?" — EG-1's
7
- * eight checks PLUS the three that make the category claim honest:
8
- *
9
- * - consequential_action_declared: the action is declared high-risk /
10
- * receipt-required by policy or manifest, not gated only by default-deny.
11
- * - wrong_authority_refused: a gate pinned to the WRONG issuer key cannot be
12
- * talked into authorizing — trust is pinned by the relying party, never
13
- * taken from the receipt-carried signer.
14
- * - evidence_verifies_offline: an allowed run emits a reliance packet a third
15
- * party can verify offline (verdict "rely" + the execution proof binds the
16
- * authorization decision, recomputable without trusting the operator).
17
- *
18
- * Pure module: composes eg1-conformance.js only (no import of index.js, so no
19
- * cycle). `runCf1` is param-driven (an `invoke` for the gate under test, a
20
- * `wrongInvoke` for a sibling gate pinned to the wrong key, the harness, and the
21
- * resolved manifest requirement). `cf1Conformance` / `cf1ConformanceSelfTest`
22
- * in index.js wire real gates to it.
23
- */
24
- import { EG1_CHECKS, runEg1 } from './eg1-conformance.js';
25
-
26
- export const CF1_VERSION = 'CF-1';
27
-
28
- // The nine CF-1 checks: the declaration bookend, the eight EG-1 runtime checks,
29
- // then the two that distinguish a firewall from an enforced gate.
30
- export const CF1_CHECKS = Object.freeze([
31
- { id: 'consequential_action_declared', title: 'action declared consequential (receipt required by policy/manifest)' },
32
- ...EG1_CHECKS.map((c) => ({ id: c.id, title: c.title })),
33
- { id: 'wrong_authority_refused', title: 'gate pinned to the wrong authority cannot authorize' },
34
- { id: 'evidence_verifies_offline', title: 'allowed run emits reliance evidence verifiable offline' },
35
- ]);
36
-
37
- /**
38
- * Drive a subject through the CF-1 checks and return a JSON report.
39
- * @param {object} o
40
- * @param {(scenario:object)=>Promise<object>} o.invoke the gate under test
41
- * @param {(scenario:object)=>Promise<object>} [o.wrongInvoke] a sibling gate pinned to a DIFFERENT (wrong) issuer key
42
- * @param {object} o.harness from createEg1Harness()
43
- * @param {object} [o.action] the high-risk action (defaults to the harness action)
44
- * @param {object} [o.requirement] the manifest requirement resolved for this action (findActionRequirement)
45
- */
46
- export async function runCf1({ invoke, wrongInvoke, harness, action, requirement } = {}) {
47
- if (typeof invoke !== 'function') throw new Error('runCf1 requires an invoke(scenario) function');
48
- if (!harness || typeof harness.mint !== 'function') throw new Error('runCf1 requires a harness from createEg1Harness()');
49
- const act = action || harness.action;
50
-
51
- // The eight EG-1 runtime checks (missing / weak-assurance / execution-drift /
52
- // valid-runs / replay / tamper / execution-proof / reliance-packet).
53
- const eg1 = await runEg1({ invoke, harness, action: act });
54
- const results = {};
55
- for (const c of eg1.checks) results[c.id] = { pass: c.pass, observed: c.observed };
56
-
57
- // consequential_action_declared — policy/manifest classifies the action as
58
- // requiring a receipt (not merely caught by a default-deny fallback).
59
- results.consequential_action_declared = {
60
- pass: requirement ? requirement.receipt_required === true : false,
61
- observed: {
62
- receipt_required: requirement?.receipt_required ?? null,
63
- assurance_class: requirement?.assurance_class ?? null,
64
- action_type: requirement?.action_type ?? null,
65
- },
66
- };
67
-
68
- // wrong_authority_refused — a gate pinned to a different key rejects a valid
69
- // receipt. Proves trust is pinned by the relying party, not receipt-carried.
70
- let wrongPass = false;
71
- let wrongObserved = { skipped: true };
72
- if (typeof wrongInvoke === 'function') {
73
- const rr = await wrongInvoke({ receipt: harness.mint({ outcome: 'allow_with_signoff' }), observedAction: act });
74
- wrongPass = rr.allowed === false;
75
- wrongObserved = { allowed: !!rr.allowed, status: rr.status ?? null, reason: rr.reason ?? null };
76
- }
77
- results.wrong_authority_refused = { pass: wrongPass, observed: wrongObserved };
78
-
79
- // evidence_verifies_offline — a fresh valid run yields a "rely" reliance
80
- // packet whose execution proof binds the authorization decision. A third
81
- // party recomputes that binding offline; no operator trust required.
82
- const vr = await invoke({ receipt: harness.mint({ outcome: 'allow_with_signoff' }), observedAction: act });
83
- const binds = !!vr.execution?.authorizes_decision && !!vr.decisionHash
84
- && vr.execution.authorizes_decision === vr.decisionHash;
85
- const offlineOk = vr.allowed === true
86
- && String(vr.packet?.verdict || '').toLowerCase() === 'rely'
87
- && binds;
88
- results.evidence_verifies_offline = {
89
- pass: offlineOk,
90
- observed: { allowed: !!vr.allowed, verdict: vr.packet?.verdict ?? null, binds },
91
- };
92
-
93
- const checks = CF1_CHECKS.map((c) => ({ id: c.id, title: c.title, ...results[c.id] }));
94
- const passedCount = checks.filter((c) => c.pass).length;
95
- const passed = passedCount === checks.length;
96
- return {
97
- standard: CF1_VERSION,
98
- passed,
99
- badge: passed ? 'CF-1 Enforced' : 'CF-1 not earned',
100
- summary: { passed: passedCount, total: checks.length },
101
- eg1: { passed: eg1.passed, summary: eg1.summary },
102
- checks,
103
- generated_at: new Date(harness.now ? harness.now() : Date.now()).toISOString(),
104
- };
105
- }
106
-
107
- export default { CF1_VERSION, CF1_CHECKS, runCf1 };
2
+ // Compatibility entry point for the TypeScript cf1-conformance module.
3
+ export * from './dist/cf1-conformance.js';
4
+ export { default } from './dist/cf1-conformance.js';
@@ -1,70 +1,4 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /**
3
- * Durable, body-bound lifecycle store for AE-CHALLENGE-v1.
4
- *
5
- * Registration is atomic insert-if-absent. Consumption is an atomic transition
6
- * from the digest of the exact registered body to a consumed state carrying
7
- * that same digest. A presenter that changes action, profile, expiry, or any
8
- * other challenge member cannot consume the original registration even when it
9
- * reuses the challenge id and nonce.
10
- */
11
- import { hashCanonical } from './execution-binding.js';
12
-
13
- export const DURABLE_CHALLENGE_STORE_VERSION = 'EP-DURABLE-CHALLENGE-STORE-v1';
14
- const OPEN_PREFIX = 'challenge-open:v1:';
15
- const CONSUMED_PREFIX = 'challenge-consumed:v1:';
16
-
17
- function assertChallenge(challenge) {
18
- if (!challenge || typeof challenge !== 'object' || Array.isArray(challenge)) {
19
- throw new Error('challenge must be an object');
20
- }
21
- if (challenge['@version'] !== 'AE-CHALLENGE-v1') throw new Error('unsupported challenge version');
22
- if (typeof challenge.challenge_id !== 'string' || !challenge.challenge_id.trim()) throw new Error('challenge_id is required');
23
- if (typeof challenge.nonce !== 'string' || !challenge.nonce.trim()) throw new Error('challenge nonce is required');
24
- }
25
-
26
- export function challengeStorageKey(challenge) {
27
- assertChallenge(challenge);
28
- return `ae-challenge:${hashCanonical({ challenge_id: challenge.challenge_id, nonce: challenge.nonce })}`;
29
- }
30
-
31
- export function challengeBodyDigest(challenge) {
32
- assertChallenge(challenge);
33
- return hashCanonical(challenge);
34
- }
35
-
36
- export function createDurableChallengeStore(backend) {
37
- for (const method of ['addIfAbsent', 'compareAndSet', 'has']) {
38
- if (typeof backend?.[method] !== 'function') {
39
- throw new Error(`createDurableChallengeStore: backend must implement atomic async ${method}()`);
40
- }
41
- }
42
-
43
- return {
44
- durable: backend.durable === true,
45
- atomicRegistration: true,
46
- bodyBound: true,
47
- permanentConsumption: true,
48
- async register(challenge) {
49
- const key = challengeStorageKey(challenge);
50
- const digest = challengeBodyDigest(challenge);
51
- return (await backend.addIfAbsent(key, `${OPEN_PREFIX}${digest}`)) === true;
52
- },
53
-
54
- async consume(challenge) {
55
- const key = challengeStorageKey(challenge);
56
- const digest = challengeBodyDigest(challenge);
57
- return (await backend.compareAndSet(
58
- key,
59
- `${OPEN_PREFIX}${digest}`,
60
- `${CONSUMED_PREFIX}${digest}`,
61
- )) === true;
62
- },
63
-
64
- async has(challenge) {
65
- return (await backend.has(challengeStorageKey(challenge))) === true;
66
- },
67
- };
68
- }
69
-
70
- export default { createDurableChallengeStore, challengeStorageKey, challengeBodyDigest, DURABLE_CHALLENGE_STORE_VERSION };
2
+ // Compatibility entry point for the TypeScript challenge-store module.
3
+ export * from './dist/challenge-store.js';
4
+ export { default } from './dist/challenge-store.js';
package/control-plane.js CHANGED
@@ -1,341 +1,4 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /**
3
- * Vendor-neutral orchestration for Gate coverage, evidence completeness, and
4
- * usage metering. Enforcement still happens at each executor-side Gate. This
5
- * module cannot turn an observation or dashboard decision into authorization.
6
- */
7
- import { canonicalize, hashCanonical } from './execution-binding.js';
8
- import { coverageInventoryDigest, evaluateGateCoverage } from './coverage.js';
9
- import { evaluateSettlementEligibility } from './settlement.js';
10
- import { meterUsage, buildUsageStatement } from './metering.js';
11
- import { acceptNetworkWitnessStatement, networkWitnessDigest } from './network-witness.js';
12
-
13
- export const CONTROL_PLANE_REPORT_VERSION = 'EP-GATE-CONTROL-PLANE-REPORT-v1';
14
- export const CONTROL_PLANE_MAX_SETTLEMENTS = 10_000;
15
- const MAX_COVERAGE_EVIDENCE_ITEMS = 50_000;
16
-
17
- function isPlainObject(value) {
18
- if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;
19
- const prototype = Object.getPrototypeOf(value);
20
- return prototype === Object.prototype || prototype === null;
21
- }
22
-
23
- function digest(value) {
24
- return `sha256:${hashCanonical(value)}`;
25
- }
26
-
27
- function witnessArtifactKey(statement) {
28
- try { return digest(statement); } catch { return null; }
29
- }
30
-
31
- function immutableCanonicalSnapshot(value) {
32
- const snapshot = JSON.parse(canonicalize(value));
33
- const stack = [snapshot];
34
- while (stack.length) {
35
- const current = stack.pop();
36
- if (current && typeof current === 'object') {
37
- for (const child of Object.values(current)) stack.push(child);
38
- Object.freeze(current);
39
- }
40
- }
41
- return snapshot;
42
- }
43
-
44
- function snapshotExpectedProbeNonces(value, inventory) {
45
- if (value === undefined || value === null) return null;
46
- if (value instanceof Map) {
47
- const selected = Object.create(null);
48
- for (const surface of Array.isArray(inventory?.surfaces) ? inventory.surfaces : []) {
49
- if (value.has(surface.surface_id)) selected[surface.surface_id] = value.get(surface.surface_id);
50
- }
51
- return immutableCanonicalSnapshot(selected);
52
- }
53
- return immutableCanonicalSnapshot(value);
54
- }
55
-
56
- function snapshotSettlementItems(items) {
57
- const ownKeys = Reflect.ownKeys(items);
58
- if (ownKeys.length !== items.length + 1 || !ownKeys.includes('length')) {
59
- throw new TypeError('settlement collection must be a dense data array');
60
- }
61
- const snapshots = [];
62
- for (let i = 0; i < items.length; i++) {
63
- const descriptor = Object.getOwnPropertyDescriptor(items, String(i));
64
- if (!descriptor || descriptor.enumerable !== true || !Object.hasOwn(descriptor, 'value')) {
65
- throw new TypeError('settlement collection contains an accessor');
66
- }
67
- snapshots.push(immutableCanonicalSnapshot(descriptor.value));
68
- }
69
- return Object.freeze(snapshots);
70
- }
71
-
72
- /**
73
- * Produce one reproducible control-plane view. The signed/verified subartifacts
74
- * remain independently portable; this report joins only their digests and
75
- * closed verdicts.
76
- */
77
- export async function evaluateGateControlPlane(input = {}, options = {}) {
78
- const now = options.now === undefined ? Date.now() : Number(options.now);
79
- if (!Number.isFinite(now)) throw new TypeError('control-plane now must be finite');
80
-
81
- let coverageInventory;
82
- let settlementProfile;
83
- let pinnedProbes;
84
- let pinnedWitnesses;
85
- let expectedProbeNonces;
86
- let probeMaxAgeSec;
87
- let witnessMaxAgeSec;
88
- let maxFutureSkewSec;
89
- let allowEphemeralWitnessStore;
90
- let configuredTrustedAcceptances;
91
- let configurationError = null;
92
- try {
93
- coverageInventory = options.coverageInventory === undefined
94
- ? undefined
95
- : immutableCanonicalSnapshot(options.coverageInventory);
96
- settlementProfile = options.settlementProfile === undefined
97
- ? undefined
98
- : immutableCanonicalSnapshot(options.settlementProfile);
99
- pinnedProbes = options.pinnedProbes === undefined
100
- ? undefined
101
- : immutableCanonicalSnapshot(options.pinnedProbes);
102
- pinnedWitnesses = options.pinnedWitnesses === undefined
103
- ? undefined
104
- : immutableCanonicalSnapshot(options.pinnedWitnesses);
105
- expectedProbeNonces = snapshotExpectedProbeNonces(options.expectedProbeNonces, coverageInventory);
106
- probeMaxAgeSec = options.probeMaxAgeSec;
107
- witnessMaxAgeSec = options.witnessMaxAgeSec;
108
- maxFutureSkewSec = options.maxFutureSkewSec;
109
- allowEphemeralWitnessStore = options.allowEphemeralWitnessStore === true;
110
- const trustedInput = options.trustedWitnessAcceptances;
111
- if (trustedInput !== undefined
112
- && (!Array.isArray(trustedInput) || trustedInput.length > MAX_COVERAGE_EVIDENCE_ITEMS)) {
113
- throw new TypeError('trusted witness acceptance collection is invalid');
114
- }
115
- configuredTrustedAcceptances = [];
116
- for (const acceptance of Array.isArray(trustedInput) ? trustedInput : []) {
117
- configuredTrustedAcceptances.push(immutableCanonicalSnapshot(acceptance));
118
- }
119
- Object.freeze(configuredTrustedAcceptances);
120
- } catch {
121
- configurationError = 'rp_configuration_invalid';
122
- coverageInventory = null;
123
- settlementProfile = null;
124
- pinnedProbes = [];
125
- pinnedWitnesses = [];
126
- expectedProbeNonces = null;
127
- configuredTrustedAcceptances = Object.freeze([]);
128
- allowEphemeralWitnessStore = false;
129
- }
130
-
131
- let attestationVerifiers;
132
- let witnessSequenceStore;
133
- let verifyAuthorization;
134
- let verifyExecution;
135
- let verifyOutcome;
136
- try {
137
- attestationVerifiers = options.attestationVerifiers;
138
- witnessSequenceStore = options.witnessSequenceStore;
139
- verifyAuthorization = options.verifyAuthorization;
140
- verifyExecution = options.verifyExecution;
141
- verifyOutcome = options.verifyOutcome;
142
- } catch {
143
- configurationError = 'rp_configuration_invalid';
144
- }
145
-
146
- let settlementItems = [];
147
- let settlementError = null;
148
- try {
149
- const presentedSettlements = input.settlements;
150
- if (presentedSettlements !== undefined) {
151
- if (!Array.isArray(presentedSettlements)) {
152
- settlementError = 'settlements_invalid';
153
- } else if (presentedSettlements.length > CONTROL_PLANE_MAX_SETTLEMENTS) {
154
- settlementError = 'settlements_limit_exceeded';
155
- } else {
156
- settlementItems = snapshotSettlementItems(presentedSettlements);
157
- }
158
- }
159
- } catch {
160
- settlementItems = [];
161
- settlementError = 'settlements_hostile_input';
162
- }
163
-
164
- let coverageInput = {};
165
- try {
166
- const presentedCoverage = input.coverage;
167
- if (isPlainObject(presentedCoverage)) coverageInput = presentedCoverage;
168
- } catch { /* coverage will remain closed with no evidence */ }
169
-
170
- let usageInput;
171
- let usageError = null;
172
- try {
173
- const presentedUsage = input.usage;
174
- usageInput = presentedUsage === undefined
175
- ? undefined
176
- : immutableCanonicalSnapshot(presentedUsage);
177
- } catch { usageError = 'usage_statement_refused'; }
178
-
179
- // Evidence is presenter-controlled; policy and pins above are immutable RP
180
- // snapshots. No bundle can select a weaker configuration while work awaits.
181
- const trustedByStatementDigest = new Map();
182
- for (const acceptance of configuredTrustedAcceptances) {
183
- if (typeof acceptance.statement_digest === 'string') {
184
- trustedByStatementDigest.set(acceptance.statement_digest, acceptance);
185
- }
186
- }
187
- const coverageAcceptanceByArtifact = new Map();
188
- const acceptanceForStatement = (statement) => {
189
- const artifactKey = witnessArtifactKey(statement);
190
- if (artifactKey && coverageAcceptanceByArtifact.has(artifactKey)) {
191
- return { found: true, acceptance: coverageAcceptanceByArtifact.get(artifactKey), artifactKey };
192
- }
193
- try {
194
- const statementDigest = networkWitnessDigest(statement);
195
- if (trustedByStatementDigest.has(statementDigest)) {
196
- return { found: true, acceptance: trustedByStatementDigest.get(statementDigest), artifactKey };
197
- }
198
- } catch { /* raw ingestion will refuse malformed statements */ }
199
- return { found: false, acceptance: null, artifactKey };
200
- };
201
-
202
- // Coverage and settlement may reference the same witness statement. Consume
203
- // each coverage statement once, then reuse only this RP-side ingestion result.
204
- let coverageWitnesses = null;
205
- try {
206
- coverageInventoryDigest(coverageInventory);
207
- const evidenceListsValid = ['deployments', 'probes', 'witnesses'].every((field) => {
208
- const value = coverageInput[field];
209
- return value === undefined || (Array.isArray(value) && value.length <= MAX_COVERAGE_EVIDENCE_ITEMS);
210
- });
211
- if (evidenceListsValid) {
212
- const presentedWitnesses = Array.isArray(coverageInput.witnesses) ? coverageInput.witnesses : [];
213
- if (presentedWitnesses.length + configuredTrustedAcceptances.length <= MAX_COVERAGE_EVIDENCE_ITEMS) {
214
- coverageWitnesses = presentedWitnesses.map((statement) => immutableCanonicalSnapshot(statement));
215
- }
216
- }
217
- } catch { /* coverage owns the closed invalid-input report */ }
218
-
219
- const coverageIngestionResults = [];
220
- if (coverageWitnesses) {
221
- for (const statement of coverageWitnesses) {
222
- const existing = acceptanceForStatement(statement);
223
- const acceptance = existing.found
224
- ? existing.acceptance
225
- : await acceptNetworkWitnessStatement(statement, {
226
- pinnedWitnesses,
227
- maxAgeSec: witnessMaxAgeSec,
228
- maxFutureSkewSec,
229
- now,
230
- sequenceStore: witnessSequenceStore,
231
- allowEphemeralStore: allowEphemeralWitnessStore,
232
- });
233
- if (existing.artifactKey) coverageAcceptanceByArtifact.set(existing.artifactKey, acceptance);
234
- coverageIngestionResults.push(acceptance);
235
- }
236
- }
237
- const coverageEvidence = coverageWitnesses
238
- ? { ...coverageInput, witnesses: [] }
239
- : coverageInput;
240
- const coverage = await evaluateGateCoverage({
241
- ...coverageEvidence,
242
- inventory: coverageInventory,
243
- }, {
244
- now,
245
- attestationVerifiers,
246
- pinnedProbes,
247
- pinnedWitnesses,
248
- expectedProbeNonces,
249
- probeMaxAgeSec,
250
- witnessMaxAgeSec,
251
- maxFutureSkewSec,
252
- witnessSequenceStore,
253
- allowEphemeralWitnessStore,
254
- trustedWitnessAcceptances: [
255
- ...configuredTrustedAcceptances,
256
- ...coverageIngestionResults,
257
- ],
258
- });
259
-
260
- const settlements = [];
261
- for (const item of settlementItems) {
262
- const bundle = isPlainObject(item?.bundle) ? item.bundle : {};
263
- const surfaceId = bundle?.coverage?.surface_id;
264
- const verifyCoverage = async () => {
265
- const row = Array.isArray(coverage.surfaces)
266
- ? coverage.surfaces.find((candidate) => candidate.surface_id === surfaceId)
267
- : null;
268
- if (!row) return { accepted: false, reason: 'surface_not_in_pinned_inventory' };
269
- return {
270
- accepted: row.complete === true,
271
- state: row.state,
272
- surface_id: row.surface_id,
273
- report_hash: coverage.report_hash,
274
- reason: row.complete ? null : row.reason,
275
- };
276
- };
277
- const settlementOptions = {
278
- profile: settlementProfile,
279
- now,
280
- pinnedWitnesses,
281
- witnessMaxAgeSec,
282
- maxFutureSkewSec,
283
- witnessSequenceStore,
284
- allowEphemeralWitnessStore,
285
- verifyAuthorization,
286
- verifyExecution,
287
- verifyOutcome,
288
- verifyCoverage,
289
- };
290
- if (settlementProfile?.require_witness === true) {
291
- const trusted = acceptanceForStatement(bundle.witness);
292
- if (trusted.found) settlementOptions.trustedWitnessAcceptance = trusted.acceptance;
293
- }
294
- settlements.push(await evaluateSettlementEligibility(bundle, settlementOptions));
295
- }
296
-
297
- let usage = null;
298
- if (usageInput !== undefined && !usageError) {
299
- try {
300
- const metered = meterUsage(usageInput?.entries ?? [], usageInput?.period ?? {});
301
- usage = buildUsageStatement(metered, { org: usageInput?.org });
302
- } catch {
303
- usageError = 'usage_statement_refused';
304
- }
305
- }
306
-
307
- const summary = {
308
- '@version': CONTROL_PLANE_REPORT_VERSION,
309
- generated_at: new Date(now).toISOString(),
310
- coverage_report_hash: coverage.report_hash ?? null,
311
- coverage_complete: coverage.complete === true,
312
- settlement_input_complete: settlementError === null,
313
- settlement_results: settlements.map((result) => ({
314
- action_digest: result.action_digest,
315
- verdict: result.verdict,
316
- eligible: result.eligible === true,
317
- result_hash: result.result_hash,
318
- })),
319
- usage_statement_hash: usage?.content_hash ? `sha256:${usage.content_hash}` : null,
320
- usage_complete: usage?.complete === true,
321
- ...(configurationError ? { configuration_error: configurationError } : {}),
322
- ...(settlementError ? { settlement_error: settlementError } : {}),
323
- ...(usageError ? { usage_error: usageError } : {}),
324
- limitations: [
325
- 'The control plane coordinates policy, evidence, coverage, metering, and settlement eligibility; executor-side Gates remain the only enforcement points.',
326
- 'Coverage is bounded by the relying-party-declared inventory, and a passive witness never upgrades a surface to gated.',
327
- 'Witness-dependent decisions require durable sequence ingestion or an explicitly relying-party-trusted acceptance result.',
328
- ],
329
- };
330
- return Object.freeze({
331
- ...summary,
332
- control_plane_digest: digest(summary),
333
- artifacts: Object.freeze({ coverage, settlements, usage }),
334
- });
335
- }
336
-
337
- export default {
338
- CONTROL_PLANE_REPORT_VERSION,
339
- CONTROL_PLANE_MAX_SETTLEMENTS,
340
- evaluateGateControlPlane,
341
- };
2
+ // Compatibility entry point for the TypeScript control-plane module.
3
+ export * from './dist/control-plane.js';
4
+ export { default } from './dist/control-plane.js';