@perkos/perkos-a2a 0.8.35 → 0.9.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.
Files changed (50) hide show
  1. package/README.md +99 -21
  2. package/dist/agent.d.ts +14 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +363 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/agentic-actions.js +472 -0
  7. package/dist/agentic-actions.js.map +1 -0
  8. package/dist/chat-client.d.ts +77 -0
  9. package/dist/chat-client.d.ts.map +1 -0
  10. package/dist/chat-client.js +364 -0
  11. package/dist/chat-client.js.map +1 -0
  12. package/dist/chat-store.d.ts +87 -0
  13. package/dist/chat-store.d.ts.map +1 -0
  14. package/dist/chat-store.js +233 -0
  15. package/dist/chat-store.js.map +1 -0
  16. package/dist/chat-types.d.ts +166 -0
  17. package/dist/chat-types.d.ts.map +1 -0
  18. package/dist/chat-types.js +13 -0
  19. package/dist/chat-types.js.map +1 -0
  20. package/dist/hermes-cli.d.ts +30 -0
  21. package/dist/hermes-cli.d.ts.map +1 -0
  22. package/dist/hermes-cli.js +120 -0
  23. package/dist/hermes-cli.js.map +1 -0
  24. package/dist/hermes-plugin.d.ts +91 -0
  25. package/dist/hermes-plugin.d.ts.map +1 -0
  26. package/dist/hermes-plugin.js +196 -0
  27. package/dist/hermes-plugin.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1022 -26
  31. package/dist/index.js.map +4 -4
  32. package/dist/pairing.js +66 -0
  33. package/dist/pairing.js.map +1 -0
  34. package/dist/relay-client.js +222 -0
  35. package/dist/relay-client.js.map +1 -0
  36. package/dist/relay.js +274 -0
  37. package/dist/relay.js.map +1 -0
  38. package/dist/runtime-reply.js +137 -0
  39. package/dist/runtime-reply.js.map +1 -0
  40. package/dist/server.js +611 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/types.d.ts +36 -1
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js +4 -1
  45. package/dist/types.js.map +1 -1
  46. package/docs/chat-client.md +190 -0
  47. package/docs/demo-setup.md +273 -0
  48. package/openclaw.plugin.json +38 -1
  49. package/package.json +25 -21
  50. package/scripts/hermes/install.mjs +211 -0
