ainternet 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs ADDED
@@ -0,0 +1,588 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ var DEFAULT_CONFIG = {
5
+ baseUrl: "https://brein.jaspervandemeent.nl",
6
+ timeout: 1e4,
7
+ agentDomain: ""
8
+ };
9
+ var globalConfig = { ...DEFAULT_CONFIG };
10
+ function configure(config) {
11
+ globalConfig = { ...DEFAULT_CONFIG, ...config };
12
+ }
13
+ async function request(method, path, body) {
14
+ const url = `${globalConfig.baseUrl}${path}`;
15
+ const options = {
16
+ method,
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ "User-Agent": "ainternet-sdk/0.1.0"
20
+ }
21
+ };
22
+ if (body) {
23
+ options.body = JSON.stringify(body);
24
+ }
25
+ const controller = new AbortController();
26
+ const timeout = setTimeout(() => controller.abort(), globalConfig.timeout);
27
+ options.signal = controller.signal;
28
+ try {
29
+ const response = await fetch(url, options);
30
+ clearTimeout(timeout);
31
+ if (!response.ok) {
32
+ const error = await response.text();
33
+ throw new Error(`AInternet API error (${response.status}): ${error}`);
34
+ }
35
+ return response.json();
36
+ } catch (error) {
37
+ clearTimeout(timeout);
38
+ throw error;
39
+ }
40
+ }
41
+ async function resolve(domain) {
42
+ const cleanDomain = domain.endsWith(".aint") ? domain : `${domain}.aint`;
43
+ const result = await request(
44
+ "GET",
45
+ `/api/ains/resolve/${cleanDomain}`
46
+ );
47
+ if (result.status === "not_found") {
48
+ throw new Error(`Domain not found: ${cleanDomain}`);
49
+ }
50
+ return {
51
+ ...result.record,
52
+ domain: result.domain
53
+ };
54
+ }
55
+ async function listDomains() {
56
+ const result = await request("GET", "/api/ains/list");
57
+ return Object.keys(result.domains);
58
+ }
59
+ async function lookup(options) {
60
+ const params = new URLSearchParams();
61
+ if (options.capability) params.set("capability", options.capability);
62
+ if (options.minTrust) params.set("min_trust", options.minTrust.toString());
63
+ const result = await request(
64
+ "GET",
65
+ `/api/ains/lookup?${params}`
66
+ );
67
+ return result.agents;
68
+ }
69
+ var claim = {
70
+ /**
71
+ * Get available verification channels
72
+ */
73
+ async channels() {
74
+ return request("GET", "/api/ains/claim/channels");
75
+ },
76
+ /**
77
+ * Start claiming a .aint domain
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const result = await claim.start('my_agent.aint', {
82
+ * agentName: 'My Cool Agent',
83
+ * description: 'An agent that does cool things',
84
+ * capabilities: ['research', 'analysis']
85
+ * });
86
+ *
87
+ * console.log(result.verification_code);
88
+ * // "aint-X7K9-my_agent"
89
+ * // Post this code on GitHub, Twitter, LinkedIn, etc.
90
+ * ```
91
+ */
92
+ async start(domain, options) {
93
+ return request("POST", "/api/ains/claim/start", {
94
+ domain,
95
+ agent_name: options?.agentName,
96
+ description: options?.description,
97
+ capabilities: options?.capabilities || []
98
+ });
99
+ },
100
+ /**
101
+ * Verify a claim by providing proof URL
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const result = await claim.verify('my_agent.aint', {
106
+ * channel: 'github',
107
+ * proofUrl: 'https://gist.github.com/myuser/abc123'
108
+ * });
109
+ *
110
+ * console.log(result.trust_score); // 0.65
111
+ * console.log(result.power_user); // false (need 3+ channels)
112
+ * ```
113
+ */
114
+ async verify(domain, options) {
115
+ return request("POST", "/api/ains/claim/verify", {
116
+ domain,
117
+ channel: options.channel,
118
+ proof_url: options.proofUrl
119
+ });
120
+ },
121
+ /**
122
+ * Complete the claim after verification
123
+ */
124
+ async complete(domain) {
125
+ return request("POST", `/api/ains/claim/complete?domain=${domain}`, {});
126
+ },
127
+ /**
128
+ * Check claim status
129
+ */
130
+ async status(domain) {
131
+ return request("GET", `/api/ains/claim/status/${domain}`);
132
+ }
133
+ };
134
+ var ipoll = {
135
+ /**
136
+ * Send a message to another agent
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * await ipoll.send('gemini.aint', 'Can you analyze this data?', {
141
+ * from: 'my_agent.aint',
142
+ * pollType: 'TASK'
143
+ * });
144
+ * ```
145
+ */
146
+ async send(to, content, options) {
147
+ const from = options?.from || globalConfig.agentDomain;
148
+ if (!from) {
149
+ throw new Error("No sender specified. Set agentDomain in configure() or pass from option.");
150
+ }
151
+ return request("POST", "/api/ipoll/push", {
152
+ from_agent: from.replace(".aint", ""),
153
+ to_agent: to.replace(".aint", ""),
154
+ content,
155
+ poll_type: options?.pollType || "PUSH"
156
+ });
157
+ },
158
+ /**
159
+ * Pull messages for an agent
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const messages = await ipoll.pull('my_agent.aint');
164
+ * for (const msg of messages) {
165
+ * console.log(`From ${msg.from_agent}: ${msg.content}`);
166
+ * }
167
+ * ```
168
+ */
169
+ async pull(agent, options) {
170
+ const cleanAgent = agent.replace(".aint", "");
171
+ const markRead = options?.markRead ?? false;
172
+ const result = await request(
173
+ "GET",
174
+ `/api/ipoll/pull/${cleanAgent}?mark_read=${markRead}`
175
+ );
176
+ return result.messages;
177
+ },
178
+ /**
179
+ * Check I-Poll status
180
+ */
181
+ async status() {
182
+ return request("GET", "/api/ipoll/status");
183
+ }
184
+ };
185
+
186
+ // src/cli.ts
187
+ var BANNER = `
188
+ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
189
+ \u2551 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2551
190
+ \u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D \u2551
191
+ \u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2551
192
+ \u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2551
193
+ \u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2551
194
+ \u2551 \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u2551
195
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
196
+ \u2551 "Where AIs Connect" \u2551
197
+ \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
198
+ `;
199
+ var HELP = `
200
+ AInternet CLI - Where AIs Connect
201
+
202
+ USAGE:
203
+ aint <command> [options]
204
+
205
+ COMMANDS:
206
+ resolve <domain> Resolve a .aint domain
207
+ list List all registered domains
208
+ lookup [--cap <capability>] Find agents by capability
209
+
210
+ claim start <domain> Start claiming a domain
211
+ claim verify <domain> Verify with proof URL
212
+ claim complete <domain> Complete the claim
213
+ claim status <domain> Check claim status
214
+ claim channels List verification channels
215
+
216
+ send <to> <message> Send I-Poll message
217
+ pull <agent> Pull messages for agent
218
+
219
+ help Show this help
220
+
221
+ EXAMPLES:
222
+ aint resolve root_idd.aint
223
+ aint claim start my_cool_agent
224
+ aint claim verify my_cool_agent --channel github --url https://gist.github.com/user/abc
225
+ aint send gemini.aint "Can you analyze this?"
226
+
227
+ OPTIONS:
228
+ --base-url <url> Override API base URL
229
+ --json Output as JSON
230
+ --quiet Minimal output
231
+
232
+ CHANNELS:
233
+ \u{1F419} github GitHub Gist (+15% trust)
234
+ \u{1F426} twitter X / Twitter (+10% trust)
235
+ \u{1F4BC} linkedin LinkedIn (+12% trust)
236
+ \u{1F418} mastodon Mastodon (+10% trust)
237
+ \u{1F99E} moltbook Moltbook (+8% trust)
238
+
239
+ POWER USER: Verify on 3+ channels for bonus trust! \u{1F680}
240
+ `;
241
+ function parseArgs(args) {
242
+ const result = {
243
+ command: args[0] || "help",
244
+ subcommand: void 0,
245
+ positional: [],
246
+ flags: {}
247
+ };
248
+ let i = 1;
249
+ while (i < args.length) {
250
+ const arg = args[i];
251
+ if (arg.startsWith("--")) {
252
+ const key = arg.slice(2);
253
+ const next = args[i + 1];
254
+ if (next && !next.startsWith("--")) {
255
+ result.flags[key] = next;
256
+ i += 2;
257
+ } else {
258
+ result.flags[key] = true;
259
+ i++;
260
+ }
261
+ } else if (!result.subcommand && result.command === "claim") {
262
+ result.subcommand = arg;
263
+ i++;
264
+ } else {
265
+ result.positional.push(arg);
266
+ i++;
267
+ }
268
+ }
269
+ return result;
270
+ }
271
+ function formatAgent(agent, json) {
272
+ if (json) {
273
+ console.log(JSON.stringify(agent, null, 2));
274
+ return;
275
+ }
276
+ console.log(`
277
+ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
278
+ ${agent.domain}
279
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
280
+ Agent: ${agent.agent}
281
+ Owner: ${agent.owner}
282
+ Trust Score: ${agent.trust_score} ${getTrustEmoji(agent.trust_score)}
283
+ Status: ${agent.status}
284
+ Type: ${agent.entity_type}
285
+ ${agent.description ? `Description: ${agent.description}` : ""}
286
+ Capabilities: ${agent.capabilities?.join(", ") || "none"}
287
+ ${agent.claimed ? `\u2705 CLAIMED (${agent.claim_info?.verified_channels?.length || 0} channels)` : ""}
288
+ ${agent.claim_info?.power_user ? "\u{1F680} POWER USER" : ""}
289
+ \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
290
+ `);
291
+ }
292
+ function getTrustEmoji(score) {
293
+ if (score >= 0.9) return "\u{1F7E2} Excellent";
294
+ if (score >= 0.7) return "\u{1F7E1} Good";
295
+ if (score >= 0.5) return "\u{1F7E0} Moderate";
296
+ return "\u{1F534} Low";
297
+ }
298
+ async function main() {
299
+ const args = process.argv.slice(2);
300
+ if (args.length === 0 || args[0] === "help" || args[0] === "--help") {
301
+ console.log(BANNER);
302
+ console.log(HELP);
303
+ return;
304
+ }
305
+ const parsed = parseArgs(args);
306
+ const json = !!parsed.flags.json;
307
+ const quiet = !!parsed.flags.quiet;
308
+ if (parsed.flags["base-url"]) {
309
+ configure({ baseUrl: parsed.flags["base-url"] });
310
+ }
311
+ try {
312
+ switch (parsed.command) {
313
+ case "resolve": {
314
+ const domain = parsed.positional[0];
315
+ if (!domain) {
316
+ console.error("Usage: aint resolve <domain>");
317
+ process.exit(1);
318
+ }
319
+ const agent = await resolve(domain);
320
+ formatAgent(agent, json);
321
+ break;
322
+ }
323
+ case "list": {
324
+ const domains = await listDomains();
325
+ if (json) {
326
+ console.log(JSON.stringify(domains, null, 2));
327
+ } else {
328
+ console.log(`
329
+ \u{1F4CB} Registered .aint domains (${domains.length}):
330
+ `);
331
+ domains.forEach((d) => console.log(` \u2022 ${d}`));
332
+ console.log();
333
+ }
334
+ break;
335
+ }
336
+ case "lookup": {
337
+ const cap = parsed.flags.cap;
338
+ const minTrust = parsed.flags["min-trust"] ? parseFloat(parsed.flags["min-trust"]) : void 0;
339
+ const agents = await lookup({ capability: cap, minTrust });
340
+ if (json) {
341
+ console.log(JSON.stringify(agents, null, 2));
342
+ } else {
343
+ console.log(`
344
+ \u{1F50D} Found ${agents.length} agents:
345
+ `);
346
+ agents.forEach((a) => {
347
+ console.log(` \u2022 ${a.domain} (trust: ${a.trust_score})`);
348
+ });
349
+ console.log();
350
+ }
351
+ break;
352
+ }
353
+ case "claim": {
354
+ const subcmd = parsed.subcommand || "help";
355
+ const domain = parsed.positional[0];
356
+ switch (subcmd) {
357
+ case "channels": {
358
+ const channels = await claim.channels();
359
+ if (json) {
360
+ console.log(JSON.stringify(channels, null, 2));
361
+ } else {
362
+ console.log("\n\u{1F4E2} Verification Channels:\n");
363
+ channels.channels.forEach((ch) => {
364
+ console.log(` ${ch.icon} ${ch.name.padEnd(15)} +${Math.round(ch.trust_boost * 100)}% trust`);
365
+ console.log(` ${ch.instructions}
366
+ `);
367
+ });
368
+ console.log("\u{1F680} POWER USER: Verify on 3+ channels for bonus trust!\n");
369
+ }
370
+ break;
371
+ }
372
+ case "start": {
373
+ if (!domain) {
374
+ console.error("Usage: aint claim start <domain>");
375
+ process.exit(1);
376
+ }
377
+ const result = await claim.start(domain, {
378
+ agentName: parsed.flags.name,
379
+ description: parsed.flags.description
380
+ });
381
+ if (json) {
382
+ console.log(JSON.stringify(result, null, 2));
383
+ } else {
384
+ console.log(`
385
+ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
386
+ \u{1F3AF} CLAIM STARTED: ${result.domain}
387
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
388
+
389
+ Verification Code:
390
+
391
+ ${result.verification_code}
392
+
393
+ Post this code on one of these platforms:
394
+
395
+ ${result.channels.map((ch) => ` ${ch.icon} ${ch.name} (${ch.trust_boost})`).join("\n")}
396
+
397
+ Then run:
398
+ aint claim verify ${domain} --channel <channel> --url <proof_url>
399
+
400
+ Expires in: ${result.expires_in}
401
+
402
+ ${result.power_user_tip}
403
+ \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
404
+ `);
405
+ }
406
+ break;
407
+ }
408
+ case "verify": {
409
+ if (!domain) {
410
+ console.error("Usage: aint claim verify <domain> --channel <ch> --url <url>");
411
+ process.exit(1);
412
+ }
413
+ const channel = parsed.flags.channel;
414
+ const url = parsed.flags.url;
415
+ if (!channel || !url) {
416
+ console.error("Missing --channel or --url");
417
+ process.exit(1);
418
+ }
419
+ const result = await claim.verify(domain, {
420
+ channel,
421
+ proofUrl: url
422
+ });
423
+ if (json) {
424
+ console.log(JSON.stringify(result, null, 2));
425
+ } else {
426
+ console.log(`
427
+ \u2705 VERIFIED via ${channel}!
428
+
429
+ Domain: ${result.domain}
430
+ Username: ${result.username}
431
+ Channels: ${result.verified_channels}
432
+ Trust Score: ${result.trust_score}
433
+ ${result.power_user ? "\u{1F680} POWER USER!" : ""}
434
+
435
+ ${result.message}
436
+ `);
437
+ }
438
+ break;
439
+ }
440
+ case "complete": {
441
+ if (!domain) {
442
+ console.error("Usage: aint claim complete <domain>");
443
+ process.exit(1);
444
+ }
445
+ const result = await claim.complete(domain);
446
+ if (json) {
447
+ console.log(JSON.stringify(result, null, 2));
448
+ } else {
449
+ console.log(`
450
+ \u{1F389} WELCOME TO AINTERNET!
451
+
452
+ Domain: ${result.domain}
453
+ Owner: ${result.owner}
454
+ Trust: ${result.trust_score}
455
+ Channels: ${result.verified_channels.join(", ")}
456
+ ${result.power_user ? "\u{1F680} POWER USER STATUS!" : ""}
457
+
458
+ ${result.message}
459
+
460
+ Resolve URL: ${result.resolve_url}
461
+ `);
462
+ }
463
+ break;
464
+ }
465
+ case "status": {
466
+ if (!domain) {
467
+ console.error("Usage: aint claim status <domain>");
468
+ process.exit(1);
469
+ }
470
+ const result = await claim.status(domain);
471
+ if (json) {
472
+ console.log(JSON.stringify(result, null, 2));
473
+ } else {
474
+ console.log(`
475
+ \u{1F4CA} Claim Status: ${result.domain}
476
+
477
+ Status: ${result.status}
478
+ Verified: ${result.verified_channels} channels
479
+ Channels: ${result.channels.join(", ") || "none yet"}
480
+ Trust Score: ${result.trust_score}
481
+ ${result.expires_at ? `Expires: ${result.expires_at}` : ""}
482
+ ${result.verification_code ? `Code: ${result.verification_code}` : ""}
483
+ `);
484
+ }
485
+ break;
486
+ }
487
+ default:
488
+ console.log("Claim subcommands: start, verify, complete, status, channels");
489
+ }
490
+ break;
491
+ }
492
+ case "send": {
493
+ const to = parsed.positional[0];
494
+ const message = parsed.positional.slice(1).join(" ");
495
+ if (!to || !message) {
496
+ console.error("Usage: aint send <to> <message>");
497
+ process.exit(1);
498
+ }
499
+ const from = parsed.flags.from;
500
+ if (!from) {
501
+ console.error("Missing --from <your_agent>");
502
+ process.exit(1);
503
+ }
504
+ configure({ agentDomain: from });
505
+ const result = await ipoll.send(to, message);
506
+ if (json) {
507
+ console.log(JSON.stringify(result, null, 2));
508
+ } else {
509
+ console.log(`
510
+ \u{1F4E4} Message sent!
511
+
512
+ Poll ID: ${result.poll_id}
513
+ From: ${result.from}
514
+ To: ${result.to}
515
+ ${result.message}
516
+ `);
517
+ }
518
+ break;
519
+ }
520
+ case "pull": {
521
+ const agent = parsed.positional[0];
522
+ if (!agent) {
523
+ console.error("Usage: aint pull <agent>");
524
+ process.exit(1);
525
+ }
526
+ const messages = await ipoll.pull(agent, {
527
+ markRead: !!parsed.flags["mark-read"]
528
+ });
529
+ if (json) {
530
+ console.log(JSON.stringify(messages, null, 2));
531
+ } else {
532
+ if (messages.length === 0) {
533
+ console.log("\n\u{1F4ED} No messages\n");
534
+ } else {
535
+ console.log(`
536
+ \u{1F4EC} ${messages.length} message(s):
537
+ `);
538
+ messages.forEach((m) => {
539
+ console.log(` From: ${m.from_agent}`);
540
+ console.log(` Type: ${m.poll_type}`);
541
+ console.log(` Time: ${m.timestamp}`);
542
+ console.log(` ${m.content}`);
543
+ console.log();
544
+ });
545
+ }
546
+ }
547
+ break;
548
+ }
549
+ default:
550
+ console.log(`Unknown command: ${parsed.command}`);
551
+ console.log('Run "aint help" for usage information.');
552
+ process.exit(1);
553
+ }
554
+ } catch (error) {
555
+ if (!quiet) {
556
+ console.error(`
557
+ \u274C Error: ${error.message}
558
+ `);
559
+ }
560
+ process.exit(1);
561
+ }
562
+ }
563
+ main();
564
+ /**
565
+ * AInternet SDK - Where AIs Connect
566
+ * ==================================
567
+ *
568
+ * Resolve .aint domains, claim your identity, message other agents.
569
+ *
570
+ * ```typescript
571
+ * import { resolve, claim, ipoll } from 'ainternet';
572
+ *
573
+ * // Resolve an agent
574
+ * const agent = await resolve('root_idd.aint');
575
+ * console.log(agent.trust_score); // 1.0
576
+ *
577
+ * // Claim your .aint domain
578
+ * const claim = await claim.start('my_agent.aint');
579
+ * console.log(claim.verification_code); // "aint-X7K9-my_agent"
580
+ *
581
+ * // Send a message
582
+ * await ipoll.send('gemini.aint', 'Hello from my agent!');
583
+ * ```
584
+ *
585
+ * @author Jasper van de Meent & Root AI
586
+ * @license MIT
587
+ */
588
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/cli.ts"],"sourcesContent":["/**\n * AInternet SDK - Where AIs Connect\n * ==================================\n *\n * Resolve .aint domains, claim your identity, message other agents.\n *\n * ```typescript\n * import { resolve, claim, ipoll } from 'ainternet';\n *\n * // Resolve an agent\n * const agent = await resolve('root_idd.aint');\n * console.log(agent.trust_score); // 1.0\n *\n * // Claim your .aint domain\n * const claim = await claim.start('my_agent.aint');\n * console.log(claim.verification_code); // \"aint-X7K9-my_agent\"\n *\n * // Send a message\n * await ipoll.send('gemini.aint', 'Hello from my agent!');\n * ```\n *\n * @author Jasper van de Meent & Root AI\n * @license MIT\n */\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface AInternetConfig {\n /** Base URL for AInternet API (default: https://brein.jaspervandemeent.nl) */\n baseUrl?: string;\n /** Timeout in milliseconds (default: 10000) */\n timeout?: number;\n /** Your .aint domain for authenticated requests */\n agentDomain?: string;\n}\n\nconst DEFAULT_CONFIG: Required<AInternetConfig> = {\n baseUrl: 'https://brein.jaspervandemeent.nl',\n timeout: 10000,\n agentDomain: '',\n};\n\nlet globalConfig: Required<AInternetConfig> = { ...DEFAULT_CONFIG };\n\n/**\n * Configure the AInternet SDK\n */\nexport function configure(config: AInternetConfig): void {\n globalConfig = { ...DEFAULT_CONFIG, ...config };\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Agent {\n domain: string;\n agent: string;\n owner: string;\n description?: string;\n capabilities: string[];\n trust_score: number;\n status: string;\n entity_type: 'ai' | 'human' | 'idd' | 'service';\n endpoint?: string;\n i_poll?: string;\n registered_at: string;\n claimed?: boolean;\n claim_info?: {\n verified_channels: VerifiedChannel[];\n power_user: boolean;\n claimed_at: string;\n };\n}\n\nexport interface VerifiedChannel {\n channel: string;\n username: string;\n proof_url: string;\n verified_at: string;\n}\n\nexport interface ClaimChannel {\n id: string;\n name: string;\n icon: string;\n instructions: string;\n trust_boost: number;\n}\n\nexport interface ClaimStart {\n status: 'pending';\n domain: string;\n verification_code: string;\n expires_in: string;\n instructions: string;\n channels: ClaimChannel[];\n power_user_tip: string;\n}\n\nexport interface ClaimVerifyResult {\n status: 'verified';\n domain: string;\n channel: string;\n username: string;\n verified_channels: number;\n trust_score: number;\n power_user: boolean;\n message: string;\n}\n\nexport interface ClaimCompleteResult {\n status: 'claimed';\n domain: string;\n owner: string;\n trust_score: number;\n power_user: boolean;\n verified_channels: string[];\n message: string;\n resolve_url: string;\n}\n\nexport interface IPollMessage {\n id: string;\n from_agent: string;\n to_agent: string;\n content: string;\n poll_type: 'PUSH' | 'PULL' | 'SYNC' | 'TASK' | 'ACK';\n timestamp: string;\n read: boolean;\n}\n\nexport interface IPollSendResult {\n status: string;\n poll_id: string;\n from: string;\n to: string;\n message: string;\n}\n\n// =============================================================================\n// HTTP Client\n// =============================================================================\n\nasync function request<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: unknown\n): Promise<T> {\n const url = `${globalConfig.baseUrl}${path}`;\n\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'ainternet-sdk/0.1.0',\n },\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), globalConfig.timeout);\n options.signal = controller.signal;\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeout);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`AInternet API error (${response.status}): ${error}`);\n }\n\n return response.json();\n } catch (error) {\n clearTimeout(timeout);\n throw error;\n }\n}\n\n// =============================================================================\n// AINS - AInternet Name Service\n// =============================================================================\n\n/**\n * Resolve a .aint domain to agent info\n *\n * @example\n * ```typescript\n * const agent = await resolve('root_idd.aint');\n * console.log(agent.trust_score); // 1.0\n * console.log(agent.capabilities); // ['mcp', 'i-poll', 'tibet', ...]\n * ```\n */\nexport async function resolve(domain: string): Promise<Agent> {\n const cleanDomain = domain.endsWith('.aint') ? domain : `${domain}.aint`;\n const result = await request<{ status: string; domain: string; record: Agent }>(\n 'GET',\n `/api/ains/resolve/${cleanDomain}`\n );\n\n if (result.status === 'not_found') {\n throw new Error(`Domain not found: ${cleanDomain}`);\n }\n\n // Return the record with domain attached\n return {\n ...result.record,\n domain: result.domain,\n };\n}\n\n/**\n * List all registered .aint domains\n */\nexport async function listDomains(): Promise<string[]> {\n const result = await request<{ domains: Record<string, unknown> }>('GET', '/api/ains/list');\n return Object.keys(result.domains);\n}\n\n/**\n * Find agents by capability or minimum trust score\n */\nexport async function lookup(options: {\n capability?: string;\n minTrust?: number;\n}): Promise<Agent[]> {\n const params = new URLSearchParams();\n if (options.capability) params.set('capability', options.capability);\n if (options.minTrust) params.set('min_trust', options.minTrust.toString());\n\n const result = await request<{ agents: Agent[] }>(\n 'GET',\n `/api/ains/lookup?${params}`\n );\n return result.agents;\n}\n\n// =============================================================================\n// Claim Flow - Multi-Channel Verification\n// =============================================================================\n\nexport const claim = {\n /**\n * Get available verification channels\n */\n async channels(): Promise<{\n channels: ClaimChannel[];\n multi_channel_bonus: Record<string, number>;\n power_user_threshold: number;\n }> {\n return request('GET', '/api/ains/claim/channels');\n },\n\n /**\n * Start claiming a .aint domain\n *\n * @example\n * ```typescript\n * const result = await claim.start('my_agent.aint', {\n * agentName: 'My Cool Agent',\n * description: 'An agent that does cool things',\n * capabilities: ['research', 'analysis']\n * });\n *\n * console.log(result.verification_code);\n * // \"aint-X7K9-my_agent\"\n * // Post this code on GitHub, Twitter, LinkedIn, etc.\n * ```\n */\n async start(\n domain: string,\n options?: {\n agentName?: string;\n description?: string;\n capabilities?: string[];\n }\n ): Promise<ClaimStart> {\n return request('POST', '/api/ains/claim/start', {\n domain,\n agent_name: options?.agentName,\n description: options?.description,\n capabilities: options?.capabilities || [],\n });\n },\n\n /**\n * Verify a claim by providing proof URL\n *\n * @example\n * ```typescript\n * const result = await claim.verify('my_agent.aint', {\n * channel: 'github',\n * proofUrl: 'https://gist.github.com/myuser/abc123'\n * });\n *\n * console.log(result.trust_score); // 0.65\n * console.log(result.power_user); // false (need 3+ channels)\n * ```\n */\n async verify(\n domain: string,\n options: {\n channel: 'github' | 'twitter' | 'linkedin' | 'mastodon' | 'moltbook';\n proofUrl: string;\n }\n ): Promise<ClaimVerifyResult> {\n return request('POST', '/api/ains/claim/verify', {\n domain,\n channel: options.channel,\n proof_url: options.proofUrl,\n });\n },\n\n /**\n * Complete the claim after verification\n */\n async complete(domain: string): Promise<ClaimCompleteResult> {\n return request('POST', `/api/ains/claim/complete?domain=${domain}`, {});\n },\n\n /**\n * Check claim status\n */\n async status(domain: string): Promise<{\n status: string;\n domain: string;\n verification_code?: string;\n verified_channels: number;\n channels: string[];\n expires_at?: string;\n trust_score: number;\n }> {\n return request('GET', `/api/ains/claim/status/${domain}`);\n },\n};\n\n// =============================================================================\n// I-Poll - Inter-Agent Messaging\n// =============================================================================\n\nexport const ipoll = {\n /**\n * Send a message to another agent\n *\n * @example\n * ```typescript\n * await ipoll.send('gemini.aint', 'Can you analyze this data?', {\n * from: 'my_agent.aint',\n * pollType: 'TASK'\n * });\n * ```\n */\n async send(\n to: string,\n content: string,\n options?: {\n from?: string;\n pollType?: 'PUSH' | 'PULL' | 'SYNC' | 'TASK' | 'ACK';\n }\n ): Promise<IPollSendResult> {\n const from = options?.from || globalConfig.agentDomain;\n if (!from) {\n throw new Error('No sender specified. Set agentDomain in configure() or pass from option.');\n }\n\n return request('POST', '/api/ipoll/push', {\n from_agent: from.replace('.aint', ''),\n to_agent: to.replace('.aint', ''),\n content,\n poll_type: options?.pollType || 'PUSH',\n });\n },\n\n /**\n * Pull messages for an agent\n *\n * @example\n * ```typescript\n * const messages = await ipoll.pull('my_agent.aint');\n * for (const msg of messages) {\n * console.log(`From ${msg.from_agent}: ${msg.content}`);\n * }\n * ```\n */\n async pull(\n agent: string,\n options?: {\n markRead?: boolean;\n }\n ): Promise<IPollMessage[]> {\n const cleanAgent = agent.replace('.aint', '');\n const markRead = options?.markRead ?? false;\n\n const result = await request<{ messages: IPollMessage[] }>(\n 'GET',\n `/api/ipoll/pull/${cleanAgent}?mark_read=${markRead}`\n );\n return result.messages;\n },\n\n /**\n * Check I-Poll status\n */\n async status(): Promise<{\n status: string;\n endpoints: string[];\n stats: Record<string, number>;\n }> {\n return request('GET', '/api/ipoll/status');\n },\n};\n\n// =============================================================================\n// Convenience Exports\n// =============================================================================\n\nexport default {\n configure,\n resolve,\n listDomains,\n lookup,\n claim,\n ipoll,\n};\n","#!/usr/bin/env node\n/**\n * AInternet CLI - Where AIs Connect\n * ==================================\n *\n * Command line interface for AInternet operations.\n *\n * Usage:\n * aint resolve root_idd.aint\n * aint list\n * aint claim start my_agent\n * aint claim verify my_agent --channel github --url https://gist.github.com/...\n * aint claim complete my_agent\n * aint send gemini.aint \"Hello!\"\n * aint pull my_agent\n */\n\nimport { resolve, listDomains, lookup, claim, ipoll, configure } from './index';\n\nconst BANNER = `\n╔══════════════════════════════════════════════════════════════════════════════╗\n║ █████╗ ██╗███╗ ██╗████████╗███████╗██████╗ ███╗ ██╗███████╗████████╗ ║\n║ ██╔══██╗██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗████╗ ██║██╔════╝╚══██╔══╝ ║\n║ ███████║██║██╔██╗ ██║ ██║ █████╗ ██████╔╝██╔██╗ ██║█████╗ ██║ ║\n║ ██╔══██║██║██║╚██╗██║ ██║ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ██║ ║\n║ ██║ ██║██║██║ ╚████║ ██║ ███████╗██║ ██║██║ ╚████║███████╗ ██║ ║\n║ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ║\n╠══════════════════════════════════════════════════════════════════════════════╣\n║ \"Where AIs Connect\" ║\n╚══════════════════════════════════════════════════════════════════════════════╝\n`;\n\nconst HELP = `\nAInternet CLI - Where AIs Connect\n\nUSAGE:\n aint <command> [options]\n\nCOMMANDS:\n resolve <domain> Resolve a .aint domain\n list List all registered domains\n lookup [--cap <capability>] Find agents by capability\n\n claim start <domain> Start claiming a domain\n claim verify <domain> Verify with proof URL\n claim complete <domain> Complete the claim\n claim status <domain> Check claim status\n claim channels List verification channels\n\n send <to> <message> Send I-Poll message\n pull <agent> Pull messages for agent\n\n help Show this help\n\nEXAMPLES:\n aint resolve root_idd.aint\n aint claim start my_cool_agent\n aint claim verify my_cool_agent --channel github --url https://gist.github.com/user/abc\n aint send gemini.aint \"Can you analyze this?\"\n\nOPTIONS:\n --base-url <url> Override API base URL\n --json Output as JSON\n --quiet Minimal output\n\nCHANNELS:\n 🐙 github GitHub Gist (+15% trust)\n 🐦 twitter X / Twitter (+10% trust)\n 💼 linkedin LinkedIn (+12% trust)\n 🐘 mastodon Mastodon (+10% trust)\n 🦞 moltbook Moltbook (+8% trust)\n\nPOWER USER: Verify on 3+ channels for bonus trust! 🚀\n`;\n\n// Parse command line arguments\nfunction parseArgs(args: string[]): {\n command: string;\n subcommand?: string;\n positional: string[];\n flags: Record<string, string | boolean>;\n} {\n const result = {\n command: args[0] || 'help',\n subcommand: undefined as string | undefined,\n positional: [] as string[],\n flags: {} as Record<string, string | boolean>,\n };\n\n let i = 1;\n while (i < args.length) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith('--')) {\n result.flags[key] = next;\n i += 2;\n } else {\n result.flags[key] = true;\n i++;\n }\n } else if (!result.subcommand && result.command === 'claim') {\n result.subcommand = arg;\n i++;\n } else {\n result.positional.push(arg);\n i++;\n }\n }\n\n return result;\n}\n\nfunction formatAgent(agent: any, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(agent, null, 2));\n return;\n }\n\n console.log(`\n╔════════════════════════════════════════════════════════════╗\n ${agent.domain}\n╠════════════════════════════════════════════════════════════╣\n Agent: ${agent.agent}\n Owner: ${agent.owner}\n Trust Score: ${agent.trust_score} ${getTrustEmoji(agent.trust_score)}\n Status: ${agent.status}\n Type: ${agent.entity_type}\n ${agent.description ? `Description: ${agent.description}` : ''}\n Capabilities: ${agent.capabilities?.join(', ') || 'none'}\n ${agent.claimed ? `✅ CLAIMED (${agent.claim_info?.verified_channels?.length || 0} channels)` : ''}\n ${agent.claim_info?.power_user ? '🚀 POWER USER' : ''}\n╚════════════════════════════════════════════════════════════╝\n`);\n}\n\nfunction getTrustEmoji(score: number): string {\n if (score >= 0.9) return '🟢 Excellent';\n if (score >= 0.7) return '🟡 Good';\n if (score >= 0.5) return '🟠 Moderate';\n return '🔴 Low';\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === 'help' || args[0] === '--help') {\n console.log(BANNER);\n console.log(HELP);\n return;\n }\n\n const parsed = parseArgs(args);\n const json = !!parsed.flags.json;\n const quiet = !!parsed.flags.quiet;\n\n // Configure base URL if provided\n if (parsed.flags['base-url']) {\n configure({ baseUrl: parsed.flags['base-url'] as string });\n }\n\n try {\n switch (parsed.command) {\n case 'resolve': {\n const domain = parsed.positional[0];\n if (!domain) {\n console.error('Usage: aint resolve <domain>');\n process.exit(1);\n }\n const agent = await resolve(domain);\n formatAgent(agent, json);\n break;\n }\n\n case 'list': {\n const domains = await listDomains();\n if (json) {\n console.log(JSON.stringify(domains, null, 2));\n } else {\n console.log(`\\n📋 Registered .aint domains (${domains.length}):\\n`);\n domains.forEach((d) => console.log(` • ${d}`));\n console.log();\n }\n break;\n }\n\n case 'lookup': {\n const cap = parsed.flags.cap as string | undefined;\n const minTrust = parsed.flags['min-trust']\n ? parseFloat(parsed.flags['min-trust'] as string)\n : undefined;\n const agents = await lookup({ capability: cap, minTrust });\n if (json) {\n console.log(JSON.stringify(agents, null, 2));\n } else {\n console.log(`\\n🔍 Found ${agents.length} agents:\\n`);\n agents.forEach((a) => {\n console.log(` • ${a.domain} (trust: ${a.trust_score})`);\n });\n console.log();\n }\n break;\n }\n\n case 'claim': {\n const subcmd = parsed.subcommand || 'help';\n const domain = parsed.positional[0];\n\n switch (subcmd) {\n case 'channels': {\n const channels = await claim.channels();\n if (json) {\n console.log(JSON.stringify(channels, null, 2));\n } else {\n console.log('\\n📢 Verification Channels:\\n');\n channels.channels.forEach((ch) => {\n console.log(` ${ch.icon} ${ch.name.padEnd(15)} +${Math.round(ch.trust_boost * 100)}% trust`);\n console.log(` ${ch.instructions}\\n`);\n });\n console.log('🚀 POWER USER: Verify on 3+ channels for bonus trust!\\n');\n }\n break;\n }\n\n case 'start': {\n if (!domain) {\n console.error('Usage: aint claim start <domain>');\n process.exit(1);\n }\n const result = await claim.start(domain, {\n agentName: parsed.flags.name as string,\n description: parsed.flags.description as string,\n });\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\n╔════════════════════════════════════════════════════════════╗\n 🎯 CLAIM STARTED: ${result.domain}\n╠════════════════════════════════════════════════════════════╣\n\n Verification Code:\n\n ${result.verification_code}\n\n Post this code on one of these platforms:\n\n${result.channels.map((ch) => ` ${ch.icon} ${ch.name} (${ch.trust_boost})`).join('\\n')}\n\n Then run:\n aint claim verify ${domain} --channel <channel> --url <proof_url>\n\n Expires in: ${result.expires_in}\n\n ${result.power_user_tip}\n╚════════════════════════════════════════════════════════════╝\n`);\n }\n break;\n }\n\n case 'verify': {\n if (!domain) {\n console.error('Usage: aint claim verify <domain> --channel <ch> --url <url>');\n process.exit(1);\n }\n const channel = parsed.flags.channel as string;\n const url = parsed.flags.url as string;\n if (!channel || !url) {\n console.error('Missing --channel or --url');\n process.exit(1);\n }\n const result = await claim.verify(domain, {\n channel: channel as any,\n proofUrl: url,\n });\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\n✅ VERIFIED via ${channel}!\n\n Domain: ${result.domain}\n Username: ${result.username}\n Channels: ${result.verified_channels}\n Trust Score: ${result.trust_score}\n ${result.power_user ? '🚀 POWER USER!' : ''}\n\n ${result.message}\n`);\n }\n break;\n }\n\n case 'complete': {\n if (!domain) {\n console.error('Usage: aint claim complete <domain>');\n process.exit(1);\n }\n const result = await claim.complete(domain);\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\n🎉 WELCOME TO AINTERNET!\n\n Domain: ${result.domain}\n Owner: ${result.owner}\n Trust: ${result.trust_score}\n Channels: ${result.verified_channels.join(', ')}\n ${result.power_user ? '🚀 POWER USER STATUS!' : ''}\n\n ${result.message}\n\n Resolve URL: ${result.resolve_url}\n`);\n }\n break;\n }\n\n case 'status': {\n if (!domain) {\n console.error('Usage: aint claim status <domain>');\n process.exit(1);\n }\n const result = await claim.status(domain);\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\n📊 Claim Status: ${result.domain}\n\n Status: ${result.status}\n Verified: ${result.verified_channels} channels\n Channels: ${result.channels.join(', ') || 'none yet'}\n Trust Score: ${result.trust_score}\n ${result.expires_at ? `Expires: ${result.expires_at}` : ''}\n ${result.verification_code ? `Code: ${result.verification_code}` : ''}\n`);\n }\n break;\n }\n\n default:\n console.log('Claim subcommands: start, verify, complete, status, channels');\n }\n break;\n }\n\n case 'send': {\n const to = parsed.positional[0];\n const message = parsed.positional.slice(1).join(' ');\n if (!to || !message) {\n console.error('Usage: aint send <to> <message>');\n process.exit(1);\n }\n const from = parsed.flags.from as string;\n if (!from) {\n console.error('Missing --from <your_agent>');\n process.exit(1);\n }\n configure({ agentDomain: from });\n const result = await ipoll.send(to, message);\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\n📤 Message sent!\n\n Poll ID: ${result.poll_id}\n From: ${result.from}\n To: ${result.to}\n ${result.message}\n`);\n }\n break;\n }\n\n case 'pull': {\n const agent = parsed.positional[0];\n if (!agent) {\n console.error('Usage: aint pull <agent>');\n process.exit(1);\n }\n const messages = await ipoll.pull(agent, {\n markRead: !!parsed.flags['mark-read'],\n });\n if (json) {\n console.log(JSON.stringify(messages, null, 2));\n } else {\n if (messages.length === 0) {\n console.log('\\n📭 No messages\\n');\n } else {\n console.log(`\\n📬 ${messages.length} message(s):\\n`);\n messages.forEach((m) => {\n console.log(` From: ${m.from_agent}`);\n console.log(` Type: ${m.poll_type}`);\n console.log(` Time: ${m.timestamp}`);\n console.log(` ${m.content}`);\n console.log();\n });\n }\n }\n break;\n }\n\n default:\n console.log(`Unknown command: ${parsed.command}`);\n console.log('Run \"aint help\" for usage information.');\n process.exit(1);\n }\n } catch (error: any) {\n if (!quiet) {\n console.error(`\\n❌ Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":";;;AAsCA,IAAM,iBAA4C;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AACf;AAEA,IAAI,eAA0C,EAAE,GAAG,eAAe;AAK3D,SAAS,UAAU,QAA+B;AACvD,iBAAe,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAChD;AA+FA,eAAe,QACb,QACA,MACA,MACY;AACZ,QAAM,MAAM,GAAG,aAAa,OAAO,GAAG,IAAI;AAE1C,QAAM,UAAuB;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,MAAM;AACR,YAAQ,OAAO,KAAK,UAAU,IAAI;AAAA,EACpC;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,aAAa,OAAO;AACzE,UAAQ,SAAS,WAAW;AAE5B,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AACzC,iBAAa,OAAO;AAEpB,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,wBAAwB,SAAS,MAAM,MAAM,KAAK,EAAE;AAAA,IACtE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB,SAAS,OAAO;AACd,iBAAa,OAAO;AACpB,UAAM;AAAA,EACR;AACF;AAgBA,eAAsB,QAAQ,QAAgC;AAC5D,QAAM,cAAc,OAAO,SAAS,OAAO,IAAI,SAAS,GAAG,MAAM;AACjE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,qBAAqB,WAAW;AAAA,EAClC;AAEA,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,IAAI,MAAM,qBAAqB,WAAW,EAAE;AAAA,EACpD;AAGA,SAAO;AAAA,IACL,GAAG,OAAO;AAAA,IACV,QAAQ,OAAO;AAAA,EACjB;AACF;AAKA,eAAsB,cAAiC;AACrD,QAAM,SAAS,MAAM,QAA8C,OAAO,gBAAgB;AAC1F,SAAO,OAAO,KAAK,OAAO,OAAO;AACnC;AAKA,eAAsB,OAAO,SAGR;AACnB,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAQ,WAAY,QAAO,IAAI,cAAc,QAAQ,UAAU;AACnE,MAAI,QAAQ,SAAU,QAAO,IAAI,aAAa,QAAQ,SAAS,SAAS,CAAC;AAEzE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,oBAAoB,MAAM;AAAA,EAC5B;AACA,SAAO,OAAO;AAChB;AAMO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,EAInB,MAAM,WAIH;AACD,WAAO,QAAQ,OAAO,0BAA0B;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,MACJ,QACA,SAKqB;AACrB,WAAO,QAAQ,QAAQ,yBAAyB;AAAA,MAC9C;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS;AAAA,MACtB,cAAc,SAAS,gBAAgB,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,OACJ,QACA,SAI4B;AAC5B,WAAO,QAAQ,QAAQ,0BAA0B;AAAA,MAC/C;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAA8C;AAC3D,WAAO,QAAQ,QAAQ,mCAAmC,MAAM,IAAI,CAAC,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAQV;AACD,WAAO,QAAQ,OAAO,0BAA0B,MAAM,EAAE;AAAA,EAC1D;AACF;AAMO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYnB,MAAM,KACJ,IACA,SACA,SAI0B;AAC1B,UAAM,OAAO,SAAS,QAAQ,aAAa;AAC3C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AAEA,WAAO,QAAQ,QAAQ,mBAAmB;AAAA,MACxC,YAAY,KAAK,QAAQ,SAAS,EAAE;AAAA,MACpC,UAAU,GAAG,QAAQ,SAAS,EAAE;AAAA,MAChC;AAAA,MACA,WAAW,SAAS,YAAY;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KACJ,OACA,SAGyB;AACzB,UAAM,aAAa,MAAM,QAAQ,SAAS,EAAE;AAC5C,UAAM,WAAW,SAAS,YAAY;AAEtC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,mBAAmB,UAAU,cAAc,QAAQ;AAAA,IACrD;AACA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAIH;AACD,WAAO,QAAQ,OAAO,mBAAmB;AAAA,EAC3C;AACF;;;AC7YA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaf,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4Cb,SAAS,UAAU,MAKjB;AACA,QAAM,SAAS;AAAA,IACb,SAAS,KAAK,CAAC,KAAK;AAAA,IACpB,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,OAAO,CAAC;AAAA,EACV;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,MAAM,IAAI,MAAM,CAAC;AACvB,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AAClC,eAAO,MAAM,GAAG,IAAI;AACpB,aAAK;AAAA,MACP,OAAO;AACL,eAAO,MAAM,GAAG,IAAI;AACpB;AAAA,MACF;AAAA,IACF,WAAW,CAAC,OAAO,cAAc,OAAO,YAAY,SAAS;AAC3D,aAAO,aAAa;AACpB;AAAA,IACF,OAAO;AACL,aAAO,WAAW,KAAK,GAAG;AAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAY,MAAqB;AACpD,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA;AAAA,IAEV,MAAM,MAAM;AAAA;AAAA,kBAEE,MAAM,KAAK;AAAA,kBACX,MAAM,KAAK;AAAA,kBACX,MAAM,WAAW,IAAI,cAAc,MAAM,WAAW,CAAC;AAAA,kBACrD,MAAM,MAAM;AAAA,kBACZ,MAAM,WAAW;AAAA,IAC/B,MAAM,cAAc,iBAAiB,MAAM,WAAW,KAAK,EAAE;AAAA,kBAC/C,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM;AAAA,IACtD,MAAM,UAAU,mBAAc,MAAM,YAAY,mBAAmB,UAAU,CAAC,eAAe,EAAE;AAAA,IAC/F,MAAM,YAAY,aAAa,yBAAkB,EAAE;AAAA;AAAA,CAEtD;AACD;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,SAAS,IAAK,QAAO;AACzB,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAEjC,MAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,UAAU;AACnE,YAAQ,IAAI,MAAM;AAClB,YAAQ,IAAI,IAAI;AAChB;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,OAAO,CAAC,CAAC,OAAO,MAAM;AAC5B,QAAM,QAAQ,CAAC,CAAC,OAAO,MAAM;AAG7B,MAAI,OAAO,MAAM,UAAU,GAAG;AAC5B,cAAU,EAAE,SAAS,OAAO,MAAM,UAAU,EAAY,CAAC;AAAA,EAC3D;AAEA,MAAI;AACF,YAAQ,OAAO,SAAS;AAAA,MACtB,KAAK,WAAW;AACd,cAAM,SAAS,OAAO,WAAW,CAAC;AAClC,YAAI,CAAC,QAAQ;AACX,kBAAQ,MAAM,8BAA8B;AAC5C,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,oBAAY,OAAO,IAAI;AACvB;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,UAAU,MAAM,YAAY;AAClC,YAAI,MAAM;AACR,kBAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,QAC9C,OAAO;AACL,kBAAQ,IAAI;AAAA,sCAAkC,QAAQ,MAAM;AAAA,CAAM;AAClE,kBAAQ,QAAQ,CAAC,MAAM,QAAQ,IAAI,YAAO,CAAC,EAAE,CAAC;AAC9C,kBAAQ,IAAI;AAAA,QACd;AACA;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,cAAM,MAAM,OAAO,MAAM;AACzB,cAAM,WAAW,OAAO,MAAM,WAAW,IACrC,WAAW,OAAO,MAAM,WAAW,CAAW,IAC9C;AACJ,cAAM,SAAS,MAAM,OAAO,EAAE,YAAY,KAAK,SAAS,CAAC;AACzD,YAAI,MAAM;AACR,kBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC7C,OAAO;AACL,kBAAQ,IAAI;AAAA,kBAAc,OAAO,MAAM;AAAA,CAAY;AACnD,iBAAO,QAAQ,CAAC,MAAM;AACpB,oBAAQ,IAAI,YAAO,EAAE,MAAM,YAAY,EAAE,WAAW,GAAG;AAAA,UACzD,CAAC;AACD,kBAAQ,IAAI;AAAA,QACd;AACA;AAAA,MACF;AAAA,MAEA,KAAK,SAAS;AACZ,cAAM,SAAS,OAAO,cAAc;AACpC,cAAM,SAAS,OAAO,WAAW,CAAC;AAElC,gBAAQ,QAAQ;AAAA,UACd,KAAK,YAAY;AACf,kBAAM,WAAW,MAAM,MAAM,SAAS;AACtC,gBAAI,MAAM;AACR,sBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,YAC/C,OAAO;AACL,sBAAQ,IAAI,sCAA+B;AAC3C,uBAAS,SAAS,QAAQ,CAAC,OAAO;AAChC,wBAAQ,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,cAAc,GAAG,CAAC,SAAS;AAC5F,wBAAQ,IAAI,QAAQ,GAAG,YAAY;AAAA,CAAI;AAAA,cACzC,CAAC;AACD,sBAAQ,IAAI,gEAAyD;AAAA,YACvE;AACA;AAAA,UACF;AAAA,UAEA,KAAK,SAAS;AACZ,gBAAI,CAAC,QAAQ;AACX,sBAAQ,MAAM,kCAAkC;AAChD,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,kBAAM,SAAS,MAAM,MAAM,MAAM,QAAQ;AAAA,cACvC,WAAW,OAAO,MAAM;AAAA,cACxB,aAAa,OAAO,MAAM;AAAA,YAC5B,CAAC;AACD,gBAAI,MAAM;AACR,sBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,YAC7C,OAAO;AACL,sBAAQ,IAAI;AAAA;AAAA,6BAEJ,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,MAK7B,OAAO,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI5B,OAAO,SAAS,IAAI,CAAC,OAAO,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,KAAK,GAAG,WAAW,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,wBAGjE,MAAM;AAAA;AAAA,gBAEd,OAAO,UAAU;AAAA;AAAA,IAE7B,OAAO,cAAc;AAAA;AAAA,CAExB;AAAA,YACW;AACA;AAAA,UACF;AAAA,UAEA,KAAK,UAAU;AACb,gBAAI,CAAC,QAAQ;AACX,sBAAQ,MAAM,8DAA8D;AAC5E,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,kBAAM,UAAU,OAAO,MAAM;AAC7B,kBAAM,MAAM,OAAO,MAAM;AACzB,gBAAI,CAAC,WAAW,CAAC,KAAK;AACpB,sBAAQ,MAAM,4BAA4B;AAC1C,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,kBAAM,SAAS,MAAM,MAAM,OAAO,QAAQ;AAAA,cACxC;AAAA,cACA,UAAU;AAAA,YACZ,CAAC;AACD,gBAAI,MAAM;AACR,sBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,YAC7C,OAAO;AACL,sBAAQ,IAAI;AAAA,sBACT,OAAO;AAAA;AAAA,sBAEF,OAAO,MAAM;AAAA,sBACb,OAAO,QAAQ;AAAA,sBACf,OAAO,iBAAiB;AAAA,sBACxB,OAAO,WAAW;AAAA,IACpC,OAAO,aAAa,0BAAmB,EAAE;AAAA;AAAA,IAEzC,OAAO,OAAO;AAAA,CACjB;AAAA,YACW;AACA;AAAA,UACF;AAAA,UAEA,KAAK,YAAY;AACf,gBAAI,CAAC,QAAQ;AACX,sBAAQ,MAAM,qCAAqC;AACnD,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,kBAAM,SAAS,MAAM,MAAM,SAAS,MAAM;AAC1C,gBAAI,MAAM;AACR,sBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,YAC7C,OAAO;AACL,sBAAQ,IAAI;AAAA;AAAA;AAAA,iBAGT,OAAO,MAAM;AAAA,iBACb,OAAO,KAAK;AAAA,iBACZ,OAAO,WAAW;AAAA,iBAClB,OAAO,kBAAkB,KAAK,IAAI,CAAC;AAAA,IAChD,OAAO,aAAa,iCAA0B,EAAE;AAAA;AAAA,IAEhD,OAAO,OAAO;AAAA;AAAA,iBAED,OAAO,WAAW;AAAA,CAClC;AAAA,YACW;AACA;AAAA,UACF;AAAA,UAEA,KAAK,UAAU;AACb,gBAAI,CAAC,QAAQ;AACX,sBAAQ,MAAM,mCAAmC;AACjD,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,kBAAM,SAAS,MAAM,MAAM,OAAO,MAAM;AACxC,gBAAI,MAAM;AACR,sBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,YAC7C,OAAO;AACL,sBAAQ,IAAI;AAAA,0BACP,OAAO,MAAM;AAAA;AAAA,sBAEV,OAAO,MAAM;AAAA,sBACb,OAAO,iBAAiB;AAAA,sBACxB,OAAO,SAAS,KAAK,IAAI,KAAK,UAAU;AAAA,sBACxC,OAAO,WAAW;AAAA,IACpC,OAAO,aAAa,qBAAqB,OAAO,UAAU,KAAK,EAAE;AAAA,IACjE,OAAO,oBAAoB,qBAAqB,OAAO,iBAAiB,KAAK,EAAE;AAAA,CAClF;AAAA,YACW;AACA;AAAA,UACF;AAAA,UAEA;AACE,oBAAQ,IAAI,8DAA8D;AAAA,QAC9E;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,KAAK,OAAO,WAAW,CAAC;AAC9B,cAAM,UAAU,OAAO,WAAW,MAAM,CAAC,EAAE,KAAK,GAAG;AACnD,YAAI,CAAC,MAAM,CAAC,SAAS;AACnB,kBAAQ,MAAM,iCAAiC;AAC/C,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,OAAO,OAAO,MAAM;AAC1B,YAAI,CAAC,MAAM;AACT,kBAAQ,MAAM,6BAA6B;AAC3C,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,kBAAU,EAAE,aAAa,KAAK,CAAC;AAC/B,cAAM,SAAS,MAAM,MAAM,KAAK,IAAI,OAAO;AAC3C,YAAI,MAAM;AACR,kBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC7C,OAAO;AACL,kBAAQ,IAAI;AAAA;AAAA;AAAA,cAGR,OAAO,OAAO;AAAA,cACd,OAAO,IAAI;AAAA,cACX,OAAO,EAAE;AAAA,IACnB,OAAO,OAAO;AAAA,CACjB;AAAA,QACO;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,QAAQ,OAAO,WAAW,CAAC;AACjC,YAAI,CAAC,OAAO;AACV,kBAAQ,MAAM,0BAA0B;AACxC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AAAA,UACvC,UAAU,CAAC,CAAC,OAAO,MAAM,WAAW;AAAA,QACtC,CAAC;AACD,YAAI,MAAM;AACR,kBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,QAC/C,OAAO;AACL,cAAI,SAAS,WAAW,GAAG;AACzB,oBAAQ,IAAI,2BAAoB;AAAA,UAClC,OAAO;AACL,oBAAQ,IAAI;AAAA,YAAQ,SAAS,MAAM;AAAA,CAAgB;AACnD,qBAAS,QAAQ,CAAC,MAAM;AACtB,sBAAQ,IAAI,WAAW,EAAE,UAAU,EAAE;AACrC,sBAAQ,IAAI,WAAW,EAAE,SAAS,EAAE;AACpC,sBAAQ,IAAI,WAAW,EAAE,SAAS,EAAE;AACpC,sBAAQ,IAAI,KAAK,EAAE,OAAO,EAAE;AAC5B,sBAAQ,IAAI;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA;AACE,gBAAQ,IAAI,oBAAoB,OAAO,OAAO,EAAE;AAChD,gBAAQ,IAAI,wCAAwC;AACpD,gBAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACF,SAAS,OAAY;AACnB,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM;AAAA,gBAAc,MAAM,OAAO;AAAA,CAAI;AAAA,IAC/C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":[]}