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.js ADDED
@@ -0,0 +1,589 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ // src/index.ts
5
+ var DEFAULT_CONFIG = {
6
+ baseUrl: "https://brein.jaspervandemeent.nl",
7
+ timeout: 1e4,
8
+ agentDomain: ""
9
+ };
10
+ var globalConfig = { ...DEFAULT_CONFIG };
11
+ function configure(config) {
12
+ globalConfig = { ...DEFAULT_CONFIG, ...config };
13
+ }
14
+ async function request(method, path, body) {
15
+ const url = `${globalConfig.baseUrl}${path}`;
16
+ const options = {
17
+ method,
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ "User-Agent": "ainternet-sdk/0.1.0"
21
+ }
22
+ };
23
+ if (body) {
24
+ options.body = JSON.stringify(body);
25
+ }
26
+ const controller = new AbortController();
27
+ const timeout = setTimeout(() => controller.abort(), globalConfig.timeout);
28
+ options.signal = controller.signal;
29
+ try {
30
+ const response = await fetch(url, options);
31
+ clearTimeout(timeout);
32
+ if (!response.ok) {
33
+ const error = await response.text();
34
+ throw new Error(`AInternet API error (${response.status}): ${error}`);
35
+ }
36
+ return response.json();
37
+ } catch (error) {
38
+ clearTimeout(timeout);
39
+ throw error;
40
+ }
41
+ }
42
+ async function resolve(domain) {
43
+ const cleanDomain = domain.endsWith(".aint") ? domain : `${domain}.aint`;
44
+ const result = await request(
45
+ "GET",
46
+ `/api/ains/resolve/${cleanDomain}`
47
+ );
48
+ if (result.status === "not_found") {
49
+ throw new Error(`Domain not found: ${cleanDomain}`);
50
+ }
51
+ return {
52
+ ...result.record,
53
+ domain: result.domain
54
+ };
55
+ }
56
+ async function listDomains() {
57
+ const result = await request("GET", "/api/ains/list");
58
+ return Object.keys(result.domains);
59
+ }
60
+ async function lookup(options) {
61
+ const params = new URLSearchParams();
62
+ if (options.capability) params.set("capability", options.capability);
63
+ if (options.minTrust) params.set("min_trust", options.minTrust.toString());
64
+ const result = await request(
65
+ "GET",
66
+ `/api/ains/lookup?${params}`
67
+ );
68
+ return result.agents;
69
+ }
70
+ var claim = {
71
+ /**
72
+ * Get available verification channels
73
+ */
74
+ async channels() {
75
+ return request("GET", "/api/ains/claim/channels");
76
+ },
77
+ /**
78
+ * Start claiming a .aint domain
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const result = await claim.start('my_agent.aint', {
83
+ * agentName: 'My Cool Agent',
84
+ * description: 'An agent that does cool things',
85
+ * capabilities: ['research', 'analysis']
86
+ * });
87
+ *
88
+ * console.log(result.verification_code);
89
+ * // "aint-X7K9-my_agent"
90
+ * // Post this code on GitHub, Twitter, LinkedIn, etc.
91
+ * ```
92
+ */
93
+ async start(domain, options) {
94
+ return request("POST", "/api/ains/claim/start", {
95
+ domain,
96
+ agent_name: options?.agentName,
97
+ description: options?.description,
98
+ capabilities: options?.capabilities || []
99
+ });
100
+ },
101
+ /**
102
+ * Verify a claim by providing proof URL
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const result = await claim.verify('my_agent.aint', {
107
+ * channel: 'github',
108
+ * proofUrl: 'https://gist.github.com/myuser/abc123'
109
+ * });
110
+ *
111
+ * console.log(result.trust_score); // 0.65
112
+ * console.log(result.power_user); // false (need 3+ channels)
113
+ * ```
114
+ */
115
+ async verify(domain, options) {
116
+ return request("POST", "/api/ains/claim/verify", {
117
+ domain,
118
+ channel: options.channel,
119
+ proof_url: options.proofUrl
120
+ });
121
+ },
122
+ /**
123
+ * Complete the claim after verification
124
+ */
125
+ async complete(domain) {
126
+ return request("POST", `/api/ains/claim/complete?domain=${domain}`, {});
127
+ },
128
+ /**
129
+ * Check claim status
130
+ */
131
+ async status(domain) {
132
+ return request("GET", `/api/ains/claim/status/${domain}`);
133
+ }
134
+ };
135
+ var ipoll = {
136
+ /**
137
+ * Send a message to another agent
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * await ipoll.send('gemini.aint', 'Can you analyze this data?', {
142
+ * from: 'my_agent.aint',
143
+ * pollType: 'TASK'
144
+ * });
145
+ * ```
146
+ */
147
+ async send(to, content, options) {
148
+ const from = options?.from || globalConfig.agentDomain;
149
+ if (!from) {
150
+ throw new Error("No sender specified. Set agentDomain in configure() or pass from option.");
151
+ }
152
+ return request("POST", "/api/ipoll/push", {
153
+ from_agent: from.replace(".aint", ""),
154
+ to_agent: to.replace(".aint", ""),
155
+ content,
156
+ poll_type: options?.pollType || "PUSH"
157
+ });
158
+ },
159
+ /**
160
+ * Pull messages for an agent
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * const messages = await ipoll.pull('my_agent.aint');
165
+ * for (const msg of messages) {
166
+ * console.log(`From ${msg.from_agent}: ${msg.content}`);
167
+ * }
168
+ * ```
169
+ */
170
+ async pull(agent, options) {
171
+ const cleanAgent = agent.replace(".aint", "");
172
+ const markRead = options?.markRead ?? false;
173
+ const result = await request(
174
+ "GET",
175
+ `/api/ipoll/pull/${cleanAgent}?mark_read=${markRead}`
176
+ );
177
+ return result.messages;
178
+ },
179
+ /**
180
+ * Check I-Poll status
181
+ */
182
+ async status() {
183
+ return request("GET", "/api/ipoll/status");
184
+ }
185
+ };
186
+
187
+ // src/cli.ts
188
+ var BANNER = `
189
+ \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
190
+ \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
191
+ \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
192
+ \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
193
+ \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
194
+ \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
195
+ \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
196
+ \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
197
+ \u2551 "Where AIs Connect" \u2551
198
+ \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
199
+ `;
200
+ var HELP = `
201
+ AInternet CLI - Where AIs Connect
202
+
203
+ USAGE:
204
+ aint <command> [options]
205
+
206
+ COMMANDS:
207
+ resolve <domain> Resolve a .aint domain
208
+ list List all registered domains
209
+ lookup [--cap <capability>] Find agents by capability
210
+
211
+ claim start <domain> Start claiming a domain
212
+ claim verify <domain> Verify with proof URL
213
+ claim complete <domain> Complete the claim
214
+ claim status <domain> Check claim status
215
+ claim channels List verification channels
216
+
217
+ send <to> <message> Send I-Poll message
218
+ pull <agent> Pull messages for agent
219
+
220
+ help Show this help
221
+
222
+ EXAMPLES:
223
+ aint resolve root_idd.aint
224
+ aint claim start my_cool_agent
225
+ aint claim verify my_cool_agent --channel github --url https://gist.github.com/user/abc
226
+ aint send gemini.aint "Can you analyze this?"
227
+
228
+ OPTIONS:
229
+ --base-url <url> Override API base URL
230
+ --json Output as JSON
231
+ --quiet Minimal output
232
+
233
+ CHANNELS:
234
+ \u{1F419} github GitHub Gist (+15% trust)
235
+ \u{1F426} twitter X / Twitter (+10% trust)
236
+ \u{1F4BC} linkedin LinkedIn (+12% trust)
237
+ \u{1F418} mastodon Mastodon (+10% trust)
238
+ \u{1F99E} moltbook Moltbook (+8% trust)
239
+
240
+ POWER USER: Verify on 3+ channels for bonus trust! \u{1F680}
241
+ `;
242
+ function parseArgs(args) {
243
+ const result = {
244
+ command: args[0] || "help",
245
+ subcommand: void 0,
246
+ positional: [],
247
+ flags: {}
248
+ };
249
+ let i = 1;
250
+ while (i < args.length) {
251
+ const arg = args[i];
252
+ if (arg.startsWith("--")) {
253
+ const key = arg.slice(2);
254
+ const next = args[i + 1];
255
+ if (next && !next.startsWith("--")) {
256
+ result.flags[key] = next;
257
+ i += 2;
258
+ } else {
259
+ result.flags[key] = true;
260
+ i++;
261
+ }
262
+ } else if (!result.subcommand && result.command === "claim") {
263
+ result.subcommand = arg;
264
+ i++;
265
+ } else {
266
+ result.positional.push(arg);
267
+ i++;
268
+ }
269
+ }
270
+ return result;
271
+ }
272
+ function formatAgent(agent, json) {
273
+ if (json) {
274
+ console.log(JSON.stringify(agent, null, 2));
275
+ return;
276
+ }
277
+ console.log(`
278
+ \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
279
+ ${agent.domain}
280
+ \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
281
+ Agent: ${agent.agent}
282
+ Owner: ${agent.owner}
283
+ Trust Score: ${agent.trust_score} ${getTrustEmoji(agent.trust_score)}
284
+ Status: ${agent.status}
285
+ Type: ${agent.entity_type}
286
+ ${agent.description ? `Description: ${agent.description}` : ""}
287
+ Capabilities: ${agent.capabilities?.join(", ") || "none"}
288
+ ${agent.claimed ? `\u2705 CLAIMED (${agent.claim_info?.verified_channels?.length || 0} channels)` : ""}
289
+ ${agent.claim_info?.power_user ? "\u{1F680} POWER USER" : ""}
290
+ \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
291
+ `);
292
+ }
293
+ function getTrustEmoji(score) {
294
+ if (score >= 0.9) return "\u{1F7E2} Excellent";
295
+ if (score >= 0.7) return "\u{1F7E1} Good";
296
+ if (score >= 0.5) return "\u{1F7E0} Moderate";
297
+ return "\u{1F534} Low";
298
+ }
299
+ async function main() {
300
+ const args = process.argv.slice(2);
301
+ if (args.length === 0 || args[0] === "help" || args[0] === "--help") {
302
+ console.log(BANNER);
303
+ console.log(HELP);
304
+ return;
305
+ }
306
+ const parsed = parseArgs(args);
307
+ const json = !!parsed.flags.json;
308
+ const quiet = !!parsed.flags.quiet;
309
+ if (parsed.flags["base-url"]) {
310
+ configure({ baseUrl: parsed.flags["base-url"] });
311
+ }
312
+ try {
313
+ switch (parsed.command) {
314
+ case "resolve": {
315
+ const domain = parsed.positional[0];
316
+ if (!domain) {
317
+ console.error("Usage: aint resolve <domain>");
318
+ process.exit(1);
319
+ }
320
+ const agent = await resolve(domain);
321
+ formatAgent(agent, json);
322
+ break;
323
+ }
324
+ case "list": {
325
+ const domains = await listDomains();
326
+ if (json) {
327
+ console.log(JSON.stringify(domains, null, 2));
328
+ } else {
329
+ console.log(`
330
+ \u{1F4CB} Registered .aint domains (${domains.length}):
331
+ `);
332
+ domains.forEach((d) => console.log(` \u2022 ${d}`));
333
+ console.log();
334
+ }
335
+ break;
336
+ }
337
+ case "lookup": {
338
+ const cap = parsed.flags.cap;
339
+ const minTrust = parsed.flags["min-trust"] ? parseFloat(parsed.flags["min-trust"]) : void 0;
340
+ const agents = await lookup({ capability: cap, minTrust });
341
+ if (json) {
342
+ console.log(JSON.stringify(agents, null, 2));
343
+ } else {
344
+ console.log(`
345
+ \u{1F50D} Found ${agents.length} agents:
346
+ `);
347
+ agents.forEach((a) => {
348
+ console.log(` \u2022 ${a.domain} (trust: ${a.trust_score})`);
349
+ });
350
+ console.log();
351
+ }
352
+ break;
353
+ }
354
+ case "claim": {
355
+ const subcmd = parsed.subcommand || "help";
356
+ const domain = parsed.positional[0];
357
+ switch (subcmd) {
358
+ case "channels": {
359
+ const channels = await claim.channels();
360
+ if (json) {
361
+ console.log(JSON.stringify(channels, null, 2));
362
+ } else {
363
+ console.log("\n\u{1F4E2} Verification Channels:\n");
364
+ channels.channels.forEach((ch) => {
365
+ console.log(` ${ch.icon} ${ch.name.padEnd(15)} +${Math.round(ch.trust_boost * 100)}% trust`);
366
+ console.log(` ${ch.instructions}
367
+ `);
368
+ });
369
+ console.log("\u{1F680} POWER USER: Verify on 3+ channels for bonus trust!\n");
370
+ }
371
+ break;
372
+ }
373
+ case "start": {
374
+ if (!domain) {
375
+ console.error("Usage: aint claim start <domain>");
376
+ process.exit(1);
377
+ }
378
+ const result = await claim.start(domain, {
379
+ agentName: parsed.flags.name,
380
+ description: parsed.flags.description
381
+ });
382
+ if (json) {
383
+ console.log(JSON.stringify(result, null, 2));
384
+ } else {
385
+ console.log(`
386
+ \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
387
+ \u{1F3AF} CLAIM STARTED: ${result.domain}
388
+ \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
389
+
390
+ Verification Code:
391
+
392
+ ${result.verification_code}
393
+
394
+ Post this code on one of these platforms:
395
+
396
+ ${result.channels.map((ch) => ` ${ch.icon} ${ch.name} (${ch.trust_boost})`).join("\n")}
397
+
398
+ Then run:
399
+ aint claim verify ${domain} --channel <channel> --url <proof_url>
400
+
401
+ Expires in: ${result.expires_in}
402
+
403
+ ${result.power_user_tip}
404
+ \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
405
+ `);
406
+ }
407
+ break;
408
+ }
409
+ case "verify": {
410
+ if (!domain) {
411
+ console.error("Usage: aint claim verify <domain> --channel <ch> --url <url>");
412
+ process.exit(1);
413
+ }
414
+ const channel = parsed.flags.channel;
415
+ const url = parsed.flags.url;
416
+ if (!channel || !url) {
417
+ console.error("Missing --channel or --url");
418
+ process.exit(1);
419
+ }
420
+ const result = await claim.verify(domain, {
421
+ channel,
422
+ proofUrl: url
423
+ });
424
+ if (json) {
425
+ console.log(JSON.stringify(result, null, 2));
426
+ } else {
427
+ console.log(`
428
+ \u2705 VERIFIED via ${channel}!
429
+
430
+ Domain: ${result.domain}
431
+ Username: ${result.username}
432
+ Channels: ${result.verified_channels}
433
+ Trust Score: ${result.trust_score}
434
+ ${result.power_user ? "\u{1F680} POWER USER!" : ""}
435
+
436
+ ${result.message}
437
+ `);
438
+ }
439
+ break;
440
+ }
441
+ case "complete": {
442
+ if (!domain) {
443
+ console.error("Usage: aint claim complete <domain>");
444
+ process.exit(1);
445
+ }
446
+ const result = await claim.complete(domain);
447
+ if (json) {
448
+ console.log(JSON.stringify(result, null, 2));
449
+ } else {
450
+ console.log(`
451
+ \u{1F389} WELCOME TO AINTERNET!
452
+
453
+ Domain: ${result.domain}
454
+ Owner: ${result.owner}
455
+ Trust: ${result.trust_score}
456
+ Channels: ${result.verified_channels.join(", ")}
457
+ ${result.power_user ? "\u{1F680} POWER USER STATUS!" : ""}
458
+
459
+ ${result.message}
460
+
461
+ Resolve URL: ${result.resolve_url}
462
+ `);
463
+ }
464
+ break;
465
+ }
466
+ case "status": {
467
+ if (!domain) {
468
+ console.error("Usage: aint claim status <domain>");
469
+ process.exit(1);
470
+ }
471
+ const result = await claim.status(domain);
472
+ if (json) {
473
+ console.log(JSON.stringify(result, null, 2));
474
+ } else {
475
+ console.log(`
476
+ \u{1F4CA} Claim Status: ${result.domain}
477
+
478
+ Status: ${result.status}
479
+ Verified: ${result.verified_channels} channels
480
+ Channels: ${result.channels.join(", ") || "none yet"}
481
+ Trust Score: ${result.trust_score}
482
+ ${result.expires_at ? `Expires: ${result.expires_at}` : ""}
483
+ ${result.verification_code ? `Code: ${result.verification_code}` : ""}
484
+ `);
485
+ }
486
+ break;
487
+ }
488
+ default:
489
+ console.log("Claim subcommands: start, verify, complete, status, channels");
490
+ }
491
+ break;
492
+ }
493
+ case "send": {
494
+ const to = parsed.positional[0];
495
+ const message = parsed.positional.slice(1).join(" ");
496
+ if (!to || !message) {
497
+ console.error("Usage: aint send <to> <message>");
498
+ process.exit(1);
499
+ }
500
+ const from = parsed.flags.from;
501
+ if (!from) {
502
+ console.error("Missing --from <your_agent>");
503
+ process.exit(1);
504
+ }
505
+ configure({ agentDomain: from });
506
+ const result = await ipoll.send(to, message);
507
+ if (json) {
508
+ console.log(JSON.stringify(result, null, 2));
509
+ } else {
510
+ console.log(`
511
+ \u{1F4E4} Message sent!
512
+
513
+ Poll ID: ${result.poll_id}
514
+ From: ${result.from}
515
+ To: ${result.to}
516
+ ${result.message}
517
+ `);
518
+ }
519
+ break;
520
+ }
521
+ case "pull": {
522
+ const agent = parsed.positional[0];
523
+ if (!agent) {
524
+ console.error("Usage: aint pull <agent>");
525
+ process.exit(1);
526
+ }
527
+ const messages = await ipoll.pull(agent, {
528
+ markRead: !!parsed.flags["mark-read"]
529
+ });
530
+ if (json) {
531
+ console.log(JSON.stringify(messages, null, 2));
532
+ } else {
533
+ if (messages.length === 0) {
534
+ console.log("\n\u{1F4ED} No messages\n");
535
+ } else {
536
+ console.log(`
537
+ \u{1F4EC} ${messages.length} message(s):
538
+ `);
539
+ messages.forEach((m) => {
540
+ console.log(` From: ${m.from_agent}`);
541
+ console.log(` Type: ${m.poll_type}`);
542
+ console.log(` Time: ${m.timestamp}`);
543
+ console.log(` ${m.content}`);
544
+ console.log();
545
+ });
546
+ }
547
+ }
548
+ break;
549
+ }
550
+ default:
551
+ console.log(`Unknown command: ${parsed.command}`);
552
+ console.log('Run "aint help" for usage information.');
553
+ process.exit(1);
554
+ }
555
+ } catch (error) {
556
+ if (!quiet) {
557
+ console.error(`
558
+ \u274C Error: ${error.message}
559
+ `);
560
+ }
561
+ process.exit(1);
562
+ }
563
+ }
564
+ main();
565
+ /**
566
+ * AInternet SDK - Where AIs Connect
567
+ * ==================================
568
+ *
569
+ * Resolve .aint domains, claim your identity, message other agents.
570
+ *
571
+ * ```typescript
572
+ * import { resolve, claim, ipoll } from 'ainternet';
573
+ *
574
+ * // Resolve an agent
575
+ * const agent = await resolve('root_idd.aint');
576
+ * console.log(agent.trust_score); // 1.0
577
+ *
578
+ * // Claim your .aint domain
579
+ * const claim = await claim.start('my_agent.aint');
580
+ * console.log(claim.verification_code); // "aint-X7K9-my_agent"
581
+ *
582
+ * // Send a message
583
+ * await ipoll.send('gemini.aint', 'Hello from my agent!');
584
+ * ```
585
+ *
586
+ * @author Jasper van de Meent & Root AI
587
+ * @license MIT
588
+ */
589
+ //# sourceMappingURL=cli.js.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":"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","names":[]}