@agenticprimitives/a2a 0.0.0-alpha.3 → 0.0.0-alpha.30
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/CLAUDE.md +60 -21
- package/README.md +2 -0
- package/bin/a2a-conform.mjs +17 -0
- package/dist/agent.d.ts +183 -3
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +361 -62
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts +72 -9
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +62 -19
- package/dist/auth.js.map +1 -1
- package/dist/authority-extension.d.ts +58 -0
- package/dist/authority-extension.d.ts.map +1 -0
- package/dist/authority-extension.js +70 -0
- package/dist/authority-extension.js.map +1 -0
- package/dist/card-audience.d.ts +87 -0
- package/dist/card-audience.d.ts.map +1 -0
- package/dist/card-audience.js +135 -0
- package/dist/card-audience.js.map +1 -0
- package/dist/client.d.ts +23 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +74 -13
- package/dist/client.js.map +1 -1
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +10 -2
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/conform/index.d.ts +36 -0
- package/dist/conform/index.d.ts.map +1 -0
- package/dist/conform/index.js +232 -0
- package/dist/conform/index.js.map +1 -0
- package/dist/discovery.d.ts +4 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +6 -2
- package/dist/discovery.js.map +1 -1
- package/dist/engagement.d.ts +37 -0
- package/dist/engagement.d.ts.map +1 -0
- package/dist/engagement.js +83 -0
- package/dist/engagement.js.map +1 -0
- package/dist/grant.d.ts +4 -2
- package/dist/grant.d.ts.map +1 -1
- package/dist/grant.js +21 -13
- package/dist/grant.js.map +1 -1
- package/dist/handoff.d.ts +42 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +28 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +26 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/payment-gate.d.ts +88 -0
- package/dist/payment-gate.d.ts.map +1 -0
- package/dist/payment-gate.js +47 -0
- package/dist/payment-gate.js.map +1 -0
- package/dist/run-provenance-extension.d.ts +22 -0
- package/dist/run-provenance-extension.d.ts.map +1 -0
- package/dist/run-provenance-extension.js +23 -0
- package/dist/run-provenance-extension.js.map +1 -0
- package/dist/runtime.d.ts +13 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +35 -10
- package/dist/runtime.js.map +1 -1
- package/dist/session-wire.d.ts +90 -0
- package/dist/session-wire.d.ts.map +1 -0
- package/dist/session-wire.js +226 -0
- package/dist/session-wire.js.map +1 -0
- package/dist/skill-handler.d.ts +26 -1
- package/dist/skill-handler.d.ts.map +1 -1
- package/dist/skill-handler.js.map +1 -1
- package/dist/standard/app-delegation.d.ts +60 -0
- package/dist/standard/app-delegation.d.ts.map +1 -0
- package/dist/standard/app-delegation.js +40 -0
- package/dist/standard/app-delegation.js.map +1 -0
- package/dist/standard/caller.d.ts +107 -0
- package/dist/standard/caller.d.ts.map +1 -0
- package/dist/standard/caller.js +176 -0
- package/dist/standard/caller.js.map +1 -0
- package/dist/standard/client.d.ts +53 -0
- package/dist/standard/client.d.ts.map +1 -0
- package/dist/standard/client.js +88 -0
- package/dist/standard/client.js.map +1 -0
- package/dist/standard/delegated.d.ts +121 -0
- package/dist/standard/delegated.d.ts.map +1 -0
- package/dist/standard/delegated.js +170 -0
- package/dist/standard/delegated.js.map +1 -0
- package/dist/standard/errors.d.ts +31 -0
- package/dist/standard/errors.d.ts.map +1 -0
- package/dist/standard/errors.js +75 -0
- package/dist/standard/errors.js.map +1 -0
- package/dist/standard/from-agent.d.ts +41 -0
- package/dist/standard/from-agent.d.ts.map +1 -0
- package/dist/standard/from-agent.js +133 -0
- package/dist/standard/from-agent.js.map +1 -0
- package/dist/standard/index.d.ts +10 -0
- package/dist/standard/index.d.ts.map +1 -0
- package/dist/standard/index.js +14 -0
- package/dist/standard/index.js.map +1 -0
- package/dist/standard/mount.d.ts +94 -0
- package/dist/standard/mount.d.ts.map +1 -0
- package/dist/standard/mount.js +186 -0
- package/dist/standard/mount.js.map +1 -0
- package/dist/standard/server.d.ts +130 -0
- package/dist/standard/server.d.ts.map +1 -0
- package/dist/standard/server.js +497 -0
- package/dist/standard/server.js.map +1 -0
- package/dist/standard/types.d.ts +186 -0
- package/dist/standard/types.d.ts.map +1 -0
- package/dist/standard/types.js +14 -0
- package/dist/standard/types.js.map +1 -0
- package/dist/subject-ask.d.ts +96 -0
- package/dist/subject-ask.d.ts.map +1 -0
- package/dist/subject-ask.js +45 -0
- package/dist/subject-ask.js.map +1 -0
- package/dist/subject-hop.d.ts +117 -0
- package/dist/subject-hop.d.ts.map +1 -0
- package/dist/subject-hop.js +187 -0
- package/dist/subject-hop.js.map +1 -0
- package/dist/task-store.d.ts +9 -3
- package/dist/task-store.d.ts.map +1 -1
- package/dist/task-store.js +12 -6
- package/dist/task-store.js.map +1 -1
- package/dist/wire-verify.d.ts +35 -0
- package/dist/wire-verify.d.ts.map +1 -0
- package/dist/wire-verify.js +51 -0
- package/dist/wire-verify.js.map +1 -0
- package/package.json +35 -12
- package/dist/jsonrpc.d.ts +0 -25
- package/dist/jsonrpc.d.ts.map +0 -1
- package/dist/jsonrpc.js +0 -52
- package/dist/jsonrpc.js.map +0 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Card-audience authentication (spec 338 §8, W4-b).
|
|
2
|
+
//
|
|
3
|
+
// THE HOLE THIS CLOSES: hosts were serving the extended card on a QUERY PARAMETER
|
|
4
|
+
// (`?view=authenticated`). Anyone could type it. The extended card is supposed to reveal fine-grained
|
|
5
|
+
// skills to *verified* callers, so a parameter that anyone can set makes the split decorative.
|
|
6
|
+
//
|
|
7
|
+
// A requester now proves control of its Smart Agent by signing a challenge bound to
|
|
8
|
+
// {requester, nonce, cardOrigin, requestedView, issuedAt}. Verification goes through the injected
|
|
9
|
+
// signature port — the same `UniversalSignatureValidator` surface used everywhere else, so EOA,
|
|
10
|
+
// ERC-1271, ERC-6492 and passkey credentials all work unchanged.
|
|
11
|
+
//
|
|
12
|
+
// ─── DEGRADE, DON'T DENY ────────────────────────────────────────────────────────────────────────
|
|
13
|
+
// Every failure resolves to `{ audience: 'public' }` rather than an error. That is deliberate and it
|
|
14
|
+
// IS the fail-closed choice here: the public card is genuinely public, so the safe fallback is
|
|
15
|
+
// LEAST DISCLOSURE, not a 401. It also means a plain unauthenticated `curl` keeps working, which is
|
|
16
|
+
// the whole point of a well-known card.
|
|
17
|
+
//
|
|
18
|
+
// The rule to hold onto: a failed proof must never widen the audience. It can only ever leave it at
|
|
19
|
+
// `public`.
|
|
20
|
+
import { isAgentAuthenticatedPeer } from '@agenticprimitives/types';
|
|
21
|
+
const DEFAULT_MAX_CLAIM_AGE_MS = 2 * 60 * 1000;
|
|
22
|
+
/** The public audience — the floor, and the answer to every failed claim. */
|
|
23
|
+
export const PUBLIC_AUDIENCE = { audience: 'public' };
|
|
24
|
+
function normalizeView(v) {
|
|
25
|
+
return v === 'authenticated' || v === 'private' ? v : null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build the resolver a card route calls to turn a request into an audience.
|
|
29
|
+
*
|
|
30
|
+
* Never throws. Never returns an audience wider than the claim proved.
|
|
31
|
+
*/
|
|
32
|
+
export function createCardAudienceResolver(opts) {
|
|
33
|
+
return async (claim, peer) => {
|
|
34
|
+
const deny = (reason) => {
|
|
35
|
+
opts.observe?.({ granted: 'public', reason });
|
|
36
|
+
return PUBLIC_AUDIENCE;
|
|
37
|
+
};
|
|
38
|
+
const view = normalizeView(claim.requestedView);
|
|
39
|
+
// No wider view requested — nothing to verify, and nothing to grant.
|
|
40
|
+
if (!view)
|
|
41
|
+
return PUBLIC_AUDIENCE;
|
|
42
|
+
// Transport-authenticated peer: the connection already proved who is asking, so skip the card
|
|
43
|
+
// challenge. Anything below `agent` strength falls through to the normal challenge path — it has
|
|
44
|
+
// NOT identified a Smart Agent.
|
|
45
|
+
if (peer?.peerContext && isAgentAuthenticatedPeer(peer.peerContext)) {
|
|
46
|
+
const requester = peer.peerContext.canonicalAgentId;
|
|
47
|
+
if (view === 'private') {
|
|
48
|
+
let permitted = false;
|
|
49
|
+
try {
|
|
50
|
+
permitted = (await opts.privateViewPolicy?.(requester)) ?? false;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
permitted = false;
|
|
54
|
+
}
|
|
55
|
+
opts.observe?.({ granted: permitted ? 'private' : 'authenticated', reason: 'peer-authenticated' });
|
|
56
|
+
return { audience: permitted ? 'private' : 'authenticated', requester };
|
|
57
|
+
}
|
|
58
|
+
opts.observe?.({ granted: 'authenticated', reason: 'peer-authenticated' });
|
|
59
|
+
return { audience: 'authenticated', requester };
|
|
60
|
+
}
|
|
61
|
+
if (!claim.requester || !claim.challengeNonce || !claim.signature || !claim.issuedAt) {
|
|
62
|
+
// THE CLOSED HOLE: a bare `?view=authenticated` with no proof lands here and gets the public card.
|
|
63
|
+
return deny('incomplete-claim');
|
|
64
|
+
}
|
|
65
|
+
const issuedAt = Date.parse(claim.issuedAt);
|
|
66
|
+
const nowMs = Date.parse(opts.now());
|
|
67
|
+
if (Number.isNaN(issuedAt) || Number.isNaN(nowMs))
|
|
68
|
+
return deny('unparseable-timestamp');
|
|
69
|
+
if (Math.abs(nowMs - issuedAt) > (opts.maxClaimAgeMs ?? DEFAULT_MAX_CLAIM_AGE_MS)) {
|
|
70
|
+
return deny('stale-claim');
|
|
71
|
+
}
|
|
72
|
+
// Nonce BEFORE signature: a replayed claim must not make the host repeat an expensive chain read.
|
|
73
|
+
let fresh = false;
|
|
74
|
+
try {
|
|
75
|
+
fresh = await opts.consumeNonce(claim.challengeNonce, opts.cardOrigin);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
fresh = false;
|
|
79
|
+
}
|
|
80
|
+
if (!fresh)
|
|
81
|
+
return deny('nonce-spent-or-unknown');
|
|
82
|
+
const body = {
|
|
83
|
+
requester: claim.requester,
|
|
84
|
+
challengeNonce: claim.challengeNonce,
|
|
85
|
+
cardOrigin: opts.cardOrigin,
|
|
86
|
+
requestedView: view,
|
|
87
|
+
issuedAt: claim.issuedAt,
|
|
88
|
+
};
|
|
89
|
+
let valid = false;
|
|
90
|
+
try {
|
|
91
|
+
valid = await opts.verifySignature({ requester: claim.requester, body, signature: claim.signature });
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// A verifier that threw did not verify (ADR-0013: no fallback to a weaker check).
|
|
95
|
+
valid = false;
|
|
96
|
+
}
|
|
97
|
+
if (!valid)
|
|
98
|
+
return deny('signature-invalid');
|
|
99
|
+
if (view === 'private') {
|
|
100
|
+
let permitted = false;
|
|
101
|
+
try {
|
|
102
|
+
permitted = (await opts.privateViewPolicy?.(claim.requester)) ?? false;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
permitted = false;
|
|
106
|
+
}
|
|
107
|
+
if (!permitted) {
|
|
108
|
+
// Authenticated but not entitled to the private view — grant the level they DID earn.
|
|
109
|
+
opts.observe?.({ granted: 'authenticated', reason: 'private-not-permitted' });
|
|
110
|
+
return { audience: 'authenticated', requester: claim.requester };
|
|
111
|
+
}
|
|
112
|
+
opts.observe?.({ granted: 'private' });
|
|
113
|
+
return { audience: 'private', requester: claim.requester };
|
|
114
|
+
}
|
|
115
|
+
opts.observe?.({ granted: 'authenticated' });
|
|
116
|
+
return { audience: 'authenticated', requester: claim.requester };
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Read a claim from standard request inputs.
|
|
121
|
+
*
|
|
122
|
+
* The signature and nonce come from HEADERS, never the query string: a query parameter lands in
|
|
123
|
+
* access logs, `Referer` headers, and browser history, and a proof that leaks that way is a replay
|
|
124
|
+
* waiting to happen. `view` stays in the query because it is a request, not a secret.
|
|
125
|
+
*/
|
|
126
|
+
export function readCardAudienceClaim(input) {
|
|
127
|
+
return {
|
|
128
|
+
requestedView: input.query('view'),
|
|
129
|
+
requester: input.header('x-ap-requester'),
|
|
130
|
+
challengeNonce: input.header('x-ap-challenge'),
|
|
131
|
+
signature: input.header('x-ap-signature'),
|
|
132
|
+
issuedAt: input.header('x-ap-issued-at'),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=card-audience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-audience.js","sourceRoot":"","sources":["../src/card-audience.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Address, Hex } from '@agenticprimitives/types';
|
|
2
2
|
import type { Delegation } from '@agenticprimitives/delegation';
|
|
3
3
|
import type { Task, TaskEvent, A2aMessage } from './types.js';
|
|
4
|
-
import type { JsonRpcRequest, JsonRpcResponse } from './
|
|
4
|
+
import type { ArtifactV1, JsonRpcRequest, JsonRpcResponse, TaskV1 } from './standard/types.js';
|
|
5
5
|
export interface A2aTransport {
|
|
6
|
-
/** POST a JSON-RPC request to `targetAgent`'s
|
|
6
|
+
/** POST a JSON-RPC request to `targetAgent`'s A2A endpoint and return the parsed response. */
|
|
7
7
|
rpc(targetAgent: Address, request: JsonRpcRequest): Promise<JsonRpcResponse>;
|
|
8
|
-
/** Open the
|
|
8
|
+
/** Open the streaming SSE for a task; yields events until terminal. Optional. */
|
|
9
9
|
stream?(targetAgent: Address, taskId: Hex): AsyncIterable<TaskEvent>;
|
|
10
10
|
}
|
|
11
11
|
export declare class A2aWireAdapter {
|
|
@@ -13,7 +13,10 @@ export declare class A2aWireAdapter {
|
|
|
13
13
|
private seq;
|
|
14
14
|
constructor(transport: A2aTransport);
|
|
15
15
|
private id;
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Submit an async task. The `message` must already be signed by its sender (see `hashA2aMessage`); its
|
|
18
|
+
* envelope travels in the extension so the receiver re-derives the same digest.
|
|
19
|
+
*/
|
|
17
20
|
submitTask(targetAgent: Address, args: {
|
|
18
21
|
message: A2aMessage;
|
|
19
22
|
delegation: Delegation;
|
|
@@ -27,11 +30,23 @@ export declare class A2aWireAdapter {
|
|
|
27
30
|
taskId: Hex;
|
|
28
31
|
state: Task['state'];
|
|
29
32
|
}>;
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
/** Resubmit a parked (auth-required) task with a fresh grant + a newly signed message. */
|
|
34
|
+
resubmitTask(targetAgent: Address, taskId: Hex, args: {
|
|
35
|
+
message: A2aMessage;
|
|
36
|
+
delegation: Delegation;
|
|
37
|
+
requester: Address;
|
|
38
|
+
input: unknown;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
taskId: Hex;
|
|
41
|
+
state: Task['state'];
|
|
33
42
|
}>;
|
|
34
|
-
|
|
43
|
+
/** Poll a task. The caller is authenticated by the transport's `Authorization` header, not by params. */
|
|
44
|
+
getTask(targetAgent: Address, taskId: Hex): Promise<TaskV1>;
|
|
45
|
+
/** Read an artifact BODY (the delegated-task extension's `GetTaskArtifact`): the projection `getTask` returns
|
|
46
|
+
* carries only a ref and a hash. Authenticated the same way `getTask` is; a non-party reads not-found. */
|
|
47
|
+
getTaskArtifact(targetAgent: Address, taskId: Hex, artifactId: Hex): Promise<ArtifactV1>;
|
|
48
|
+
/** Cancel a task. Authenticated the same way `getTask` is. */
|
|
49
|
+
cancelTask(targetAgent: Address, taskId: Hex): Promise<{
|
|
35
50
|
taskId: Hex;
|
|
36
51
|
state: Task['state'];
|
|
37
52
|
}>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAa,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG1G,MAAM,WAAW,YAAY;IAC3B,8FAA8F;IAC9F,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7E,iFAAiF;IACjF,MAAM,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;CACtE;AA4BD,qBAAa,cAAc;IAEb,OAAO,CAAC,QAAQ,CAAC,SAAS;IADtC,OAAO,CAAC,GAAG,CAAK;gBACa,SAAS,EAAE,YAAY;IAEpD,OAAO,CAAC,EAAE;IAIV;;;OAGG;IACG,UAAU,CACd,WAAW,EAAE,OAAO,EACpB,IAAI,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GACtI,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IA+BjD,0FAA0F;IACpF,YAAY,CAChB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,GAAG,EACX,IAAI,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GACxF,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAejD,yGAAyG;IACnG,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjE;+GAC2G;IACrG,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IAK9F,8DAA8D;IACxD,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAMnG,wGAAwG;IACxG,oBAAoB,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC;CAIlF"}
|
package/dist/client.js
CHANGED
|
@@ -1,8 +1,30 @@
|
|
|
1
|
+
import { delegatedInputPart, taskStateFromV1, withDelegatedTask } from './standard/delegated.js';
|
|
2
|
+
/**
|
|
3
|
+
* The grant, JSON-safe. `Delegation.salt` is a bigint in the type and a decimal STRING on the wire, and
|
|
4
|
+
* `JSON.stringify` throws on a bigint — so a caller that holds the typed shape and one that received the
|
|
5
|
+
* wire shape both end up sending the same bytes. (Every sender in the estate already did this by hand.)
|
|
6
|
+
*
|
|
7
|
+
* A bigint is the ONLY thing changed. A grant the caller received as a wire is passed through untouched,
|
|
8
|
+
* field for field — inventing a default `salt` for one that carries none would make "the wire goes out as
|
|
9
|
+
* it came in" false, and that promise is the whole reason a re-minted grant is not required here.
|
|
10
|
+
*/
|
|
11
|
+
function grantToWire(d) {
|
|
12
|
+
const salt = d.salt;
|
|
13
|
+
if (typeof salt !== 'bigint')
|
|
14
|
+
return { ...d };
|
|
15
|
+
return { ...d, salt: salt.toString() };
|
|
16
|
+
}
|
|
1
17
|
function unwrap(res) {
|
|
2
18
|
if ('error' in res)
|
|
3
19
|
throw new Error(`a2a rpc error ${res.error.code}: ${res.error.message}`);
|
|
4
20
|
return res.result;
|
|
5
21
|
}
|
|
22
|
+
/** The 1.0 result of `SendMessage` is a task or a bare message; a delegated task is always a task. */
|
|
23
|
+
function taskOf(result) {
|
|
24
|
+
if (!result?.task)
|
|
25
|
+
throw new Error('a2a: SendMessage returned no task — a delegated task always creates one');
|
|
26
|
+
return result.task;
|
|
27
|
+
}
|
|
6
28
|
export class A2aWireAdapter {
|
|
7
29
|
transport;
|
|
8
30
|
seq = 0;
|
|
@@ -12,31 +34,70 @@ export class A2aWireAdapter {
|
|
|
12
34
|
id() {
|
|
13
35
|
return ++this.seq;
|
|
14
36
|
}
|
|
15
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Submit an async task. The `message` must already be signed by its sender (see `hashA2aMessage`); its
|
|
39
|
+
* envelope travels in the extension so the receiver re-derives the same digest.
|
|
40
|
+
*/
|
|
16
41
|
async submitTask(targetAgent, args) {
|
|
42
|
+
const m = args.message;
|
|
43
|
+
const carried = withDelegatedTask({
|
|
44
|
+
messageId: m.messageId,
|
|
45
|
+
role: 'ROLE_USER',
|
|
46
|
+
parts: [delegatedInputPart(args.input)],
|
|
47
|
+
...(m.threadId ? { contextId: m.threadId } : {}),
|
|
48
|
+
}, {
|
|
49
|
+
delegation: grantToWire(args.delegation),
|
|
50
|
+
requester: args.requester,
|
|
51
|
+
skill: m.skill,
|
|
52
|
+
sender: m.sender,
|
|
53
|
+
bodyHash: m.bodyHash,
|
|
54
|
+
bodyRef: m.bodyRef,
|
|
55
|
+
signature: m.signature,
|
|
56
|
+
createdAt: m.createdAt,
|
|
57
|
+
});
|
|
17
58
|
const res = await this.transport.rpc(targetAgent, {
|
|
18
|
-
jsonrpc: '2.0', id: this.id(), method: '
|
|
19
|
-
params: {
|
|
59
|
+
jsonrpc: '2.0', id: this.id(), method: 'SendMessage',
|
|
60
|
+
params: {
|
|
61
|
+
message: carried,
|
|
62
|
+
...(args.pushConfig ? { configuration: { taskPushNotificationConfig: args.pushConfig } } : {}),
|
|
63
|
+
},
|
|
20
64
|
});
|
|
21
|
-
|
|
65
|
+
const task = taskOf(unwrap(res));
|
|
66
|
+
return { taskId: task.id, state: taskStateFromV1(task.status.state) };
|
|
22
67
|
}
|
|
23
|
-
/**
|
|
24
|
-
async
|
|
25
|
-
const
|
|
26
|
-
|
|
68
|
+
/** Resubmit a parked (auth-required) task with a fresh grant + a newly signed message. */
|
|
69
|
+
async resubmitTask(targetAgent, taskId, args) {
|
|
70
|
+
const m = args.message;
|
|
71
|
+
const carried = withDelegatedTask({ messageId: m.messageId, role: 'ROLE_USER', parts: [delegatedInputPart(args.input)], taskId, ...(m.threadId ? { contextId: m.threadId } : {}) }, {
|
|
72
|
+
delegation: grantToWire(args.delegation), requester: args.requester, skill: m.skill, sender: m.sender,
|
|
73
|
+
bodyHash: m.bodyHash, bodyRef: m.bodyRef,
|
|
74
|
+
signature: m.signature, createdAt: m.createdAt, taskId,
|
|
27
75
|
});
|
|
76
|
+
const res = await this.transport.rpc(targetAgent, { jsonrpc: '2.0', id: this.id(), method: 'SendMessage', params: { message: carried } });
|
|
77
|
+
const task = taskOf(unwrap(res));
|
|
78
|
+
return { taskId: task.id, state: taskStateFromV1(task.status.state) };
|
|
79
|
+
}
|
|
80
|
+
/** Poll a task. The caller is authenticated by the transport's `Authorization` header, not by params. */
|
|
81
|
+
async getTask(targetAgent, taskId) {
|
|
82
|
+
const res = await this.transport.rpc(targetAgent, { jsonrpc: '2.0', id: this.id(), method: 'GetTask', params: { id: taskId } });
|
|
28
83
|
return unwrap(res);
|
|
29
84
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
85
|
+
/** Read an artifact BODY (the delegated-task extension's `GetTaskArtifact`): the projection `getTask` returns
|
|
86
|
+
* carries only a ref and a hash. Authenticated the same way `getTask` is; a non-party reads not-found. */
|
|
87
|
+
async getTaskArtifact(targetAgent, taskId, artifactId) {
|
|
88
|
+
const res = await this.transport.rpc(targetAgent, { jsonrpc: '2.0', id: this.id(), method: 'GetTaskArtifact', params: { id: taskId, artifactId } });
|
|
34
89
|
return unwrap(res);
|
|
35
90
|
}
|
|
91
|
+
/** Cancel a task. Authenticated the same way `getTask` is. */
|
|
92
|
+
async cancelTask(targetAgent, taskId) {
|
|
93
|
+
const res = await this.transport.rpc(targetAgent, { jsonrpc: '2.0', id: this.id(), method: 'CancelTask', params: { id: taskId } });
|
|
94
|
+
const task = unwrap(res);
|
|
95
|
+
return { taskId: task.id, state: taskStateFromV1(task.status.state) };
|
|
96
|
+
}
|
|
36
97
|
/** Subscribe to a task's status/artifact events (SSE). Requires a transport that supports streaming. */
|
|
37
98
|
subscribeTaskUpdates(targetAgent, taskId) {
|
|
38
99
|
if (!this.transport.stream)
|
|
39
|
-
throw new Error('transport does not support streaming (
|
|
100
|
+
throw new Error('transport does not support streaming (SubscribeToTask)');
|
|
40
101
|
return this.transport.stream(targetAgent, taskId);
|
|
41
102
|
}
|
|
42
103
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD;;qFAEqF;AACrF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD;;qFAEqF;AACrF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAmCrF;AAED,eAAO,MAAM,6BAA6B,EAAG,IAAa,CAAC"}
|
package/dist/cloudflare/index.js
CHANGED
|
@@ -27,11 +27,19 @@ export function createDurableObjectTaskStore(storage) {
|
|
|
27
27
|
return out;
|
|
28
28
|
},
|
|
29
29
|
async reserveMessageId(messageId) {
|
|
30
|
+
// Two-phase (spec 290 §3). The key's PRESENCE is the durable replay guard: a present key means the id
|
|
31
|
+
// is in-flight OR consumed → replay (deny). Reserve writes the key (in-flight); commit leaves it
|
|
32
|
+
// (permanently consumed); release deletes it so a legitimate retry of the same message may re-reserve.
|
|
33
|
+
// A crash between reserve and commit/release leaves the key present → that exact id can't retry
|
|
34
|
+
// (fail-closed; the sender mints a fresh messageId), which is the safe posture.
|
|
30
35
|
const k = MSG(messageId);
|
|
31
36
|
if ((await storage.get(k)) !== undefined)
|
|
32
|
-
return
|
|
37
|
+
return null;
|
|
33
38
|
await storage.put(k, 1);
|
|
34
|
-
return
|
|
39
|
+
return {
|
|
40
|
+
async commit() { },
|
|
41
|
+
async release() { await storage.delete(k); },
|
|
42
|
+
};
|
|
35
43
|
},
|
|
36
44
|
};
|
|
37
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAUA,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACxD,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACtD,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAEtD;;qFAEqF;AACrF,MAAM,UAAU,4BAA4B,CAAC,OAA6B;IACxE,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,MAAkB;YAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAW;YACnB,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAa,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAU,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAC,CAAC;YACxE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,SAAc;YACnC,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAUA,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACxD,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACtD,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAEtD;;qFAEqF;AACrF,MAAM,UAAU,4BAA4B,CAAC,OAA6B;IACxE,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,MAAkB;YAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAW;YACnB,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAa,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAU,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAC,CAAC;YACxE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,SAAc;YACnC,sGAAsG;YACtG,iGAAiG;YACjG,uGAAuG;YACvG,gGAAgG;YAChG,gFAAgF;YAChF,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACtD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,OAAO;gBACL,KAAK,CAAC,MAAM,KAAkE,CAAC;gBAC/E,KAAK,CAAC,OAAO,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAa,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type ConformanceLevel = 'MUST' | 'SHOULD' | 'MAY';
|
|
2
|
+
export interface ConformanceCheck {
|
|
3
|
+
id: string;
|
|
4
|
+
level: ConformanceLevel;
|
|
5
|
+
ok: boolean;
|
|
6
|
+
detail?: string;
|
|
7
|
+
}
|
|
8
|
+
/** One probe's verdict. `ok` is the conjunction of the MUSTs; SHOULD/MAY inform, never flip it. */
|
|
9
|
+
export interface ConformanceReport {
|
|
10
|
+
target: string;
|
|
11
|
+
ok: boolean;
|
|
12
|
+
checks: ConformanceCheck[];
|
|
13
|
+
}
|
|
14
|
+
export interface ConformA2aOptions {
|
|
15
|
+
/** The bearer the surface admits (a Home session, an agent's session wire). */
|
|
16
|
+
bearer?: string;
|
|
17
|
+
/** Per-request timeout and the task-settle wait (default 15 s). */
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
/** The text of the one message sent (default a probe sentence). */
|
|
20
|
+
message?: string;
|
|
21
|
+
/** Injected for tests; default global fetch. */
|
|
22
|
+
fetch?: typeof fetch;
|
|
23
|
+
}
|
|
24
|
+
/** Finalise the report: a MUST that failed flips `ok`. */
|
|
25
|
+
export declare function summarize(target: string, checks: ConformanceCheck[]): ConformanceReport;
|
|
26
|
+
/** A fixed-width table a person reads; the JSON is what a CI step keeps. */
|
|
27
|
+
export declare function formatConformanceReport(r: ConformanceReport): string;
|
|
28
|
+
/** The card URL for a target: an origin gets `/.well-known/agent-card.json`; a URL ending in `.json` is the card itself. */
|
|
29
|
+
export declare function cardUrlOf(target: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Probe an A2A 1.0 agent. `target` is the agent's origin (the card is read from `/.well-known/agent-card.json`)
|
|
32
|
+
* or the card URL itself; the JSON-RPC endpoint is the one the card publishes. Never throws for a server's
|
|
33
|
+
* behaviour — an unreachable card is a failed MUST with the reason.
|
|
34
|
+
*/
|
|
35
|
+
export declare function conformA2a(target: string, opts?: ConformA2aOptions): Promise<ConformanceReport>;
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conform/index.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,gBAAgB,CAAC;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,mGAAmG;AACnG,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAMD,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAEvF;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAIpE;AAED,4HAA4H;AAC5H,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIhD;AAcD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8IzG"}
|