@perkos/perkos-a2a 0.4.0 → 0.5.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @perkos/perkos-a2a
2
2
 
3
- Agent-to-Agent (A2A) protocol plugin for [OpenClaw](https://openclaw.ai). Enables multi-agent communication using Google's A2A protocol specification.
3
+ Agent-to-Agent (A2A) protocol plugin for [OpenClaw](https://openclaw.ai). Enables multi-agent communication using Google's A2A protocol specification with enterprise-grade relay infrastructure for NAT traversal.
4
4
 
5
5
  ## Quick Start
6
6
 
@@ -28,6 +28,15 @@ Add to your `openclaw.json`:
28
28
  "mode": "auto",
29
29
  "peers": {
30
30
  "other-agent": "http://10.0.0.2:5050"
31
+ },
32
+ "relay": {
33
+ "url": "wss://relay.perkos.xyz",
34
+ "apiKey": "your-agent-api-key",
35
+ "enabled": true
36
+ },
37
+ "auth": {
38
+ "requireApiKey": true,
39
+ "apiKeys": ["key1", "key2"]
31
40
  }
32
41
  }
33
42
  }
@@ -36,86 +45,246 @@ Add to your `openclaw.json`:
36
45
  }
37
46
  ```
38
47
 
39
- ## Networking Guide
48
+ ## Architecture
49
+
50
+ ### Relay Hub (NAT Traversal)
51
+
52
+ Agents behind NAT connect outbound to the relay hub via WebSocket. The relay routes messages between agents, queues messages for offline agents, and maintains a presence registry.
53
+
54
+ ```mermaid
55
+ graph TB
56
+ subgraph "A2A Relay Hub (Cloud VPS)"
57
+ RH[WebSocket Broker]
58
+ MQ[Message Queue]
59
+ REG[Agent Registry]
60
+ AUTH[API Key Auth]
61
+ RL[Rate Limiter]
62
+ end
63
+
64
+ subgraph "Agent A (Behind NAT)"
65
+ OC_A[OpenClaw Gateway] --> P_A[perkos-a2a plugin]
66
+ P_A --> RC_A[Relay Client]
67
+ end
68
+
69
+ subgraph "Agent B (VPS)"
70
+ OC_B[OpenClaw Gateway] --> P_B[perkos-a2a plugin]
71
+ P_B --> S_B[HTTP Server :5050]
72
+ P_B --> RC_B[Relay Client]
73
+ end
74
+
75
+ subgraph "Agent C (Behind NAT)"
76
+ OC_C[OpenClaw Gateway] --> P_C[perkos-a2a plugin]
77
+ P_C --> RC_C[Relay Client]
78
+ end
79
+
80
+ RC_A <-->|WSS| RH
81
+ RC_B <-->|WSS| RH
82
+ RC_C <-->|WSS| RH
83
+ RC_B <-->|Direct HTTP| S_B
84
+
85
+ style RH fill:#1d1029,stroke:#eb1b69,color:#fff
86
+ style MQ fill:#45193c,stroke:#eb1b69,color:#fff
87
+ style REG fill:#45193c,stroke:#eb1b69,color:#fff
88
+ style AUTH fill:#45193c,stroke:#eb1b69,color:#fff
89
+ style RL fill:#45193c,stroke:#eb1b69,color:#fff
90
+ style OC_A fill:#1d1029,stroke:#eb1b69,color:#fff
91
+ style OC_B fill:#1d1029,stroke:#eb1b69,color:#fff
92
+ style OC_C fill:#1d1029,stroke:#eb1b69,color:#fff
93
+ style P_A fill:#8e2051,stroke:#eb1b69,color:#fff
94
+ style P_B fill:#8e2051,stroke:#eb1b69,color:#fff
95
+ style P_C fill:#8e2051,stroke:#eb1b69,color:#fff
96
+ ```
40
97
 
41
- ### VPS / Public IP
98
+ ### Direct Peer-to-Peer
99
+
100
+ Agents on the same network or with public IPs can communicate directly via HTTP without a relay.
101
+
102
+ ```mermaid
103
+ graph TB
104
+ subgraph "Agent A (VPS)"
105
+ OC_A[OpenClaw Gateway] --> P_A[perkos-a2a plugin]
106
+ P_A --> S_A[A2A Server :5050]
107
+ P_A --> C_A[A2A Client]
108
+ S_A --> AC_A["/.well-known/agent-card.json"]
109
+ S_A --> RPC_A["/a2a/jsonrpc"]
110
+ end
111
+
112
+ subgraph "Agent B (VPS)"
113
+ OC_B[OpenClaw Gateway] --> P_B[perkos-a2a plugin]
114
+ P_B --> S_B[A2A Server :5050]
115
+ P_B --> C_B[A2A Client]
116
+ end
117
+
118
+ C_A <-->|JSON-RPC 2.0| S_B
119
+ C_B <-->|JSON-RPC 2.0| S_A
120
+
121
+ style OC_A fill:#1d1029,stroke:#eb1b69,color:#fff
122
+ style OC_B fill:#1d1029,stroke:#eb1b69,color:#fff
123
+ style P_A fill:#8e2051,stroke:#eb1b69,color:#fff
124
+ style P_B fill:#8e2051,stroke:#eb1b69,color:#fff
125
+ style S_A fill:#76437b,stroke:#eb1b69,color:#fff
126
+ style S_B fill:#76437b,stroke:#eb1b69,color:#fff
127
+ style C_A fill:#45193c,stroke:#eb1b69,color:#fff
128
+ style C_B fill:#45193c,stroke:#eb1b69,color:#fff
129
+ ```
130
+
131
+ ## Task Lifecycle
132
+
133
+ ```mermaid
134
+ sequenceDiagram
135
+ participant Agent A
136
+ participant Relay Hub
137
+ participant Agent B
138
+
139
+ Note over Agent A,Agent B: Via Relay (NAT traversal)
140
+ Agent A->>Relay Hub: WSS: task message (to: Agent B)
141
+ Relay Hub->>Agent B: WSS: forward task
142
+ Agent B->>Agent B: Process task + inject into session
143
+ Agent B->>Relay Hub: WSS: task response
144
+ Relay Hub->>Agent A: WSS: forward response
145
+
146
+ Note over Agent A,Agent B: Via Direct HTTP
147
+ Agent A->>Agent B: POST /a2a/jsonrpc (message/send)
148
+ Agent B->>Agent B: Process task + inject into session
149
+ Agent B-->>Agent A: JSON-RPC response
150
+ ```
42
151
 
43
- If your agent runs on a VPS with a public IP, you're ready to go. Configure peers with your public IP:
152
+ ## Running the Relay Hub
153
+
154
+ The relay hub is a lightweight WebSocket broker. Deploy it on any VPS with a public IP.
155
+
156
+ ```bash
157
+ # Via npx (development)
158
+ npx tsx bin/relay.ts --port 6060 --api-keys key1,key2
159
+
160
+ # Via environment variables
161
+ RELAY_PORT=6060 RELAY_API_KEYS=key1,key2 npx tsx bin/relay.ts
162
+ ```
163
+
164
+ ### Relay Hub Options
165
+
166
+ | Option | Env Var | Default | Description |
167
+ |---|---|---|---|
168
+ | `--port` | `RELAY_PORT` | 6060 | WebSocket listen port |
169
+ | `--api-keys` | `RELAY_API_KEYS` | (none) | Comma-separated accepted API keys |
170
+ | `--max-queue` | `RELAY_MAX_QUEUE` | 200 | Max queued messages per offline agent |
171
+ | `--rate-limit` | `RELAY_RATE_LIMIT` | 60 | Max messages per agent per minute |
172
+
173
+ ## Modes
174
+
175
+ | Mode | HTTP Server | Relay Client | Use Case |
176
+ |---|---|---|---|
177
+ | `auto` | Conditional | If configured | Detects NAT, chooses best option |
178
+ | `full` | Yes | If configured | VPS with public IP |
179
+ | `client-only` | No | If configured | Behind NAT, no local server |
180
+ | `relay` | No | No | Run as relay hub only |
181
+
182
+ ## Configuration
44
183
 
45
184
  ```json
