agent-passport-system 2.6.0-alpha.8 → 2.6.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -7
- package/dist/src/adapters/oauth-rfc8693/index.d.ts +144 -0
- package/dist/src/adapters/oauth-rfc8693/index.d.ts.map +1 -0
- package/dist/src/adapters/oauth-rfc8693/index.js +450 -0
- package/dist/src/adapters/oauth-rfc8693/index.js.map +1 -0
- package/dist/src/adapters/oauth-rfc8693/types.d.ts +133 -0
- package/dist/src/adapters/oauth-rfc8693/types.d.ts.map +1 -0
- package/dist/src/adapters/oauth-rfc8693/types.js +28 -0
- package/dist/src/adapters/oauth-rfc8693/types.js.map +1 -0
- package/dist/src/adapters/remote-signer/handle-signer.d.ts +34 -0
- package/dist/src/adapters/remote-signer/handle-signer.d.ts.map +1 -0
- package/dist/src/adapters/remote-signer/handle-signer.js +70 -0
- package/dist/src/adapters/remote-signer/handle-signer.js.map +1 -0
- package/dist/src/adapters/remote-signer/index.d.ts +14 -0
- package/dist/src/adapters/remote-signer/index.d.ts.map +1 -0
- package/dist/src/adapters/remote-signer/index.js +56 -0
- package/dist/src/adapters/remote-signer/index.js.map +1 -0
- package/dist/src/adapters/remote-signer/local-signer.d.ts +24 -0
- package/dist/src/adapters/remote-signer/local-signer.d.ts.map +1 -0
- package/dist/src/adapters/remote-signer/local-signer.js +57 -0
- package/dist/src/adapters/remote-signer/local-signer.js.map +1 -0
- package/dist/src/adapters/remote-signer/types.d.ts +61 -0
- package/dist/src/adapters/remote-signer/types.d.ts.map +1 -0
- package/dist/src/adapters/remote-signer/types.js +52 -0
- package/dist/src/adapters/remote-signer/types.js.map +1 -0
- package/dist/src/adapters/remote-signer/verify.d.ts +12 -0
- package/dist/src/adapters/remote-signer/verify.d.ts.map +1 -0
- package/dist/src/adapters/remote-signer/verify.js +25 -0
- package/dist/src/adapters/remote-signer/verify.js.map +1 -0
- package/dist/src/core/bilateral-receipt.d.ts +8 -0
- package/dist/src/core/bilateral-receipt.d.ts.map +1 -1
- package/dist/src/core/bilateral-receipt.js +2 -0
- package/dist/src/core/bilateral-receipt.js.map +1 -1
- package/dist/src/core/denial-domains.d.ts.map +1 -1
- package/dist/src/core/denial-domains.js +2 -0
- package/dist/src/core/denial-domains.js.map +1 -1
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/types/bilateral-receipt.d.ts +9 -0
- package/dist/src/types/bilateral-receipt.d.ts.map +1 -1
- package/dist/src/types/gateway.d.ts +1 -1
- package/dist/src/types/gateway.d.ts.map +1 -1
- package/dist/src/types/passport.d.ts +6 -0
- package/dist/src/types/passport.d.ts.map +1 -1
- package/dist/src/types/passport.js.map +1 -1
- package/dist/src/types/policy.d.ts +77 -1
- package/dist/src/types/policy.d.ts.map +1 -1
- package/dist/src/v2/assurance/descriptor.d.ts +207 -0
- package/dist/src/v2/assurance/descriptor.d.ts.map +1 -0
- package/dist/src/v2/assurance/descriptor.js +282 -0
- package/dist/src/v2/assurance/descriptor.js.map +1 -0
- package/dist/src/v2/assurance/shares-root.d.ts +82 -0
- package/dist/src/v2/assurance/shares-root.d.ts.map +1 -0
- package/dist/src/v2/assurance/shares-root.js +167 -0
- package/dist/src/v2/assurance/shares-root.js.map +1 -0
- package/dist/src/v2/audience-binding/index.d.ts +9 -0
- package/dist/src/v2/audience-binding/index.d.ts.map +1 -0
- package/dist/src/v2/audience-binding/index.js +24 -0
- package/dist/src/v2/audience-binding/index.js.map +1 -0
- package/dist/src/v2/audience-binding/reconcile.d.ts +85 -0
- package/dist/src/v2/audience-binding/reconcile.d.ts.map +1 -0
- package/dist/src/v2/audience-binding/reconcile.js +108 -0
- package/dist/src/v2/audience-binding/reconcile.js.map +1 -0
- package/dist/src/v2/audience-binding/request-binding.d.ts +69 -0
- package/dist/src/v2/audience-binding/request-binding.d.ts.map +1 -0
- package/dist/src/v2/audience-binding/request-binding.js +88 -0
- package/dist/src/v2/audience-binding/request-binding.js.map +1 -0
- package/dist/src/v2/audience-binding/types.d.ts +102 -0
- package/dist/src/v2/audience-binding/types.d.ts.map +1 -0
- package/dist/src/v2/audience-binding/types.js +35 -0
- package/dist/src/v2/audience-binding/types.js.map +1 -0
- package/dist/src/v2/audience-binding/verify.d.ts +71 -0
- package/dist/src/v2/audience-binding/verify.d.ts.map +1 -0
- package/dist/src/v2/audience-binding/verify.js +147 -0
- package/dist/src/v2/audience-binding/verify.js.map +1 -0
- package/dist/src/v2/delegation-v2.d.ts +14 -0
- package/dist/src/v2/delegation-v2.d.ts.map +1 -1
- package/dist/src/v2/delegation-v2.js +8 -0
- package/dist/src/v2/delegation-v2.js.map +1 -1
- package/dist/src/v2/feasibility/__tests__/feasibility.test.d.ts +2 -0
- package/dist/src/v2/feasibility/__tests__/feasibility.test.d.ts.map +1 -0
- package/dist/src/v2/feasibility/__tests__/feasibility.test.js +232 -0
- package/dist/src/v2/feasibility/__tests__/feasibility.test.js.map +1 -0
- package/dist/src/v2/feasibility/compiler.d.ts +55 -0
- package/dist/src/v2/feasibility/compiler.d.ts.map +1 -0
- package/dist/src/v2/feasibility/compiler.js +266 -0
- package/dist/src/v2/feasibility/compiler.js.map +1 -0
- package/dist/src/v2/feasibility/index.d.ts +6 -0
- package/dist/src/v2/feasibility/index.d.ts.map +1 -0
- package/dist/src/v2/feasibility/index.js +22 -0
- package/dist/src/v2/feasibility/index.js.map +1 -0
- package/dist/src/v2/feasibility/ir.d.ts +58 -0
- package/dist/src/v2/feasibility/ir.d.ts.map +1 -0
- package/dist/src/v2/feasibility/ir.js +18 -0
- package/dist/src/v2/feasibility/ir.js.map +1 -0
- package/dist/src/v2/feasibility/proof-ref.d.ts +38 -0
- package/dist/src/v2/feasibility/proof-ref.d.ts.map +1 -0
- package/dist/src/v2/feasibility/proof-ref.js +73 -0
- package/dist/src/v2/feasibility/proof-ref.js.map +1 -0
- package/dist/src/v2/hash-pointer/bbs-bridge.d.ts +27 -0
- package/dist/src/v2/hash-pointer/bbs-bridge.d.ts.map +1 -0
- package/dist/src/v2/hash-pointer/bbs-bridge.js +58 -0
- package/dist/src/v2/hash-pointer/bbs-bridge.js.map +1 -0
- package/dist/src/v2/hash-pointer/index.d.ts +6 -0
- package/dist/src/v2/hash-pointer/index.d.ts.map +1 -0
- package/dist/src/v2/hash-pointer/index.js +23 -0
- package/dist/src/v2/hash-pointer/index.js.map +1 -0
- package/dist/src/v2/hash-pointer/profile.d.ts +49 -0
- package/dist/src/v2/hash-pointer/profile.d.ts.map +1 -0
- package/dist/src/v2/hash-pointer/profile.js +231 -0
- package/dist/src/v2/hash-pointer/profile.js.map +1 -0
- package/dist/src/v2/hash-pointer/types.d.ts +172 -0
- package/dist/src/v2/hash-pointer/types.d.ts.map +1 -0
- package/dist/src/v2/hash-pointer/types.js +30 -0
- package/dist/src/v2/hash-pointer/types.js.map +1 -0
- package/dist/src/v2/human-oversight/descriptor.d.ts +79 -0
- package/dist/src/v2/human-oversight/descriptor.d.ts.map +1 -0
- package/dist/src/v2/human-oversight/descriptor.js +77 -0
- package/dist/src/v2/human-oversight/descriptor.js.map +1 -0
- package/dist/src/v2/human-oversight/index.d.ts +87 -0
- package/dist/src/v2/human-oversight/index.d.ts.map +1 -0
- package/dist/src/v2/human-oversight/index.js +313 -0
- package/dist/src/v2/human-oversight/index.js.map +1 -0
- package/dist/src/v2/human-oversight/types.d.ts +62 -0
- package/dist/src/v2/human-oversight/types.d.ts.map +1 -0
- package/dist/src/v2/human-oversight/types.js +19 -0
- package/dist/src/v2/human-oversight/types.js.map +1 -0
- package/dist/src/v2/index.d.ts +4 -0
- package/dist/src/v2/index.d.ts.map +1 -1
- package/dist/src/v2/index.js +13 -0
- package/dist/src/v2/index.js.map +1 -1
- package/dist/src/v2/key-resolution/base64url.d.ts +16 -0
- package/dist/src/v2/key-resolution/base64url.d.ts.map +1 -0
- package/dist/src/v2/key-resolution/base64url.js +73 -0
- package/dist/src/v2/key-resolution/base64url.js.map +1 -0
- package/dist/src/v2/key-resolution/did-cycles.d.ts +53 -0
- package/dist/src/v2/key-resolution/did-cycles.d.ts.map +1 -0
- package/dist/src/v2/key-resolution/did-cycles.js +167 -0
- package/dist/src/v2/key-resolution/did-cycles.js.map +1 -0
- package/dist/src/v2/key-resolution/index.d.ts +6 -0
- package/dist/src/v2/key-resolution/index.d.ts.map +1 -0
- package/dist/src/v2/key-resolution/index.js +36 -0
- package/dist/src/v2/key-resolution/index.js.map +1 -0
- package/dist/src/v2/key-resolution/resolver.d.ts +39 -0
- package/dist/src/v2/key-resolution/resolver.d.ts.map +1 -0
- package/dist/src/v2/key-resolution/resolver.js +399 -0
- package/dist/src/v2/key-resolution/resolver.js.map +1 -0
- package/dist/src/v2/key-resolution/types.d.ts +148 -0
- package/dist/src/v2/key-resolution/types.d.ts.map +1 -0
- package/dist/src/v2/key-resolution/types.js +26 -0
- package/dist/src/v2/key-resolution/types.js.map +1 -0
- package/dist/src/v2/offline-verifier/conformance-runner.d.ts +43 -0
- package/dist/src/v2/offline-verifier/conformance-runner.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/conformance-runner.js +169 -0
- package/dist/src/v2/offline-verifier/conformance-runner.js.map +1 -0
- package/dist/src/v2/offline-verifier/context.d.ts +47 -0
- package/dist/src/v2/offline-verifier/context.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/context.js +98 -0
- package/dist/src/v2/offline-verifier/context.js.map +1 -0
- package/dist/src/v2/offline-verifier/descriptor-interface.d.ts +6 -0
- package/dist/src/v2/offline-verifier/descriptor-interface.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/descriptor-interface.js +19 -0
- package/dist/src/v2/offline-verifier/descriptor-interface.js.map +1 -0
- package/dist/src/v2/offline-verifier/descriptor.d.ts +2 -0
- package/dist/src/v2/offline-verifier/descriptor.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/descriptor.js +18 -0
- package/dist/src/v2/offline-verifier/descriptor.js.map +1 -0
- package/dist/src/v2/offline-verifier/index.d.ts +7 -0
- package/dist/src/v2/offline-verifier/index.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/index.js +24 -0
- package/dist/src/v2/offline-verifier/index.js.map +1 -0
- package/dist/src/v2/offline-verifier/middleware.d.ts +71 -0
- package/dist/src/v2/offline-verifier/middleware.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/middleware.js +113 -0
- package/dist/src/v2/offline-verifier/middleware.js.map +1 -0
- package/dist/src/v2/offline-verifier/verify.d.ts +64 -0
- package/dist/src/v2/offline-verifier/verify.d.ts.map +1 -0
- package/dist/src/v2/offline-verifier/verify.js +128 -0
- package/dist/src/v2/offline-verifier/verify.js.map +1 -0
- package/dist/src/v2/payment-rails/cycles/evidence-resolution.d.ts +164 -0
- package/dist/src/v2/payment-rails/cycles/evidence-resolution.d.ts.map +1 -0
- package/dist/src/v2/payment-rails/cycles/evidence-resolution.js +205 -0
- package/dist/src/v2/payment-rails/cycles/evidence-resolution.js.map +1 -0
- package/dist/src/v2/payment-rails/cycles/index.d.ts +22 -0
- package/dist/src/v2/payment-rails/cycles/index.d.ts.map +1 -1
- package/dist/src/v2/payment-rails/cycles/index.js +28 -0
- package/dist/src/v2/payment-rails/cycles/index.js.map +1 -1
- package/dist/src/v2/payment-rails/cycles/types.d.ts +25 -0
- package/dist/src/v2/payment-rails/cycles/types.d.ts.map +1 -1
- package/dist/src/v2/payment-rails/index.d.ts +3 -1
- package/dist/src/v2/payment-rails/index.d.ts.map +1 -1
- package/dist/src/v2/payment-rails/index.js +1 -1
- package/dist/src/v2/payment-rails/index.js.map +1 -1
- package/dist/src/v2/policy-bundle/bundle.d.ts +116 -0
- package/dist/src/v2/policy-bundle/bundle.d.ts.map +1 -0
- package/dist/src/v2/policy-bundle/bundle.js +295 -0
- package/dist/src/v2/policy-bundle/bundle.js.map +1 -0
- package/dist/src/v2/policy-bundle/index.d.ts +16 -0
- package/dist/src/v2/policy-bundle/index.d.ts.map +1 -0
- package/dist/src/v2/policy-bundle/index.js +14 -0
- package/dist/src/v2/policy-bundle/index.js.map +1 -0
- package/dist/src/v2/policy-bundle/tar.d.ts +37 -0
- package/dist/src/v2/policy-bundle/tar.d.ts.map +1 -0
- package/dist/src/v2/policy-bundle/tar.js +176 -0
- package/dist/src/v2/policy-bundle/tar.js.map +1 -0
- package/dist/src/v2/policy-bundle/types.d.ts +105 -0
- package/dist/src/v2/policy-bundle/types.d.ts.map +1 -0
- package/dist/src/v2/policy-bundle/types.js +17 -0
- package/dist/src/v2/policy-bundle/types.js.map +1 -0
- package/dist/src/v2/revocation-enforcement/index.d.ts +133 -0
- package/dist/src/v2/revocation-enforcement/index.d.ts.map +1 -0
- package/dist/src/v2/revocation-enforcement/index.js +318 -0
- package/dist/src/v2/revocation-enforcement/index.js.map +1 -0
- package/dist/src/v2/revocation-enforcement/types.d.ts +147 -0
- package/dist/src/v2/revocation-enforcement/types.d.ts.map +1 -0
- package/dist/src/v2/revocation-enforcement/types.js +20 -0
- package/dist/src/v2/revocation-enforcement/types.js.map +1 -0
- package/dist/src/v2/scope-registry/__tests__/scope-registry.test.d.ts +2 -0
- package/dist/src/v2/scope-registry/__tests__/scope-registry.test.d.ts.map +1 -0
- package/dist/src/v2/scope-registry/__tests__/scope-registry.test.js +200 -0
- package/dist/src/v2/scope-registry/__tests__/scope-registry.test.js.map +1 -0
- package/dist/src/v2/scope-registry/index.d.ts +4 -0
- package/dist/src/v2/scope-registry/index.d.ts.map +1 -0
- package/dist/src/v2/scope-registry/index.js +20 -0
- package/dist/src/v2/scope-registry/index.js.map +1 -0
- package/dist/src/v2/scope-registry/registry.d.ts +41 -0
- package/dist/src/v2/scope-registry/registry.d.ts.map +1 -0
- package/dist/src/v2/scope-registry/registry.js +278 -0
- package/dist/src/v2/scope-registry/registry.js.map +1 -0
- package/dist/src/v2/scope-registry/types.d.ts +95 -0
- package/dist/src/v2/scope-registry/types.d.ts.map +1 -0
- package/dist/src/v2/scope-registry/types.js +23 -0
- package/dist/src/v2/scope-registry/types.js.map +1 -0
- package/dist/src/v2/transport/rfc9421/index.d.ts +5 -0
- package/dist/src/v2/transport/rfc9421/index.d.ts.map +1 -0
- package/dist/src/v2/transport/rfc9421/index.js +12 -0
- package/dist/src/v2/transport/rfc9421/index.js.map +1 -0
- package/dist/src/v2/transport/rfc9421/profile.d.ts +109 -0
- package/dist/src/v2/transport/rfc9421/profile.d.ts.map +1 -0
- package/dist/src/v2/transport/rfc9421/profile.js +280 -0
- package/dist/src/v2/transport/rfc9421/profile.js.map +1 -0
- package/dist/src/v2/transport/rfc9421/signature-base.d.ts +59 -0
- package/dist/src/v2/transport/rfc9421/signature-base.d.ts.map +1 -0
- package/dist/src/v2/transport/rfc9421/signature-base.js +150 -0
- package/dist/src/v2/transport/rfc9421/signature-base.js.map +1 -0
- package/dist/src/v2/transport/rfc9421/types.d.ts +206 -0
- package/dist/src/v2/transport/rfc9421/types.d.ts.map +1 -0
- package/dist/src/v2/transport/rfc9421/types.js +24 -0
- package/dist/src/v2/transport/rfc9421/types.js.map +1 -0
- package/dist/src/v2/trust-policy/index.d.ts +9 -0
- package/dist/src/v2/trust-policy/index.d.ts.map +1 -0
- package/dist/src/v2/trust-policy/index.js +52 -0
- package/dist/src/v2/trust-policy/index.js.map +1 -0
- package/dist/src/v2/trust-policy/policy.d.ts +34 -0
- package/dist/src/v2/trust-policy/policy.d.ts.map +1 -0
- package/dist/src/v2/trust-policy/policy.js +72 -0
- package/dist/src/v2/trust-policy/policy.js.map +1 -0
- package/dist/src/v2/trust-policy/types.d.ts +164 -0
- package/dist/src/v2/trust-policy/types.d.ts.map +1 -0
- package/dist/src/v2/trust-policy/types.js +26 -0
- package/dist/src/v2/trust-policy/types.js.map +1 -0
- package/dist/src/v2/trust-policy/verdict.d.ts +34 -0
- package/dist/src/v2/trust-policy/verdict.d.ts.map +1 -0
- package/dist/src/v2/trust-policy/verdict.js +259 -0
- package/dist/src/v2/trust-policy/verdict.js.map +1 -0
- package/dist/src/v2/trust-policy/well-known.d.ts +53 -0
- package/dist/src/v2/trust-policy/well-known.d.ts.map +1 -0
- package/dist/src/v2/trust-policy/well-known.js +78 -0
- package/dist/src/v2/trust-policy/well-known.js.map +1 -0
- package/dist/src/v2/types.d.ts +10 -0
- package/dist/src/v2/types.d.ts.map +1 -1
- package/dist/src/v2/verifier-hardening/index.d.ts +123 -0
- package/dist/src/v2/verifier-hardening/index.d.ts.map +1 -0
- package/dist/src/v2/verifier-hardening/index.js +241 -0
- package/dist/src/v2/verifier-hardening/index.js.map +1 -0
- package/dist/src/verification/verify.d.ts +7 -0
- package/dist/src/verification/verify.d.ts.map +1 -1
- package/dist/src/verification/verify.js +20 -2
- package/dist/src/verification/verify.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/agent-passport-system)
|
|
4
4
|
[](https://github.com/aeoess/agent-passport-system/blob/main/LICENSE)
|
|
5
|
-
[](https://github.com/aeoess/agent-passport-system)
|
|
6
6
|
[](https://doi.org/10.5281/zenodo.18749779)
|
|
7
7
|
|
|
8
8
|
> **For AI agents:** visit [aeoess.com/llms.txt](https://aeoess.com/llms.txt) for machine-readable docs.
|
|
@@ -19,7 +19,7 @@ npm install agent-passport-system
|
|
|
19
19
|
|
|
20
20
|
## Quick Start
|
|
21
21
|
|
|
22
|
-
Lead with the curated essentials. `agent-passport-system/core` exposes the ~25 functions that 90% of integrations need
|
|
22
|
+
Lead with the curated essentials. `agent-passport-system/core` exposes the ~25 functions that 90% of integrations need: identity, delegation, enforcement, commerce, reputation, key management. The full `agent-passport-system` root import is unchanged and backward compatible: pull from it when Core does not cover your case.
|
|
23
23
|
|
|
24
24
|
```typescript
|
|
25
25
|
import {
|
|
@@ -27,12 +27,22 @@ import {
|
|
|
27
27
|
evaluateIntent, commercePreflight, generateKeyPair
|
|
28
28
|
} from 'agent-passport-system/core'
|
|
29
29
|
|
|
30
|
-
// Full 936-export API still available
|
|
30
|
+
// Full 936-export API still available. Use when Core does not cover your case.
|
|
31
31
|
// import { ... } from 'agent-passport-system'
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
## Status labels
|
|
35
|
+
|
|
36
|
+
Every primitive in this README carries one of three labels so you know how much weight it can bear today.
|
|
37
|
+
|
|
38
|
+
- **Canonical** -- stable, signed-bytes frozen, covered by conformance fixtures. Breaking these would break cross-implementation verification. Build on them.
|
|
39
|
+
- **Production-Extension** -- shipped and tested, optional, additive to the canonical core. Safe in production; the surface may still grow.
|
|
40
|
+
- **Experimental** -- published for review and tested, but the shape may change. Pin a version before depending on it.
|
|
41
|
+
|
|
34
42
|
## Core Protocol
|
|
35
43
|
|
|
44
|
+
*Status: Canonical.*
|
|
45
|
+
|
|
36
46
|
What ships in every deployment.
|
|
37
47
|
|
|
38
48
|
**Identity** -- Ed25519 passports, passport grades 0-3, key rotation, did:aps identifiers.
|
|
@@ -47,10 +57,57 @@ What ships in every deployment.
|
|
|
47
57
|
|
|
48
58
|
## Receipt graph
|
|
49
59
|
|
|
50
|
-
APS receipts are graph-composable. Each claim links to the authority, policy, action, observation, or evidence it depends on, so a verifier can walk from any receipt back to its supporting facts and stop at the boundary it cares about. This is documentation of existing structure, not a new primitive
|
|
60
|
+
APS receipts are graph-composable. Each claim links to the authority, policy, action, observation, or evidence it depends on, so a verifier can walk from any receipt back to its supporting facts and stop at the boundary it cares about. This is documentation of existing structure, not a new primitive. The linkage already lives in the existing receipt envelopes (`delegation_chain_root`, `policy_ref`, `action_ref`, `evidence_id`, `bound_to`); the graph view is just how those edges compose.
|
|
61
|
+
|
|
62
|
+
## Receipt semantics: what each receipt proves
|
|
63
|
+
|
|
64
|
+
Every APS receipt is a signed declaration about what the system observed. It is not a causal proof of agent cognition, and it is not a proof that an off-protocol side effect actually happened. Each receipt type carries an explicit `scope_of_claim` with `asserts` and `does_not_assert` fields, so the boundary travels with the receipt. The boxes below state that boundary in one place. The same shape is enforced in code by the `ScopeOfClaim` type (`src/v2/accountability/types/base.ts`), re-exported from the package root.
|
|
65
|
+
|
|
66
|
+
**ActionReceipt** (`aps:action:v1`)
|
|
67
|
+
- Proves: the gateway observed the agent issue this action under the cited delegation chain, and the signed body has not changed since signing.
|
|
68
|
+
- Does not prove: that the side effect completed, that the agent understood the consequences, or that the business outcome was correct.
|
|
69
|
+
|
|
70
|
+
**AuthorityBoundaryReceipt** (`aps:authority_boundary:v1`)
|
|
71
|
+
- Proves: an authority check ran and returned this verdict against this scope at this time.
|
|
72
|
+
- Does not prove: that the scope itself was correctly configured, or that no other path around the boundary exists.
|
|
73
|
+
|
|
74
|
+
**CustodyReceipt** (`aps:custody:v1`)
|
|
75
|
+
- Proves: custody of the named artifact passed from one holder to another, signed by the releasing party.
|
|
76
|
+
- Does not prove: that the artifact contents are correct, or that the receiving party will handle it well.
|
|
77
|
+
|
|
78
|
+
**ContestabilityReceipt** (`aps:contestability:v1`)
|
|
79
|
+
- Proves: a contest was opened or resolved against a prior receipt, with the cited grounds.
|
|
80
|
+
- Does not prove: that the contest is meritorious, only that it was raised and recorded.
|
|
81
|
+
|
|
82
|
+
**APSBundle** (`aps:bundle:v1`)
|
|
83
|
+
- Proves: the bundled receipts were collected together and each member verifies on its own.
|
|
84
|
+
- Does not prove: anything the member receipts do not already prove. A bundle is an envelope, not a new claim.
|
|
85
|
+
|
|
86
|
+
**PaymentReceipt** (`aps:payment_receipt:v1`)
|
|
87
|
+
- Proves: a payment instruction was authorized on the named rail for this amount, currency, and recipient, under the cited delegation.
|
|
88
|
+
- Does not prove: that the goods or services were delivered, or that the recipient address was the intended one beyond what the matched intent declared.
|
|
89
|
+
|
|
90
|
+
Across all of them: a `self_attested` receipt (where the agent signed without independent attestation) carries lower evidentiary weight than a `gateway_observed` or `runtime_attested` one. A verifier should treat the `capture_mode` and `self_attested` fields as part of the claim, not metadata.
|
|
91
|
+
|
|
92
|
+
## Receipt misuse: what a verifier must reject
|
|
93
|
+
|
|
94
|
+
A valid signature is not a valid claim. The cases below are receipts that are cryptographically sound yet must still be refused, because they are being used outside the envelope they were issued for. The conformance package under [`tests/conformance/`](tests/conformance/README.md) ships a golden fixture for each one, and a test asserts the rejection reason.
|
|
95
|
+
|
|
96
|
+
- **Valid receipt, wrong claim.** A sound `aps:action:v1` receipt presented as proof of payment. The signature checks out; the receipt simply does not make that claim. Reject (`WRONG_CLAIM`).
|
|
97
|
+
- **Expired delegation.** A receipt issued after its delegation chain expired. The body verifies; the authority behind it had already lapsed. Reject (`DELEGATION_EXPIRED`).
|
|
98
|
+
- **Stale revocation.** A receipt whose delegation root was revoked. A verifier that does not consult current revocation state would wrongly accept it. Reject (`DELEGATION_REVOKED`).
|
|
99
|
+
- **Unverified external evidence.** A self-attested oracle read presented as gateway-observed evidence. `self_attested` evidence must not be promoted to observed evidence. Reject (`WRONG_CLAIM`).
|
|
100
|
+
- **Replayed receipt.** A previously accepted receipt re-submitted. The verifier must reject a `receipt_id` it has already honored in the window. Reject (`REPLAYED`).
|
|
101
|
+
- **Policy evaluated but execution never happened.** A policy decision exists with no execution attestation. A permit is not a proof that the action ran. Reject (`POLICY_NOT_EXECUTED`).
|
|
102
|
+
|
|
103
|
+
A conformant verifier runs the crypto layer first (claim type, `receipt_id` match, signature) and then the context layer (delegation state, budget, principal, policy version, replay window). A receipt that fails either layer is not authoritative.
|
|
104
|
+
|
|
105
|
+
> **Proof box.** These docs and fixtures specify what each receipt proves and the negatives a conformant verifier must reject. They do not change protocol behavior. No signing path, canonical preimage, or `action_ref` computation is altered by anything in this section.
|
|
51
106
|
|
|
52
107
|
## Wallet Binding
|
|
53
108
|
|
|
109
|
+
*Status: Production-Extension.* Optional and additive: passports without `bound_wallets` canonicalize unchanged, and actions without a `walletRef` skip the gate.
|
|
110
|
+
|
|
54
111
|
Two layers, designed to compose.
|
|
55
112
|
|
|
56
113
|
**Structural (agent-attested).** The agent's own passport private key signs `{ passport_id, chain, address, bound_at }` and appends the result to the passport's `bound_wallets` field. Verifiable offline with just the passport public key. Chain-agnostic: Nano is the native APS wallet, but the primitive accepts any chain identifier with an address.
|
|
@@ -68,16 +125,18 @@ const bound = bindWallet({
|
|
|
68
125
|
verifyBoundWallet(bound, 'nano', 'nano_3jb1...') // true
|
|
69
126
|
```
|
|
70
127
|
|
|
71
|
-
**Behavioral (issuer-attested).** Independent issuers (the [insumer-examples](https://github.com/douglasborthwick-crypto/insumer-examples) ecosystem and friends
|
|
128
|
+
**Behavioral (issuer-attested).** Independent issuers (the [insumer-examples](https://github.com/douglasborthwick-crypto/insumer-examples) ecosystem and friends, skyemeta/skyeprofile and 8 others) sign attestations about wallet behavior, sybil signals, and on-chain history. Their signatures stand alone.
|
|
72
129
|
|
|
73
130
|
The two layers compose: a verifier accepting both gets cryptographic proof that **this passport holder controls this address** (structural) **and** that **this address has these behavioral properties** (behavioral). Neither layer claims what the other proves. Multi-attestation envelopes carry both.
|
|
74
131
|
|
|
75
|
-
`commercePreflight()` enforces the structural layer at gate 5: when the action references a `walletRef`, the gate denies with `WALLET_NOT_BOUND` unless the wallet is currently bound to the acting passport. The check is opt-in
|
|
132
|
+
`commercePreflight()` enforces the structural layer at gate 5: when the action references a `walletRef`, the gate denies with `WALLET_NOT_BOUND` unless the wallet is currently bound to the acting passport. The check is opt-in. Actions without a `walletRef` skip it, so existing 5-gate flows are unaffected.
|
|
76
133
|
|
|
77
134
|
`unbindWallet()` produces a separately signed unbind event so the bind/unbind history can be reconstructed independent of the passport's current `bound_wallets` snapshot.
|
|
78
135
|
|
|
79
136
|
## Credential Check Policy
|
|
80
137
|
|
|
138
|
+
*Status: Production-Extension.* Delegations without an explicit `credentialCheckPolicy` keep the existing recheck-on-execute behavior unchanged.
|
|
139
|
+
|
|
81
140
|
A credential needs to declare WHEN it should be re-verified. Different credential types have different trust decay profiles. APS lets the issuer set this on the delegation itself via `credentialCheckPolicy`.
|
|
82
141
|
|
|
83
142
|
```typescript
|
|
@@ -111,12 +170,16 @@ Proposed by [@piiiico](https://github.com/piiiico) on the a2aproject/A2A governa
|
|
|
111
170
|
|
|
112
171
|
## Extended Modules
|
|
113
172
|
|
|
173
|
+
*Status: Production-Extension.*
|
|
174
|
+
|
|
114
175
|
Pick what you need. `import from 'agent-passport-system'` for the full API.
|
|
115
176
|
|
|
116
177
|
Coordination (task lifecycle with 9-state machine), EU AI Act compliance (signed evidence packets), framework adapters (CrewAI, LangChain, Google ADK, A2A, MCP), bilateral receipts, execution attestation, DID resolution, data lifecycle (access receipts, derivation tracking, consent revocation).
|
|
117
178
|
|
|
118
179
|
## Research Primitives
|
|
119
180
|
|
|
181
|
+
*Status: Experimental*, except where noted. The Wave 1 accountability primitives below are **Canonical**: their signed bytes are frozen and pinned by the conformance fixtures.
|
|
182
|
+
|
|
120
183
|
Forward-looking governance. Published, tested, available.
|
|
121
184
|
|
|
122
185
|
26 v2 constitutional modules: approval fatigue detection, epistemic isolation, blind evaluation, separation of powers, affected-party standing, circuit breakers, constitutional amendment, authority laundering audit, emergence detection.
|
|
@@ -143,7 +206,9 @@ The composition contract specifies how a verifier MUST cross-check per-request s
|
|
|
143
206
|
|
|
144
207
|
## Numbers
|
|
145
208
|
|
|
146
|
-
3,
|
|
209
|
+
3,113 tests. 8 protocol layers. Framework adapters for CrewAI, LangChain, ADK, A2A, MCP, OpenShell, IBAC, Gonka. Gateway evaluation under 2ms. Zero heavy dependencies. Apache-2.0.
|
|
210
|
+
|
|
211
|
+
The test count is one number derived from the suite, not three guesses. The badge above, this section, and the `package.json` description all carry the same `3,113`, which is the `tests` total reported by `npm test`. When the suite grows, re-run `npm test`, read the `tests` line, and update all three to match.
|
|
147
212
|
|
|
148
213
|
## Papers
|
|
149
214
|
|
|
@@ -157,6 +222,12 @@ The composition contract specifies how a verifier MUST cross-check per-request s
|
|
|
157
222
|
- [The Evidence-Safety Gap](https://doi.org/10.5281/zenodo.19914628)
|
|
158
223
|
- IETF Internet-Draft: `draft-pidlisnyi-aps-01`
|
|
159
224
|
|
|
225
|
+
## Security and conformance
|
|
226
|
+
|
|
227
|
+
- [Threat model](/THREAT_MODEL.md) -- actors, assets, trust boundaries, what APS prevents and what it does not, verifier responsibilities.
|
|
228
|
+
- [Conformance fixtures](tests/conformance/README.md) -- golden valid and negative receipt fixtures every verifier must agree on.
|
|
229
|
+
- [Payment Safety Profile](docs/PAYMENT-SAFETY-PROFILE.md) -- the mandatory profile for agent-initiated payments.
|
|
230
|
+
|
|
160
231
|
## Contributing
|
|
161
232
|
|
|
162
233
|
- [Contribution path](/CONTRIBUTION_PATH.md)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { ScopeOfClaim } from '../../v2/accountability/types/base.js';
|
|
2
|
+
import type { MayActClaim, TokenExchangeClaims, DelegationChainView, RecoveredChain, JwtSvidView, SpiffeIdentityInput } from './types.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The scope-of-claim this bridge attaches to any receipt that records a mapping.
|
|
6
|
+
* Mirrors the proof box. Callers that mint a receipt around a bridge operation
|
|
7
|
+
* SHOULD use this so the receipt does not over-claim.
|
|
8
|
+
*/
|
|
9
|
+
export declare function bridgeScopeOfClaim(): ScopeOfClaim;
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if `child` authority is no broader than `parent` (subset).
|
|
12
|
+
* A wildcard '*' in the parent matches any child scope. This is the monotonic
|
|
13
|
+
* narrowing invariant: authority may only decrease across a transfer point.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isNarrowing(parent: string[], child: string[]): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Validate that a chain narrows monotonically from root grant to current actor.
|
|
18
|
+
* Each hop's scope must be a subset of the previous hop's scope. Throws on the
|
|
19
|
+
* first hop that widens authority.
|
|
20
|
+
*/
|
|
21
|
+
export declare function assertChainNarrows(chain: DelegationChainView): void;
|
|
22
|
+
/**
|
|
23
|
+
* Effective authority of a chain: the intersection of every hop's scope. This is
|
|
24
|
+
* the narrowest set that survives all transfer points, i.e. what the current
|
|
25
|
+
* actor may actually do. RFC 8693 transports this as the token `scope` member.
|
|
26
|
+
*/
|
|
27
|
+
export declare function effectiveScope(chain: DelegationChainView): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Express an APS delegation chain as RFC 8693 token-exchange claims.
|
|
30
|
+
*
|
|
31
|
+
* - top-level `sub` = the principal (party being acted upon).
|
|
32
|
+
* - `act` = nested actor chain (current actor outermost, prior actors nested).
|
|
33
|
+
* - `may_act` = the party permitted to become the NEXT actor, when supplied. This
|
|
34
|
+
* is a forward authorization, distinct from `act` which records who IS acting.
|
|
35
|
+
* - `scope` = the chain's effective (narrowed) authority, space-delimited.
|
|
36
|
+
*
|
|
37
|
+
* This emits a delegation token (it carries `act`), never an impersonation token.
|
|
38
|
+
* Authority is bounded by the narrowed effective scope. The chain MUST narrow
|
|
39
|
+
* monotonically; this is asserted before mapping.
|
|
40
|
+
*/
|
|
41
|
+
export declare function chainToTokenExchangeClaims(chain: DelegationChainView, options?: {
|
|
42
|
+
/** Party permitted to become the next actor → emitted as `may_act`. */
|
|
43
|
+
mayActBecome?: {
|
|
44
|
+
sub: string;
|
|
45
|
+
iss?: string;
|
|
46
|
+
};
|
|
47
|
+
/** Logical target audience. */
|
|
48
|
+
audience?: string | string[];
|
|
49
|
+
/** Absolute resource URI (no fragment). */
|
|
50
|
+
resource?: string;
|
|
51
|
+
/** Issuer of the exchanged token. */
|
|
52
|
+
iss?: string;
|
|
53
|
+
/** exp (NumericDate). */
|
|
54
|
+
exp?: number;
|
|
55
|
+
/** nbf (NumericDate). */
|
|
56
|
+
nbf?: number;
|
|
57
|
+
}): TokenExchangeClaims;
|
|
58
|
+
/**
|
|
59
|
+
* Recover an APS delegation chain from RFC 8693 token-exchange claims.
|
|
60
|
+
*
|
|
61
|
+
* The principal is the top-level `sub`. Actors are read from the nested `act`
|
|
62
|
+
* chain, reversed to root-first order. Each recovered hop is delegated FROM the
|
|
63
|
+
* prior actor (or the principal, for the first actor) TO the actor. The token
|
|
64
|
+
* `scope` member is recovered as the chain's effective scope, and each hop is
|
|
65
|
+
* assigned that effective scope as a ceiling, so the recovered chain is provably
|
|
66
|
+
* no broader than the original effective authority.
|
|
67
|
+
*
|
|
68
|
+
* Per RFC 8693 security rules, authorization MUST derive only from the top-level
|
|
69
|
+
* claims plus the OUTERMOST actor. Nested (prior) actors and `may_act` are
|
|
70
|
+
* informational here; the recovered chain carries them for audit but the
|
|
71
|
+
* effective scope is the authorization ceiling.
|
|
72
|
+
*/
|
|
73
|
+
export declare function tokenExchangeClaimsToChain(claims: TokenExchangeClaims): RecoveredChain;
|
|
74
|
+
/** Parse a space-delimited, case-sensitive scope string into a set list. */
|
|
75
|
+
export declare function parseScope(scope?: string): string[];
|
|
76
|
+
/**
|
|
77
|
+
* Validate that mapping an APS chain to RFC 8693 claims and back does not widen
|
|
78
|
+
* authority. Compares the original chain's effective scope against the recovered
|
|
79
|
+
* chain's effective scope and asserts the recovered set is a subset (no broader).
|
|
80
|
+
* Returns the recovered chain on success; throws if the round-trip widened.
|
|
81
|
+
*/
|
|
82
|
+
export declare function assertRoundTripNarrows(original: DelegationChainView, recovered: RecoveredChain): void;
|
|
83
|
+
/**
|
|
84
|
+
* RFC 8693 Section 4.4: before minting a delegated token, the authorization
|
|
85
|
+
* server SHOULD verify that the presented actor satisfies the subject token's
|
|
86
|
+
* `may_act` constraint. This checks that `actor` matches `may_act`.
|
|
87
|
+
*
|
|
88
|
+
* `may_act` is permission, not proof: a positive result here only means the
|
|
89
|
+
* actor is PERMITTED to act, never that the actor's token was itself valid.
|
|
90
|
+
*/
|
|
91
|
+
export declare function actorSatisfiesMayAct(mayAct: MayActClaim | undefined, actor: {
|
|
92
|
+
sub: string;
|
|
93
|
+
iss?: string;
|
|
94
|
+
}): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Read the current (authorizing) actor from a token's claims. Per RFC 8693, only
|
|
97
|
+
* the OUTERMOST `act` is the current actor and the sole actor that authorization
|
|
98
|
+
* may consider. Returns undefined for an impersonation-shaped token (no `act`).
|
|
99
|
+
*/
|
|
100
|
+
export declare function currentActor(claims: TokenExchangeClaims): {
|
|
101
|
+
sub: string;
|
|
102
|
+
iss?: string;
|
|
103
|
+
} | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Validate a SPIFFE ID against the structural rules of the SPIFFE-ID spec and
|
|
106
|
+
* split it into DID-mappable parts. Reuses parseSPIFFEID for the scheme/authority
|
|
107
|
+
* split, then enforces charset, segment, length, and forbidden-component rules.
|
|
108
|
+
*
|
|
109
|
+
* Rejects: query, fragment, userinfo, port, percent-encoding, empty / '.' / '..'
|
|
110
|
+
* segments, trailing slash, oversized identifiers, and out-of-charset characters.
|
|
111
|
+
*/
|
|
112
|
+
export declare function validateSpiffeId(spiffeId: string): {
|
|
113
|
+
trustDomain: string;
|
|
114
|
+
pathSegments: string[];
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Resolve a SPIFFE ID string to a DID-method identity input. The only transform
|
|
118
|
+
* is `spiffe://` → `did:<method>:` plus segment delimiting (default ':'). Because
|
|
119
|
+
* SPIFFE forbids userinfo, port, query, and fragment and constrains the charset
|
|
120
|
+
* to a DID-safe subset, the mapping is lossless and needs no escaping.
|
|
121
|
+
*
|
|
122
|
+
* Optionally enforces a trust-domain match against an expected root of trust;
|
|
123
|
+
* a mismatch is rejected before any DID is produced.
|
|
124
|
+
*/
|
|
125
|
+
export declare function spiffeIdToDidInput(spiffeId: string, options?: {
|
|
126
|
+
method?: string;
|
|
127
|
+
expectedTrustDomain?: string;
|
|
128
|
+
delimiter?: string;
|
|
129
|
+
}): SpiffeIdentityInput;
|
|
130
|
+
/**
|
|
131
|
+
* Validate a JWT-SVID's header and claims per the SPIFFE JWT-SVID spec, then map
|
|
132
|
+
* its `sub` (which MUST equal the workload SPIFFE ID) to a DID-method input.
|
|
133
|
+
*
|
|
134
|
+
* Rejects (MUST per spec): missing `exp`; missing `aud`; the validator's own ID
|
|
135
|
+
* absent from `aud` when an audience to match is supplied; `alg` outside the
|
|
136
|
+
* approved asymmetric set (no symmetric, no `alg:none`); a `typ` header that is
|
|
137
|
+
* present but not `JWT`/`JOSE`; a `sub` that is not a valid SPIFFE ID.
|
|
138
|
+
*/
|
|
139
|
+
export declare function jwtSvidToDidInput(svid: JwtSvidView, options?: {
|
|
140
|
+
method?: string;
|
|
141
|
+
expectedAudience?: string;
|
|
142
|
+
expectedTrustDomain?: string;
|
|
143
|
+
}): SpiffeIdentityInput;
|
|
144
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapters/oauth-rfc8693/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,KAAK,EAEV,WAAW,EACX,mBAAmB,EAEnB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB,cAAc,YAAY,CAAA;AAI1B;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAcjD;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAItE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAcnE;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAMnE;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,CAAC,EAAE;IACR,uEAAuE;IACvE,YAAY,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,GACA,mBAAmB,CAwBrB;AAuBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,mBAAmB,GAC1B,cAAc,CA2ChB;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnD;AAID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,cAAc,GACxB,IAAI,CA6BN;AAID;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,mBAAmB,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAK3C;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAClD,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAyDA;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9E,mBAAmB,CAkBrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GACrF,mBAAmB,CA0CrB"}
|