@agenticprimitives/a2a 0.0.0-alpha.2 → 0.0.0-alpha.20
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 +58 -21
- package/bin/a2a-conform.mjs +17 -0
- package/dist/agent.d.ts +171 -3
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +346 -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 +20 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +69 -14
- 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 +24 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -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/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 +69 -0
- package/dist/session-wire.d.ts.map +1 -0
- package/dist/session-wire.js +170 -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/caller.d.ts +86 -0
- package/dist/standard/caller.d.ts.map +1 -0
- package/dist/standard/caller.js +159 -0
- package/dist/standard/caller.js.map +1 -0
- package/dist/standard/client.d.ts +50 -0
- package/dist/standard/client.d.ts.map +1 -0
- package/dist/standard/client.js +86 -0
- package/dist/standard/client.js.map +1 -0
- package/dist/standard/delegated.d.ts +119 -0
- package/dist/standard/delegated.d.ts.map +1 -0
- package/dist/standard/delegated.js +168 -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 +38 -0
- package/dist/standard/from-agent.d.ts.map +1 -0
- package/dist/standard/from-agent.js +109 -0
- package/dist/standard/from-agent.js.map +1 -0
- package/dist/standard/index.d.ts +9 -0
- package/dist/standard/index.d.ts.map +1 -0
- package/dist/standard/index.js +13 -0
- package/dist/standard/index.js.map +1 -0
- package/dist/standard/mount.d.ts +91 -0
- package/dist/standard/mount.d.ts.map +1 -0
- package/dist/standard/mount.js +181 -0
- package/dist/standard/mount.js.map +1 -0
- package/dist/standard/server.d.ts +105 -0
- package/dist/standard/server.d.ts.map +1 -0
- package/dist/standard/server.js +454 -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 +75 -0
- package/dist/subject-hop.d.ts.map +1 -0
- package/dist/subject-hop.js +170 -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 +20 -6
- 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
package/CLAUDE.md
CHANGED
|
@@ -5,6 +5,17 @@ Async, delegation-authorized **Agent-to-Agent task transport** (spec 269). Any c
|
|
|
5
5
|
other claimed agent an asynchronous task and collects the result by poll / push / stream. Built on the
|
|
6
6
|
`@agenticprimitives/fulfillment` Task substrate; the delegation primitive is the auth.
|
|
7
7
|
|
|
8
|
+
## Agentic role (ADR-0044)
|
|
9
|
+
A2A is the **agentic orchestration, intelligence, and discovery layer**: first-party web apps express
|
|
10
|
+
INTENTS to an a2a agent, which decides *which MCP tools to compose* as primitives. Web NEVER constructs
|
|
11
|
+
MCP tool calls directly. **Orchestration is a Ring-0 primitive** — the agentic loop, planner port, and tool
|
|
12
|
+
model live in a pure `packages/*` orchestration core; ONLY the concrete LLM-framework binding (LangChain/
|
|
13
|
+
OpenAI/Anthropic SDK) sits in a dedicated in-repo adapter behind the port (the `chain-state`+`chain-state-viem`
|
|
14
|
+
pattern). This `a2a` package itself stays pure transport + delegation-auth: it carries tasks, enforces
|
|
15
|
+
authority, and *runs* the orchestration core via the injected `SkillHandler` — it does not embed the LLM SDK.
|
|
16
|
+
See [ADR-0044](../../docs/architecture/decisions/0044-a2a-is-the-agentic-orchestration-layer.md)
|
|
17
|
+
+ `docs/architecture/principles.md` §1.
|
|
18
|
+
|
|
8
19
|
## The boundary (ADR-0034 — READ FIRST)
|
|
9
20
|
This package is the **transport-agnostic core**: the Task runtime over a `TaskStore` PORT, the
|
|
10
21
|
`SkillHandler` contract + dispatcher, the JSON-RPC handlers, the `A2aWireAdapter` client, the
|
|
@@ -14,26 +25,43 @@ subpath. We DIVERGE from spec 245's `mcp-runtime/a2a` placement on purpose — `
|
|
|
14
25
|
consumer (the receiving `withDelegation` gate + the a2a→mcp delivery leg), not the owner.
|
|
15
26
|
|
|
16
27
|
## Wave status
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
W1–W5 of spec 269 are DONE (runtime, delegation-auth gate, `createA2aAgent` + JSON-RPC + client + the `./cloudflare`
|
|
29
|
+
store, vault body residency + signed push + SSE, the two-agent acceptance harness + demo-a2a adoption). The spec's
|
|
30
|
+
§9 decisions and `test/harness.test.ts` (AC-1..AC-4) are the record; this file says what the package IS now.
|
|
31
|
+
|
|
32
|
+
## THE WIRE — A2A 1.0, and only that (spec 372, folded at S4)
|
|
33
|
+
`src/standard/` IS the wire: A2A **1.0** as the official TCK tests it (PascalCase methods, proto-JSON
|
|
34
|
+
shapes, `A2A-Version`, ErrorInfo on every A2A error, SSE, push). There is no second set of method names —
|
|
35
|
+
`message/send` / `tasks/get` and `jsonrpc.ts` are DELETED, not deprecated.
|
|
36
|
+
|
|
37
|
+
- `createStandardA2aServer({card, executor, principal?, canSeeTask?, beforeSend?, onCancel?})` — fetch-shaped;
|
|
38
|
+
the executor emits events through `ctx` and knows no transport.
|
|
39
|
+
- **Authority rides as an extension.** `standard/delegated.ts`: a `SendMessage` carrying
|
|
40
|
+
`AP_DELEGATED_TASK_EXTENSION` in `message.metadata` is a delegation-authorized task — the grant, the
|
|
41
|
+
requester, and the ENVELOPE the sender signed. `createAgentBackedServer` (`standard/from-agent.ts`) puts
|
|
42
|
+
the `createA2aAgent` runtime behind it; every gate (`authorizeA2aMessage`, `hashA2aMessage`, revocation)
|
|
43
|
+
is the one that was always there, and the runtime keeps its own task ids.
|
|
44
|
+
- **Two facts, kept apart.** The `Authorization` header says who is CALLING (`caller.ts`: a Home session
|
|
45
|
+
bearer, or an agent's session wire). The envelope's signature says who AUTHORED the message. A relay may
|
|
46
|
+
carry a message it did not write, so collapsing them would delete a gate.
|
|
47
|
+
- A **door, never a grant**: `principal` is admission (ADR-0057); authority is the extension + the gates.
|
|
48
|
+
- `canSeeTask` is not optional in a deployment that holds other people's tasks: a non-party is answered
|
|
49
|
+
TaskNotFound, because saying "forbidden" confirms it exists.
|
|
50
|
+
- `tck/sut.mjs` + `scripts/run-a2a-tck.sh` = the TCK in CI (`a2a-tck.yml`), green at MUST/SHOULD/MAY.
|
|
51
|
+
- `./conform` = `ap conform a2a <url>` (spec 399 §2.3): `conformA2a` probes a LIVE agent's card + binding
|
|
52
|
+
(MUSTs flip `ok`; a door without a bearer stops, and says so). Bin `a2a-conform`.
|
|
53
|
+
|
|
54
|
+
## Promoted from the runtime app (spec 399 §4, W0) — protocol, not product
|
|
55
|
+
- `standard/mount.ts` — mounting this surface in front of a harness: `withStandardCardFields` (the 1.0 card
|
|
56
|
+
fields), `isRuntimeTaskId`, `runtimeBackedTaskStore` (ONE view over the runtime's tasks + this server's),
|
|
57
|
+
`principalBySchemes` (`Bearer` = person, `A2A-Session` = agent — never each other's fallback, ADR-0013),
|
|
58
|
+
`delegatedDispatch` (delegated task → the runtime; engagement probe → a message), `settlementForReplyKind`
|
|
59
|
+
(spec 372 S4's reply-kind → task-state table) + `settleTask`.
|
|
60
|
+
- `subject-hop.ts` — the routed hop over the one wire (spec 366 R4 / 374 §4 / 376): `sendSubjectAskOverWire`
|
|
61
|
+
resolves through the card (`a2aEndpointOf`, digest pin), `subjectAskOf` / `subjectAnswerOf` / `handoffOf`
|
|
62
|
+
read the profiles, `SUBJECT_ANSWER_ARTIFACT` carries the receiver's envelope verbatim.
|
|
63
|
+
- `wire-verify.ts` — `verifyDelegationWire`: the delegate-key tail every A2A service repeats (identity,
|
|
64
|
+
caveats, revocation, signature — one boolean, fail-closed). Caveat SHAPE policy stays with the product.
|
|
37
65
|
|
|
38
66
|
## Read first
|
|
39
67
|
1. `capability.manifest.json` — boundary.
|
|
@@ -43,7 +71,9 @@ consumer (the receiving `withDelegation` gate + the a2a→mcp delivery leg), not
|
|
|
43
71
|
|
|
44
72
|
## Allowed imports
|
|
45
73
|
`@agenticprimitives/types`, `@agenticprimitives/fulfillment` (Task/Artifact types), `@agenticprimitives/delegation`
|
|
46
|
-
(verify + caveats), `
|
|
74
|
+
(verify + caveats), `@agenticprimitives/verification-receipts` (spec 303 W3 — the message/send + resubmit
|
|
75
|
+
mint point behind `config.receipts`), `viem`. The `./cloudflare` subpath additionally uses
|
|
76
|
+
`@cloudflare/workers-types` (dev).
|
|
47
77
|
|
|
48
78
|
## Forbidden imports
|
|
49
79
|
- `apps/*`
|
|
@@ -60,6 +90,13 @@ consumer (the receiving `withDelegation` gate + the a2a→mcp delivery leg), not
|
|
|
60
90
|
never reaches another principal's namespace.
|
|
61
91
|
- No long-lived signing key for a claimed agent — KMS/session signer only (ties to spec-235 §10).
|
|
62
92
|
|
|
93
|
+
## Agent-card audiences (spec 338 §8)
|
|
94
|
+
`agentCard(forAudience?)` projects by `SkillHandler.exposure` (`public` | `authenticated` | `private` | `service-only`;
|
|
95
|
+
omitted ⇒ **public**, so an existing well-known route cannot start leaking). **Passing an audience is not
|
|
96
|
+
authenticating one**: `createCardAudienceResolver` verifies a signed challenge (nonce consumed BEFORE the signature
|
|
97
|
+
read; `x-ap-*` HEADERS, never the query string) and **degrades to `public` on every failure**; `privateViewPolicy` is a
|
|
98
|
+
SEPARATE injected decision (omit ⇒ capped at `authenticated`). Visibility is DISCLOSURE, not authorization.
|
|
99
|
+
|
|
63
100
|
## Validate
|
|
64
101
|
```bash
|
|
65
102
|
pnpm --filter @agenticprimitives/a2a typecheck
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// a2a-conform — `ap conform a2a <url>` (spec 399 §2.3): probe an A2A 1.0 agent on the JSON-RPC binding.
|
|
3
|
+
//
|
|
4
|
+
// a2a-conform https://agent.example (the card at /.well-known/agent-card.json)
|
|
5
|
+
// a2a-conform <url> --bearer <token> (the bearer the surface admits — a Home session, a session wire)
|
|
6
|
+
// a2a-conform <url> --json (the report as JSON, for a CI step)
|
|
7
|
+
//
|
|
8
|
+
// Exit 1 when a MUST failed; SHOULD and MAY are reported, never gating.
|
|
9
|
+
import { conformA2a, formatConformanceReport } from '../dist/conform/index.js';
|
|
10
|
+
|
|
11
|
+
const argv = process.argv.slice(2);
|
|
12
|
+
const url = argv.find((a) => !a.startsWith('--'));
|
|
13
|
+
const opt = (name) => { const eq = argv.find((a) => a.startsWith(`--${name}=`)); if (eq) return eq.slice(name.length + 3); const i = argv.indexOf(`--${name}`); return i >= 0 ? argv[i + 1] : undefined; };
|
|
14
|
+
if (!url) { console.error('usage: a2a-conform <agent-origin-or-card-url> [--bearer <token>] [--timeout <ms>] [--json]'); process.exit(2); }
|
|
15
|
+
const report = await conformA2a(url, { bearer: opt('bearer') ?? process.env.A2A_BEARER, timeoutMs: opt('timeout') ? Number(opt('timeout')) : undefined });
|
|
16
|
+
console.log(argv.includes('--json') ? JSON.stringify(report, null, 2) : formatConformanceReport(report));
|
|
17
|
+
process.exit(report.ok ? 0 : 1);
|
package/dist/agent.d.ts
CHANGED
|
@@ -4,9 +4,62 @@ import type { Delegation } from '@agenticprimitives/delegation';
|
|
|
4
4
|
import type { Task, TaskEvent, A2aMessage, VaultRef } from './types.js';
|
|
5
5
|
import type { TaskStore } from './task-store.js';
|
|
6
6
|
import { type SkillHandler, type VaultClient, type McpClient } from './skill-handler.js';
|
|
7
|
-
import { type OnChainChecks } from './auth.js';
|
|
7
|
+
import { type OnChainChecks, type ScopeCovers } from './auth.js';
|
|
8
|
+
import { mintVerificationReceipt, type ReceiptProof, type Sha256, type VerificationReceiptV1 } from '@agenticprimitives/verification-receipts';
|
|
8
9
|
import type { A2aEnforcers } from './grant.js';
|
|
9
10
|
import { type TerminalSigner, type PushSender } from './push.js';
|
|
11
|
+
import { type ApAuthorityExtensionParams } from './authority-extension.js';
|
|
12
|
+
import { type PaymentGate, type SkillPayment } from './payment-gate.js';
|
|
13
|
+
/**
|
|
14
|
+
* Spec 290 §6 Stage-3 — an injected per-Smart-Agent HARD budget. STRUCTURAL (no `rate-control` import —
|
|
15
|
+
* ADR-0034 keeps this package transport/vendor-agnostic); the app wires a `rate-control` HardBudgetStore
|
|
16
|
+
* adapter. The runtime reserves AFTER authority (keyed by the verified principal), COMMITS only once the
|
|
17
|
+
* task is durably created, and RELEASES on any pre-creation failure (the spec §3 A2A pattern). Additive to
|
|
18
|
+
* the on-chain enforcers, never the authority for value movement (ADR-0041). Omit ⇒ no Stage-3 budget.
|
|
19
|
+
*/
|
|
20
|
+
export interface A2aBudgetPort {
|
|
21
|
+
reserve(input: {
|
|
22
|
+
sponsorAgent: Address;
|
|
23
|
+
capabilityId: string;
|
|
24
|
+
idempotencyKey: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
allowed: boolean;
|
|
27
|
+
reservationId?: string;
|
|
28
|
+
}>;
|
|
29
|
+
commit(reservationId: string): Promise<void>;
|
|
30
|
+
release(reservationId: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Spec 303 W3 — verification receipts on the A2A ingress. Mirrors mcp-runtime's
|
|
34
|
+
* `ReceiptsConfig`: the agent mints a commitment-split `VerificationReceiptV1`
|
|
35
|
+
* at message/send + resubmit terminal decisions (allow after durable accept;
|
|
36
|
+
* deny with the PUBLIC rpc message as the coarse reason — the raw auth reason
|
|
37
|
+
* is already suppressed, NEW-A2A-1) and hands the pair to `onReceipt`. The
|
|
38
|
+
* public receipt also rides the accept result so the SENDER retains it.
|
|
39
|
+
* Absent ⇒ no receipts, byte-identical behavior (INV-303-5).
|
|
40
|
+
*/
|
|
41
|
+
export interface A2aReceiptsConfig {
|
|
42
|
+
/** The verifying agent identity stamped into receipts (this agent's SA — Mode-1 public). */
|
|
43
|
+
verifier: string;
|
|
44
|
+
policyVersion: string;
|
|
45
|
+
onReceipt: (minted: Awaited<ReturnType<typeof mintVerificationReceipt>>, ctx: {
|
|
46
|
+
outcome: 'allow' | 'deny';
|
|
47
|
+
messageId: Hex;
|
|
48
|
+
skill: string;
|
|
49
|
+
taskId?: Hex;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
/** Injected signer over the canonical receiptHash. Omit ⇒ unsigned (integrity-only). */
|
|
52
|
+
sign?: (receiptHash: Sha256) => Promise<ReceiptProof>;
|
|
53
|
+
/** Duty-3 evidence provider (latest block); omit ⇒ blockNumber '0' + zero hash. */
|
|
54
|
+
statusEvidence?: () => Promise<{
|
|
55
|
+
blockNumber: string;
|
|
56
|
+
blockHash: Hex;
|
|
57
|
+
}>;
|
|
58
|
+
/** Per-relationship receipt key; omit ⇒ fresh key per receipt. */
|
|
59
|
+
receiptKey?: Hex;
|
|
60
|
+
/** `true` ⇒ a failed mint/onReceipt aborts the call (spec 291 §5 posture). Default fail-soft. */
|
|
61
|
+
failClosed?: boolean;
|
|
62
|
+
}
|
|
10
63
|
export interface A2aAgentConfig {
|
|
11
64
|
/** This agent's Smart Account — the assignee + the allowedTargets the gate requires. */
|
|
12
65
|
agentSA: Address;
|
|
@@ -16,7 +69,25 @@ export interface A2aAgentConfig {
|
|
|
16
69
|
enforcers: A2aEnforcers;
|
|
17
70
|
taskStore: TaskStore;
|
|
18
71
|
checks: OnChainChecks;
|
|
72
|
+
/** FR-4.2 scope classes for `allowedTargets` — see `ScopeCovers` in auth.ts. Omit ⇒ exact match only. */
|
|
73
|
+
scopeCovers?: ScopeCovers;
|
|
19
74
|
handlers: SkillHandler[];
|
|
75
|
+
/**
|
|
76
|
+
* Resolve a method the static `handlers` list does not contain — the METHOD-FAMILY seam.
|
|
77
|
+
*
|
|
78
|
+
* (`skill` is this protocol's name for the string a message addresses; the authorization layer
|
|
79
|
+
* calls the same value a METHOD — `skillSelector` reduces it to a `bytes4` the ALLOWED_METHODS
|
|
80
|
+
* enforcer checks. Family members are methods, not necessarily distinct implementations.)
|
|
81
|
+
*
|
|
82
|
+
* Consulted only on a registry miss, so it can never shadow a registered handler. It exists for
|
|
83
|
+
* agents whose method set is DATA rather than code: one hosting a set of archetypes defined in
|
|
84
|
+
* its own library answers `archetype.<slug>` for whatever that library declares, and adding a role
|
|
85
|
+
* is a library write instead of a redeploy. Returning undefined leaves the task rejected as
|
|
86
|
+
* `unknown skill`, exactly as before.
|
|
87
|
+
*/
|
|
88
|
+
resolveHandler?: (skill: string) => SkillHandler | undefined;
|
|
89
|
+
/** Extra methods to advertise on the agent card for a family the handlers array cannot list. */
|
|
90
|
+
dynamicSkills?: () => string[];
|
|
20
91
|
vault: VaultClient;
|
|
21
92
|
mcp: McpClient;
|
|
22
93
|
/** Clock + id generators — injected for determinism in tests. */
|
|
@@ -29,9 +100,45 @@ export interface A2aAgentConfig {
|
|
|
29
100
|
* be a KMS/session signer for the assignee SA (SR-8). */
|
|
30
101
|
signTerminal?: TerminalSigner;
|
|
31
102
|
pushSender?: PushSender;
|
|
103
|
+
/**
|
|
104
|
+
* What this deployment actually MOUNTED, for the Agent Card's capability block (ADR-0059).
|
|
105
|
+
*
|
|
106
|
+
* `streaming` is not knowable from here: `message/stream` is served by the SSE transport, which the
|
|
107
|
+
* embedding worker mounts (`dispatchA2aRpc` explicitly rejects it). So the deployment declares it,
|
|
108
|
+
* and the default is FALSE — an agent that has not said it streams is assumed not to, because the
|
|
109
|
+
* cost of over-claiming is a peer that opens a stream which never arrives.
|
|
110
|
+
*
|
|
111
|
+
* `pushNotifications` is NOT taken from here: it is DERIVED from whether push is actually wired
|
|
112
|
+
* (`signTerminal` + `pushSender`), because that is knowable and a config flag could contradict it.
|
|
113
|
+
*/
|
|
114
|
+
declaredCapabilities?: {
|
|
115
|
+
streaming?: boolean;
|
|
116
|
+
stateTransitionHistory?: boolean;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* The authority model this agent's Card declares (ADR-0059 / spec 341 §2.1).
|
|
120
|
+
*
|
|
121
|
+
* Omit and the Card says nothing about how to authenticate — which is the state that made "an
|
|
122
|
+
* external agent can use the same skills the Home uses" unreachable. It is optional only so the
|
|
123
|
+
* bump is non-breaking; a deployment serving peer-callable skills SHOULD set it.
|
|
124
|
+
*/
|
|
125
|
+
authority?: ApAuthorityExtensionParams;
|
|
32
126
|
/** FR-3.6 — the policy gating skill-handler hand-offs (`requestHandoff`). Omit ⇒ hand-offs are
|
|
33
127
|
* rejected (fail-closed). */
|
|
34
128
|
handoffPolicy?: HandoffPolicy;
|
|
129
|
+
/** Spec 272 PAY-A2A — the injected x402 payment gate. When a priced skill (handler.payment) is
|
|
130
|
+
* invoked, the gate decides paid/unpaid (the app wires the payments x402 rail). Omit ⇒ priced skills
|
|
131
|
+
* behave as free (dev / unpriced deployment). */
|
|
132
|
+
paymentGate?: PaymentGate;
|
|
133
|
+
/** Spec 290 §6 Stage-3 — the per-Smart-Agent hard-budget port (post-authority, keyed by the verified
|
|
134
|
+
* principal). Omit ⇒ no Stage-3 budget (authority + single-use message-id still apply). */
|
|
135
|
+
budget?: A2aBudgetPort;
|
|
136
|
+
/** N-2 (seam audit): when set, read/control caller signatures (tasks/get, tasks/cancel,
|
|
137
|
+
* pushNotificationConfig/set) MUST carry a recent `issuedAt` (within this many seconds) — bounding
|
|
138
|
+
* replay of a captured signature to the window. Omit ⇒ no freshness requirement (legacy behavior). */
|
|
139
|
+
callerSigMaxAgeSec?: number;
|
|
140
|
+
/** Spec 303 W3 — verification receipts at the message/send + resubmit terminals. Omit ⇒ none. */
|
|
141
|
+
receipts?: A2aReceiptsConfig;
|
|
35
142
|
}
|
|
36
143
|
export type RpcOk<T> = {
|
|
37
144
|
ok: true;
|
|
@@ -60,42 +167,83 @@ export interface ResubmitParams extends MessageSendParams {
|
|
|
60
167
|
taskId: Hex;
|
|
61
168
|
}
|
|
62
169
|
export interface A2aAgent {
|
|
170
|
+
/** `receipt` (spec 303 W3): the PUBLIC verification receipt for the accept — commitment-only,
|
|
171
|
+
* retained by the SENDER independently of this agent. Present only when `config.receipts` is set. */
|
|
63
172
|
messageSend(params: MessageSendParams): Promise<RpcResult<{
|
|
64
173
|
taskId: Hex;
|
|
65
174
|
state: Task['state'];
|
|
175
|
+
receipt?: VerificationReceiptV1;
|
|
66
176
|
}>>;
|
|
67
177
|
/** Resume an auth-required task (auth-required → submitted) with a fresh grant + message (FR-3.5). */
|
|
68
178
|
resubmit(params: ResubmitParams): Promise<RpcResult<{
|
|
69
179
|
taskId: Hex;
|
|
70
180
|
state: Task['state'];
|
|
181
|
+
receipt?: VerificationReceiptV1;
|
|
71
182
|
}>>;
|
|
72
183
|
tasksGet(params: {
|
|
73
184
|
taskId: Hex;
|
|
74
185
|
caller: Address;
|
|
186
|
+
signature: Hex;
|
|
187
|
+
issuedAt?: number;
|
|
75
188
|
}): Promise<RpcResult<Task & {
|
|
76
189
|
error?: string;
|
|
77
190
|
artifactRefs: VaultRef[];
|
|
78
191
|
}>>;
|
|
192
|
+
/** Read ONE artifact's BODY. `tasks/get` returns refs only, and an artifact body lives in the
|
|
193
|
+
* ASSIGNEE's vault — so without this a party to a task can see that a result exists and never
|
|
194
|
+
* read it, which makes every A2A skill that produces a document unusable to its own requester.
|
|
195
|
+
* Adds NO authority: same signed-digest proof and same sender-or-assignee test as `tasks/get`,
|
|
196
|
+
* returning the body that party is already entitled to. The artifactId is bound into the
|
|
197
|
+
* signature (N-1) so a captured one cannot be replayed for a different artifact. */
|
|
198
|
+
tasksArtifact(params: {
|
|
199
|
+
taskId: Hex;
|
|
200
|
+
artifactId: Hex;
|
|
201
|
+
caller: Address;
|
|
202
|
+
signature: Hex;
|
|
203
|
+
issuedAt?: number;
|
|
204
|
+
}): Promise<RpcResult<{
|
|
205
|
+
artifactId: Hex;
|
|
206
|
+
artifactKind?: string;
|
|
207
|
+
bodyRef: VaultRef;
|
|
208
|
+
body: unknown;
|
|
209
|
+
}>>;
|
|
79
210
|
tasksCancel(params: {
|
|
80
211
|
taskId: Hex;
|
|
81
212
|
caller: Address;
|
|
213
|
+
signature: Hex;
|
|
214
|
+
issuedAt?: number;
|
|
82
215
|
}): Promise<RpcResult<{
|
|
83
216
|
taskId: Hex;
|
|
84
217
|
state: Task['state'];
|
|
85
218
|
}>>;
|
|
86
|
-
/**
|
|
219
|
+
/** Cancel for a caller the TRANSPORT authenticated (spec 372 S4) — same party test, no per-request
|
|
220
|
+
* signature, and callable only from a surface that has already proved who is asking. */
|
|
221
|
+
tasksCancelAs(params: {
|
|
222
|
+
taskId: Hex;
|
|
223
|
+
caller: Address;
|
|
224
|
+
}): Promise<RpcResult<{
|
|
225
|
+
taskId: Hex;
|
|
226
|
+
state: Task['state'];
|
|
227
|
+
}>>;
|
|
228
|
+
/** Register the push webhook for a task (FR-5.2). Signed-caller + party-authed (NEW-A2A-2). */
|
|
87
229
|
pushConfigSet(params: {
|
|
88
230
|
taskId: Hex;
|
|
89
231
|
caller: Address;
|
|
232
|
+
signature: Hex;
|
|
90
233
|
url: string;
|
|
91
234
|
token?: string;
|
|
235
|
+
issuedAt?: number;
|
|
92
236
|
}): Promise<RpcResult<{
|
|
93
237
|
taskId: Hex;
|
|
94
238
|
registered: true;
|
|
95
239
|
}>>;
|
|
96
240
|
/** The alarm() body — process every due task to a next state. Returns the events to fan out (W4 delivery). */
|
|
97
241
|
processDue(): Promise<TaskEvent[]>;
|
|
98
|
-
|
|
242
|
+
/**
|
|
243
|
+
* Build the agent card for an audience. Omitted ⇒ `public` — so an existing caller that serves
|
|
244
|
+
* `/.well-known/agent-card.json` keeps serving a PUBLIC card, never an extended one by accident.
|
|
245
|
+
*/
|
|
246
|
+
agentCard(forAudience?: AgentCardAudience): AgentCard;
|
|
99
247
|
}
|
|
100
248
|
export interface AgentCard {
|
|
101
249
|
name: string;
|
|
@@ -105,10 +253,30 @@ export interface AgentCard {
|
|
|
105
253
|
streaming: boolean;
|
|
106
254
|
pushNotifications: boolean;
|
|
107
255
|
stateTransitionHistory: boolean;
|
|
256
|
+
/** PAY-A2A-4 — declared extensions (e.g. x402 pay-per-use); clients activate via X-A2A-Extensions. */
|
|
257
|
+
extensions?: {
|
|
258
|
+
uri: string;
|
|
259
|
+
required: boolean;
|
|
260
|
+
description: string;
|
|
261
|
+
}[];
|
|
108
262
|
};
|
|
263
|
+
/** Priced skills annotate their `payment` so clients learn the price BEFORE calling. */
|
|
109
264
|
skills: {
|
|
110
265
|
id: string;
|
|
266
|
+
payment?: SkillPayment;
|
|
111
267
|
}[];
|
|
112
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Who is asking for the card (spec 338 §8).
|
|
271
|
+
*
|
|
272
|
+
* `authenticated` and `private` MUST only be passed once the caller has been genuinely
|
|
273
|
+
* authenticated — this type does not verify anything, it records a verdict the caller already
|
|
274
|
+
* reached. Passing `'private'` for an unauthenticated request is how an extended card leaks.
|
|
275
|
+
*/
|
|
276
|
+
export interface AgentCardAudience {
|
|
277
|
+
audience: 'public' | 'authenticated' | 'private';
|
|
278
|
+
/** The VERIFIED requester. Required for `private`; absent ⇒ no private skill matches. */
|
|
279
|
+
requester?: string;
|
|
280
|
+
}
|
|
113
281
|
export declare function createA2aAgent(config: A2aAgentConfig): A2aAgent;
|
|
114
282
|
//# sourceMappingURL=agent.d.ts.map
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,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,EAAc,SAAS,EAAE,UAAU,EAAe,QAAQ,EAAc,MAAM,YAAY,CAAC;AAE7G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|