@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,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent2Agent (A2A) Protocol v1.0 — types, task states, JSON-RPC methods and
|
|
3
|
+
* error codes used by this plugin's JSON-RPC over HTTP binding.
|
|
4
|
+
*
|
|
5
|
+
* The surface mirrors the normative `a2a.proto` of the A2A project (Apache-2.0);
|
|
6
|
+
* this file is the plugin's own transcription and the single source of protocol
|
|
7
|
+
* truth. Bindings other than JSON-RPC over HTTP (gRPC, REST) are not provided.
|
|
8
|
+
* @module dsh-a2a/protocol
|
|
9
|
+
*/
|
|
10
|
+
/** Task lifecycle states (spec `TaskState`). */
|
|
11
|
+
export declare enum TaskState {
|
|
12
|
+
SUBMITTED = "SUBMITTED",
|
|
13
|
+
WORKING = "WORKING",
|
|
14
|
+
INPUT_REQUIRED = "INPUT_REQUIRED",
|
|
15
|
+
AUTH_REQUIRED = "AUTH_REQUIRED",
|
|
16
|
+
COMPLETED = "COMPLETED",
|
|
17
|
+
FAILED = "FAILED",
|
|
18
|
+
CANCELED = "CANCELED",
|
|
19
|
+
REJECTED = "REJECTED"
|
|
20
|
+
}
|
|
21
|
+
/** States that settle a task; a settled task no longer transitions. */
|
|
22
|
+
export declare const TERMINAL_STATES: ReadonlySet<TaskState>;
|
|
23
|
+
/** @returns whether the state settles the task. */
|
|
24
|
+
export declare function isTerminal(state: TaskState): boolean;
|
|
25
|
+
/** Message sender role (spec `Role`). */
|
|
26
|
+
export declare enum Role {
|
|
27
|
+
USER = "user",
|
|
28
|
+
AGENT = "agent"
|
|
29
|
+
}
|
|
30
|
+
/** One message part: text, file (bytes or uri), or structured data. */
|
|
31
|
+
export type Part = {
|
|
32
|
+
readonly text: string;
|
|
33
|
+
readonly metadata?: Record<string, unknown>;
|
|
34
|
+
} | {
|
|
35
|
+
readonly file: {
|
|
36
|
+
readonly mimeType?: string;
|
|
37
|
+
readonly name?: string;
|
|
38
|
+
readonly bytes?: string;
|
|
39
|
+
readonly uri?: string;
|
|
40
|
+
};
|
|
41
|
+
readonly metadata?: Record<string, unknown>;
|
|
42
|
+
} | {
|
|
43
|
+
readonly data: unknown;
|
|
44
|
+
readonly metadata?: Record<string, unknown>;
|
|
45
|
+
};
|
|
46
|
+
/** An interaction payload exchanged between agents. */
|
|
47
|
+
export interface Message {
|
|
48
|
+
readonly messageId: string;
|
|
49
|
+
readonly role: Role;
|
|
50
|
+
readonly contextId?: string;
|
|
51
|
+
/** Continuation: attaches this message to an existing task's conversation. */
|
|
52
|
+
readonly taskId?: string;
|
|
53
|
+
readonly parts: readonly Part[];
|
|
54
|
+
readonly metadata?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
/** Current state of a task, with an optional explanatory message. */
|
|
57
|
+
export interface TaskStatus {
|
|
58
|
+
readonly state: TaskState;
|
|
59
|
+
readonly message?: Message;
|
|
60
|
+
readonly timestamp: string;
|
|
61
|
+
}
|
|
62
|
+
/** A chunk of task output. */
|
|
63
|
+
export interface Artifact {
|
|
64
|
+
readonly name?: string;
|
|
65
|
+
readonly parts: readonly Part[];
|
|
66
|
+
readonly artifactId?: string;
|
|
67
|
+
}
|
|
68
|
+
/** A task: the durable work unit of A2A. */
|
|
69
|
+
export interface Task {
|
|
70
|
+
readonly id: string;
|
|
71
|
+
readonly contextId?: string;
|
|
72
|
+
readonly status: TaskStatus;
|
|
73
|
+
readonly artifacts?: readonly Artifact[];
|
|
74
|
+
readonly history?: readonly Message[];
|
|
75
|
+
readonly metadata?: Record<string, unknown>;
|
|
76
|
+
}
|
|
77
|
+
/** JSON-RPC 2.0 request as used by the A2A binding. */
|
|
78
|
+
export interface JsonRpcRequest {
|
|
79
|
+
readonly jsonrpc: '2.0';
|
|
80
|
+
readonly id?: string | number | null;
|
|
81
|
+
readonly method: string;
|
|
82
|
+
readonly params?: unknown;
|
|
83
|
+
}
|
|
84
|
+
export interface JsonRpcSuccess {
|
|
85
|
+
readonly jsonrpc: '2.0';
|
|
86
|
+
readonly id: string | number | null;
|
|
87
|
+
readonly result: unknown;
|
|
88
|
+
}
|
|
89
|
+
export interface JsonRpcErrorBody {
|
|
90
|
+
readonly code: number;
|
|
91
|
+
readonly message: string;
|
|
92
|
+
readonly data?: unknown;
|
|
93
|
+
}
|
|
94
|
+
export interface JsonRpcError {
|
|
95
|
+
readonly jsonrpc: '2.0';
|
|
96
|
+
readonly id: string | number | null;
|
|
97
|
+
readonly error: JsonRpcErrorBody;
|
|
98
|
+
}
|
|
99
|
+
export type JsonRpcResponse = JsonRpcSuccess | JsonRpcError;
|
|
100
|
+
/** A skill advertised by an agent. */
|
|
101
|
+
export interface AgentSkill {
|
|
102
|
+
readonly id: string;
|
|
103
|
+
readonly name?: string;
|
|
104
|
+
readonly description?: string;
|
|
105
|
+
readonly tags?: readonly string[];
|
|
106
|
+
readonly examples?: readonly string[];
|
|
107
|
+
readonly inputModes?: readonly string[];
|
|
108
|
+
readonly outputModes?: readonly string[];
|
|
109
|
+
}
|
|
110
|
+
export interface AgentCapabilities {
|
|
111
|
+
readonly streaming?: boolean;
|
|
112
|
+
readonly pushNotifications?: boolean;
|
|
113
|
+
readonly stateTransitionHistory?: boolean;
|
|
114
|
+
readonly extensions?: readonly string[];
|
|
115
|
+
}
|
|
116
|
+
/** One supported interface (transport binding) of an agent. */
|
|
117
|
+
export interface AgentInterface {
|
|
118
|
+
readonly url: string;
|
|
119
|
+
readonly protocolBinding?: 'JSONRPC' | 'REST' | 'gRPC' | string;
|
|
120
|
+
readonly protocolVersion?: string;
|
|
121
|
+
readonly authSchemes?: readonly string[];
|
|
122
|
+
}
|
|
123
|
+
/** Bearer-token security scheme advertised by the AgentCard. */
|
|
124
|
+
export interface AgentSecurityScheme {
|
|
125
|
+
readonly type: 'http';
|
|
126
|
+
readonly scheme: 'bearer';
|
|
127
|
+
readonly description?: string;
|
|
128
|
+
}
|
|
129
|
+
/** The discovery manifest of an A2A agent. */
|
|
130
|
+
export interface AgentCard {
|
|
131
|
+
readonly name: string;
|
|
132
|
+
readonly description: string;
|
|
133
|
+
readonly version: string;
|
|
134
|
+
readonly url?: string;
|
|
135
|
+
readonly provider?: {
|
|
136
|
+
readonly url: string;
|
|
137
|
+
readonly organization: string;
|
|
138
|
+
};
|
|
139
|
+
readonly skills?: readonly AgentSkill[];
|
|
140
|
+
readonly capabilities?: AgentCapabilities;
|
|
141
|
+
readonly defaultInputModes?: readonly string[];
|
|
142
|
+
readonly defaultOutputModes?: readonly string[];
|
|
143
|
+
readonly securitySchemes?: Record<string, AgentSecurityScheme>;
|
|
144
|
+
readonly securityRequirements?: readonly Record<string, readonly string[]>[];
|
|
145
|
+
readonly supportedInterfaces?: readonly AgentInterface[];
|
|
146
|
+
readonly custom?: Record<string, unknown>;
|
|
147
|
+
}
|
|
148
|
+
/** Streamed updates during a task run (SSE payloads). */
|
|
149
|
+
export type StreamResponse = {
|
|
150
|
+
readonly statusUpdate: {
|
|
151
|
+
readonly taskId: string;
|
|
152
|
+
readonly contextId?: string;
|
|
153
|
+
readonly status: TaskStatus;
|
|
154
|
+
};
|
|
155
|
+
} | {
|
|
156
|
+
readonly artifactUpdate: {
|
|
157
|
+
readonly taskId: string;
|
|
158
|
+
readonly contextId?: string;
|
|
159
|
+
readonly artifact: Artifact;
|
|
160
|
+
readonly lastChunk?: boolean;
|
|
161
|
+
};
|
|
162
|
+
} | {
|
|
163
|
+
readonly task: Task;
|
|
164
|
+
} | {
|
|
165
|
+
readonly error: {
|
|
166
|
+
readonly code: number;
|
|
167
|
+
readonly message: string;
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
/** A2A v1.0 JSON-RPC method names (canonical PascalCase as in a2a.proto). */
|
|
171
|
+
export declare const A2A_METHODS: {
|
|
172
|
+
readonly sendMessage: "SendMessage";
|
|
173
|
+
readonly sendStreamingMessage: "SendStreamingMessage";
|
|
174
|
+
readonly getTask: "GetTask";
|
|
175
|
+
readonly listTasks: "ListTasks";
|
|
176
|
+
readonly cancelTask: "CancelTask";
|
|
177
|
+
readonly subscribeToTask: "SubscribeToTask";
|
|
178
|
+
readonly getExtendedAgentCard: "GetExtendedAgentCard";
|
|
179
|
+
};
|
|
180
|
+
/** JSON-RPC error codes for the A2A binding (spec §error codes). */
|
|
181
|
+
export declare const A2A_ERROR_CODES: {
|
|
182
|
+
readonly INVALID_REQUEST: -32600;
|
|
183
|
+
readonly METHOD_NOT_FOUND: -32601;
|
|
184
|
+
readonly INVALID_PARAMS: -32602;
|
|
185
|
+
readonly INTERNAL_ERROR: -32603;
|
|
186
|
+
readonly UNAUTHORIZED: -32000;
|
|
187
|
+
readonly TASK_NOT_FOUND: -32001;
|
|
188
|
+
readonly TASK_CANCEL_NOT_ALLOWED: -32002;
|
|
189
|
+
readonly AGENT_CARD_NOT_FOUND: -32004;
|
|
190
|
+
readonly AGENT_CARD_SIGNATURE_INVALID: -32005;
|
|
191
|
+
};
|
|
192
|
+
/** Read a message's text parts as a single string (model-facing convenience). */
|
|
193
|
+
export declare function partsToText(parts: readonly Part[] | undefined): string;
|
|
194
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent2Agent (A2A) Protocol v1.0 — types, task states, JSON-RPC methods and
|
|
3
|
+
* error codes used by this plugin's JSON-RPC over HTTP binding.
|
|
4
|
+
*
|
|
5
|
+
* The surface mirrors the normative `a2a.proto` of the A2A project (Apache-2.0);
|
|
6
|
+
* this file is the plugin's own transcription and the single source of protocol
|
|
7
|
+
* truth. Bindings other than JSON-RPC over HTTP (gRPC, REST) are not provided.
|
|
8
|
+
* @module dsh-a2a/protocol
|
|
9
|
+
*/
|
|
10
|
+
/** Task lifecycle states (spec `TaskState`). */
|
|
11
|
+
export var TaskState;
|
|
12
|
+
(function (TaskState) {
|
|
13
|
+
TaskState["SUBMITTED"] = "SUBMITTED";
|
|
14
|
+
TaskState["WORKING"] = "WORKING";
|
|
15
|
+
TaskState["INPUT_REQUIRED"] = "INPUT_REQUIRED";
|
|
16
|
+
TaskState["AUTH_REQUIRED"] = "AUTH_REQUIRED";
|
|
17
|
+
TaskState["COMPLETED"] = "COMPLETED";
|
|
18
|
+
TaskState["FAILED"] = "FAILED";
|
|
19
|
+
TaskState["CANCELED"] = "CANCELED";
|
|
20
|
+
TaskState["REJECTED"] = "REJECTED";
|
|
21
|
+
})(TaskState || (TaskState = {}));
|
|
22
|
+
/** States that settle a task; a settled task no longer transitions. */
|
|
23
|
+
export const TERMINAL_STATES = new Set([
|
|
24
|
+
TaskState.COMPLETED,
|
|
25
|
+
TaskState.FAILED,
|
|
26
|
+
TaskState.CANCELED,
|
|
27
|
+
TaskState.REJECTED,
|
|
28
|
+
]);
|
|
29
|
+
/** @returns whether the state settles the task. */
|
|
30
|
+
export function isTerminal(state) {
|
|
31
|
+
return TERMINAL_STATES.has(state);
|
|
32
|
+
}
|
|
33
|
+
/** Message sender role (spec `Role`). */
|
|
34
|
+
export var Role;
|
|
35
|
+
(function (Role) {
|
|
36
|
+
Role["USER"] = "user";
|
|
37
|
+
Role["AGENT"] = "agent";
|
|
38
|
+
})(Role || (Role = {}));
|
|
39
|
+
/** A2A v1.0 JSON-RPC method names (canonical PascalCase as in a2a.proto). */
|
|
40
|
+
export const A2A_METHODS = {
|
|
41
|
+
sendMessage: 'SendMessage',
|
|
42
|
+
sendStreamingMessage: 'SendStreamingMessage',
|
|
43
|
+
getTask: 'GetTask',
|
|
44
|
+
listTasks: 'ListTasks',
|
|
45
|
+
cancelTask: 'CancelTask',
|
|
46
|
+
subscribeToTask: 'SubscribeToTask',
|
|
47
|
+
getExtendedAgentCard: 'GetExtendedAgentCard',
|
|
48
|
+
};
|
|
49
|
+
/** JSON-RPC error codes for the A2A binding (spec §error codes). */
|
|
50
|
+
export const A2A_ERROR_CODES = {
|
|
51
|
+
INVALID_REQUEST: -32600,
|
|
52
|
+
METHOD_NOT_FOUND: -32601,
|
|
53
|
+
INVALID_PARAMS: -32602,
|
|
54
|
+
INTERNAL_ERROR: -32603,
|
|
55
|
+
UNAUTHORIZED: -32000,
|
|
56
|
+
TASK_NOT_FOUND: -32001,
|
|
57
|
+
TASK_CANCEL_NOT_ALLOWED: -32002,
|
|
58
|
+
AGENT_CARD_NOT_FOUND: -32004,
|
|
59
|
+
AGENT_CARD_SIGNATURE_INVALID: -32005,
|
|
60
|
+
};
|
|
61
|
+
/** Read a message's text parts as a single string (model-facing convenience). */
|
|
62
|
+
export function partsToText(parts) {
|
|
63
|
+
if (!parts)
|
|
64
|
+
return '';
|
|
65
|
+
return parts
|
|
66
|
+
.map((p) => {
|
|
67
|
+
if ('text' in p && p.text)
|
|
68
|
+
return p.text;
|
|
69
|
+
if ('data' in p && p.data !== undefined)
|
|
70
|
+
return JSON.stringify(p.data);
|
|
71
|
+
if ('file' in p)
|
|
72
|
+
return p.file.uri ?? `[file ${p.file.name ?? p.file.mimeType ?? 'binary'}]`;
|
|
73
|
+
return '';
|
|
74
|
+
})
|
|
75
|
+
.filter(Boolean)
|
|
76
|
+
.join('\n');
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gDAAgD;AAChD,MAAM,CAAN,IAAY,SASX;AATD,WAAY,SAAS;IACnB,oCAAuB,CAAA;IACvB,gCAAmB,CAAA;IACnB,8CAAiC,CAAA;IACjC,4CAA+B,CAAA;IAC/B,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,kCAAqB,CAAA;IACrB,kCAAqB,CAAA;AACvB,CAAC,EATW,SAAS,KAAT,SAAS,QASpB;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAA2B,IAAI,GAAG,CAAC;IAC7D,SAAS,CAAC,SAAS;IACnB,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,QAAQ;IAClB,SAAS,CAAC,QAAQ;CACnB,CAAC,CAAA;AAEF,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAN,IAAY,IAGX;AAHD,WAAY,IAAI;IACd,qBAAa,CAAA;IACb,uBAAe,CAAA;AACjB,CAAC,EAHW,IAAI,KAAJ,IAAI,QAGf;AAwID,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW,EAAE,aAAa;IAC1B,oBAAoB,EAAE,sBAAsB;IAC5C,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;CACpC,CAAA;AAEV,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,YAAY,EAAE,CAAC,KAAK;IACpB,cAAc,EAAE,CAAC,KAAK;IACtB,uBAAuB,EAAE,CAAC,KAAK;IAC/B,oBAAoB,EAAE,CAAC,KAAK;IAC5B,4BAA4B,EAAE,CAAC,KAAK;CAC5B,CAAA;AAEV,iFAAiF;AACjF,MAAM,UAAU,WAAW,CAAC,KAAkC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAA;QACxC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACtE,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG,CAAA;QAC5F,OAAO,EAAE,CAAA;IACX,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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 { type AgentCard, type Part } from '../protocol.ts';
|
|
8
|
+
import type { TaskStore } from './store.ts';
|
|
9
|
+
import type { ExecutorSet } from './executor.ts';
|
|
10
|
+
/** What the policy gate sees for one inbound task. */
|
|
11
|
+
export interface GateInput {
|
|
12
|
+
readonly contextId: string;
|
|
13
|
+
readonly skill: string;
|
|
14
|
+
readonly parts: readonly Part[];
|
|
15
|
+
readonly remotePeerId: string | null;
|
|
16
|
+
}
|
|
17
|
+
export type GateResult = {
|
|
18
|
+
readonly ok: true;
|
|
19
|
+
} | {
|
|
20
|
+
readonly ok: false;
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
};
|
|
23
|
+
/** Observational facts about one inbound JSON-RPC request. */
|
|
24
|
+
export interface InboundFacts {
|
|
25
|
+
readonly method: string;
|
|
26
|
+
readonly source?: string;
|
|
27
|
+
readonly taskIds: readonly string[];
|
|
28
|
+
readonly streaming: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface A2AServerOptions {
|
|
31
|
+
readonly card: AgentCard;
|
|
32
|
+
readonly store: TaskStore;
|
|
33
|
+
readonly executors: ExecutorSet;
|
|
34
|
+
/** Present when inbound bearer auth is configured. */
|
|
35
|
+
readonly authToken?: string;
|
|
36
|
+
/** Policy gate: skill allow-list + the `a2a/inbound-task` waterfall. */
|
|
37
|
+
readonly gate: (input: GateInput) => Promise<GateResult>;
|
|
38
|
+
readonly onInbound?: (facts: InboundFacts) => void;
|
|
39
|
+
readonly onTaskSettled?: (taskId: string) => void;
|
|
40
|
+
}
|
|
41
|
+
/** Structural request the server handles (HTTP adapter fills it). */
|
|
42
|
+
export interface ServerRequest {
|
|
43
|
+
readonly method?: string;
|
|
44
|
+
readonly url?: string;
|
|
45
|
+
readonly headers?: Record<string, string>;
|
|
46
|
+
readonly socket?: {
|
|
47
|
+
readonly remoteAddress?: string;
|
|
48
|
+
readonly remotePort?: number;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface ServerResponseSpec {
|
|
52
|
+
readonly status: number;
|
|
53
|
+
readonly contentType: string;
|
|
54
|
+
readonly body: string;
|
|
55
|
+
readonly headers?: Record<string, string>;
|
|
56
|
+
}
|
|
57
|
+
/** A2A JSON-RPC / SSE server over a structural request. */
|
|
58
|
+
export declare class A2AServer {
|
|
59
|
+
private readonly opts;
|
|
60
|
+
readonly card: AgentCard;
|
|
61
|
+
private readonly listeners;
|
|
62
|
+
private readonly waiters;
|
|
63
|
+
private readonly running;
|
|
64
|
+
constructor(opts: A2AServerOptions);
|
|
65
|
+
/**
|
|
66
|
+
* Abort a running task by control path (facade /a2a task cancel): abort the
|
|
67
|
+
* executor's signal, settle the task CANCELED, and wake stream waiters.
|
|
68
|
+
* @returns false when the task is unknown or already terminal.
|
|
69
|
+
*/
|
|
70
|
+
abort(taskId: string): boolean;
|
|
71
|
+
/** True when the request carries the configured bearer token. */
|
|
72
|
+
authorized(req: ServerRequest): boolean;
|
|
73
|
+
/** Route one inbound HTTP request (GET card, POST JSON-RPC). */
|
|
74
|
+
handle(req: ServerRequest, body: string): Promise<ServerResponseSpec>;
|
|
75
|
+
/**
|
|
76
|
+
* Route one SSE request (SendStreamingMessage / SubscribeToTask). Frames are
|
|
77
|
+
* pushed to `onEvent` as they happen; the caller must have checked
|
|
78
|
+
* `authorized()` before writing 200 headers.
|
|
79
|
+
*/
|
|
80
|
+
handleStream(req: ServerRequest, body: string, onEvent: (frame: string) => void): Promise<{
|
|
81
|
+
readonly status: number;
|
|
82
|
+
readonly headers?: Record<string, string>;
|
|
83
|
+
}>;
|
|
84
|
+
/** Dispatch one JSON-RPC request; throws {code, message} on errors. */
|
|
85
|
+
private dispatch;
|
|
86
|
+
/** Create (or continue) the task record for one message. */
|
|
87
|
+
private ensureTask;
|
|
88
|
+
/** Run one task to a terminal state, emitting status/artifact frames. */
|
|
89
|
+
private runTask;
|
|
90
|
+
/** Build the event sink that folds executor events into store + frames. */
|
|
91
|
+
private eventSink;
|
|
92
|
+
private emit;
|
|
93
|
+
private noteInbound;
|
|
94
|
+
private remotePeerOf;
|
|
95
|
+
private waitTerminal;
|
|
96
|
+
private settle;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=a2a-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-server.d.ts","sourceRoot":"","sources":["../../../src/server/a2a-server.ts"],"names":[],"mappings":"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"}
|