dsh-a2a-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/README.zh-CN.md +316 -0
  4. package/cordis.patch.yml +30 -0
  5. package/lib/config.d.ts +116 -0
  6. package/lib/config.d.ts.map +1 -0
  7. package/lib/config.js +110 -0
  8. package/lib/config.js.map +1 -0
  9. package/lib/contexts.d.ts +84 -0
  10. package/lib/contexts.d.ts.map +1 -0
  11. package/lib/contexts.js +103 -0
  12. package/lib/contexts.js.map +1 -0
  13. package/lib/index.d.ts +33 -0
  14. package/lib/index.d.ts.map +1 -0
  15. package/lib/index.js +505 -0
  16. package/lib/index.js.map +1 -0
  17. package/lib/projection.d.ts +131 -0
  18. package/lib/projection.d.ts.map +1 -0
  19. package/lib/projection.js +98 -0
  20. package/lib/projection.js.map +1 -0
  21. package/lib/protocol/brand.d.ts +32 -0
  22. package/lib/protocol/brand.d.ts.map +1 -0
  23. package/lib/protocol/brand.js +25 -0
  24. package/lib/protocol/brand.js.map +1 -0
  25. package/lib/protocol/card.d.ts +43 -0
  26. package/lib/protocol/card.d.ts.map +1 -0
  27. package/lib/protocol/card.js +58 -0
  28. package/lib/protocol/card.js.map +1 -0
  29. package/lib/protocol/index.d.ts +23 -0
  30. package/lib/protocol/index.d.ts.map +1 -0
  31. package/lib/protocol/index.js +20 -0
  32. package/lib/protocol/index.js.map +1 -0
  33. package/lib/protocol/jsonrpc.d.ts +93 -0
  34. package/lib/protocol/jsonrpc.d.ts.map +1 -0
  35. package/lib/protocol/jsonrpc.js +81 -0
  36. package/lib/protocol/jsonrpc.js.map +1 -0
  37. package/lib/protocol/normalize.d.ts +72 -0
  38. package/lib/protocol/normalize.d.ts.map +1 -0
  39. package/lib/protocol/normalize.js +278 -0
  40. package/lib/protocol/normalize.js.map +1 -0
  41. package/lib/protocol/sse.d.ts +20 -0
  42. package/lib/protocol/sse.d.ts.map +1 -0
  43. package/lib/protocol/sse.js +23 -0
  44. package/lib/protocol/sse.js.map +1 -0
  45. package/lib/protocol/wire.d.ts +164 -0
  46. package/lib/protocol/wire.d.ts.map +1 -0
  47. package/lib/protocol/wire.js +26 -0
  48. package/lib/protocol/wire.js.map +1 -0
  49. package/lib/router.d.ts +56 -0
  50. package/lib/router.d.ts.map +1 -0
  51. package/lib/router.js +432 -0
  52. package/lib/router.js.map +1 -0
  53. package/lib/security.d.ts +89 -0
  54. package/lib/security.d.ts.map +1 -0
  55. package/lib/security.js +171 -0
  56. package/lib/security.js.map +1 -0
  57. package/lib/tasks.d.ts +75 -0
  58. package/lib/tasks.d.ts.map +1 -0
  59. package/lib/tasks.js +84 -0
  60. package/lib/tasks.js.map +1 -0
  61. package/lib/types.d.ts +71 -0
  62. package/lib/types.d.ts.map +1 -0
  63. package/lib/types.js +17 -0
  64. package/lib/types.js.map +1 -0
  65. package/package.json +94 -0
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Dialect normalization between A2A v0.3.0 and v1.0.
3
+ *
4
+ * Inbound is permissive, outbound is strict: a request in either spelling is
5
+ * parsed into the internal v0.3 shape, and the response is rendered back in the
6
+ * dialect that request declared. Nothing mixes the two spellings in one reply.
7
+ *
8
+ * @module dsh-a2a/protocol/normalize
9
+ */
10
+ import { A2AContextId, A2ATaskId } from "./brand.js";
11
+ /**
12
+ * Every method spelling this server answers.
13
+ *
14
+ * v0.3 is the mainline; the v1.0 PascalCase names are accepted so a peer built
15
+ * against the newer spec interoperates without a shim on its side.
16
+ */
17
+ const METHODS = new Map([
18
+ // — v0.3.0 mainline —
19
+ ['message/send', { operation: 'send', dialect: 'v0.3' }],
20
+ ['message/stream', { operation: 'stream', dialect: 'v0.3' }],
21
+ ['tasks/get', { operation: 'get', dialect: 'v0.3' }],
22
+ ['tasks/cancel', { operation: 'cancel', dialect: 'v0.3' }],
23
+ ['tasks/resubscribe', { operation: 'resubscribe', dialect: 'v0.3' }],
24
+ ['tasks/pushNotificationConfig/set', { operation: 'push_set', dialect: 'v0.3' }],
25
+ ['tasks/pushNotificationConfig/get', { operation: 'push_get', dialect: 'v0.3' }],
26
+ ['tasks/pushNotificationConfig/list', { operation: 'push_list', dialect: 'v0.3' }],
27
+ ['tasks/pushNotificationConfig/delete', { operation: 'push_delete', dialect: 'v0.3' }],
28
+ // — v1.0 —
29
+ ['SendMessage', { operation: 'send', dialect: 'v1.0' }],
30
+ ['SendStreamingMessage', { operation: 'stream', dialect: 'v1.0' }],
31
+ ['GetTask', { operation: 'get', dialect: 'v1.0' }],
32
+ ['CancelTask', { operation: 'cancel', dialect: 'v1.0' }],
33
+ ['SubscribeToTask', { operation: 'resubscribe', dialect: 'v1.0' }],
34
+ ['CreateTaskPushNotificationConfig', { operation: 'push_set', dialect: 'v1.0' }],
35
+ ['GetTaskPushNotificationConfig', { operation: 'push_get', dialect: 'v1.0' }],
36
+ ['ListTaskPushNotificationConfigs', { operation: 'push_list', dialect: 'v1.0' }],
37
+ ['DeleteTaskPushNotificationConfig', { operation: 'push_delete', dialect: 'v1.0' }],
38
+ // — pre-0.3 aliases seen in the wild —
39
+ ['tasks/pushNotification/set', { operation: 'push_set', dialect: 'v0.3' }],
40
+ ]);
41
+ /**
42
+ * Resolve a method name to its operation and implied dialect.
43
+ * @param method - the raw `method` string from the request.
44
+ * @returns the entry, or undefined for an unknown method.
45
+ */
46
+ export function resolveMethod(method) {
47
+ return METHODS.get(method);
48
+ }
49
+ /** v1.0 spells task states in SCREAMING_SNAKE_CASE. */
50
+ const STATE_TO_V1 = {
51
+ 'submitted': 'TASK_STATE_SUBMITTED',
52
+ 'working': 'TASK_STATE_WORKING',
53
+ 'input-required': 'TASK_STATE_INPUT_REQUIRED',
54
+ 'auth-required': 'TASK_STATE_AUTH_REQUIRED',
55
+ 'completed': 'TASK_STATE_COMPLETED',
56
+ 'canceled': 'TASK_STATE_CANCELED',
57
+ 'failed': 'TASK_STATE_FAILED',
58
+ 'rejected': 'TASK_STATE_REJECTED',
59
+ };
60
+ const ROLE_TO_V1 = {
61
+ user: 'ROLE_USER',
62
+ agent: 'ROLE_AGENT',
63
+ };
64
+ /**
65
+ * Read a `Part` written in any of the three known spellings.
66
+ *
67
+ * v0.3 discriminates on `kind`, v1.0 on member presence, and pre-0.3 peers used
68
+ * `type`. Unknown shapes yield undefined rather than throwing, so one odd part
69
+ * cannot fail a request whose other parts are usable.
70
+ * @param raw - one element of a `parts` array.
71
+ * @returns the normalized part, or undefined when unrecognizable.
72
+ */
73
+ export function parsePart(raw) {
74
+ if (raw === null || typeof raw !== 'object')
75
+ return undefined;
76
+ const part = raw;
77
+ const tag = typeof part['kind'] === 'string'
78
+ ? part['kind']
79
+ : typeof part['type'] === 'string' ? part['type'] : undefined;
80
+ if (tag === 'text') {
81
+ return typeof part['text'] === 'string' ? { kind: 'text', text: part['text'] } : undefined;
82
+ }
83
+ if (tag === 'data')
84
+ return { kind: 'data', data: part['data'] };
85
+ if (tag === 'file')
86
+ return parseFilePart(part);
87
+ if (tag !== undefined)
88
+ return undefined;
89
+ // Untagged: v1.0 discriminates a part by which member is present. Order
90
+ // matters only in that each probe must be specific enough not to claim
91
+ // another variant's shape.
92
+ if (typeof part['text'] === 'string')
93
+ return { kind: 'text', text: part['text'] };
94
+ const file = parseFilePart(part);
95
+ if (file !== undefined)
96
+ return file;
97
+ if ('data' in part)
98
+ return { kind: 'data', data: part['data'] };
99
+ return undefined;
100
+ }
101
+ /**
102
+ * Read a file part in either the v0.3 nested or the v1.0 flattened spelling.
103
+ * @param part - the raw part object.
104
+ * @returns the normalized file part, or undefined when no file member is present.
105
+ */
106
+ function parseFilePart(part) {
107
+ const nested = part['file'];
108
+ if (nested !== null && typeof nested === 'object') {
109
+ return { kind: 'file', file: nested };
110
+ }
111
+ const uri = part['url'] ?? part['uri'];
112
+ const bytes = part['raw'] ?? part['bytes'];
113
+ if (typeof uri !== 'string' && typeof bytes !== 'string')
114
+ return undefined;
115
+ return {
116
+ kind: 'file',
117
+ file: {
118
+ ...typeof uri === 'string' ? { uri } : {},
119
+ ...typeof bytes === 'string' ? { bytes } : {},
120
+ ...typeof part['filename'] === 'string' ? { name: part['filename'] } : {},
121
+ ...typeof part['name'] === 'string' ? { name: part['name'] } : {},
122
+ ...typeof part['mediaType'] === 'string' ? { mimeType: part['mediaType'] } : {},
123
+ ...typeof part['mimeType'] === 'string' ? { mimeType: part['mimeType'] } : {},
124
+ },
125
+ };
126
+ }
127
+ /**
128
+ * Render every part as text the model can read.
129
+ *
130
+ * File and data parts become bracketed references rather than being dropped, so
131
+ * the agent knows something was attached and can ask about it. This is the same
132
+ * flattening `dsh-acp` applies to baseline resource links.
133
+ * @param parts - normalized parts, in order.
134
+ * @returns the joined text, empty when nothing rendered.
135
+ */
136
+ export function partsToText(parts) {
137
+ const chunks = [];
138
+ for (const part of parts) {
139
+ if (part.kind === 'text') {
140
+ if (part.text.length > 0)
141
+ chunks.push(part.text);
142
+ }
143
+ else if (part.kind === 'file') {
144
+ const name = part.file.name ?? part.file.uri ?? 'unnamed';
145
+ const type = part.file.mimeType === undefined ? '' : ` type=${part.file.mimeType}`;
146
+ chunks.push(`[file name=${name}${type}]`);
147
+ }
148
+ else {
149
+ chunks.push(`[data ${JSON.stringify(part.data)}]`);
150
+ }
151
+ }
152
+ return chunks.join('\n');
153
+ }
154
+ /**
155
+ * Parse `message/send` and `message/stream` parameters from either dialect.
156
+ * @param raw - the request's `params` value.
157
+ * @returns the normalized parameters, or undefined when the shape is unusable.
158
+ */
159
+ export function parseSendParams(raw) {
160
+ if (raw === null || typeof raw !== 'object')
161
+ return undefined;
162
+ const params = raw;
163
+ const rawMessage = params['message'];
164
+ if (rawMessage === null || typeof rawMessage !== 'object')
165
+ return undefined;
166
+ const message = rawMessage;
167
+ const rawParts = message['parts'];
168
+ const parts = [];
169
+ if (Array.isArray(rawParts)) {
170
+ for (const item of rawParts) {
171
+ const part = parsePart(item);
172
+ if (part !== undefined)
173
+ parts.push(part);
174
+ }
175
+ }
176
+ // v0.3 allows contextId at the top level too; the message wins when both appear.
177
+ const contextId = firstString(message['contextId'], params['contextId']);
178
+ const taskId = firstString(message['taskId'], params['taskId']);
179
+ const normalized = {
180
+ kind: 'message',
181
+ messageId: firstString(message['messageId']) ?? '',
182
+ role: message['role'] === 'ROLE_AGENT' || message['role'] === 'agent' ? 'agent' : 'user',
183
+ parts,
184
+ ...contextId === undefined ? {} : { contextId: A2AContextId(contextId) },
185
+ ...taskId === undefined ? {} : { taskId: A2ATaskId(taskId) },
186
+ };
187
+ const configuration = params['configuration'];
188
+ if (configuration !== null && typeof configuration === 'object') {
189
+ return {
190
+ message: normalized,
191
+ configuration: configuration,
192
+ };
193
+ }
194
+ return { message: normalized };
195
+ }
196
+ /**
197
+ * Return the first defined non-empty string among the candidates.
198
+ * @param values - candidate values in precedence order.
199
+ * @returns the winning string, or undefined.
200
+ */
201
+ function firstString(...values) {
202
+ for (const value of values) {
203
+ if (typeof value === 'string' && value.length > 0)
204
+ return value;
205
+ }
206
+ return undefined;
207
+ }
208
+ /**
209
+ * Render a task in the requested dialect.
210
+ * @param task - the internal v0.3-shaped task.
211
+ * @param dialect - the dialect the peer spoke.
212
+ * @returns the wire object to serialize.
213
+ */
214
+ export function renderTask(task, dialect) {
215
+ if (dialect === 'v0.3')
216
+ return task;
217
+ return {
218
+ ...task,
219
+ status: renderStatusV1(task.status),
220
+ ...task.history === undefined ? {} : { history: task.history.map(renderMessageV1) },
221
+ };
222
+ }
223
+ /**
224
+ * Render a status-update stream event in the requested dialect.
225
+ * @param event - the internal event.
226
+ * @param dialect - the dialect the peer spoke.
227
+ * @returns the wire object to serialize.
228
+ */
229
+ export function renderStatusUpdate(event, dialect) {
230
+ if (dialect === 'v0.3')
231
+ return event;
232
+ return { statusUpdate: { ...event, status: renderStatusV1(event.status) } };
233
+ }
234
+ /**
235
+ * Render an artifact-update stream event in the requested dialect.
236
+ * @param event - the internal event.
237
+ * @param dialect - the dialect the peer spoke.
238
+ * @returns the wire object to serialize.
239
+ */
240
+ export function renderArtifactUpdate(event, dialect) {
241
+ return dialect === 'v0.3' ? event : { artifactUpdate: event };
242
+ }
243
+ /**
244
+ * Render a task status with v1.0 enum spellings.
245
+ * @param status - the internal status.
246
+ * @returns the v1.0-shaped status.
247
+ */
248
+ function renderStatusV1(status) {
249
+ return {
250
+ ...status,
251
+ state: STATE_TO_V1[status.state],
252
+ ...status.message === undefined ? {} : { message: renderMessageV1(status.message) },
253
+ };
254
+ }
255
+ /**
256
+ * Render a message with v1.0 enum spellings and member-presence parts.
257
+ * @param message - the internal message.
258
+ * @returns the v1.0-shaped message.
259
+ */
260
+ function renderMessageV1(message) {
261
+ return {
262
+ ...message,
263
+ role: ROLE_TO_V1[message.role],
264
+ parts: message.parts.map((part) => {
265
+ if (part.kind === 'text')
266
+ return { text: part.text };
267
+ if (part.kind === 'data')
268
+ return { data: part.data };
269
+ return {
270
+ ...part.file.uri === undefined ? {} : { url: part.file.uri },
271
+ ...part.file.bytes === undefined ? {} : { raw: part.file.bytes },
272
+ ...part.file.name === undefined ? {} : { filename: part.file.name },
273
+ ...part.file.mimeType === undefined ? {} : { mediaType: part.file.mimeType },
274
+ };
275
+ }),
276
+ };
277
+ }
278
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/protocol/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Server-Sent Events framing for `message/stream` and `tasks/resubscribe`.
3
+ *
4
+ * A2A streams JSON-RPC responses, not bare events: each frame carries the same
5
+ * envelope the unary methods return, correlated by the original request id.
6
+ *
7
+ * @module dsh-a2a/protocol/sse
8
+ */
9
+ /**
10
+ * Encode one payload as an SSE `data:` frame.
11
+ *
12
+ * Newlines inside the JSON would terminate the frame early, so the payload is
13
+ * serialized compactly (JSON.stringify emits no raw newlines) and terminated
14
+ * with the blank line SSE requires.
15
+ * @param id - the JSON-RPC id of the request this stream answers.
16
+ * @param payload - the already-dialect-rendered event.
17
+ * @returns the wire text of one frame.
18
+ */
19
+ export declare function sseFrame(id: string | number | null, payload: unknown): string;
20
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/protocol/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Server-Sent Events framing for `message/stream` and `tasks/resubscribe`.
3
+ *
4
+ * A2A streams JSON-RPC responses, not bare events: each frame carries the same
5
+ * envelope the unary methods return, correlated by the original request id.
6
+ *
7
+ * @module dsh-a2a/protocol/sse
8
+ */
9
+ import { jsonRpcResult } from "./jsonrpc.js";
10
+ /**
11
+ * Encode one payload as an SSE `data:` frame.
12
+ *
13
+ * Newlines inside the JSON would terminate the frame early, so the payload is
14
+ * serialized compactly (JSON.stringify emits no raw newlines) and terminated
15
+ * with the blank line SSE requires.
16
+ * @param id - the JSON-RPC id of the request this stream answers.
17
+ * @param payload - the already-dialect-rendered event.
18
+ * @returns the wire text of one frame.
19
+ */
20
+ export function sseFrame(id, payload) {
21
+ return `data: ${JSON.stringify(jsonRpcResult(id, payload))}\n\n`;
22
+ }
23
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/protocol/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,EAA0B,EAAE,OAAgB;IACnE,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAA;AAClE,CAAC"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * A2A wire vocabulary, normalized to the v0.3.0 spelling.
3
+ *
4
+ * The server speaks one internal shape. Requests in either dialect are parsed
5
+ * into these types on the way in ({@link ./normalize.ts}), and responses are
6
+ * rendered back into the caller's dialect on the way out. No plugin module
7
+ * outside `protocol/` sees a v1.0 spelling.
8
+ *
9
+ * @module dsh-a2a/protocol/wire
10
+ */
11
+ import type { A2AContextId, A2ATaskId } from './brand.ts';
12
+ /** Task lifecycle state, in the v0.3 JSON spelling. */
13
+ export type A2ATaskState = 'submitted' | 'working' | 'input-required' | 'auth-required' | 'completed' | 'canceled' | 'failed' | 'rejected';
14
+ /** States after which a task accepts no further transition. */
15
+ export declare const TERMINAL_STATES: ReadonlySet<A2ATaskState>;
16
+ /**
17
+ * Whether a state is terminal.
18
+ * @param state - the state to test.
19
+ * @returns true when no further transition is accepted.
20
+ */
21
+ export declare function isTerminal(state: A2ATaskState): boolean;
22
+ /** Message author, in the v0.3 JSON spelling. */
23
+ export type A2ARole = 'user' | 'agent';
24
+ /** Which spelling a peer used; every response echoes the request's dialect. */
25
+ export type A2ADialect = 'v0.3' | 'v1.0';
26
+ /** A text segment of a message or artifact. */
27
+ export interface A2ATextPart {
28
+ kind: 'text';
29
+ text: string;
30
+ }
31
+ /** A file reference or inline payload. */
32
+ export interface A2AFilePart {
33
+ kind: 'file';
34
+ file: {
35
+ name?: string;
36
+ mimeType?: string;
37
+ uri?: string;
38
+ bytes?: string;
39
+ };
40
+ }
41
+ /** Structured JSON carried beside the text. */
42
+ export interface A2ADataPart {
43
+ kind: 'data';
44
+ data: unknown;
45
+ }
46
+ /** Any message or artifact segment. */
47
+ export type A2APart = A2ATextPart | A2AFilePart | A2ADataPart;
48
+ /** One message in a task's history. */
49
+ export interface A2AMessage {
50
+ kind: 'message';
51
+ messageId: string;
52
+ role: A2ARole;
53
+ parts: A2APart[];
54
+ taskId?: A2ATaskId;
55
+ contextId?: A2AContextId;
56
+ metadata?: Record<string, unknown>;
57
+ }
58
+ /** A named output the agent produced for a task. */
59
+ export interface A2AArtifact {
60
+ artifactId: string;
61
+ name?: string;
62
+ description?: string;
63
+ parts: A2APart[];
64
+ metadata?: Record<string, unknown>;
65
+ }
66
+ /** Current state plus the message that explains it. */
67
+ export interface A2ATaskStatus {
68
+ state: A2ATaskState;
69
+ message?: A2AMessage;
70
+ timestamp: string;
71
+ }
72
+ /** The unit of work a peer submits and polls. */
73
+ export interface A2ATask {
74
+ kind: 'task';
75
+ id: A2ATaskId;
76
+ contextId: A2AContextId;
77
+ status: A2ATaskStatus;
78
+ history?: A2AMessage[];
79
+ artifacts?: A2AArtifact[];
80
+ metadata?: Record<string, unknown>;
81
+ }
82
+ /** A streamed state transition. `final` closes the stream. */
83
+ export interface A2ATaskStatusUpdateEvent {
84
+ kind: 'status-update';
85
+ taskId: A2ATaskId;
86
+ contextId: A2AContextId;
87
+ status: A2ATaskStatus;
88
+ final: boolean;
89
+ metadata?: Record<string, unknown>;
90
+ }
91
+ /** A streamed artifact, optionally appended to an earlier chunk. */
92
+ export interface A2ATaskArtifactUpdateEvent {
93
+ kind: 'artifact-update';
94
+ taskId: A2ATaskId;
95
+ contextId: A2AContextId;
96
+ artifact: A2AArtifact;
97
+ append?: boolean;
98
+ lastChunk?: boolean;
99
+ metadata?: Record<string, unknown>;
100
+ }
101
+ /** Anything the server may push over an SSE stream. */
102
+ export type A2AStreamEvent = A2ATask | A2AMessage | A2ATaskStatusUpdateEvent | A2ATaskArtifactUpdateEvent;
103
+ /** Webhook registration a peer supplies for terminal-state callbacks. */
104
+ export interface A2APushNotificationConfig {
105
+ id?: string;
106
+ url: string;
107
+ token?: string;
108
+ authentication?: {
109
+ schemes: string[];
110
+ credentials?: string;
111
+ };
112
+ }
113
+ /** Per-request knobs carried beside the message on `message/send`. */
114
+ export interface A2AMessageSendConfiguration {
115
+ acceptedOutputModes?: string[];
116
+ historyLength?: number;
117
+ pushNotificationConfig?: A2APushNotificationConfig;
118
+ blocking?: boolean;
119
+ }
120
+ /** Parameters of `message/send` and `message/stream`. */
121
+ export interface A2AMessageSendParams {
122
+ message: A2AMessage;
123
+ configuration?: A2AMessageSendConfiguration;
124
+ metadata?: Record<string, unknown>;
125
+ }
126
+ /** One capability this agent advertises on its card. */
127
+ export interface A2AAgentSkill {
128
+ id: string;
129
+ name: string;
130
+ description: string;
131
+ tags: string[];
132
+ examples?: string[];
133
+ inputModes?: string[];
134
+ outputModes?: string[];
135
+ }
136
+ /** The public description a peer fetches before talking to us. */
137
+ export interface A2AAgentCard {
138
+ protocolVersion: string;
139
+ name: string;
140
+ description: string;
141
+ version: string;
142
+ url: string;
143
+ preferredTransport: string;
144
+ supportedInterfaces?: {
145
+ url: string;
146
+ protocolBinding: string;
147
+ protocolVersion: string;
148
+ }[];
149
+ provider?: {
150
+ organization: string;
151
+ url: string;
152
+ };
153
+ capabilities: {
154
+ streaming: boolean;
155
+ pushNotifications: boolean;
156
+ stateTransitionHistory: boolean;
157
+ };
158
+ defaultInputModes: string[];
159
+ defaultOutputModes: string[];
160
+ skills: A2AAgentSkill[];
161
+ securitySchemes?: Record<string, unknown>;
162
+ security?: Record<string, string[]>[];
163
+ }
164
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A2A wire vocabulary, normalized to the v0.3.0 spelling.
3
+ *
4
+ * The server speaks one internal shape. Requests in either dialect are parsed
5
+ * into these types on the way in ({@link ./normalize.ts}), and responses are
6
+ * rendered back into the caller's dialect on the way out. No plugin module
7
+ * outside `protocol/` sees a v1.0 spelling.
8
+ *
9
+ * @module dsh-a2a/protocol/wire
10
+ */
11
+ /** States after which a task accepts no further transition. */
12
+ export const TERMINAL_STATES = new Set([
13
+ 'completed',
14
+ 'canceled',
15
+ 'failed',
16
+ 'rejected',
17
+ ]);
18
+ /**
19
+ * Whether a state is terminal.
20
+ * @param state - the state to test.
21
+ * @returns true when no further transition is accepted.
22
+ */
23
+ export function isTerminal(state) {
24
+ return TERMINAL_STATES.has(state);
25
+ }
26
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAA8B,IAAI,GAAG,CAAe;IAC9E,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAmB;IAC5C,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * HTTP + JSON-RPC dispatch.
3
+ *
4
+ * Deliberately free of Cordis: everything it needs arrives through
5
+ * {@link RouterDeps}, so the RPC semantics can be unit-tested without booting a
6
+ * composition or opening a socket. This is the same separation Hermes reached
7
+ * for when it made its request handler reachable through `server.adapter`.
8
+ *
9
+ * @module dsh-a2a/router
10
+ */
11
+ import type { IncomingMessage, ServerResponse } from 'node:http';
12
+ import { type A2AAgentCard, type A2AArtifact, type A2ATask, type A2ATaskId, type A2ATaskState } from './protocol/index.ts';
13
+ import type { A2AServerConfig } from './config.ts';
14
+ import type { Activation, ContextRegistry } from './contexts.ts';
15
+ import { type PeerIdentity, type RateLimiter, type TurnTracker } from './security.ts';
16
+ import type { TaskSlot } from './tasks.ts';
17
+ /** Everything the router needs from the plugin body. */
18
+ export interface RouterDeps {
19
+ config: A2AServerConfig;
20
+ contexts: ContextRegistry;
21
+ turns: TurnTracker;
22
+ rateLimiter: RateLimiter;
23
+ logger: {
24
+ warn: (message: string) => void;
25
+ error: (message: string) => void;
26
+ };
27
+ assertOpen: () => void;
28
+ resolvePeerSecrets: () => Promise<Map<PeerIdentity, string>>;
29
+ identify: (token: string | undefined, secrets: ReadonlyMap<PeerIdentity, string>) => PeerIdentity | undefined;
30
+ cardFor: (hostHeader: string | undefined) => A2AAgentCard;
31
+ createActivation: (peer: PeerIdentity) => Promise<Activation>;
32
+ submit: (activation: Activation, text: string, peer: PeerIdentity) => Promise<TaskSlot>;
33
+ cancel: (activation: Activation, slot: TaskSlot) => void;
34
+ taskSnapshot: (activation: Activation, slot: TaskSlot, state: A2ATaskState, artifacts: A2AArtifact[], stopReason?: string) => A2ATask;
35
+ /**
36
+ * Read a settled task back from the durable projection.
37
+ *
38
+ * Absent when the composition mounts no projection registry, in which case a
39
+ * settled task is simply unreadable — the pre-projection behavior.
40
+ */
41
+ readProjectedTask?: (activation: Activation, taskId: A2ATaskId) => A2ATask | undefined;
42
+ }
43
+ /** The router surface the plugin body wires into routes and teardown. */
44
+ export interface Router {
45
+ serveCard: (req: IncomingMessage, res: ServerResponse) => void;
46
+ serveRpc: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
47
+ /** Send every open stream its terminal frame, then end it. */
48
+ closeStreams: () => void;
49
+ }
50
+ /**
51
+ * Build the router.
52
+ * @param deps - the injected plugin capabilities.
53
+ * @returns the route handlers plus stream teardown.
54
+ */
55
+ export declare function createRouter(deps: RouterDeps): Router;
56
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAoBL,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAiC,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AACpH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAA;AAK1D,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,WAAW,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;IAC7E,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,kBAAkB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,YAAY,GAAG,SAAS,CAAA;IAC7G,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,YAAY,CAAA;IACzD,gBAAgB,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IAC7D,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvF,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;IACxD,YAAY,EAAE,CACZ,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,WAAW,EAAE,EACxB,UAAU,CAAC,EAAE,MAAM,KAChB,OAAO,CAAA;IACZ;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,CAAA;CACvF;AAWD,yEAAyE;AACzE,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;IAC9D,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,8DAA8D;IAC9D,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA0brD"}