@perkos/perkos-a2a 0.9.1 → 0.9.2
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/bridge-agent.d.ts +14 -0
- package/dist/bridge-agent.d.ts.map +1 -0
- package/dist/bridge-agent.js +319 -0
- package/dist/bridge-agent.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Standalone PerkOS A2A bridge.
|
|
4
|
+
*
|
|
5
|
+
* This is for runtimes that do not load OpenClaw plugins directly, especially
|
|
6
|
+
* Hermes Workspace. It runs the same A2A HTTP/relay server and delivers inbound
|
|
7
|
+
* tasks into a local runtime over that runtime's native wake/send API.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* perkos-a2a-agent --config ./a2a.config.json
|
|
11
|
+
* A2A_AGENT_NAME=hermes A2A_RUNTIME=hermes-api HERMES_API_URL=http://127.0.0.1:8642 perkos-a2a-agent
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=bridge-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-agent.d.ts","sourceRoot":"","sources":["../src/bridge-agent.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Standalone PerkOS A2A bridge.
|
|
4
|
+
*
|
|
5
|
+
* This is for runtimes that do not load OpenClaw plugins directly, especially
|
|
6
|
+
* Hermes Workspace. It runs the same A2A HTTP/relay server and delivers inbound
|
|
7
|
+
* tasks into a local runtime over that runtime's native wake/send API.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* perkos-a2a-agent --config ./a2a.config.json
|
|
11
|
+
* A2A_AGENT_NAME=hermes A2A_RUNTIME=hermes-api HERMES_API_URL=http://127.0.0.1:8642 perkos-a2a-agent
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync } from "fs";
|
|
14
|
+
import { randomUUID } from "crypto";
|
|
15
|
+
import { createServer as createHttpServer } from "node:http";
|
|
16
|
+
import { A2AServer } from "./server.js";
|
|
17
|
+
import { ChatClient } from "./chat-client.js";
|
|
18
|
+
function argValue(flag) {
|
|
19
|
+
const idx = process.argv.indexOf(flag);
|
|
20
|
+
if (idx === -1)
|
|
21
|
+
return undefined;
|
|
22
|
+
return process.argv[idx + 1];
|
|
23
|
+
}
|
|
24
|
+
function parseJsonEnv(name, fallback) {
|
|
25
|
+
const raw = process.env[name];
|
|
26
|
+
if (!raw)
|
|
27
|
+
return fallback;
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
throw new Error(`${name} must be valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function loadConfig() {
|
|
36
|
+
const configPath = argValue("--config") || argValue("-c") || process.env.A2A_CONFIG;
|
|
37
|
+
if (configPath) {
|
|
38
|
+
return JSON.parse(readFileSync(configPath, "utf8"));
|
|
39
|
+
}
|
|
40
|
+
const port = Number(process.env.A2A_PORT || "5050");
|
|
41
|
+
const relayEnabled = String(process.env.A2A_RELAY_ENABLED || "").toLowerCase() === "true";
|
|
42
|
+
return {
|
|
43
|
+
agentName: process.env.A2A_AGENT_NAME || "agent",
|
|
44
|
+
port,
|
|
45
|
+
bindHost: process.env.A2A_BIND_HOST || "0.0.0.0",
|
|
46
|
+
publicUrl: process.env.A2A_PUBLIC_URL,
|
|
47
|
+
mode: process.env.A2A_MODE || "auto",
|
|
48
|
+
skills: parseJsonEnv("A2A_SKILLS", []),
|
|
49
|
+
peers: parseJsonEnv("A2A_PEERS", {}),
|
|
50
|
+
peerAuth: parseJsonEnv("A2A_PEER_AUTH", {}),
|
|
51
|
+
auth: process.env.A2A_API_KEYS
|
|
52
|
+
? { requireApiKey: true, apiKeys: process.env.A2A_API_KEYS.split(",").map((v) => v.trim()).filter(Boolean) }
|
|
53
|
+
: undefined,
|
|
54
|
+
relay: relayEnabled || process.env.A2A_RELAY_URL
|
|
55
|
+
? {
|
|
56
|
+
enabled: relayEnabled || Boolean(process.env.A2A_RELAY_URL),
|
|
57
|
+
url: process.env.A2A_RELAY_URL || "",
|
|
58
|
+
apiKey: process.env.A2A_RELAY_API_KEY || "",
|
|
59
|
+
hubPort: process.env.A2A_RELAY_HUB_PORT ? Number(process.env.A2A_RELAY_HUB_PORT) : undefined,
|
|
60
|
+
hubApiKeys: process.env.A2A_RELAY_HUB_API_KEYS?.split(",").map((v) => v.trim()).filter(Boolean),
|
|
61
|
+
}
|
|
62
|
+
: undefined,
|
|
63
|
+
runtime: {
|
|
64
|
+
kind: process.env.A2A_RUNTIME || "hermes",
|
|
65
|
+
sessionKey: process.env.A2A_SESSION_KEY,
|
|
66
|
+
hermesUrl: process.env.HERMES_WORKSPACE_URL,
|
|
67
|
+
hermesToken: process.env.HERMES_WORKSPACE_TOKEN || process.env.HERMES_SESSION_TOKEN,
|
|
68
|
+
hermesEndpoint: process.env.HERMES_WORKSPACE_ENDPOINT,
|
|
69
|
+
},
|
|
70
|
+
chat: process.env.A2A_CHAT_ENABLED?.toLowerCase() === "true"
|
|
71
|
+
? {
|
|
72
|
+
enabled: true,
|
|
73
|
+
url: process.env.A2A_CHAT_URL || "wss://chat.perkos.xyz/chat",
|
|
74
|
+
apiKey: process.env.A2A_CHAT_API_KEY || process.env.A2A_RELAY_API_KEY || "",
|
|
75
|
+
storeRoot: process.env.A2A_CHAT_STORE_ROOT,
|
|
76
|
+
defaultHistoryLimit: process.env.A2A_CHAT_HISTORY_LIMIT
|
|
77
|
+
? Number(process.env.A2A_CHAT_HISTORY_LIMIT)
|
|
78
|
+
: undefined,
|
|
79
|
+
}
|
|
80
|
+
: undefined,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Port the bridge listens on for local Hermes-side chat-reply callbacks. */
|
|
84
|
+
function chatReplyPort() {
|
|
85
|
+
return Number(process.env.A2A_CHAT_REPLY_PORT || "5060");
|
|
86
|
+
}
|
|
87
|
+
function taskMarker(task) {
|
|
88
|
+
return `[A2A_RESULT:${task.id}]`;
|
|
89
|
+
}
|
|
90
|
+
function buildRuntimeMessage(task, text) {
|
|
91
|
+
const from = task.metadata?.fromAgent || "unknown";
|
|
92
|
+
const marker = taskMarker(task);
|
|
93
|
+
return [
|
|
94
|
+
marker,
|
|
95
|
+
`From: ${from}`,
|
|
96
|
+
`Task ID: ${task.id}`,
|
|
97
|
+
`Context ID: ${task.contextId}`,
|
|
98
|
+
"",
|
|
99
|
+
"Execute the following request and include the final answer in your assistant reply.",
|
|
100
|
+
`Your final answer must begin with exactly: ${marker}`,
|
|
101
|
+
"Return the useful final answer after that marker.",
|
|
102
|
+
"",
|
|
103
|
+
text,
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
async function deliverToHermes(config, message) {
|
|
107
|
+
const runtime = config.runtime || {};
|
|
108
|
+
const baseUrl = (runtime.hermesUrl || process.env.HERMES_API_URL || process.env.HERMES_WORKSPACE_URL || "http://127.0.0.1:8642").replace(/\/+$/, "");
|
|
109
|
+
const endpoint = runtime.hermesEndpoint || process.env.HERMES_API_ENDPOINT || process.env.HERMES_WORKSPACE_ENDPOINT || "/v1/responses";
|
|
110
|
+
const sessionKey = runtime.sessionKey || process.env.HERMES_SESSION_ID || process.env.HERMES_SESSION_KEY || "a2a";
|
|
111
|
+
const token = runtime.hermesToken || process.env.API_SERVER_KEY || process.env.HERMES_API_KEY || process.env.HERMES_WORKSPACE_TOKEN || process.env.HERMES_SESSION_TOKEN;
|
|
112
|
+
const url = `${baseUrl}${endpoint.startsWith("/") ? endpoint : `/${endpoint}`}`;
|
|
113
|
+
const headers = {
|
|
114
|
+
"content-type": "application/json",
|
|
115
|
+
"x-hermes-session-id": sessionKey,
|
|
116
|
+
"x-hermes-session-key": sessionKey,
|
|
117
|
+
};
|
|
118
|
+
if (token)
|
|
119
|
+
headers.authorization = `Bearer ${token}`;
|
|
120
|
+
const normalizedEndpoint = endpoint.replace(/^\/?/, "/");
|
|
121
|
+
const body = normalizedEndpoint.startsWith("/v1/chat/completions")
|
|
122
|
+
? { model: process.env.HERMES_MODEL || "hermes-agent", messages: [{ role: "user", content: message }], stream: false }
|
|
123
|
+
: normalizedEndpoint.startsWith("/v1/runs")
|
|
124
|
+
? { input: message, session_id: sessionKey }
|
|
125
|
+
: normalizedEndpoint.startsWith("/v1/responses")
|
|
126
|
+
? { model: process.env.HERMES_MODEL || "hermes-agent", input: message, store: true }
|
|
127
|
+
: { sessionKey, message };
|
|
128
|
+
const response = await fetch(url, { method: "POST", headers, body: JSON.stringify(body) });
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
const text = await response.text().catch(() => "");
|
|
131
|
+
throw new Error(`Hermes API delivery failed (${response.status}) at ${url}: ${text || response.statusText}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Extract a wallet address from a ChatIdentity ("user:0xabc..." → "0xabc..."). */
|
|
135
|
+
function parseWalletFromIdentity(identity) {
|
|
136
|
+
if (typeof identity !== "string" || !identity.startsWith("user:"))
|
|
137
|
+
return null;
|
|
138
|
+
const addr = identity.slice("user:".length);
|
|
139
|
+
return addr.startsWith("0x") ? addr.toLowerCase() : null;
|
|
140
|
+
}
|
|
141
|
+
function buildChatMessage(frame) {
|
|
142
|
+
const walletAddress = parseWalletFromIdentity(frame.from);
|
|
143
|
+
const marker = `[PERKOS_CHAT:${frame.convId}]`;
|
|
144
|
+
return [
|
|
145
|
+
marker,
|
|
146
|
+
`From: ${frame.from}`,
|
|
147
|
+
`Conversation: ${frame.convId}`,
|
|
148
|
+
walletAddress ? `Wallet: ${walletAddress}` : "",
|
|
149
|
+
"",
|
|
150
|
+
"A user is messaging this agent in a PerkOS chat conversation.",
|
|
151
|
+
"To respond, POST to http://127.0.0.1:<A2A_CHAT_REPLY_PORT>/chat/reply with:",
|
|
152
|
+
` { "convId": "${frame.convId}", "walletAddress": "${walletAddress ?? ""}", "text": "<your reply>" }`,
|
|
153
|
+
"",
|
|
154
|
+
"Message body:",
|
|
155
|
+
frame.text,
|
|
156
|
+
].filter(Boolean).join("\n");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Local-only HTTP listener for Hermes (or any sidecar) to push chat replies
|
|
160
|
+
* back through the chat client. Bound to 127.0.0.1 — never expose this port
|
|
161
|
+
* publicly. The chat client holds the relay API key; this gives Hermes a
|
|
162
|
+
* controlled callback path without leaking the key to the runtime config.
|
|
163
|
+
*
|
|
164
|
+
* POST /chat/reply
|
|
165
|
+
* { convId, walletAddress, text, replyTo? }
|
|
166
|
+
*
|
|
167
|
+
* → 200 { id, delivered: boolean }
|
|
168
|
+
* → 400 { error: "..." }
|
|
169
|
+
* → 503 { error: "chat client not connected" }
|
|
170
|
+
*/
|
|
171
|
+
function startChatReplyListener(chat, port, logger) {
|
|
172
|
+
const server = createHttpServer(async (req, res) => {
|
|
173
|
+
if (req.method !== "POST" || req.url !== "/chat/reply") {
|
|
174
|
+
res.writeHead(404, { "content-type": "application/json" })
|
|
175
|
+
.end(JSON.stringify({ error: "not found" }));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
let raw = "";
|
|
179
|
+
req.setEncoding("utf8");
|
|
180
|
+
req.on("data", (c) => { raw += c; if (raw.length > 100_000)
|
|
181
|
+
req.destroy(); });
|
|
182
|
+
req.on("end", async () => {
|
|
183
|
+
let body;
|
|
184
|
+
try {
|
|
185
|
+
body = JSON.parse(raw);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
res.writeHead(400, { "content-type": "application/json" })
|
|
189
|
+
.end(JSON.stringify({ error: "invalid JSON" }));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!body.convId || !body.walletAddress || !body.text) {
|
|
193
|
+
res.writeHead(400, { "content-type": "application/json" })
|
|
194
|
+
.end(JSON.stringify({ error: "missing { convId, walletAddress, text }" }));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (!chat.isConnected()) {
|
|
198
|
+
res.writeHead(503, { "content-type": "application/json" })
|
|
199
|
+
.end(JSON.stringify({ error: "chat client not connected; reply will be appended to local store only" }));
|
|
200
|
+
// Continue anyway — sendReply still appends to local jsonl.
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const result = await chat.sendReply({
|
|
204
|
+
convId: body.convId,
|
|
205
|
+
walletAddress: body.walletAddress,
|
|
206
|
+
text: body.text,
|
|
207
|
+
replyTo: body.replyTo,
|
|
208
|
+
});
|
|
209
|
+
if (!res.headersSent) {
|
|
210
|
+
res.writeHead(200, { "content-type": "application/json" })
|
|
211
|
+
.end(JSON.stringify(result));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
res.end(JSON.stringify(result));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
219
|
+
if (!res.headersSent) {
|
|
220
|
+
res.writeHead(500, { "content-type": "application/json" })
|
|
221
|
+
.end(JSON.stringify({ error: msg }));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
server.listen(port, "127.0.0.1", () => {
|
|
227
|
+
logger.info(`[perkos-chat] local reply listener on http://127.0.0.1:${port}/chat/reply`);
|
|
228
|
+
});
|
|
229
|
+
return () => server.close();
|
|
230
|
+
}
|
|
231
|
+
async function main() {
|
|
232
|
+
const config = loadConfig();
|
|
233
|
+
const logger = console;
|
|
234
|
+
const server = new A2AServer(config, logger);
|
|
235
|
+
server.setTaskResultHandler(async (task, text) => {
|
|
236
|
+
const runtimeKind = config.runtime?.kind || "hermes";
|
|
237
|
+
task.status = {
|
|
238
|
+
state: "working",
|
|
239
|
+
timestamp: new Date().toISOString(),
|
|
240
|
+
message: { role: "agent", parts: [{ kind: "text", text: `Task dispatched to ${runtimeKind} runtime.` }] },
|
|
241
|
+
};
|
|
242
|
+
if ((runtimeKind === "hermes" || runtimeKind === "hermes-api")) {
|
|
243
|
+
await deliverToHermes(config, buildRuntimeMessage(task, text));
|
|
244
|
+
task.artifacts.push({
|
|
245
|
+
kind: "artifact",
|
|
246
|
+
artifactId: randomUUID(),
|
|
247
|
+
parts: [{ kind: "text", text: "Delivered to Hermes API Server." }],
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (runtimeKind === "none") {
|
|
252
|
+
task.artifacts.push({
|
|
253
|
+
kind: "artifact",
|
|
254
|
+
artifactId: randomUUID(),
|
|
255
|
+
parts: [{ kind: "text", text: "Runtime delivery disabled." }],
|
|
256
|
+
});
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
throw new Error(`Standalone runtime '${runtimeKind}' is not supported yet. Use OpenClaw plugin mode for OpenClaw delivery.`);
|
|
260
|
+
});
|
|
261
|
+
server.setTaskFailureHandler((task, errorText) => {
|
|
262
|
+
task.status = {
|
|
263
|
+
state: "failed",
|
|
264
|
+
timestamp: new Date().toISOString(),
|
|
265
|
+
message: { role: "agent", parts: [{ kind: "text", text: errorText }] },
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
await server.start();
|
|
269
|
+
logger.info(`[perkos-a2a] standalone bridge running for ${config.agentName} (${config.runtime?.kind || "hermes"})`);
|
|
270
|
+
// -------------------------------------------------------------------------
|
|
271
|
+
// Optional: PerkOS-Chat client for user-facing conversations.
|
|
272
|
+
//
|
|
273
|
+
// When enabled, inbound chat_deliver frames are forwarded to Hermes via the
|
|
274
|
+
// same /v1/responses path used for A2A tasks, but with a [PERKOS_CHAT:<id>]
|
|
275
|
+
// marker and instructions to POST the reply to the local /chat/reply
|
|
276
|
+
// listener (so the relay API key stays in this bridge).
|
|
277
|
+
// -------------------------------------------------------------------------
|
|
278
|
+
let chat = null;
|
|
279
|
+
let stopChatListener = null;
|
|
280
|
+
const chatCfg = config.chat;
|
|
281
|
+
if (chatCfg?.enabled && chatCfg.apiKey) {
|
|
282
|
+
chat = new ChatClient({
|
|
283
|
+
agentName: config.agentName,
|
|
284
|
+
config: chatCfg,
|
|
285
|
+
handlers: {
|
|
286
|
+
logger,
|
|
287
|
+
onChatDeliver: async (frame) => {
|
|
288
|
+
try {
|
|
289
|
+
await deliverToHermes(config, buildChatMessage(frame));
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
logger.error(`[perkos-chat] hermes delivery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
onChannelJoin: async (frame) => {
|
|
296
|
+
logger.info(`[perkos-chat] joined conv ${frame.convId} (host: ${frame.historyHost}, ${frame.participants.length} participants)`);
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
chat.start();
|
|
301
|
+
stopChatListener = startChatReplyListener(chat, chatReplyPort(), logger);
|
|
302
|
+
}
|
|
303
|
+
else if (chatCfg?.enabled && !chatCfg.apiKey) {
|
|
304
|
+
logger.error("[perkos-chat] chat.enabled=true but no apiKey (set A2A_CHAT_API_KEY or A2A_RELAY_API_KEY)");
|
|
305
|
+
}
|
|
306
|
+
const stop = () => {
|
|
307
|
+
logger.info("[perkos-a2a] standalone bridge shutting down");
|
|
308
|
+
chat?.stop();
|
|
309
|
+
stopChatListener?.();
|
|
310
|
+
process.exit(0);
|
|
311
|
+
};
|
|
312
|
+
process.on("SIGINT", stop);
|
|
313
|
+
process.on("SIGTERM", stop);
|
|
314
|
+
}
|
|
315
|
+
main().catch((err) => {
|
|
316
|
+
console.error(`[perkos-a2a] standalone bridge failed: ${err instanceof Error ? err.stack || err.message : String(err)}`);
|
|
317
|
+
process.exit(1);
|
|
318
|
+
});
|
|
319
|
+
//# sourceMappingURL=bridge-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-agent.js","sourceRoot":"","sources":["../src/bridge-agent.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAI,IAAY,EAAE,QAAW;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAoB,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC1F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO;QAChD,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;QAChD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACrC,IAAI,EAAG,OAAO,CAAC,GAAG,CAAC,QAAoC,IAAI,MAAM;QACjE,MAAM,EAAE,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC;QACtC,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QACpC,QAAQ,EAAE,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;YAC5B,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC5G,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9C,CAAC,CAAC;gBACE,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAC3D,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;gBACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;gBAC3C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC5F,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;aAChG;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE;YACP,IAAI,EAAG,OAAO,CAAC,GAAG,CAAC,WAA6G,IAAI,QAAQ;YAC5I,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YACvC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACnF,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;SACtD;QACD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,MAAM;YAC1D,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,4BAA4B;gBAC7D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;gBAC3E,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;gBAC1C,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;oBACrD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;oBAC5C,CAAC,CAAC,SAAS;aACd;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa;IACpB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,eAAe,IAAI,CAAC,EAAE,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU,EAAE,IAAY;IACnD,MAAM,IAAI,GAAI,IAAI,CAAC,QAAQ,EAAE,SAAoB,IAAI,SAAS,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,MAAM;QACN,SAAS,IAAI,EAAE;QACf,YAAY,IAAI,CAAC,EAAE,EAAE;QACrB,eAAe,IAAI,CAAC,SAAS,EAAE;QAC/B,EAAE;QACF,qFAAqF;QACrF,8CAA8C,MAAM,EAAE;QACtD,mDAAmD;QACnD,EAAE;QACF,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAuB,EAAE,OAAe;IACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrJ,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,eAAe,CAAC;IACvI,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC;IAClH,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACxK,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;IAChF,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,qBAAqB,EAAE,UAAU;QACjC,sBAAsB,EAAE,UAAU;KACnC,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAChE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QACtH,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE;YAC5C,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,eAAe,CAAC;gBAC9C,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;gBACpF,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiD;IACzE,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,KAAK,CAAC,MAAM,GAAG,CAAC;IAC/C,OAAO;QACL,MAAM;QACN,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,iBAAiB,KAAK,CAAC,MAAM,EAAE;QAC/B,aAAa,CAAC,CAAC,CAAC,WAAW,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;QAC/C,EAAE;QACF,+DAA+D;QAC/D,6EAA6E;QAC7E,kBAAkB,KAAK,CAAC,MAAM,wBAAwB,aAAa,IAAI,EAAE,6BAA6B;QACtG,EAAE;QACF,eAAe;QACf,KAAK,CAAC,IAAI;KACX,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,IAAgB,EAAE,IAAY,EAAE,MAAe;IAC7E,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;iBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO;YAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,IAAkF,CAAC;YACvF,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uEAAuE,EAAE,CAAC,CAAC,CAAC;gBAC3G,4DAA4D;YAC9D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;yBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;yBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,0DAA0D,IAAI,aAAa,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7C,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,WAAW,WAAW,EAAE,CAAC,EAAE;SAC1G,CAAC;QAEF,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,YAAY,CAAC,EAAE,CAAC;YAC/D,MAAM,eAAe,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,UAAU,EAAE;gBACxB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;aACnE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,UAAU,EAAE;gBACxB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,yEAAyE,CAAC,CAAC;IAC/H,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;SACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEpH,4EAA4E;IAC5E,8DAA8D;IAC9D,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,qEAAqE;IACrE,wDAAwD;IACxD,4EAA4E;IAE5E,IAAI,IAAI,GAAsB,IAAI,CAAC;IACnC,IAAI,gBAAgB,GAAwB,IAAI,CAAC;IAEjD,MAAM,OAAO,GAA2B,MAAM,CAAC,IAAI,CAAC;IACpD,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,GAAG,IAAI,UAAU,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE;gBACR,MAAM;gBACN,aAAa,EAAE,KAAK,EAAE,KAAiD,EAAE,EAAE;oBACzE,IAAI,CAAC;wBACH,MAAM,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,KAAK,CAAC,yCAAyC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC5G,CAAC;gBACH,CAAC;gBACD,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC7B,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;gBACnI,CAAC;aACF;SACF,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,gBAAgB,GAAG,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,IAAI,EAAE,IAAI,EAAE,CAAC;QACb,gBAAgB,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perkos/perkos-a2a",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "A2A Protocol communication plugin for OpenClaw — Agent-to-Agent protocol implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
9
|
"perkos-a2a-agent": "./dist/agent.js",
|
|
10
|
-
"perkos-a2a-hermes": "./dist/hermes-cli.js"
|
|
10
|
+
"perkos-a2a-hermes": "./dist/hermes-cli.js",
|
|
11
|
+
"perkos-a2a-bridge": "./dist/bridge-agent.js"
|
|
11
12
|
},
|
|
12
13
|
"exports": {
|
|
13
14
|
".": {
|