@entitai/aieos 1.2.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 +352 -0
- package/README.md +132 -0
- package/dist/cjs/cli.cjs +439 -0
- package/dist/cjs/cli.cjs.map +1 -0
- package/dist/cjs/cli.d.cts +12 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/client.cjs +65 -0
- package/dist/cjs/client.cjs.map +1 -0
- package/dist/cjs/client.d.cts +82 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/crypto.cjs +97 -0
- package/dist/cjs/crypto.cjs.map +1 -0
- package/dist/cjs/crypto.d.cts +27 -0
- package/dist/cjs/crypto.d.ts.map +1 -0
- package/dist/cjs/index.cjs +17 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/esm/cli.d.ts +12 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +404 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/client.d.ts +82 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +60 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/crypto.d.ts +27 -0
- package/dist/esm/crypto.d.ts.map +1 -0
- package/dist/esm/crypto.js +92 -0
- package/dist/esm/crypto.js.map +1 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +66 -0
- package/schema/v1/aieos.schema.json +255 -0
- package/schema/v1.1/aieos.schema.json +282 -0
- package/schema/v1.2/aieos.schema.json +316 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateKeypair = generateKeypair;
|
|
4
|
+
exports.signProfile = signProfile;
|
|
5
|
+
exports.verifyProfile = verifyProfile;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
/**
|
|
8
|
+
* Generate a new Ed25519 keypair.
|
|
9
|
+
* Returns raw keys as lowercase hex strings.
|
|
10
|
+
* Public key: 32 bytes = 64 hex chars.
|
|
11
|
+
* Private key: 32-byte seed = 64 hex chars (NOT the full 64-byte expanded key).
|
|
12
|
+
*/
|
|
13
|
+
function generateKeypair() {
|
|
14
|
+
const { publicKey, privateKey } = (0, node_crypto_1.generateKeyPairSync)('ed25519', {
|
|
15
|
+
publicKeyEncoding: { type: 'spki', format: 'der' },
|
|
16
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'der' },
|
|
17
|
+
});
|
|
18
|
+
// SPKI DER for Ed25519: 12-byte header + 32-byte public key
|
|
19
|
+
const rawPublicKey = publicKey.subarray(12);
|
|
20
|
+
// PKCS8 DER for Ed25519: 16-byte header + 32-byte seed
|
|
21
|
+
const rawPrivateKey = privateKey.subarray(16);
|
|
22
|
+
return {
|
|
23
|
+
publicKey: rawPublicKey.toString('hex'),
|
|
24
|
+
privateKey: rawPrivateKey.toString('hex'),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Sign an AIEOS profile.
|
|
29
|
+
*
|
|
30
|
+
* Signing input: RFC 8785 canonical JSON where metadata is reduced to
|
|
31
|
+
* ONLY { public_key } — all other metadata fields are stripped before signing
|
|
32
|
+
* (they are server-assigned and not client-authenticated).
|
|
33
|
+
*
|
|
34
|
+
* Returns the 128-char hex Ed25519 signature.
|
|
35
|
+
*/
|
|
36
|
+
function signProfile(profile, privateKeyHex) {
|
|
37
|
+
const canonical = buildSignInput(profile);
|
|
38
|
+
const seed = Buffer.from(privateKeyHex, 'hex');
|
|
39
|
+
if (seed.byteLength !== 32) {
|
|
40
|
+
throw new Error('privateKey must be 64 hex chars (32-byte seed)');
|
|
41
|
+
}
|
|
42
|
+
// Reconstruct PKCS8 DER from seed
|
|
43
|
+
const pkcs8Header = Buffer.from('302e020100300506032b657004220420', 'hex');
|
|
44
|
+
const pkcs8Der = Buffer.concat([pkcs8Header, seed]);
|
|
45
|
+
const keyObject = (0, node_crypto_1.createPrivateKey)({ key: pkcs8Der, format: 'der', type: 'pkcs8' });
|
|
46
|
+
// Ed25519 uses its own internal hash — pass null as algorithm
|
|
47
|
+
return (0, node_crypto_1.sign)(null, Buffer.from(canonical), keyObject).toString('hex');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Verify the Ed25519 signature on an AIEOS profile.
|
|
51
|
+
* Returns true if the signature is valid.
|
|
52
|
+
*/
|
|
53
|
+
function verifyProfile(profile) {
|
|
54
|
+
try {
|
|
55
|
+
const meta = profile.metadata;
|
|
56
|
+
if (!meta?.signature || !meta?.public_key)
|
|
57
|
+
return false;
|
|
58
|
+
const publicKeyHex = meta.public_key;
|
|
59
|
+
const signatureHex = meta.signature;
|
|
60
|
+
const canonical = buildSignInput(profile);
|
|
61
|
+
// Reconstruct SPKI DER from raw 32-byte public key
|
|
62
|
+
const rawPubKey = Buffer.from(publicKeyHex, 'hex');
|
|
63
|
+
const spkiHeader = Buffer.from('302a300506032b6570032100', 'hex');
|
|
64
|
+
const spkiDer = Buffer.concat([spkiHeader, rawPubKey]);
|
|
65
|
+
const keyObject = (0, node_crypto_1.createPublicKey)({ key: spkiDer, format: 'der', type: 'spki' });
|
|
66
|
+
return (0, node_crypto_1.verify)(null, Buffer.from(canonical), keyObject, Buffer.from(signatureHex, 'hex'));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build the canonical signing input.
|
|
74
|
+
* Metadata is reduced to ONLY { public_key } before canonicalization —
|
|
75
|
+
* all other metadata fields are server-assigned and excluded from signing.
|
|
76
|
+
*/
|
|
77
|
+
function buildSignInput(profile) {
|
|
78
|
+
const copy = JSON.parse(JSON.stringify(profile));
|
|
79
|
+
const meta = copy.metadata;
|
|
80
|
+
copy.metadata = { public_key: meta?.public_key ?? '' };
|
|
81
|
+
return canonicalize(copy);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Minimal RFC 8785 (JCS) canonical JSON serialization.
|
|
85
|
+
* Sufficient for AIEOS profiles (strings, integers, booleans, objects, arrays).
|
|
86
|
+
*/
|
|
87
|
+
function canonicalize(data) {
|
|
88
|
+
if (data === null || typeof data !== 'object') {
|
|
89
|
+
return JSON.stringify(data) ?? 'null';
|
|
90
|
+
}
|
|
91
|
+
if (Array.isArray(data)) {
|
|
92
|
+
return '[' + data.map(canonicalize).join(',') + ']';
|
|
93
|
+
}
|
|
94
|
+
const keys = Object.keys(data).sort();
|
|
95
|
+
return '{' + keys.map((k) => JSON.stringify(k) + ':' + canonicalize(data[k])).join(',') + '}';
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Keypair {
|
|
2
|
+
publicKey: string;
|
|
3
|
+
privateKey: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Generate a new Ed25519 keypair.
|
|
7
|
+
* Returns raw keys as lowercase hex strings.
|
|
8
|
+
* Public key: 32 bytes = 64 hex chars.
|
|
9
|
+
* Private key: 32-byte seed = 64 hex chars (NOT the full 64-byte expanded key).
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateKeypair(): Keypair;
|
|
12
|
+
/**
|
|
13
|
+
* Sign an AIEOS profile.
|
|
14
|
+
*
|
|
15
|
+
* Signing input: RFC 8785 canonical JSON where metadata is reduced to
|
|
16
|
+
* ONLY { public_key } — all other metadata fields are stripped before signing
|
|
17
|
+
* (they are server-assigned and not client-authenticated).
|
|
18
|
+
*
|
|
19
|
+
* Returns the 128-char hex Ed25519 signature.
|
|
20
|
+
*/
|
|
21
|
+
export declare function signProfile(profile: Record<string, unknown>, privateKeyHex: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Verify the Ed25519 signature on an AIEOS profile.
|
|
24
|
+
* Returns true if the signature is valid.
|
|
25
|
+
*/
|
|
26
|
+
export declare function verifyProfile(profile: Record<string, unknown>): boolean;
|
|
27
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAezC;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,aAAa,EAAE,MAAM,GACpB,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAyBvE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* aieos — Official SDK for the AIEOS identity registry.
|
|
4
|
+
*
|
|
5
|
+
* Library exports for programmatic use.
|
|
6
|
+
* For CLI use, run: npx aieos register
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AieosApiError = exports.AieosClient = exports.verifyProfile = exports.signProfile = exports.generateKeypair = void 0;
|
|
10
|
+
var crypto_js_1 = require("./crypto.cjs");
|
|
11
|
+
Object.defineProperty(exports, "generateKeypair", { enumerable: true, get: function () { return crypto_js_1.generateKeypair; } });
|
|
12
|
+
Object.defineProperty(exports, "signProfile", { enumerable: true, get: function () { return crypto_js_1.signProfile; } });
|
|
13
|
+
Object.defineProperty(exports, "verifyProfile", { enumerable: true, get: function () { return crypto_js_1.verifyProfile; } });
|
|
14
|
+
var client_js_1 = require("./client.cjs");
|
|
15
|
+
Object.defineProperty(exports, "AieosClient", { enumerable: true, get: function () { return client_js_1.AieosClient; } });
|
|
16
|
+
Object.defineProperty(exports, "AieosApiError", { enumerable: true, get: function () { return client_js_1.AieosApiError; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAA0E;AAAjE,4GAAA,eAAe,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,0GAAA,aAAa,OAAA;AAGpD,yCAAyD;AAAhD,wGAAA,WAAW,OAAA;AAAE,0GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aieos — Official SDK for the AIEOS identity registry.
|
|
3
|
+
*
|
|
4
|
+
* Library exports for programmatic use.
|
|
5
|
+
* For CLI use, run: npx aieos register
|
|
6
|
+
*/
|
|
7
|
+
export { generateKeypair, signProfile, verifyProfile } from './crypto.js';
|
|
8
|
+
export type { Keypair } from './crypto.js';
|
|
9
|
+
export { AieosClient, AieosApiError } from './client.js';
|
|
10
|
+
export type { ClientOptions, RegisterPayload, RegisterResult, UpdatePayload, ApiError, } from './client.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,GACT,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* aieos CLI — interactive wizard for registering and managing AIEOS agent profiles.
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx aieos register
|
|
6
|
+
* npx aieos update
|
|
7
|
+
* npx aieos lookup <identifier>
|
|
8
|
+
* npx aieos keygen
|
|
9
|
+
* npx aieos verify <entity-id-or-alias>
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/esm/cli.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* aieos CLI — interactive wizard for registering and managing AIEOS agent profiles.
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx aieos register
|
|
6
|
+
* npx aieos update
|
|
7
|
+
* npx aieos lookup <identifier>
|
|
8
|
+
* npx aieos keygen
|
|
9
|
+
* npx aieos verify <entity-id-or-alias>
|
|
10
|
+
*/
|
|
11
|
+
import * as p from '@clack/prompts';
|
|
12
|
+
import { writeFileSync, readFileSync, existsSync } from 'node:fs';
|
|
13
|
+
import { resolve } from 'node:path';
|
|
14
|
+
import { generateKeypair, signProfile, verifyProfile } from './crypto.js';
|
|
15
|
+
import { AieosClient, AieosApiError } from './client.js';
|
|
16
|
+
const VERSION = '1.2.0';
|
|
17
|
+
const SCHEMA_VERSION = '1.2';
|
|
18
|
+
const DEFAULT_BASE_URL = 'https://api.aieos.org';
|
|
19
|
+
const cmd = process.argv[2];
|
|
20
|
+
async function main() {
|
|
21
|
+
switch (cmd) {
|
|
22
|
+
case 'register': return cmdRegister();
|
|
23
|
+
case 'update': return cmdUpdate();
|
|
24
|
+
case 'lookup': return cmdLookup();
|
|
25
|
+
case 'keygen': return cmdKeygen();
|
|
26
|
+
case 'verify': return cmdVerify();
|
|
27
|
+
default: return cmdHelp();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ─── register ────────────────────────────────────────────────────────────────
|
|
31
|
+
async function cmdRegister() {
|
|
32
|
+
p.intro(` aieos register (v${VERSION})`);
|
|
33
|
+
p.note('This wizard will generate an Ed25519 keypair and register\n' +
|
|
34
|
+
'your AI agent identity on the AIEOS network.\n\n' +
|
|
35
|
+
'Your private key stays on your machine. Never share it.', 'Welcome');
|
|
36
|
+
const baseUrl = resolveBaseUrl();
|
|
37
|
+
const client = new AieosClient({ baseUrl });
|
|
38
|
+
// ── Identity ────────────────────────────────────────────────────────────────
|
|
39
|
+
const agentNameRaw = await p.text({
|
|
40
|
+
message: 'Agent name',
|
|
41
|
+
placeholder: 'e.g. Aria, EchoBot, ResearchAgent-7',
|
|
42
|
+
validate: (v) => (v.trim().length < 1 ? 'Name is required.' : undefined),
|
|
43
|
+
});
|
|
44
|
+
if (p.isCancel(agentNameRaw))
|
|
45
|
+
return cancelled();
|
|
46
|
+
const agentName = agentNameRaw.trim();
|
|
47
|
+
const agentTypeRaw = await p.select({
|
|
48
|
+
message: 'Agent type',
|
|
49
|
+
options: [
|
|
50
|
+
{ value: 'AI Assistant', label: 'AI Assistant' },
|
|
51
|
+
{ value: 'Research Agent', label: 'Research Agent' },
|
|
52
|
+
{ value: 'Coding Agent', label: 'Coding Agent' },
|
|
53
|
+
{ value: 'Data Agent', label: 'Data Agent' },
|
|
54
|
+
{ value: 'Creative Agent', label: 'Creative Agent' },
|
|
55
|
+
{ value: 'Autonomous Agent', label: 'Autonomous Agent' },
|
|
56
|
+
{ value: 'Custom', label: 'Custom (I\'ll type it)' },
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
if (p.isCancel(agentTypeRaw))
|
|
60
|
+
return cancelled();
|
|
61
|
+
let agentType = agentTypeRaw;
|
|
62
|
+
if (agentType === 'Custom') {
|
|
63
|
+
const custom = await p.text({
|
|
64
|
+
message: 'Describe your agent type',
|
|
65
|
+
placeholder: 'e.g. Medical Diagnosis Assistant',
|
|
66
|
+
});
|
|
67
|
+
if (p.isCancel(custom))
|
|
68
|
+
return cancelled();
|
|
69
|
+
agentType = custom.trim();
|
|
70
|
+
}
|
|
71
|
+
const descRaw = await p.text({
|
|
72
|
+
message: 'Short description (optional)',
|
|
73
|
+
placeholder: 'What does your agent do?',
|
|
74
|
+
});
|
|
75
|
+
if (p.isCancel(descRaw))
|
|
76
|
+
return cancelled();
|
|
77
|
+
const description = descRaw ? descRaw.trim() : '';
|
|
78
|
+
// ── Alias ───────────────────────────────────────────────────────────────────
|
|
79
|
+
const wantAlias = await p.confirm({
|
|
80
|
+
message: 'Claim a custom alias? (e.g. @aria) Requires a small USDC payment.',
|
|
81
|
+
initialValue: false,
|
|
82
|
+
});
|
|
83
|
+
if (p.isCancel(wantAlias))
|
|
84
|
+
return cancelled();
|
|
85
|
+
let alias;
|
|
86
|
+
if (wantAlias) {
|
|
87
|
+
const aliasRaw = await p.text({
|
|
88
|
+
message: 'Desired alias (letters, numbers, underscore — max 32 chars)',
|
|
89
|
+
placeholder: 'aria',
|
|
90
|
+
validate: (v) => {
|
|
91
|
+
const t = v.trim();
|
|
92
|
+
if (t.length < 1 || t.length > 32)
|
|
93
|
+
return 'Must be 1–32 characters.';
|
|
94
|
+
if (!/^[a-zA-Z0-9_]+$/.test(t))
|
|
95
|
+
return 'Letters, numbers, and underscore only.';
|
|
96
|
+
return undefined;
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
if (p.isCancel(aliasRaw))
|
|
100
|
+
return cancelled();
|
|
101
|
+
alias = aliasRaw.trim();
|
|
102
|
+
}
|
|
103
|
+
// ── Contact email (optional, private) ─────────────────────────────────────
|
|
104
|
+
const emailRaw = await p.text({
|
|
105
|
+
message: 'Contact email (optional — stored privately for AIEOS updates, never public)',
|
|
106
|
+
placeholder: 'you@example.com',
|
|
107
|
+
validate: (v) => {
|
|
108
|
+
if (!v || v.trim() === '')
|
|
109
|
+
return undefined;
|
|
110
|
+
if (!v.includes('@'))
|
|
111
|
+
return 'Enter a valid email address.';
|
|
112
|
+
return undefined;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
if (p.isCancel(emailRaw))
|
|
116
|
+
return cancelled();
|
|
117
|
+
const email = emailRaw ? emailRaw.trim() || undefined : undefined;
|
|
118
|
+
// ── Keypair ─────────────────────────────────────────────────────────────────
|
|
119
|
+
const spin = p.spinner();
|
|
120
|
+
spin.start('Generating Ed25519 keypair…');
|
|
121
|
+
const keypair = generateKeypair();
|
|
122
|
+
spin.stop('Keypair generated.');
|
|
123
|
+
// ── Build profile ───────────────────────────────────────────────────────────
|
|
124
|
+
const metadata = {
|
|
125
|
+
public_key: keypair.publicKey,
|
|
126
|
+
signature: '',
|
|
127
|
+
...(alias && { alias }),
|
|
128
|
+
};
|
|
129
|
+
const identity = {
|
|
130
|
+
names: [agentName],
|
|
131
|
+
agent_type: agentType,
|
|
132
|
+
...(description && { description }),
|
|
133
|
+
};
|
|
134
|
+
const profile = {
|
|
135
|
+
standard: {
|
|
136
|
+
protocol: 'AIEOS',
|
|
137
|
+
version: SCHEMA_VERSION,
|
|
138
|
+
schema_url: `https://aieos.org/schema/v${SCHEMA_VERSION}/aieos.schema.json`,
|
|
139
|
+
},
|
|
140
|
+
metadata,
|
|
141
|
+
identity,
|
|
142
|
+
};
|
|
143
|
+
// Sign
|
|
144
|
+
spin.start('Signing profile…');
|
|
145
|
+
const signature = signProfile(profile, keypair.privateKey);
|
|
146
|
+
profile.metadata.signature = signature;
|
|
147
|
+
spin.stop('Profile signed.');
|
|
148
|
+
// ── If alias requested, preview price ────────────────────────────────────
|
|
149
|
+
if (alias) {
|
|
150
|
+
const price = await previewAliasPrice(client, alias);
|
|
151
|
+
if (price) {
|
|
152
|
+
const confirmPay = await p.confirm({
|
|
153
|
+
message: `Alias @${alias} costs ${price} USDC on Base. Continue?`,
|
|
154
|
+
});
|
|
155
|
+
if (p.isCancel(confirmPay) || !confirmPay) {
|
|
156
|
+
p.cancel('Alias skipped. You can claim one later with aieos claim-alias.');
|
|
157
|
+
alias = undefined;
|
|
158
|
+
delete profile.metadata.alias;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ── If alias, collect tx_id ──────────────────────────────────────────────
|
|
163
|
+
let txId;
|
|
164
|
+
if (alias) {
|
|
165
|
+
const txRaw = await p.text({
|
|
166
|
+
message: 'Paste your USDC payment tx ID (0x…)',
|
|
167
|
+
validate: (v) => (v.trim().length < 5 ? 'Enter a valid transaction ID.' : undefined),
|
|
168
|
+
});
|
|
169
|
+
if (p.isCancel(txRaw))
|
|
170
|
+
return cancelled();
|
|
171
|
+
txId = txRaw.trim();
|
|
172
|
+
}
|
|
173
|
+
// ── Register ────────────────────────────────────────────────────────────────
|
|
174
|
+
spin.start('Registering with AIEOS…');
|
|
175
|
+
try {
|
|
176
|
+
const payload = {
|
|
177
|
+
...profile,
|
|
178
|
+
...(email && { email }),
|
|
179
|
+
...(txId && { tx_id: txId }),
|
|
180
|
+
};
|
|
181
|
+
const result = await client.register(payload);
|
|
182
|
+
spin.stop('Registered!');
|
|
183
|
+
const outFile = resolve(`./${agentName.replace(/\s+/g, '-').toLowerCase()}-aieos.json`);
|
|
184
|
+
const saved = {
|
|
185
|
+
entity_id: result.entity_id,
|
|
186
|
+
alias: result.alias,
|
|
187
|
+
public_key: keypair.publicKey,
|
|
188
|
+
private_key: keypair.privateKey,
|
|
189
|
+
registered: new Date().toISOString(),
|
|
190
|
+
};
|
|
191
|
+
writeFileSync(outFile, JSON.stringify(saved, null, 2), { mode: 0o600 });
|
|
192
|
+
p.outro(`\n Agent registered!\n\n` +
|
|
193
|
+
` Entity ID : ${result.entity_id}\n` +
|
|
194
|
+
(result.alias ? ` Alias : @${result.alias}\n` : '') +
|
|
195
|
+
`\n Keypair saved to: ${outFile}\n` +
|
|
196
|
+
` Keep the private key secret. Back it up securely.\n\n` +
|
|
197
|
+
` Profile URL: https://aieos.org/${result.alias ?? result.entity_id}`);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
spin.stop('Registration failed.');
|
|
201
|
+
printApiError(err);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// ─── update ──────────────────────────────────────────────────────────────────
|
|
205
|
+
async function cmdUpdate() {
|
|
206
|
+
p.intro(` aieos update (v${VERSION})`);
|
|
207
|
+
const keyFileRaw = await p.text({
|
|
208
|
+
message: 'Path to your saved keypair JSON file',
|
|
209
|
+
placeholder: './my-agent-aieos.json',
|
|
210
|
+
validate: (v) => (!existsSync(v.trim()) ? 'File not found.' : undefined),
|
|
211
|
+
});
|
|
212
|
+
if (p.isCancel(keyFileRaw))
|
|
213
|
+
return cancelled();
|
|
214
|
+
let saved;
|
|
215
|
+
try {
|
|
216
|
+
saved = JSON.parse(readFileSync(keyFileRaw.trim(), 'utf8'));
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
p.cancel('Could not read keypair file.');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
const baseUrl = resolveBaseUrl();
|
|
223
|
+
const client = new AieosClient({ baseUrl });
|
|
224
|
+
const spin = p.spinner();
|
|
225
|
+
spin.start('Fetching current profile…');
|
|
226
|
+
let current;
|
|
227
|
+
try {
|
|
228
|
+
current = await client.lookup(saved.public_key);
|
|
229
|
+
spin.stop('Profile loaded.');
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
spin.stop('Could not fetch profile.');
|
|
233
|
+
printApiError(err);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
const currentIdentity = (current.identity ?? {});
|
|
237
|
+
const currentNames = Array.isArray(currentIdentity.names)
|
|
238
|
+
? currentIdentity.names
|
|
239
|
+
: [];
|
|
240
|
+
const currentMeta = (current.metadata ?? {});
|
|
241
|
+
const newNameRaw = await p.text({
|
|
242
|
+
message: 'Agent name',
|
|
243
|
+
initialValue: currentNames[0] ?? '',
|
|
244
|
+
validate: (v) => (v.trim().length < 1 ? 'Name is required.' : undefined),
|
|
245
|
+
});
|
|
246
|
+
if (p.isCancel(newNameRaw))
|
|
247
|
+
return cancelled();
|
|
248
|
+
const newDescRaw = await p.text({
|
|
249
|
+
message: 'Short description (optional)',
|
|
250
|
+
initialValue: currentIdentity.description ?? '',
|
|
251
|
+
});
|
|
252
|
+
if (p.isCancel(newDescRaw))
|
|
253
|
+
return cancelled();
|
|
254
|
+
const updatedMetadata = {
|
|
255
|
+
public_key: saved.public_key,
|
|
256
|
+
signature: '',
|
|
257
|
+
...(currentMeta.alias ? { alias: currentMeta.alias } : {}),
|
|
258
|
+
};
|
|
259
|
+
const newName = newNameRaw.trim();
|
|
260
|
+
const newDesc = newDescRaw ? newDescRaw.trim() : '';
|
|
261
|
+
const updatedProfile = {
|
|
262
|
+
standard: current.standard ?? {
|
|
263
|
+
protocol: 'AIEOS',
|
|
264
|
+
version: SCHEMA_VERSION,
|
|
265
|
+
},
|
|
266
|
+
metadata: updatedMetadata,
|
|
267
|
+
identity: {
|
|
268
|
+
...currentIdentity,
|
|
269
|
+
names: [newName],
|
|
270
|
+
...(newDesc && { description: newDesc }),
|
|
271
|
+
},
|
|
272
|
+
...(current.capabilities !== undefined ? { capabilities: current.capabilities } : {}),
|
|
273
|
+
...(current.endpoints !== undefined ? { endpoints: current.endpoints } : {}),
|
|
274
|
+
};
|
|
275
|
+
spin.start('Signing updated profile…');
|
|
276
|
+
const signature = signProfile(updatedProfile, saved.private_key);
|
|
277
|
+
updatedProfile.metadata.signature = signature;
|
|
278
|
+
spin.stop('Signed.');
|
|
279
|
+
spin.start('Updating profile…');
|
|
280
|
+
try {
|
|
281
|
+
await client.update(updatedProfile);
|
|
282
|
+
spin.stop('Profile updated!');
|
|
283
|
+
p.outro(`Profile updated. View at: https://aieos.org/${saved.alias ?? saved.entity_id}`);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
spin.stop('Update failed.');
|
|
287
|
+
printApiError(err);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ─── lookup ──────────────────────────────────────────────────────────────────
|
|
291
|
+
async function cmdLookup() {
|
|
292
|
+
const identifier = process.argv[3];
|
|
293
|
+
if (!identifier) {
|
|
294
|
+
console.error('Usage: aieos lookup <entity-id | public-key | alias>');
|
|
295
|
+
process.exit(1);
|
|
296
|
+
}
|
|
297
|
+
const client = new AieosClient({ baseUrl: resolveBaseUrl() });
|
|
298
|
+
try {
|
|
299
|
+
const profile = await client.lookup(identifier);
|
|
300
|
+
console.log(JSON.stringify(profile, null, 2));
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
printApiError(err);
|
|
304
|
+
process.exit(1);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// ─── keygen ──────────────────────────────────────────────────────────────────
|
|
308
|
+
function cmdKeygen() {
|
|
309
|
+
const kp = generateKeypair();
|
|
310
|
+
console.log(JSON.stringify(kp, null, 2));
|
|
311
|
+
}
|
|
312
|
+
// ─── verify ──────────────────────────────────────────────────────────────────
|
|
313
|
+
async function cmdVerify() {
|
|
314
|
+
const identifier = process.argv[3];
|
|
315
|
+
if (!identifier) {
|
|
316
|
+
console.error('Usage: aieos verify <entity-id | public-key | alias>');
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
const client = new AieosClient({ baseUrl: resolveBaseUrl() });
|
|
320
|
+
const spin = p.spinner();
|
|
321
|
+
spin.start('Fetching profile…');
|
|
322
|
+
try {
|
|
323
|
+
const profile = await client.lookup(identifier);
|
|
324
|
+
spin.stop('Profile fetched.');
|
|
325
|
+
const ok = verifyProfile(profile);
|
|
326
|
+
if (ok) {
|
|
327
|
+
console.log('Signature valid');
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
console.error('Signature INVALID');
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
spin.stop('Failed.');
|
|
336
|
+
printApiError(err);
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// ─── help ─────────────────────────────────────────────────────────────────────
|
|
341
|
+
function cmdHelp() {
|
|
342
|
+
console.log(`
|
|
343
|
+
aieos v${VERSION} — AIEOS identity registry CLI
|
|
344
|
+
|
|
345
|
+
Commands:
|
|
346
|
+
aieos register Register a new AI agent (interactive wizard)
|
|
347
|
+
aieos update Update your agent profile (interactive)
|
|
348
|
+
aieos lookup <identifier> Look up an agent by entity_id, public key, or alias
|
|
349
|
+
aieos verify <identifier> Fetch a profile and verify its Ed25519 signature
|
|
350
|
+
aieos keygen Generate a new Ed25519 keypair (prints JSON)
|
|
351
|
+
|
|
352
|
+
Options:
|
|
353
|
+
AIEOS_API_URL=<url> Override API base URL (default: https://api.aieos.org)
|
|
354
|
+
|
|
355
|
+
Examples:
|
|
356
|
+
npx aieos register
|
|
357
|
+
npx aieos lookup stella
|
|
358
|
+
npx aieos verify 3f9a1c2d-...
|
|
359
|
+
`);
|
|
360
|
+
}
|
|
361
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
362
|
+
function resolveBaseUrl() {
|
|
363
|
+
return (process.env['AIEOS_API_URL'] ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
364
|
+
}
|
|
365
|
+
function cancelled() {
|
|
366
|
+
p.cancel('Operation cancelled.');
|
|
367
|
+
process.exit(0);
|
|
368
|
+
}
|
|
369
|
+
function printApiError(err) {
|
|
370
|
+
if (err instanceof AieosApiError) {
|
|
371
|
+
p.log.error(`API error ${err.status}: ${err.message}`);
|
|
372
|
+
const b = err.body;
|
|
373
|
+
if (b.wallet_address) {
|
|
374
|
+
p.log.info(`Payment required:\n` +
|
|
375
|
+
` Amount : ${b.amount} ${b.currency}\n` +
|
|
376
|
+
` To : ${b.wallet_address}\n` +
|
|
377
|
+
` Chain : ${b.chain}\n` +
|
|
378
|
+
(b.instructions ? ` Note : ${b.instructions}` : ''));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
p.log.error(String(err));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async function previewAliasPrice(client, alias) {
|
|
386
|
+
try {
|
|
387
|
+
await client.register({
|
|
388
|
+
standard: { protocol: 'AIEOS', version: SCHEMA_VERSION },
|
|
389
|
+
metadata: { public_key: '0'.repeat(64), signature: '0'.repeat(128), alias },
|
|
390
|
+
identity: { names: ['_preview'] },
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
if (err instanceof AieosApiError && err.status === 402 && err.body.amount) {
|
|
395
|
+
return err.body.amount;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
main().catch((err) => {
|
|
401
|
+
console.error(err);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
});
|
|
404
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|