@mono-agent/a2a-adapter 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/README.md +135 -0
- package/dist/card.d.ts +26 -0
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +99 -0
- package/dist/card.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +316 -0
- package/dist/config.js.map +1 -0
- package/dist/consumer.d.ts +61 -0
- package/dist/consumer.d.ts.map +1 -0
- package/dist/consumer.js +410 -0
- package/dist/consumer.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +50 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +360 -0
- package/dist/provider.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# @mono-agent/a2a-adapter
|
|
2
|
+
|
|
3
|
+
Category: `communication`
|
|
4
|
+
|
|
5
|
+
## Category
|
|
6
|
+
|
|
7
|
+
Communication adapter.
|
|
8
|
+
|
|
9
|
+
## Responsibility
|
|
10
|
+
|
|
11
|
+
Expose a agent responder as an A2A provider and call remote A2A agents through direct Agent Card discovery.
|
|
12
|
+
|
|
13
|
+
## Install / Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm add @mono-agent/a2a-adapter
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Provider usage starts a loopback HTTP server by default and serves the Agent Card at `/.well-known/agent-card.json`. Message/task endpoints are available under `/a2a/json-rpc` and `/a2a/rest`.
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { startA2AProvider } from "@mono-agent/a2a-adapter";
|
|
23
|
+
|
|
24
|
+
const provider = await startA2AProvider({
|
|
25
|
+
host: "127.0.0.1",
|
|
26
|
+
port: 4300,
|
|
27
|
+
responder,
|
|
28
|
+
agent: {
|
|
29
|
+
name: "Agent A",
|
|
30
|
+
description: "Local A2A provider.",
|
|
31
|
+
version: "0.1.0",
|
|
32
|
+
},
|
|
33
|
+
skill: {
|
|
34
|
+
id: "agent-a",
|
|
35
|
+
name: "Agent A",
|
|
36
|
+
description: "Answers text prompts.",
|
|
37
|
+
tags: ["mono-agent", "a2a"],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
console.log(provider.agentCardUrl);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Consumer usage discovers a direct Agent Card URL and sends text:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { sendA2AMessage } from "@mono-agent/a2a-adapter";
|
|
48
|
+
|
|
49
|
+
const response = await sendA2AMessage({
|
|
50
|
+
agentUrl: "http://127.0.0.1:4300/.well-known/agent-card.json",
|
|
51
|
+
text: "Hello from Agent B.",
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Public API
|
|
56
|
+
|
|
57
|
+
- `startA2AProvider`
|
|
58
|
+
- `createA2AAgentCard`
|
|
59
|
+
- `createA2AConsumer`
|
|
60
|
+
- `discoverA2AAgent`
|
|
61
|
+
- `sendA2AMessage`
|
|
62
|
+
- `createA2AConsumerResponder`
|
|
63
|
+
- `a2aFieldGroup`
|
|
64
|
+
- `loadA2AAdapterConfig`
|
|
65
|
+
- `redactA2AAdapterConfig`
|
|
66
|
+
|
|
67
|
+
Config can be loaded from nested JSON under `a2a` or explicit environment variables:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"a2a": {
|
|
72
|
+
"provider": {
|
|
73
|
+
"enabled": true,
|
|
74
|
+
"host": "127.0.0.1",
|
|
75
|
+
"port": 4300,
|
|
76
|
+
"requireBearer": true,
|
|
77
|
+
"bearerToken": "redacted-value"
|
|
78
|
+
},
|
|
79
|
+
"agent": {
|
|
80
|
+
"name": "Agent A",
|
|
81
|
+
"description": "Local A2A provider.",
|
|
82
|
+
"version": "0.1.0"
|
|
83
|
+
},
|
|
84
|
+
"skill": {
|
|
85
|
+
"id": "agent-a",
|
|
86
|
+
"name": "Agent A",
|
|
87
|
+
"description": "Answers text prompts.",
|
|
88
|
+
"tags": ["mono-agent", "a2a"]
|
|
89
|
+
},
|
|
90
|
+
"consumer": {
|
|
91
|
+
"remoteAgentUrls": ["http://127.0.0.1:4300/.well-known/agent-card.json"],
|
|
92
|
+
"timeoutMs": 30000
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Important env names:
|
|
99
|
+
|
|
100
|
+
- `MONO_AGENT_A2A_PROVIDER_ENABLED`
|
|
101
|
+
- `MONO_AGENT_A2A_HOST`
|
|
102
|
+
- `MONO_AGENT_A2A_PORT`
|
|
103
|
+
- `MONO_AGENT_A2A_PUBLIC_BASE_URL`
|
|
104
|
+
- `MONO_AGENT_A2A_ALLOW_NON_LOOPBACK`
|
|
105
|
+
- `MONO_AGENT_A2A_REQUIRE_BEARER`
|
|
106
|
+
- `MONO_AGENT_A2A_BEARER_TOKEN`
|
|
107
|
+
- `MONO_AGENT_A2A_AGENT_NAME`
|
|
108
|
+
- `MONO_AGENT_A2A_AGENT_DESCRIPTION`
|
|
109
|
+
- `MONO_AGENT_A2A_AGENT_VERSION`
|
|
110
|
+
- `MONO_AGENT_A2A_SKILL_ID`
|
|
111
|
+
- `MONO_AGENT_A2A_SKILL_NAME`
|
|
112
|
+
- `MONO_AGENT_A2A_SKILL_DESCRIPTION`
|
|
113
|
+
- `MONO_AGENT_A2A_SKILL_TAGS`
|
|
114
|
+
- `MONO_AGENT_A2A_REMOTE_AGENT_URLS`
|
|
115
|
+
- `MONO_AGENT_A2A_DEFAULT_REMOTE_AGENT_URL`
|
|
116
|
+
- `MONO_AGENT_A2A_CONSUMER_BEARER_TOKEN`
|
|
117
|
+
- `MONO_AGENT_A2A_TIMEOUT_MS`
|
|
118
|
+
|
|
119
|
+
## Dependency Boundary
|
|
120
|
+
|
|
121
|
+
This package depends only on core agent contracts/settings plus the pinned A2A SDK and Express transport surface. It does not depend on the agent harness, config package, operator surfaces, or other communication adapters.
|
|
122
|
+
|
|
123
|
+
## What This Package Does Not Own
|
|
124
|
+
|
|
125
|
+
It does not own runtime execution, memory, tool policy, central registries, signed cards, push notifications, file exchange, gRPC hosting, or autonomous LLM-selected remote-agent delegation. This pass supports direct discovery and text/task communication only.
|
|
126
|
+
|
|
127
|
+
## Verification
|
|
128
|
+
|
|
129
|
+
Run:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
pnpm --filter @mono-agent/a2a-adapter run build
|
|
133
|
+
pnpm --filter @mono-agent/a2a-adapter run typecheck
|
|
134
|
+
pnpm --filter @mono-agent/a2a-adapter run test
|
|
135
|
+
```
|
package/dist/card.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentCard } from "@a2a-js/sdk";
|
|
2
|
+
export interface A2AAgentSkillOptions {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly description: string;
|
|
6
|
+
readonly tags?: readonly string[];
|
|
7
|
+
readonly examples?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface A2AAgentCardOptions {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly description: string;
|
|
12
|
+
readonly version: string;
|
|
13
|
+
readonly publicBaseUrl: string;
|
|
14
|
+
readonly requireBearer?: boolean;
|
|
15
|
+
readonly provider?: {
|
|
16
|
+
readonly organization: string;
|
|
17
|
+
readonly url: string;
|
|
18
|
+
};
|
|
19
|
+
readonly skill: A2AAgentSkillOptions;
|
|
20
|
+
readonly documentationUrl?: string;
|
|
21
|
+
readonly iconUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function createA2AAgentCard(options: A2AAgentCardOptions): AgentCard;
|
|
24
|
+
export declare function normalizeBaseUrl(value: string): string;
|
|
25
|
+
export declare function requireNonEmpty(value: string, field: string): string;
|
|
26
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAA6B,MAAM,aAAa,CAAC;AAIxE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAuD1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAatD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUpE"}
|
package/dist/card.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { A2AProviderError } from "./errors.js";
|
|
2
|
+
export function createA2AAgentCard(options) {
|
|
3
|
+
const publicBaseUrl = normalizeBaseUrl(options.publicBaseUrl);
|
|
4
|
+
const provider = providerFromOptions(options.provider);
|
|
5
|
+
const skill = skillFromOptions(options.skill);
|
|
6
|
+
const securitySchemes = {};
|
|
7
|
+
const securityRequirements = [];
|
|
8
|
+
if (options.requireBearer === true) {
|
|
9
|
+
securitySchemes.bearer = {
|
|
10
|
+
scheme: {
|
|
11
|
+
$case: "httpAuthSecurityScheme",
|
|
12
|
+
value: {
|
|
13
|
+
description: "Bearer token required for A2A message and task endpoints.",
|
|
14
|
+
scheme: "Bearer",
|
|
15
|
+
bearerFormat: "opaque",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
securityRequirements.push({ schemes: { bearer: { list: [] } } });
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
name: requireNonEmpty(options.name, "agent.name"),
|
|
23
|
+
description: requireNonEmpty(options.description, "agent.description"),
|
|
24
|
+
supportedInterfaces: [
|
|
25
|
+
{
|
|
26
|
+
url: `${publicBaseUrl}/a2a/json-rpc`,
|
|
27
|
+
protocolBinding: "JSONRPC",
|
|
28
|
+
protocolVersion: "1.0",
|
|
29
|
+
tenant: "",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
url: `${publicBaseUrl}/a2a/rest`,
|
|
33
|
+
protocolBinding: "HTTP+JSON",
|
|
34
|
+
protocolVersion: "1.0",
|
|
35
|
+
tenant: "",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
provider,
|
|
39
|
+
version: requireNonEmpty(options.version, "agent.version"),
|
|
40
|
+
...(options.documentationUrl === undefined ? {} : { documentationUrl: options.documentationUrl }),
|
|
41
|
+
capabilities: {
|
|
42
|
+
streaming: true,
|
|
43
|
+
pushNotifications: false,
|
|
44
|
+
extensions: [],
|
|
45
|
+
extendedAgentCard: false,
|
|
46
|
+
},
|
|
47
|
+
securitySchemes,
|
|
48
|
+
securityRequirements,
|
|
49
|
+
defaultInputModes: ["text/plain"],
|
|
50
|
+
defaultOutputModes: ["text/plain"],
|
|
51
|
+
skills: [skill],
|
|
52
|
+
signatures: [],
|
|
53
|
+
...(options.iconUrl === undefined ? {} : { iconUrl: options.iconUrl }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function normalizeBaseUrl(value) {
|
|
57
|
+
const trimmed = requireNonEmpty(value, "publicBaseUrl");
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = new URL(trimmed);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new A2AProviderError("invalid_config", "A2A publicBaseUrl must be an absolute URL.", {
|
|
64
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
parsed.hash = "";
|
|
68
|
+
parsed.search = "";
|
|
69
|
+
return parsed.toString().replace(/\/+$/u, "");
|
|
70
|
+
}
|
|
71
|
+
export function requireNonEmpty(value, field) {
|
|
72
|
+
const trimmed = value.trim();
|
|
73
|
+
if (trimmed.length === 0) {
|
|
74
|
+
throw new A2AProviderError("missing_required_config", `A2A ${field} is required.`, { field });
|
|
75
|
+
}
|
|
76
|
+
return trimmed;
|
|
77
|
+
}
|
|
78
|
+
function providerFromOptions(provider) {
|
|
79
|
+
if (provider === undefined) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
organization: requireNonEmpty(provider.organization, "provider.organization"),
|
|
84
|
+
url: requireNonEmpty(provider.url, "provider.url"),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function skillFromOptions(skill) {
|
|
88
|
+
return {
|
|
89
|
+
id: requireNonEmpty(skill.id, "skill.id"),
|
|
90
|
+
name: requireNonEmpty(skill.name, "skill.name"),
|
|
91
|
+
description: requireNonEmpty(skill.description, "skill.description"),
|
|
92
|
+
tags: [...(skill.tags ?? [])],
|
|
93
|
+
examples: [...(skill.examples ?? [])],
|
|
94
|
+
inputModes: ["text/plain"],
|
|
95
|
+
outputModes: ["text/plain"],
|
|
96
|
+
securityRequirements: [],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=card.js.map
|
package/dist/card.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { FieldGroup, RedactedSecretValue, SettingsJson } from "@mono-agent/settings";
|
|
2
|
+
import type { A2AAgentSkillOptions } from "./card.js";
|
|
3
|
+
export interface A2AAdapterProviderConfig {
|
|
4
|
+
readonly enabled: boolean;
|
|
5
|
+
readonly host: string;
|
|
6
|
+
readonly port: number;
|
|
7
|
+
readonly publicBaseUrl?: string;
|
|
8
|
+
readonly allowNonLoopback: boolean;
|
|
9
|
+
readonly requireBearer: boolean;
|
|
10
|
+
readonly bearerToken?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface A2AAdapterAgentConfig {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly providerOrganization?: string;
|
|
17
|
+
readonly providerUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface A2AAdapterConsumerConfig {
|
|
20
|
+
readonly remoteAgentUrls: readonly string[];
|
|
21
|
+
readonly defaultRemoteAgentUrl?: string;
|
|
22
|
+
readonly bearerToken?: string;
|
|
23
|
+
readonly timeoutMs: number;
|
|
24
|
+
}
|
|
25
|
+
export interface A2AAdapterConfig {
|
|
26
|
+
readonly provider: A2AAdapterProviderConfig;
|
|
27
|
+
readonly agent?: A2AAdapterAgentConfig;
|
|
28
|
+
readonly skill?: A2AAgentSkillOptions;
|
|
29
|
+
readonly consumer: A2AAdapterConsumerConfig;
|
|
30
|
+
}
|
|
31
|
+
export interface RedactedA2AAdapterConfig {
|
|
32
|
+
readonly provider: Omit<A2AAdapterProviderConfig, "bearerToken"> & {
|
|
33
|
+
readonly bearerToken: RedactedSecretValue;
|
|
34
|
+
};
|
|
35
|
+
readonly agent?: A2AAdapterAgentConfig;
|
|
36
|
+
readonly skill?: A2AAgentSkillOptions;
|
|
37
|
+
readonly consumer: Omit<A2AAdapterConsumerConfig, "bearerToken" | "remoteAgentUrls"> & {
|
|
38
|
+
readonly remoteAgentUrls: {
|
|
39
|
+
readonly count: number;
|
|
40
|
+
};
|
|
41
|
+
readonly bearerToken: RedactedSecretValue;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface LoadA2AAdapterConfigInput {
|
|
45
|
+
readonly env: Record<string, string | undefined>;
|
|
46
|
+
readonly json?: SettingsJson;
|
|
47
|
+
readonly jsonPath?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const a2aFieldGroup: FieldGroup;
|
|
50
|
+
export declare function loadA2AAdapterConfig(input: LoadA2AAdapterConfigInput): Promise<A2AAdapterConfig>;
|
|
51
|
+
export declare function redactA2AAdapterConfig(config: A2AAdapterConfig): RedactedA2AAdapterConfig;
|
|
52
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAItD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;CAC7C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,GAAG;QACjE,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EAAE,aAAa,GAAG,iBAAiB,CAAC,GAAG;QACrF,QAAQ,CAAC,eAAe,EAAE;YAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AASD,eAAO,MAAM,aAAa,EAAE,UA2J1B,CAAC;AAEH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CA0C3B;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,GACvB,wBAAwB,CAiB1B"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { defineFieldGroup, isLoopbackHost, layerJsonOntoEnv, normalizeOptionalString, readBoolean, readCsv, readInteger, readJsonSection, readRecord, readRequired, readSettingsJson, readString, redactedSecret, } from "@mono-agent/settings";
|
|
2
|
+
import { A2AProviderError } from "./errors.js";
|
|
3
|
+
import { A2AConsumerError } from "./errors.js";
|
|
4
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
5
|
+
const DEFAULT_PORT = 0;
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
7
|
+
const invalidConfig = (message, details) => new A2AProviderError("invalid_config", message, details);
|
|
8
|
+
export const a2aFieldGroup = defineFieldGroup({
|
|
9
|
+
id: "a2a",
|
|
10
|
+
label: "A2A",
|
|
11
|
+
description: "Optional A2A provider and consumer configuration.",
|
|
12
|
+
fields: [
|
|
13
|
+
{
|
|
14
|
+
id: "a2a.provider.enabled",
|
|
15
|
+
label: "Enable provider",
|
|
16
|
+
description: "Expose this responder as an A2A provider.",
|
|
17
|
+
kind: "switch",
|
|
18
|
+
path: ["a2a", "provider", "enabled"],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "a2a.provider.host",
|
|
22
|
+
label: "Provider host",
|
|
23
|
+
description: "Bind host. Defaults to 127.0.0.1.",
|
|
24
|
+
kind: "string",
|
|
25
|
+
placeholder: "127.0.0.1",
|
|
26
|
+
path: ["a2a", "provider", "host"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "a2a.provider.port",
|
|
30
|
+
label: "Provider port",
|
|
31
|
+
description: "Bind port. Use 0 to choose a free loopback port.",
|
|
32
|
+
kind: "integer",
|
|
33
|
+
min: 0,
|
|
34
|
+
max: 65535,
|
|
35
|
+
placeholder: "0",
|
|
36
|
+
path: ["a2a", "provider", "port"],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "a2a.provider.publicBaseUrl",
|
|
40
|
+
label: "Public base URL",
|
|
41
|
+
description: "Advertised base URL for Agent Card interfaces.",
|
|
42
|
+
kind: "string",
|
|
43
|
+
placeholder: "http://127.0.0.1:4300",
|
|
44
|
+
path: ["a2a", "provider", "publicBaseUrl"],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "a2a.provider.allowNonLoopback",
|
|
48
|
+
label: "Allow non-loopback",
|
|
49
|
+
description: "Explicitly allow public/non-loopback binding or advertised URLs.",
|
|
50
|
+
kind: "switch",
|
|
51
|
+
path: ["a2a", "provider", "allowNonLoopback"],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "a2a.provider.requireBearer",
|
|
55
|
+
label: "Require bearer",
|
|
56
|
+
description: "Require Authorization: Bearer for A2A message and task endpoints.",
|
|
57
|
+
kind: "switch",
|
|
58
|
+
path: ["a2a", "provider", "requireBearer"],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "a2a.provider.bearerToken",
|
|
62
|
+
label: "Provider bearer token",
|
|
63
|
+
description: "Token required when bearer auth is enabled. Never returned to the UI after save.",
|
|
64
|
+
kind: "secret",
|
|
65
|
+
path: ["a2a", "provider", "bearerToken"],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "a2a.agent.name",
|
|
69
|
+
label: "Agent name",
|
|
70
|
+
description: "Human-readable Agent Card name.",
|
|
71
|
+
kind: "string",
|
|
72
|
+
path: ["a2a", "agent", "name"],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "a2a.agent.description",
|
|
76
|
+
label: "Agent description",
|
|
77
|
+
description: "Human-readable Agent Card description.",
|
|
78
|
+
kind: "string",
|
|
79
|
+
path: ["a2a", "agent", "description"],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: "a2a.agent.version",
|
|
83
|
+
label: "Agent version",
|
|
84
|
+
description: "Agent version advertised in the Agent Card.",
|
|
85
|
+
kind: "string",
|
|
86
|
+
placeholder: "0.1.0",
|
|
87
|
+
path: ["a2a", "agent", "version"],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "a2a.agent.providerOrganization",
|
|
91
|
+
label: "Provider organization",
|
|
92
|
+
description: "Optional provider organization for the Agent Card.",
|
|
93
|
+
kind: "string",
|
|
94
|
+
path: ["a2a", "agent", "providerOrganization"],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "a2a.agent.providerUrl",
|
|
98
|
+
label: "Provider URL",
|
|
99
|
+
description: "Optional provider URL for the Agent Card.",
|
|
100
|
+
kind: "string",
|
|
101
|
+
path: ["a2a", "agent", "providerUrl"],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "a2a.skill.id",
|
|
105
|
+
label: "Skill id",
|
|
106
|
+
description: "A2A skill identifier.",
|
|
107
|
+
kind: "string",
|
|
108
|
+
path: ["a2a", "skill", "id"],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "a2a.skill.name",
|
|
112
|
+
label: "Skill name",
|
|
113
|
+
description: "A2A skill name.",
|
|
114
|
+
kind: "string",
|
|
115
|
+
path: ["a2a", "skill", "name"],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "a2a.skill.description",
|
|
119
|
+
label: "Skill description",
|
|
120
|
+
description: "A2A skill description.",
|
|
121
|
+
kind: "string",
|
|
122
|
+
path: ["a2a", "skill", "description"],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "a2a.skill.tags",
|
|
126
|
+
label: "Skill tags",
|
|
127
|
+
description: "Comma-separated A2A skill tags.",
|
|
128
|
+
kind: "csv",
|
|
129
|
+
path: ["a2a", "skill", "tags"],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "a2a.consumer.remoteAgentUrls",
|
|
133
|
+
label: "Remote agent URLs",
|
|
134
|
+
description: "Comma-separated base or Agent Card URLs for remote A2A agents.",
|
|
135
|
+
kind: "csv",
|
|
136
|
+
path: ["a2a", "consumer", "remoteAgentUrls"],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "a2a.consumer.defaultRemoteAgentUrl",
|
|
140
|
+
label: "Default remote URL",
|
|
141
|
+
description: "Default remote A2A agent URL for hosts that need one.",
|
|
142
|
+
kind: "string",
|
|
143
|
+
path: ["a2a", "consumer", "defaultRemoteAgentUrl"],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "a2a.consumer.bearerToken",
|
|
147
|
+
label: "Consumer bearer token",
|
|
148
|
+
description: "Bearer token used when calling remote A2A agents.",
|
|
149
|
+
kind: "secret",
|
|
150
|
+
path: ["a2a", "consumer", "bearerToken"],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: "a2a.consumer.timeoutMs",
|
|
154
|
+
label: "Consumer timeout",
|
|
155
|
+
description: "Per-call timeout in milliseconds.",
|
|
156
|
+
kind: "integer",
|
|
157
|
+
min: 1,
|
|
158
|
+
max: 600_000,
|
|
159
|
+
placeholder: "30000",
|
|
160
|
+
path: ["a2a", "consumer", "timeoutMs"],
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
export async function loadA2AAdapterConfig(input) {
|
|
165
|
+
const json = input.json ?? (input.jsonPath === undefined ? {} : (await readSettingsJson(input.jsonPath)).json);
|
|
166
|
+
const env = layerA2AJsonOntoEnv(json, input.env);
|
|
167
|
+
const enabled = readBoolean(env.MONO_AGENT_A2A_PROVIDER_ENABLED, "MONO_AGENT_A2A_PROVIDER_ENABLED", false, invalidConfig);
|
|
168
|
+
const publicBaseUrl = normalizeOptionalString(env.MONO_AGENT_A2A_PUBLIC_BASE_URL);
|
|
169
|
+
const providerBearerToken = normalizeOptionalString(env.MONO_AGENT_A2A_BEARER_TOKEN);
|
|
170
|
+
const provider = {
|
|
171
|
+
enabled,
|
|
172
|
+
host: readString(env.MONO_AGENT_A2A_HOST, DEFAULT_HOST),
|
|
173
|
+
port: readInteger(env.MONO_AGENT_A2A_PORT, "MONO_AGENT_A2A_PORT", DEFAULT_PORT, invalidConfig, { min: 0, max: 65535 }),
|
|
174
|
+
...(publicBaseUrl === undefined ? {} : { publicBaseUrl }),
|
|
175
|
+
allowNonLoopback: readBoolean(env.MONO_AGENT_A2A_ALLOW_NON_LOOPBACK, "MONO_AGENT_A2A_ALLOW_NON_LOOPBACK", false, invalidConfig),
|
|
176
|
+
requireBearer: readBoolean(env.MONO_AGENT_A2A_REQUIRE_BEARER, "MONO_AGENT_A2A_REQUIRE_BEARER", false, invalidConfig),
|
|
177
|
+
...(providerBearerToken === undefined ? {} : { bearerToken: providerBearerToken }),
|
|
178
|
+
};
|
|
179
|
+
const consumerBearerToken = normalizeOptionalString(env.MONO_AGENT_A2A_CONSUMER_BEARER_TOKEN);
|
|
180
|
+
const defaultRemoteAgentUrl = normalizeOptionalString(env.MONO_AGENT_A2A_DEFAULT_REMOTE_AGENT_URL);
|
|
181
|
+
const consumer = {
|
|
182
|
+
remoteAgentUrls: readCsv(env.MONO_AGENT_A2A_REMOTE_AGENT_URLS),
|
|
183
|
+
...(defaultRemoteAgentUrl === undefined ? {} : { defaultRemoteAgentUrl }),
|
|
184
|
+
...(consumerBearerToken === undefined ? {} : { bearerToken: consumerBearerToken }),
|
|
185
|
+
timeoutMs: readInteger(env.MONO_AGENT_A2A_TIMEOUT_MS, "MONO_AGENT_A2A_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, invalidConfig, {
|
|
186
|
+
min: 1,
|
|
187
|
+
max: 600_000,
|
|
188
|
+
}),
|
|
189
|
+
};
|
|
190
|
+
validateConsumer(consumer);
|
|
191
|
+
if (!provider.enabled) {
|
|
192
|
+
return { provider, consumer };
|
|
193
|
+
}
|
|
194
|
+
validateProvider(provider);
|
|
195
|
+
const agent = readAgentConfig(env);
|
|
196
|
+
const skill = readSkillConfig(env);
|
|
197
|
+
return {
|
|
198
|
+
provider,
|
|
199
|
+
agent,
|
|
200
|
+
skill,
|
|
201
|
+
consumer,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
export function redactA2AAdapterConfig(config) {
|
|
205
|
+
return {
|
|
206
|
+
provider: {
|
|
207
|
+
...withoutBearer(config.provider),
|
|
208
|
+
bearerToken: redactedSecret(config.provider.bearerToken),
|
|
209
|
+
},
|
|
210
|
+
...(config.agent === undefined ? {} : { agent: config.agent }),
|
|
211
|
+
...(config.skill === undefined ? {} : { skill: config.skill }),
|
|
212
|
+
consumer: {
|
|
213
|
+
remoteAgentUrls: { count: config.consumer.remoteAgentUrls.length },
|
|
214
|
+
...(config.consumer.defaultRemoteAgentUrl === undefined
|
|
215
|
+
? {}
|
|
216
|
+
: { defaultRemoteAgentUrl: config.consumer.defaultRemoteAgentUrl }),
|
|
217
|
+
timeoutMs: config.consumer.timeoutMs,
|
|
218
|
+
bearerToken: redactedSecret(config.consumer.bearerToken),
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function readRequiredEnv(raw, envName) {
|
|
223
|
+
return readRequired(raw, envName, () => new A2AProviderError("missing_required_config", `${envName} is required when A2A provider is enabled.`, { env: envName }));
|
|
224
|
+
}
|
|
225
|
+
function readAgentConfig(env) {
|
|
226
|
+
const providerOrganization = normalizeOptionalString(env.MONO_AGENT_A2A_PROVIDER_ORGANIZATION);
|
|
227
|
+
const providerUrl = normalizeOptionalString(env.MONO_AGENT_A2A_PROVIDER_URL);
|
|
228
|
+
return {
|
|
229
|
+
name: readRequiredEnv(env.MONO_AGENT_A2A_AGENT_NAME, "MONO_AGENT_A2A_AGENT_NAME"),
|
|
230
|
+
description: readRequiredEnv(env.MONO_AGENT_A2A_AGENT_DESCRIPTION, "MONO_AGENT_A2A_AGENT_DESCRIPTION"),
|
|
231
|
+
version: readRequiredEnv(env.MONO_AGENT_A2A_AGENT_VERSION, "MONO_AGENT_A2A_AGENT_VERSION"),
|
|
232
|
+
...(providerOrganization === undefined ? {} : { providerOrganization }),
|
|
233
|
+
...(providerUrl === undefined ? {} : { providerUrl }),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function readSkillConfig(env) {
|
|
237
|
+
return {
|
|
238
|
+
id: readRequiredEnv(env.MONO_AGENT_A2A_SKILL_ID, "MONO_AGENT_A2A_SKILL_ID"),
|
|
239
|
+
name: readRequiredEnv(env.MONO_AGENT_A2A_SKILL_NAME, "MONO_AGENT_A2A_SKILL_NAME"),
|
|
240
|
+
description: readRequiredEnv(env.MONO_AGENT_A2A_SKILL_DESCRIPTION, "MONO_AGENT_A2A_SKILL_DESCRIPTION"),
|
|
241
|
+
tags: readCsv(env.MONO_AGENT_A2A_SKILL_TAGS),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function validateProvider(provider) {
|
|
245
|
+
if (provider.requireBearer && provider.bearerToken === undefined) {
|
|
246
|
+
throw new A2AProviderError("missing_required_config", "MONO_AGENT_A2A_BEARER_TOKEN is required when MONO_AGENT_A2A_REQUIRE_BEARER=true.", { env: "MONO_AGENT_A2A_BEARER_TOKEN" });
|
|
247
|
+
}
|
|
248
|
+
if (!provider.allowNonLoopback && !isLoopbackHost(provider.host)) {
|
|
249
|
+
throw new A2AProviderError("unsafe_host", "A2A provider refuses non-loopback host without MONO_AGENT_A2A_ALLOW_NON_LOOPBACK=true.", { host: provider.host });
|
|
250
|
+
}
|
|
251
|
+
if (provider.publicBaseUrl !== undefined) {
|
|
252
|
+
let parsed;
|
|
253
|
+
try {
|
|
254
|
+
parsed = new URL(provider.publicBaseUrl);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
throw new A2AProviderError("invalid_config", "MONO_AGENT_A2A_PUBLIC_BASE_URL must be an absolute URL.", {
|
|
258
|
+
env: "MONO_AGENT_A2A_PUBLIC_BASE_URL",
|
|
259
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
if (!provider.allowNonLoopback && !isLoopbackHost(parsed.hostname)) {
|
|
263
|
+
throw new A2AProviderError("unsafe_host", "A2A provider refuses non-loopback publicBaseUrl without MONO_AGENT_A2A_ALLOW_NON_LOOPBACK=true.", { publicBaseUrl: provider.publicBaseUrl });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function validateConsumer(consumer) {
|
|
268
|
+
for (const url of [
|
|
269
|
+
...consumer.remoteAgentUrls,
|
|
270
|
+
...(consumer.defaultRemoteAgentUrl === undefined ? [] : [consumer.defaultRemoteAgentUrl]),
|
|
271
|
+
]) {
|
|
272
|
+
try {
|
|
273
|
+
new URL(url);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
throw new A2AConsumerError("invalid_agent_card", "A2A remote agent URL must be absolute.", {
|
|
277
|
+
url,
|
|
278
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function layerA2AJsonOntoEnv(json, env) {
|
|
284
|
+
const section = readJsonSection(json, "a2a");
|
|
285
|
+
const provider = readRecord(section.provider);
|
|
286
|
+
const agent = readRecord(section.agent);
|
|
287
|
+
const skill = readRecord(section.skill);
|
|
288
|
+
const consumer = readRecord(section.consumer);
|
|
289
|
+
return layerJsonOntoEnv(env, [
|
|
290
|
+
{ env: "MONO_AGENT_A2A_PROVIDER_ENABLED", value: provider.enabled, kind: "boolean" },
|
|
291
|
+
{ env: "MONO_AGENT_A2A_HOST", value: provider.host },
|
|
292
|
+
{ env: "MONO_AGENT_A2A_PORT", value: provider.port, kind: "integer" },
|
|
293
|
+
{ env: "MONO_AGENT_A2A_PUBLIC_BASE_URL", value: provider.publicBaseUrl },
|
|
294
|
+
{ env: "MONO_AGENT_A2A_ALLOW_NON_LOOPBACK", value: provider.allowNonLoopback, kind: "boolean" },
|
|
295
|
+
{ env: "MONO_AGENT_A2A_REQUIRE_BEARER", value: provider.requireBearer, kind: "boolean" },
|
|
296
|
+
{ env: "MONO_AGENT_A2A_BEARER_TOKEN", value: provider.bearerToken },
|
|
297
|
+
{ env: "MONO_AGENT_A2A_AGENT_NAME", value: agent.name },
|
|
298
|
+
{ env: "MONO_AGENT_A2A_AGENT_DESCRIPTION", value: agent.description },
|
|
299
|
+
{ env: "MONO_AGENT_A2A_AGENT_VERSION", value: agent.version },
|
|
300
|
+
{ env: "MONO_AGENT_A2A_PROVIDER_ORGANIZATION", value: agent.providerOrganization },
|
|
301
|
+
{ env: "MONO_AGENT_A2A_PROVIDER_URL", value: agent.providerUrl },
|
|
302
|
+
{ env: "MONO_AGENT_A2A_SKILL_ID", value: skill.id },
|
|
303
|
+
{ env: "MONO_AGENT_A2A_SKILL_NAME", value: skill.name },
|
|
304
|
+
{ env: "MONO_AGENT_A2A_SKILL_DESCRIPTION", value: skill.description },
|
|
305
|
+
{ env: "MONO_AGENT_A2A_SKILL_TAGS", value: skill.tags, kind: "csv" },
|
|
306
|
+
{ env: "MONO_AGENT_A2A_REMOTE_AGENT_URLS", value: consumer.remoteAgentUrls, kind: "csv" },
|
|
307
|
+
{ env: "MONO_AGENT_A2A_DEFAULT_REMOTE_AGENT_URL", value: consumer.defaultRemoteAgentUrl },
|
|
308
|
+
{ env: "MONO_AGENT_A2A_CONSUMER_BEARER_TOKEN", value: consumer.bearerToken },
|
|
309
|
+
{ env: "MONO_AGENT_A2A_TIMEOUT_MS", value: consumer.timeoutMs, kind: "integer" },
|
|
310
|
+
]);
|
|
311
|
+
}
|
|
312
|
+
function withoutBearer(provider) {
|
|
313
|
+
const { bearerToken: _bearerToken, ...safeProvider } = provider;
|
|
314
|
+
return safeProvider;
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|