46
- "peers": {
47
- "agent-b": "http://203.0.113.10:5050"
185
+ {
186
+ "agentName": "my-agent",
187
+ "port": 5050,
188
+ "mode": "auto",
189
+ "skills": [],
190
+ "peers": {
191
+ "other-agent": "http://10.0.0.2:5050"
192
+ },
193
+ "relay": {
194
+ "url": "wss://relay.perkos.xyz",
195
+ "apiKey": "agent-specific-key",
196
+ "enabled": true
197
+ },
198
+ "auth": {
199
+ "requireApiKey": true,
200
+ "apiKeys": ["key1", "key2"]
201
+ }
48
202
  }
49
203
  ```
50
204
 
51
- ### Behind NAT (macOS / Laptop)
205
+ | Option | Type | Default | Description |
206
+ |---|---|---|---|
207
+ | `agentName` | string | `"agent"` | This agent's name in the council |
208
+ | `port` | number | `5050` | HTTP server port |
209
+ | `mode` | string | `"auto"` | Operating mode (see table above) |
210
+ | `skills` | array | `[]` | Skills exposed via A2A |
211
+ | `peers` | object | `{}` | Direct peer URLs |
212
+ | `relay.url` | string | - | Relay hub WebSocket URL |
213
+ | `relay.apiKey` | string | - | API key for relay authentication |
214
+ | `relay.enabled` | boolean | `false` | Enable relay connectivity |
215
+ | `auth.requireApiKey` | boolean | `false` | Require API key for inbound HTTP |
216
+ | `auth.apiKeys` | string[] | `[]` | Accepted API keys for inbound HTTP |
217
+
218
+ ## Authentication
219
+
220
+ ### Relay Auth
221
+
222
+ Agents authenticate with the relay hub using an API key provided during WebSocket registration. The relay rejects connections with invalid keys.
223
+
224
+ ### HTTP Auth
52
225
 
53
- Most development machines are behind NAT. The plugin auto-detects this and offers options:
226
+ When `auth.requireApiKey` is enabled, inbound HTTP requests must include an API key via:
227
+ - `X-API-Key` header
228
+ - `Authorization: Bearer <key>` header
229
+ - `?apiKey=<key>` query parameter
54
230
 
55
- **Tailscale (recommended):**
56
- 1. Install Tailscale: https://tailscale.com
57
- 2. Both agents join the same tailnet
58
- 3. Use Tailscale IPs for peers:
59
- ```json
60
- "peers": { "agent-b": "http://100.64.0.2:5050" }
61
- ```
231
+ ## Session Injection
62
232
 
63
- **Cloudflare Tunnel:**
64
- 1. Set up `cloudflared` to expose port 5050
65
- 2. Use the tunnel URL for peers
233
+ When a task is received, the plugin attempts to inject it directly into the agent's OpenClaw session using the plugin API (`api.injectMessage`). If session injection is not available, tasks fall back to writing markdown files to the workspace.
234
+
235
+ ## Agent Tools
236
+
237
+ When the plugin is active, three tools are available to the agent:
66
238
 
67
- **Client-only mode:**
68
- If you only need to send tasks (not receive), set `"mode": "client-only"`. No server is started.
239
+ - `perkos_a2a_discover` -- Discover all configured peer agents and their capabilities (direct + relay)
240
+ - `perkos_a2a_send` -- Send a task to a named peer agent (tries direct HTTP, falls back to relay)
241
+ - `perkos_a2a_status` -- Check the status of a previously sent task
69
242
 
70
243
  ## CLI Commands
71
244
 
72
245
  ```bash
73
246
  openclaw perkos-a2a setup # Detect environment and show recommendations
74
- openclaw perkos-a2a status # Show agent status and config
75
- openclaw perkos-a2a discover # Discover peer agents
247
+ openclaw perkos-a2a status # Show agent status, relay connection, and config
248
+ openclaw perkos-a2a discover # Discover peer agents (direct + relay)
76
249
  openclaw perkos-a2a send <target> <message> # Send a task to a peer
77
250
  ```
78
251
 
79
- ## Configuration
252
+ ## Networking Guide
80
253
 
81
- | Option | Type | Default | Description |
82
- |-------------|----------|----------|------------------------------------------------|
83
- | `agentName` | string | "agent" | This agent's name in the council |
84
- | `port` | number | 5050 | HTTP server port (avoid 5000 on macOS/AirPlay) |
85
- | `mode` | string | "auto" | `full`, `client-only`, or `auto` (detect) |
86
- | `skills` | array | [] | Skills this agent exposes via A2A |
87
- | `peers` | object | {} | Map of peer names to A2A base URLs |
254
+ ### Option 1: Relay Hub (Recommended for NAT)
88
255
 
89
- ### Mode Details
256
+ Deploy the relay hub on a VPS, configure all agents to connect to it. No port forwarding or tunnels needed.
90
257
 
91
- - **auto** (default): Detects NAT/Tailscale. Falls back to client-only if behind NAT with no tunnel. Also falls back if port is unavailable.
92
- - **full**: Always starts the HTTP server. Fails loudly if port is in use.
93
- - **client-only**: No HTTP server. Can send tasks and discover peers but cannot receive inbound tasks.
258
+ ### Option 2: Direct (Public IP / Same Network)
94
259
 
95
- ## Agent Tools
260
+ Agents with public IPs or on the same network can communicate directly via HTTP. Configure peer URLs in the `peers` config.
96
261
 
97
- When the plugin is active, three tools are available to the agent:
262
+ ### Option 3: Tailscale
98
263
 
99
- - `a2a_discover` -- Discover all configured peer agents and their capabilities
100
- - `a2a_send_task` -- Send a task to a named peer agent
101
- - `a2a_task_status` -- Check the status of a previously sent task
264
+ Both agents join the same tailnet. Use Tailscale IPs for peer URLs.
265
+
266
+ ### Option 4: Client-Only
267
+
268
+ Set `"mode": "client-only"` to only send tasks (not receive). Combine with relay for full bidirectional support.
102
269
 
103
270
  ## Troubleshooting
104
271
 
272
+ **Relay connection failing:**
273
+ - Verify the relay URL is correct and reachable
274
+ - Check that your API key matches one configured on the relay hub
275
+ - Look for `[perkos-a2a]` log messages for connection errors
276
+
105
277
  **Port 5050 in use:**
106
278
  Change the port in config, or run `lsof -i :5050` to find the conflicting process.
107
279
 
108
- **Port 5000 on macOS:**
109
- macOS Monterey+ uses port 5000 for AirPlay Receiver. Use 5050 (the default) instead.
110
-
111
280
  **Peers show offline:**
112
281
  - Verify the peer URL is correct and reachable
113
282
  - Check firewalls/security groups
114
- - If behind NAT, ensure both agents are on the same tailnet or have tunnel access
283
+ - If using relay, verify both agents are connected to the same relay hub
115
284
 
116
- **Auto mode starts client-only unexpectedly:**
117
- - Run `openclaw perkos-a2a setup` to diagnose
118
- - Force `"mode": "full"` if you know the port is accessible
285
+ **Auth errors (401):**
286
+ - Ensure your API key is in the target agent's `auth.apiKeys` list
287
+ - Check `X-API-Key` header is being sent correctly
119
288
 
120
289
  ## License
121
290
 
package/bin/relay.ts ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone A2A Relay Hub
4
+ *
5
+ * Usage:
6
+ * npx tsx bin/relay.ts [--port 6060] [--api-keys key1,key2]
7
+ *
8
+ * Environment variables:
9
+ * RELAY_PORT - WebSocket port (default: 6060)
10
+ * RELAY_API_KEYS - Comma-separated list of accepted API keys
11
+ * RELAY_MAX_QUEUE - Max queued messages per offline agent (default: 200)
12
+ * RELAY_RATE_LIMIT - Max messages per agent per minute (default: 60)
13
+ */
14
+
15
+ import { RelayHub } from "../src/relay.js";
16
+ import type { RelayHubConfig } from "../src/relay.js";
17
+
18
+ function parseArgs(): Partial<RelayHubConfig> {
19
+ const args = process.argv.slice(2);
20
+ const config: Partial<RelayHubConfig> = {};
21
+
22
+ for (let i = 0; i < args.length; i++) {
23
+ switch (args[i]) {
24
+ case "--port":
25
+ case "-p":
26
+ config.port = parseInt(args[++i], 10);
27
+ break;
28
+ case "--api-keys":
29
+ config.apiKeys = args[++i].split(",").map((k) => k.trim()).filter(Boolean);
30
+ break;
31
+ case "--max-queue":
32
+ config.maxQueuePerAgent = parseInt(args[++i], 10);
33
+ break;
34
+ case "--rate-limit":
35
+ config.rateLimitPerMinute = parseInt(args[++i], 10);
36
+ break;
37
+ case "--help":
38
+ case "-h":
39
+ console.log("A2A Relay Hub");
40
+ console.log("");
41
+ console.log("Options:");
42
+ console.log(" --port, -p <port> WebSocket port (default: 6060)");
43
+ console.log(" --api-keys <k1,k2,...> Accepted API keys (default: none, auth disabled)");
44
+ console.log(" --max-queue <n> Max queued messages per offline agent (default: 200)");
45
+ console.log(" --rate-limit <n> Max messages per agent per minute (default: 60)");
46
+ console.log("");
47
+ console.log("Environment variables:");
48
+ console.log(" RELAY_PORT, RELAY_API_KEYS, RELAY_MAX_QUEUE, RELAY_RATE_LIMIT");
49
+ process.exit(0);
50
+ }
51
+ }
52
+
53
+ // Environment variable overrides
54
+ if (!config.port && process.env.RELAY_PORT) {
55
+ config.port = parseInt(process.env.RELAY_PORT, 10);
56
+ }
57
+ if (!config.apiKeys && process.env.RELAY_API_KEYS) {
58
+ config.apiKeys = process.env.RELAY_API_KEYS.split(",").map((k) => k.trim()).filter(Boolean);
59
+ }
60
+ if (!config.maxQueuePerAgent && process.env.RELAY_MAX_QUEUE) {
61
+ config.maxQueuePerAgent = parseInt(process.env.RELAY_MAX_QUEUE, 10);
62
+ }
63
+ if (!config.rateLimitPerMinute && process.env.RELAY_RATE_LIMIT) {
64
+ config.rateLimitPerMinute = parseInt(process.env.RELAY_RATE_LIMIT, 10);
65
+ }
66
+
67
+ return config;
68
+ }
69
+
70
+ const config = parseArgs();
71
+ const hub = new RelayHub(config);
72
+
73
+ hub.start();
74
+
75
+ console.log("[perkos-a2a] Relay hub running");
76
+ console.log(`[perkos-a2a] Port: ${config.port || 6060}`);
77
+ console.log(`[perkos-a2a] Auth: ${config.apiKeys?.length ? "enabled" : "disabled (no API keys configured)"}`);
78
+
79
+ process.on("SIGINT", () => {
80
+ console.log("\n[perkos-a2a] Shutting down relay hub...");
81
+ hub.stop();
82
+ process.exit(0);
83
+ });
84
+
85
+ process.on("SIGTERM", () => {
86
+ hub.stop();
87
+ process.exit(0);
88
+ });
package/dist/index.d.ts CHANGED
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * Agent-to-Agent (A2A) protocol communication plugin.
5
5
  * Adds tools for agents to discover peers, send tasks, and check task status.
6
- * Runs an A2A-compliant HTTP server alongside the OpenClaw gateway.
6
+ * Supports direct HTTP, relay-based NAT traversal, and session injection.
7
7
  */
8
8
  export { A2AServer, detectNetworking } from "./server.js";
9
+ export { RelayHub } from "./relay.js";
10
+ export { RelayClient } from "./relay-client.js";
9
11
  export * from "./types.js";
10
12
  export default function register(api: any): void;
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,cAAc,YAAY,CAAC;AAE3B,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QA0TxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,cAAc,YAAY,CAAC;AAE3B,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QA8VxC"}
package/dist/index.js CHANGED
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * Agent-to-Agent (A2A) protocol communication plugin.
5
5
  * Adds tools for agents to discover peers, send tasks, and check task status.
6
- * Runs an A2A-compliant HTTP server alongside the OpenClaw gateway.
6
+ * Supports direct HTTP, relay-based NAT traversal, and session injection.
7
7
  */
8
8
  import { A2AServer, detectNetworking } from "./server.js";
9
9
  export { A2AServer, detectNetworking } from "./server.js";
10
+ export { RelayHub } from "./relay.js";
11
+ export { RelayClient } from "./relay-client.js";
10
12
  export * from "./types.js";
11
13
  export default function register(api) {
12
14
  const pluginConfig = api.config?.plugins?.entries?.["perkos-a2a"]?.config || {
@@ -17,6 +19,22 @@ export default function register(api) {
17
19
  };
18
20
  const logger = api.logger || console;
19
21
  const server = new A2AServer(pluginConfig, logger);
22
+ // Wire up session injection if the plugin API supports it
23
+ if (typeof api.injectMessage === "function") {
24
+ server.setMessageInjector((text, metadata) => {
25
+ api.injectMessage(text, metadata);
26
+ });
27
+ logger.info("[perkos-a2a] Session injection enabled");
28
+ }
29
+ else if (typeof api.sendMessage === "function") {
30
+ server.setMessageInjector((text, metadata) => {
31
+ api.sendMessage({ text, metadata });
32
+ });
33
+ logger.info("[perkos-a2a] Session injection enabled (sendMessage)");
34
+ }
35
+ else {
36
+ logger.info("[perkos-a2a] Session injection not available, tasks will be written to files");
37
+ }
20
38
  // Start A2A server as background service
21
39
  api.registerService({
22
40
  id: "perkos-a2a",
@@ -30,7 +48,7 @@ export default function register(api) {
30
48
  });
31
49
  // Tool: Send a task to a peer agent
32
50
  api.registerTool({
33
- name: "a2a_send_task",
51
+ name: "perkos_a2a_send",
34
52
  description: "Send a task to another agent in the council via A2A protocol. " +
35
53
  "Use this to delegate work to a peer agent.",
36
54
  parameters: {
@@ -84,7 +102,7 @@ export default function register(api) {
84
102
  });
85
103
  // Tool: Discover peer agents
86
104
  api.registerTool({
87
- name: "a2a_discover",
105
+ name: "perkos_a2a_discover",
88
106
  description: "Discover all peer agents in the council and their capabilities. " +
89
107
  "Returns each agent's status, name, description, and skills.",
90
108
  parameters: {
@@ -123,7 +141,7 @@ export default function register(api) {
123
141
  });
124
142
  // Tool: Get task status
125
143
  api.registerTool({
126
- name: "a2a_task_status",
144
+ name: "perkos_a2a_status",
127
145
  description: "Get the status of a previously sent A2A task by its ID.",
128
146
  parameters: {
129
147
  type: "object",
@@ -134,7 +152,7 @@ export default function register(api) {
134
152
  },
135
153
  taskId: {
136
154
  type: "string",
137
- description: "The task ID returned from a2a_send_task",
155
+ description: "The task ID returned from perkos_a2a_send",
138
156
  },
139
157
  },
140
158
  required: ["target", "taskId"],
@@ -149,9 +167,14 @@ export default function register(api) {
149
167
  };
150
168
  }
151
169
  try {
170
+ const headers = { "Content-Type": "application/json" };
171
+ const peerAuth = pluginConfig.peerAuth?.[params.target];
172
+ if (peerAuth) {
173
+ headers["x-api-key"] = peerAuth;
174
+ }
152
175
  const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {
153
176
  method: "POST",
154
- headers: { "Content-Type": "application/json" },
177
+ headers,
155
178
  body: JSON.stringify({
156
179
  jsonrpc: "2.0",
157
180
  method: "tasks/get",
@@ -195,15 +218,17 @@ export default function register(api) {
195
218
  },
196
219
  });
197
220
  // Gateway RPC method
198
- api.registerGatewayMethod("a2a.status", ({ respond }) => {
221
+ api.registerGatewayMethod("perkos-a2a.status", ({ respond }) => {
199
222
  respond(true, {
200
223
  agent: pluginConfig.agentName,
201
224
  port: pluginConfig.port,
202
225
  mode: pluginConfig.mode || "auto",
203
226
  clientOnly: server.isClientOnly(),
227
+ relayConnected: server.isRelayConnected(),
228
+ relayUrl: pluginConfig.relay?.url || null,
204
229
  peers: Object.keys(pluginConfig.peers),
205
230
  protocol: "a2a",
206
- version: "0.4.0",
231
+ version: "0.5.1",
207
232
  });
208
233
  });
209
234
  // CLI command
@@ -217,6 +242,9 @@ export default function register(api) {
217
242
  console.log(`Port: ${pluginConfig.port}`);
218
243
  console.log(`Mode: ${pluginConfig.mode || "auto"}`);
219
244
  console.log(`Client-only: ${server.isClientOnly()}`);
245
+ console.log(`Relay connected: ${server.isRelayConnected()}`);
246
+ console.log(`Relay URL: ${pluginConfig.relay?.url || "(not configured)"}`);
247
+ console.log(`Auth required: ${pluginConfig.auth?.requireApiKey || false}`);
220
248
  console.log(`Peers: ${Object.keys(pluginConfig.peers).join(", ") || "(none)"}`);
221
249
  });
222
250
  cmd
@@ -271,20 +299,30 @@ export default function register(api) {
271
299
  // ignore
272
300
  }
273
301
  console.log(`Port ${pluginConfig.port}: ${portAvailable ? "available" : "IN USE"}`);
302
+ // Relay status
303
+ console.log(`\nRelay: ${pluginConfig.relay?.enabled ? "enabled" : "disabled"}`);
304
+ if (pluginConfig.relay?.url) {
305
+ console.log(`Relay URL: ${pluginConfig.relay.url}`);
306
+ }
307
+ console.log(`Auth: ${pluginConfig.auth?.requireApiKey ? "enabled" : "disabled"}`);
274
308
  console.log("\n--- Recommendations ---\n");
275
309
  if (!net.isBehindNat) {
276
- console.log("You're good! Configure peers with your public IP.");
310
+ console.log("You have a public IP. Configure peers with your public IP.");
277
311
  console.log(` Your A2A URL: http://${net.publicIp}:${pluginConfig.port}/a2a/jsonrpc`);
278
312
  }
