@agenticprimitives/a2a 0.0.0-alpha.4 → 0.0.0-alpha.41
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 +170 -3
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +358 -66
- 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 +25 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/payment-gate.d.ts +17 -2
- package/dist/payment-gate.d.ts.map +1 -1
- package/dist/payment-gate.js +4 -2
- package/dist/payment-gate.js.map +1 -1
- 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 +21 -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 +43 -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,232 @@
|
|
|
1
|
+
// @agenticprimitives/a2a/conform — `ap conform a2a <url>` (spec 399 §2.3 / §3.3): a LIVE conformance probe of an
|
|
2
|
+
// A2A 1.0 agent on the JSON-RPC binding, run from the package so a product repo gates its own deployment. It
|
|
3
|
+
// covers the MUSTs the official TCK holds the standard surface to (spec 372 S1): the card and its interface,
|
|
4
|
+
// the message round trip, task reads, cancel on a terminal task, the JSON-RPC error codes, streaming and push
|
|
5
|
+
// where the card claims them. SHOULD and MAY are reported and never flip the verdict.
|
|
6
|
+
//
|
|
7
|
+
// A DOOR IS PROBED, NEVER A GRANT: a bearer names who is asking (a Home session, a session wire); the probe
|
|
8
|
+
// sends one plain text message and reads it back. Nothing here signs, delegates or acts.
|
|
9
|
+
import { A2A_ERROR, JSONRPC_ERROR } from '../standard/errors.js';
|
|
10
|
+
import { TERMINAL_STATES } from '../standard/types.js';
|
|
11
|
+
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
12
|
+
const errorCodeOf = (body) => (isObj(body) && isObj(body.error) && typeof body.error.code === 'number' ? body.error.code : null);
|
|
13
|
+
const hex32 = () => `0x${[...crypto.getRandomValues(new Uint8Array(32))].map((b) => b.toString(16).padStart(2, '0')).join('')}`;
|
|
14
|
+
/** Finalise the report: a MUST that failed flips `ok`. */
|
|
15
|
+
export function summarize(target, checks) {
|
|
16
|
+
return { target, ok: checks.every((c) => c.level !== 'MUST' || c.ok), checks };
|
|
17
|
+
}
|
|
18
|
+
/** A fixed-width table a person reads; the JSON is what a CI step keeps. */
|
|
19
|
+
export function formatConformanceReport(r) {
|
|
20
|
+
const lines = [`conform · ${r.target} · ${r.ok ? '✓ conformant' : '✗ NOT conformant'} (${r.checks.filter((c) => c.ok).length}/${r.checks.length} checks)`];
|
|
21
|
+
for (const c of r.checks)
|
|
22
|
+
lines.push(`${c.ok ? '✓' : c.level === 'MUST' ? '✗' : '△'} ${c.level.padEnd(6)} ${c.id.padEnd(34)} ${c.detail ?? ''}`.trimEnd());
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
/** The card URL for a target: an origin gets `/.well-known/agent-card.json`; a URL ending in `.json` is the card itself. */
|
|
26
|
+
export function cardUrlOf(target) {
|
|
27
|
+
const u = new URL(target);
|
|
28
|
+
if (/\.json$/i.test(u.pathname))
|
|
29
|
+
return u.toString();
|
|
30
|
+
return `${u.origin}/.well-known/agent-card.json`;
|
|
31
|
+
}
|
|
32
|
+
function parseSse(text) {
|
|
33
|
+
const frames = [];
|
|
34
|
+
for (const block of text.split(/\n\n+/)) {
|
|
35
|
+
const data = block.split('\n').filter((l) => l.startsWith('data:')).map((l) => l.slice(5).trim()).join('\n');
|
|
36
|
+
if (!data)
|
|
37
|
+
continue;
|
|
38
|
+
try {
|
|
39
|
+
frames.push(JSON.parse(data));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
frames.push({ __raw: data });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return frames;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Probe an A2A 1.0 agent. `target` is the agent's origin (the card is read from `/.well-known/agent-card.json`)
|
|
49
|
+
* or the card URL itself; the JSON-RPC endpoint is the one the card publishes. Never throws for a server's
|
|
50
|
+
* behaviour — an unreachable card is a failed MUST with the reason.
|
|
51
|
+
*/
|
|
52
|
+
export async function conformA2a(target, opts = {}) {
|
|
53
|
+
const fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);
|
|
54
|
+
const timeoutMs = opts.timeoutMs ?? 15_000;
|
|
55
|
+
const checks = [];
|
|
56
|
+
const add = (id, level, ok, detail) => { checks.push({ id, level, ok, ...(detail ? { detail } : {}) }); return ok; };
|
|
57
|
+
const auth = opts.bearer ? { authorization: `Bearer ${opts.bearer}` } : {};
|
|
58
|
+
const timed = async (input, init) => {
|
|
59
|
+
const ctl = new AbortController();
|
|
60
|
+
const t = setTimeout(() => ctl.abort(), timeoutMs);
|
|
61
|
+
try {
|
|
62
|
+
return await fetchImpl(input, { ...init, signal: ctl.signal });
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(t);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
// ── 1. The card ───────────────────────────────────────────────────────────────────────────────────
|
|
69
|
+
let cardUrl;
|
|
70
|
+
try {
|
|
71
|
+
cardUrl = cardUrlOf(target);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
add('card.fetch', 'MUST', false, `${target} is not a URL`);
|
|
75
|
+
return summarize(target, checks);
|
|
76
|
+
}
|
|
77
|
+
let card;
|
|
78
|
+
let cardRes;
|
|
79
|
+
try {
|
|
80
|
+
cardRes = await timed(cardUrl, { headers: { accept: 'application/json' } });
|
|
81
|
+
const text = await cardRes.text();
|
|
82
|
+
if (cardRes.status !== 200) {
|
|
83
|
+
add('card.fetch', 'MUST', false, `GET ${cardUrl} → ${cardRes.status}`);
|
|
84
|
+
return summarize(target, checks);
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
card = JSON.parse(text);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
add('card.fetch', 'MUST', false, `GET ${cardUrl} → not JSON`);
|
|
91
|
+
return summarize(target, checks);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
add('card.fetch', 'MUST', false, `GET ${cardUrl}: ${e instanceof Error ? e.message : String(e)}`);
|
|
96
|
+
return summarize(target, checks);
|
|
97
|
+
}
|
|
98
|
+
add('card.fetch', 'MUST', true, `GET ${cardUrl} → 200 ${cardRes.headers.get('content-type') ?? ''}`.trimEnd());
|
|
99
|
+
const missing = ['name', 'description', 'version', 'supportedInterfaces', 'capabilities', 'defaultInputModes', 'defaultOutputModes', 'skills'].filter((k) => card[k] === undefined || card[k] === null);
|
|
100
|
+
const skillsOk = Array.isArray(card.skills) && card.skills.every((s) => isObj(s) && typeof s.id === 'string' && typeof s.name === 'string' && typeof s.description === 'string' && Array.isArray(s.tags));
|
|
101
|
+
add('card.required-fields', 'MUST', missing.length === 0 && skillsOk, missing.length ? `missing: ${missing.join(', ')}` : skillsOk ? `${card.name} v${card.version}, ${card.skills.length} skill(s)` : 'a skill lacks id/name/description/tags');
|
|
102
|
+
const iface = (Array.isArray(card.supportedInterfaces) ? card.supportedInterfaces : []).find((i) => isObj(i) && i.protocolBinding === 'JSONRPC' && /^1\./.test(String(i.protocolVersion ?? card.protocolVersion ?? '')) && typeof i.url === 'string');
|
|
103
|
+
add('card.jsonrpc-interface', 'MUST', !!iface, iface ? `JSONRPC ${String(iface.protocolVersion ?? card.protocolVersion)} at ${iface.url}` : 'no supportedInterfaces entry with protocolBinding JSONRPC and protocolVersion 1.x');
|
|
104
|
+
add('card.cache-headers', 'SHOULD', !!(cardRes.headers.get('etag') || cardRes.headers.get('last-modified') || cardRes.headers.get('cache-control')), `etag=${cardRes.headers.get('etag') ? 'yes' : 'no'} last-modified=${cardRes.headers.get('last-modified') ? 'yes' : 'no'} cache-control=${cardRes.headers.get('cache-control') ?? 'none'}`);
|
|
105
|
+
try {
|
|
106
|
+
const legacy = await timed(`${new URL(cardUrl).origin}/.well-known/agent.json`, { headers: { accept: 'application/json' } });
|
|
107
|
+
add('card.legacy-path', 'MAY', legacy.status === 200, `/.well-known/agent.json → ${legacy.status}`);
|
|
108
|
+
}
|
|
109
|
+
catch { /* a MAY that could not be read is not reported */ }
|
|
110
|
+
if (!iface)
|
|
111
|
+
return summarize(target, checks);
|
|
112
|
+
const endpoint = String(iface.url);
|
|
113
|
+
// ── 2. The JSON-RPC binding ───────────────────────────────────────────────────────────────────────
|
|
114
|
+
let seq = 0;
|
|
115
|
+
const post = async (body, extra = {}) => {
|
|
116
|
+
const id = typeof body === 'string' ? undefined : (body.id === undefined ? ++seq : body.id);
|
|
117
|
+
const payload = typeof body === 'string' ? body : JSON.stringify({ jsonrpc: '2.0', id, method: body.method, params: body.params ?? {} });
|
|
118
|
+
const res = await timed(endpoint, { method: 'POST', headers: { 'content-type': 'application/json', accept: extra.accept ?? 'application/json', 'a2a-version': '1.0', ...auth, ...(extra.headers ?? {}) }, body: payload });
|
|
119
|
+
const contentType = (res.headers.get('content-type') ?? '').toLowerCase();
|
|
120
|
+
const text = await res.text();
|
|
121
|
+
if (/text\/event-stream/.test(contentType)) {
|
|
122
|
+
const frames = parseSse(text);
|
|
123
|
+
return { status: res.status, contentType, headers: res.headers, body: frames[frames.length - 1] ?? null, text, frames };
|
|
124
|
+
}
|
|
125
|
+
let parsed = null;
|
|
126
|
+
try {
|
|
127
|
+
parsed = text ? JSON.parse(text) : null;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
parsed = null;
|
|
131
|
+
}
|
|
132
|
+
return { status: res.status, contentType, headers: res.headers, body: parsed, text, frames: [] };
|
|
133
|
+
};
|
|
134
|
+
const resultOf = (r) => (isObj(r.body) && isObj(r.body.result) ? (r.body.result) : null);
|
|
135
|
+
let sent;
|
|
136
|
+
try {
|
|
137
|
+
sent = await post({ method: 'SendMessage', params: { message: { messageId: hex32(), role: 'ROLE_USER', parts: [{ text: opts.message ?? 'ap conform: a probe message — reply with anything.' }] } } });
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
add('rpc.reachable', 'MUST', false, `POST ${endpoint}: ${e instanceof Error ? e.message : String(e)}`);
|
|
141
|
+
return summarize(target, checks);
|
|
142
|
+
}
|
|
143
|
+
add('rpc.reachable', 'MUST', true, `POST ${endpoint} → ${sent.status}`);
|
|
144
|
+
if (sent.status === 401) {
|
|
145
|
+
add('auth.challenge', 'MUST', /^\s*bearer\b/i.test(sent.headers.get('www-authenticate') ?? ''), `401 WWW-Authenticate: ${sent.headers.get('www-authenticate') ?? '(absent)'}`);
|
|
146
|
+
add('auth.probe-scope', 'MUST', true, opts.bearer ? 'the supplied bearer was refused — nothing behind the door was probed' : 'unauthenticated: the door is conformant; the message round trip, task reads, cancel, streaming and push were NOT probed — pass a bearer to go further');
|
|
147
|
+
return summarize(target, checks);
|
|
148
|
+
}
|
|
149
|
+
if (opts.bearer) {
|
|
150
|
+
const bare = await post({ method: 'GetTask', params: { id: hex32() } }, { headers: { authorization: '' } }).catch(() => null);
|
|
151
|
+
add('auth.unauthenticated-refused', 'MUST', !!bare && bare.status === 401, bare ? `without a bearer: ${bare.status}` : 'the bare request did not answer');
|
|
152
|
+
}
|
|
153
|
+
const sr = resultOf(sent);
|
|
154
|
+
let task = isObj(sr?.task) ? sr.task : null;
|
|
155
|
+
const message = isObj(sr?.message) ? sr.message : null;
|
|
156
|
+
const shapeOk = task ? typeof task.id === 'string' && typeof task.contextId === 'string' && isObj(task.status) && typeof task.status.state === 'string' : message ? typeof message.messageId === 'string' && Array.isArray(message.parts) : false;
|
|
157
|
+
add('rpc.send-message', 'MUST', sent.status === 200 && shapeOk, task ? `task ${task.id} ${task.status.state}` : message ? `a message reply (${message.parts.length} part(s))` : `${sent.status} ${sent.text.slice(0, 160)}`);
|
|
158
|
+
if (task) {
|
|
159
|
+
const got = await post({ method: 'GetTask', params: { id: task.id } });
|
|
160
|
+
const gt = resultOf(got);
|
|
161
|
+
const echoed = !!gt && gt.id === task.id && Array.isArray(gt.history) && gt.history.some((m) => m.role === 'ROLE_USER');
|
|
162
|
+
add('rpc.get-task', 'MUST', echoed, gt ? `GetTask → ${gt.status?.state}, history ${gt.history?.length ?? 0}` : `GetTask → ${got.status} ${got.text.slice(0, 120)}`);
|
|
163
|
+
// Let it settle (bounded), so cancel meets a terminal task where the executor completes at once.
|
|
164
|
+
const deadline = Date.now() + timeoutMs;
|
|
165
|
+
let last = gt ?? task;
|
|
166
|
+
while (!TERMINAL_STATES.has(last.status.state) && last.status.state !== 'TASK_STATE_INPUT_REQUIRED' && last.status.state !== 'TASK_STATE_AUTH_REQUIRED' && Date.now() < deadline) {
|
|
167
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
168
|
+
const again = resultOf(await post({ method: 'GetTask', params: { id: task.id } }));
|
|
169
|
+
if (again)
|
|
170
|
+
last = again;
|
|
171
|
+
}
|
|
172
|
+
task = last;
|
|
173
|
+
const cancel = await post({ method: 'CancelTask', params: { id: task.id } });
|
|
174
|
+
if (TERMINAL_STATES.has(task.status.state)) {
|
|
175
|
+
add('rpc.cancel-terminal', 'MUST', errorCodeOf(cancel.body) === A2A_ERROR.TaskNotCancelable, `CancelTask on a ${task.status.state} task → ${errorCodeOf(cancel.body) ?? cancel.status} (TaskNotCancelable is ${A2A_ERROR.TaskNotCancelable})`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const ct = resultOf(cancel);
|
|
179
|
+
add('rpc.cancel', 'MUST', !!ct && ct.status?.state === 'TASK_STATE_CANCELED', ct ? `CancelTask on a ${task.status.state} task → ${ct.status?.state}` : `CancelTask → ${cancel.status} ${cancel.text.slice(0, 120)}`);
|
|
180
|
+
}
|
|
181
|
+
const lt = await post({ method: 'ListTasks', params: { pageSize: 5 } });
|
|
182
|
+
const ltr = resultOf(lt);
|
|
183
|
+
add('rpc.list-tasks', 'SHOULD', !!ltr && Array.isArray(ltr.tasks), ltr ? `ListTasks → ${ltr.tasks?.length ?? '?'} task(s)` : `ListTasks → ${errorCodeOf(lt.body) ?? lt.status}`);
|
|
184
|
+
}
|
|
185
|
+
const nf = await post({ method: 'GetTask', params: { id: hex32() } });
|
|
186
|
+
add('rpc.task-not-found', 'MUST', errorCodeOf(nf.body) === A2A_ERROR.TaskNotFound, `GetTask of an unknown id → ${errorCodeOf(nf.body) ?? nf.status} (TaskNotFound is ${A2A_ERROR.TaskNotFound})`);
|
|
187
|
+
const mnf = await post({ method: 'NoSuchMethod', params: {} });
|
|
188
|
+
add('rpc.method-not-found', 'MUST', errorCodeOf(mnf.body) === JSONRPC_ERROR.MethodNotFound, `NoSuchMethod → ${errorCodeOf(mnf.body) ?? mnf.status}`);
|
|
189
|
+
const ip = await post({ method: 'SendMessage', params: { message: { role: 'ROLE_USER' } } });
|
|
190
|
+
add('rpc.invalid-params', 'MUST', errorCodeOf(ip.body) === JSONRPC_ERROR.InvalidParams, `SendMessage without parts → ${errorCodeOf(ip.body) ?? ip.status}`);
|
|
191
|
+
const pe = await post('{"jsonrpc":"2.0","id":1,"method":');
|
|
192
|
+
add('rpc.parse-error', 'MUST', errorCodeOf(pe.body) === JSONRPC_ERROR.ParseError, `malformed JSON → ${errorCodeOf(pe.body) ?? pe.status}`);
|
|
193
|
+
const ir = await post('{"id":1,"method":"GetTask","params":{}}');
|
|
194
|
+
add('rpc.invalid-request', 'MUST', errorCodeOf(ir.body) === JSONRPC_ERROR.InvalidRequest, `a body without jsonrpc:"2.0" → ${errorCodeOf(ir.body) ?? ir.status}`);
|
|
195
|
+
const vv = await post({ method: 'GetTask', params: { id: hex32() } }, { headers: { 'a2a-version': '9.9' } });
|
|
196
|
+
add('rpc.version-not-supported', 'SHOULD', errorCodeOf(vv.body) === A2A_ERROR.VersionNotSupported, `A2A-Version: 9.9 → ${errorCodeOf(vv.body) ?? vv.status}`);
|
|
197
|
+
// ── 3. Streaming, as the card claims it ───────────────────────────────────────────────────────────
|
|
198
|
+
const streaming = card.capabilities?.streaming === true;
|
|
199
|
+
const ss = await post({ method: 'SendStreamingMessage', params: { message: { messageId: hex32(), role: 'ROLE_USER', parts: [{ text: opts.message ?? 'ap conform: a streamed probe message.' }] } } }, { accept: 'text/event-stream' });
|
|
200
|
+
if (streaming) {
|
|
201
|
+
const events = ss.frames.filter((f) => isObj(f) && isObj(f.result) && ['task', 'message', 'statusUpdate', 'artifactUpdate'].some((k) => k in f.result));
|
|
202
|
+
add('stream.send-streaming-message', 'MUST', ss.status === 200 && /text\/event-stream/.test(ss.contentType) && events.length > 0, `SendStreamingMessage → ${ss.status} ${ss.contentType}, ${events.length} StreamResponse event(s)`);
|
|
203
|
+
const rs = await post({ method: 'SubscribeToTask', params: { id: hex32() } }, { accept: 'text/event-stream' });
|
|
204
|
+
add('stream.resubscribe-not-found', 'MUST', errorCodeOf(rs.body) === A2A_ERROR.TaskNotFound, `SubscribeToTask of an unknown id → ${errorCodeOf(rs.body) ?? rs.status}`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
add('stream.unsupported-declared', 'MUST', errorCodeOf(ss.body) === A2A_ERROR.UnsupportedOperation, `the card claims no streaming; SendStreamingMessage → ${errorCodeOf(ss.body) ?? ss.status} (UnsupportedOperation is ${A2A_ERROR.UnsupportedOperation})`);
|
|
208
|
+
}
|
|
209
|
+
// ── 4. Push notification configs, as the card claims them ─────────────────────────────────────────
|
|
210
|
+
const push = card.capabilities?.pushNotifications === true;
|
|
211
|
+
if (task) {
|
|
212
|
+
const pc = await post({ method: 'CreateTaskPushNotificationConfig', params: { taskId: task.id, pushNotificationConfig: { url: 'https://example.invalid/ap-conform-hook', token: 'probe' } } });
|
|
213
|
+
if (push) {
|
|
214
|
+
const created = resultOf(pc);
|
|
215
|
+
const cid = created && typeof created.id === 'string' ? created.id : null;
|
|
216
|
+
let roundTrip = false;
|
|
217
|
+
let deleted = false;
|
|
218
|
+
if (cid) {
|
|
219
|
+
const g = resultOf(await post({ method: 'GetTaskPushNotificationConfig', params: { taskId: task.id, id: cid } }));
|
|
220
|
+
roundTrip = !!g && g.url === 'https://example.invalid/ap-conform-hook';
|
|
221
|
+
const d = await post({ method: 'DeleteTaskPushNotificationConfig', params: { taskId: task.id, id: cid } });
|
|
222
|
+
deleted = !!resultOf(d);
|
|
223
|
+
}
|
|
224
|
+
add('push.config-round-trip', 'MUST', !!cid && roundTrip && deleted, cid ? `create → get → delete on task ${task.id}${roundTrip ? '' : ' (get did not echo the url)'}${deleted ? '' : ' (delete failed)'}` : `CreateTaskPushNotificationConfig → ${errorCodeOf(pc.body) ?? pc.status} ${pc.text.slice(0, 120)}`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
add('push.unsupported-declared', 'MUST', errorCodeOf(pc.body) === A2A_ERROR.PushNotificationNotSupported, `the card claims no push; CreateTaskPushNotificationConfig → ${errorCodeOf(pc.body) ?? pc.status} (PushNotificationNotSupported is ${A2A_ERROR.PushNotificationNotSupported})`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return summarize(target, checks);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conform/index.ts"],"names":[],"mappings":"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"}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { Address } from '@agenticprimitives/types';
|
|
2
2
|
import type { AgentCard } from './agent.js';
|
|
3
|
+
/** A2A JSON-RPC path — the one path the package owns (mirrored by value in agent-naming's `dns.ts`; golden-vector tested there). */
|
|
4
|
+
export declare const A2A_JSONRPC_PATH: "/api/a2a";
|
|
5
|
+
/** A2A agent-card discovery path (origin-scoped, hence one host per agent — spec 346 §5). */
|
|
6
|
+
export declare const A2A_AGENT_CARD_PATH: "/.well-known/agent-card.json";
|
|
3
7
|
/** Injected name→SA resolver (e.g. agent-naming's `AgentNamingClient.resolveName`). */
|
|
4
8
|
export type ResolveAgentName = (name: string) => Promise<Address | null>;
|
|
5
9
|
/** Injected endpoint builder — maps an agent name to its A2A base URL (the app owns the hostname pattern,
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAEzE;4EAC4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,yFAAyF;AACzF,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAE/F;0EAC0E;AAC1E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,WAAW,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,gBAAgB,CAAA;CAAE,GACrE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAU3B;AAED,4GAA4G;AAC5G,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAIvG"}
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,oIAAoI;AACpI,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAC;AACpD,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,EAAG,8BAAuC,CAAC;AAE3E,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAEzE;4EAC4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,yFAAyF;AACzF,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAE/F;0EAC0E;AAC1E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,WAAW,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,gBAAgB,CAAA;CAAE,GACrE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAU3B;AAED,4GAA4G;AAC5G,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAIvG"}
|
package/dist/discovery.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/** A2A JSON-RPC path — the one path the package owns (mirrored by value in agent-naming's `dns.ts`; golden-vector tested there). */
|
|
2
|
+
export const A2A_JSONRPC_PATH = '/api/a2a';
|
|
3
|
+
/** A2A agent-card discovery path (origin-scoped, hence one host per agent — spec 346 §5). */
|
|
4
|
+
export const A2A_AGENT_CARD_PATH = '/.well-known/agent-card.json';
|
|
1
5
|
/** Resolve a target agent: name → SA (injected resolver) → endpoint (injected builder). Returns `null`
|
|
2
6
|
* when the name has no Smart Account (empty is an answer — ADR-0013). */
|
|
3
7
|
export async function resolveA2aTarget(name, deps) {
|
|
@@ -8,8 +12,8 @@ export async function resolveA2aTarget(name, deps) {
|
|
|
8
12
|
return {
|
|
9
13
|
name,
|
|
10
14
|
agentSA,
|
|
11
|
-
endpoint: `${base}
|
|
12
|
-
agentCardUrl: `${base}
|
|
15
|
+
endpoint: `${base}${A2A_JSONRPC_PATH}`,
|
|
16
|
+
agentCardUrl: `${base}${A2A_AGENT_CARD_PATH}`,
|
|
13
17
|
};
|
|
14
18
|
}
|
|
15
19
|
/** Fetch + parse a target's agent-card (skills + capabilities). `fetchFn` is injected. `null` if absent. */
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAOA,oIAAoI;AACpI,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAmB,CAAC;AACpD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,mBAAmB,GAAG,8BAAuC,CAAC;AAqB3E;0EAC0E;AAC1E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,IAAsE;IAEtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO;QACL,IAAI;QACJ,OAAO;QACP,QAAQ,EAAE,GAAG,IAAI,GAAG,gBAAgB,EAAE;QACtC,YAAY,EAAE,GAAG,IAAI,GAAG,mBAAmB,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAoB,EAAE,OAAiB;IAC1E,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAc,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { MessageV1 } from './standard/types.js';
|
|
2
|
+
export declare const AP_ENGAGEMENT_EXTENSION_URI = "https://agenticprimitives.org/a2a/intent-engagement/v1";
|
|
3
|
+
/** The card declaration: this agent answers probes (IEP Core). */
|
|
4
|
+
export declare const ENGAGEMENT_CARD_EXTENSION: {
|
|
5
|
+
readonly uri: "https://agenticprimitives.org/a2a/intent-engagement/v1";
|
|
6
|
+
readonly required: false;
|
|
7
|
+
readonly description: "Intent engagement (spec 336): a probe carrying a minimized projection of an intent is answered with an offer, a decline, a question, a referral or an unavailability — as a message, never a task. Nothing before the mandate is authority.";
|
|
8
|
+
};
|
|
9
|
+
export type EngagementWireDocument = {
|
|
10
|
+
type: string;
|
|
11
|
+
} & Record<string, unknown>;
|
|
12
|
+
/** The wire-level checks on a probe: who, what intent, which projection, by when, with what nonce. */
|
|
13
|
+
export declare function validateEngagementProbe(x: unknown): {
|
|
14
|
+
ok: true;
|
|
15
|
+
probe: EngagementWireDocument;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
errors: string[];
|
|
19
|
+
};
|
|
20
|
+
export declare function validateEngagementResponse(x: unknown): {
|
|
21
|
+
ok: true;
|
|
22
|
+
response: EngagementWireDocument;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
errors: string[];
|
|
26
|
+
};
|
|
27
|
+
export declare function engagementProbeMessage(probe: EngagementWireDocument, messageId?: string): MessageV1;
|
|
28
|
+
export declare function engagementResponseMessage(response: EngagementWireDocument, messageId?: string): MessageV1;
|
|
29
|
+
/** Read whichever engagement document a message carries. `null` ⇒ not this extension's business. */
|
|
30
|
+
export declare function engagementOf(message: Pick<MessageV1, 'metadata' | 'extensions'>): {
|
|
31
|
+
probe: EngagementWireDocument;
|
|
32
|
+
} | {
|
|
33
|
+
response: EngagementWireDocument;
|
|
34
|
+
} | {
|
|
35
|
+
errors: string[];
|
|
36
|
+
} | null;
|
|
37
|
+
//# sourceMappingURL=engagement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.d.ts","sourceRoot":"","sources":["../src/engagement.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAO,MAAM,2BAA2B,2DAA2D,CAAC;AAEpG,kEAAkE;AAClE,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAKhF,sGAAsG;AACtG,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAUjI;AAED,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAUvI;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAQnG;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CASzG;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IAAE,KAAK,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAQxL"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export const AP_ENGAGEMENT_EXTENSION_URI = 'https://agenticprimitives.org/a2a/intent-engagement/v1';
|
|
2
|
+
/** The card declaration: this agent answers probes (IEP Core). */
|
|
3
|
+
export const ENGAGEMENT_CARD_EXTENSION = {
|
|
4
|
+
uri: AP_ENGAGEMENT_EXTENSION_URI,
|
|
5
|
+
required: false,
|
|
6
|
+
description: 'Intent engagement (spec 336): a probe carrying a minimized projection of an intent is answered with an offer, a decline, a question, a referral or an unavailability — as a message, never a task. Nothing before the mandate is authority.',
|
|
7
|
+
};
|
|
8
|
+
const ADDR = /^0x[0-9a-fA-F]{40}$/;
|
|
9
|
+
const HEX32 = /^0x[0-9a-fA-F]{64}$/;
|
|
10
|
+
/** The wire-level checks on a probe: who, what intent, which projection, by when, with what nonce. */
|
|
11
|
+
export function validateEngagementProbe(x) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
const p = (x && typeof x === 'object' ? x : {});
|
|
14
|
+
if (p.type !== 'ap.engagement-probe.v1')
|
|
15
|
+
errors.push('type: expected ap.engagement-probe.v1');
|
|
16
|
+
for (const k of ['probeId', 'engagementId', 'campaignId', 'probeNonce', 'replyBy', 'issuedAt', 'objective', 'processing'])
|
|
17
|
+
if (typeof p[k] !== 'string' || !p[k].trim())
|
|
18
|
+
errors.push(`${k}: required`);
|
|
19
|
+
for (const k of ['requester', 'candidate'])
|
|
20
|
+
if (!ADDR.test(String(p[k] ?? '')))
|
|
21
|
+
errors.push(`${k}: must be an address`);
|
|
22
|
+
for (const k of ['intentDigest', 'projectionDigest'])
|
|
23
|
+
if (!HEX32.test(String(p[k] ?? '')))
|
|
24
|
+
errors.push(`${k}: must be a 32-byte digest`);
|
|
25
|
+
if (!p.projection || typeof p.projection !== 'object')
|
|
26
|
+
errors.push('projection: required');
|
|
27
|
+
else if ('withholds' in p.projection)
|
|
28
|
+
errors.push('projection.withholds: never on the wire (336 §3.1)');
|
|
29
|
+
return errors.length ? { ok: false, errors } : { ok: true, probe: p };
|
|
30
|
+
}
|
|
31
|
+
export function validateEngagementResponse(x) {
|
|
32
|
+
const errors = [];
|
|
33
|
+
const r = (x && typeof x === 'object' ? x : {});
|
|
34
|
+
if (r.type !== 'ap.engagement-response.v1')
|
|
35
|
+
errors.push('type: expected ap.engagement-response.v1');
|
|
36
|
+
for (const k of ['responseId', 'inReplyTo', 'engagementId', 'probeNonce', 'issuedAt', 'idempotencyKey'])
|
|
37
|
+
if (typeof r[k] !== 'string' || !r[k].trim())
|
|
38
|
+
errors.push(`${k}: required`);
|
|
39
|
+
if (!ADDR.test(String(r.provider ?? '')))
|
|
40
|
+
errors.push('provider: must be an address');
|
|
41
|
+
const content = r.content;
|
|
42
|
+
const kinds = ['offer', 'needs-clarification', 'human-ux-required', 'referral', 'decline', 'temporarily-unavailable'];
|
|
43
|
+
if (!content || typeof content !== 'object' || !kinds.includes(String(content.kind)))
|
|
44
|
+
errors.push(`content.kind: one of ${kinds.join(' | ')}`);
|
|
45
|
+
return errors.length ? { ok: false, errors } : { ok: true, response: r };
|
|
46
|
+
}
|
|
47
|
+
export function engagementProbeMessage(probe, messageId) {
|
|
48
|
+
return {
|
|
49
|
+
messageId: messageId ?? `probe:${String(probe.probeId)}`,
|
|
50
|
+
role: 'ROLE_USER',
|
|
51
|
+
parts: [{ text: `Engagement probe ${String(probe.probeId)}: will you take this intent, and on what terms?` }, { data: probe }],
|
|
52
|
+
extensions: [AP_ENGAGEMENT_EXTENSION_URI],
|
|
53
|
+
metadata: { [AP_ENGAGEMENT_EXTENSION_URI]: probe },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function engagementResponseMessage(response, messageId) {
|
|
57
|
+
const kind = String(response.content?.kind ?? 'response');
|
|
58
|
+
return {
|
|
59
|
+
messageId: messageId ?? `response:${String(response.responseId)}`,
|
|
60
|
+
role: 'ROLE_AGENT',
|
|
61
|
+
parts: [{ text: `Engagement response (${kind}) to probe ${String(response.inReplyTo)}` }, { data: response }],
|
|
62
|
+
extensions: [AP_ENGAGEMENT_EXTENSION_URI],
|
|
63
|
+
metadata: { [AP_ENGAGEMENT_EXTENSION_URI]: response },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Read whichever engagement document a message carries. `null` ⇒ not this extension's business. */
|
|
67
|
+
export function engagementOf(message) {
|
|
68
|
+
const raw = message.metadata?.[AP_ENGAGEMENT_EXTENSION_URI];
|
|
69
|
+
const declared = (message.extensions ?? []).includes(AP_ENGAGEMENT_EXTENSION_URI);
|
|
70
|
+
if (raw === undefined)
|
|
71
|
+
return declared ? { errors: [`message declares ${AP_ENGAGEMENT_EXTENSION_URI} and carries nothing under it`] } : null;
|
|
72
|
+
const t = raw?.type;
|
|
73
|
+
if (t === 'ap.engagement-probe.v1') {
|
|
74
|
+
const v = validateEngagementProbe(raw);
|
|
75
|
+
return v.ok ? { probe: v.probe } : { errors: v.errors };
|
|
76
|
+
}
|
|
77
|
+
if (t === 'ap.engagement-response.v1') {
|
|
78
|
+
const v = validateEngagementResponse(raw);
|
|
79
|
+
return v.ok ? { response: v.response } : { errors: v.errors };
|
|
80
|
+
}
|
|
81
|
+
return { errors: [`unknown engagement document type ${String(t)}`] };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=engagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.js","sourceRoot":"","sources":["../src/engagement.ts"],"names":[],"mappings":"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"}
|
package/dist/grant.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Address, Hex } from 'viem';
|
|
2
2
|
import type { Caveat } from '@agenticprimitives/delegation';
|
|
3
3
|
/** The "any skill" sentinel for `allowedMethods` — a grant carrying this selector authorizes every
|
|
4
4
|
* skill on the recipient agent (use sparingly; a specific selector is the default). */
|
|
5
5
|
export declare const A2A_ANY_SKILL: Hex;
|
|
6
|
-
/** Map a skill name to its 4-byte `allowedMethods` selector
|
|
6
|
+
/** Map a skill name to its 4-byte `allowedMethods` selector, plus the A2A "any skill" sentinel.
|
|
7
|
+
* The mapping itself is `delegation.methodSelector` — the package that owns the encoding owns the
|
|
8
|
+
* name→selector rule, so the two cannot drift. */
|
|
7
9
|
export declare function skillSelector(skill: string): Hex;
|
|
8
10
|
/** The deployed enforcer addresses (from the network deployment) the grant pins against. */
|
|
9
11
|
export interface A2aEnforcers {
|
package/dist/grant.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant.d.ts","sourceRoot":"","sources":["../src/grant.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"grant.d.ts","sourceRoot":"","sources":["../src/grant.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AASzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D;wFACwF;AACxF,eAAO,MAAM,aAAa,EAAE,GAAkB,CAAC;AAE/C;;mDAEmD;AACnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAGhD;AAED,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,GAAG,MAAM,EAAE,CAiBX"}
|
package/dist/grant.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
// recipient agent + one skill so it can't be replayed against a different agent/skill (the A2A
|
|
3
|
-
// non-replayability model — the agent-endpoint analogue of DEL-001's "possession ≠ authority"). Reuses
|
|
4
|
-
// the deployed AllowedTargets / AllowedMethods / Timestamp enforcers — we invent no new ones.
|
|
5
|
-
import { keccak256, toBytes } from 'viem';
|
|
6
|
-
import { buildCaveat, encodeTimestampTerms, encodeAllowedTargetsTerms, encodeAllowedMethodsTerms, } from '@agenticprimitives/delegation';
|
|
1
|
+
import { buildCaveat, buildMethodAuthorityCaveats, encodeAllowedMethodsTerms, encodeAllowedTargetsTerms, encodeTimestampTerms, methodSelector, } from '@agenticprimitives/delegation';
|
|
7
2
|
/** The "any skill" sentinel for `allowedMethods` — a grant carrying this selector authorizes every
|
|
8
3
|
* skill on the recipient agent (use sparingly; a specific selector is the default). */
|
|
9
4
|
export const A2A_ANY_SKILL = '0x00000000';
|
|
10
|
-
/** Map a skill name to its 4-byte `allowedMethods` selector
|
|
5
|
+
/** Map a skill name to its 4-byte `allowedMethods` selector, plus the A2A "any skill" sentinel.
|
|
6
|
+
* The mapping itself is `delegation.methodSelector` — the package that owns the encoding owns the
|
|
7
|
+
* name→selector rule, so the two cannot drift. */
|
|
11
8
|
export function skillSelector(skill) {
|
|
12
9
|
if (skill === '*' || skill === A2A_ANY_SKILL)
|
|
13
10
|
return A2A_ANY_SKILL;
|
|
14
|
-
return
|
|
11
|
+
return methodSelector(skill);
|
|
15
12
|
}
|
|
16
13
|
/**
|
|
17
14
|
* Build the caveat set for an A2A grant: a timestamp window, the recipient agent SA as the ONLY allowed
|
|
@@ -20,10 +17,21 @@ export function skillSelector(skill) {
|
|
|
20
17
|
* them, rejecting a grant whose target ≠ this agent or whose method ≠ the requested skill.
|
|
21
18
|
*/
|
|
22
19
|
export function buildA2aGrantCaveats(args) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
// Same encoding as any method authority — but the target here is the agent being CALLED, not the
|
|
21
|
+
// agent being acted for. `A2A_ANY_SKILL` is the one A2A-specific case the shared builder has no
|
|
22
|
+
// notion of, so it is expanded here rather than pushed down into `delegation`.
|
|
23
|
+
if (args.skill === '*' || args.skill === A2A_ANY_SKILL) {
|
|
24
|
+
return [
|
|
25
|
+
buildCaveat(args.enforcers.timestamp, encodeTimestampTerms(args.window.validAfter, args.window.validUntil)),
|
|
26
|
+
buildCaveat(args.enforcers.allowedTargets, encodeAllowedTargetsTerms([args.recipientAgentSA])),
|
|
27
|
+
buildCaveat(args.enforcers.allowedMethods, encodeAllowedMethodsTerms([A2A_ANY_SKILL])),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
return buildMethodAuthorityCaveats({
|
|
31
|
+
target: args.recipientAgentSA,
|
|
32
|
+
method: args.skill,
|
|
33
|
+
enforcers: args.enforcers,
|
|
34
|
+
window: args.window,
|
|
35
|
+
});
|
|
28
36
|
}
|
|
29
37
|
//# sourceMappingURL=grant.js.map
|
package/dist/grant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant.js","sourceRoot":"","sources":["../src/grant.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grant.js","sourceRoot":"","sources":["../src/grant.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,GACf,MAAM,+BAA+B,CAAC;AAGvC;wFACwF;AACxF,MAAM,CAAC,MAAM,aAAa,GAAQ,YAAY,CAAC;AAE/C;;mDAEmD;AACnD,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IACnE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAKpC;IACC,iGAAiG;IACjG,gGAAgG;IAChG,+EAA+E;IAC/E,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACvD,OAAO;YACL,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3G,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC9F,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;SACvF,CAAC;IACJ,CAAC;IACD,OAAO,2BAA2B,CAAC;QACjC,MAAM,EAAE,IAAI,CAAC,gBAAgB;QAC7B,MAAM,EAAE,IAAI,CAAC,KAAK;QAClB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Address } from '@agenticprimitives/types';
|
|
2
|
+
export declare const AP_HANDOFF_EXTENSION_URI = "https://agenticprimitives.org/a2a/handoff/v1";
|
|
3
|
+
export interface HandoffV1 {
|
|
4
|
+
extension: typeof AP_HANDOFF_EXTENSION_URI;
|
|
5
|
+
version: 1;
|
|
6
|
+
/** The SUB-intent: the one step in words, with the parent named in its context. Its digest is what the
|
|
7
|
+
* child mandate is bound to; the specialist's run is admitted against exactly this. */
|
|
8
|
+
intent: {
|
|
9
|
+
goal: string;
|
|
10
|
+
context?: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
/** The one step, as the parent's plan admitted it. */
|
|
13
|
+
plan: {
|
|
14
|
+
steps: Array<{
|
|
15
|
+
toolId: string;
|
|
16
|
+
args: Record<string, unknown>;
|
|
17
|
+
id?: string;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
/** The chain, LEAF FIRST: the child, then the mandate it was derived from. Wires, never bodies. */
|
|
21
|
+
presented: unknown[];
|
|
22
|
+
/** The parent run's supplied inputs for this step (a second party's approval, a signature), re-keyed to
|
|
23
|
+
* the one step: an approval given for the person's mandate is inherited by its child. */
|
|
24
|
+
supplied?: unknown[];
|
|
25
|
+
/** Whose run this is a step of, and which step — for the receipt on each side and the resume. */
|
|
26
|
+
parent: {
|
|
27
|
+
agent: Address;
|
|
28
|
+
runRef: string;
|
|
29
|
+
stepRef: string;
|
|
30
|
+
operationId: string;
|
|
31
|
+
childRef: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare function validateHandoff(x: unknown): {
|
|
35
|
+
ok: true;
|
|
36
|
+
handoff: HandoffV1;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
errors: string[];
|
|
40
|
+
};
|
|
41
|
+
export declare function handoff(input: Omit<HandoffV1, 'extension' | 'version'>): HandoffV1;
|
|
42
|
+
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AAEvF,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,OAAO,wBAAwB,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC;IACX;4FACwF;IACxF,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC5D,sDAAsD;IACtD,IAAI,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACvF,mGAAmG;IACnG,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB;8FAC0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,iGAAiG;IACjG,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACpG;AAID,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAa9G;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,SAAS,CAElF"}
|