@agenticprimitives/a2a 0.0.0-alpha.2 → 0.0.0-alpha.21
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 +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 +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 +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 +38 -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 +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 +109 -0
- package/dist/standard/server.d.ts.map +1 -0
- package/dist/standard/server.js +459 -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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
export type TaskStateV1 = 'TASK_STATE_UNSPECIFIED' | 'TASK_STATE_SUBMITTED' | 'TASK_STATE_WORKING' | 'TASK_STATE_COMPLETED' | 'TASK_STATE_FAILED' | 'TASK_STATE_CANCELED' | 'TASK_STATE_INPUT_REQUIRED' | 'TASK_STATE_REJECTED' | 'TASK_STATE_AUTH_REQUIRED';
|
|
2
|
+
export declare const TERMINAL_STATES: ReadonlySet<TaskStateV1>;
|
|
3
|
+
export type RoleV1 = 'ROLE_UNSPECIFIED' | 'ROLE_USER' | 'ROLE_AGENT';
|
|
4
|
+
/** One part: exactly one of `text` / `raw` (base64 bytes) / `url` / `data`. `mediaType` + `filename` qualify a file. */
|
|
5
|
+
export interface PartV1 {
|
|
6
|
+
text?: string;
|
|
7
|
+
raw?: string;
|
|
8
|
+
url?: string;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
filename?: string;
|
|
11
|
+
mediaType?: string;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface MessageV1 {
|
|
15
|
+
messageId: string;
|
|
16
|
+
role: RoleV1;
|
|
17
|
+
parts: PartV1[];
|
|
18
|
+
contextId?: string;
|
|
19
|
+
taskId?: string;
|
|
20
|
+
referenceTaskIds?: string[];
|
|
21
|
+
extensions?: string[];
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface ArtifactV1 {
|
|
25
|
+
artifactId: string;
|
|
26
|
+
parts: PartV1[];
|
|
27
|
+
name?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
extensions?: string[];
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface TaskStatusV1 {
|
|
33
|
+
state: TaskStateV1;
|
|
34
|
+
message?: MessageV1;
|
|
35
|
+
timestamp?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface TaskV1 {
|
|
38
|
+
id: string;
|
|
39
|
+
contextId: string;
|
|
40
|
+
status: TaskStatusV1;
|
|
41
|
+
artifacts?: ArtifactV1[];
|
|
42
|
+
history?: MessageV1[];
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
export interface TaskStatusUpdateEventV1 {
|
|
46
|
+
taskId: string;
|
|
47
|
+
contextId: string;
|
|
48
|
+
status: TaskStatusV1;
|
|
49
|
+
metadata?: Record<string, unknown>;
|
|
50
|
+
}
|
|
51
|
+
export interface TaskArtifactUpdateEventV1 {
|
|
52
|
+
taskId: string;
|
|
53
|
+
contextId: string;
|
|
54
|
+
artifact: ArtifactV1;
|
|
55
|
+
append?: boolean;
|
|
56
|
+
lastChunk?: boolean;
|
|
57
|
+
metadata?: Record<string, unknown>;
|
|
58
|
+
}
|
|
59
|
+
/** One SSE `data:` line of a streaming method — exactly one member set. */
|
|
60
|
+
export type StreamResponseV1 = {
|
|
61
|
+
task: TaskV1;
|
|
62
|
+
} | {
|
|
63
|
+
message: MessageV1;
|
|
64
|
+
} | {
|
|
65
|
+
statusUpdate: TaskStatusUpdateEventV1;
|
|
66
|
+
} | {
|
|
67
|
+
artifactUpdate: TaskArtifactUpdateEventV1;
|
|
68
|
+
};
|
|
69
|
+
export interface SendMessageConfigurationV1 {
|
|
70
|
+
acceptedOutputModes?: string[];
|
|
71
|
+
historyLength?: number;
|
|
72
|
+
returnImmediately?: boolean;
|
|
73
|
+
taskPushNotificationConfig?: TaskPushNotificationConfigV1;
|
|
74
|
+
}
|
|
75
|
+
export interface SendMessageRequestV1 {
|
|
76
|
+
message: MessageV1;
|
|
77
|
+
configuration?: SendMessageConfigurationV1;
|
|
78
|
+
metadata?: Record<string, unknown>;
|
|
79
|
+
tenant?: string;
|
|
80
|
+
}
|
|
81
|
+
export type SendMessageResponseV1 = {
|
|
82
|
+
task: TaskV1;
|
|
83
|
+
} | {
|
|
84
|
+
message: MessageV1;
|
|
85
|
+
};
|
|
86
|
+
export interface PushNotificationConfigV1 {
|
|
87
|
+
id?: string;
|
|
88
|
+
url: string;
|
|
89
|
+
token?: string;
|
|
90
|
+
authentication?: {
|
|
91
|
+
scheme: string;
|
|
92
|
+
credentials?: string;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export interface TaskPushNotificationConfigV1 extends PushNotificationConfigV1 {
|
|
96
|
+
taskId?: string;
|
|
97
|
+
tenant?: string;
|
|
98
|
+
}
|
|
99
|
+
export interface AgentInterfaceV1 {
|
|
100
|
+
url: string;
|
|
101
|
+
protocolBinding: 'JSONRPC' | 'GRPC' | 'HTTP+JSON' | string;
|
|
102
|
+
protocolVersion: string;
|
|
103
|
+
tenant?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface AgentSkillV1 {
|
|
106
|
+
id: string;
|
|
107
|
+
name: string;
|
|
108
|
+
description: string;
|
|
109
|
+
tags: string[];
|
|
110
|
+
examples?: string[];
|
|
111
|
+
inputModes?: string[];
|
|
112
|
+
outputModes?: string[];
|
|
113
|
+
}
|
|
114
|
+
export interface AgentCardV1 {
|
|
115
|
+
name: string;
|
|
116
|
+
description: string;
|
|
117
|
+
version: string;
|
|
118
|
+
supportedInterfaces: AgentInterfaceV1[];
|
|
119
|
+
capabilities: {
|
|
120
|
+
streaming?: boolean;
|
|
121
|
+
pushNotifications?: boolean;
|
|
122
|
+
extendedAgentCard?: boolean;
|
|
123
|
+
extensions?: Array<{
|
|
124
|
+
uri: string;
|
|
125
|
+
description?: string;
|
|
126
|
+
required?: boolean;
|
|
127
|
+
params?: Record<string, unknown>;
|
|
128
|
+
}>;
|
|
129
|
+
};
|
|
130
|
+
defaultInputModes: string[];
|
|
131
|
+
defaultOutputModes: string[];
|
|
132
|
+
skills: AgentSkillV1[];
|
|
133
|
+
provider?: {
|
|
134
|
+
organization: string;
|
|
135
|
+
url: string;
|
|
136
|
+
};
|
|
137
|
+
documentationUrl?: string;
|
|
138
|
+
iconUrl?: string;
|
|
139
|
+
securitySchemes?: Record<string, SecuritySchemeV1>;
|
|
140
|
+
securityRequirements?: Array<{
|
|
141
|
+
schemes: Record<string, {
|
|
142
|
+
list: string[];
|
|
143
|
+
}>;
|
|
144
|
+
}>;
|
|
145
|
+
signatures?: Array<{
|
|
146
|
+
protected: string;
|
|
147
|
+
signature: string;
|
|
148
|
+
header?: Record<string, unknown>;
|
|
149
|
+
}>;
|
|
150
|
+
}
|
|
151
|
+
export type SecuritySchemeV1 = {
|
|
152
|
+
httpAuthSecurityScheme: {
|
|
153
|
+
scheme: string;
|
|
154
|
+
bearerFormat?: string;
|
|
155
|
+
description?: string;
|
|
156
|
+
};
|
|
157
|
+
} | {
|
|
158
|
+
apiKeySecurityScheme: {
|
|
159
|
+
name: string;
|
|
160
|
+
location: string;
|
|
161
|
+
description?: string;
|
|
162
|
+
};
|
|
163
|
+
} | {
|
|
164
|
+
mtlsSecurityScheme: {
|
|
165
|
+
description?: string;
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
export interface JsonRpcRequest {
|
|
169
|
+
jsonrpc?: string;
|
|
170
|
+
id?: string | number | null;
|
|
171
|
+
method?: string;
|
|
172
|
+
params?: unknown;
|
|
173
|
+
}
|
|
174
|
+
export type JsonRpcResponse = {
|
|
175
|
+
jsonrpc: '2.0';
|
|
176
|
+
id: string | number | null;
|
|
177
|
+
result: unknown;
|
|
178
|
+
} | {
|
|
179
|
+
jsonrpc: '2.0';
|
|
180
|
+
id: string | number | null;
|
|
181
|
+
error: {
|
|
182
|
+
code: number;
|
|
183
|
+
message: string;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/standard/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// THE A2A 1.0 WIRE, AS PROTO-JSON — spec 372 S1.
|
|
2
|
+
//
|
|
3
|
+
// These are the shapes the official TCK validates responses against (its bundled `a2a.json`, generated
|
|
4
|
+
// from `a2a.proto` at v1.0.0): lowerCamelCase field names, enum values as their proto strings
|
|
5
|
+
// (`TASK_STATE_COMPLETED`, `ROLE_USER`), timestamps as RFC 3339 strings. Since the fold (spec 372 S4) they
|
|
6
|
+
// are the ONLY wire shapes this package speaks.
|
|
7
|
+
//
|
|
8
|
+
// They are still not the runtime's own task types (`../types.ts`): that record carries vault refs, a grant
|
|
9
|
+
// hash and a principal, and it is the system of record. What travels is a PROJECTION of it
|
|
10
|
+
// (`delegated/delegatedTaskAsV1`) — refs and hashes, never bodies.
|
|
11
|
+
export const TERMINAL_STATES = new Set([
|
|
12
|
+
'TASK_STATE_COMPLETED', 'TASK_STATE_FAILED', 'TASK_STATE_CANCELED', 'TASK_STATE_REJECTED',
|
|
13
|
+
]);
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/standard/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,uGAAuG;AACvG,8FAA8F;AAC9F,2GAA2G;AAC3G,gDAAgD;AAChD,EAAE;AACF,2GAA2G;AAC3G,2FAA2F;AAC3F,mEAAmE;AAanE,MAAM,CAAC,MAAM,eAAe,GAA6B,IAAI,GAAG,CAAc;IAC5E,sBAAsB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB;CAC1F,CAAC,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Address } from '@agenticprimitives/types';
|
|
2
|
+
export declare const AP_SUBJECT_ASK_EXTENSION_URI = "https://agenticprimitives.org/a2a/subject-ask/v1";
|
|
3
|
+
/** The credential the asker holds, which the receiver verifies FOR ITSELF. A Home session names the person.
|
|
4
|
+
* Spec 397 — `app-delegation`: the person asked their own agent THROUGH A CLIENT they authorized, and no session
|
|
5
|
+
* exists; what travels is the ORIGINAL admission evidence verbatim — the `A2A-Session` authorization (the
|
|
6
|
+
* per-request assertion signed by the app's key, session-wrapped with the person's ask-as-me wire) and the exact
|
|
7
|
+
* body it bound. The receiver re-verifies the wire against the person on chain, the assertion's signature, its
|
|
8
|
+
* freshness and audience, that the body it binds was addressed to the asker's own agent, and spends the
|
|
9
|
+
* assertion once on ITS OWN object — one routed hop per receiver, never a replay to the same one. */
|
|
10
|
+
export type SubjectAskCredentialV1 = {
|
|
11
|
+
kind: 'home-session';
|
|
12
|
+
token: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'app-delegation';
|
|
15
|
+
authorization: string;
|
|
16
|
+
body: string;
|
|
17
|
+
};
|
|
18
|
+
/** The request A sends B. */
|
|
19
|
+
export interface SubjectAskV1 {
|
|
20
|
+
extension: typeof AP_SUBJECT_ASK_EXTENSION_URI;
|
|
21
|
+
version: 1;
|
|
22
|
+
/** The delegated request: ONE capability step with the person's own words as arguments (the receiver
|
|
23
|
+
* resolves them in the asker's tier as it would any ask), and the goal for the record. */
|
|
24
|
+
request: {
|
|
25
|
+
capability: string;
|
|
26
|
+
args: Record<string, unknown>;
|
|
27
|
+
goal: string;
|
|
28
|
+
};
|
|
29
|
+
/** Who is asking, and the credential they hold that the receiver verifies for itself. A Home session names
|
|
30
|
+
* the person; a stewardship wire, when carried, is presented — never asserted. */
|
|
31
|
+
asker: {
|
|
32
|
+
agent: Address;
|
|
33
|
+
credential: SubjectAskCredentialV1;
|
|
34
|
+
presented?: unknown[];
|
|
35
|
+
};
|
|
36
|
+
/** The causal correlation: A's stable operation identity for this step, and the run it belongs to. */
|
|
37
|
+
correlation: {
|
|
38
|
+
operationId: string;
|
|
39
|
+
runRef: string;
|
|
40
|
+
stepRef: string;
|
|
41
|
+
intentDigest: string;
|
|
42
|
+
};
|
|
43
|
+
/** Spec 397 — the AGENT THAT ROUTED this step when it is not the asker's own (a person asking AT an organization,
|
|
44
|
+
* whose agent routes one step onward). A forwarded app credential is bound to the ask at THAT agent; the receiver
|
|
45
|
+
* accepts a bound body addressed to the asker's own agent or to this one, and nothing else. */
|
|
46
|
+
route?: {
|
|
47
|
+
agent: Address;
|
|
48
|
+
};
|
|
49
|
+
/** Spec 374 W2 — A CONTINUATION of the receiver's own parked run: the asker (a steward there) now
|
|
50
|
+
* presents the mandate the receiver asked for, or supplies the answer it prompted for. The receiver
|
|
51
|
+
* resumes THAT run under its own gates; nothing here is trusted beyond naming which run. */
|
|
52
|
+
continue?: {
|
|
53
|
+
runRef: string;
|
|
54
|
+
presented?: unknown[];
|
|
55
|
+
supplied?: unknown[];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The answer B returns A. */
|
|
59
|
+
export interface SubjectAnswerV1 {
|
|
60
|
+
extension: typeof AP_SUBJECT_ASK_EXTENSION_URI;
|
|
61
|
+
version: 1;
|
|
62
|
+
/** The receiver's principal — the enduring agent, not its service endpoint. */
|
|
63
|
+
agent: Address;
|
|
64
|
+
/** Which request this answers (R), so A's next receipt can name S. */
|
|
65
|
+
inResponseTo: {
|
|
66
|
+
operationId: string;
|
|
67
|
+
runRef: string;
|
|
68
|
+
stepRef: string;
|
|
69
|
+
};
|
|
70
|
+
/** What happened on B's side, in B's words. A refusal is an answer; a need is a question B raised. */
|
|
71
|
+
outcome: 'answer' | 'refused' | 'needs' | 'error';
|
|
72
|
+
result?: unknown;
|
|
73
|
+
said?: string;
|
|
74
|
+
/** B's own run and the receipts of the steps it ran — evidence, never authority. */
|
|
75
|
+
run: {
|
|
76
|
+
runRef: string;
|
|
77
|
+
receipts: Array<{
|
|
78
|
+
stepRef: string;
|
|
79
|
+
capability?: string;
|
|
80
|
+
status: string;
|
|
81
|
+
binding?: unknown;
|
|
82
|
+
}>;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Structural validation of a request. Authority is NOT judged here — the receiver verifies the credential
|
|
86
|
+
* and derives standing itself; this only refuses a request that is not this profile. */
|
|
87
|
+
export declare function validateSubjectAsk(x: unknown): {
|
|
88
|
+
ok: true;
|
|
89
|
+
ask: SubjectAskV1;
|
|
90
|
+
} | {
|
|
91
|
+
ok: false;
|
|
92
|
+
errors: string[];
|
|
93
|
+
};
|
|
94
|
+
export declare function subjectAsk(input: Omit<SubjectAskV1, 'extension' | 'version'>): SubjectAskV1;
|
|
95
|
+
export declare function subjectAnswer(input: Omit<SubjectAnswerV1, 'extension' | 'version'>): SubjectAnswerV1;
|
|
96
|
+
//# sourceMappingURL=subject-ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-ask.d.ts","sourceRoot":"","sources":["../src/subject-ask.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,eAAO,MAAM,4BAA4B,qDAAqD,CAAC;AAE/F;;;;;;sGAMsG;AACtG,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,4BAA4B,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC;IACX;+FAC2F;IAC3F,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E;uFACmF;IACnF,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,sBAAsB,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IACrF,sGAAsG;IACtG,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5F;;oGAEgG;IAChG,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3B;;iGAE6F;IAC7F,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;CAC5E;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,4BAA4B,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC;IACX,+EAA+E;IAC/E,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,YAAY,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,sGAAsG;IACtG,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CACvH;AAID;yFACyF;AACzF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAqBhH;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,YAAY,CAE3F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,eAAe,CAEpG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const AP_SUBJECT_ASK_EXTENSION_URI = 'https://agenticprimitives.org/a2a/subject-ask/v1';
|
|
2
|
+
const isAddr = (v) => typeof v === 'string' && /^0x[0-9a-fA-F]{40}$/.test(v);
|
|
3
|
+
/** Structural validation of a request. Authority is NOT judged here — the receiver verifies the credential
|
|
4
|
+
* and derives standing itself; this only refuses a request that is not this profile. */
|
|
5
|
+
export function validateSubjectAsk(x) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
const a = x;
|
|
8
|
+
if (!a || typeof a !== 'object')
|
|
9
|
+
return { ok: false, errors: ['not an object'] };
|
|
10
|
+
if (a.extension !== AP_SUBJECT_ASK_EXTENSION_URI)
|
|
11
|
+
errors.push(`extension: expected ${AP_SUBJECT_ASK_EXTENSION_URI}`);
|
|
12
|
+
if (a.version !== 1)
|
|
13
|
+
errors.push('version: expected 1');
|
|
14
|
+
if (!a.request || typeof a.request.capability !== 'string' || !a.request.capability)
|
|
15
|
+
errors.push('request.capability: required');
|
|
16
|
+
if (!a.request || !a.request.args || typeof a.request.args !== 'object' || Array.isArray(a.request.args))
|
|
17
|
+
errors.push('request.args: an object');
|
|
18
|
+
if (!a.request || typeof a.request.goal !== 'string')
|
|
19
|
+
errors.push('request.goal: required');
|
|
20
|
+
if (!a.asker || !isAddr(a.asker.agent))
|
|
21
|
+
errors.push('asker.agent: an address');
|
|
22
|
+
const cred = a.asker?.credential;
|
|
23
|
+
const credOk = !!cred && ((cred.kind === 'home-session' && typeof cred.token === 'string' && !!cred.token)
|
|
24
|
+
|| (cred.kind === 'app-delegation' && typeof cred.authorization === 'string' && /^A2A-Session\s/i.test(cred.authorization) && typeof cred.body === 'string'));
|
|
25
|
+
if (!credOk)
|
|
26
|
+
errors.push('asker.credential: { kind: home-session, token } or { kind: app-delegation, authorization, body }');
|
|
27
|
+
if (a.asker?.presented !== undefined && !Array.isArray(a.asker.presented))
|
|
28
|
+
errors.push('asker.presented: a list of wires when given');
|
|
29
|
+
if (a.route !== undefined && (!a.route || typeof a.route !== 'object' || !isAddr(a.route.agent)))
|
|
30
|
+
errors.push('route: { agent } — an address, when given');
|
|
31
|
+
const k = a.continue;
|
|
32
|
+
if (k !== undefined && (!k || typeof k !== 'object' || typeof k.runRef !== 'string' || !k.runRef || (k.presented !== undefined && !Array.isArray(k.presented)) || (k.supplied !== undefined && !Array.isArray(k.supplied))))
|
|
33
|
+
errors.push('continue: { runRef, presented?[], supplied?[] }');
|
|
34
|
+
const c = a.correlation;
|
|
35
|
+
if (!c || !['operationId', 'runRef', 'stepRef', 'intentDigest'].every((k) => typeof c[k] === 'string' && c[k]))
|
|
36
|
+
errors.push('correlation: { operationId, runRef, stepRef, intentDigest } required');
|
|
37
|
+
return errors.length ? { ok: false, errors } : { ok: true, ask: a };
|
|
38
|
+
}
|
|
39
|
+
export function subjectAsk(input) {
|
|
40
|
+
return { extension: AP_SUBJECT_ASK_EXTENSION_URI, version: 1, ...input };
|
|
41
|
+
}
|
|
42
|
+
export function subjectAnswer(input) {
|
|
43
|
+
return { extension: AP_SUBJECT_ASK_EXTENSION_URI, version: 1, ...input };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=subject-ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-ask.js","sourceRoot":"","sources":["../src/subject-ask.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,4BAA4B,GAAG,kDAAkD,CAAC;AAmD/F,MAAM,MAAM,GAAG,CAAC,CAAU,EAAgB,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpG;yFACyF;AACzF,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAiC,CAAC;IAC5C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;IACjF,IAAI,CAAC,CAAC,SAAS,KAAK,4BAA4B;QAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,4BAA4B,EAAE,CAAC,CAAC;IACrH,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACjI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACjJ,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5F,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAyD,CAAC;IAChF,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,OAAQ,IAA4B,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAE,IAA2B,CAAC,KAAK,CAAC;WACtJ,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAQ,IAAoC,CAAC,aAAa,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAE,IAAkC,CAAC,aAAa,CAAC,IAAI,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;IACxP,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAC;IAC7H,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACtI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,KAA6B,CAAC,KAAK,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACpL,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACrB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC5R,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;IACxB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAQ,CAA6B,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAK,CAA6B,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAC9P,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAiB,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAkD;IAC3E,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAqD;IACjF,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type SubjectAskV1, type SubjectAnswerV1 } from './subject-ask.js';
|
|
2
|
+
import { type HandoffV1 } from './handoff.js';
|
|
3
|
+
import type { AgentCardV1, MessageV1, TaskV1 } from './standard/types.js';
|
|
4
|
+
/** The A2A 1.0 JSON-RPC endpoint a card publishes, or null when it publishes none. */
|
|
5
|
+
export declare function a2aEndpointOf(card: (Pick<AgentCardV1, 'supportedInterfaces'> & {
|
|
6
|
+
protocolVersion?: string;
|
|
7
|
+
}) | null | undefined): string | null;
|
|
8
|
+
/** The message that carries a subject-ask over the wire: the goal as text, the profile as metadata. */
|
|
9
|
+
export declare function subjectAskMessage(profile: SubjectAskV1): MessageV1;
|
|
10
|
+
/** The subject-ask a received message carries, validated; null when it carries none. */
|
|
11
|
+
export declare function subjectAskOf(message: Pick<MessageV1, 'metadata'>): {
|
|
12
|
+
ask: SubjectAskV1;
|
|
13
|
+
} | {
|
|
14
|
+
errors: string[];
|
|
15
|
+
} | null;
|
|
16
|
+
export declare const SUBJECT_ANSWER_ARTIFACT = "subject-answer";
|
|
17
|
+
/**
|
|
18
|
+
* Appendix M8 — THE RECEIVER'S RUN, NAMED BY THE SENDER. A routed step's run at the subject's agent is
|
|
19
|
+
* addressable before it answers, so the sender can read its progress while it runs and its record can
|
|
20
|
+
* cite it by reference. Derived from the correlation the sender minted; the receiver adopts it for a
|
|
21
|
+
* fresh ask (a resume names the run it continues instead).
|
|
22
|
+
*/
|
|
23
|
+
export declare function routedRunRefFor(correlation: {
|
|
24
|
+
runRef: string;
|
|
25
|
+
stepRef: string;
|
|
26
|
+
}): string;
|
|
27
|
+
/** The receiver's `/harness/ask` envelope, as the task's `subject-answer` artifact carries it. */
|
|
28
|
+
export declare function subjectEnvelopeOf(task: Pick<TaskV1, 'artifacts'> | null | undefined): Record<string, unknown> | null;
|
|
29
|
+
export interface SubjectHopInput {
|
|
30
|
+
/** Spec 390 W2 — W3C Trace Context for the hop: the sender's trace, the routed step as the parent span. */
|
|
31
|
+
traceparent?: string;
|
|
32
|
+
tracestate?: string;
|
|
33
|
+
/** Where the subject's card is served (`https://<host>/.well-known/agent-card.json`). */
|
|
34
|
+
cardUrl: string;
|
|
35
|
+
profile: SubjectAskV1;
|
|
36
|
+
/** `atl:cardDigest` from the subject's name records — the sha256 of the released card's bytes. When the
|
|
37
|
+
* name pins one, a served card that differs is refused: the pin is the name's word about its card. */
|
|
38
|
+
pinnedDigest?: string;
|
|
39
|
+
/** The asker's Home session — the `Authorization` bearer, which is also the credential the profile names. */
|
|
40
|
+
/** The asker's Home session as the bearer; absent when the profile carries the forwarded app credential (spec 397 W4). */
|
|
41
|
+
session?: string;
|
|
42
|
+
fetch: (input: string, init: RequestInit) => Promise<Response>;
|
|
43
|
+
}
|
|
44
|
+
export type SubjectHopOutcome = {
|
|
45
|
+
ok: true;
|
|
46
|
+
endpoint: string;
|
|
47
|
+
task: TaskV1;
|
|
48
|
+
envelope: Record<string, unknown>;
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
endpoint?: string;
|
|
52
|
+
refused: string;
|
|
53
|
+
status?: number;
|
|
54
|
+
task?: TaskV1;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The hop: fetch the card, take its 1.0 endpoint, send ONE message, read the artifact. A task that ended
|
|
58
|
+
* without the artifact is relayed in the receiver's status words (a rejection, a need), never retried.
|
|
59
|
+
*/
|
|
60
|
+
export declare function sendSubjectAskOverWire(input: SubjectHopInput): Promise<SubjectHopOutcome>;
|
|
61
|
+
/** The message that delivers a finished routed act's outcome to the creditor's agent. */
|
|
62
|
+
export declare function subjectAnswerMessage(answer: SubjectAnswerV1): MessageV1;
|
|
63
|
+
/** The delivered answer a received message carries, structurally checked; null when it carries none. */
|
|
64
|
+
export declare function subjectAnswerOf(message: Pick<MessageV1, 'metadata'>): {
|
|
65
|
+
answer: SubjectAnswerV1;
|
|
66
|
+
} | {
|
|
67
|
+
errors: string[];
|
|
68
|
+
} | null;
|
|
69
|
+
export declare function handoffMessage(h: HandoffV1): MessageV1;
|
|
70
|
+
export declare function handoffOf(message: Pick<MessageV1, 'metadata'>): {
|
|
71
|
+
handoff: HandoffV1;
|
|
72
|
+
} | {
|
|
73
|
+
errors: string[];
|
|
74
|
+
} | null;
|
|
75
|
+
//# sourceMappingURL=subject-hop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-hop.d.ts","sourceRoot":"","sources":["../src/subject-hop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// A ROUTED ASK ACROSS DEPLOYMENTS — spec 366 R4 / 374 §4 / 376. Promoted from the runtime app in spec 399 W0
|
|
2
|
+
// (§4): the HOP is protocol, every A2A service that routes a step to another agent makes it the same way.
|
|
3
|
+
//
|
|
4
|
+
// Inside one deployment a routed step (spec 366 R1) is made in-process. To an agent served ELSEWHERE the hop
|
|
5
|
+
// is a network call, and it rides the one wire there is (spec 372 S4): an A2A 1.0 `SendMessage` whose
|
|
6
|
+
// `message.metadata` carries the SUBJECT-ASK PROFILE (`SubjectAskV1`), and whose reply comes back as the
|
|
7
|
+
// task's `subject-answer` artifact — the receiver's own ask envelope, verbatim.
|
|
8
|
+
//
|
|
9
|
+
// Resolved through the card, not assumed: the caller says where the card is served, and the CARD says where
|
|
10
|
+
// the agent takes A2A 1.0 requests. A card that publishes no such interface is an agent that cannot be asked
|
|
11
|
+
// this way, and the sender says so — it never reads the subject's records locally instead (R3), and it never
|
|
12
|
+
// guesses a path (ADR-0013).
|
|
13
|
+
//
|
|
14
|
+
// Everything here is pure: the caller supplies `fetch`; nothing reads a store or a chain.
|
|
15
|
+
import { AP_SUBJECT_ASK_EXTENSION_URI, validateSubjectAsk } from './subject-ask.js';
|
|
16
|
+
import { AP_HANDOFF_EXTENSION_URI, validateHandoff } from './handoff.js';
|
|
17
|
+
/** The A2A 1.0 JSON-RPC endpoint a card publishes, or null when it publishes none. */
|
|
18
|
+
export function a2aEndpointOf(card) {
|
|
19
|
+
// A RELEASED card (the Studio's, signed) states the protocol version ONCE at the top; the live card
|
|
20
|
+
// states it per interface. Either says 1.x or the interface is not one this hop can use.
|
|
21
|
+
const top = /^1\./.test(String(card?.protocolVersion ?? ''));
|
|
22
|
+
const hit = (card?.supportedInterfaces ?? []).find((i) => i.protocolBinding === 'JSONRPC' && (/^1\./.test(String(i.protocolVersion ?? '')) || (i.protocolVersion === undefined && top)) && typeof i.url === 'string' && /^https:\/\//.test(i.url));
|
|
23
|
+
return hit?.url ?? null;
|
|
24
|
+
}
|
|
25
|
+
const hex32 = () => `0x${[...crypto.getRandomValues(new Uint8Array(32))].map((b) => b.toString(16).padStart(2, '0')).join('')}`;
|
|
26
|
+
/** The message that carries a subject-ask over the wire: the goal as text, the profile as metadata. */
|
|
27
|
+
export function subjectAskMessage(profile) {
|
|
28
|
+
return {
|
|
29
|
+
messageId: hex32(),
|
|
30
|
+
role: 'ROLE_USER',
|
|
31
|
+
parts: [{ text: profile.request.goal }],
|
|
32
|
+
extensions: [AP_SUBJECT_ASK_EXTENSION_URI],
|
|
33
|
+
metadata: { [AP_SUBJECT_ASK_EXTENSION_URI]: profile },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** The subject-ask a received message carries, validated; null when it carries none. */
|
|
37
|
+
export function subjectAskOf(message) {
|
|
38
|
+
const raw = message.metadata?.[AP_SUBJECT_ASK_EXTENSION_URI];
|
|
39
|
+
if (raw === undefined)
|
|
40
|
+
return null;
|
|
41
|
+
const v = validateSubjectAsk(raw);
|
|
42
|
+
return v.ok ? { ask: v.ask } : { errors: v.errors };
|
|
43
|
+
}
|
|
44
|
+
export const SUBJECT_ANSWER_ARTIFACT = 'subject-answer';
|
|
45
|
+
/**
|
|
46
|
+
* Appendix M8 — THE RECEIVER'S RUN, NAMED BY THE SENDER. A routed step's run at the subject's agent is
|
|
47
|
+
* addressable before it answers, so the sender can read its progress while it runs and its record can
|
|
48
|
+
* cite it by reference. Derived from the correlation the sender minted; the receiver adopts it for a
|
|
49
|
+
* fresh ask (a resume names the run it continues instead).
|
|
50
|
+
*/
|
|
51
|
+
export function routedRunRefFor(correlation) {
|
|
52
|
+
return `routed-${correlation.runRef}-${correlation.stepRef}`.replace(/[^A-Za-z0-9._:-]/g, '_');
|
|
53
|
+
}
|
|
54
|
+
/** The receiver's `/harness/ask` envelope, as the task's `subject-answer` artifact carries it. */
|
|
55
|
+
export function subjectEnvelopeOf(task) {
|
|
56
|
+
const art = (task?.artifacts ?? []).find((a) => a.name === SUBJECT_ANSWER_ARTIFACT);
|
|
57
|
+
const part = art?.parts.find((p) => p.data && typeof p.data === 'object' && !Array.isArray(p.data));
|
|
58
|
+
return part ? part.data : null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The hop: fetch the card, take its 1.0 endpoint, send ONE message, read the artifact. A task that ended
|
|
62
|
+
* without the artifact is relayed in the receiver's status words (a rejection, a need), never retried.
|
|
63
|
+
*/
|
|
64
|
+
export async function sendSubjectAskOverWire(input) {
|
|
65
|
+
let card = null;
|
|
66
|
+
try {
|
|
67
|
+
const res = await input.fetch(input.cardUrl, { method: 'GET', headers: { accept: 'application/json' } });
|
|
68
|
+
if (!res.ok)
|
|
69
|
+
return { ok: false, refused: `its card at ${input.cardUrl} answered ${res.status}`, status: res.status };
|
|
70
|
+
const text = await res.text();
|
|
71
|
+
if (input.pinnedDigest) {
|
|
72
|
+
const served = `0x${[...new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text)))].map((b) => b.toString(16).padStart(2, '0')).join('')}`;
|
|
73
|
+
if (served !== input.pinnedDigest.toLowerCase())
|
|
74
|
+
return { ok: false, refused: `the card served at ${input.cardUrl} is not the one its name pins (atl:cardDigest ${input.pinnedDigest.slice(0, 12)}…, served ${served.slice(0, 12)}…)` };
|
|
75
|
+
}
|
|
76
|
+
card = JSON.parse(text);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
return { ok: false, refused: `its card at ${input.cardUrl} could not be read: ${e instanceof Error ? e.message : String(e)}` };
|
|
80
|
+
}
|
|
81
|
+
const endpoint = a2aEndpointOf(card);
|
|
82
|
+
if (!endpoint)
|
|
83
|
+
return { ok: false, refused: 'its card publishes no A2A 1.0 endpoint this agent can ask' };
|
|
84
|
+
const rpc = { jsonrpc: '2.0', id: 1, method: 'SendMessage', params: { message: subjectAskMessage(input.profile) } };
|
|
85
|
+
let res;
|
|
86
|
+
try {
|
|
87
|
+
res = await input.fetch(endpoint, {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
headers: { 'content-type': 'application/json', accept: 'application/json', 'a2a-version': '1.0', ...(input.session ? { authorization: `Bearer ${input.session}` } : {}), ...(input.traceparent ? { traceparent: input.traceparent } : {}), ...(input.tracestate ? { tracestate: input.tracestate } : {}) },
|
|
90
|
+
body: JSON.stringify(rpc),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
return { ok: false, endpoint, refused: `could not reach ${endpoint}: ${e instanceof Error ? e.message : String(e)}` };
|
|
95
|
+
}
|
|
96
|
+
const body = (await res.json().catch(() => null));
|
|
97
|
+
if (!body)
|
|
98
|
+
return { ok: false, endpoint, refused: `${endpoint} answered ${res.status} with no JSON-RPC body`, status: res.status };
|
|
99
|
+
if (body.error)
|
|
100
|
+
return { ok: false, endpoint, refused: `${endpoint} answered ${body.error.code}: ${body.error.message}`, status: res.status };
|
|
101
|
+
const task = body.result?.task;
|
|
102
|
+
if (!task)
|
|
103
|
+
return { ok: false, endpoint, refused: `${endpoint} answered with a message, not a task`, status: res.status };
|
|
104
|
+
const envelope = subjectEnvelopeOf(task);
|
|
105
|
+
if (envelope)
|
|
106
|
+
return { ok: true, endpoint, task, envelope };
|
|
107
|
+
const said = (task.status?.message?.parts ?? []).map((p) => (typeof p.text === 'string' ? p.text : '')).filter(Boolean).join(' ');
|
|
108
|
+
return { ok: false, endpoint, task, refused: `${task.status?.state ?? 'unknown state'}${said ? `: ${said}` : ''}`, status: res.status };
|
|
109
|
+
}
|
|
110
|
+
// ── The answer, delivered (spec 374 §4) ──────────────────────────────────────────────────────────────
|
|
111
|
+
//
|
|
112
|
+
// When a routed ACT finishes at the subject's agent — its steward signed, or refused — the outcome is
|
|
113
|
+
// DELIVERED to the creditor's agent as a message under the same extension URI: a `SubjectAnswerV1` whose
|
|
114
|
+
// `inResponseTo` names the creditor's own correlation. The two payloads share a URI and are told apart
|
|
115
|
+
// by shape (an ask has `request`; an answer has `inResponseTo`), so one metadata key carries both halves
|
|
116
|
+
// of one conversation.
|
|
117
|
+
const isAddr = (v) => typeof v === 'string' && /^0x[0-9a-fA-F]{40}$/.test(v);
|
|
118
|
+
/** The message that delivers a finished routed act's outcome to the creditor's agent. */
|
|
119
|
+
export function subjectAnswerMessage(answer) {
|
|
120
|
+
return {
|
|
121
|
+
messageId: hex32(),
|
|
122
|
+
role: 'ROLE_AGENT',
|
|
123
|
+
parts: [{ text: answer.said ?? (answer.outcome === 'answer' ? 'Done.' : answer.outcome) }],
|
|
124
|
+
extensions: [AP_SUBJECT_ASK_EXTENSION_URI],
|
|
125
|
+
metadata: { [AP_SUBJECT_ASK_EXTENSION_URI]: answer },
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** The delivered answer a received message carries, structurally checked; null when it carries none. */
|
|
129
|
+
export function subjectAnswerOf(message) {
|
|
130
|
+
const raw = message.metadata?.[AP_SUBJECT_ASK_EXTENSION_URI];
|
|
131
|
+
if (raw === undefined || raw === null || typeof raw !== 'object' || !('inResponseTo' in raw))
|
|
132
|
+
return null;
|
|
133
|
+
const errors = [];
|
|
134
|
+
if (raw.extension !== AP_SUBJECT_ASK_EXTENSION_URI)
|
|
135
|
+
errors.push(`extension: expected ${AP_SUBJECT_ASK_EXTENSION_URI}`);
|
|
136
|
+
if (raw.version !== 1)
|
|
137
|
+
errors.push('version: expected 1');
|
|
138
|
+
if (!isAddr(raw.agent))
|
|
139
|
+
errors.push('agent: an address');
|
|
140
|
+
const r = raw.inResponseTo;
|
|
141
|
+
if (!r || !['operationId', 'runRef', 'stepRef'].every((k) => typeof r[k] === 'string' && r[k]))
|
|
142
|
+
errors.push('inResponseTo: { operationId, runRef, stepRef }');
|
|
143
|
+
if (!['answer', 'refused', 'needs', 'error'].includes(String(raw.outcome)))
|
|
144
|
+
errors.push('outcome: answer | refused | needs | error');
|
|
145
|
+
if (!raw.run || typeof raw.run.runRef !== 'string')
|
|
146
|
+
errors.push('run.runRef: required');
|
|
147
|
+
return errors.length ? { errors } : { answer: raw };
|
|
148
|
+
}
|
|
149
|
+
// ── The hand-off (spec 376) ───────────────────────────────────────────────────────────────────────────
|
|
150
|
+
//
|
|
151
|
+
// One step, run elsewhere under a child mandate. Rides the one wire as a `SendMessage` whose metadata
|
|
152
|
+
// carries the hand-off profile; the specialist answers with the same `subject-answer` artifact a routed
|
|
153
|
+
// ask does, so the parent reads it with the same reader.
|
|
154
|
+
export function handoffMessage(h) {
|
|
155
|
+
return {
|
|
156
|
+
messageId: hex32(),
|
|
157
|
+
role: 'ROLE_USER',
|
|
158
|
+
parts: [{ text: h.intent.goal }],
|
|
159
|
+
extensions: [AP_HANDOFF_EXTENSION_URI],
|
|
160
|
+
metadata: { [AP_HANDOFF_EXTENSION_URI]: h },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function handoffOf(message) {
|
|
164
|
+
const raw = message.metadata?.[AP_HANDOFF_EXTENSION_URI];
|
|
165
|
+
if (raw === undefined)
|
|
166
|
+
return null;
|
|
167
|
+
const v = validateHandoff(raw);
|
|
168
|
+
return v.ok ? { handoff: v.handoff } : { errors: v.errors };
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=subject-hop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-hop.js","sourceRoot":"","sources":["../src/subject-hop.ts"],"names":[],"mappings":"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"}
|