@zhin.js/a2a 3.0.8 → 3.0.10
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 +37 -0
- package/lib/agent-executor.d.ts +2 -4
- package/lib/agent-executor.d.ts.map +1 -1
- package/lib/agent-executor.js +35 -14
- package/lib/agent-executor.js.map +1 -1
- package/lib/card-builder.d.ts +2 -3
- package/lib/card-builder.d.ts.map +1 -1
- package/lib/card-builder.js +2 -7
- package/lib/card-builder.js.map +1 -1
- package/lib/runtime.d.ts.map +1 -1
- package/lib/runtime.js +5 -10
- package/lib/runtime.js.map +1 -1
- package/package.json +9 -9
- package/src/agent-executor.ts +47 -21
- package/src/card-builder.ts +4 -11
- package/src/runtime.ts +5 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# @zhin.js/a2a
|
|
2
2
|
|
|
3
|
+
## 3.0.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [e4757a8]
|
|
8
|
+
- Updated dependencies [c3c0ebf]
|
|
9
|
+
- @zhin.js/agent@1.1.10
|
|
10
|
+
- @zhin.js/core@1.5.9
|
|
11
|
+
- zhin.js@6.0.9
|
|
12
|
+
|
|
13
|
+
## 3.0.9
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 6fb24dd: Replace the concrete `AIService` and `ZhinAgent` escape hatches on `AgentHostPort`
|
|
18
|
+
with a canonical protocol port that lists immutable Agent bindings and executes
|
|
19
|
+
`TurnRequest`s. `AgentRuntime` selections now require the immutable binding for
|
|
20
|
+
the turn so provider/model state remains isolated across concurrent requests.
|
|
21
|
+
|
|
22
|
+
Route A2A tasks through the canonical Agent runtime without synthetic IM
|
|
23
|
+
messages or shared `agent.configure()` mutation. A2A callers now enter as a
|
|
24
|
+
fail-closed `user` principal, cancellation propagates through the turn
|
|
25
|
+
`AbortSignal`, and task completion continues to project through the A2A event
|
|
26
|
+
bus.
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [63253bb]
|
|
29
|
+
- Updated dependencies [6fb24dd]
|
|
30
|
+
- Updated dependencies [d162216]
|
|
31
|
+
- Updated dependencies [7427818]
|
|
32
|
+
- Updated dependencies [90da255]
|
|
33
|
+
- Updated dependencies [8e973dc]
|
|
34
|
+
- Updated dependencies [953cfe1]
|
|
35
|
+
- Updated dependencies [0e73866]
|
|
36
|
+
- @zhin.js/core@1.5.8
|
|
37
|
+
- @zhin.js/agent@1.1.9
|
|
38
|
+
- zhin.js@6.0.8
|
|
39
|
+
|
|
3
40
|
## 3.0.8
|
|
4
41
|
|
|
5
42
|
### Patch Changes
|
package/lib/agent-executor.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { type AgentExecutor, type ExecutionEventBus, type RequestContext } from '@a2a-js/sdk/server';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ResolvedAgentBinding } from '@zhin.js/agent/config';
|
|
2
|
+
import type { AgentHostProtocolPort } from '@zhin.js/agent/runtime';
|
|
4
3
|
export interface ZhinA2AExecutorOptions {
|
|
5
4
|
agentName: string;
|
|
6
|
-
|
|
7
|
-
resolveBinding: () => ResolvedAgentBinding | null;
|
|
5
|
+
protocol: AgentHostProtocolPort;
|
|
8
6
|
}
|
|
9
7
|
export declare class ZhinA2AExecutor implements AgentExecutor {
|
|
10
8
|
private readonly options;
|
|
@@ -1 +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;
|
|
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;AAC5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAIpE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AA0BD,qBAAa,eAAgB,YAAW,aAAa;IAGvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAEjC,OAAO,EAAE,sBAAsB;IAEtD,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgGnF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAe7E"}
|
package/lib/agent-executor.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { TaskState } from '@a2a-js/sdk';
|
|
6
6
|
import { AgentEvent, } from '@a2a-js/sdk/server';
|
|
7
|
-
import { createSyntheticMessage } from '@zhin.js/core';
|
|
8
7
|
import { agentTextMessage, partsToPromptText, textPart } from './a2a-parts.js';
|
|
9
8
|
function outputElementsToText(elements) {
|
|
10
9
|
return elements
|
|
@@ -28,14 +27,14 @@ function initialTask(requestContext, agentName) {
|
|
|
28
27
|
}
|
|
29
28
|
export class ZhinA2AExecutor {
|
|
30
29
|
options;
|
|
31
|
-
running = new
|
|
30
|
+
running = new Map();
|
|
32
31
|
constructor(options) {
|
|
33
32
|
this.options = options;
|
|
34
33
|
}
|
|
35
34
|
async execute(requestContext, eventBus) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
if (!
|
|
35
|
+
const binding = this.options.protocol.listBindings()
|
|
36
|
+
.find((entry) => entry.name === this.options.agentName);
|
|
37
|
+
if (!binding) {
|
|
39
38
|
const failed = {
|
|
40
39
|
...initialTask(requestContext, this.options.agentName),
|
|
41
40
|
status: {
|
|
@@ -50,17 +49,12 @@ export class ZhinA2AExecutor {
|
|
|
50
49
|
}
|
|
51
50
|
const task = initialTask(requestContext, this.options.agentName);
|
|
52
51
|
eventBus.publish(AgentEvent.task(task));
|
|
53
|
-
|
|
52
|
+
const abort = new AbortController();
|
|
53
|
+
this.running.set(requestContext.taskId, abort);
|
|
54
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
55
|
try {
|
|
63
|
-
const
|
|
56
|
+
const outcome = await this.options.protocol.execute(this.options.agentName, createA2aTurnRequest(requestContext, prompt, abort.signal));
|
|
57
|
+
const output = completedOutput(outcome);
|
|
64
58
|
const resultText = outputElementsToText(output)
|
|
65
59
|
|| '(A2A 任务已完成,Agent 未返回文本)';
|
|
66
60
|
eventBus.publish(AgentEvent.artifactUpdate({
|
|
@@ -90,6 +84,11 @@ export class ZhinA2AExecutor {
|
|
|
90
84
|
}));
|
|
91
85
|
}
|
|
92
86
|
catch (err) {
|
|
87
|
+
// cancelTask owns the A2A cancelled terminal. The canonical turn still
|
|
88
|
+
// settles under the same AbortSignal, but must not publish a second
|
|
89
|
+
// failed terminal after cancellation.
|
|
90
|
+
if (abort.signal.aborted)
|
|
91
|
+
return;
|
|
93
92
|
const errorText = err instanceof Error ? err.message : String(err);
|
|
94
93
|
eventBus.publish(AgentEvent.statusUpdate({
|
|
95
94
|
taskId: task.id,
|
|
@@ -108,6 +107,7 @@ export class ZhinA2AExecutor {
|
|
|
108
107
|
}
|
|
109
108
|
}
|
|
110
109
|
async cancelTask(taskId, eventBus) {
|
|
110
|
+
this.running.get(taskId)?.abort(new Error(`A2A task cancelled: ${taskId}`));
|
|
111
111
|
this.running.delete(taskId);
|
|
112
112
|
eventBus.publish(AgentEvent.statusUpdate({
|
|
113
113
|
taskId,
|
|
@@ -122,4 +122,25 @@ export class ZhinA2AExecutor {
|
|
|
122
122
|
eventBus.finished();
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
|
+
function createA2aTurnRequest(context, text, signal) {
|
|
126
|
+
return Object.freeze({
|
|
127
|
+
identity: Object.freeze({ traceId: context.taskId, turnId: randomUUID() }),
|
|
128
|
+
origin: Object.freeze({ kind: 'a2a', taskId: context.taskId }),
|
|
129
|
+
principal: Object.freeze({ subjectId: 'a2a-client', roles: Object.freeze(['user']) }),
|
|
130
|
+
input: Object.freeze({ text }),
|
|
131
|
+
session: Object.freeze({ key: `a2a:${context.contextId}` }),
|
|
132
|
+
policy: Object.freeze({ permissions: Object.freeze(['user']), unattended: true }),
|
|
133
|
+
signal,
|
|
134
|
+
ports: Object.freeze({}),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function completedOutput(outcome) {
|
|
138
|
+
if (outcome.status === 'completed')
|
|
139
|
+
return outcome.output;
|
|
140
|
+
if (outcome.status === 'failed')
|
|
141
|
+
throw new Error(outcome.error.message);
|
|
142
|
+
if (outcome.status === 'cancelled')
|
|
143
|
+
throw new Error(outcome.reason);
|
|
144
|
+
throw new Error(`Agent budget exceeded: ${outcome.budget}`);
|
|
145
|
+
}
|
|
125
146
|
//# sourceMappingURL=agent-executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../src/agent-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,UAAU,GAIX,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../src/agent-executor.ts"],"names":[],"mappings":"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"}
|
package/lib/card-builder.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Build A2A AgentCard per ai.agents binding.
|
|
3
3
|
*/
|
|
4
4
|
import { type AgentCard } from '@a2a-js/sdk';
|
|
5
|
-
import type {
|
|
6
|
-
export declare function buildAgentCardForBinding(
|
|
7
|
-
export declare function listExposableAgentNames(registry: AgentBindingRegistry): string[];
|
|
5
|
+
import type { ResolvedAgentBinding } from '@zhin.js/agent/config';
|
|
6
|
+
export declare function buildAgentCardForBinding(binding: ResolvedAgentBinding, publicBaseUrl: string, basePath?: string): AgentCard;
|
|
8
7
|
//# sourceMappingURL=card-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAwB,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAuBlE,wBAAgB,wBAAwB,CACtC,
|
|
1
|
+
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAwB,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAuBlE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAS,GAChB,SAAS,CAqEX"}
|
package/lib/card-builder.js
CHANGED
|
@@ -21,10 +21,8 @@ const DEFAULT_SKILLS = [
|
|
|
21
21
|
tags: ['orchestration', 'delegate'],
|
|
22
22
|
}),
|
|
23
23
|
];
|
|
24
|
-
export function buildAgentCardForBinding(
|
|
25
|
-
const
|
|
26
|
-
if (!binding)
|
|
27
|
-
return null;
|
|
24
|
+
export function buildAgentCardForBinding(binding, publicBaseUrl, basePath = '/a2a') {
|
|
25
|
+
const agentName = binding.name;
|
|
28
26
|
const nickname = binding.nickname ?? agentName;
|
|
29
27
|
const normalizedBasePath = basePath === '/a2a' ? undefined : basePath;
|
|
30
28
|
const jsonRpcUrl = normalizedBasePath
|
|
@@ -91,7 +89,4 @@ export function buildAgentCardForBinding(agentName, registry, publicBaseUrl, bas
|
|
|
91
89
|
: a2aAgentCardUrl(publicBaseUrl, agentName),
|
|
92
90
|
};
|
|
93
91
|
}
|
|
94
|
-
export function listExposableAgentNames(registry) {
|
|
95
|
-
return registry.listAgentNames();
|
|
96
|
-
}
|
|
97
92
|
//# sourceMappingURL=card-builder.js.map
|
package/lib/card-builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAmC,MAAM,aAAa,CAAC;AAGpF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzE,SAAS,SAAS,CAAC,OAA8E;IAC/F,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1B,WAAW,EAAE,CAAC,YAAY,CAAC;QAC3B,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAiB;IACnC,SAAS,CAAC;QACR,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wDAAwD;QACrE,IAAI,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC;KACpC,CAAC;CACH,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,
|
|
1
|
+
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"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"}
|
package/lib/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAM5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAOD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,IAAI,CAmD/E"}
|
package/lib/runtime.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DefaultRequestHandler, InMemoryTaskStore, } from '@a2a-js/sdk/server';
|
|
2
2
|
import { AGENT_CARD_PATH } from '@a2a-js/sdk';
|
|
3
|
-
import { buildAgentCardForBinding
|
|
3
|
+
import { buildAgentCardForBinding } from './card-builder.js';
|
|
4
4
|
import { ZhinA2AExecutor } from './agent-executor.js';
|
|
5
5
|
import { handleAgentCard, handleJsonRpc, handleRest } from './http-handlers.js';
|
|
6
6
|
import { verifyA2aBearer } from './auth.js';
|
|
@@ -14,18 +14,13 @@ export function installRuntimeA2a(options) {
|
|
|
14
14
|
if (options.production === true && !token) {
|
|
15
15
|
throw new Error('A2A requires a2a.token or http.token in production');
|
|
16
16
|
}
|
|
17
|
-
const service = options.agentHost.service;
|
|
18
|
-
const agent = options.agentHost.agent;
|
|
19
|
-
const registry = service.getBindingRegistry();
|
|
20
17
|
const stacks = new Map();
|
|
21
|
-
for (const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
continue;
|
|
18
|
+
for (const binding of options.agentHost.protocol.listBindings()) {
|
|
19
|
+
const agentName = binding.name;
|
|
20
|
+
const card = buildAgentCardForBinding(binding, publicBaseUrl, basePath);
|
|
25
21
|
const executor = new ZhinA2AExecutor({
|
|
26
22
|
agentName,
|
|
27
|
-
|
|
28
|
-
resolveBinding: () => registry.getBinding(agentName),
|
|
23
|
+
protocol: options.agentHost.protocol,
|
|
29
24
|
});
|
|
30
25
|
stacks.set(agentName, {
|
|
31
26
|
card,
|
package/lib/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/a2a",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.10",
|
|
4
4
|
"description": "A2A Protocol server for Zhin.js — multi-agent Agent Cards and task delegation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -36,21 +36,21 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@a2a-js/sdk": "1.0.0-beta.0",
|
|
39
|
-
"@zhin.js/core": "1.5.
|
|
40
|
-
"@zhin.js/
|
|
41
|
-
"@zhin.js/
|
|
39
|
+
"@zhin.js/core": "1.5.9",
|
|
40
|
+
"@zhin.js/logger": "1.0.76",
|
|
41
|
+
"@zhin.js/host-http-contract": "1.0.1"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@zhin.js/agent": "1.1.
|
|
45
|
-
"zhin.js": "6.0.
|
|
44
|
+
"@zhin.js/agent": "1.1.10",
|
|
45
|
+
"zhin.js": "6.0.9"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^26.1.2",
|
|
49
49
|
"rimraf": "^6.1.3",
|
|
50
50
|
"typescript": "^6.0.3",
|
|
51
|
-
"@zhin.js/agent": "1.1.
|
|
52
|
-
"@zhin.js/host-http": "1.0.
|
|
53
|
-
"zhin.js": "6.0.
|
|
51
|
+
"@zhin.js/agent": "1.1.10",
|
|
52
|
+
"@zhin.js/host-http": "1.0.10",
|
|
53
|
+
"zhin.js": "6.0.9"
|
|
54
54
|
},
|
|
55
55
|
"files": [
|
|
56
56
|
"src",
|
package/src/agent-executor.ts
CHANGED
|
@@ -10,18 +10,18 @@ import {
|
|
|
10
10
|
type ExecutionEventBus,
|
|
11
11
|
type RequestContext,
|
|
12
12
|
} from '@a2a-js/sdk/server';
|
|
13
|
-
import {
|
|
14
|
-
import type {
|
|
15
|
-
import type { ResolvedAgentBinding } from '@zhin.js/agent/config';
|
|
13
|
+
import type { AgentHostProtocolPort } from '@zhin.js/agent/runtime';
|
|
14
|
+
import type { TurnOutcome, TurnRequest } from '@zhin.js/agent/turn';
|
|
16
15
|
import { agentTextMessage, partsToPromptText, textPart } from './a2a-parts.js';
|
|
17
16
|
|
|
18
17
|
export interface ZhinA2AExecutorOptions {
|
|
19
18
|
agentName: string;
|
|
20
|
-
|
|
21
|
-
resolveBinding: () => ResolvedAgentBinding | null;
|
|
19
|
+
protocol: AgentHostProtocolPort;
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
|
|
22
|
+
type TurnOutputElement = Extract<TurnOutcome, { status: 'completed' }>['output'][number];
|
|
23
|
+
|
|
24
|
+
function outputElementsToText(elements: readonly TurnOutputElement[]): string {
|
|
25
25
|
return elements
|
|
26
26
|
.map((el) => (el.type === 'text' ? el.content || '' : ''))
|
|
27
27
|
.join('\n')
|
|
@@ -44,14 +44,14 @@ function initialTask(requestContext: RequestContext, agentName: string): Task {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
export class ZhinA2AExecutor implements AgentExecutor {
|
|
47
|
-
private readonly running = new
|
|
47
|
+
private readonly running = new Map<string, AbortController>();
|
|
48
48
|
|
|
49
49
|
constructor(private readonly options: ZhinA2AExecutorOptions) {}
|
|
50
50
|
|
|
51
51
|
async execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise<void> {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
if (!
|
|
52
|
+
const binding = this.options.protocol.listBindings()
|
|
53
|
+
.find((entry) => entry.name === this.options.agentName);
|
|
54
|
+
if (!binding) {
|
|
55
55
|
const failed: Task = {
|
|
56
56
|
...initialTask(requestContext, this.options.agentName),
|
|
57
57
|
status: {
|
|
@@ -72,21 +72,18 @@ export class ZhinA2AExecutor implements AgentExecutor {
|
|
|
72
72
|
|
|
73
73
|
const task = initialTask(requestContext, this.options.agentName);
|
|
74
74
|
eventBus.publish(AgentEvent.task(task));
|
|
75
|
-
|
|
75
|
+
const abort = new AbortController();
|
|
76
|
+
this.running.set(requestContext.taskId, abort);
|
|
76
77
|
|
|
77
78
|
const prompt = partsToPromptText(requestContext.userMessage.parts);
|
|
78
|
-
agent.configure({ activeBinding: binding });
|
|
79
|
-
|
|
80
|
-
const commMessage = createSyntheticMessage({
|
|
81
|
-
adapter: 'a2a',
|
|
82
|
-
endpoint: this.options.agentName,
|
|
83
|
-
sender: { id: 'a2a-client', isMaster: true },
|
|
84
|
-
channel: { type: 'private', id: requestContext.contextId },
|
|
85
|
-
});
|
|
86
79
|
|
|
87
80
|
try {
|
|
88
|
-
const
|
|
89
|
-
|
|
81
|
+
const outcome = await this.options.protocol.execute(
|
|
82
|
+
this.options.agentName,
|
|
83
|
+
createA2aTurnRequest(requestContext, prompt, abort.signal),
|
|
84
|
+
);
|
|
85
|
+
const output = completedOutput(outcome);
|
|
86
|
+
const resultText = outputElementsToText(output)
|
|
90
87
|
|| '(A2A 任务已完成,Agent 未返回文本)';
|
|
91
88
|
|
|
92
89
|
eventBus.publish(AgentEvent.artifactUpdate({
|
|
@@ -121,6 +118,10 @@ export class ZhinA2AExecutor implements AgentExecutor {
|
|
|
121
118
|
metadata: undefined,
|
|
122
119
|
}));
|
|
123
120
|
} catch (err) {
|
|
121
|
+
// cancelTask owns the A2A cancelled terminal. The canonical turn still
|
|
122
|
+
// settles under the same AbortSignal, but must not publish a second
|
|
123
|
+
// failed terminal after cancellation.
|
|
124
|
+
if (abort.signal.aborted) return;
|
|
124
125
|
const errorText = err instanceof Error ? err.message : String(err);
|
|
125
126
|
eventBus.publish(AgentEvent.statusUpdate({
|
|
126
127
|
taskId: task.id,
|
|
@@ -144,6 +145,7 @@ export class ZhinA2AExecutor implements AgentExecutor {
|
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
async cancelTask(taskId: string, eventBus: ExecutionEventBus): Promise<void> {
|
|
148
|
+
this.running.get(taskId)?.abort(new Error(`A2A task cancelled: ${taskId}`));
|
|
147
149
|
this.running.delete(taskId);
|
|
148
150
|
eventBus.publish(AgentEvent.statusUpdate({
|
|
149
151
|
taskId,
|
|
@@ -158,3 +160,27 @@ export class ZhinA2AExecutor implements AgentExecutor {
|
|
|
158
160
|
eventBus.finished();
|
|
159
161
|
}
|
|
160
162
|
}
|
|
163
|
+
|
|
164
|
+
function createA2aTurnRequest(
|
|
165
|
+
context: RequestContext,
|
|
166
|
+
text: string,
|
|
167
|
+
signal: AbortSignal,
|
|
168
|
+
): TurnRequest {
|
|
169
|
+
return Object.freeze({
|
|
170
|
+
identity: Object.freeze({ traceId: context.taskId, turnId: randomUUID() }),
|
|
171
|
+
origin: Object.freeze({ kind: 'a2a' as const, taskId: context.taskId }),
|
|
172
|
+
principal: Object.freeze({ subjectId: 'a2a-client', roles: Object.freeze(['user']) }),
|
|
173
|
+
input: Object.freeze({ text }),
|
|
174
|
+
session: Object.freeze({ key: `a2a:${context.contextId}` }),
|
|
175
|
+
policy: Object.freeze({ permissions: Object.freeze(['user']), unattended: true }),
|
|
176
|
+
signal,
|
|
177
|
+
ports: Object.freeze({}),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function completedOutput(outcome: TurnOutcome): readonly TurnOutputElement[] {
|
|
182
|
+
if (outcome.status === 'completed') return outcome.output;
|
|
183
|
+
if (outcome.status === 'failed') throw new Error(outcome.error.message);
|
|
184
|
+
if (outcome.status === 'cancelled') throw new Error(outcome.reason);
|
|
185
|
+
throw new Error(`Agent budget exceeded: ${outcome.budget}`);
|
|
186
|
+
}
|
package/src/card-builder.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { A2A_PROTOCOL_VERSION, type AgentCard, type AgentSkill } from '@a2a-js/sdk';
|
|
5
5
|
|
|
6
|
-
import type {
|
|
6
|
+
import type { ResolvedAgentBinding } from '@zhin.js/agent/config';
|
|
7
7
|
import { a2aAgentCardUrl, a2aJsonRpcUrl, a2aRestUrl } from './config.js';
|
|
8
8
|
|
|
9
9
|
function makeSkill(partial: Pick<AgentSkill, 'id' | 'name' | 'description'> & { tags?: string[] }): AgentSkill {
|
|
@@ -27,14 +27,11 @@ const DEFAULT_SKILLS: AgentSkill[] = [
|
|
|
27
27
|
];
|
|
28
28
|
|
|
29
29
|
export function buildAgentCardForBinding(
|
|
30
|
-
|
|
31
|
-
registry: AgentBindingRegistry,
|
|
30
|
+
binding: ResolvedAgentBinding,
|
|
32
31
|
publicBaseUrl: string,
|
|
33
32
|
basePath = '/a2a',
|
|
34
|
-
): AgentCard
|
|
35
|
-
const
|
|
36
|
-
if (!binding) return null;
|
|
37
|
-
|
|
33
|
+
): AgentCard {
|
|
34
|
+
const agentName = binding.name;
|
|
38
35
|
const nickname = binding.nickname ?? agentName;
|
|
39
36
|
const normalizedBasePath = basePath === '/a2a' ? undefined : basePath;
|
|
40
37
|
const jsonRpcUrl = normalizedBasePath
|
|
@@ -103,7 +100,3 @@ export function buildAgentCardForBinding(
|
|
|
103
100
|
: a2aAgentCardUrl(publicBaseUrl, agentName),
|
|
104
101
|
};
|
|
105
102
|
}
|
|
106
|
-
|
|
107
|
-
export function listExposableAgentNames(registry: AgentBindingRegistry): string[] {
|
|
108
|
-
return registry.listAgentNames();
|
|
109
|
-
}
|
package/src/runtime.ts
CHANGED
|
@@ -6,9 +6,7 @@ import {
|
|
|
6
6
|
import { AGENT_CARD_PATH, type AgentCard } from '@a2a-js/sdk';
|
|
7
7
|
import type { HttpRouteHost } from '@zhin.js/host-http-contract';
|
|
8
8
|
import type { AgentHostPort } from '@zhin.js/agent/runtime';
|
|
9
|
-
import
|
|
10
|
-
import type { AgentBindingRegistry } from '@zhin.js/agent/config';
|
|
11
|
-
import { buildAgentCardForBinding, listExposableAgentNames } from './card-builder.js';
|
|
9
|
+
import { buildAgentCardForBinding } from './card-builder.js';
|
|
12
10
|
import { ZhinA2AExecutor } from './agent-executor.js';
|
|
13
11
|
import { handleAgentCard, handleJsonRpc, handleRest } from './http-handlers.js';
|
|
14
12
|
import { verifyA2aBearer } from './auth.js';
|
|
@@ -43,20 +41,14 @@ export function installRuntimeA2a(options: InstallRuntimeA2aOptions): () => void
|
|
|
43
41
|
if (options.production === true && !token) {
|
|
44
42
|
throw new Error('A2A requires a2a.token or http.token in production');
|
|
45
43
|
}
|
|
46
|
-
const service = options.agentHost.service as {
|
|
47
|
-
getBindingRegistry(): AgentBindingRegistry;
|
|
48
|
-
};
|
|
49
|
-
const agent = options.agentHost.agent as ZhinAgent;
|
|
50
|
-
const registry = service.getBindingRegistry();
|
|
51
44
|
const stacks = new Map<string, AgentStack>();
|
|
52
45
|
|
|
53
|
-
for (const
|
|
54
|
-
const
|
|
55
|
-
|
|
46
|
+
for (const binding of options.agentHost.protocol.listBindings()) {
|
|
47
|
+
const agentName = binding.name;
|
|
48
|
+
const card = buildAgentCardForBinding(binding, publicBaseUrl, basePath);
|
|
56
49
|
const executor = new ZhinA2AExecutor({
|
|
57
50
|
agentName,
|
|
58
|
-
|
|
59
|
-
resolveBinding: () => registry.getBinding(agentName),
|
|
51
|
+
protocol: options.agentHost.protocol,
|
|
60
52
|
});
|
|
61
53
|
stacks.set(agentName, {
|
|
62
54
|
card,
|