@perkos/perkos-a2a 0.8.4 → 0.8.5
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/dist/index.js +1353 -450
- package/dist/index.js.map +7 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +5 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/server.ts", "../src/relay-client.ts", "../src/relay.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A2A Protocol Server\n * Express-based JSON-RPC 2.0 server with Agent Card discovery.\n * Supports full, client-only, relay, and auto modes.\n * Integrates with the relay hub for NAT traversal when configured.\n */\n\nimport express from \"express\";\nimport { randomUUID } from \"crypto\";\nimport { homedir, networkInterfaces } from \"os\";\nimport { RelayClient } from \"./relay-client.js\";\nimport { RelayHub } from \"./relay.js\";\nimport type {\n AgentCard,\n Task,\n Message,\n JsonRpcResponse,\n A2APluginConfig,\n RelayMessage,\n RelayAgentEntry,\n} from \"./types.js\";\n\nexport type TaskResultHandler = (task: Task, text: string) => Promise<void> | void;\nexport type TaskFailureHandler = (task: Task, errorText: string) => Promise<void> | void;\n\n/** Detect if the host is behind NAT by comparing public IP to local interfaces */\nexport async function detectNetworking(): Promise<{\n isBehindNat: boolean;\n publicIp: string | null;\n localIps: string[];\n hasTailscale: boolean;\n tailscaleIp: string | null;\n}> {\n const localIps: string[] = [];\n const ifaces = networkInterfaces();\n for (const addrs of Object.values(ifaces)) {\n if (!addrs) continue;\n for (const a of addrs) {\n if (!a.internal && a.family === \"IPv4\") {\n localIps.push(a.address);\n }\n }\n }\n\n let publicIp: string | null = null;\n try {\n const res = await fetch(\"https://api.ipify.org?format=text\", {\n signal: AbortSignal.timeout(5000),\n });\n publicIp = (await res.text()).trim();\n } catch {\n // unable to reach internet\n }\n\n const isBehindNat = publicIp !== null && !localIps.includes(publicIp);\n\n // Avoid shelling out here so the plugin passes OpenClaw's safety scanner.\n // Tailscale presence/IP can be supplied by config or discovered externally if needed.\n const hasTailscale = false;\n const tailscaleIp: string | null = null;\n\n return { isBehindNat, publicIp, localIps, hasTailscale, tailscaleIp };\n}\n\nexport class A2AServer {\n private app: express.Express;\n private tasks: Map<string, Task> = new Map();\n private agentCard: AgentCard;\n private config: A2APluginConfig;\n private logger: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void };\n private clientOnly = false;\n private relayClient: RelayClient | null = null;\n private relayHub: RelayHub | null = null;\n private messageInjector: ((text: string, metadata?: Record<string, unknown>) => void) | null = null;\n private taskResultHandler: TaskResultHandler | null = null;\n private taskFailureHandler: TaskFailureHandler | null = null;\n\n constructor(\n config: A2APluginConfig,\n logger?: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void }\n ) {\n this.config = config;\n this.logger = logger || { info: console.log, error: console.error };\n this.app = express();\n this.app.use(express.json());\n\n this.agentCard = {\n name: config.agentName,\n description: `PerkOS agent: ${config.agentName}`,\n protocolVersion: \"0.3.0\",\n version: \"1.0.0\",\n url: `http://localhost:${config.port}/a2a/jsonrpc`,\n skills: config.skills || [],\n capabilities: { pushNotifications: false },\n defaultInputModes: [\"text\"],\n defaultOutputModes: [\"text\"],\n };\n\n this.setupRoutes();\n }\n\n /** Set the message injector for delivering tasks into the agent session */\n setMessageInjector(injector: (text: string, metadata?: Record<string, unknown>) => void): void {\n this.messageInjector = injector;\n }\n\n setTaskResultHandler(handler: TaskResultHandler | null): void {\n this.taskResultHandler = handler;\n }\n\n setTaskFailureHandler(handler: TaskFailureHandler | null): void {\n this.taskFailureHandler = handler;\n }\n\n isClientOnly(): boolean {\n return this.clientOnly;\n }\n\n isRelayConnected(): boolean {\n return this.relayClient?.isConnected() || false;\n }\n\n private authMiddleware(): express.RequestHandler {\n return (req, res, next) => {\n if (!this.config.auth?.requireApiKey) {\n next();\n return;\n }\n\n const apiKey =\n req.headers[\"x-api-key\"] as string ||\n req.headers[\"authorization\"]?.replace(/^Bearer\\s+/i, \"\") ||\n (req.query[\"apiKey\"] as string);\n\n if (!apiKey || !this.config.auth.apiKeys.includes(apiKey)) {\n res.status(401).json({ error: \"Unauthorized: invalid or missing API key\" });\n return;\n }\n\n next();\n };\n }\n\n private setupRoutes(): void {\n // Public endpoints (no auth required)\n this.app.get(\"/.well-known/agent-card.json\", (_req, res) => {\n res.json(this.agentCard);\n });\n\n this.app.get(\"/health\", (_req, res) => {\n res.json({\n ok: true,\n agent: this.config.agentName,\n protocol: \"a2a\",\n version: \"0.8.1\",\n peers: Object.keys(this.config.peers),\n taskCount: this.tasks.size,\n relayConnected: this.isRelayConnected(),\n });\n });\n\n // Protected endpoints\n const auth = this.authMiddleware();\n\n this.app.post(\"/a2a/jsonrpc\", auth, async (req, res) => {\n const { method, params, id } = req.body;\n try {\n let result: JsonRpcResponse;\n switch (method) {\n case \"message/send\":\n result = await this.handleSendMessage(params, id);\n break;\n case \"tasks/get\":\n result = this.handleGetTask(params, id);\n break;\n case \"tasks/list\":\n result = this.handleListTasks(id);\n break;\n case \"tasks/cancel\":\n result = this.handleCancelTask(params, id);\n break;\n case \"agent/card\":\n result = this.success(id, this.agentCard);\n break;\n default:\n result = this.error(id, -32601, `Method not found: ${method}`);\n }\n res.json(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.error(`[perkos-a2a] RPC error: ${msg}`);\n res.json(this.error(id, -32603, msg));\n }\n });\n\n this.app.get(\"/a2a/peers\", auth, async (_req, res) => {\n const results = await this.discoverPeers();\n res.json(results);\n });\n\n this.app.post(\"/a2a/send\", auth, async (req, res) => {\n const { target, message } = req.body;\n try {\n const result = await this.sendTask(target, message);\n res.json({ ok: true, result });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n res.status(500).json({ ok: false, error: msg });\n }\n });\n }\n\n private async handleSendMessage(\n params: Record<string, unknown>,\n rpcId: string\n ): Promise<JsonRpcResponse> {\n const message = params.message as Message;\n const taskId = randomUUID();\n const contextId = message?.contextId || randomUUID();\n\n const task: Task = {\n kind: \"task\",\n id: taskId,\n contextId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n messages: [message],\n artifacts: [],\n metadata: {\n fromAgent: (message?.metadata?.fromAgent as string) || \"unknown\",\n },\n };\n\n this.tasks.set(taskId, task);\n this.logger.info(\n `[perkos-a2a] Task ${taskId} received from ${task.metadata?.fromAgent}`\n );\n\n this.processTask(task);\n return this.success(rpcId, task);\n }\n\n private async processTask(task: Task): Promise<void> {\n task.status = { state: \"working\", timestamp: new Date().toISOString() };\n\n const textParts = task.messages\n .flatMap((m) => m.parts || [])\n .filter((p) => p.kind === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n\n try {\n // Attempt session injection first\n if (this.messageInjector) {\n this.messageInjector(textParts, {\n source: \"a2a\",\n fromAgent: task.metadata?.fromAgent,\n taskId: task.id,\n });\n task.artifacts.push({\n kind: \"artifact\",\n artifactId: randomUUID(),\n parts: [{ kind: \"text\", text: \"Task injected into agent session\" }],\n });\n } else {\n // Fallback: write to file\n const fs = await import(\"fs\");\n const taskDir = (this.config as any).workspacePath\n || `${homedir()}/.openclaw/workspace/memory`;\n if (!fs.existsSync(taskDir)) {\n fs.mkdirSync(taskDir, { recursive: true });\n }\n\n const taskFile = `${taskDir}/a2a-task-${task.id}.md`;\n const content = [\n \"# A2A Task\",\n \"\",\n `**From:** ${task.metadata?.fromAgent}`,\n `**Task ID:** ${task.id}`,\n `**Time:** ${new Date().toISOString()}`,\n \"\",\n \"## Message\",\n \"\",\n textParts,\n \"\",\n ].join(\"\\n\");\n\n fs.writeFileSync(taskFile, content);\n\n task.artifacts.push({\n kind: \"artifact\",\n artifactId: randomUUID(),\n parts: [{ kind: \"text\", text: `Task queued: ${taskFile}` }],\n });\n }\n\n if (this.taskResultHandler) {\n await this.taskResultHandler(task, textParts);\n } else {\n task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n };\n }\n\n this.logger.info(`[perkos-a2a] Task ${task.id} completed`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (this.taskFailureHandler) {\n await this.taskFailureHandler(task, msg);\n } else {\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ kind: \"text\", text: msg }],\n },\n };\n }\n this.logger.error(`[perkos-a2a] Task ${task.id} failed: ${msg}`);\n }\n }\n\n private handleGetTask(\n params: Record<string, unknown>,\n rpcId: string\n ): JsonRpcResponse {\n const task = this.tasks.get(params?.id as string);\n if (!task) return this.error(rpcId, 404, \"Task not found\");\n return this.success(rpcId, task);\n }\n\n private handleListTasks(rpcId: string): JsonRpcResponse {\n const allTasks = Array.from(this.tasks.values()).sort(\n (a, b) =>\n new Date(b.status.timestamp).getTime() -\n new Date(a.status.timestamp).getTime()\n );\n return this.success(rpcId, { tasks: allTasks, nextPageToken: \"\" });\n }\n\n private handleCancelTask(\n params: Record<string, unknown>,\n rpcId: string\n ): JsonRpcResponse {\n const task = this.tasks.get(params?.id as string);\n if (!task) return this.error(rpcId, 404, \"Task not found\");\n if ([\"completed\", \"failed\", \"canceled\"].includes(task.status.state)) {\n return this.error(rpcId, 409, \"Task not cancelable\");\n }\n task.status = { state: \"canceled\", timestamp: new Date().toISOString() };\n return this.success(rpcId, task);\n }\n\n /** Send a task to a peer agent via A2A protocol (direct HTTP or relay) */\n async sendTask(\n targetAgent: string,\n messageText: string\n ): Promise<JsonRpcResponse> {\n const targetUrl = this.config.peers[targetAgent];\n\n // Try direct HTTP first if peer URL is configured\n if (targetUrl) {\n try {\n return await this.sendTaskDirect(targetAgent, targetUrl, messageText);\n } catch (err) {\n // If relay is available, fall through to relay\n if (!this.relayClient?.isConnected()) {\n throw err;\n }\n this.logger.info(\n `[perkos-a2a] Direct send to ${targetAgent} failed, falling back to relay`\n );\n }\n }\n\n // Try relay\n if (this.relayClient?.isConnected()) {\n return this.sendTaskViaRelay(targetAgent, messageText);\n }\n\n throw new Error(\n `Cannot reach ${targetAgent}: no direct URL configured and relay not connected. ` +\n `Known peers: ${Object.keys(this.config.peers).join(\", \")}`\n );\n }\n\n private async sendTaskDirect(\n targetAgent: string,\n targetUrl: string,\n messageText: string\n ): Promise<JsonRpcResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n\n // Include auth token if peer has one configured\n const peerAuth = this.config.peerAuth?.[targetAgent];\n if (peerAuth) {\n headers[\"x-api-key\"] = peerAuth;\n }\n\n const payload = {\n jsonrpc: \"2.0\",\n method: \"message/send\",\n id: randomUUID(),\n params: {\n message: {\n kind: \"message\",\n messageId: randomUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: messageText }],\n metadata: { fromAgent: this.config.agentName },\n },\n },\n };\n\n const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n\n return (await response.json()) as JsonRpcResponse;\n }\n\n private async sendTaskViaRelay(\n targetAgent: string,\n messageText: string\n ): Promise<JsonRpcResponse> {\n const rpcId = randomUUID();\n const result = await this.relayClient!.sendTask(targetAgent, {\n jsonrpc: \"2.0\",\n method: \"message/send\",\n id: rpcId,\n params: {\n message: {\n kind: \"message\",\n messageId: randomUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: messageText }],\n metadata: { fromAgent: this.config.agentName },\n },\n },\n });\n\n return (result.payload as unknown as JsonRpcResponse) || this.success(rpcId, result.payload);\n }\n\n /** Discover all peer agents (direct + relay) */\n async discoverPeers(): Promise<\n Record<string, { status: string; card?: AgentCard }>\n > {\n const results: Record<string, { status: string; card?: AgentCard }> = {};\n\n // Direct peer discovery\n for (const [name, url] of Object.entries(this.config.peers)) {\n try {\n const r = await fetch(`${url}/.well-known/agent-card.json`, {\n signal: AbortSignal.timeout(3000),\n });\n results[name] = { status: \"online\", card: (await r.json()) as AgentCard };\n } catch {\n results[name] = { status: \"offline\" };\n }\n }\n\n // Relay discovery (merge, relay overrides offline status from direct)\n if (this.relayClient?.isConnected()) {\n try {\n const relayAgents = await this.relayClient.discover();\n for (const agent of relayAgents) {\n if (agent.name === this.config.agentName) continue;\n const existing = results[agent.name];\n if (!existing || existing.status === \"offline\") {\n results[agent.name] = {\n status: \"online\",\n card: agent.card,\n };\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.error(`[perkos-a2a] Relay discovery failed: ${msg}`);\n }\n }\n\n return results;\n }\n\n private success(id: string, result: unknown): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, result };\n }\n\n private error(id: string, code: number, message: string): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, error: { code, message } };\n }\n\n /** Handle an inbound task received via the relay */\n private handleRelayTask(msg: RelayMessage): void {\n const payload = msg.payload as any;\n const params = payload.params || payload;\n const rpcId = payload.id || msg.id;\n\n this.handleSendMessage(params, rpcId).then((response) => {\n this.relayClient?.sendTaskResponse(msg, response as unknown as Record<string, unknown>);\n }).catch((err) => {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.logger.error(`[perkos-a2a] Failed to process relay task: ${errMsg}`);\n this.relayClient?.sendTaskResponse(msg, this.error(rpcId, -32603, errMsg) as unknown as Record<string, unknown>);\n });\n }\n\n private startRelayClient(): void {\n const relay = this.config.relay;\n if (!relay?.enabled || !relay?.url) return;\n\n this.relayClient = new RelayClient({\n agentName: this.config.agentName,\n relay,\n card: this.agentCard,\n onTask: (msg) => this.handleRelayTask(msg),\n logger: this.logger,\n });\n\n this.relayClient.start();\n this.logger.info(`[perkos-a2a] Relay client started, connecting to ${relay.url}`);\n }\n\n private startRelayHub(): void {\n const relayConfig = this.config.relay;\n this.relayHub = new RelayHub(\n {\n port: this.config.port,\n apiKeys: this.config.auth?.apiKeys || [],\n maxQueuePerAgent: 200,\n rateLimitPerMinute: 60,\n heartbeatIntervalMs: 30_000,\n heartbeatTimeoutMs: 90_000,\n },\n this.logger\n );\n this.relayHub.start();\n }\n\n async start(): Promise<void> {\n const mode = this.config.mode || \"auto\";\n\n if (mode === \"relay\") {\n this.clientOnly = true;\n this.startRelayHub();\n return;\n }\n\n if (mode === \"client-only\") {\n this.clientOnly = true;\n this.startRelayClient();\n if (!this.config.relay?.enabled) {\n this.logger.info(\n \"[perkos-a2a] Running in client-only mode. Configure relay for NAT traversal or set up Tailscale/tunnel.\"\n );\n }\n return;\n }\n\n if (mode === \"full\") {\n this.tryListen(this.config.port);\n this.startRelayClient();\n return;\n }\n\n // auto mode: detect networking, decide\n try {\n const net = await detectNetworking();\n if (net.isBehindNat && !net.hasTailscale) {\n if (this.config.relay?.enabled) {\n this.logger.info(\n \"[perkos-a2a] Behind NAT, using relay for bidirectional communication\"\n );\n this.clientOnly = true;\n this.startRelayClient();\n } else {\n this.logger.info(\n \"[perkos-a2a] Running in client-only mode (behind NAT). Configure relay or Tailscale for bidirectional A2A.\"\n );\n this.clientOnly = true;\n }\n return;\n }\n if (net.isBehindNat && net.hasTailscale && net.tailscaleIp) {\n this.logger.info(\n `[perkos-a2a] Behind NAT but Tailscale detected (${net.tailscaleIp}). Starting server.`\n );\n }\n } catch {\n // detection failed, try to start anyway\n }\n\n this.tryListen(this.config.port);\n this.startRelayClient();\n }\n\n private tryListen(port: number, attempt = 1): void {\n const maxAttempts = 3;\n try {\n const srv = this.app.listen(port, \"0.0.0.0\", () => {\n this.logger.info(\n `[perkos-a2a] ${this.config.agentName} server on port ${port}`\n );\n this.agentCard.url = `http://localhost:${port}/a2a/jsonrpc`;\n });\n srv.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\" && attempt < maxAttempts) {\n const nextPort = port + 1;\n this.logger.info(`[perkos-a2a] Port ${port} in use, trying ${nextPort}`);\n this.tryListen(nextPort, attempt + 1);\n } else if (err.code === \"EADDRINUSE\") {\n this.logger.info(\n `[perkos-a2a] Ports ${this.config.port}-${port} all in use. Falling back to client-only mode.`\n );\n this.clientOnly = true;\n } else {\n this.logger.error(`[perkos-a2a] Server error: ${err.message}`);\n }\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.error(`[perkos-a2a] Failed to start server: ${msg}`);\n }\n }\n\n getExpressApp(): express.Express {\n return this.app;\n }\n}\n", "/**\n * A2A Relay Client\n *\n * WebSocket client that connects to an A2A Relay Hub for NAT-friendly\n * bidirectional communication. Handles registration, auto-reconnect\n * with exponential backoff, heartbeats, and message routing.\n */\n\nimport WebSocket from \"ws\";\nimport { randomUUID } from \"crypto\";\nimport type { RelayMessage, RelayConfig, AgentCard, RelayAgentEntry } from \"./types.js\";\n\nexport interface RelayClientOptions {\n agentName: string;\n relay: RelayConfig;\n card?: AgentCard;\n /** Called when a task message arrives via the relay */\n onTask: (msg: RelayMessage) => void;\n /** Called when a discover response arrives */\n onDiscoverResponse?: (agents: RelayAgentEntry[]) => void;\n logger?: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void };\n}\n\nconst MIN_RECONNECT_MS = 1_000;\nconst MAX_RECONNECT_MS = 60_000;\nconst HEARTBEAT_INTERVAL_MS = 25_000;\n\nexport class RelayClient {\n private ws: WebSocket | null = null;\n private options: RelayClientOptions;\n private logger: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void };\n private reconnectMs = MIN_RECONNECT_MS;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private connected = false;\n private stopped = false;\n private pendingCallbacks: Map<string, (msg: RelayMessage) => void> = new Map();\n\n constructor(options: RelayClientOptions) {\n this.options = options;\n this.logger = options.logger || { info: console.log, error: console.error };\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n start(): void {\n this.stopped = false;\n this.connect();\n }\n\n stop(): void {\n this.stopped = true;\n this.clearTimers();\n if (this.ws) {\n this.ws.close(1000, \"Client shutting down\");\n this.ws = null;\n }\n this.connected = false;\n }\n\n /** Send a task to another agent via the relay */\n async sendTask(targetAgent: string, payload: Record<string, unknown>): Promise<RelayMessage> {\n return this.sendAndWait({\n type: \"task\",\n to: targetAgent,\n id: randomUUID(),\n from: this.options.agentName,\n payload,\n timestamp: new Date().toISOString(),\n }, \"task_response\", 30_000);\n }\n\n /** Discover agents connected to the relay */\n async discover(): Promise<RelayAgentEntry[]> {\n const response = await this.sendAndWait({\n type: \"discover\",\n id: randomUUID(),\n from: this.options.agentName,\n payload: {},\n timestamp: new Date().toISOString(),\n }, \"discover_response\", 10_000);\n return (response.payload.agents as RelayAgentEntry[]) || [];\n }\n\n /** Send a task response back through the relay */\n sendTaskResponse(originalMsg: RelayMessage, result: Record<string, unknown>): void {\n const response: RelayMessage = {\n type: \"task_response\",\n id: originalMsg.id,\n from: this.options.agentName,\n to: originalMsg.from,\n payload: result,\n timestamp: new Date().toISOString(),\n };\n this.send(response);\n }\n\n private connect(): void {\n if (this.stopped) return;\n\n const url = this.options.relay.url;\n this.logger.info(`[perkos-a2a] Connecting to relay: ${url}`);\n\n try {\n this.ws = new WebSocket(url);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.error(`[perkos-a2a] Failed to create WebSocket: ${msg}`);\n this.scheduleReconnect();\n return;\n }\n\n this.ws.on(\"open\", () => {\n this.connected = true;\n this.reconnectMs = MIN_RECONNECT_MS;\n this.logger.info(\"[perkos-a2a] Connected to relay hub\");\n this.register();\n this.startHeartbeat();\n });\n\n this.ws.on(\"message\", (data) => {\n let msg: RelayMessage;\n try {\n msg = JSON.parse(data.toString());\n } catch {\n this.logger.error(\"[perkos-a2a] Failed to parse relay message\");\n return;\n }\n this.handleMessage(msg);\n });\n\n this.ws.on(\"close\", (code, reason) => {\n this.connected = false;\n this.clearTimers();\n if (!this.stopped) {\n this.logger.info(`[perkos-a2a] Relay connection closed (${code}: ${reason || \"no reason\"}). Reconnecting...`);\n this.scheduleReconnect();\n }\n });\n\n this.ws.on(\"error\", (err) => {\n this.logger.error(`[perkos-a2a] Relay WebSocket error: ${err.message}`);\n });\n }\n\n private register(): void {\n const msg: RelayMessage = {\n type: \"register\",\n id: randomUUID(),\n from: this.options.agentName,\n payload: {\n agentName: this.options.agentName,\n apiKey: this.options.relay.apiKey,\n card: this.options.card,\n },\n timestamp: new Date().toISOString(),\n };\n this.send(msg);\n }\n\n private handleMessage(msg: RelayMessage): void {\n // Check for pending request/response callbacks\n const callback = this.pendingCallbacks.get(msg.id);\n if (callback) {\n this.pendingCallbacks.delete(msg.id);\n callback(msg);\n return;\n }\n\n switch (msg.type) {\n case \"register_ack\":\n this.logger.info(\"[perkos-a2a] Registered with relay hub\");\n break;\n case \"task\":\n this.options.onTask(msg);\n break;\n case \"task_response\":\n // Late response with no pending callback; log and discard\n this.logger.info(`[perkos-a2a] Received unmatched task response: ${msg.id}`);\n break;\n case \"discover_response\":\n if (this.options.onDiscoverResponse) {\n this.options.onDiscoverResponse(msg.payload.agents as RelayAgentEntry[]);\n }\n break;\n case \"heartbeat_ack\":\n break;\n case \"error\":\n this.logger.error(`[perkos-a2a] Relay error: ${msg.payload.code} - ${msg.payload.message}`);\n break;\n default:\n this.logger.info(`[perkos-a2a] Unknown relay message type: ${msg.type}`);\n }\n }\n\n private send(msg: RelayMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg));\n }\n }\n\n private async sendAndWait(\n msg: RelayMessage,\n expectedType: string,\n timeoutMs: number\n ): Promise<RelayMessage> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingCallbacks.delete(msg.id);\n reject(new Error(`Relay request timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingCallbacks.set(msg.id, (response) => {\n clearTimeout(timer);\n if (response.type === \"error\") {\n reject(new Error(`Relay error: ${response.payload.message}`));\n } else {\n resolve(response);\n }\n });\n\n this.send(msg);\n });\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n const msg: RelayMessage = {\n type: \"heartbeat\",\n id: randomUUID(),\n from: this.options.agentName,\n payload: {},\n timestamp: new Date().toISOString(),\n };\n this.send(msg);\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, this.reconnectMs);\n this.reconnectMs = Math.min(this.reconnectMs * 2, MAX_RECONNECT_MS);\n }\n\n private clearTimers(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n", "/**\n * A2A Relay Hub\n *\n * Lightweight WebSocket broker for NAT traversal. Agents connect outbound\n * to the relay, which routes messages between them. Supports API key auth,\n * rate limiting, agent presence registry, and offline message queuing.\n *\n * Can run standalone via bin/relay.ts or embedded in full mode.\n */\n\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport { randomUUID } from \"crypto\";\nimport type { RelayMessage, RelayAgentEntry, AgentCard } from \"./types.js\";\n\ninterface ConnectedAgent {\n name: string;\n ws: WebSocket;\n apiKey: string;\n card?: AgentCard;\n connectedAt: string;\n lastHeartbeat: string;\n}\n\ninterface QueuedMessage {\n message: RelayMessage;\n queuedAt: string;\n}\n\nexport interface RelayHubConfig {\n port: number;\n /** Accepted API keys. If empty, auth is disabled. */\n apiKeys: string[];\n /** Maximum queued messages per offline agent */\n maxQueuePerAgent: number;\n /** Rate limit: max messages per agent per minute */\n rateLimitPerMinute: number;\n /** Heartbeat interval in milliseconds */\n heartbeatIntervalMs: number;\n /** Consider agent dead after this many missed heartbeats */\n heartbeatTimeoutMs: number;\n}\n\nconst DEFAULT_CONFIG: RelayHubConfig = {\n port: 6060,\n apiKeys: [],\n maxQueuePerAgent: 200,\n rateLimitPerMinute: 60,\n heartbeatIntervalMs: 30_000,\n heartbeatTimeoutMs: 90_000,\n};\n\nexport class RelayHub {\n private wss: WebSocketServer | null = null;\n private agents: Map<string, ConnectedAgent> = new Map();\n private offlineQueue: Map<string, QueuedMessage[]> = new Map();\n private rateCounts: Map<string, { count: number; windowStart: number }> = new Map();\n private config: RelayHubConfig;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private logger: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void };\n\n constructor(\n config?: Partial<RelayHubConfig>,\n logger?: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void }\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger || { info: console.log, error: console.error };\n }\n\n start(): void {\n this.wss = new WebSocketServer({ port: this.config.port });\n this.logger.info(`[perkos-a2a] Relay hub listening on port ${this.config.port}`);\n\n this.wss.on(\"connection\", (ws, req) => {\n const remoteAddr = req.socket.remoteAddress || \"unknown\";\n this.logger.info(`[perkos-a2a] Relay connection from ${remoteAddr}`);\n this.handleConnection(ws);\n });\n\n this.heartbeatTimer = setInterval(() => this.checkHeartbeats(), this.config.heartbeatIntervalMs);\n }\n\n stop(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.wss) {\n for (const agent of this.agents.values()) {\n agent.ws.close(1001, \"Relay shutting down\");\n }\n this.wss.close();\n this.wss = null;\n this.logger.info(\"[perkos-a2a] Relay hub stopped\");\n }\n }\n\n getRegistry(): RelayAgentEntry[] {\n const entries: RelayAgentEntry[] = [];\n for (const agent of this.agents.values()) {\n entries.push({\n name: agent.name,\n connectedAt: agent.connectedAt,\n lastHeartbeat: agent.lastHeartbeat,\n card: agent.card,\n });\n }\n return entries;\n }\n\n private handleConnection(ws: WebSocket): void {\n let agentName: string | null = null;\n\n ws.on(\"message\", (data) => {\n let msg: RelayMessage;\n try {\n msg = JSON.parse(data.toString());\n } catch {\n this.sendError(ws, \"invalid_json\", \"Failed to parse message\");\n return;\n }\n\n if (msg.type === \"register\") {\n agentName = this.handleRegister(ws, msg);\n return;\n }\n\n if (!agentName) {\n this.sendError(ws, \"not_registered\", \"Must register before sending messages\");\n return;\n }\n\n if (!this.checkRateLimit(agentName)) {\n this.sendError(ws, \"rate_limited\", \"Rate limit exceeded\");\n return;\n }\n\n switch (msg.type) {\n case \"task\":\n case \"task_response\":\n this.routeMessage(agentName, msg);\n break;\n case \"discover\":\n this.handleDiscover(ws, msg);\n break;\n case \"heartbeat\":\n this.handleHeartbeat(agentName, msg);\n break;\n default:\n this.sendError(ws, \"unknown_type\", `Unknown message type: ${msg.type}`);\n }\n });\n\n ws.on(\"close\", () => {\n if (agentName) {\n this.agents.delete(agentName);\n this.logger.info(`[perkos-a2a] Agent disconnected: ${agentName}`);\n }\n });\n\n ws.on(\"error\", (err) => {\n this.logger.error(`[perkos-a2a] WebSocket error for ${agentName || \"unknown\"}: ${err.message}`);\n });\n }\n\n private handleRegister(ws: WebSocket, msg: RelayMessage): string | null {\n const name = msg.payload.agentName as string;\n const apiKey = msg.payload.apiKey as string;\n\n if (!name) {\n this.sendError(ws, \"missing_name\", \"agentName is required for registration\");\n return null;\n }\n\n if (this.config.apiKeys.length > 0 && !this.config.apiKeys.includes(apiKey)) {\n this.sendError(ws, \"auth_failed\", \"Invalid API key\");\n ws.close(4001, \"Authentication failed\");\n return null;\n }\n\n // Disconnect existing connection for same agent name\n const existing = this.agents.get(name);\n if (existing) {\n existing.ws.close(4002, \"Replaced by new connection\");\n }\n\n const now = new Date().toISOString();\n this.agents.set(name, {\n name,\n ws,\n apiKey: apiKey || \"\",\n card: msg.payload.card as AgentCard | undefined,\n connectedAt: now,\n lastHeartbeat: now,\n });\n\n this.logger.info(`[perkos-a2a] Agent registered: ${name}`);\n\n const ack: RelayMessage = {\n type: \"register_ack\",\n id: msg.id,\n from: \"relay\",\n payload: { status: \"ok\", agentName: name },\n timestamp: now,\n };\n ws.send(JSON.stringify(ack));\n\n // Deliver queued messages\n this.drainQueue(name, ws);\n\n return name;\n }\n\n private routeMessage(fromAgent: string, msg: RelayMessage): void {\n const target = msg.to;\n if (!target) {\n this.sendError(this.agents.get(fromAgent)!.ws, \"missing_target\", \"Message requires 'to' field\");\n return;\n }\n\n msg.from = fromAgent;\n msg.timestamp = new Date().toISOString();\n\n const targetAgent = this.agents.get(target);\n if (targetAgent && targetAgent.ws.readyState === WebSocket.OPEN) {\n targetAgent.ws.send(JSON.stringify(msg));\n } else {\n // Queue for offline delivery\n if (!this.offlineQueue.has(target)) {\n this.offlineQueue.set(target, []);\n }\n const queue = this.offlineQueue.get(target)!;\n if (queue.length < this.config.maxQueuePerAgent) {\n queue.push({ message: msg, queuedAt: new Date().toISOString() });\n this.logger.info(`[perkos-a2a] Queued message for offline agent: ${target} (${queue.length} pending)`);\n } else {\n this.logger.info(`[perkos-a2a] Queue full for agent: ${target}, dropping message`);\n const sender = this.agents.get(fromAgent);\n if (sender) {\n this.sendError(sender.ws, \"queue_full\", `Target agent ${target} queue is full`);\n }\n }\n }\n }\n\n private drainQueue(agentName: string, ws: WebSocket): void {\n const queue = this.offlineQueue.get(agentName);\n if (!queue || queue.length === 0) return;\n\n this.logger.info(`[perkos-a2a] Delivering ${queue.length} queued messages to ${agentName}`);\n for (const item of queue) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(item.message));\n }\n }\n this.offlineQueue.delete(agentName);\n }\n\n private handleDiscover(ws: WebSocket, msg: RelayMessage): void {\n const agents: RelayAgentEntry[] = this.getRegistry();\n const response: RelayMessage = {\n type: \"discover_response\",\n id: msg.id,\n from: \"relay\",\n payload: { agents },\n timestamp: new Date().toISOString(),\n };\n ws.send(JSON.stringify(response));\n }\n\n private handleHeartbeat(agentName: string, msg: RelayMessage): void {\n const agent = this.agents.get(agentName);\n if (agent) {\n agent.lastHeartbeat = new Date().toISOString();\n }\n const ack: RelayMessage = {\n type: \"heartbeat_ack\",\n id: msg.id,\n from: \"relay\",\n payload: {},\n timestamp: new Date().toISOString(),\n };\n const ws = agent?.ws;\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(ack));\n }\n }\n\n private checkHeartbeats(): void {\n const now = Date.now();\n for (const [name, agent] of this.agents) {\n const lastBeat = new Date(agent.lastHeartbeat).getTime();\n if (now - lastBeat > this.config.heartbeatTimeoutMs) {\n this.logger.info(`[perkos-a2a] Agent ${name} timed out (no heartbeat)`);\n agent.ws.close(4003, \"Heartbeat timeout\");\n this.agents.delete(name);\n }\n }\n }\n\n private checkRateLimit(agentName: string): boolean {\n const now = Date.now();\n const window = 60_000;\n let entry = this.rateCounts.get(agentName);\n\n if (!entry || now - entry.windowStart > window) {\n entry = { count: 0, windowStart: now };\n this.rateCounts.set(agentName, entry);\n }\n\n entry.count++;\n return entry.count <= this.config.rateLimitPerMinute;\n }\n\n private sendError(ws: WebSocket, code: string, message: string): void {\n const errorMsg: RelayMessage = {\n type: \"error\",\n id: randomUUID(),\n from: \"relay\",\n payload: { code, message },\n timestamp: new Date().toISOString(),\n };\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(errorMsg));\n }\n }\n}\n", "/**\n * @perkos/perkos-a2a -- OpenClaw Plugin\n *\n * Agent-to-Agent (A2A) protocol communication plugin.\n * Adds tools for agents to discover peers, send tasks, and check task status.\n * Supports direct HTTP, relay-based NAT traversal, and session injection.\n *\n * v0.8.0: Uses enqueueSystemEvent + WebSocket wake for immediate task processing.\n */\n\nimport { A2AServer, detectNetworking } from \"./server.js\";\nimport { randomUUID } from \"crypto\";\nimport path from \"path\";\nimport type { A2APluginConfig } from \"./types.js\";\nexport { A2AServer, detectNetworking } from \"./server.js\";\nexport { RelayHub } from \"./relay.js\";\nexport { RelayClient } from \"./relay-client.js\";\nexport * from \"./types.js\";\n\ntype HeartbeatWakeFn = (opts?: { reason?: string; coalesceMs?: number; sessionKey?: string }) => void;\n\nfunction wakeGatewayAgent(\n requestHeartbeatNow: HeartbeatWakeFn | undefined,\n reason: string,\n logger: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void },\n sessionKey = \"agent:main\"\n): void {\n if (typeof requestHeartbeatNow === \"function\") {\n try {\n requestHeartbeatNow({ reason, sessionKey });\n logger.info(`[perkos-a2a] Wake triggered via runtime.system.requestHeartbeatNow: ${reason} (session: ${sessionKey})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`[perkos-a2a] runtime.system.requestHeartbeatNow failed: ${msg}`);\n }\n } else {\n logger.info(\"[perkos-a2a] runtime.system.requestHeartbeatNow unavailable \u2014 task will process on next agent turn\");\n }\n}\n\nexport default function register(api: any) {\n const pluginConfig: A2APluginConfig = api.config?.plugins?.entries?.[\"perkos-a2a\"]?.config || {\n agentName: \"agent\",\n port: 5050,\n skills: [],\n peers: {},\n };\n\n const logger = api.logger || console;\n const server = new A2AServer(pluginConfig, logger);\n\n // Pending tasks queue for hook-based injection\n const pendingTasks: Array<{ from: string; text: string; taskId: string; time: string }> = [];\n\n // Get system helpers from the plugin runtime API\n const enqueueSystemEvent = api.runtime?.system?.enqueueSystemEvent;\n const requestHeartbeatNow = api.runtime?.system?.requestHeartbeatNow as HeartbeatWakeFn | undefined;\n if (enqueueSystemEvent) {\n logger.info(\"[perkos-a2a] enqueueSystemEvent available \u2014 will inject tasks as system events + wake\");\n } else {\n logger.info(\"[perkos-a2a] enqueueSystemEvent not available \u2014 falling back to before_agent_start hook only\");\n }\n if (requestHeartbeatNow) {\n logger.info(\"[perkos-a2a] runtime.system.requestHeartbeatNow available \u2014 immediate wake enabled\");\n } else {\n logger.info(\"[perkos-a2a] runtime.system.requestHeartbeatNow unavailable \u2014 wake will rely on next agent turn\");\n }\n\n server.setTaskResultHandler(async (task, text) => {\n const cfg = await api.runtime?.config?.loadConfig?.();\n if (!api.runtime?.agent?.runEmbeddedAgent || !cfg) {\n task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n };\n return;\n }\n\n const agentDir = api.runtime.agent.resolveAgentDir(cfg);\n const workspaceDir = api.runtime.agent.resolveAgentWorkspaceDir(cfg);\n await api.runtime.agent.ensureAgentWorkspace(cfg);\n\n const sessionId = `perkos-a2a:task:${task.id}`;\n const prompt = [\n `You are handling an incoming A2A task from agent ${task.metadata?.fromAgent || \"unknown\"}.`,\n `Task ID: ${task.id}`,\n `Context ID: ${task.contextId}`,\n \"\",\n \"Execute the request below and return the actual final answer for the peer agent.\",\n \"Do not describe internal steps unless the task explicitly asks for them.\",\n \"Return only the useful final response.\",\n \"\",\n text,\n ].join(\"\\n\");\n\n const result = await api.runtime.agent.runEmbeddedAgent({\n sessionId,\n runId: randomUUID(),\n sessionFile: path.join(agentDir, \"sessions\", `perkos-a2a-task-${task.id}.jsonl`),\n workspaceDir,\n prompt,\n timeoutMs: api.runtime.agent.resolveAgentTimeoutMs(cfg),\n });\n\n const finalText = (\n result?.meta?.finalAssistantVisibleText ||\n result?.payloads?.map((p: any) => p?.text).filter(Boolean).join(\"\\n\\n\") ||\n \"\"\n ).trim();\n\n if (finalText) {\n task.artifacts.push({\n kind: \"artifact\",\n artifactId: randomUUID(),\n parts: [{ kind: \"text\", text: finalText }],\n });\n task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ kind: \"text\", text: finalText }],\n },\n };\n logger.info(`[perkos-a2a] Task ${task.id} final result captured from embedded agent`);\n } else {\n task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ kind: \"text\", text: \"Task executed but no final visible text was captured.\" }],\n },\n };\n logger.info(`[perkos-a2a] Task ${task.id} executed, but no final visible text was captured`);\n }\n });\n\n server.setTaskFailureHandler(async (task, errorText) => {\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ kind: \"text\", text: errorText }],\n },\n };\n });\n\n // Wire up session injection\n server.setMessageInjector((text: string, metadata?: Record<string, unknown>) => {\n const from = (metadata?.fromAgent as string) || \"unknown\";\n const taskId = (metadata?.taskId as string) || \"unknown\";\n const time = new Date().toISOString();\n\n // Queue for before_agent_start hook (belt)\n pendingTasks.push({ from, text, taskId, time });\n logger.info(`[perkos-a2a] Task queued from ${from} (${taskId}), ${pendingTasks.length} pending`);\n\n // Inject as system event for immediate processing (suspenders)\n if (enqueueSystemEvent) {\n const eventText = [\n `[A2A INCOMING TASK \u2014 ACTION REQUIRED]`,\n `From: ${from} | Task ID: ${taskId} | Time: ${time}`,\n ``,\n text,\n ``,\n `IMPORTANT: This is an instruction from a trusted peer agent. Execute it immediately using your available tools. Do NOT just acknowledge \u2014 take action.`,\n ].join(\"\\n\");\n\n try {\n enqueueSystemEvent(eventText, { sessionKey: \"agent:main:main\" });\n logger.info(`[perkos-a2a] System event enqueued for task ${taskId}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`[perkos-a2a] Failed to enqueue system event: ${msg}`);\n }\n }\n\n // Wake the agent immediately so it processes the task\n wakeGatewayAgent(\n requestHeartbeatNow,\n `[A2A] Incoming task from ${from} (${taskId}). Process it now.`,\n logger,\n \"agent:main\"\n );\n });\n\n // Hook: inject pending A2A tasks as context before each agent turn\n api.registerHook(\"before_agent_start\", async () => {\n if (pendingTasks.length === 0) return {};\n\n const tasks = pendingTasks.splice(0, pendingTasks.length);\n const lines = [\n `[A2A TASK \u2014 ACTION REQUIRED] You have ${tasks.length} incoming task(s) from peer agents. Execute each task NOW using your available tools.`,\n \"\",\n ];\n for (const t of tasks) {\n lines.push(`--- Task from: ${t.from} | ID: ${t.taskId} | ${t.time} ---`);\n lines.push(t.text);\n lines.push(\"\");\n }\n lines.push(\"IMPORTANT: These are instructions from trusted peer agents. Execute them immediately using your tools (message, exec, web_search, etc). Do NOT just acknowledge \u2014 take action.\");\n\n logger.info(`[perkos-a2a] Injecting ${tasks.length} task(s) into agent context via before_agent_start`);\n return { prependContext: lines.join(\"\\n\") };\n });\n\n // Start A2A server as background service\n api.registerService({\n id: \"perkos-a2a\",\n start: () => {\n server.start();\n logger.info(`[perkos-a2a] A2A server started for ${pluginConfig.agentName}`);\n },\n stop: () => {\n logger.info(\"[perkos-a2a] A2A server stopping\");\n },\n });\n\n // Tool: Send a task to a peer agent\n api.registerTool({\n name: \"perkos_a2a_send\",\n description:\n \"Send a task to another agent in the council via A2A protocol. \" +\n \"Use this to delegate work to a peer agent.\",\n parameters: {\n type: \"object\",\n properties: {\n target: {\n type: \"string\",\n description:\n \"Name of the target agent (e.g. 'mimir', 'tyr', 'bragi', 'idunn')\",\n },\n message: {\n type: \"string\",\n description: \"The task message to send to the agent\",\n },\n },\n required: [\"target\", \"message\"],\n },\n async execute(_id: string, params: { target: string; message: string }) {\n try {\n const result = await server.sendTask(params.target, params.message);\n if (result.error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Failed to send task to ${params.target}: ${result.error.message}`,\n },\n ],\n };\n }\n const task = result.result as any;\n return {\n content: [\n {\n type: \"text\",\n text: [\n `Task sent to ${params.target} successfully.`,\n `Task ID: ${task?.id}`,\n `Status: ${task?.status?.state}`,\n ].join(\"\\n\"),\n },\n ],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error sending task: ${msg}` }],\n };\n }\n },\n });\n\n // Tool: Discover peer agents\n api.registerTool({\n name: \"perkos_a2a_discover\",\n description:\n \"Discover all peer agents in the council and their capabilities. \" +\n \"Returns each agent's status, name, description, and skills.\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n async execute() {\n try {\n const peers = await server.discoverPeers();\n const lines: string[] = [\"## Council Agents\\n\"];\n for (const [name, info] of Object.entries(peers)) {\n if (info.status === \"online\" && info.card) {\n lines.push(`### ${info.card.name} (${name})`);\n lines.push(`- **Status:** online`);\n lines.push(`- **Description:** ${info.card.description}`);\n lines.push(\n `- **Skills:** ${info.card.skills.map((s) => s.name).join(\", \")}`\n );\n lines.push(\"\");\n } else {\n lines.push(`### ${name}`);\n lines.push(`- **Status:** offline`);\n lines.push(\"\");\n }\n }\n return {\n content: [{ type: \"text\", text: lines.join(\"\\n\") }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error discovering peers: ${msg}` }],\n };\n }\n },\n });\n\n // Tool: Get task status\n api.registerTool({\n name: \"perkos_a2a_status\",\n description: \"Get the status of a previously sent A2A task by its ID.\",\n parameters: {\n type: \"object\",\n properties: {\n target: {\n type: \"string\",\n description: \"Name of the agent that received the task\",\n },\n taskId: {\n type: \"string\",\n description: \"The task ID returned from perkos_a2a_send\",\n },\n },\n required: [\"target\", \"taskId\"],\n },\n async execute(\n _id: string,\n params: { target: string; taskId: string }\n ) {\n const targetUrl = pluginConfig.peers[params.target];\n if (!targetUrl) {\n return {\n content: [\n { type: \"text\", text: `Unknown agent: ${params.target}` },\n ],\n };\n }\n\n try {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const peerAuth = pluginConfig.peerAuth?.[params.target];\n if (peerAuth) {\n headers[\"x-api-key\"] = peerAuth;\n }\n\n const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"tasks/get\",\n id: crypto.randomUUID(),\n params: { id: params.taskId },\n }),\n });\n\n const data = (await response.json()) as any;\n if (data.error) {\n return {\n content: [\n { type: \"text\", text: `Error: ${data.error.message}` },\n ],\n };\n }\n\n const task = data.result;\n return {\n content: [\n {\n type: \"text\",\n text: [\n `**Task:** ${task.id}`,\n `**Status:** ${task.status.state}`,\n `**Updated:** ${task.status.timestamp}`,\n task.artifacts?.length\n ? `**Artifacts:** ${task.artifacts.length}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n },\n ],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error: ${msg}` }],\n };\n }\n },\n });\n\n // Gateway RPC method\n api.registerGatewayMethod(\"perkos-a2a.status\", ({ respond }: any) => {\n respond(true, {\n agent: pluginConfig.agentName,\n port: pluginConfig.port,\n mode: pluginConfig.mode || \"auto\",\n clientOnly: server.isClientOnly(),\n relayConnected: server.isRelayConnected(),\n relayUrl: pluginConfig.relay?.url || null,\n peers: Object.keys(pluginConfig.peers),\n pendingTasks: pendingTasks.length,\n hasSystemEventInjection: !!enqueueSystemEvent,\n protocol: \"a2a\",\n version: \"0.8.4\",\n });\n });\n\n // CLI command\n api.registerCli(\n ({ program }: any) => {\n const cmd = program.command(\"perkos-a2a\").description(\"PerkOS A2A protocol tools\");\n\n cmd\n .command(\"status\")\n .description(\"Show A2A agent status\")\n .action(async () => {\n console.log(`Agent: ${pluginConfig.agentName}`);\n console.log(`Port: ${pluginConfig.port}`);\n console.log(`Mode: ${pluginConfig.mode || \"auto\"}`);\n console.log(`Client-only: ${server.isClientOnly()}`);\n console.log(`Relay connected: ${server.isRelayConnected()}`);\n console.log(`Relay URL: ${pluginConfig.relay?.url || \"(not configured)\"}`);\n console.log(`Auth required: ${pluginConfig.auth?.requireApiKey || false}`);\n console.log(`Peers: ${Object.keys(pluginConfig.peers).join(\", \") || \"(none)\"}`);\n console.log(`System event injection: ${!!enqueueSystemEvent}`);\n });\n\n cmd\n .command(\"discover\")\n .description(\"Discover peer agents\")\n .action(async () => {\n const peers = await server.discoverPeers();\n for (const [name, info] of Object.entries(peers)) {\n console.log(\n `${name}: ${info.status}${info.card ? ` -- ${info.card.description}` : \"\"}`\n );\n }\n });\n\n cmd\n .command(\"send <target> <message>\")\n .description(\"Send a task to a peer agent\")\n .action(async (target: string, message: string) => {\n const result = await server.sendTask(target, message);\n console.log(JSON.stringify(result, null, 2));\n });\n\n cmd\n .command(\"setup\")\n .description(\"Detect networking environment and show recommendations\")\n .action(async () => {\n console.log(\"[perkos-a2a] Detecting environment...\\n\");\n\n const isMac = process.platform === \"darwin\";\n console.log(`Platform: ${process.platform}${isMac ? \" (macOS)\" : \"\"}`);\n\n const net = await detectNetworking();\n console.log(`Public IP: ${net.publicIp || \"unknown\"}`);\n console.log(`Local IPs: ${net.localIps.join(\", \") || \"none\"}`);\n console.log(`Behind NAT: ${net.isBehindNat ? \"yes\" : \"no\"}`);\n console.log(`Tailscale: ${net.hasTailscale ? \"installed\" : \"not found\"}${net.tailscaleIp ? ` (${net.tailscaleIp})` : \"\"}`);\n\n let portAvailable = true;\n try {\n const netMod = await import(\"net\");\n await new Promise<void>((resolve, reject) => {\n const srv = netMod.createServer();\n srv.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n portAvailable = false;\n resolve();\n } else {\n reject(err);\n }\n });\n srv.listen(pluginConfig.port, () => {\n srv.close(() => resolve());\n });\n });\n } catch {\n // ignore\n }\n console.log(`Port ${pluginConfig.port}: ${portAvailable ? \"available\" : \"IN USE\"}`);\n console.log(`\\nRelay: ${pluginConfig.relay?.enabled ? \"enabled\" : \"disabled\"}`);\n if (pluginConfig.relay?.url) {\n console.log(`Relay URL: ${pluginConfig.relay.url}`);\n }\n console.log(`Auth: ${pluginConfig.auth?.requireApiKey ? \"enabled\" : \"disabled\"}`);\n console.log(`System event injection: ${!!enqueueSystemEvent}`);\n\n console.log(\"\\n--- Recommendations ---\\n\");\n\n if (!net.isBehindNat) {\n console.log(\"You have a public IP. Configure peers with your public IP.\");\n console.log(` Your A2A URL: http://${net.publicIp}:${pluginConfig.port}/a2a/jsonrpc`);\n } else if (pluginConfig.relay?.enabled) {\n console.log(\"You are behind NAT but relay is configured. Bidirectional communication via relay.\");\n } else if (net.hasTailscale && net.tailscaleIp) {\n console.log(\"Use your Tailscale IP for peers.\");\n console.log(` Your A2A URL: http://${net.tailscaleIp}:${pluginConfig.port}/a2a/jsonrpc`);\n } else {\n console.log(\"You are behind NAT. Options:\");\n console.log(\" 1) Configure a relay hub (recommended) - set relay.url and relay.enabled in config\");\n console.log(\" 2) Install Tailscale - https://tailscale.com\");\n console.log(\" 3) Set up a Cloudflare Tunnel\");\n console.log(' 4) Client-only mode (can send but not receive) - set mode: \"client-only\"');\n }\n\n console.log(\"\\n--- Current Config ---\\n\");\n console.log(`Agent: ${pluginConfig.agentName}`);\n console.log(`Port: ${pluginConfig.port}`);\n console.log(`Mode: ${pluginConfig.mode || \"auto\"}`);\n console.log(`Peers: ${JSON.stringify(pluginConfig.peers, null, 2)}`);\n });\n },\n { commands: [\"perkos-a2a\"] }\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["randomUUID", "WebSocket", "randomUUID", "randomUUID", "randomUUID"]
|
|
7
|
+
}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perkos/perkos-a2a",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "A2A Protocol communication plugin for OpenClaw — Agent-to-Agent protocol implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"a2a-relay": "./bin/relay.ts"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
18
|
+
"build": "tsc && node scripts/bundle.mjs",
|
|
19
19
|
"dev": "tsc --watch",
|
|
20
20
|
"lint": "tsc --noEmit"
|
|
21
21
|
},
|
|
@@ -54,7 +54,9 @@
|
|
|
54
54
|
"@types/express": "^5.0.0",
|
|
55
55
|
"@types/node": "^22.0.0",
|
|
56
56
|
"@types/ws": "^8.5.0",
|
|
57
|
-
"
|
|
57
|
+
"esbuild": "^0.28.0",
|
|
58
|
+
"typescript": "^5.7.0",
|
|
59
|
+
"esbuild": "^0.25.3"
|
|
58
60
|
},
|
|
59
61
|
"peerDependencies": {
|
|
60
62
|
"openclaw": ">=2026.3.0"
|