@zhin.js/a2a 1.0.1 → 1.0.3
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 +44 -0
- package/lib/a2a-parts.d.ts +1 -1
- package/lib/a2a-parts.d.ts.map +1 -1
- package/lib/a2a-parts.js +3 -0
- package/lib/a2a-parts.js.map +1 -1
- package/lib/agent-executor.js.map +1 -1
- package/lib/card-builder.d.ts +2 -2
- package/lib/card-builder.d.ts.map +1 -1
- package/lib/card-builder.js +14 -4
- package/lib/card-builder.js.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/rest-transport-handler.d.ts +2 -3
- package/lib/rest-transport-handler.d.ts.map +1 -1
- package/lib/rest-transport-handler.js +4 -1
- package/lib/rest-transport-handler.js.map +1 -1
- package/lib/runtime.d.ts +19 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +109 -0
- package/lib/runtime.js.map +1 -0
- package/package.json +15 -9
- package/src/a2a-parts.ts +1 -2
- package/src/agent-executor.ts +2 -2
- package/src/card-builder.ts +13 -5
- package/src/index.ts +8 -8
- package/src/rest-transport-handler.ts +3 -13
- package/src/runtime.ts +143 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# @zhin.js/a2a
|
|
2
2
|
|
|
3
|
+
## 1.0.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 16ec4e8: Harden Plugin Runtime migration boundaries: make process-level registries, the game
|
|
8
|
+
catalog, and game-record storage generation-owned so HMR replacement cannot unregister the
|
|
9
|
+
active generation, discover workspace agents without mutating `process.cwd()`, and
|
|
10
|
+
require authentication for production A2A endpoints.
|
|
11
|
+
|
|
12
|
+
Game SessionServices and Group Suite mutable state now live in owner-scoped
|
|
13
|
+
resources. Lottery database, Agent dependencies, and outbound push bindings use
|
|
14
|
+
generation registrations with rollback-safe disposal.
|
|
15
|
+
|
|
16
|
+
The Plugin Runtime Console demo scope now follows ADR 0016 and rejects project
|
|
17
|
+
file, environment, and database RPCs, closing both direct and file-manager paths
|
|
18
|
+
that could expose `.env` values.
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [16ec4e8]
|
|
21
|
+
- Updated dependencies [cc5c94d]
|
|
22
|
+
- Updated dependencies [447f3e2]
|
|
23
|
+
- @zhin.js/core@1.3.5
|
|
24
|
+
- @zhin.js/agent@1.0.4
|
|
25
|
+
- @zhin.js/host-http@1.0.1
|
|
26
|
+
- zhin.js@4.1.3
|
|
27
|
+
- @zhin.js/logger@1.0.75
|
|
28
|
+
- @zhin.js/host-router@2.0.4
|
|
29
|
+
|
|
30
|
+
## 1.0.2
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- 872c583: Slack 适配器 Phase 1/2:mrkdwn 出站、长消息切分、斜杠/按钮 ephemeral 反馈、入站 mrkdwn→Markdown、editMessage 对齐 core。
|
|
35
|
+
|
|
36
|
+
Logger 表格日志与 string-width 列宽;Agent AI Handler 框线表格与 introspection/MCP 导出;Core side-event 归一化;Schedule 时区规划;多适配器 side-event 与 API surface 更新。
|
|
37
|
+
|
|
38
|
+
- 872c583: fix: 代码格式优化
|
|
39
|
+
- Updated dependencies [872c583]
|
|
40
|
+
- Updated dependencies [872c583]
|
|
41
|
+
- @zhin.js/agent@1.0.3
|
|
42
|
+
- @zhin.js/core@1.3.4
|
|
43
|
+
- @zhin.js/host-router@2.0.3
|
|
44
|
+
- @zhin.js/logger@1.0.74
|
|
45
|
+
- zhin.js@4.1.2
|
|
46
|
+
|
|
3
47
|
## 1.0.1
|
|
4
48
|
|
|
5
49
|
### Patch Changes
|
package/lib/a2a-parts.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A2A v1.0 proto-shaped Part/Message helpers.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
4
|
+
import { type Part } from '@a2a-js/sdk';
|
|
5
5
|
export declare function textPart(text: string, mediaType?: string): Part;
|
|
6
6
|
export declare function dataPart(data: unknown): Part;
|
|
7
7
|
export declare function partsToPromptText(parts: Part[]): string;
|
package/lib/a2a-parts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-parts.d.ts","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"a2a-parts.d.ts","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE9C,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
CHANGED
package/lib/a2a-parts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-parts.js","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"a2a-parts.js","sourceRoot":"","sources":["../src/a2a-parts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,IAAI,EAAa,MAAM,aAAa,CAAC;AAE9C,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"}
|
|
@@ -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;
|
|
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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build A2A AgentCard per ai.agents binding.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
4
|
+
import { type AgentCard } from '@a2a-js/sdk';
|
|
5
5
|
import type { AgentBindingRegistry } from '@zhin.js/agent/config';
|
|
6
|
-
export declare function buildAgentCardForBinding(agentName: string, registry: AgentBindingRegistry, publicBaseUrl: string): AgentCard | null;
|
|
6
|
+
export declare function buildAgentCardForBinding(agentName: string, registry: AgentBindingRegistry, publicBaseUrl: string, basePath?: string): AgentCard | null;
|
|
7
7
|
export declare function listExposableAgentNames(registry: AgentBindingRegistry): string[];
|
|
8
8
|
//# 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,KAAK,
|
|
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,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAS,GAChB,SAAS,GAAG,IAAI,CAuElB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAEhF"}
|
package/lib/card-builder.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build A2A AgentCard per ai.agents binding.
|
|
3
|
+
*/
|
|
1
4
|
import { A2A_PROTOCOL_VERSION } from '@a2a-js/sdk';
|
|
2
5
|
import { a2aAgentCardUrl, a2aJsonRpcUrl, a2aRestUrl } from './config.js';
|
|
3
6
|
function makeSkill(partial) {
|
|
@@ -18,13 +21,18 @@ const DEFAULT_SKILLS = [
|
|
|
18
21
|
tags: ['orchestration', 'delegate'],
|
|
19
22
|
}),
|
|
20
23
|
];
|
|
21
|
-
export function buildAgentCardForBinding(agentName, registry, publicBaseUrl) {
|
|
24
|
+
export function buildAgentCardForBinding(agentName, registry, publicBaseUrl, basePath = '/a2a') {
|
|
22
25
|
const binding = registry.getBinding(agentName);
|
|
23
26
|
if (!binding)
|
|
24
27
|
return null;
|
|
25
28
|
const nickname = binding.nickname ?? agentName;
|
|
26
|
-
const
|
|
27
|
-
const
|
|
29
|
+
const normalizedBasePath = basePath === '/a2a' ? undefined : basePath;
|
|
30
|
+
const jsonRpcUrl = normalizedBasePath
|
|
31
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/jsonrpc`
|
|
32
|
+
: a2aJsonRpcUrl(publicBaseUrl, agentName);
|
|
33
|
+
const restUrl = normalizedBasePath
|
|
34
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/rest`
|
|
35
|
+
: a2aRestUrl(publicBaseUrl, agentName);
|
|
28
36
|
const skills = [
|
|
29
37
|
makeSkill({
|
|
30
38
|
id: agentName,
|
|
@@ -78,7 +86,9 @@ export function buildAgentCardForBinding(agentName, registry, publicBaseUrl) {
|
|
|
78
86
|
defaultOutputModes: ['text/plain'],
|
|
79
87
|
skills,
|
|
80
88
|
signatures: [],
|
|
81
|
-
documentationUrl:
|
|
89
|
+
documentationUrl: normalizedBasePath
|
|
90
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/.well-known/agent-card.json`
|
|
91
|
+
: a2aAgentCardUrl(publicBaseUrl, agentName),
|
|
82
92
|
};
|
|
83
93
|
}
|
|
84
94
|
export function listExposableAgentNames(registry) {
|
package/lib/card-builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../src/card-builder.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -41,7 +41,7 @@ function rebuildAgentStacks(ai) {
|
|
|
41
41
|
next.set(agentName, { agentName, requestHandler, agentCard: card });
|
|
42
42
|
}
|
|
43
43
|
agentStacks = next;
|
|
44
|
-
logger.
|
|
44
|
+
logger.debug(formatCompact({ A2A: 'ready', agents: [...next.keys()].join(',') }));
|
|
45
45
|
}
|
|
46
46
|
function parseA2aTail(tail) {
|
|
47
47
|
const normalized = tail.replace(/^\/+/, '');
|
|
@@ -114,7 +114,7 @@ useContext('router', (router) => {
|
|
|
114
114
|
}
|
|
115
115
|
};
|
|
116
116
|
router.all(A2A_ROUTE, a2aHandler);
|
|
117
|
-
logger.
|
|
117
|
+
logger.debug(formatCompact({ A2A: 'listening', base: `${publicBaseUrl}${a2aAgentBasePath('{agent}')}` }));
|
|
118
118
|
onDispose(() => {
|
|
119
119
|
agentStacks.clear();
|
|
120
120
|
});
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Thin REST transport wrapper over A2ARequestHandler.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
5
|
-
import type
|
|
6
|
-
import type { ServerCallContext } from '@a2a-js/sdk/server';
|
|
4
|
+
import { type SendMessageRequest } from '@a2a-js/sdk';
|
|
5
|
+
import { type A2ARequestHandler, type ServerCallContext } from '@a2a-js/sdk/server';
|
|
7
6
|
export declare class RestTransportHandler {
|
|
8
7
|
private readonly requestHandler;
|
|
9
8
|
constructor(requestHandler: A2ARequestHandler);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-transport-handler.d.ts","sourceRoot":"","sources":["../src/rest-transport-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rest-transport-handler.d.ts","sourceRoot":"","sources":["../src/rest-transport-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiF,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrI,OAAO,EAAoD,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGtI,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,iBAAiB;IAExD,YAAY;IAIZ,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB;IAKlE,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB;IAMxE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,CAAC,EAAE,MAAM;IAQ1E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAKrD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,iBAAiB;IAarF,OAAO,CAAC,0BAA0B;YAKpB,iBAAiB;IAO/B,OAAO,CAAC,kBAAkB;CAO3B"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Thin REST transport wrapper over A2ARequestHandler.
|
|
3
|
+
*/
|
|
2
4
|
import { TaskState } from '@a2a-js/sdk';
|
|
5
|
+
import { RequestMalformedError, UnsupportedOperationError } from '@a2a-js/sdk/server';
|
|
3
6
|
export class RestTransportHandler {
|
|
4
7
|
requestHandler;
|
|
5
8
|
constructor(requestHandler) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-transport-handler.js","sourceRoot":"","sources":["../src/rest-transport-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rest-transport-handler.js","sourceRoot":"","sources":["../src/rest-transport-handler.ts"],"names":[],"mappings":"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"}
|
package/lib/runtime.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HttpHost } from '@zhin.js/host-http';
|
|
2
|
+
import type { AgentHostPort } from '@zhin.js/agent/runtime';
|
|
3
|
+
export interface RuntimeA2aConfig {
|
|
4
|
+
readonly enabled?: boolean;
|
|
5
|
+
readonly path?: string;
|
|
6
|
+
readonly token?: string;
|
|
7
|
+
readonly publicUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InstallRuntimeA2aOptions {
|
|
10
|
+
readonly http: HttpHost;
|
|
11
|
+
readonly agentHost: AgentHostPort;
|
|
12
|
+
readonly config?: RuntimeA2aConfig;
|
|
13
|
+
readonly fallbackToken?: string;
|
|
14
|
+
readonly fallbackPublicUrl: string;
|
|
15
|
+
readonly production?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Mount Agent Card, JSON-RPC, and HTTP+JSON routes on the Runtime HTTP Host. */
|
|
18
|
+
export declare function installRuntimeA2a(options: InstallRuntimeA2aOptions): () => void;
|
|
19
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,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,QAAQ,CAAC;IACxB,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,CAyD/E"}
|
package/lib/runtime.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { DefaultRequestHandler, InMemoryTaskStore, } from '@a2a-js/sdk/server';
|
|
2
|
+
import { AGENT_CARD_PATH } from '@a2a-js/sdk';
|
|
3
|
+
import { buildAgentCardForBinding, listExposableAgentNames } from './card-builder.js';
|
|
4
|
+
import { ZhinA2AExecutor } from './agent-executor.js';
|
|
5
|
+
import { handleAgentCard, handleJsonRpc, handleRest } from './http-handlers.js';
|
|
6
|
+
import { verifyA2aBearer } from './auth.js';
|
|
7
|
+
/** Mount Agent Card, JSON-RPC, and HTTP+JSON routes on the Runtime HTTP Host. */
|
|
8
|
+
export function installRuntimeA2a(options) {
|
|
9
|
+
if (options.config?.enabled === false)
|
|
10
|
+
return () => undefined;
|
|
11
|
+
const basePath = normalizePath(options.config?.path ?? '/a2a');
|
|
12
|
+
const publicBaseUrl = (options.config?.publicUrl ?? options.fallbackPublicUrl).replace(/\/+$/u, '');
|
|
13
|
+
const token = options.config?.token ?? options.fallbackToken ?? '';
|
|
14
|
+
if (options.production === true && !token) {
|
|
15
|
+
throw new Error('A2A requires a2a.token or http.token in production');
|
|
16
|
+
}
|
|
17
|
+
const service = options.agentHost.service;
|
|
18
|
+
const agent = options.agentHost.agent;
|
|
19
|
+
const registry = service.getBindingRegistry();
|
|
20
|
+
const stacks = new Map();
|
|
21
|
+
for (const agentName of listExposableAgentNames(registry)) {
|
|
22
|
+
const card = buildAgentCardForBinding(agentName, registry, publicBaseUrl, basePath);
|
|
23
|
+
if (!card)
|
|
24
|
+
continue;
|
|
25
|
+
const executor = new ZhinA2AExecutor({
|
|
26
|
+
agentName,
|
|
27
|
+
getAgent: () => agent,
|
|
28
|
+
resolveBinding: () => registry.getBinding(agentName),
|
|
29
|
+
});
|
|
30
|
+
stacks.set(agentName, {
|
|
31
|
+
card,
|
|
32
|
+
handler: new DefaultRequestHandler(card, new InMemoryTaskStore(), executor),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const unregister = options.http.route('ALL', `${basePath}/*`, async (request, response, url) => {
|
|
36
|
+
if (token && !verifyA2aBearer(request, token)) {
|
|
37
|
+
writeJson(response, 401, { error: 'Unauthorized - Bearer token required' });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const route = parseRoute(url.pathname, basePath);
|
|
41
|
+
if (!route) {
|
|
42
|
+
writeJson(response, 404, { error: 'Not found' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const stack = stacks.get(route.agentName);
|
|
46
|
+
if (!stack) {
|
|
47
|
+
writeJson(response, 404, { error: `A2A agent "${route.agentName}" not found` });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (route.kind === 'card') {
|
|
51
|
+
await handleAgentCard(request, response, stack.handler);
|
|
52
|
+
}
|
|
53
|
+
else if (route.kind === 'jsonrpc') {
|
|
54
|
+
await handleJsonRpc(request, response, stack.handler);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
await handleRest(request, response, stack.handler, route.restPath);
|
|
58
|
+
}
|
|
59
|
+
}, { summary: 'Agent-to-Agent protocol', tags: ['a2a'] });
|
|
60
|
+
return () => {
|
|
61
|
+
unregister();
|
|
62
|
+
stacks.clear();
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function parseRoute(pathname, basePath) {
|
|
66
|
+
const prefix = `${basePath}/`;
|
|
67
|
+
if (!pathname.startsWith(prefix))
|
|
68
|
+
return null;
|
|
69
|
+
const slash = pathname.indexOf('/', prefix.length);
|
|
70
|
+
if (slash < 0)
|
|
71
|
+
return null;
|
|
72
|
+
let agentName;
|
|
73
|
+
try {
|
|
74
|
+
agentName = decodeURIComponent(pathname.slice(prefix.length, slash));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (!agentName)
|
|
80
|
+
return null;
|
|
81
|
+
const tail = pathname.slice(slash + 1).replace(/^\/+|\/+$/gu, '');
|
|
82
|
+
if (tail === `.well-known/${AGENT_CARD_PATH}` || tail === '.well-known/agent-card.json') {
|
|
83
|
+
return { agentName, kind: 'card' };
|
|
84
|
+
}
|
|
85
|
+
if (tail === 'jsonrpc' || tail.startsWith('jsonrpc/')) {
|
|
86
|
+
return { agentName, kind: 'jsonrpc' };
|
|
87
|
+
}
|
|
88
|
+
if (tail === 'rest' || tail.startsWith('rest/')) {
|
|
89
|
+
return {
|
|
90
|
+
agentName,
|
|
91
|
+
kind: 'rest',
|
|
92
|
+
restPath: tail === 'rest' ? '' : tail.slice('rest/'.length),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
function writeJson(response, status, body) {
|
|
98
|
+
const payload = JSON.stringify(body);
|
|
99
|
+
response.writeHead(status, {
|
|
100
|
+
'content-type': 'application/json; charset=utf-8',
|
|
101
|
+
'content-length': String(Buffer.byteLength(payload)),
|
|
102
|
+
});
|
|
103
|
+
response.end(payload);
|
|
104
|
+
}
|
|
105
|
+
function normalizePath(path) {
|
|
106
|
+
const leading = path.startsWith('/') ? path : `/${path}`;
|
|
107
|
+
return leading.replace(/\/+$/u, '') || '/a2a';
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
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",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"types": "./lib/index.d.ts",
|
|
11
11
|
"development": "./src/index.ts",
|
|
12
12
|
"import": "./lib/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./runtime": {
|
|
15
|
+
"types": "./lib/runtime.d.ts",
|
|
16
|
+
"development": "./src/runtime.ts",
|
|
17
|
+
"import": "./lib/runtime.js"
|
|
13
18
|
}
|
|
14
19
|
},
|
|
15
20
|
"keywords": [
|
|
@@ -31,21 +36,22 @@
|
|
|
31
36
|
},
|
|
32
37
|
"dependencies": {
|
|
33
38
|
"@a2a-js/sdk": "1.0.0-beta.0",
|
|
34
|
-
"@zhin.js/core": "1.3.
|
|
35
|
-
"@zhin.js/
|
|
39
|
+
"@zhin.js/core": "1.3.5",
|
|
40
|
+
"@zhin.js/host-http": "1.0.1",
|
|
41
|
+
"@zhin.js/logger": "1.0.75"
|
|
36
42
|
},
|
|
37
43
|
"peerDependencies": {
|
|
38
|
-
"@zhin.js/agent": "1.0.
|
|
39
|
-
"@zhin.js/host-router": "2.0.
|
|
40
|
-
"zhin.js": "4.1.
|
|
44
|
+
"@zhin.js/agent": "1.0.4",
|
|
45
|
+
"@zhin.js/host-router": "2.0.4",
|
|
46
|
+
"zhin.js": "4.1.3"
|
|
41
47
|
},
|
|
42
48
|
"devDependencies": {
|
|
43
49
|
"@types/node": "^26.1.0",
|
|
44
50
|
"rimraf": "^6.0.0",
|
|
45
51
|
"typescript": "^6.0.3",
|
|
46
|
-
"@zhin.js/
|
|
47
|
-
"@zhin.js/
|
|
48
|
-
"zhin.js": "4.1.
|
|
52
|
+
"@zhin.js/host-router": "2.0.4",
|
|
53
|
+
"@zhin.js/agent": "1.0.4",
|
|
54
|
+
"zhin.js": "4.1.3"
|
|
49
55
|
},
|
|
50
56
|
"files": [
|
|
51
57
|
"src",
|
package/src/a2a-parts.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A2A v1.0 proto-shaped Part/Message helpers.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
5
|
-
import { Role } from '@a2a-js/sdk';
|
|
4
|
+
import { Role, type Part } from '@a2a-js/sdk';
|
|
6
5
|
|
|
7
6
|
export function textPart(text: string, mediaType = 'text/plain'): Part {
|
|
8
7
|
return {
|
package/src/agent-executor.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* ZhinA2AExecutor — runs inbound A2A tasks via bound ZhinAgent.
|
|
3
3
|
*/
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
|
-
import type
|
|
6
|
-
|
|
5
|
+
import { TaskState, type Task } from '@a2a-js/sdk';
|
|
6
|
+
|
|
7
7
|
import {
|
|
8
8
|
AgentEvent,
|
|
9
9
|
type AgentExecutor,
|
package/src/card-builder.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build A2A AgentCard per ai.agents binding.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
5
|
-
|
|
4
|
+
import { A2A_PROTOCOL_VERSION, type AgentCard, type AgentSkill } from '@a2a-js/sdk';
|
|
5
|
+
|
|
6
6
|
import type { AgentBindingRegistry } from '@zhin.js/agent/config';
|
|
7
7
|
import { a2aAgentCardUrl, a2aJsonRpcUrl, a2aRestUrl } from './config.js';
|
|
8
8
|
|
|
@@ -30,13 +30,19 @@ export function buildAgentCardForBinding(
|
|
|
30
30
|
agentName: string,
|
|
31
31
|
registry: AgentBindingRegistry,
|
|
32
32
|
publicBaseUrl: string,
|
|
33
|
+
basePath = '/a2a',
|
|
33
34
|
): AgentCard | null {
|
|
34
35
|
const binding = registry.getBinding(agentName);
|
|
35
36
|
if (!binding) return null;
|
|
36
37
|
|
|
37
38
|
const nickname = binding.nickname ?? agentName;
|
|
38
|
-
const
|
|
39
|
-
const
|
|
39
|
+
const normalizedBasePath = basePath === '/a2a' ? undefined : basePath;
|
|
40
|
+
const jsonRpcUrl = normalizedBasePath
|
|
41
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/jsonrpc`
|
|
42
|
+
: a2aJsonRpcUrl(publicBaseUrl, agentName);
|
|
43
|
+
const restUrl = normalizedBasePath
|
|
44
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/rest`
|
|
45
|
+
: a2aRestUrl(publicBaseUrl, agentName);
|
|
40
46
|
|
|
41
47
|
const skills: AgentSkill[] = [
|
|
42
48
|
makeSkill({
|
|
@@ -92,7 +98,9 @@ export function buildAgentCardForBinding(
|
|
|
92
98
|
defaultOutputModes: ['text/plain'],
|
|
93
99
|
skills,
|
|
94
100
|
signatures: [],
|
|
95
|
-
documentationUrl:
|
|
101
|
+
documentationUrl: normalizedBasePath
|
|
102
|
+
? `${publicBaseUrl}${normalizedBasePath}/${encodeURIComponent(agentName)}/.well-known/agent-card.json`
|
|
103
|
+
: a2aAgentCardUrl(publicBaseUrl, agentName),
|
|
96
104
|
};
|
|
97
105
|
}
|
|
98
106
|
|
package/src/index.ts
CHANGED
|
@@ -7,17 +7,17 @@
|
|
|
7
7
|
* * /a2a/{agentName}/rest/*
|
|
8
8
|
*/
|
|
9
9
|
import { formatCompact, usePlugin } from '@zhin.js/core';
|
|
10
|
-
import type
|
|
11
|
-
|
|
10
|
+
import { paramPath, type Router, type RouterContext } from '@zhin.js/host-router';
|
|
11
|
+
|
|
12
12
|
import {
|
|
13
13
|
DefaultRequestHandler,
|
|
14
14
|
InMemoryTaskStore,
|
|
15
15
|
type A2ARequestHandler,
|
|
16
16
|
} from '@a2a-js/sdk/server';
|
|
17
|
-
import type
|
|
18
|
-
|
|
19
|
-
import { getAgentRuntimeRegistry } from '@zhin.js/agent';
|
|
20
|
-
|
|
17
|
+
import { AGENT_CARD_PATH, type AgentCard } from '@a2a-js/sdk';
|
|
18
|
+
|
|
19
|
+
import { getAgentRuntimeRegistry, type AIService } from '@zhin.js/agent';
|
|
20
|
+
|
|
21
21
|
import { resolvePublicBaseUrl, a2aAgentBasePath } from './config.js';
|
|
22
22
|
import { verifyA2aBearer } from './auth.js';
|
|
23
23
|
import { buildAgentCardForBinding, listExposableAgentNames } from './card-builder.js';
|
|
@@ -68,7 +68,7 @@ function rebuildAgentStacks(ai: AIService): void {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
agentStacks = next;
|
|
71
|
-
logger.
|
|
71
|
+
logger.debug(formatCompact({ A2A: 'ready', agents: [...next.keys()].join(',') }));
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
function parseA2aTail(tail: string): { kind: 'card' | 'jsonrpc' | 'rest'; restSubPath?: string } | null {
|
|
@@ -149,7 +149,7 @@ useContext('router', (router: Router) => {
|
|
|
149
149
|
|
|
150
150
|
router.all(A2A_ROUTE, a2aHandler);
|
|
151
151
|
|
|
152
|
-
logger.
|
|
152
|
+
logger.debug(formatCompact({ A2A: 'listening', base: `${publicBaseUrl}${a2aAgentBasePath('{agent}')}` }));
|
|
153
153
|
|
|
154
154
|
onDispose(() => {
|
|
155
155
|
agentStacks.clear();
|
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Thin REST transport wrapper over A2ARequestHandler.
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
ListTasksRequest,
|
|
8
|
-
SendMessageRequest,
|
|
9
|
-
} from '@a2a-js/sdk';
|
|
10
|
-
import {
|
|
11
|
-
RequestMalformedError,
|
|
12
|
-
UnsupportedOperationError,
|
|
13
|
-
} from '@a2a-js/sdk/server';
|
|
14
|
-
import type { A2ARequestHandler } from '@a2a-js/sdk/server';
|
|
15
|
-
import type { ServerCallContext } from '@a2a-js/sdk/server';
|
|
16
|
-
import { TaskState } from '@a2a-js/sdk';
|
|
4
|
+
import { TaskState, type CancelTaskRequest, type GetTaskRequest, type ListTasksRequest, type SendMessageRequest } from '@a2a-js/sdk';
|
|
5
|
+
import { RequestMalformedError, UnsupportedOperationError, type A2ARequestHandler, type ServerCallContext } from '@a2a-js/sdk/server';
|
|
6
|
+
|
|
17
7
|
|
|
18
8
|
export class RestTransportHandler {
|
|
19
9
|
constructor(private readonly requestHandler: A2ARequestHandler) {}
|
package/src/runtime.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DefaultRequestHandler,
|
|
3
|
+
InMemoryTaskStore,
|
|
4
|
+
type A2ARequestHandler,
|
|
5
|
+
} from '@a2a-js/sdk/server';
|
|
6
|
+
import { AGENT_CARD_PATH, type AgentCard } from '@a2a-js/sdk';
|
|
7
|
+
import type { HttpHost } from '@zhin.js/host-http';
|
|
8
|
+
import type { AgentHostPort } from '@zhin.js/agent/runtime';
|
|
9
|
+
import type { ZhinAgent } from '@zhin.js/agent';
|
|
10
|
+
import type { AgentBindingRegistry } from '@zhin.js/agent/config';
|
|
11
|
+
import { buildAgentCardForBinding, listExposableAgentNames } from './card-builder.js';
|
|
12
|
+
import { ZhinA2AExecutor } from './agent-executor.js';
|
|
13
|
+
import { handleAgentCard, handleJsonRpc, handleRest } from './http-handlers.js';
|
|
14
|
+
import { verifyA2aBearer } from './auth.js';
|
|
15
|
+
|
|
16
|
+
export interface RuntimeA2aConfig {
|
|
17
|
+
readonly enabled?: boolean;
|
|
18
|
+
readonly path?: string;
|
|
19
|
+
readonly token?: string;
|
|
20
|
+
readonly publicUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface InstallRuntimeA2aOptions {
|
|
24
|
+
readonly http: HttpHost;
|
|
25
|
+
readonly agentHost: AgentHostPort;
|
|
26
|
+
readonly config?: RuntimeA2aConfig;
|
|
27
|
+
readonly fallbackToken?: string;
|
|
28
|
+
readonly fallbackPublicUrl: string;
|
|
29
|
+
readonly production?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface AgentStack {
|
|
33
|
+
readonly card: AgentCard;
|
|
34
|
+
readonly handler: A2ARequestHandler;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Mount Agent Card, JSON-RPC, and HTTP+JSON routes on the Runtime HTTP Host. */
|
|
38
|
+
export function installRuntimeA2a(options: InstallRuntimeA2aOptions): () => void {
|
|
39
|
+
if (options.config?.enabled === false) return () => undefined;
|
|
40
|
+
const basePath = normalizePath(options.config?.path ?? '/a2a');
|
|
41
|
+
const publicBaseUrl = (options.config?.publicUrl ?? options.fallbackPublicUrl).replace(/\/+$/u, '');
|
|
42
|
+
const token = options.config?.token ?? options.fallbackToken ?? '';
|
|
43
|
+
if (options.production === true && !token) {
|
|
44
|
+
throw new Error('A2A requires a2a.token or http.token in production');
|
|
45
|
+
}
|
|
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
|
+
const stacks = new Map<string, AgentStack>();
|
|
52
|
+
|
|
53
|
+
for (const agentName of listExposableAgentNames(registry)) {
|
|
54
|
+
const card = buildAgentCardForBinding(agentName, registry, publicBaseUrl, basePath);
|
|
55
|
+
if (!card) continue;
|
|
56
|
+
const executor = new ZhinA2AExecutor({
|
|
57
|
+
agentName,
|
|
58
|
+
getAgent: () => agent,
|
|
59
|
+
resolveBinding: () => registry.getBinding(agentName),
|
|
60
|
+
});
|
|
61
|
+
stacks.set(agentName, {
|
|
62
|
+
card,
|
|
63
|
+
handler: new DefaultRequestHandler(card, new InMemoryTaskStore(), executor),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const unregister = options.http.route('ALL', `${basePath}/*`, async (request, response, url) => {
|
|
68
|
+
if (token && !verifyA2aBearer(request, token)) {
|
|
69
|
+
writeJson(response, 401, { error: 'Unauthorized - Bearer token required' });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const route = parseRoute(url.pathname, basePath);
|
|
73
|
+
if (!route) {
|
|
74
|
+
writeJson(response, 404, { error: 'Not found' });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const stack = stacks.get(route.agentName);
|
|
78
|
+
if (!stack) {
|
|
79
|
+
writeJson(response, 404, { error: `A2A agent "${route.agentName}" not found` });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (route.kind === 'card') {
|
|
83
|
+
await handleAgentCard(request, response, stack.handler);
|
|
84
|
+
} else if (route.kind === 'jsonrpc') {
|
|
85
|
+
await handleJsonRpc(request, response, stack.handler);
|
|
86
|
+
} else {
|
|
87
|
+
await handleRest(request, response, stack.handler, route.restPath);
|
|
88
|
+
}
|
|
89
|
+
}, { summary: 'Agent-to-Agent protocol', tags: ['a2a'] });
|
|
90
|
+
|
|
91
|
+
return () => {
|
|
92
|
+
unregister();
|
|
93
|
+
stacks.clear();
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
type ParsedRoute =
|
|
98
|
+
| { readonly agentName: string; readonly kind: 'card' }
|
|
99
|
+
| { readonly agentName: string; readonly kind: 'jsonrpc' }
|
|
100
|
+
| { readonly agentName: string; readonly kind: 'rest'; readonly restPath: string };
|
|
101
|
+
|
|
102
|
+
function parseRoute(pathname: string, basePath: string): ParsedRoute | null {
|
|
103
|
+
const prefix = `${basePath}/`;
|
|
104
|
+
if (!pathname.startsWith(prefix)) return null;
|
|
105
|
+
const slash = pathname.indexOf('/', prefix.length);
|
|
106
|
+
if (slash < 0) return null;
|
|
107
|
+
let agentName: string;
|
|
108
|
+
try {
|
|
109
|
+
agentName = decodeURIComponent(pathname.slice(prefix.length, slash));
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (!agentName) return null;
|
|
114
|
+
const tail = pathname.slice(slash + 1).replace(/^\/+|\/+$/gu, '');
|
|
115
|
+
if (tail === `.well-known/${AGENT_CARD_PATH}` || tail === '.well-known/agent-card.json') {
|
|
116
|
+
return { agentName, kind: 'card' };
|
|
117
|
+
}
|
|
118
|
+
if (tail === 'jsonrpc' || tail.startsWith('jsonrpc/')) {
|
|
119
|
+
return { agentName, kind: 'jsonrpc' };
|
|
120
|
+
}
|
|
121
|
+
if (tail === 'rest' || tail.startsWith('rest/')) {
|
|
122
|
+
return {
|
|
123
|
+
agentName,
|
|
124
|
+
kind: 'rest',
|
|
125
|
+
restPath: tail === 'rest' ? '' : tail.slice('rest/'.length),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function writeJson(response: import('node:http').ServerResponse, status: number, body: unknown): void {
|
|
132
|
+
const payload = JSON.stringify(body);
|
|
133
|
+
response.writeHead(status, {
|
|
134
|
+
'content-type': 'application/json; charset=utf-8',
|
|
135
|
+
'content-length': String(Buffer.byteLength(payload)),
|
|
136
|
+
});
|
|
137
|
+
response.end(payload);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function normalizePath(path: string): string {
|
|
141
|
+
const leading = path.startsWith('/') ? path : `/${path}`;
|
|
142
|
+
return leading.replace(/\/+$/u, '') || '/a2a';
|
|
143
|
+
}
|