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/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +589 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +588 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +351 -0
- package/dist/index.d.ts +351 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +224 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +82 -0
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
|
package/dist/cli.mjs.map
ADDED
|
@@ -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":[]}
|