@hanphone/dsh-a2a 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.
- package/LICENSE +21 -0
- package/README.md +196 -0
- package/README.zh.md +195 -0
- package/cordis.patch.yml +11 -0
- package/lib/client.js +166 -0
- package/lib/index.js +2073 -0
- package/lib/tsconfig.client.tsbuildinfo +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/api.d.ts +41 -0
- package/lib/types/api.d.ts.map +1 -0
- package/lib/types/api.js +86 -0
- package/lib/types/api.js.map +1 -0
- package/lib/types/client/index.d.ts +35 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/index.js +155 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/commands.d.ts +10 -0
- package/lib/types/commands.d.ts.map +1 -0
- package/lib/types/commands.js +93 -0
- package/lib/types/commands.js.map +1 -0
- package/lib/types/events.d.ts +74 -0
- package/lib/types/events.d.ts.map +1 -0
- package/lib/types/events.js +10 -0
- package/lib/types/events.js.map +1 -0
- package/lib/types/index.d.ts +54 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +296 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/jsonrpc.d.ts +20 -0
- package/lib/types/jsonrpc.d.ts.map +1 -0
- package/lib/types/jsonrpc.js +48 -0
- package/lib/types/jsonrpc.js.map +1 -0
- package/lib/types/outbound/calls.d.ts +37 -0
- package/lib/types/outbound/calls.d.ts.map +1 -0
- package/lib/types/outbound/calls.js +120 -0
- package/lib/types/outbound/calls.js.map +1 -0
- package/lib/types/outbound/registry.d.ts +102 -0
- package/lib/types/outbound/registry.d.ts.map +1 -0
- package/lib/types/outbound/registry.js +249 -0
- package/lib/types/outbound/registry.js.map +1 -0
- package/lib/types/outbound/tools.d.ts +30 -0
- package/lib/types/outbound/tools.d.ts.map +1 -0
- package/lib/types/outbound/tools.js +86 -0
- package/lib/types/outbound/tools.js.map +1 -0
- package/lib/types/protocol.d.ts +194 -0
- package/lib/types/protocol.d.ts.map +1 -0
- package/lib/types/protocol.js +78 -0
- package/lib/types/protocol.js.map +1 -0
- package/lib/types/server/a2a-server.d.ts +98 -0
- package/lib/types/server/a2a-server.d.ts.map +1 -0
- package/lib/types/server/a2a-server.js +397 -0
- package/lib/types/server/a2a-server.js.map +1 -0
- package/lib/types/server/card.d.ts +48 -0
- package/lib/types/server/card.d.ts.map +1 -0
- package/lib/types/server/card.js +75 -0
- package/lib/types/server/card.js.map +1 -0
- package/lib/types/server/exec/agent-runtime.d.ts +126 -0
- package/lib/types/server/exec/agent-runtime.d.ts.map +1 -0
- package/lib/types/server/exec/agent-runtime.js +138 -0
- package/lib/types/server/exec/agent-runtime.js.map +1 -0
- package/lib/types/server/exec/session.d.ts +11 -0
- package/lib/types/server/exec/session.d.ts.map +1 -0
- package/lib/types/server/exec/session.js +22 -0
- package/lib/types/server/exec/session.js.map +1 -0
- package/lib/types/server/exec/subagent.d.ts +39 -0
- package/lib/types/server/exec/subagent.d.ts.map +1 -0
- package/lib/types/server/exec/subagent.js +44 -0
- package/lib/types/server/exec/subagent.js.map +1 -0
- package/lib/types/server/executor.d.ts +63 -0
- package/lib/types/server/executor.d.ts.map +1 -0
- package/lib/types/server/executor.js +38 -0
- package/lib/types/server/executor.js.map +1 -0
- package/lib/types/server/routes.d.ts +32 -0
- package/lib/types/server/routes.d.ts.map +1 -0
- package/lib/types/server/routes.js +131 -0
- package/lib/types/server/routes.js.map +1 -0
- package/lib/types/server/store.d.ts +157 -0
- package/lib/types/server/store.d.ts.map +1 -0
- package/lib/types/server/store.js +239 -0
- package/lib/types/server/store.js.map +1 -0
- package/lib/types/service.d.ts +49 -0
- package/lib/types/service.d.ts.map +1 -0
- package/lib/types/service.js +46 -0
- package/lib/types/service.js.map +1 -0
- package/package.json +82 -0
- package/src/api.ts +115 -0
- package/src/client/index.ts +293 -0
- package/src/commands.ts +92 -0
- package/src/events.ts +58 -0
- package/src/index.ts +353 -0
- package/src/jsonrpc.ts +61 -0
- package/src/outbound/calls.ts +145 -0
- package/src/outbound/registry.ts +290 -0
- package/src/outbound/tools.ts +118 -0
- package/src/protocol.ts +212 -0
- package/src/server/a2a-server.ts +455 -0
- package/src/server/card.ts +106 -0
- package/src/server/exec/agent-runtime.ts +197 -0
- package/src/server/exec/session.ts +25 -0
- package/src/server/exec/subagent.ts +67 -0
- package/src/server/executor.ts +73 -0
- package/src/server/routes.ts +156 -0
- package/src/server/store.ts +320 -0
- package/src/service.ts +78 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inbound A2A server: JSON-RPC dispatch, the task lifecycle, and SSE
|
|
3
|
+
* streaming. Transport-agnostic — `handle` / `handleStream` take a structural
|
|
4
|
+
* request and return bytes; the HTTP binding lives in routes.ts.
|
|
5
|
+
* @module dsh-a2a/server/a2a-server
|
|
6
|
+
*/
|
|
7
|
+
import { A2A_ERROR_CODES, A2A_METHODS, Role, TaskState, isTerminal, partsToText, } from "../protocol.js";
|
|
8
|
+
import { methodNotFound, parseRpc, rpcError, rpcSuccess } from "../jsonrpc.js";
|
|
9
|
+
/** A2A JSON-RPC / SSE server over a structural request. */
|
|
10
|
+
export class A2AServer {
|
|
11
|
+
opts;
|
|
12
|
+
card;
|
|
13
|
+
listeners = new Set();
|
|
14
|
+
waiters = new Map();
|
|
15
|
+
running = new Map();
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.opts = opts;
|
|
18
|
+
this.card = opts.card;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Abort a running task by control path (facade /a2a task cancel): abort the
|
|
22
|
+
* executor's signal, settle the task CANCELED, and wake stream waiters.
|
|
23
|
+
* @returns false when the task is unknown or already terminal.
|
|
24
|
+
*/
|
|
25
|
+
abort(taskId) {
|
|
26
|
+
const record = this.opts.store.get(taskId);
|
|
27
|
+
if (record === undefined || isTerminal(record.state))
|
|
28
|
+
return false;
|
|
29
|
+
this.running.get(taskId)?.abort();
|
|
30
|
+
this.opts.store.setState(taskId, TaskState.CANCELED, { code: 'canceled', text: 'Task canceled' });
|
|
31
|
+
this.settle(taskId);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/** True when the request carries the configured bearer token. */
|
|
35
|
+
authorized(req) {
|
|
36
|
+
const token = this.opts.authToken;
|
|
37
|
+
if (!token)
|
|
38
|
+
return true;
|
|
39
|
+
const header = req.headers?.['authorization'] ?? '';
|
|
40
|
+
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
41
|
+
return match !== null && match[1] === token;
|
|
42
|
+
}
|
|
43
|
+
/** Route one inbound HTTP request (GET card, POST JSON-RPC). */
|
|
44
|
+
async handle(req, body) {
|
|
45
|
+
const path = (req.url ?? '').split('?')[0] ?? '';
|
|
46
|
+
if (req.method === 'GET' && path === '/.well-known/agent-card.json') {
|
|
47
|
+
return { status: 200, contentType: 'application/json', body: JSON.stringify(this.card) };
|
|
48
|
+
}
|
|
49
|
+
if (req.method !== 'POST' || path !== endpointOf(this.card)) {
|
|
50
|
+
return { status: 404, contentType: 'text/plain', body: 'Not Found' };
|
|
51
|
+
}
|
|
52
|
+
if (!this.authorized(req)) {
|
|
53
|
+
return {
|
|
54
|
+
status: 401,
|
|
55
|
+
contentType: 'application/json',
|
|
56
|
+
body: JSON.stringify(rpcError(null, A2A_ERROR_CODES.UNAUTHORIZED, 'Unauthorized')),
|
|
57
|
+
headers: { 'WWW-Authenticate': 'Bearer' },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const rpc = parseRpc(body);
|
|
61
|
+
if (rpc === undefined) {
|
|
62
|
+
return { status: 200, contentType: 'application/json', body: JSON.stringify(rpcError(null, A2A_ERROR_CODES.INVALID_REQUEST, 'Invalid JSON-RPC request')) };
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const result = await this.dispatch(rpc);
|
|
66
|
+
const source = sourceOf(req);
|
|
67
|
+
this.opts.onInbound?.({
|
|
68
|
+
method: rpc.method,
|
|
69
|
+
...(source !== undefined ? { source } : {}),
|
|
70
|
+
taskIds: extractTaskIds(result),
|
|
71
|
+
streaming: false,
|
|
72
|
+
});
|
|
73
|
+
return { status: 200, contentType: 'application/json', body: JSON.stringify(rpcSuccess(rpc.id, result)) };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const e = err;
|
|
77
|
+
return {
|
|
78
|
+
status: 200,
|
|
79
|
+
contentType: 'application/json',
|
|
80
|
+
body: JSON.stringify(rpcError(rpc.id, typeof e.code === 'number' ? e.code : A2A_ERROR_CODES.INTERNAL_ERROR, e.message ?? String(err), e.data)),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Route one SSE request (SendStreamingMessage / SubscribeToTask). Frames are
|
|
86
|
+
* pushed to `onEvent` as they happen; the caller must have checked
|
|
87
|
+
* `authorized()` before writing 200 headers.
|
|
88
|
+
*/
|
|
89
|
+
async handleStream(req, body, onEvent) {
|
|
90
|
+
if (req.method !== 'POST') {
|
|
91
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: 404, message: 'Not Found' })}\n\n`);
|
|
92
|
+
return { status: 200 };
|
|
93
|
+
}
|
|
94
|
+
if (!this.authorized(req)) {
|
|
95
|
+
return { status: 401, headers: { 'WWW-Authenticate': 'Bearer' } };
|
|
96
|
+
}
|
|
97
|
+
const rpc = parseRpc(body);
|
|
98
|
+
if (rpc === undefined) {
|
|
99
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: A2A_ERROR_CODES.INVALID_REQUEST, message: 'Invalid JSON-RPC request' })}\n\n`);
|
|
100
|
+
return { status: 200 };
|
|
101
|
+
}
|
|
102
|
+
if (rpc.method !== A2A_METHODS.sendStreamingMessage && rpc.method !== A2A_METHODS.subscribeToTask) {
|
|
103
|
+
onEvent(`event: error\ndata: ${JSON.stringify(methodNotFound(rpc.method ?? ''))}\n\n`);
|
|
104
|
+
return { status: 200 };
|
|
105
|
+
}
|
|
106
|
+
const params = (rpc.params ?? {});
|
|
107
|
+
let record;
|
|
108
|
+
if (rpc.method === A2A_METHODS.sendStreamingMessage) {
|
|
109
|
+
if (params.message === undefined) {
|
|
110
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: A2A_ERROR_CODES.INVALID_PARAMS, message: 'Missing message' })}\n\n`);
|
|
111
|
+
return { status: 200 };
|
|
112
|
+
}
|
|
113
|
+
const gateOutcome = await this.opts.gate(gateInputFrom(params.message, this.remotePeerOf(req)));
|
|
114
|
+
if (!gateOutcome.ok) {
|
|
115
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: -32000, message: gateOutcome.reason })}\n\n`);
|
|
116
|
+
return { status: 200 };
|
|
117
|
+
}
|
|
118
|
+
record = this.ensureTask(params.message, this.remotePeerOf(req));
|
|
119
|
+
this.noteInbound(req, rpc.method, [record.taskId], true);
|
|
120
|
+
// Kick off execution; frames flow through the shared listener set.
|
|
121
|
+
void this.runTask(record);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const id = params.id;
|
|
125
|
+
if (id === undefined) {
|
|
126
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: A2A_ERROR_CODES.INVALID_PARAMS, message: 'Missing task id' })}\n\n`);
|
|
127
|
+
return { status: 200 };
|
|
128
|
+
}
|
|
129
|
+
record = this.opts.store.get(id);
|
|
130
|
+
this.noteInbound(req, rpc.method, id ? [id] : [], true);
|
|
131
|
+
if (record === undefined) {
|
|
132
|
+
onEvent(`event: error\ndata: ${JSON.stringify({ code: A2A_ERROR_CODES.TASK_NOT_FOUND, message: `Task ${id} not found` })}\n\n`);
|
|
133
|
+
return { status: 200 };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const sub = (frame) => onEvent(`data: ${JSON.stringify(frame)}\n\n`);
|
|
137
|
+
this.listeners.add(sub);
|
|
138
|
+
try {
|
|
139
|
+
// Catch the subscriber up: the initial WORKING frame may have been
|
|
140
|
+
// emitted before this subscription landed, so always deliver the
|
|
141
|
+
// current status first (a settled task streams its terminal state).
|
|
142
|
+
const current = this.opts.store.get(record.taskId);
|
|
143
|
+
if (current !== undefined) {
|
|
144
|
+
sub({ statusUpdate: { taskId: record.taskId, contextId: record.contextId, status: statusOf(current) } });
|
|
145
|
+
}
|
|
146
|
+
await this.waitTerminal(record.taskId);
|
|
147
|
+
const finalRecord = this.opts.store.get(record.taskId);
|
|
148
|
+
if (finalRecord !== undefined)
|
|
149
|
+
onEvent(`data: ${JSON.stringify({ task: toTask(finalRecord) })}\n\n`);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
this.listeners.delete(sub);
|
|
153
|
+
}
|
|
154
|
+
return { status: 200 };
|
|
155
|
+
}
|
|
156
|
+
/** Dispatch one JSON-RPC request; throws {code, message} on errors. */
|
|
157
|
+
async dispatch(rpc) {
|
|
158
|
+
const method = rpc.method;
|
|
159
|
+
const params = (rpc.params ?? {});
|
|
160
|
+
switch (method) {
|
|
161
|
+
case A2A_METHODS.sendMessage: {
|
|
162
|
+
const message = params['message'];
|
|
163
|
+
if (message === undefined)
|
|
164
|
+
throw rpcFault(A2A_ERROR_CODES.INVALID_PARAMS, 'Missing message');
|
|
165
|
+
const gateOutcome = await this.opts.gate(gateInputFrom(message, null));
|
|
166
|
+
if (!gateOutcome.ok)
|
|
167
|
+
throw rpcFault(A2A_ERROR_CODES.INVALID_PARAMS, gateOutcome.reason);
|
|
168
|
+
const record = this.ensureTask(message, null);
|
|
169
|
+
this.noteInbound({ method }, method, [record.taskId], false);
|
|
170
|
+
await this.runTask(record);
|
|
171
|
+
const settled = this.opts.store.get(record.taskId);
|
|
172
|
+
return toTask(settled ?? record);
|
|
173
|
+
}
|
|
174
|
+
case A2A_METHODS.getTask: {
|
|
175
|
+
const id = params['id'];
|
|
176
|
+
if (id === undefined)
|
|
177
|
+
throw rpcFault(A2A_ERROR_CODES.INVALID_PARAMS, 'Missing task id');
|
|
178
|
+
const record = this.opts.store.get(id);
|
|
179
|
+
if (record === undefined)
|
|
180
|
+
throw rpcFault(A2A_ERROR_CODES.TASK_NOT_FOUND, `Task ${id} not found`);
|
|
181
|
+
return toTask(record);
|
|
182
|
+
}
|
|
183
|
+
case A2A_METHODS.listTasks: {
|
|
184
|
+
return this.opts.store.list().map(toTask);
|
|
185
|
+
}
|
|
186
|
+
case A2A_METHODS.cancelTask: {
|
|
187
|
+
const id = params['id'];
|
|
188
|
+
if (id === undefined)
|
|
189
|
+
throw rpcFault(A2A_ERROR_CODES.INVALID_PARAMS, 'Missing task id');
|
|
190
|
+
const record = this.opts.store.get(id);
|
|
191
|
+
if (record === undefined)
|
|
192
|
+
throw rpcFault(A2A_ERROR_CODES.TASK_NOT_FOUND, `Task ${id} not found`);
|
|
193
|
+
if (isTerminal(record.state))
|
|
194
|
+
throw rpcFault(A2A_ERROR_CODES.TASK_CANCEL_NOT_ALLOWED, `Task ${id} already in terminal state ${record.state}`);
|
|
195
|
+
const controller = this.running.get(id);
|
|
196
|
+
controller?.abort();
|
|
197
|
+
this.opts.store.setState(id, TaskState.CANCELED, { code: 'canceled', text: 'Task canceled by caller' });
|
|
198
|
+
this.settle(id);
|
|
199
|
+
return toTask(this.opts.store.get(id));
|
|
200
|
+
}
|
|
201
|
+
case A2A_METHODS.getExtendedAgentCard:
|
|
202
|
+
return this.card;
|
|
203
|
+
default:
|
|
204
|
+
throw rpcFault(A2A_ERROR_CODES.METHOD_NOT_FOUND, `Unknown method ${method}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/** Create (or continue) the task record for one message. */
|
|
208
|
+
ensureTask(message, remotePeerId) {
|
|
209
|
+
if (message.taskId !== undefined) {
|
|
210
|
+
const existing = this.opts.store.get(message.taskId);
|
|
211
|
+
if (existing !== undefined) {
|
|
212
|
+
const created = this.opts.store.create({
|
|
213
|
+
contextId: existing.contextId,
|
|
214
|
+
skill: existing.skill,
|
|
215
|
+
parts: message.parts,
|
|
216
|
+
remotePeerId,
|
|
217
|
+
});
|
|
218
|
+
return created;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const contextId = message.contextId ?? crypto.randomUUID();
|
|
222
|
+
const skill = message.metadata?.['skill'] ?? 'chat';
|
|
223
|
+
return this.opts.store.create({ contextId, skill, parts: message.parts, remotePeerId });
|
|
224
|
+
}
|
|
225
|
+
/** Run one task to a terminal state, emitting status/artifact frames. */
|
|
226
|
+
async runTask(record) {
|
|
227
|
+
const controller = new AbortController();
|
|
228
|
+
this.running.set(record.taskId, controller);
|
|
229
|
+
this.opts.store.setState(record.taskId, TaskState.WORKING);
|
|
230
|
+
this.emit({ statusUpdate: { taskId: record.taskId, contextId: record.contextId, status: statusOf(this.opts.store.get(record.taskId)) } });
|
|
231
|
+
const onEvent = this.eventSink(record.taskId, record.contextId);
|
|
232
|
+
try {
|
|
233
|
+
const executor = this.opts.executors.resolve(record.skill);
|
|
234
|
+
const output = await executor.execute({
|
|
235
|
+
taskId: record.taskId,
|
|
236
|
+
contextId: record.contextId,
|
|
237
|
+
skill: record.skill,
|
|
238
|
+
prompt: partsToText(record.parts),
|
|
239
|
+
signal: controller.signal,
|
|
240
|
+
}, { onEvent });
|
|
241
|
+
const settled = this.opts.store.get(record.taskId);
|
|
242
|
+
if (settled !== undefined && settled.state === TaskState.CANCELED) {
|
|
243
|
+
// Cancel won: keep CANCELED, do not clobber with a completion.
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
this.opts.store.appendArtifact(record.taskId, { artifactId: 'result', parts: output.parts, lastChunk: true });
|
|
247
|
+
this.opts.store.setState(record.taskId, TaskState.COMPLETED);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
const settled = this.opts.store.get(record.taskId);
|
|
252
|
+
if (settled !== undefined && settled.state === TaskState.CANCELED) {
|
|
253
|
+
// Idempotent cancel already settled the task.
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.opts.store.setState(record.taskId, TaskState.FAILED, { code: 'executor', text: err.message });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
this.running.delete(record.taskId);
|
|
261
|
+
const terminal = this.opts.store.get(record.taskId);
|
|
262
|
+
if (terminal !== undefined)
|
|
263
|
+
this.emit({ task: toTask(terminal) });
|
|
264
|
+
this.settle(record.taskId);
|
|
265
|
+
this.opts.onTaskSettled?.(record.taskId);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** Build the event sink that folds executor events into store + frames. */
|
|
269
|
+
eventSink(taskId, contextId) {
|
|
270
|
+
return (ev) => {
|
|
271
|
+
if (ev.type === 'status') {
|
|
272
|
+
this.opts.store.setState(taskId, ev.state ?? TaskState.WORKING);
|
|
273
|
+
this.emit({ statusUpdate: { taskId, contextId, status: statusOf(this.opts.store.get(taskId)) } });
|
|
274
|
+
}
|
|
275
|
+
else if (ev.type === 'artifact' && ev.artifactId !== undefined && ev.parts !== undefined) {
|
|
276
|
+
const record = this.opts.store.appendArtifact(taskId, {
|
|
277
|
+
artifactId: ev.artifactId,
|
|
278
|
+
...(ev.name !== undefined ? { name: ev.name } : {}),
|
|
279
|
+
parts: ev.parts,
|
|
280
|
+
...(ev.lastChunk !== undefined ? { lastChunk: ev.lastChunk } : {}),
|
|
281
|
+
});
|
|
282
|
+
const artifact = record.artifacts.find((a) => a.artifactId === ev.artifactId);
|
|
283
|
+
if (artifact !== undefined) {
|
|
284
|
+
this.emit({
|
|
285
|
+
artifactUpdate: {
|
|
286
|
+
taskId,
|
|
287
|
+
contextId,
|
|
288
|
+
artifact: {
|
|
289
|
+
artifactId: artifact.artifactId,
|
|
290
|
+
...(artifact.name !== undefined ? { name: artifact.name } : {}),
|
|
291
|
+
parts: artifact.parts,
|
|
292
|
+
},
|
|
293
|
+
...(ev.lastChunk !== undefined ? { lastChunk: ev.lastChunk } : {}),
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
emit(frame) {
|
|
301
|
+
for (const listener of [...this.listeners])
|
|
302
|
+
listener(frame);
|
|
303
|
+
}
|
|
304
|
+
noteInbound(req, method, taskIds, streaming) {
|
|
305
|
+
const source = sourceOf(req);
|
|
306
|
+
this.opts.onInbound?.({
|
|
307
|
+
method,
|
|
308
|
+
...(source !== undefined ? { source } : {}),
|
|
309
|
+
taskIds,
|
|
310
|
+
streaming,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
remotePeerOf(req) {
|
|
314
|
+
const source = sourceOf(req);
|
|
315
|
+
return source ? hashOf(source) : null;
|
|
316
|
+
}
|
|
317
|
+
async waitTerminal(taskId) {
|
|
318
|
+
const current = this.opts.store.get(taskId);
|
|
319
|
+
if (current !== undefined && isTerminal(current.state))
|
|
320
|
+
return;
|
|
321
|
+
await new Promise((resolve) => {
|
|
322
|
+
this.waiters.set(taskId, resolve);
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
settle(taskId) {
|
|
326
|
+
const waiter = this.waiters.get(taskId);
|
|
327
|
+
if (waiter !== undefined) {
|
|
328
|
+
this.waiters.delete(taskId);
|
|
329
|
+
waiter();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/** Read the JSON-RPC endpoint path off the card's first interface. */
|
|
334
|
+
function endpointOf(card) {
|
|
335
|
+
const url = card.supportedInterfaces?.[0]?.url;
|
|
336
|
+
if (!url)
|
|
337
|
+
return '/a2a';
|
|
338
|
+
try {
|
|
339
|
+
return new URL(url).pathname;
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return url;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
function sourceOf(req) {
|
|
346
|
+
const s = req.socket;
|
|
347
|
+
if (!s?.remoteAddress)
|
|
348
|
+
return undefined;
|
|
349
|
+
return `${s.remoteAddress}:${s.remotePort ?? ''}`;
|
|
350
|
+
}
|
|
351
|
+
function hashOf(value) {
|
|
352
|
+
let h = 0;
|
|
353
|
+
for (let i = 0; i < value.length; i++)
|
|
354
|
+
h = (h * 31 + value.charCodeAt(i)) >>> 0;
|
|
355
|
+
return `peer-${h.toString(16)}`;
|
|
356
|
+
}
|
|
357
|
+
function gateInputFrom(message, remotePeerId) {
|
|
358
|
+
return {
|
|
359
|
+
contextId: message.contextId ?? 'new',
|
|
360
|
+
skill: message.metadata?.['skill'] ?? 'chat',
|
|
361
|
+
parts: message.parts,
|
|
362
|
+
remotePeerId,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
function rpcFault(code, message) {
|
|
366
|
+
return { code, message };
|
|
367
|
+
}
|
|
368
|
+
function statusOf(record) {
|
|
369
|
+
return {
|
|
370
|
+
state: record.state,
|
|
371
|
+
timestamp: record.updatedAt,
|
|
372
|
+
...(record.error ? { message: { messageId: `a2a-status-${record.taskId}`, role: Role.AGENT, parts: [{ text: record.error.message }] } } : {}),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
function toTask(record) {
|
|
376
|
+
return {
|
|
377
|
+
id: record.taskId,
|
|
378
|
+
contextId: record.contextId,
|
|
379
|
+
status: statusOf(record),
|
|
380
|
+
artifacts: record.artifacts,
|
|
381
|
+
metadata: { skill: record.skill },
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
function extractTaskIds(result) {
|
|
385
|
+
if (result === null || typeof result !== 'object')
|
|
386
|
+
return [];
|
|
387
|
+
const value = result;
|
|
388
|
+
if (typeof value.id === 'string')
|
|
389
|
+
return [value.id];
|
|
390
|
+
if (typeof value.task?.id === 'string')
|
|
391
|
+
return [value.task.id];
|
|
392
|
+
if (Array.isArray(result)) {
|
|
393
|
+
return result.map((t) => t.id).filter((id) => typeof id === 'string');
|
|
394
|
+
}
|
|
395
|
+
return [];
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=a2a-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-server.js","sourceRoot":"","sources":["../../../src/server/a2a-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentCard assembly for the inbound half: skills are DERIVED from the live
|
|
3
|
+
* tool registry by an explicit id list (never invented), plus a built-in
|
|
4
|
+
* `chat` skill so a fresh install is immediately exercisable end-to-end.
|
|
5
|
+
* @module dsh-a2a/server/card
|
|
6
|
+
*/
|
|
7
|
+
import { type AgentCard, type AgentSkill } from '../protocol.ts';
|
|
8
|
+
/** Structural slice of `ctx.tools` used for derivation. */
|
|
9
|
+
export interface ToolGetter {
|
|
10
|
+
get(name: string): {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly description?: string;
|
|
13
|
+
} | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Derivation policy for inbound skills. */
|
|
16
|
+
export interface CardSkillPolicy {
|
|
17
|
+
/** Tool ids (as registered on ctx.tools) exposed as inbound skills. */
|
|
18
|
+
readonly ids: readonly string[];
|
|
19
|
+
/** Ids to remove after derivation (defense in depth). */
|
|
20
|
+
readonly exclude: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Derive the inbound skill list from the live tool registry.
|
|
24
|
+
*
|
|
25
|
+
* Every configured id must resolve to a registered tool — a missing referent
|
|
26
|
+
* fails the derivation loudly (the plugin's misconfiguration contract) with
|
|
27
|
+
* all missing ids listed. The built-in `chat` skill is always present so the
|
|
28
|
+
* server answers before any tool is exposed.
|
|
29
|
+
*
|
|
30
|
+
* @param tools - the tool registry getter.
|
|
31
|
+
* @param policy - explicit-id derivation policy.
|
|
32
|
+
* @returns the derived skills, `chat` first, configured tools after, excludes applied.
|
|
33
|
+
*/
|
|
34
|
+
export declare function deriveSkills(tools: ToolGetter, policy: CardSkillPolicy): AgentSkill[];
|
|
35
|
+
/** Identity options for the advertised AgentCard. */
|
|
36
|
+
export interface CardOptions {
|
|
37
|
+
readonly baseUrl: string;
|
|
38
|
+
readonly endpointPath: string;
|
|
39
|
+
readonly name: string;
|
|
40
|
+
readonly description: string;
|
|
41
|
+
readonly version: string;
|
|
42
|
+
readonly skills: readonly AgentSkill[];
|
|
43
|
+
/** Present when inbound bearer auth is configured (env-resolved). */
|
|
44
|
+
readonly authToken?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Assemble the AgentCard advertised by this DSH. */
|
|
47
|
+
export declare function buildCard(options: CardOptions): AgentCard;
|
|
48
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/server/card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;AAEvB,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CACxF;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,GAAG,UAAU,EAAE,CA6BrF;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAuBzD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentCard assembly for the inbound half: skills are DERIVED from the live
|
|
3
|
+
* tool registry by an explicit id list (never invented), plus a built-in
|
|
4
|
+
* `chat` skill so a fresh install is immediately exercisable end-to-end.
|
|
5
|
+
* @module dsh-a2a/server/card
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Derive the inbound skill list from the live tool registry.
|
|
9
|
+
*
|
|
10
|
+
* Every configured id must resolve to a registered tool — a missing referent
|
|
11
|
+
* fails the derivation loudly (the plugin's misconfiguration contract) with
|
|
12
|
+
* all missing ids listed. The built-in `chat` skill is always present so the
|
|
13
|
+
* server answers before any tool is exposed.
|
|
14
|
+
*
|
|
15
|
+
* @param tools - the tool registry getter.
|
|
16
|
+
* @param policy - explicit-id derivation policy.
|
|
17
|
+
* @returns the derived skills, `chat` first, configured tools after, excludes applied.
|
|
18
|
+
*/
|
|
19
|
+
export function deriveSkills(tools, policy) {
|
|
20
|
+
const excluded = new Set(policy.exclude);
|
|
21
|
+
const skills = [
|
|
22
|
+
{
|
|
23
|
+
id: 'chat',
|
|
24
|
+
name: 'chat',
|
|
25
|
+
description: 'Conversational assistance over a DSH agent session.',
|
|
26
|
+
tags: ['chat'],
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const missing = [];
|
|
30
|
+
for (const id of policy.ids) {
|
|
31
|
+
if (excluded.has(id))
|
|
32
|
+
continue;
|
|
33
|
+
const tool = tools.get(id);
|
|
34
|
+
if (tool === undefined) {
|
|
35
|
+
missing.push(id);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
skills.push({
|
|
39
|
+
id,
|
|
40
|
+
name: id,
|
|
41
|
+
description: tool.description ?? `Expose the DSH tool \`${id}\` over A2A.`,
|
|
42
|
+
tags: ['tool'],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (missing.length > 0) {
|
|
46
|
+
throw new Error(`dsh-a2a: server.skills.ids reference unregistered tools: ${missing.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
return skills;
|
|
49
|
+
}
|
|
50
|
+
/** Assemble the AgentCard advertised by this DSH. */
|
|
51
|
+
export function buildCard(options) {
|
|
52
|
+
const iface = {
|
|
53
|
+
url: `${options.baseUrl.replace(/\/$/, '')}${options.endpointPath}`,
|
|
54
|
+
protocolBinding: 'JSONRPC',
|
|
55
|
+
protocolVersion: '1.0',
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
name: options.name,
|
|
59
|
+
description: options.description,
|
|
60
|
+
version: options.version,
|
|
61
|
+
provider: { url: 'https://deepseek.com', organization: 'DeepSeek' },
|
|
62
|
+
capabilities: { streaming: true, pushNotifications: false, extensions: [] },
|
|
63
|
+
defaultInputModes: ['text/plain'],
|
|
64
|
+
defaultOutputModes: ['text/plain'],
|
|
65
|
+
skills: options.skills,
|
|
66
|
+
supportedInterfaces: [iface],
|
|
67
|
+
...(options.authToken !== undefined
|
|
68
|
+
? {
|
|
69
|
+
securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', description: 'Shared bearer token' } },
|
|
70
|
+
securityRequirements: [{ bearerAuth: [] }],
|
|
71
|
+
}
|
|
72
|
+
: {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/server/card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,MAAuB;IACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,MAAM,GAAiB;QAC3B;YACE,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,qDAAqD;YAClE,IAAI,EAAE,CAAC,MAAM,CAAC;SACf;KACF,CAAA;IACD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAChB,SAAQ;QACV,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE;YACF,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,yBAAyB,EAAE,cAAc;YAC1E,IAAI,EAAE,CAAC,MAAM,CAAC;SACf,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4DAA4D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnG,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAcD,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,MAAM,KAAK,GAAmB;QAC5B,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE;QACnE,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,KAAK;KACvB,CAAA;IACD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,YAAY,EAAE,UAAU,EAAE;QACnE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QAC3E,iBAAiB,EAAE,CAAC,YAAY,CAAC;QACjC,kBAAkB,EAAE,CAAC,YAAY,CAAC;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC;QAC5B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS;YACjC,CAAC,CAAC;gBACA,eAAe,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE;gBACvG,oBAAoB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;aAC3C;YACD,CAAC,CAAC,EAAE,CAAC;KACR,CAAA;AACH,CAAC"}
|