313
+ else if (pluginConfig.relay?.enabled) {
314
+ console.log("You are behind NAT but relay is configured. Bidirectional communication via relay.");
315
+ }
279
316
  else if (net.hasTailscale && net.tailscaleIp) {
280
317
  console.log("Use your Tailscale IP for peers.");
281
318
  console.log(` Your A2A URL: http://${net.tailscaleIp}:${pluginConfig.port}/a2a/jsonrpc`);
282
319
  }
283
320
  else {
284
321
  console.log("You are behind NAT. Options:");
285
- console.log(" 1) Install Tailscale (recommended) - https://tailscale.com");
286
- console.log(" 2) Set up a Cloudflare Tunnel");
287
- console.log(' 3) Client-only mode (can send tasks but not receive) - set mode: "client-only"');
322
+ console.log(" 1) Configure a relay hub (recommended) - set relay.url and relay.enabled in config");
323
+ console.log(" 2) Install Tailscale - https://tailscale.com");
324
+ console.log(" 3) Set up a Cloudflare Tunnel");
325
+ console.log(' 4) Client-only mode (can send but not receive) - set mode: "client-only"');
288
326
  }
289
327
  if (!portAvailable) {
290
328
  console.log(`\nWarning: Port ${pluginConfig.port} is in use. Change the port in your config or stop the conflicting service.`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}