@ouispec/agent-core 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/approvals/index.d.ts +1 -0
- package/dist/approvals/index.d.ts.map +1 -1
- package/dist/approvals/index.js +1 -0
- package/dist/approvals/index.js.map +1 -1
- package/dist/approvals/receipt.d.ts +127 -0
- package/dist/approvals/receipt.d.ts.map +1 -0
- package/dist/approvals/receipt.js +312 -0
- package/dist/approvals/receipt.js.map +1 -0
- package/dist/approvals/types.d.ts +1 -1
- package/dist/approvals/types.d.ts.map +1 -1
- package/dist/approvals/types.js.map +1 -1
- package/dist/receipt-vectors.json +291 -0
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -11,4 +11,26 @@ It has no runtime of its own. `@ouispec/agent-worker` (the agent), `@ouispec/age
|
|
|
11
11
|
- The turn events come from `@ouispec/agent-events`, and the approval messages from `@ouispec/contract`'s `approvals.json`.
|
|
12
12
|
- `argsHash` and the approval rules are `oui-spec`'s. `@ouispec/agent-core/approval-vectors.json` re-exports its test vectors, so an engine in another language can hold its own hash to them.
|
|
13
13
|
|
|
14
|
+
## Verifying an approval receipt
|
|
15
|
+
|
|
16
|
+
A tool's own API refuses an irreversible request no user approved with `verifyApprovalReceipt`. The realtime server signs a receipt when it redeems an approval, and the worker sends it on the approved call as the `OUI-Approval-Receipt` header (`APPROVAL_RECEIPT_HEADER`). The function runs on WebCrypto, the same in Node and in the browser build.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { APPROVAL_RECEIPT_HEADER, argsHash, verifyApprovalReceipt } from '@ouispec/agent-core';
|
|
20
|
+
|
|
21
|
+
const checked = await verifyApprovalReceipt(request.headers.get(APPROVAL_RECEIPT_HEADER) ?? '', {
|
|
22
|
+
jwks: 'https://realtime.example.com/.well-known/oui-approval-jwks.json', // or the JWKS document itself
|
|
23
|
+
expectedArgsHash: await argsHash(toolInput), // the call as you received it
|
|
24
|
+
audience: 'https://api.example.com', // your own origin
|
|
25
|
+
});
|
|
26
|
+
// { ok: true, claims } or { ok: false, reason, error }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- `expectedArgsHash`: for a generated API tool, the tool's input as the worker's executor received it, one object holding every path, query and body parameter by its declared name; for an operation whose input is its body, that body.
|
|
30
|
+
- `jwks` as a URL is fetched, cached for the response's `max-age`, and fetched again when a receipt names a key id it lacks, at most once a minute. A key set that cannot be read refuses with `key`.
|
|
31
|
+
- It checks, in order: the header (`alg` `EdDSA`, `typ` `oui-approval-receipt+jwt`, a `kid`, no `crit`), a published key with that id, the signature, the claims' shape, `exp` and `iat` with 60 s of clock skew, `aud`, then `argsHash`. The refusal reasons are `malformed`, `key`, `signature`, `expired`, `audience` and `args`.
|
|
32
|
+
- **Single use is yours.** The receipt's `jti` is the call's idempotency key. Record each one you act on for at least two minutes, and answer a repeat with the first result, or refuse it.
|
|
33
|
+
|
|
34
|
+
Any JOSE library verifies a receipt too: accept only `EdDSA` with this `typ`, read the key from the JWKS by `kid`, and then check `exp`, `aud` and `argsHash` as above. `@ouispec/agent-core/receipt-vectors.json` holds receipts, the keys they were signed with, and the result each must give, for an implementation in any language.
|
|
35
|
+
|
|
14
36
|
See [the integrator guide](https://github.com/wesreid/oui/blob/main/packages/contract/INTEGRATOR-GUIDE.md) for how the pieces fit, and [VERSIONING.md](https://github.com/wesreid/oui/blob/main/VERSIONING.md) for what a release may change.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/approvals/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/approvals/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
package/dist/approvals/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/approvals/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/approvals/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { ApprovalReceiptClaims } from '@ouispec/contract';
|
|
2
|
+
/**
|
|
3
|
+
* The approval receipt: what the tool's own API checks to know that the call
|
|
4
|
+
* it received is one a person approved.
|
|
5
|
+
*
|
|
6
|
+
* When the realtime server redeems an approval token it signs a receipt, a
|
|
7
|
+
* compact JWS over Ed25519 with a key only it holds, and the worker carries it
|
|
8
|
+
* on the approved call (`OUI-Approval-Receipt`). The tool holds only the
|
|
9
|
+
* public keys, published at `<iss>/.well-known/oui-approval-jwks.json`, so it
|
|
10
|
+
* can verify a receipt and never make one. The receipt names the one API it is
|
|
11
|
+
* for (`aud`), the call's args hash, and lasts 120 seconds; its `jti` is the
|
|
12
|
+
* call's idempotency key, which the tool acts on at most once.
|
|
13
|
+
*
|
|
14
|
+
* `verifyApprovalReceipt` is the same in Node and in the browser build: it
|
|
15
|
+
* runs on WebCrypto. `@ouispec/agent-core/receipt-vectors.json` holds every
|
|
16
|
+
* other implementation, in any language, to the results it gives.
|
|
17
|
+
*/
|
|
18
|
+
/** The receipt's JWS `typ`. A verifier accepts no other. */
|
|
19
|
+
export declare const APPROVAL_RECEIPT_TYP = "oui-approval-receipt+jwt";
|
|
20
|
+
/** The receipt's JWS `alg`: EdDSA over Ed25519. A verifier accepts no other, and never `none`. */
|
|
21
|
+
export declare const APPROVAL_RECEIPT_ALG = "EdDSA";
|
|
22
|
+
/** The request header an approved call carries its receipt in. */
|
|
23
|
+
export declare const APPROVAL_RECEIPT_HEADER = "OUI-Approval-Receipt";
|
|
24
|
+
/** Where, under the realtime server's public base URL (`iss`), its receipt keys are published. */
|
|
25
|
+
export declare const APPROVAL_RECEIPT_JWKS_PATH = "/.well-known/oui-approval-jwks.json";
|
|
26
|
+
/** How long a receipt lasts: the request that runs right after redemption, and one retry. */
|
|
27
|
+
export declare const APPROVAL_RECEIPT_TTL_SEC = 120;
|
|
28
|
+
/** The clock skew a verifier allows on `iat` and `exp`. */
|
|
29
|
+
export declare const APPROVAL_RECEIPT_CLOCK_SKEW_SEC = 60;
|
|
30
|
+
/** How long the published keys may be cached (`Cache-Control: public, max-age=3600`). */
|
|
31
|
+
export declare const APPROVAL_RECEIPT_JWKS_MAX_AGE_SEC = 3600;
|
|
32
|
+
/** A verifier that meets a key id it does not know fetches the keys again, at most this often. */
|
|
33
|
+
export declare const APPROVAL_RECEIPT_JWKS_REFETCH_MS = 60000;
|
|
34
|
+
/**
|
|
35
|
+
* Why a receipt was refused, in the order the verifier checks:
|
|
36
|
+
*
|
|
37
|
+
* - `malformed`: not a compact JWS; a header that is not exactly EdDSA with
|
|
38
|
+
* this `typ` and a `kid`, or that names `crit`; or claims that are not a
|
|
39
|
+
* receipt's.
|
|
40
|
+
* - `key`: no published key has its `kid` (a removed key, or another
|
|
41
|
+
* environment's), or the keys could not be read.
|
|
42
|
+
* - `signature`: the signature is not that key's over this header and these claims.
|
|
43
|
+
* - `expired`: past `exp`, or issued in the future, beyond the clock skew.
|
|
44
|
+
* - `audience`: issued for another API.
|
|
45
|
+
* - `args`: issued for other arguments than the request carries.
|
|
46
|
+
*/
|
|
47
|
+
export type ApprovalReceiptRefusalReason = 'malformed' | 'key' | 'signature' | 'expired' | 'audience' | 'args';
|
|
48
|
+
export declare const APPROVAL_RECEIPT_REFUSAL_REASONS: readonly ApprovalReceiptRefusalReason[];
|
|
49
|
+
/** One published receipt key: an Ed25519 public key as a JWK. */
|
|
50
|
+
export interface ApprovalReceiptPublicJwk {
|
|
51
|
+
kty: 'OKP';
|
|
52
|
+
crv: 'Ed25519';
|
|
53
|
+
/** The public key, base64url. */
|
|
54
|
+
x: string;
|
|
55
|
+
kid: string;
|
|
56
|
+
alg?: 'EdDSA';
|
|
57
|
+
use?: 'sig';
|
|
58
|
+
}
|
|
59
|
+
/** The realtime server's published receipt keys. */
|
|
60
|
+
export interface ApprovalReceiptJwks {
|
|
61
|
+
keys: ApprovalReceiptPublicJwk[];
|
|
62
|
+
}
|
|
63
|
+
export type ApprovalReceiptVerification = {
|
|
64
|
+
ok: true;
|
|
65
|
+
claims: ApprovalReceiptClaims;
|
|
66
|
+
} | {
|
|
67
|
+
ok: false;
|
|
68
|
+
reason: ApprovalReceiptRefusalReason;
|
|
69
|
+
error: string;
|
|
70
|
+
};
|
|
71
|
+
export interface VerifyApprovalReceiptOptions {
|
|
72
|
+
/**
|
|
73
|
+
* The realtime server's published keys: the JWKS document, or its URL
|
|
74
|
+
* (`<iss>/.well-known/oui-approval-jwks.json`). Given a URL, the keys are
|
|
75
|
+
* fetched, cached for the response's `max-age`, and fetched again when a
|
|
76
|
+
* receipt names a key id they lack, at most once a minute.
|
|
77
|
+
*/
|
|
78
|
+
jwks: ApprovalReceiptJwks | string | URL;
|
|
79
|
+
/**
|
|
80
|
+
* `argsHash` of the call as the tool received it. For a generated API tool:
|
|
81
|
+
* one object holding every path, query and body parameter by its declared
|
|
82
|
+
* name; for an operation whose input is its body, that body.
|
|
83
|
+
*/
|
|
84
|
+
expectedArgsHash: string;
|
|
85
|
+
/** The tool's own origin (scheme, host and port), which the receipt must name as `aud`. */
|
|
86
|
+
audience: string;
|
|
87
|
+
/** The time to check against, epoch ms. Default: now. */
|
|
88
|
+
now?: number;
|
|
89
|
+
/** The fetch the keys are read with, when `jwks` is a URL. Default: the global fetch. */
|
|
90
|
+
fetch?: typeof fetch;
|
|
91
|
+
}
|
|
92
|
+
/** base64url → bytes, without padding, on any runtime. */
|
|
93
|
+
export declare function base64UrlToBytes(value: string): Uint8Array;
|
|
94
|
+
/** bytes → base64url, without padding, on any runtime. */
|
|
95
|
+
export declare function bytesToBase64Url(bytes: Uint8Array): string;
|
|
96
|
+
/**
|
|
97
|
+
* The origin an audience names: scheme, host and port, as `URL.origin` writes
|
|
98
|
+
* it. One rule for the worker that names an API's audience, the store that
|
|
99
|
+
* fixes it, and the verifier that compares it. Null when it is not an
|
|
100
|
+
* absolute http(s) URL with nothing past its origin but a `/`.
|
|
101
|
+
*/
|
|
102
|
+
export declare function approvalReceiptAudience(value: string): string | null;
|
|
103
|
+
/**
|
|
104
|
+
* What is wrong with a receipt's claims, or null: every required claim of the
|
|
105
|
+
* right type, no claim it does not define. The signer and the verifier hold a
|
|
106
|
+
* receipt to this one rule.
|
|
107
|
+
*/
|
|
108
|
+
export declare function approvalReceiptClaimsProblem(claims: unknown): string | null;
|
|
109
|
+
/** The members of a JWK a receipt key is published with: never `d`. */
|
|
110
|
+
export declare function publicReceiptJwk(jwk: {
|
|
111
|
+
kty?: unknown;
|
|
112
|
+
crv?: unknown;
|
|
113
|
+
x?: unknown;
|
|
114
|
+
kid?: unknown;
|
|
115
|
+
}): ApprovalReceiptPublicJwk;
|
|
116
|
+
/**
|
|
117
|
+
* Verifies an approval receipt. It checks, in this order: the header (EdDSA,
|
|
118
|
+
* the receipt `typ`, a key id, no `crit`), that a published key has that id,
|
|
119
|
+
* the signature, the claims' shape, `exp` and `iat` (60 s of clock skew),
|
|
120
|
+
* `aud`, then `argsHash`; each failure has its own `reason`. It never throws
|
|
121
|
+
* for a bad receipt; a JWKS URL that cannot be read refuses with `key`.
|
|
122
|
+
*
|
|
123
|
+
* A receipt that verifies is still the tool's to use once: record its `jti`
|
|
124
|
+
* for at least the receipt's lifetime, and never act twice on one.
|
|
125
|
+
*/
|
|
126
|
+
export declare function verifyApprovalReceipt(jws: string, options: VerifyApprovalReceiptOptions): Promise<ApprovalReceiptVerification>;
|
|
127
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/approvals/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D;;;;;;;;;;;;;;;GAeG;AAEH,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAC/D,kGAAkG;AAClG,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAC5C,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAC9D,kGAAkG;AAClG,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAChF,6FAA6F;AAC7F,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,2DAA2D;AAC3D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,yFAAyF;AACzF,eAAO,MAAM,iCAAiC,OAAO,CAAC;AACtD,kGAAkG;AAClG,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/G,eAAO,MAAM,gCAAgC,EAAE,SAAS,4BAA4B,EAOnF,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,SAAS,CAAC;IACf,iCAAiC;IACjC,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,KAAK,CAAC;CACb;AAED,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,wBAAwB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAC3C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,IAAI,EAAE,mBAAmB,GAAG,MAAM,GAAG,GAAG,CAAC;IACzC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAKD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAO1D;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAI1D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWpE;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW3E;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,wBAAwB,CAE5H;AAuGD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAiEpI"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { APPROVAL_CHANNELS } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The approval receipt: what the tool's own API checks to know that the call
|
|
4
|
+
* it received is one a person approved.
|
|
5
|
+
*
|
|
6
|
+
* When the realtime server redeems an approval token it signs a receipt, a
|
|
7
|
+
* compact JWS over Ed25519 with a key only it holds, and the worker carries it
|
|
8
|
+
* on the approved call (`OUI-Approval-Receipt`). The tool holds only the
|
|
9
|
+
* public keys, published at `<iss>/.well-known/oui-approval-jwks.json`, so it
|
|
10
|
+
* can verify a receipt and never make one. The receipt names the one API it is
|
|
11
|
+
* for (`aud`), the call's args hash, and lasts 120 seconds; its `jti` is the
|
|
12
|
+
* call's idempotency key, which the tool acts on at most once.
|
|
13
|
+
*
|
|
14
|
+
* `verifyApprovalReceipt` is the same in Node and in the browser build: it
|
|
15
|
+
* runs on WebCrypto. `@ouispec/agent-core/receipt-vectors.json` holds every
|
|
16
|
+
* other implementation, in any language, to the results it gives.
|
|
17
|
+
*/
|
|
18
|
+
/** The receipt's JWS `typ`. A verifier accepts no other. */
|
|
19
|
+
export const APPROVAL_RECEIPT_TYP = 'oui-approval-receipt+jwt';
|
|
20
|
+
/** The receipt's JWS `alg`: EdDSA over Ed25519. A verifier accepts no other, and never `none`. */
|
|
21
|
+
export const APPROVAL_RECEIPT_ALG = 'EdDSA';
|
|
22
|
+
/** The request header an approved call carries its receipt in. */
|
|
23
|
+
export const APPROVAL_RECEIPT_HEADER = 'OUI-Approval-Receipt';
|
|
24
|
+
/** Where, under the realtime server's public base URL (`iss`), its receipt keys are published. */
|
|
25
|
+
export const APPROVAL_RECEIPT_JWKS_PATH = '/.well-known/oui-approval-jwks.json';
|
|
26
|
+
/** How long a receipt lasts: the request that runs right after redemption, and one retry. */
|
|
27
|
+
export const APPROVAL_RECEIPT_TTL_SEC = 120;
|
|
28
|
+
/** The clock skew a verifier allows on `iat` and `exp`. */
|
|
29
|
+
export const APPROVAL_RECEIPT_CLOCK_SKEW_SEC = 60;
|
|
30
|
+
/** How long the published keys may be cached (`Cache-Control: public, max-age=3600`). */
|
|
31
|
+
export const APPROVAL_RECEIPT_JWKS_MAX_AGE_SEC = 3600;
|
|
32
|
+
/** A verifier that meets a key id it does not know fetches the keys again, at most this often. */
|
|
33
|
+
export const APPROVAL_RECEIPT_JWKS_REFETCH_MS = 60_000;
|
|
34
|
+
export const APPROVAL_RECEIPT_REFUSAL_REASONS = [
|
|
35
|
+
'malformed',
|
|
36
|
+
'key',
|
|
37
|
+
'signature',
|
|
38
|
+
'expired',
|
|
39
|
+
'audience',
|
|
40
|
+
'args',
|
|
41
|
+
];
|
|
42
|
+
const B64URL = /^[A-Za-z0-9_-]*$/;
|
|
43
|
+
const ARGS_HASH = /^[0-9a-f]{64}$/;
|
|
44
|
+
/** base64url → bytes, without padding, on any runtime. */
|
|
45
|
+
export function base64UrlToBytes(value) {
|
|
46
|
+
if (!B64URL.test(value) || value.length % 4 === 1)
|
|
47
|
+
throw new TypeError('not base64url');
|
|
48
|
+
const base64 = value.replace(/-/g, '+').replace(/_/g, '/') + '='.repeat((4 - (value.length % 4)) % 4);
|
|
49
|
+
const binary = atob(base64);
|
|
50
|
+
const bytes = new Uint8Array(binary.length);
|
|
51
|
+
for (let i = 0; i < binary.length; i++)
|
|
52
|
+
bytes[i] = binary.charCodeAt(i);
|
|
53
|
+
return bytes;
|
|
54
|
+
}
|
|
55
|
+
/** bytes → base64url, without padding, on any runtime. */
|
|
56
|
+
export function bytesToBase64Url(bytes) {
|
|
57
|
+
let binary = '';
|
|
58
|
+
for (const byte of bytes)
|
|
59
|
+
binary += String.fromCharCode(byte);
|
|
60
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The origin an audience names: scheme, host and port, as `URL.origin` writes
|
|
64
|
+
* it. One rule for the worker that names an API's audience, the store that
|
|
65
|
+
* fixes it, and the verifier that compares it. Null when it is not an
|
|
66
|
+
* absolute http(s) URL with nothing past its origin but a `/`.
|
|
67
|
+
*/
|
|
68
|
+
export function approvalReceiptAudience(value) {
|
|
69
|
+
if (typeof value !== 'string' || !value)
|
|
70
|
+
return null;
|
|
71
|
+
let url;
|
|
72
|
+
try {
|
|
73
|
+
url = new URL(value);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
79
|
+
return null;
|
|
80
|
+
if (url.username || url.password || url.search || url.hash || (url.pathname !== '/' && url.pathname !== ''))
|
|
81
|
+
return null;
|
|
82
|
+
return url.origin;
|
|
83
|
+
}
|
|
84
|
+
const REQUIRED_STRINGS = ['iss', 'aud', 'approvalId', 'tool', 'conversationId', 'userId', 'jti'];
|
|
85
|
+
const OPTIONAL_STRINGS = ['operationId', 'accountId'];
|
|
86
|
+
const KNOWN_CLAIMS = new Set([...REQUIRED_STRINGS, ...OPTIONAL_STRINGS, 'argsHash', 'channel', 'iat', 'exp']);
|
|
87
|
+
/**
|
|
88
|
+
* What is wrong with a receipt's claims, or null: every required claim of the
|
|
89
|
+
* right type, no claim it does not define. The signer and the verifier hold a
|
|
90
|
+
* receipt to this one rule.
|
|
91
|
+
*/
|
|
92
|
+
export function approvalReceiptClaimsProblem(claims) {
|
|
93
|
+
if (!claims || typeof claims !== 'object' || Array.isArray(claims))
|
|
94
|
+
return 'the claims are not an object';
|
|
95
|
+
const c = claims;
|
|
96
|
+
for (const k of REQUIRED_STRINGS)
|
|
97
|
+
if (typeof c[k] !== 'string' || !c[k])
|
|
98
|
+
return `claim ${k} is missing`;
|
|
99
|
+
for (const k of OPTIONAL_STRINGS)
|
|
100
|
+
if (c[k] !== undefined && (typeof c[k] !== 'string' || !c[k]))
|
|
101
|
+
return `claim ${k} is not a string`;
|
|
102
|
+
if (typeof c.argsHash !== 'string' || !ARGS_HASH.test(c.argsHash))
|
|
103
|
+
return 'claim argsHash is not an args hash';
|
|
104
|
+
if (!APPROVAL_CHANNELS.includes(c.channel))
|
|
105
|
+
return 'claim channel is not a channel';
|
|
106
|
+
for (const k of ['iat', 'exp'])
|
|
107
|
+
if (!Number.isSafeInteger(c[k]))
|
|
108
|
+
return `claim ${k} is not a time`;
|
|
109
|
+
if (c.exp <= c.iat)
|
|
110
|
+
return 'claim exp is not after iat';
|
|
111
|
+
for (const k of Object.keys(c))
|
|
112
|
+
if (!KNOWN_CLAIMS.has(k))
|
|
113
|
+
return `claim ${k} is not a receipt's`;
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/** The members of a JWK a receipt key is published with: never `d`. */
|
|
117
|
+
export function publicReceiptJwk(jwk) {
|
|
118
|
+
return { kty: 'OKP', crv: 'Ed25519', x: String(jwk.x), kid: String(jwk.kid), alg: 'EdDSA', use: 'sig' };
|
|
119
|
+
}
|
|
120
|
+
/** Whether a JWK is a receipt verification key: Ed25519, a 32-byte public key, a key id, and no other algorithm or use. */
|
|
121
|
+
function isReceiptKey(jwk) {
|
|
122
|
+
if (!jwk || typeof jwk !== 'object')
|
|
123
|
+
return false;
|
|
124
|
+
const k = jwk;
|
|
125
|
+
if (k.kty !== 'OKP' || k.crv !== 'Ed25519' || typeof k.kid !== 'string' || !k.kid || typeof k.x !== 'string')
|
|
126
|
+
return false;
|
|
127
|
+
if (k.alg !== undefined && k.alg !== APPROVAL_RECEIPT_ALG)
|
|
128
|
+
return false;
|
|
129
|
+
if (k.use !== undefined && k.use !== 'sig')
|
|
130
|
+
return false;
|
|
131
|
+
try {
|
|
132
|
+
return base64UrlToBytes(k.x).length === 32;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* WebCrypto: global in browsers and Node 19+; Node 18 has it only on
|
|
140
|
+
* `node:crypto`, imported here by a specifier bundlers leave alone.
|
|
141
|
+
*/
|
|
142
|
+
async function subtleCrypto() {
|
|
143
|
+
const global = globalThis.crypto?.subtle;
|
|
144
|
+
if (global)
|
|
145
|
+
return global;
|
|
146
|
+
const nodeCrypto = 'node:crypto';
|
|
147
|
+
try {
|
|
148
|
+
const mod = (await import(/* @vite-ignore */ nodeCrypto));
|
|
149
|
+
if (mod.webcrypto?.subtle)
|
|
150
|
+
return mod.webcrypto.subtle;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Not Node: fall through to the error below.
|
|
154
|
+
}
|
|
155
|
+
throw new Error('[agent-sdk] verifyApprovalReceipt needs WebCrypto (crypto.subtle), which this runtime does not provide');
|
|
156
|
+
}
|
|
157
|
+
/** A JWKS document's receipt keys by key id. Keys of any other kind are ignored, and a kid published twice is refused. */
|
|
158
|
+
function keysById(document) {
|
|
159
|
+
const keys = document?.keys;
|
|
160
|
+
if (!Array.isArray(keys))
|
|
161
|
+
throw new Error('the key set has no "keys" list');
|
|
162
|
+
const byId = new Map();
|
|
163
|
+
const doubled = new Set();
|
|
164
|
+
for (const k of keys) {
|
|
165
|
+
if (!isReceiptKey(k))
|
|
166
|
+
continue;
|
|
167
|
+
if (byId.has(k.kid))
|
|
168
|
+
doubled.add(k.kid);
|
|
169
|
+
byId.set(k.kid, k);
|
|
170
|
+
}
|
|
171
|
+
// Two keys under one id: neither can be told from the other, so neither is used.
|
|
172
|
+
for (const kid of doubled)
|
|
173
|
+
byId.delete(kid);
|
|
174
|
+
return byId;
|
|
175
|
+
}
|
|
176
|
+
const remoteKeySets = new Map();
|
|
177
|
+
const inflight = new Map();
|
|
178
|
+
function maxAgeSeconds(cacheControl) {
|
|
179
|
+
if (/(?:^|,)\s*(?:no-store|no-cache)\s*(?:,|$)/i.test(cacheControl ?? ''))
|
|
180
|
+
return 0;
|
|
181
|
+
const match = /(?:^|,)\s*max-age\s*=\s*"?(\d+)"?\s*(?:,|$)/i.exec(cacheControl ?? '');
|
|
182
|
+
return match ? Number(match[1]) : APPROVAL_RECEIPT_JWKS_MAX_AGE_SEC;
|
|
183
|
+
}
|
|
184
|
+
async function fetchKeySet(url, fetchImpl, now) {
|
|
185
|
+
const running = inflight.get(url);
|
|
186
|
+
if (running)
|
|
187
|
+
return running;
|
|
188
|
+
const reading = (async () => {
|
|
189
|
+
const res = await fetchImpl(url, { headers: { accept: 'application/json' } });
|
|
190
|
+
if (!res.ok)
|
|
191
|
+
throw new Error(`the key set at ${url} answered HTTP ${res.status}`);
|
|
192
|
+
const document = (await res.json());
|
|
193
|
+
const set = { keys: keysById(document), freshUntil: now + maxAgeSeconds(res.headers.get('cache-control')) * 1000, fetchedAt: now };
|
|
194
|
+
remoteKeySets.set(url, set);
|
|
195
|
+
return set;
|
|
196
|
+
})();
|
|
197
|
+
inflight.set(url, reading);
|
|
198
|
+
try {
|
|
199
|
+
return await reading;
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
inflight.delete(url);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** The key a receipt names, from a document or a cached, refreshed URL; null when no published key has that id. */
|
|
206
|
+
async function receiptKey(jwks, kid, fetchImpl, now) {
|
|
207
|
+
if (typeof jwks !== 'string' && !(jwks instanceof URL))
|
|
208
|
+
return keysById(jwks).get(kid) ?? null;
|
|
209
|
+
const url = jwks.toString();
|
|
210
|
+
const doFetch = fetchImpl ?? globalThis.fetch;
|
|
211
|
+
if (typeof doFetch !== 'function')
|
|
212
|
+
throw new Error('no fetch to read the key set with');
|
|
213
|
+
let set = remoteKeySets.get(url);
|
|
214
|
+
if (!set || now >= set.freshUntil)
|
|
215
|
+
set = await fetchKeySet(url, doFetch, now);
|
|
216
|
+
else if (!set.keys.has(kid) && now - set.fetchedAt >= APPROVAL_RECEIPT_JWKS_REFETCH_MS)
|
|
217
|
+
set = await fetchKeySet(url, doFetch, now);
|
|
218
|
+
return set.keys.get(kid) ?? null;
|
|
219
|
+
}
|
|
220
|
+
const refuse = (reason, error) => ({ ok: false, reason, error });
|
|
221
|
+
function decodeJson(segment) {
|
|
222
|
+
return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(base64UrlToBytes(segment)));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Verifies an approval receipt. It checks, in this order: the header (EdDSA,
|
|
226
|
+
* the receipt `typ`, a key id, no `crit`), that a published key has that id,
|
|
227
|
+
* the signature, the claims' shape, `exp` and `iat` (60 s of clock skew),
|
|
228
|
+
* `aud`, then `argsHash`; each failure has its own `reason`. It never throws
|
|
229
|
+
* for a bad receipt; a JWKS URL that cannot be read refuses with `key`.
|
|
230
|
+
*
|
|
231
|
+
* A receipt that verifies is still the tool's to use once: record its `jti`
|
|
232
|
+
* for at least the receipt's lifetime, and never act twice on one.
|
|
233
|
+
*/
|
|
234
|
+
export async function verifyApprovalReceipt(jws, options) {
|
|
235
|
+
const now = options.now ?? Date.now();
|
|
236
|
+
if (typeof jws !== 'string')
|
|
237
|
+
return refuse('malformed', 'not a compact JWS');
|
|
238
|
+
const parts = jws.split('.');
|
|
239
|
+
if (parts.length !== 3 || parts.some((p) => !B64URL.test(p)) || !parts[0] || !parts[1] || !parts[2]) {
|
|
240
|
+
return refuse('malformed', 'not a compact JWS');
|
|
241
|
+
}
|
|
242
|
+
const [headerPart, payloadPart, signaturePart] = parts;
|
|
243
|
+
let header;
|
|
244
|
+
try {
|
|
245
|
+
header = decodeJson(headerPart);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return refuse('malformed', 'the header is not JSON');
|
|
249
|
+
}
|
|
250
|
+
if (!header || typeof header !== 'object' || Array.isArray(header))
|
|
251
|
+
return refuse('malformed', 'the header is not an object');
|
|
252
|
+
if (header.alg !== APPROVAL_RECEIPT_ALG)
|
|
253
|
+
return refuse('malformed', `the header's alg is not ${APPROVAL_RECEIPT_ALG}`);
|
|
254
|
+
if (header.typ !== APPROVAL_RECEIPT_TYP)
|
|
255
|
+
return refuse('malformed', `the header's typ is not ${APPROVAL_RECEIPT_TYP}`);
|
|
256
|
+
if (typeof header.kid !== 'string' || !header.kid)
|
|
257
|
+
return refuse('malformed', 'the header names no kid');
|
|
258
|
+
if (header.crit !== undefined)
|
|
259
|
+
return refuse('malformed', 'the header names critical extensions, which a receipt has none of');
|
|
260
|
+
let jwk;
|
|
261
|
+
try {
|
|
262
|
+
jwk = await receiptKey(options.jwks, header.kid, options.fetch, now);
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
return refuse('key', `the receipt keys could not be read: ${err instanceof Error ? err.message : String(err)}`);
|
|
266
|
+
}
|
|
267
|
+
if (!jwk)
|
|
268
|
+
return refuse('key', `no published receipt key has kid "${header.kid}"`);
|
|
269
|
+
let signature;
|
|
270
|
+
try {
|
|
271
|
+
signature = base64UrlToBytes(signaturePart);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return refuse('malformed', 'the signature is not base64url');
|
|
275
|
+
}
|
|
276
|
+
const subtle = await subtleCrypto();
|
|
277
|
+
let valid;
|
|
278
|
+
try {
|
|
279
|
+
const key = await subtle.importKey('jwk', { kty: 'OKP', crv: 'Ed25519', x: jwk.x }, { name: 'Ed25519' }, false, ['verify']);
|
|
280
|
+
valid =
|
|
281
|
+
signature.length === 64 &&
|
|
282
|
+
(await subtle.verify({ name: 'Ed25519' }, key, signature, new TextEncoder().encode(`${headerPart}.${payloadPart}`)));
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
valid = false;
|
|
286
|
+
}
|
|
287
|
+
if (!valid)
|
|
288
|
+
return refuse('signature', `the signature is not key "${header.kid}"'s over this receipt`);
|
|
289
|
+
let claims;
|
|
290
|
+
try {
|
|
291
|
+
claims = decodeJson(payloadPart);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return refuse('malformed', 'the claims are not JSON');
|
|
295
|
+
}
|
|
296
|
+
const problem = approvalReceiptClaimsProblem(claims);
|
|
297
|
+
if (problem)
|
|
298
|
+
return refuse('malformed', problem);
|
|
299
|
+
const c = claims;
|
|
300
|
+
const nowSec = Math.floor(now / 1000);
|
|
301
|
+
if (nowSec >= c.exp + APPROVAL_RECEIPT_CLOCK_SKEW_SEC)
|
|
302
|
+
return refuse('expired', 'the receipt has expired');
|
|
303
|
+
if (c.iat > nowSec + APPROVAL_RECEIPT_CLOCK_SKEW_SEC)
|
|
304
|
+
return refuse('expired', 'the receipt was issued in the future');
|
|
305
|
+
const audience = approvalReceiptAudience(options.audience) ?? options.audience;
|
|
306
|
+
if (c.aud !== audience)
|
|
307
|
+
return refuse('audience', `the receipt is for ${c.aud}, not ${audience}`);
|
|
308
|
+
if (c.argsHash !== options.expectedArgsHash)
|
|
309
|
+
return refuse('args', 'the receipt is for other arguments than this request carries');
|
|
310
|
+
return { ok: true, claims: c };
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/approvals/receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,5 +103,5 @@ export interface ApprovalOwner {
|
|
|
103
103
|
userId: string;
|
|
104
104
|
conversationId: string;
|
|
105
105
|
}
|
|
106
|
-
export type { ActionRequestApproval, ApprovalChannel, ApprovalContinuation, ApprovalDecidePayload, ApprovalDecideResult, ApprovalDecision, ApprovalEffect, ApprovalGrant, ApprovalPreview, ApprovalPreviewArgument, ApprovalRedeemResult, ApprovalRefusal, ApprovalRefusalReason, ApprovalRequiredEvent, ApprovalStatus, ApprovalTokenClaims, ApprovedCall, PendingApprovalInput, } from '@ouispec/contract';
|
|
106
|
+
export type { ActionRequestApproval, ApprovalChannel, ApprovalContinuation, ApprovalDecidePayload, ApprovalDecideResult, ApprovalDecision, ApprovalEffect, ApprovalGrant, ApprovalPreview, ApprovalPreviewArgument, ApprovalRedeemResult, ApprovalRefusal, ApprovalRefusalReason, ApprovalRequiredEvent, ApprovalStatus, ApprovalReceiptClaims, ApprovalTokenClaims, ApprovedCall, PendingApprovalInput, } from '@ouispec/contract';
|
|
107
107
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/approvals/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AAE/F;;;;;GAKG;AAEH,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;CAQ1B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAClD,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAA4C,CAAC;AAErG;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAwB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9D,eAAO,MAAM,yBAAyB,EAAE,SAAS,sBAAsB,EAA8B,CAAC;AAEtG,mGAAmG;AACnG,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;CAC9C;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAKD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/approvals/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AAE/F;;;;;GAKG;AAEH,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;CAQ1B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAClD,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAA4C,CAAC;AAErG;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAwB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9D,eAAO,MAAM,yBAAyB,EAAE,SAAS,sBAAsB,EAA8B,CAAC;AAEtG,mGAAmG;AACnG,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;CAC9C;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAKD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/approvals/types.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,GAAG;IACV,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,MAAM,CAAC;AAqDhD,MAAM,CAAC,MAAM,yBAAyB,GAAsC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/approvals/types.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,GAAG;IACV,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,MAAM,CAAC;AAqDhD,MAAM,CAAC,MAAM,yBAAyB,GAAsC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AA+CtG,MAAM,aAAa,GAAmD,IAAI,CAAC;AAC3E,MAAM,WAAW,GAA0C,IAAI,CAAC;AAChE,KAAK,aAAa,CAAC;AACnB,KAAK,WAAW,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "Approval receipts and the result every verifier must give for each. Verify each `receipt` against `jwks`, with `audience` as the tool's audience, `expectedArgsHash` as the hash of the request it received, and `now` (epoch seconds) as the time. A refusal must give `result.reason`; a receipt that verifies must give exactly `result.claims`. `signingKeys` holds every key the receipts were signed with, private parts included: a signer that writes the header and claims in the order shown must reproduce each valid receipt byte for byte.",
|
|
4
|
+
"provenance": "Written by packages/agent-core/scripts/receipt-vectors.mjs with node:crypto alone: Ed25519 signatures are deterministic, the arguments are hashed from their canonical form as written below, and every time is fixed. The keys come from published seeds and sign nothing real.",
|
|
5
|
+
"now": 1793145600,
|
|
6
|
+
"audience": "https://api.example.com",
|
|
7
|
+
"args": {
|
|
8
|
+
"vehicleId": "VIN-1HGCM82633A004352",
|
|
9
|
+
"slot": "2026-10-28T15:30:00-04:00",
|
|
10
|
+
"customer": {
|
|
11
|
+
"phone": "+15555550142",
|
|
12
|
+
"name": "Ana Souza"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"canonicalArgs": "{\"customer\":{\"name\":\"Ana Souza\",\"phone\":\"+15555550142\"},\"slot\":\"2026-10-28T15:30:00-04:00\",\"vehicleId\":\"VIN-1HGCM82633A004352\"}",
|
|
16
|
+
"expectedArgsHash": "63b49d3bd683750bf05cc00af982b2b4e5b2903e859052a86c9a4d3c8cedb59f",
|
|
17
|
+
"jwks": {
|
|
18
|
+
"keys": [
|
|
19
|
+
{
|
|
20
|
+
"kty": "OKP",
|
|
21
|
+
"crv": "Ed25519",
|
|
22
|
+
"x": "ml9nEfpt1d5wH6TDUg3mI9zygBB5g-g0Uf2Y_fxV7Gw",
|
|
23
|
+
"kid": "receipt-2026-10",
|
|
24
|
+
"alg": "EdDSA",
|
|
25
|
+
"use": "sig"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"kty": "OKP",
|
|
29
|
+
"crv": "Ed25519",
|
|
30
|
+
"x": "AGiwOPWf-13pP5-ZYdFJPWpuPFAV96144MAwUkKWHIk",
|
|
31
|
+
"kid": "receipt-2026-07",
|
|
32
|
+
"alg": "EdDSA",
|
|
33
|
+
"use": "sig"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"signingKeys": [
|
|
38
|
+
{
|
|
39
|
+
"kty": "OKP",
|
|
40
|
+
"crv": "Ed25519",
|
|
41
|
+
"kid": "receipt-2026-10",
|
|
42
|
+
"x": "ml9nEfpt1d5wH6TDUg3mI9zygBB5g-g0Uf2Y_fxV7Gw",
|
|
43
|
+
"d": "oVL5iy4RviQHSAQyVDXTn_pGRCjkQ9tK6v6ytmcUens"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"kty": "OKP",
|
|
47
|
+
"crv": "Ed25519",
|
|
48
|
+
"kid": "receipt-2026-07",
|
|
49
|
+
"x": "AGiwOPWf-13pP5-ZYdFJPWpuPFAV96144MAwUkKWHIk",
|
|
50
|
+
"d": "AzpU5g1LDkYK2ubiyObI5q7f2nBLFUiB3Q-3C5cs4W0"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"kty": "OKP",
|
|
54
|
+
"crv": "Ed25519",
|
|
55
|
+
"kid": "receipt-2026-04",
|
|
56
|
+
"x": "GCRxk8RuVjisqZN0Vrb3m8mnBcCiCc_9TlVj6OnUphI",
|
|
57
|
+
"d": "Py5prdt0Axx9wqIzUkVFqzcQsZs6nJ-ZINqveSPTQxs"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"kty": "OKP",
|
|
61
|
+
"crv": "Ed25519",
|
|
62
|
+
"kid": "another-environment",
|
|
63
|
+
"x": "M1EtZG-9Iy29Vkq8fuQX-yV1buSgPmDGjDWC3Q4qU3k",
|
|
64
|
+
"d": "LG2oMvPvL1tj07TqY92DcL8lhQSAjC7C8KtcH_aPqRQ"
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"vectors": [
|
|
68
|
+
{
|
|
69
|
+
"name": "valid: signed by the active key, every claim",
|
|
70
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.jdc-wTgTiHmNfINq--iOo8E7M6V6VbYmCSvRzUYpZ_YD7P7JtdgWxaec7gvdJYPRgYEKJ0g_xUyTkbTcx55lDQ",
|
|
71
|
+
"result": {
|
|
72
|
+
"ok": true,
|
|
73
|
+
"claims": {
|
|
74
|
+
"iss": "https://realtime.example.com",
|
|
75
|
+
"aud": "https://api.example.com",
|
|
76
|
+
"approvalId": "toolu_01JBK7Q4R8M2V6X9",
|
|
77
|
+
"argsHash": "63b49d3bd683750bf05cc00af982b2b4e5b2903e859052a86c9a4d3c8cedb59f",
|
|
78
|
+
"tool": "bookings_create",
|
|
79
|
+
"operationId": "bookings_create",
|
|
80
|
+
"conversationId": "conv_7f3a9c",
|
|
81
|
+
"userId": "user_42",
|
|
82
|
+
"accountId": "acct_dealer_17",
|
|
83
|
+
"channel": "voice",
|
|
84
|
+
"iat": 1793145595,
|
|
85
|
+
"exp": 1793145715,
|
|
86
|
+
"jti": "f5b8e7c2-4d1a-4e9b-9c3f-2a6d8e0b1c47"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "valid: no optional claims (no operationId, no accountId), approved in a UI",
|
|
92
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJjb25maXJtX2Jvb2tpbmciLCJjb252ZXJzYXRpb25JZCI6ImNvbnZfN2YzYTljIiwidXNlcklkIjoidXNlcl80MiIsImNoYW5uZWwiOiJ1aSIsImlhdCI6MTc5MzE0NTU5NSwiZXhwIjoxNzkzMTQ1NzE1LCJqdGkiOiIwYjZjM2MxZS04ZjBhLTRkNWUtYTJiNy05ZTFmNGM2ZDhhMjAifQ.xOK04_awIKbWTt0enP4VeP6IMAGYzWEuLaZKj0LgVpU3fvPTh0XvQOllPn9GzEsXliKETnSJJBTzCtwbo5idBQ",
|
|
93
|
+
"result": {
|
|
94
|
+
"ok": true,
|
|
95
|
+
"claims": {
|
|
96
|
+
"iss": "https://realtime.example.com",
|
|
97
|
+
"aud": "https://api.example.com",
|
|
98
|
+
"approvalId": "toolu_01JBK7Q4R8M2V6X9",
|
|
99
|
+
"argsHash": "63b49d3bd683750bf05cc00af982b2b4e5b2903e859052a86c9a4d3c8cedb59f",
|
|
100
|
+
"tool": "confirm_booking",
|
|
101
|
+
"conversationId": "conv_7f3a9c",
|
|
102
|
+
"userId": "user_42",
|
|
103
|
+
"channel": "ui",
|
|
104
|
+
"iat": 1793145595,
|
|
105
|
+
"exp": 1793145715,
|
|
106
|
+
"jti": "0b6c3c1e-8f0a-4d5e-a2b7-9e1f4c6d8a20"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"name": "valid: signed by the previous key, which is still published",
|
|
112
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0wNyJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiN2MyZTliNGQtNWExZi00YzhlLWIzZDYtMmUwYTlmN2MxYjg1In0.mktb2NARmz3znJAAQMQxLR8l4D6VG3cZRLwmksloN6hsj5ul_CXgmHsgcaFtSQECBxruhOQ6cZ7twLWyXBV-CQ",
|
|
113
|
+
"result": {
|
|
114
|
+
"ok": true,
|
|
115
|
+
"claims": {
|
|
116
|
+
"iss": "https://realtime.example.com",
|
|
117
|
+
"aud": "https://api.example.com",
|
|
118
|
+
"approvalId": "toolu_01JBK7Q4R8M2V6X9",
|
|
119
|
+
"argsHash": "63b49d3bd683750bf05cc00af982b2b4e5b2903e859052a86c9a4d3c8cedb59f",
|
|
120
|
+
"tool": "bookings_create",
|
|
121
|
+
"operationId": "bookings_create",
|
|
122
|
+
"conversationId": "conv_7f3a9c",
|
|
123
|
+
"userId": "user_42",
|
|
124
|
+
"accountId": "acct_dealer_17",
|
|
125
|
+
"channel": "voice",
|
|
126
|
+
"iat": 1793145595,
|
|
127
|
+
"exp": 1793145715,
|
|
128
|
+
"jti": "7c2e9b4d-5a1f-4c8e-b3d6-2e0a9f7c1b85"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "valid: expired 59 s ago, within the clock skew",
|
|
134
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU0MjEsImV4cCI6MTc5MzE0NTU0MSwianRpIjoiM2U5ZDJmNGEtNmIxYy00YThlLWI1ZDctMWMwZjllMmE0YjY4In0.Wlpk2MNUBGMyubuo65EJB3UBnWXUQQbqrtTX8EI7rFzJOTcdR43w287wOczUgW3lLQZcqchskSwJfN6xxkvkBA",
|
|
135
|
+
"result": {
|
|
136
|
+
"ok": true,
|
|
137
|
+
"claims": {
|
|
138
|
+
"iss": "https://realtime.example.com",
|
|
139
|
+
"aud": "https://api.example.com",
|
|
140
|
+
"approvalId": "toolu_01JBK7Q4R8M2V6X9",
|
|
141
|
+
"argsHash": "63b49d3bd683750bf05cc00af982b2b4e5b2903e859052a86c9a4d3c8cedb59f",
|
|
142
|
+
"tool": "bookings_create",
|
|
143
|
+
"operationId": "bookings_create",
|
|
144
|
+
"conversationId": "conv_7f3a9c",
|
|
145
|
+
"userId": "user_42",
|
|
146
|
+
"accountId": "acct_dealer_17",
|
|
147
|
+
"channel": "voice",
|
|
148
|
+
"iat": 1793145421,
|
|
149
|
+
"exp": 1793145541,
|
|
150
|
+
"jti": "3e9d2f4a-6b1c-4a8e-b5d7-1c0f9e2a4b68"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "expired: 60 s past exp, beyond the clock skew",
|
|
156
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU0MjAsImV4cCI6MTc5MzE0NTU0MCwianRpIjoiOWExYzdlNWItMmQ0Zi00YjZhLThlMGMtNWYzZDFiN2E5YzI0In0.7nHULjfSV7J6FXAs0XHkpox5A0u5FtnyK-tiHP7TEm1Laqi0zeOxWmclVtUvBm3MUCTwr1-j_AvNptc-__R0DQ",
|
|
157
|
+
"result": {
|
|
158
|
+
"ok": false,
|
|
159
|
+
"reason": "expired"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"name": "expired: issued 61 s in the future, beyond the clock skew",
|
|
164
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU2NjEsImV4cCI6MTc5MzE0NTc4MSwianRpIjoiNmQ0YjJhOGUtMWY3Yy00ZTNhLTliNWQtMGM4ZTJmNmE0ZDE5In0.93Af8-S10xj3j9Yaqwvr9Er0LKWdL5sV-feO1OwRET2UpXEU0uDLAuXbrVlnVrfZzJCpj3cT5W6zvUZu5T93Cg",
|
|
165
|
+
"result": {
|
|
166
|
+
"ok": false,
|
|
167
|
+
"reason": "expired"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"name": "key: signed by a key that has been removed",
|
|
172
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0wNCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.XglwKVP1Cp1aQISbglRB3824DADsKEIek4uXUfwEWEYtUF6PRd657TS-dyO1zcqOqqREz-lC_ehuc8UGWVzxCg",
|
|
173
|
+
"result": {
|
|
174
|
+
"ok": false,
|
|
175
|
+
"reason": "key"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"name": "signature: names the active key, signed by another",
|
|
180
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.JExlbctWcOVonQt_ioQAddwWP7S-NcxC--d-KNAydltrbcbGHmBuhF2_lWqf8uzBywiEXBm9akt6m7gbC3dTAg",
|
|
181
|
+
"result": {
|
|
182
|
+
"ok": false,
|
|
183
|
+
"reason": "signature"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "signature: claims changed under the real signature",
|
|
188
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiMWRkNjJmY2UyMWFhY2FiMWQxY2E2NmE3NGU5NjQwOTg3YzdkZGY1ODdhZWQ5NjE5NjlmN2QyODdjOGJmYjdkNCIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.jdc-wTgTiHmNfINq--iOo8E7M6V6VbYmCSvRzUYpZ_YD7P7JtdgWxaec7gvdJYPRgYEKJ0g_xUyTkbTcx55lDQ",
|
|
189
|
+
"result": {
|
|
190
|
+
"ok": false,
|
|
191
|
+
"reason": "signature"
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"name": "signature: signature truncated",
|
|
196
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.jdc-wTgTiHmNfINq--iOo8E7M6V6VbYmCSvRzUYpZ_Y",
|
|
197
|
+
"result": {
|
|
198
|
+
"ok": false,
|
|
199
|
+
"reason": "signature"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"name": "malformed: typ is JWT",
|
|
204
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.vgAwgIGl3H_BPGd5hMtDwI6jjzcwTYrHDbaQ-bssCv2pomwgX_bXHviW7JKyXtI1aLYAmZTjqPxjIFChDy9hDQ",
|
|
205
|
+
"result": {
|
|
206
|
+
"ok": false,
|
|
207
|
+
"reason": "malformed"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"name": "malformed: alg is HS256, keyed with the public key",
|
|
212
|
+
"receipt": "eyJhbGciOiJIUzI1NiIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.JBiLvF_JjICz_or8gQzUZ3pNEgyMgIL2_D97Thw0B-0",
|
|
213
|
+
"result": {
|
|
214
|
+
"ok": false,
|
|
215
|
+
"reason": "malformed"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"name": "malformed: alg is none, with no signature",
|
|
220
|
+
"receipt": "eyJhbGciOiJub25lIiwidHlwIjoib3VpLWFwcHJvdmFsLXJlY2VpcHQrand0Iiwia2lkIjoicmVjZWlwdC0yMDI2LTEwIn0.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.",
|
|
221
|
+
"result": {
|
|
222
|
+
"ok": false,
|
|
223
|
+
"reason": "malformed"
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"name": "malformed: no kid",
|
|
228
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.-iWjBMPz8A9zO-igJdvujLpWs-rb-BTA8awPHV_kEse15IkJ3RAng0iJqo7Z2Ge9W2aYoLfkVnDebufzSlytBw",
|
|
229
|
+
"result": {
|
|
230
|
+
"ok": false,
|
|
231
|
+
"reason": "malformed"
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"name": "malformed: the header names critical extensions",
|
|
236
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCIsImNyaXQiOlsiZXhwIl19.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.x7CuVIoN1ZRA4D89ZHJyvQeyz42YWix-D44_WhmuDVT2tLC0k3Uj89e0__4ZVOP-2ZBm8BmdgQCfzOgUQzd-CQ",
|
|
237
|
+
"result": {
|
|
238
|
+
"ok": false,
|
|
239
|
+
"reason": "malformed"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"name": "malformed: not three segments",
|
|
244
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0",
|
|
245
|
+
"result": {
|
|
246
|
+
"ok": false,
|
|
247
|
+
"reason": "malformed"
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"name": "malformed: validly signed, claims not JSON",
|
|
252
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.bm90IGpzb24.GY8RAW6bwJl9bfx4o-UmcihyMGkTT3Cdh874sxoHe8IsmH1gkH5_tFzg3nVyITdeTFYnPONc5W2_AYMyOlqsCg",
|
|
253
|
+
"result": {
|
|
254
|
+
"ok": false,
|
|
255
|
+
"reason": "malformed"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"name": "malformed: validly signed, approvalId missing",
|
|
260
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcmdzSGFzaCI6IjYzYjQ5ZDNiZDY4Mzc1MGJmMDVjYzAwYWY5ODJiMmI0ZTViMjkwM2U4NTkwNTJhODZjOWE0ZDNjOGNlZGI1OWYiLCJ0b29sIjoiYm9va2luZ3NfY3JlYXRlIiwib3BlcmF0aW9uSWQiOiJib29raW5nc19jcmVhdGUiLCJjb252ZXJzYXRpb25JZCI6ImNvbnZfN2YzYTljIiwidXNlcklkIjoidXNlcl80MiIsImFjY291bnRJZCI6ImFjY3RfZGVhbGVyXzE3IiwiY2hhbm5lbCI6InZvaWNlIiwiaWF0IjoxNzkzMTQ1NTk1LCJleHAiOjE3OTMxNDU3MTUsImp0aSI6ImY1YjhlN2MyLTRkMWEtNGU5Yi05YzNmLTJhNmQ4ZTBiMWM0NyJ9.78fyUosdu0nOpCA9SRqI0h6ic1uldpchlPJEhCYnTU5EhuuvtwND8Z4wvMaFf3NwlI0xUDkCOKbvuBti9ls2DQ",
|
|
261
|
+
"result": {
|
|
262
|
+
"ok": false,
|
|
263
|
+
"reason": "malformed"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"name": "malformed: validly signed, a claim a receipt does not define",
|
|
268
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiNjNiNDlkM2JkNjgzNzUwYmYwNWNjMDBhZjk4MmIyYjRlNWIyOTAzZTg1OTA1MmE4NmM5YTRkM2M4Y2VkYjU5ZiIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3Iiwic2NvcGUiOiJib29raW5nczp3cml0ZSJ9.r_tbF6YP6wkQUQZxhrCrdF6ByTwuP0zMYJOX3Xr5YA11V5g62_K7_p0hIvbSpZ_W8I50tsmpXXOO26vcUbJ8BA",
|
|
269
|
+
"result": {
|
|
270
|
+
"ok": false,
|
|
271
|
+
"reason": "malformed"
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"name": "audience: issued for another API",
|
|
276
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkub3RoZXIuZXhhbXBsZSIsImFwcHJvdmFsSWQiOiJ0b29sdV8wMUpCSzdRNFI4TTJWNlg5IiwiYXJnc0hhc2giOiI2M2I0OWQzYmQ2ODM3NTBiZjA1Y2MwMGFmOTgyYjJiNGU1YjI5MDNlODU5MDUyYTg2YzlhNGQzYzhjZWRiNTlmIiwidG9vbCI6ImJvb2tpbmdzX2NyZWF0ZSIsIm9wZXJhdGlvbklkIjoiYm9va2luZ3NfY3JlYXRlIiwiY29udmVyc2F0aW9uSWQiOiJjb252XzdmM2E5YyIsInVzZXJJZCI6InVzZXJfNDIiLCJhY2NvdW50SWQiOiJhY2N0X2RlYWxlcl8xNyIsImNoYW5uZWwiOiJ2b2ljZSIsImlhdCI6MTc5MzE0NTU5NSwiZXhwIjoxNzkzMTQ1NzE1LCJqdGkiOiJmNWI4ZTdjMi00ZDFhLTRlOWItOWMzZi0yYTZkOGUwYjFjNDcifQ.AwgvMG_d-Ck_NyEDznAhFYAiymSe2b4Gp05SHYtN77rjd1LDY98dHh0n842JhedH06yhwaAtgYpAmxssvBTFCQ",
|
|
277
|
+
"result": {
|
|
278
|
+
"ok": false,
|
|
279
|
+
"reason": "audience"
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"name": "args: issued for other arguments",
|
|
284
|
+
"receipt": "eyJhbGciOiJFZERTQSIsInR5cCI6Im91aS1hcHByb3ZhbC1yZWNlaXB0K2p3dCIsImtpZCI6InJlY2VpcHQtMjAyNi0xMCJ9.eyJpc3MiOiJodHRwczovL3JlYWx0aW1lLmV4YW1wbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iLCJhcHByb3ZhbElkIjoidG9vbHVfMDFKQks3UTRSOE0yVjZYOSIsImFyZ3NIYXNoIjoiMWRkNjJmY2UyMWFhY2FiMWQxY2E2NmE3NGU5NjQwOTg3YzdkZGY1ODdhZWQ5NjE5NjlmN2QyODdjOGJmYjdkNCIsInRvb2wiOiJib29raW5nc19jcmVhdGUiLCJvcGVyYXRpb25JZCI6ImJvb2tpbmdzX2NyZWF0ZSIsImNvbnZlcnNhdGlvbklkIjoiY29udl83ZjNhOWMiLCJ1c2VySWQiOiJ1c2VyXzQyIiwiYWNjb3VudElkIjoiYWNjdF9kZWFsZXJfMTciLCJjaGFubmVsIjoidm9pY2UiLCJpYXQiOjE3OTMxNDU1OTUsImV4cCI6MTc5MzE0NTcxNSwianRpIjoiZjViOGU3YzItNGQxYS00ZTliLTljM2YtMmE2ZDhlMGIxYzQ3In0.X4ebLnORtbVjqHE55yf-cHs0ttcImJenVgslwSA0q1mVefQWRelGgc_eUfTq6tYp4L15O8T98jHLaaybyd-NCQ",
|
|
285
|
+
"result": {
|
|
286
|
+
"ok": false,
|
|
287
|
+
"reason": "args"
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
]
|
|
291
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ouispec/agent-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Schema types, entity graph, intent resolution, and protocol definitions for the agent SDK",
|
|
5
5
|
"homepage": "https://github.com/wesreid/oui/tree/main/packages/agent-core#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"browser": "./dist/browser.js",
|
|
22
22
|
"import": "./dist/index.js"
|
|
23
23
|
},
|
|
24
|
-
"./approval-vectors.json": "./dist/approval-vectors.json"
|
|
24
|
+
"./approval-vectors.json": "./dist/approval-vectors.json",
|
|
25
|
+
"./receipt-vectors.json": "./dist/receipt-vectors.json"
|
|
25
26
|
},
|
|
26
27
|
"files": [
|
|
27
28
|
"dist",
|
|
@@ -30,8 +31,8 @@
|
|
|
30
31
|
"dependencies": {
|
|
31
32
|
"ajv": "^8.17.0",
|
|
32
33
|
"yaml": "^2.7.0",
|
|
33
|
-
"@ouispec/agent-events": "^0.
|
|
34
|
-
"@ouispec/contract": "^0.4.
|
|
34
|
+
"@ouispec/agent-events": "^0.17.0",
|
|
35
|
+
"@ouispec/contract": "^0.4.9",
|
|
35
36
|
"oui-spec": "^0.11.1"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
},
|
|
46
47
|
"browser": "./dist/browser.js",
|
|
47
48
|
"scripts": {
|
|
48
|
-
"build": "tsc -p tsconfig.build.json && node -e \"require('node:fs').copyFileSync(require.resolve('oui-spec/approval-vectors.json'), 'dist/approval-vectors.json')\"",
|
|
49
|
+
"build": "tsc -p tsconfig.build.json && node -e \"require('node:fs').copyFileSync(require.resolve('oui-spec/approval-vectors.json'), 'dist/approval-vectors.json')\" && node scripts/receipt-vectors.mjs --check && node -e \"require('node:fs').copyFileSync('receipt-vectors.json', 'dist/receipt-vectors.json')\"",
|
|
49
50
|
"typecheck": "tsc --noEmit",
|
|
50
51
|
"test": "vitest run --passWithNoTests",
|
|
51
52
|
"clean": "rm -rf dist"
|