@ouispec/agent-core 0.15.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 +15 -1
- package/dist/approvals/types.d.ts.map +1 -1
- package/dist/approvals/types.js +14 -0
- package/dist/approvals/types.js.map +1 -1
- package/dist/message-input/index.d.ts +33 -2
- package/dist/message-input/index.d.ts.map +1 -1
- package/dist/message-input/index.js +40 -4
- package/dist/message-input/index.js.map +1 -1
- package/dist/protocol/index.d.ts +19 -1
- package/dist/protocol/index.d.ts.map +1 -1
- package/dist/protocol/index.js +9 -0
- package/dist/protocol/index.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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"}
|
|
@@ -7,6 +7,20 @@ import type { ApprovalChannel } from '@ouispec/contract';
|
|
|
7
7
|
*/
|
|
8
8
|
/** The client event a user's socket sends when they click the approval card. */
|
|
9
9
|
export declare const APPROVAL_DECIDE_EVENT = "approval:decide";
|
|
10
|
+
/**
|
|
11
|
+
* The longest each part of an approval's preview may be, in characters: what
|
|
12
|
+
* the approval store accepts, and what the worker holds a host's own preview
|
|
13
|
+
* (`approvals.preview`) to before it stores or shows it.
|
|
14
|
+
*/
|
|
15
|
+
export declare const APPROVAL_PREVIEW_LIMITS: {
|
|
16
|
+
readonly title: 500;
|
|
17
|
+
readonly consequence: 2000;
|
|
18
|
+
readonly arguments: 50;
|
|
19
|
+
readonly argumentName: 200;
|
|
20
|
+
readonly argumentLabel: 500;
|
|
21
|
+
readonly argumentValue: 4000;
|
|
22
|
+
readonly readback: 8000;
|
|
23
|
+
};
|
|
10
24
|
/** How long an approval lasts unless its action declares otherwise. */
|
|
11
25
|
export declare const DEFAULT_APPROVAL_TTL_MS: number;
|
|
12
26
|
/** The longest an action may declare an approval lasts. */
|
|
@@ -89,5 +103,5 @@ export interface ApprovalOwner {
|
|
|
89
103
|
userId: string;
|
|
90
104
|
conversationId: string;
|
|
91
105
|
}
|
|
92
|
-
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';
|
|
93
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,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"}
|
package/dist/approvals/types.js
CHANGED
|
@@ -6,6 +6,20 @@
|
|
|
6
6
|
*/
|
|
7
7
|
/** The client event a user's socket sends when they click the approval card. */
|
|
8
8
|
export const APPROVAL_DECIDE_EVENT = 'approval:decide';
|
|
9
|
+
/**
|
|
10
|
+
* The longest each part of an approval's preview may be, in characters: what
|
|
11
|
+
* the approval store accepts, and what the worker holds a host's own preview
|
|
12
|
+
* (`approvals.preview`) to before it stores or shows it.
|
|
13
|
+
*/
|
|
14
|
+
export const APPROVAL_PREVIEW_LIMITS = {
|
|
15
|
+
title: 500,
|
|
16
|
+
consequence: 2000,
|
|
17
|
+
arguments: 50,
|
|
18
|
+
argumentName: 200,
|
|
19
|
+
argumentLabel: 500,
|
|
20
|
+
argumentValue: 4000,
|
|
21
|
+
readback: 8000,
|
|
22
|
+
};
|
|
9
23
|
/** How long an approval lasts unless its action declares otherwise. */
|
|
10
24
|
export const DEFAULT_APPROVAL_TTL_MS = 5 * 60_000;
|
|
11
25
|
/** The longest an action may declare an approval lasts. */
|
|
@@ -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,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"}
|
|
@@ -49,14 +49,45 @@ export declare const REPLY_OUTPUT_CONTEXT_KEY = "output";
|
|
|
49
49
|
/** The ways a reply can reach the person besides being shown as text. A shown reply carries no `output`. */
|
|
50
50
|
export declare const REPLY_OUTPUT_MODES: readonly ["voice"];
|
|
51
51
|
export type ReplyOutputMode = (typeof REPLY_OUTPUT_MODES)[number];
|
|
52
|
+
/**
|
|
53
|
+
* What the voice that reads a spoken reply can be directed with: the inline
|
|
54
|
+
* tags its speech engine honours (`[laughs]`, `[whispering]`), and how to use
|
|
55
|
+
* them. The service that speaks the reply sends it, since only it knows which
|
|
56
|
+
* engine will read the reply; the model is told it may use those tags.
|
|
57
|
+
*/
|
|
58
|
+
export interface VoiceDirections {
|
|
59
|
+
/** The speech engine the tags are for, as the service names it. */
|
|
60
|
+
engine: string;
|
|
61
|
+
/** The tags the engine honours, each exactly as it is written in the text. */
|
|
62
|
+
tags: string[];
|
|
63
|
+
/** How and when to use them, in the service's words. */
|
|
64
|
+
guidance: string;
|
|
65
|
+
}
|
|
66
|
+
/** Limits on `VoiceDirections`: longer is not a direction contract, and is left out. */
|
|
67
|
+
export declare const VOICE_DIRECTIONS_LIMITS: {
|
|
68
|
+
readonly engineChars: 64;
|
|
69
|
+
readonly tags: 64;
|
|
70
|
+
readonly tagChars: 64;
|
|
71
|
+
readonly guidanceChars: 2000;
|
|
72
|
+
};
|
|
52
73
|
/** A reply that will be spoken: a voice reads its text out, and nothing of it is shown. */
|
|
53
74
|
export interface ReplyOutput {
|
|
54
75
|
mode: ReplyOutputMode;
|
|
76
|
+
/** The voice's direction tags, when the speaking service offers them. */
|
|
77
|
+
voiceDirections?: VoiceDirections;
|
|
55
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* `value` as voice directions, or null when it is not one: an engine, a list
|
|
81
|
+
* of tags and guidance, each a non-blank string within `VOICE_DIRECTIONS_LIMITS`
|
|
82
|
+
* and free of control characters (guidance may break lines). Tags are kept
|
|
83
|
+
* once each, in order.
|
|
84
|
+
*/
|
|
85
|
+
export declare function readVoiceDirections(value: unknown): VoiceDirections | null;
|
|
56
86
|
/**
|
|
57
87
|
* How a reply reaches the person, when `value` says so in a way this runtime
|
|
58
|
-
* knows; else null, and the reply is shown as text. Anything but the mode
|
|
59
|
-
* left out
|
|
88
|
+
* knows; else null, and the reply is shown as text. Anything but the mode and
|
|
89
|
+
* well-formed `voiceDirections` is left out; malformed directions are left
|
|
90
|
+
* out and the reply is still spoken.
|
|
60
91
|
*/
|
|
61
92
|
export declare function readReplyOutput(value: unknown): ReplyOutput | null;
|
|
62
93
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/message-input/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAEjD,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,oBAAqB,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAStE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAMpE;AAED,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,4GAA4G;AAC5G,eAAO,MAAM,kBAAkB,oBAAqB,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/message-input/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAEjD,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,oBAAqB,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAStE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAMpE;AAED,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,4GAA4G;AAC5G,eAAO,MAAM,kBAAkB,oBAAqB,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wFAAwF;AACxF,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,yEAAyE;IACzE,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAQD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAW1E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAMlE"}
|
|
@@ -60,17 +60,53 @@ export function readMessageInput(value) {
|
|
|
60
60
|
export const REPLY_OUTPUT_CONTEXT_KEY = 'output';
|
|
61
61
|
/** The ways a reply can reach the person besides being shown as text. A shown reply carries no `output`. */
|
|
62
62
|
export const REPLY_OUTPUT_MODES = ['voice'];
|
|
63
|
+
/** Limits on `VoiceDirections`: longer is not a direction contract, and is left out. */
|
|
64
|
+
export const VOICE_DIRECTIONS_LIMITS = {
|
|
65
|
+
engineChars: 64,
|
|
66
|
+
tags: 64,
|
|
67
|
+
tagChars: 64,
|
|
68
|
+
guidanceChars: 2_000,
|
|
69
|
+
};
|
|
70
|
+
/** Any control character but none of the ordinary whitespace a guidance paragraph may hold. */
|
|
71
|
+
// eslint-disable-next-line no-control-regex
|
|
72
|
+
const DIRECTION_CONTROL = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/;
|
|
73
|
+
// eslint-disable-next-line no-control-regex
|
|
74
|
+
const LINE_CONTROL = /[\u0000-\u001f\u007f]/;
|
|
75
|
+
/**
|
|
76
|
+
* `value` as voice directions, or null when it is not one: an engine, a list
|
|
77
|
+
* of tags and guidance, each a non-blank string within `VOICE_DIRECTIONS_LIMITS`
|
|
78
|
+
* and free of control characters (guidance may break lines). Tags are kept
|
|
79
|
+
* once each, in order.
|
|
80
|
+
*/
|
|
81
|
+
export function readVoiceDirections(value) {
|
|
82
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
83
|
+
return null;
|
|
84
|
+
const { engine, tags, guidance } = value;
|
|
85
|
+
const line = (s, max) => typeof s === 'string' && s.trim().length > 0 && s.length <= max && !LINE_CONTROL.test(s);
|
|
86
|
+
if (!line(engine, VOICE_DIRECTIONS_LIMITS.engineChars))
|
|
87
|
+
return null;
|
|
88
|
+
if (!Array.isArray(tags) || tags.length === 0 || tags.length > VOICE_DIRECTIONS_LIMITS.tags)
|
|
89
|
+
return null;
|
|
90
|
+
if (!tags.every((t) => line(t, VOICE_DIRECTIONS_LIMITS.tagChars)))
|
|
91
|
+
return null;
|
|
92
|
+
if (typeof guidance !== 'string' || !guidance.trim() || guidance.length > VOICE_DIRECTIONS_LIMITS.guidanceChars || DIRECTION_CONTROL.test(guidance)) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return { engine: engine.trim(), tags: [...new Set(tags.map((t) => t.trim()))], guidance: guidance.trim() };
|
|
96
|
+
}
|
|
63
97
|
/**
|
|
64
98
|
* How a reply reaches the person, when `value` says so in a way this runtime
|
|
65
|
-
* knows; else null, and the reply is shown as text. Anything but the mode
|
|
66
|
-
* left out
|
|
99
|
+
* knows; else null, and the reply is shown as text. Anything but the mode and
|
|
100
|
+
* well-formed `voiceDirections` is left out; malformed directions are left
|
|
101
|
+
* out and the reply is still spoken.
|
|
67
102
|
*/
|
|
68
103
|
export function readReplyOutput(value) {
|
|
69
104
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
70
105
|
return null;
|
|
71
|
-
const { mode } = value;
|
|
106
|
+
const { mode, voiceDirections } = value;
|
|
72
107
|
if (typeof mode !== 'string' || !REPLY_OUTPUT_MODES.includes(mode))
|
|
73
108
|
return null;
|
|
74
|
-
|
|
109
|
+
const directions = readVoiceDirections(voiceDirections);
|
|
110
|
+
return { mode: mode, ...(directions ? { voiceDirections: directions } : {}) };
|
|
75
111
|
}
|
|
76
112
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/message-input/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AAEjD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAO,CAAU,CAAC;AAItD,kFAAkF;AAClF,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAYnD,uFAAuF;AACvF,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,gCAAgC;QAAE,OAAO,IAAI,CAAC;IACpH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,8EAA8E;QAC9E,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAgC,CAAC;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxG,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,IAAwB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEjD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/message-input/index.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare const AGENT_SOCKET_EVENTS: {
|
|
|
10
10
|
readonly TURN_STARTED: "agent:turn_started";
|
|
11
11
|
readonly TOKEN: "agent:token";
|
|
12
12
|
readonly TOKEN_CLEAR: "agent:token_clear";
|
|
13
|
+
readonly ROUND_END: "agent:round_end";
|
|
13
14
|
readonly TOOL_CALL_STARTED: "agent:tool_call_started";
|
|
14
15
|
readonly TOOL_CALL_COMPLETE: "agent:tool_call_complete";
|
|
15
16
|
readonly TURN_COMPLETE: "agent:turn_complete";
|
|
@@ -44,11 +45,28 @@ export declare function displayedToolCall(call: {
|
|
|
44
45
|
name: string;
|
|
45
46
|
arguments?: Record<string, unknown>;
|
|
46
47
|
};
|
|
47
|
-
export type AgentProtocolEvent = TokenEvent | TokenClearEvent | IntentCallEvent | IntentResultEvent | UICommandEvent | ContextSyncEvent | LearningSignalEvent | SessionUpdateEvent | ErrorEvent | DoneEvent | ApprovalRequiredProtocolEvent | ReasoningEvent;
|
|
48
|
+
export type AgentProtocolEvent = TokenEvent | TokenClearEvent | RoundEndEvent | IntentCallEvent | IntentResultEvent | UICommandEvent | ContextSyncEvent | LearningSignalEvent | SessionUpdateEvent | ErrorEvent | DoneEvent | ApprovalRequiredProtocolEvent | ReasoningEvent;
|
|
48
49
|
export interface TokenEvent {
|
|
49
50
|
type: 'token';
|
|
50
51
|
content: string;
|
|
51
52
|
turnId: string;
|
|
53
|
+
/** The round (model step) of the turn the text belongs to, from 0. Absent from a worker that does not say. */
|
|
54
|
+
step?: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A round (one model step) of the turn ended, and all of its text has been
|
|
58
|
+
* sent. `calledTools`: the round called tools. `final`: no round follows it,
|
|
59
|
+
* so its text is the turn's last word (a round that ended at an approval or a
|
|
60
|
+
* choice for the person is final though it called a tool). A consumer that
|
|
61
|
+
* shows or speaks only what the turn ends with holds each round's text until
|
|
62
|
+
* this, and keeps it when `final`.
|
|
63
|
+
*/
|
|
64
|
+
export interface RoundEndEvent {
|
|
65
|
+
type: 'round_end';
|
|
66
|
+
step: number;
|
|
67
|
+
calledTools: boolean;
|
|
68
|
+
final: boolean;
|
|
69
|
+
turnId: string;
|
|
52
70
|
}
|
|
53
71
|
export interface TokenClearEvent {
|
|
54
72
|
type: 'token_clear';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/index.js
CHANGED
|
@@ -41,6 +41,10 @@ export const TURN_END_REASONS = [
|
|
|
41
41
|
export function isTurnEndReason(value) {
|
|
42
42
|
return typeof value === 'string' && TURN_END_REASONS.includes(value);
|
|
43
43
|
}
|
|
44
|
+
/** A round index: a whole number from 0. */
|
|
45
|
+
function isStep(value) {
|
|
46
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0;
|
|
47
|
+
}
|
|
44
48
|
/**
|
|
45
49
|
* Maps a raw Socket.IO event (name + payload) to an AgentProtocolEvent.
|
|
46
50
|
* This is the canonical mapping — platforms never need to write their own.
|
|
@@ -57,7 +61,12 @@ export function parseSocketEvent(event, data, fallbackTurnId) {
|
|
|
57
61
|
type: 'token',
|
|
58
62
|
content: payload.text ?? payload.token ?? payload.content ?? '',
|
|
59
63
|
turnId,
|
|
64
|
+
...(isStep(payload.step) ? { step: payload.step } : {}),
|
|
60
65
|
};
|
|
66
|
+
case AGENT_SOCKET_EVENTS.ROUND_END:
|
|
67
|
+
if (!isStep(payload.step) || typeof payload.calledTools !== 'boolean' || typeof payload.final !== 'boolean')
|
|
68
|
+
return null;
|
|
69
|
+
return { type: 'round_end', step: payload.step, calledTools: payload.calledTools, final: payload.final, turnId };
|
|
61
70
|
case AGENT_SOCKET_EVENTS.TOKEN_CLEAR:
|
|
62
71
|
return {
|
|
63
72
|
type: 'token_clear',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAA0B,MAAM,mBAAmB,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAIrD,MAAM,CAAC,MAAM,uBAAuB,GAA2B,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAElG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAEnG;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2D;IAI3F,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;IACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAgC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1H,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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/
|
|
34
|
-
"@ouispec/
|
|
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"
|