@zhin.js/a2a 1.0.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/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +35 -0
- package/lib/a2a-parts.d.ts +10 -0
- package/lib/a2a-parts.d.ts.map +1 -0
- package/lib/a2a-parts.js +57 -0
- package/lib/a2a-parts.js.map +1 -0
- package/lib/agent-executor.d.ts +16 -0
- package/lib/agent-executor.d.ts.map +1 -0
- package/lib/agent-executor.js +125 -0
- package/lib/agent-executor.js.map +1 -0
- package/lib/auth.d.ts +8 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +20 -0
- package/lib/auth.js.map +1 -0
- package/lib/card-builder.d.ts +8 -0
- package/lib/card-builder.d.ts.map +1 -0
- package/lib/card-builder.js +87 -0
- package/lib/card-builder.js.map +1 -0
- package/lib/config.d.ts +15 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +26 -0
- package/lib/config.js.map +1 -0
- package/lib/http-handlers.d.ts +10 -0
- package/lib/http-handlers.d.ts.map +1 -0
- package/lib/http-handlers.js +183 -0
- package/lib/http-handlers.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +130 -0
- package/lib/index.js.map +1 -0
- package/lib/message-parts.d.ts +7 -0
- package/lib/message-parts.d.ts.map +1 -0
- package/lib/message-parts.js +7 -0
- package/lib/message-parts.js.map +1 -0
- package/lib/rest-transport-handler.d.ts +20 -0
- package/lib/rest-transport-handler.d.ts.map +1 -0
- package/lib/rest-transport-handler.js +65 -0
- package/lib/rest-transport-handler.js.map +1 -0
- package/package.json +67 -0
- package/src/a2a-parts.ts +73 -0
- package/src/agent-executor.ts +160 -0
- package/src/auth.ts +23 -0
- package/src/card-builder.ts +101 -0
- package/src/config.ts +31 -0
- package/src/http-handlers.ts +237 -0
- package/src/index.ts +167 -0
- package/src/message-parts.ts +12 -0
- package/src/rest-transport-handler.ts +81 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 凉菜
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @zhin.js/a2a
|
|
2
|
+
|
|
3
|
+
A2A v1.0 server plugin for Zhin.js — exposes one [Agent Card](https://a2a-protocol.org/v1.0.0/specification) per `ai.agents[]` entry.
|
|
4
|
+
|
|
5
|
+
## Routes
|
|
6
|
+
|
|
7
|
+
| Method | Path |
|
|
8
|
+
|--------|------|
|
|
9
|
+
| GET | `/a2a/{agentName}/.well-known/agent-card.json` |
|
|
10
|
+
| POST | `/a2a/{agentName}/jsonrpc` |
|
|
11
|
+
| * | `/a2a/{agentName}/rest/*` |
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
plugins:
|
|
17
|
+
- "@zhin.js/a2a"
|
|
18
|
+
|
|
19
|
+
http:
|
|
20
|
+
token: ${HTTP_TOKEN}
|
|
21
|
+
publicUrl: https://bot.example.com # recommended behind reverse proxy
|
|
22
|
+
|
|
23
|
+
ai:
|
|
24
|
+
agents:
|
|
25
|
+
zhin:
|
|
26
|
+
provider: ollama
|
|
27
|
+
model: qwen3:8b
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Bearer `http.token` is required for inbound A2A calls (except when token is empty in dev).
|
|
31
|
+
|
|
32
|
+
## Related
|
|
33
|
+
|
|
34
|
+
- [Agent Mesh](../../../docs/advanced/agent-mesh.md)
|
|
35
|
+
- [ADR 0035](../../../docs/adr/0035-a2a-agent-mesh.md)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A v1.0 proto-shaped Part/Message helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type { Part } from '@a2a-js/sdk';
|
|
5
|
+
export declare function textPart(text: string, mediaType?: string): Part;
|
|
6
|
+
export declare function dataPart(data: unknown): Part;
|
|
7
|
+
export declare function partsToPromptText(parts: Part[]): string;
|
|
8
|
+
export declare function agentTextMessage(messageId: string, contextId: string, text: string, taskId?: string): import('@a2a-js/sdk').Message;
|
|
9
|
+
export declare function userTextMessage(messageId: string, contextId: string, parts: Part[], metadata?: Record<string, unknown>): import('@a2a-js/sdk').Message;
|
|
10
|
+
//# sourceMappingURL=a2a-parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-parts.d.ts","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAe,GAAG,IAAI,CAOrE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAO5C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAYvD;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,SAAK,GACV,OAAO,aAAa,EAAE,OAAO,CAW/B;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,aAAa,EAAE,OAAO,CAW/B"}
|
package/lib/a2a-parts.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Role } from '@a2a-js/sdk';
|
|
2
|
+
export function textPart(text, mediaType = 'text/plain') {
|
|
3
|
+
return {
|
|
4
|
+
content: { $case: 'text', value: text },
|
|
5
|
+
metadata: undefined,
|
|
6
|
+
filename: '',
|
|
7
|
+
mediaType,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function dataPart(data) {
|
|
11
|
+
return {
|
|
12
|
+
content: { $case: 'data', value: data },
|
|
13
|
+
metadata: undefined,
|
|
14
|
+
filename: '',
|
|
15
|
+
mediaType: 'application/json',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function partsToPromptText(parts) {
|
|
19
|
+
const lines = [];
|
|
20
|
+
for (const part of parts) {
|
|
21
|
+
if (part.content?.$case === 'text') {
|
|
22
|
+
lines.push(part.content.value);
|
|
23
|
+
}
|
|
24
|
+
else if (part.content?.$case === 'data') {
|
|
25
|
+
lines.push('```json', JSON.stringify(part.content.value, null, 2), '```');
|
|
26
|
+
}
|
|
27
|
+
else if (part.content?.$case === 'url') {
|
|
28
|
+
lines.push(`[file: ${part.content.value}]`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return lines.join('\n').trim();
|
|
32
|
+
}
|
|
33
|
+
export function agentTextMessage(messageId, contextId, text, taskId = '') {
|
|
34
|
+
return {
|
|
35
|
+
messageId,
|
|
36
|
+
contextId,
|
|
37
|
+
taskId,
|
|
38
|
+
role: Role.ROLE_AGENT,
|
|
39
|
+
parts: [textPart(text)],
|
|
40
|
+
metadata: undefined,
|
|
41
|
+
extensions: [],
|
|
42
|
+
referenceTaskIds: [],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function userTextMessage(messageId, contextId, parts, metadata) {
|
|
46
|
+
return {
|
|
47
|
+
messageId,
|
|
48
|
+
contextId,
|
|
49
|
+
taskId: '',
|
|
50
|
+
role: Role.ROLE_USER,
|
|
51
|
+
parts,
|
|
52
|
+
metadata,
|
|
53
|
+
extensions: [],
|
|
54
|
+
referenceTaskIds: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=a2a-parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-parts.js","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,SAAS,GAAG,YAAY;IAC7D,OAAO;QACL,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;QACvC,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,EAAE;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO;QACL,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;QACvC,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,SAAiB,EACjB,IAAY,EACZ,MAAM,GAAG,EAAE;IAEX,OAAO;QACL,SAAS;QACT,SAAS;QACT,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,SAAiB,EACjB,KAAa,EACb,QAAkC;IAElC,OAAO;QACL,SAAS;QACT,SAAS;QACT,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,KAAK;QACL,QAAQ;QACR,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type AgentExecutor, type ExecutionEventBus, type RequestContext } from '@a2a-js/sdk/server';
|
|
2
|
+
import type { ZhinAgent } from '@zhin.js/agent';
|
|
3
|
+
import type { ResolvedAgentBinding } from '@zhin.js/agent/config';
|
|
4
|
+
export interface ZhinA2AExecutorOptions {
|
|
5
|
+
agentName: string;
|
|
6
|
+
getAgent: () => ZhinAgent | null;
|
|
7
|
+
resolveBinding: () => ResolvedAgentBinding | null;
|
|
8
|
+
}
|
|
9
|
+
export declare class ZhinA2AExecutor implements AgentExecutor {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private readonly running;
|
|
12
|
+
constructor(options: ZhinA2AExecutorOptions);
|
|
13
|
+
execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise<void>;
|
|
14
|
+
cancelTask(taskId: string, eventBus: ExecutionEventBus): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=agent-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-executor.d.ts","sourceRoot":"","sources":["../src/agent-executor.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,oBAAoB,GAAG,IAAI,CAAC;CACnD;AAwBD,qBAAa,eAAgB,YAAW,aAAa;IAGvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEhB,OAAO,EAAE,sBAAsB;IAEtD,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+FnF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7E"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZhinA2AExecutor — runs inbound A2A tasks via bound ZhinAgent.
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { TaskState } from '@a2a-js/sdk';
|
|
6
|
+
import { AgentEvent, } from '@a2a-js/sdk/server';
|
|
7
|
+
import { createSyntheticMessage } from '@zhin.js/core';
|
|
8
|
+
import { agentTextMessage, partsToPromptText, textPart } from './a2a-parts.js';
|
|
9
|
+
function outputElementsToText(elements) {
|
|
10
|
+
return elements
|
|
11
|
+
.map((el) => (el.type === 'text' ? el.content || '' : ''))
|
|
12
|
+
.join('\n')
|
|
13
|
+
.trim();
|
|
14
|
+
}
|
|
15
|
+
function initialTask(requestContext, agentName) {
|
|
16
|
+
return {
|
|
17
|
+
id: requestContext.taskId,
|
|
18
|
+
contextId: requestContext.contextId,
|
|
19
|
+
status: {
|
|
20
|
+
state: TaskState.TASK_STATE_WORKING,
|
|
21
|
+
message: undefined,
|
|
22
|
+
timestamp: new Date().toISOString(),
|
|
23
|
+
},
|
|
24
|
+
artifacts: [],
|
|
25
|
+
history: [requestContext.userMessage],
|
|
26
|
+
metadata: { zhinAgent: agentName },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export class ZhinA2AExecutor {
|
|
30
|
+
options;
|
|
31
|
+
running = new Set();
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
}
|
|
35
|
+
async execute(requestContext, eventBus) {
|
|
36
|
+
const agent = this.options.getAgent();
|
|
37
|
+
const binding = this.options.resolveBinding();
|
|
38
|
+
if (!agent || !binding) {
|
|
39
|
+
const failed = {
|
|
40
|
+
...initialTask(requestContext, this.options.agentName),
|
|
41
|
+
status: {
|
|
42
|
+
state: TaskState.TASK_STATE_FAILED,
|
|
43
|
+
message: agentTextMessage(randomUUID(), requestContext.contextId, `Agent "${this.options.agentName}" not ready`, requestContext.taskId),
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
eventBus.publish(AgentEvent.task(failed));
|
|
48
|
+
eventBus.finished();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const task = initialTask(requestContext, this.options.agentName);
|
|
52
|
+
eventBus.publish(AgentEvent.task(task));
|
|
53
|
+
this.running.add(requestContext.taskId);
|
|
54
|
+
const prompt = partsToPromptText(requestContext.userMessage.parts);
|
|
55
|
+
agent.configure({ activeBinding: binding });
|
|
56
|
+
const commMessage = createSyntheticMessage({
|
|
57
|
+
adapter: 'a2a',
|
|
58
|
+
endpoint: this.options.agentName,
|
|
59
|
+
sender: { id: 'a2a-client', isMaster: true },
|
|
60
|
+
channel: { type: 'private', id: requestContext.contextId },
|
|
61
|
+
});
|
|
62
|
+
try {
|
|
63
|
+
const output = await agent.prompt(prompt, commMessage);
|
|
64
|
+
const resultText = outputElementsToText(output)
|
|
65
|
+
|| '(A2A 任务已完成,Agent 未返回文本)';
|
|
66
|
+
eventBus.publish(AgentEvent.artifactUpdate({
|
|
67
|
+
taskId: task.id,
|
|
68
|
+
contextId: task.contextId,
|
|
69
|
+
artifact: {
|
|
70
|
+
artifactId: randomUUID(),
|
|
71
|
+
name: 'result',
|
|
72
|
+
description: '',
|
|
73
|
+
parts: [textPart(resultText)],
|
|
74
|
+
metadata: undefined,
|
|
75
|
+
extensions: [],
|
|
76
|
+
},
|
|
77
|
+
append: false,
|
|
78
|
+
lastChunk: true,
|
|
79
|
+
metadata: undefined,
|
|
80
|
+
}));
|
|
81
|
+
eventBus.publish(AgentEvent.statusUpdate({
|
|
82
|
+
taskId: task.id,
|
|
83
|
+
contextId: task.contextId,
|
|
84
|
+
status: {
|
|
85
|
+
state: TaskState.TASK_STATE_COMPLETED,
|
|
86
|
+
message: agentTextMessage(randomUUID(), requestContext.contextId, resultText, task.id),
|
|
87
|
+
timestamp: new Date().toISOString(),
|
|
88
|
+
},
|
|
89
|
+
metadata: undefined,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
94
|
+
eventBus.publish(AgentEvent.statusUpdate({
|
|
95
|
+
taskId: task.id,
|
|
96
|
+
contextId: task.contextId,
|
|
97
|
+
status: {
|
|
98
|
+
state: TaskState.TASK_STATE_FAILED,
|
|
99
|
+
message: agentTextMessage(randomUUID(), requestContext.contextId, errorText, task.id),
|
|
100
|
+
timestamp: new Date().toISOString(),
|
|
101
|
+
},
|
|
102
|
+
metadata: undefined,
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
this.running.delete(requestContext.taskId);
|
|
107
|
+
eventBus.finished();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async cancelTask(taskId, eventBus) {
|
|
111
|
+
this.running.delete(taskId);
|
|
112
|
+
eventBus.publish(AgentEvent.statusUpdate({
|
|
113
|
+
taskId,
|
|
114
|
+
contextId: '',
|
|
115
|
+
status: {
|
|
116
|
+
state: TaskState.TASK_STATE_CANCELED,
|
|
117
|
+
message: undefined,
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
},
|
|
120
|
+
metadata: undefined,
|
|
121
|
+
}));
|
|
122
|
+
eventBus.finished();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=agent-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../src/agent-executor.ts"],"names":[],"mappings":"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"}
|
package/lib/auth.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bearer auth for A2A HTTP endpoints (reuses MCP mesh-auth timing-safe compare).
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage } from 'node:http';
|
|
5
|
+
export declare function timingSafeEqualString(a: string, b: string): boolean;
|
|
6
|
+
export declare function extractBearerToken(req: IncomingMessage): string;
|
|
7
|
+
export declare function verifyA2aBearer(req: IncomingMessage, expectedToken: string): boolean;
|
|
8
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAG/D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAGpF"}
|
package/lib/auth.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
2
|
+
export function timingSafeEqualString(a, b) {
|
|
3
|
+
if (!a || !b)
|
|
4
|
+
return false;
|
|
5
|
+
const bufA = Buffer.from(a);
|
|
6
|
+
const bufB = Buffer.from(b);
|
|
7
|
+
if (bufA.length !== bufB.length)
|
|
8
|
+
return false;
|
|
9
|
+
return timingSafeEqual(bufA, bufB);
|
|
10
|
+
}
|
|
11
|
+
export function extractBearerToken(req) {
|
|
12
|
+
const auth = req.headers.authorization ?? '';
|
|
13
|
+
return auth.startsWith('Bearer ') ? auth.slice(7) : '';
|
|
14
|
+
}
|
|
15
|
+
export function verifyA2aBearer(req, expectedToken) {
|
|
16
|
+
if (!expectedToken)
|
|
17
|
+
return false;
|
|
18
|
+
return timingSafeEqualString(expectedToken, extractBearerToken(req));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=auth.js.map
|
package/lib/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,CAAS,EAAE,CAAS;IACxD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAoB;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAoB,EAAE,aAAqB;IACzE,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,qBAAqB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build A2A AgentCard per ai.agents binding.
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentCard } from '@a2a-js/sdk';
|
|
5
|
+
import type { AgentBindingRegistry } from '@zhin.js/agent/config';
|
|
6
|
+
export declare function buildAgentCardForBinding(agentName: string, registry: AgentBindingRegistry, publicBaseUrl: string): AgentCard | null;
|
|
7
|
+
export declare function listExposableAgentNames(registry: AgentBindingRegistry): string[];
|
|
8
|
+
//# sourceMappingURL=card-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAuBlE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,IAAI,CAgElB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAEhF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { A2A_PROTOCOL_VERSION } from '@a2a-js/sdk';
|
|
2
|
+
import { a2aAgentCardUrl, a2aJsonRpcUrl, a2aRestUrl } from './config.js';
|
|
3
|
+
function makeSkill(partial) {
|
|
4
|
+
return {
|
|
5
|
+
...partial,
|
|
6
|
+
tags: partial.tags ?? [],
|
|
7
|
+
examples: [],
|
|
8
|
+
inputModes: ['text/plain'],
|
|
9
|
+
outputModes: ['text/plain'],
|
|
10
|
+
securityRequirements: [{ schemes: { bearer: { list: [] } } }],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const DEFAULT_SKILLS = [
|
|
14
|
+
makeSkill({
|
|
15
|
+
id: 'delegate',
|
|
16
|
+
name: 'Delegate Task',
|
|
17
|
+
description: 'Accept structured task delegation via A2A Send Message',
|
|
18
|
+
tags: ['orchestration', 'delegate'],
|
|
19
|
+
}),
|
|
20
|
+
];
|
|
21
|
+
export function buildAgentCardForBinding(agentName, registry, publicBaseUrl) {
|
|
22
|
+
const binding = registry.getBinding(agentName);
|
|
23
|
+
if (!binding)
|
|
24
|
+
return null;
|
|
25
|
+
const nickname = binding.nickname ?? agentName;
|
|
26
|
+
const jsonRpcUrl = a2aJsonRpcUrl(publicBaseUrl, agentName);
|
|
27
|
+
const restUrl = a2aRestUrl(publicBaseUrl, agentName);
|
|
28
|
+
const skills = [
|
|
29
|
+
makeSkill({
|
|
30
|
+
id: agentName,
|
|
31
|
+
name: nickname,
|
|
32
|
+
description: `Zhin agent "${agentName}" (${binding.providerAlias}/${binding.model})`,
|
|
33
|
+
tags: ['zhin', agentName],
|
|
34
|
+
}),
|
|
35
|
+
...DEFAULT_SKILLS,
|
|
36
|
+
];
|
|
37
|
+
return {
|
|
38
|
+
name: nickname,
|
|
39
|
+
description: `Zhin.js A2A agent "${agentName}" — provider ${binding.providerAlias}, model ${binding.model}`,
|
|
40
|
+
version: '1.0.0',
|
|
41
|
+
supportedInterfaces: [
|
|
42
|
+
{
|
|
43
|
+
url: jsonRpcUrl,
|
|
44
|
+
protocolBinding: 'JSONRPC',
|
|
45
|
+
protocolVersion: A2A_PROTOCOL_VERSION,
|
|
46
|
+
tenant: '',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
url: restUrl,
|
|
50
|
+
protocolBinding: 'HTTP+JSON',
|
|
51
|
+
protocolVersion: A2A_PROTOCOL_VERSION,
|
|
52
|
+
tenant: '',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
provider: {
|
|
56
|
+
organization: 'Zhin.js',
|
|
57
|
+
url: 'https://github.com/zhinjs/zhin',
|
|
58
|
+
},
|
|
59
|
+
capabilities: {
|
|
60
|
+
streaming: true,
|
|
61
|
+
pushNotifications: false,
|
|
62
|
+
extensions: [],
|
|
63
|
+
},
|
|
64
|
+
securitySchemes: {
|
|
65
|
+
bearer: {
|
|
66
|
+
scheme: {
|
|
67
|
+
$case: 'httpAuthSecurityScheme',
|
|
68
|
+
value: {
|
|
69
|
+
description: 'Bearer token (http.token)',
|
|
70
|
+
scheme: 'Bearer',
|
|
71
|
+
bearerFormat: '',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
securityRequirements: [{ schemes: { bearer: { list: [] } } }],
|
|
77
|
+
defaultInputModes: ['text/plain', 'application/json'],
|
|
78
|
+
defaultOutputModes: ['text/plain'],
|
|
79
|
+
skills,
|
|
80
|
+
signatures: [],
|
|
81
|
+
documentationUrl: a2aAgentCardUrl(publicBaseUrl, agentName),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function listExposableAgentNames(registry) {
|
|
85
|
+
return registry.listAgentNames();
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=card-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build public base URL for Agent Card interfaces.
|
|
3
|
+
*/
|
|
4
|
+
export declare function resolvePublicBaseUrl(config: {
|
|
5
|
+
http?: {
|
|
6
|
+
host?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
publicUrl?: string;
|
|
9
|
+
};
|
|
10
|
+
}): string;
|
|
11
|
+
export declare function a2aAgentBasePath(agentName: string): string;
|
|
12
|
+
export declare function a2aJsonRpcUrl(publicBase: string, agentName: string): string;
|
|
13
|
+
export declare function a2aRestUrl(publicBase: string, agentName: string): string;
|
|
14
|
+
export declare function a2aAgentCardUrl(publicBase: string, agentName: string): string;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,GAAG,MAAM,CAST;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build public base URL for Agent Card interfaces.
|
|
3
|
+
*/
|
|
4
|
+
export function resolvePublicBaseUrl(config) {
|
|
5
|
+
const http = config.http ?? {};
|
|
6
|
+
if (http.publicUrl?.trim()) {
|
|
7
|
+
return http.publicUrl.trim().replace(/\/$/, '');
|
|
8
|
+
}
|
|
9
|
+
const host = http.host?.trim() || '127.0.0.1';
|
|
10
|
+
const port = http.port ?? 8086;
|
|
11
|
+
const hostname = host === '0.0.0.0' ? '127.0.0.1' : host;
|
|
12
|
+
return `http://${hostname}:${port}`;
|
|
13
|
+
}
|
|
14
|
+
export function a2aAgentBasePath(agentName) {
|
|
15
|
+
return `/a2a/${encodeURIComponent(agentName)}`;
|
|
16
|
+
}
|
|
17
|
+
export function a2aJsonRpcUrl(publicBase, agentName) {
|
|
18
|
+
return `${publicBase}${a2aAgentBasePath(agentName)}/jsonrpc`;
|
|
19
|
+
}
|
|
20
|
+
export function a2aRestUrl(publicBase, agentName) {
|
|
21
|
+
return `${publicBase}${a2aAgentBasePath(agentName)}/rest`;
|
|
22
|
+
}
|
|
23
|
+
export function a2aAgentCardUrl(publicBase, agentName) {
|
|
24
|
+
return `${publicBase}${a2aAgentBasePath(agentName)}/.well-known/agent-card.json`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAEpC;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,OAAO,UAAU,QAAQ,IAAI,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,QAAQ,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,SAAiB;IACjE,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,SAAiB;IAC9D,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,SAAiB;IACnE,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,8BAA8B,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP handlers for A2A JSON-RPC, REST, and Agent Card (Node http — no Express).
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
import type { A2ARequestHandler } from '@a2a-js/sdk/server';
|
|
6
|
+
export declare function handleAgentCard(req: IncomingMessage, res: ServerResponse, requestHandler: A2ARequestHandler): Promise<void>;
|
|
7
|
+
export declare function handleJsonRpc(req: IncomingMessage, res: ServerResponse, requestHandler: A2ARequestHandler, preParsedBody?: unknown): Promise<void>;
|
|
8
|
+
export declare function handleRest(req: IncomingMessage, res: ServerResponse, requestHandler: A2ARequestHandler, subPath: string, preParsedBody?: unknown): Promise<void>;
|
|
9
|
+
export declare function handleRestStreamError(res: ServerResponse, err: unknown, requestId: unknown): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=http-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-handlers.d.ts","sourceRoot":"","sources":["../src/http-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAcjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+C5D,wBAAsB,eAAe,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,iBAAiB,GAChC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,iBAAiB,EACjC,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,iBAAiB,EACjC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC,CAiEf;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf"}
|