package/dist/server.js ADDED
@@ -0,0 +1,611 @@
1
+ /**
2
+ * A2A Protocol Server
3
+ * Express-based JSON-RPC 2.0 server with Agent Card discovery.
4
+ * Supports full, client-only, relay, and auto modes.
5
+ * Integrates with the relay hub for NAT traversal when configured.
6
+ */
7
+ import express from "express";
8
+ import { randomUUID } from "crypto";
9
+ import { readFileSync } from "fs";
10
+ import { homedir, networkInterfaces } from "os";
11
+ import { RelayClient } from "./relay-client.js";
12
+ import { RelayHub } from "./relay.js";
13
+ import { isTerminalTaskState } from "./runtime-reply.js";
14
+ function appendArtifact(task, text) {
15
+ task.artifacts.push({
16
+ kind: "artifact",
17
+ artifactId: randomUUID(),
18
+ parts: [{ kind: "text", text }],
19
+ });
20
+ }
21
+ const PROTOCOL_VERSION = "0.8.1";
22
+ const PACKAGE_VERSION = (() => {
23
+ try {
24
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
25
+ return pkg.version || "unknown";
26
+ }
27
+ catch {
28
+ return "unknown";
29
+ }
30
+ })();
31
+ /** Detect if the host is behind NAT by comparing public IP to local interfaces */
32
+ export async function detectNetworking() {
33
+ const localIps = [];
34
+ const ifaces = networkInterfaces();
35
+ for (const addrs of Object.values(ifaces)) {
36
+ if (!addrs)
37
+ continue;
38
+ for (const a of addrs) {
39
+ if (!a.internal && a.family === "IPv4") {
40
+ localIps.push(a.address);
41
+ }
42
+ }
43
+ }
44
+ let publicIp = null;
45
+ try {
46
+ const res = await fetch("https://api.ipify.org?format=text", {
47
+ signal: AbortSignal.timeout(5000),
48
+ });
49
+ publicIp = (await res.text()).trim();
50
+ }
51
+ catch {
52
+ // unable to reach internet
53
+ }
54
+ const isBehindNat = publicIp !== null && !localIps.includes(publicIp);
55
+ // Avoid shelling out here so the plugin passes OpenClaw's safety scanner.
56
+ // Tailscale presence/IP can be supplied by config or discovered externally if needed.
57
+ const hasTailscale = false;
58
+ const tailscaleIp = null;
59
+ return { isBehindNat, publicIp, localIps, hasTailscale, tailscaleIp };
60
+ }
61
+ export class A2AServer {
62
+ app;
63
+ tasks = new Map();
64
+ agentCard;
65
+ config;
66
+ logger;
67
+ clientOnly = false;
68
+ relayClient = null;
69
+ relayHub = null;
70
+ messageInjector = null;
71
+ taskResultHandler = null;
72
+ taskFailureHandler = null;
73
+ lastRuntimeDelivery = null;
74
+ constructor(config, logger) {
75
+ this.config = config;
76
+ this.logger = logger || { info: console.log, error: console.error };
77
+ this.app = express();
78
+ this.app.use(express.json());
79
+ this.agentCard = {
80
+ name: config.agentName,
81
+ description: `PerkOS agent: ${config.agentName}`,
82
+ protocolVersion: "0.3.0",
83
+ version: "1.0.0",
84
+ url: `${(config.publicUrl || `http://localhost:${config.port}`).replace(/\/+$/, "")}/a2a/jsonrpc`,
85
+ skills: config.skills || [],
86
+ capabilities: { pushNotifications: false },
87
+ defaultInputModes: ["text"],
88
+ defaultOutputModes: ["text"],
89
+ };
90
+ this.setupRoutes();
91
+ }
92
+ /** Set the message injector for delivering tasks into the agent session */
93
+ setMessageInjector(injector) {
94
+ this.messageInjector = injector;
95
+ }
96
+ setTaskResultHandler(handler) {
97
+ this.taskResultHandler = handler;
98
+ }
99
+ setTaskFailureHandler(handler) {
100
+ this.taskFailureHandler = handler;
101
+ }
102
+ getTasks() {
103
+ return this.tasks.values();
104
+ }
105
+ recordRuntimeDelivery(result) {
106
+ this.lastRuntimeDelivery = {
107
+ ...result,
108
+ timestamp: result.timestamp || new Date().toISOString(),
109
+ };
110
+ }
111
+ isClientOnly() {
112
+ return this.clientOnly;
113
+ }
114
+ isRelayConnected() {
115
+ return this.relayClient?.isConnected() || false;
116
+ }
117
+ authMiddleware() {
118
+ return (req, res, next) => {
119
+ if (!this.config.auth?.requireApiKey) {
120
+ next();
121
+ return;
122
+ }
123
+ const apiKey = req.headers["x-api-key"] ||
124
+ req.headers["authorization"]?.replace(/^Bearer\s+/i, "") ||
125
+ req.query["apiKey"];
126
+ if (!apiKey || !this.config.auth.apiKeys.includes(apiKey)) {
127
+ res.status(401).json({ error: "Unauthorized: invalid or missing API key" });
128
+ return;
129
+ }
130
+ next();
131
+ };
132
+ }
133
+ setupRoutes() {
134
+ // Public endpoints (no auth required)
135
+ this.app.get("/.well-known/agent-card.json", (_req, res) => {
136
+ res.json(this.agentCard);
137
+ });
138
+ this.app.get("/health", (_req, res) => {
139
+ const runtimeKind = this.config.runtime?.kind || "unknown";
140
+ const runtimeDeliveryConfigured = Boolean(this.messageInjector || this.taskResultHandler || runtimeKind === "none");
141
+ const runtimeDeliveryValidated = this.lastRuntimeDelivery?.ok ?? (runtimeKind === "none" ? true : null);
142
+ res.json({
143
+ ok: true,
144
+ agent: this.config.agentName,
145
+ protocol: "a2a",
146
+ packageVersion: PACKAGE_VERSION,
147
+ protocolVersion: PROTOCOL_VERSION,
148
+ version: PACKAGE_VERSION,
149
+ runtimeKind,
150
+ runtimeDeliveryConfigured,
151
+ runtimeDeliveryValidated,
152
+ runtimeDeliveryStatus: this.lastRuntimeDelivery?.status || (runtimeKind === "none" ? "disabled" : "not_validated_by_health"),
153
+ lastRuntimeDelivery: this.lastRuntimeDelivery,
154
+ peers: Object.keys(this.config.peers),
155
+ taskCount: this.tasks.size,
156
+ relayConnected: this.isRelayConnected(),
157
+ relayUrl: this.config.relay?.url,
158
+ });
159
+ });
160
+ // Protected endpoints
161
+ const auth = this.authMiddleware();
162
+ this.app.post("/a2a/jsonrpc", auth, async (req, res) => {
163
+ const { method, params, id } = req.body;
164
+ try {
165
+ let result;
166
+ switch (method) {
167
+ case "message/send":
168
+ result = await this.handleSendMessage(params, id);
169
+ break;
170
+ case "tasks/get":
171
+ result = this.handleGetTask(params, id);
172
+ break;
173
+ case "tasks/list":
174
+ result = this.handleListTasks(id);
175
+ break;
176
+ case "tasks/cancel":
177
+ result = this.handleCancelTask(params, id);
178
+ break;
179
+ case "agent/card":
180
+ result = this.success(id, this.agentCard);
181
+ break;
182
+ default:
183
+ result = this.error(id, -32601, `Method not found: ${method}`);
184
+ }
185
+ res.json(result);
186
+ }
187
+ catch (err) {
188
+ const msg = err instanceof Error ? err.message : String(err);
189
+ this.logger.error(`[perkos-a2a] RPC error: ${msg}`);
190
+ res.json(this.error(id, -32603, msg));
191
+ }
192
+ });
193
+ this.app.get("/a2a/peers", auth, async (_req, res) => {
194
+ const results = await this.discoverPeers();
195
+ res.json(results);
196
+ });
197
+ this.app.post("/a2a/send", auth, async (req, res) => {
198
+ const { target, message } = req.body;
199
+ try {
200
+ const result = await this.sendTask(target, message);
201
+ res.json({ ok: true, result });
202
+ }
203
+ catch (err) {
204
+ const msg = err instanceof Error ? err.message : String(err);
205
+ res.status(500).json({ ok: false, error: msg });
206
+ }
207
+ });
208
+ }
209
+ async handleSendMessage(params, rpcId) {
210
+ const message = params.message;
211
+ const taskId = randomUUID();
212
+ const contextId = message?.contextId || randomUUID();
213
+ const task = {
214
+ kind: "task",
215
+ id: taskId,
216
+ contextId,
217
+ status: { state: "submitted", timestamp: new Date().toISOString() },
218
+ messages: [message],
219
+ artifacts: [],
220
+ metadata: {
221
+ fromAgent: message?.metadata?.fromAgent || "unknown",
222
+ },
223
+ sessionKeyHint: "agent:main",
224
+ };
225
+ this.tasks.set(taskId, task);
226
+ this.logger.info(`[perkos-a2a] Task ${taskId} received from ${task.metadata?.fromAgent}`);
227
+ void this.processTask(task);
228
+ return this.success(rpcId, task);
229
+ }
230
+ async processTask(task) {
231
+ task.status = { state: "working", timestamp: new Date().toISOString() };
232
+ this.tasks.set(task.id, structuredClone(task));
233
+ const textParts = task.messages
234
+ .flatMap((m) => m.parts || [])
235
+ .filter((p) => p.kind === "text")
236
+ .map((p) => p.text)
237
+ .join("\n");
238
+ try {
239
+ // Optional session injection for observability
240
+ if (this.messageInjector) {
241
+ this.messageInjector(textParts, {
242
+ source: "a2a",
243
+ fromAgent: task.metadata?.fromAgent,
244
+ taskId: task.id,
245
+ });
246
+ appendArtifact(task, "Task accepted and dispatched for execution");
247
+ this.tasks.set(task.id, structuredClone(task));
248
+ }
249
+ else {
250
+ // Fallback: write to file
251
+ const fs = await import("fs");
252
+ const taskDir = this.config.workspacePath
253
+ || `${homedir()}/.openclaw/workspace/memory`;
254
+ if (!fs.existsSync(taskDir)) {
255
+ fs.mkdirSync(taskDir, { recursive: true });
256
+ }
257
+ const taskFile = `${taskDir}/a2a-task-${task.id}.md`;
258
+ const content = [
259
+ "# A2A Task",
260
+ "",
261
+ `**From:** ${task.metadata?.fromAgent}`,
262
+ `**Task ID:** ${task.id}`,
263
+ `**Time:** ${new Date().toISOString()}`,
264
+ "",
265
+ "## Message",
266
+ "",
267
+ textParts,
268
+ "",
269
+ ].join("\n");
270
+ fs.writeFileSync(taskFile, content);
271
+ appendArtifact(task, `Task queued: ${taskFile}`);
272
+ this.tasks.set(task.id, structuredClone(task));
273
+ }
274
+ if (this.taskResultHandler) {
275
+ await this.taskResultHandler(task, textParts);
276
+ }
277
+ else {
278
+ task.status = {
279
+ state: "completed",
280
+ timestamp: new Date().toISOString(),
281
+ };
282
+ }
283
+ this.tasks.set(task.id, structuredClone(task));
284
+ this.logger.info(`[perkos-a2a] Task ${task.id} completed`);
285
+ }
286
+ catch (err) {
287
+ const msg = err instanceof Error ? err.message : String(err);
288
+ if (this.taskFailureHandler) {
289
+ await this.taskFailureHandler(task, msg);
290
+ }
291
+ else {
292
+ task.status = {
293
+ state: "failed",
294
+ timestamp: new Date().toISOString(),
295
+ message: {
296
+ role: "agent",
297
+ parts: [{ kind: "text", text: msg }],
298
+ },
299
+ };
300
+ }
301
+ this.tasks.set(task.id, structuredClone(task));
302
+ this.logger.error(`[perkos-a2a] Task ${task.id} failed: ${msg}`);
303
+ }
304
+ }
305
+ handleGetTask(params, rpcId) {
306
+ const task = this.tasks.get(params?.id);
307
+ if (!task)
308
+ return this.error(rpcId, 404, "Task not found");
309
+ return this.success(rpcId, structuredClone(task));
310
+ }
311
+ handleListTasks(rpcId) {
312
+ const allTasks = Array.from(this.tasks.values()).map((task) => structuredClone(task)).sort((a, b) => new Date(b.status.timestamp).getTime() -
313
+ new Date(a.status.timestamp).getTime());
314
+ return this.success(rpcId, { tasks: allTasks, nextPageToken: "" });
315
+ }
316
+ handleCancelTask(params, rpcId) {
317
+ const task = this.tasks.get(params?.id);
318
+ if (!task)
319
+ return this.error(rpcId, 404, "Task not found");
320
+ if (["completed", "failed", "canceled"].includes(task.status.state)) {
321
+ return this.error(rpcId, 409, "Task not cancelable");
322
+ }
323
+ task.status = { state: "canceled", timestamp: new Date().toISOString() };
324
+ return this.success(rpcId, task);
325
+ }
326
+ /** Send a task to a peer agent via A2A protocol (direct HTTP or relay) */
327
+ async sendTask(targetAgent, messageText) {
328
+ const targetUrl = this.config.peers[targetAgent];
329
+ // Try direct HTTP first if peer URL is configured
330
+ if (targetUrl) {
331
+ try {
332
+ return await this.sendTaskDirect(targetAgent, targetUrl, messageText);
333
+ }
334
+ catch (err) {
335
+ // If relay is available, fall through to relay
336
+ if (!this.relayClient?.isConnected()) {
337
+ throw err;
338
+ }
339
+ this.logger.info(`[perkos-a2a] Direct send to ${targetAgent} failed, falling back to relay`);
340
+ }
341
+ }
342
+ // Try relay
343
+ if (this.relayClient?.isConnected()) {
344
+ return this.sendTaskViaRelay(targetAgent, messageText);
345
+ }
346
+ throw new Error(`Cannot reach ${targetAgent}: no direct URL configured and relay not connected. ` +
347
+ `Known peers: ${Object.keys(this.config.peers).join(", ")}`);
348
+ }
349
+ async sendTaskDirect(targetAgent, targetUrl, messageText) {
350
+ const headers = { "Content-Type": "application/json" };
351
+ // Include auth token if peer has one configured
352
+ const peerAuth = this.config.peerAuth?.[targetAgent];
353
+ if (peerAuth) {
354
+ headers["x-api-key"] = peerAuth;
355
+ }
356
+ const payload = {
357
+ jsonrpc: "2.0",
358
+ method: "message/send",
359
+ id: randomUUID(),
360
+ params: {
361
+ message: {
362
+ kind: "message",
363
+ messageId: randomUUID(),
364
+ role: "user",
365
+ parts: [{ kind: "text", text: messageText }],
366
+ metadata: { fromAgent: this.config.agentName },
367
+ },
368
+ },
369
+ };
370
+ const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {
371
+ method: "POST",
372
+ headers,
373
+ body: JSON.stringify(payload),
374
+ });
375
+ const initial = (await response.json());
376
+ const task = initial.result;
377
+ if (task?.id && !isTerminalTaskState(task.status?.state)) {
378
+ const terminal = await this.waitForRemoteTaskTerminal(targetUrl, headers, task.id).catch((err) => {
379
+ const msg = err instanceof Error ? err.message : String(err);
380
+ this.logger.info(`[perkos-a2a] Waiting for ${targetAgent} task ${task.id} terminal state failed: ${msg}`);
381
+ return null;
382
+ });
383
+ if (terminal)
384
+ return terminal;
385
+ }
386
+ return initial;
387
+ }
388
+ async waitForRemoteTaskTerminal(targetUrl, headers, taskId, timeoutMs = 45_000, pollMs = 1_000) {
389
+ const deadline = Date.now() + timeoutMs;
390
+ while (Date.now() < deadline) {
391
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
392
+ const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {
393
+ method: "POST",
394
+ headers,
395
+ body: JSON.stringify({
396
+ jsonrpc: "2.0",
397
+ method: "tasks/get",
398
+ id: randomUUID(),
399
+ params: { id: taskId },
400
+ }),
401
+ });
402
+ const json = (await response.json());
403
+ const task = json.result;
404
+ if (task && isTerminalTaskState(task.status?.state))
405
+ return json;
406
+ }
407
+ return null;
408
+ }
409
+ async waitForLocalTaskTerminal(taskId, timeoutMs = 45_000, pollMs = 1_000) {
410
+ const deadline = Date.now() + timeoutMs;
411
+ while (Date.now() < deadline) {
412
+ const task = this.tasks.get(taskId);
413
+ if (task && isTerminalTaskState(task.status?.state)) {
414
+ return this.success(randomUUID(), structuredClone(task));
415
+ }
416
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
417
+ }
418
+ return null;
419
+ }
420
+ async sendTaskViaRelay(targetAgent, messageText) {
421
+ const rpcId = randomUUID();
422
+ const result = await this.relayClient.sendTask(targetAgent, {
423
+ jsonrpc: "2.0",
424
+ method: "message/send",
425
+ id: rpcId,
426
+ params: {
427
+ message: {
428
+ kind: "message",
429
+ messageId: randomUUID(),
430
+ role: "user",
431
+ parts: [{ kind: "text", text: messageText }],
432
+ metadata: { fromAgent: this.config.agentName },
433
+ },
434
+ },
435
+ });
436
+ return result.payload || this.success(rpcId, result.payload);
437
+ }
438
+ /** Discover all peer agents (direct + relay) */
439
+ async discoverPeers() {
440
+ const results = {};
441
+ // Direct peer discovery
442
+ for (const [name, url] of Object.entries(this.config.peers)) {
443
+ try {
444
+ const r = await fetch(`${url}/.well-known/agent-card.json`, {
445
+ signal: AbortSignal.timeout(3000),
446
+ });
447
+ results[name] = { status: "online", card: (await r.json()) };
448
+ }
449
+ catch {
450
+ results[name] = { status: "offline" };
451
+ }
452
+ }
453
+ // Relay discovery (merge, relay overrides offline status from direct)
454
+ if (this.relayClient?.isConnected()) {
455
+ try {
456
+ const relayAgents = await this.relayClient.discover();
457
+ for (const agent of relayAgents) {
458
+ if (agent.name === this.config.agentName)
459
+ continue;
460
+ const existing = results[agent.name];
461
+ if (!existing || existing.status === "offline") {
462
+ results[agent.name] = {
463
+ status: "online",
464
+ card: agent.card,
465
+ };
466
+ }
467
+ }
468
+ }
469
+ catch (err) {
470
+ const msg = err instanceof Error ? err.message : String(err);
471
+ this.logger.error(`[perkos-a2a] Relay discovery failed: ${msg}`);
472
+ }
473
+ }
474
+ return results;
475
+ }
476
+ success(id, result) {
477
+ return { jsonrpc: "2.0", id, result };
478
+ }
479
+ error(id, code, message) {
480
+ return { jsonrpc: "2.0", id, error: { code, message } };
481
+ }
482
+ /** Handle an inbound task received via the relay */
483
+ handleRelayTask(msg) {
484
+ const payload = msg.payload;
485
+ const params = payload.params || payload;
486
+ const rpcId = payload.id || msg.id;
487
+ this.handleSendMessage(params, rpcId).then(async (response) => {
488
+ const task = response.result;
489
+ if (task?.id && !isTerminalTaskState(task.status?.state)) {
490
+ const terminal = await this.waitForLocalTaskTerminal(task.id).catch((err) => {
491
+ const errMsg = err instanceof Error ? err.message : String(err);
492
+ this.logger.info(`[perkos-a2a] Waiting for relay task ${task.id} terminal state failed: ${errMsg}`);
493
+ return null;
494
+ });
495
+ if (terminal) {
496
+ this.relayClient?.sendTaskResponse(msg, terminal);
497
+ return;
498
+ }
499
+ }
500
+ this.relayClient?.sendTaskResponse(msg, response);
501
+ }).catch((err) => {
502
+ const errMsg = err instanceof Error ? err.message : String(err);
503
+ this.logger.error(`[perkos-a2a] Failed to process relay task: ${errMsg}`);
504
+ this.relayClient?.sendTaskResponse(msg, this.error(rpcId, -32603, errMsg));
505
+ });
506
+ }
507
+ startRelayClient() {
508
+ const relay = this.config.relay;
509
+ if (!relay?.enabled || !relay?.url)
510
+ return;
511
+ this.relayClient = new RelayClient({
512
+ agentName: this.config.agentName,
513
+ relay,
514
+ card: this.agentCard,
515
+ onTask: (msg) => this.handleRelayTask(msg),
516
+ logger: this.logger,
517
+ });
518
+ this.relayClient.start();
519
+ this.logger.info(`[perkos-a2a] Relay client started, connecting to ${relay.url}`);
520
+ }
521
+ startRelayHub() {
522
+ const relayConfig = this.config.relay;
523
+ this.relayHub = new RelayHub({
524
+ port: this.config.relay?.hubPort || this.config.port,
525
+ apiKeys: this.config.relay?.hubApiKeys || this.config.auth?.apiKeys || [],
526
+ registeredAgents: this.config.relay?.registeredAgents || {},
527
+ maxQueuePerAgent: 200,
528
+ rateLimitPerMinute: 60,
529
+ heartbeatIntervalMs: 30_000,
530
+ heartbeatTimeoutMs: 90_000,
531
+ }, this.logger);
532
+ this.relayHub.start();
533
+ }
534
+ async start() {
535
+ const mode = this.config.mode || "auto";
536
+ if (mode === "relay") {
537
+ this.clientOnly = true;
538
+ this.startRelayHub();
539
+ return;
540
+ }
541
+ if (mode === "client-only") {
542
+ this.clientOnly = true;
543
+ this.startRelayClient();
544
+ if (!this.config.relay?.enabled) {
545
+ this.logger.info("[perkos-a2a] Running in client-only mode. Configure relay for NAT traversal or set up Tailscale/tunnel.");
546
+ }
547
+ return;
548
+ }
549
+ if (mode === "full") {
550
+ this.tryListen(this.config.port);
551
+ this.startRelayClient();
552
+ return;
553
+ }
554
+ // auto mode: detect networking, decide
555
+ try {
556
+ const net = await detectNetworking();
557
+ if (net.isBehindNat && !net.hasTailscale) {
558
+ if (this.config.relay?.enabled) {
559
+ this.logger.info("[perkos-a2a] Behind NAT, using relay for bidirectional communication");
560
+ this.clientOnly = true;
561
+ this.startRelayClient();
562
+ }
563
+ else {
564
+ this.logger.info("[perkos-a2a] Running in client-only mode (behind NAT). Configure relay or Tailscale for bidirectional A2A.");
565
+ this.clientOnly = true;
566
+ }
567
+ return;
568
+ }
569
+ if (net.isBehindNat && net.hasTailscale && net.tailscaleIp) {
570
+ this.logger.info(`[perkos-a2a] Behind NAT but Tailscale detected (${net.tailscaleIp}). Starting server.`);
571
+ }
572
+ }
573
+ catch {
574
+ // detection failed, try to start anyway
575
+ }
576
+ this.tryListen(this.config.port);
577
+ this.startRelayClient();
578
+ }
579
+ tryListen(port, attempt = 1) {
580
+ const maxAttempts = 3;
581
+ try {
582
+ const bindHost = this.config.bindHost || "0.0.0.0";
583
+ const srv = this.app.listen(port, bindHost, () => {
584
+ this.logger.info(`[perkos-a2a] ${this.config.agentName} server on ${bindHost}:${port}`);
585
+ this.agentCard.url = `${(this.config.publicUrl || `http://localhost:${port}`).replace(/\/+$/, "")}/a2a/jsonrpc`;
586
+ });
587
+ srv.on("error", (err) => {
588
+ if (err.code === "EADDRINUSE" && attempt < maxAttempts) {
589
+ const nextPort = port + 1;
590
+ this.logger.info(`[perkos-a2a] Port ${port} in use, trying ${nextPort}`);
591
+ this.tryListen(nextPort, attempt + 1);
592
+ }
593
+ else if (err.code === "EADDRINUSE") {
594
+ this.logger.info(`[perkos-a2a] Ports ${this.config.port}-${port} all in use. Falling back to client-only mode.`);
595
+ this.clientOnly = true;
596
+ }
597
+ else {
598
+ this.logger.error(`[perkos-a2a] Server error: ${err.message}`);
599
+ }
600
+ });
601
+ }
602
+ catch (err) {
603
+ const msg = err instanceof Error ? err.message : String(err);
604
+ this.logger.error(`[perkos-a2a] Failed to start server: ${msg}`);
605
+ }
606
+ }
607
+ getExpressApp() {
608
+ return this.app;
609
+ }
610
+ }
611
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}