meshsig 0.5.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/main.js ADDED
@@ -0,0 +1,459 @@
1
+ #!/usr/bin/env node
2
+ // ============================================================================
3
+ // MeshSig CLI — Cryptographic security layer for AI agents
4
+ //
5
+ // meshsig init Generate Ed25519 identity
6
+ // meshsig sign <message> Sign a message
7
+ // meshsig verify <msg> <sig> <key> Verify a signature
8
+ // meshsig identity Show your identity
9
+ // meshsig agents List agents on server
10
+ // meshsig audit Export audit log
11
+ // meshsig start Start the MeshSig server
12
+ // ============================================================================
13
+ import { MeshServer } from './server.js';
14
+ import { runDemo } from './demo.js';
15
+ import { TerminalDisplay } from './terminal.js';
16
+ import { generateIdentity, sign, verify, verifyWithDid, isValidDid, hashPayload } from './crypto.js';
17
+ import { resolve } from 'node:path';
18
+ import { homedir } from 'node:os';
19
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
20
+ const BOLD = '\x1b[1m';
21
+ const DIM = '\x1b[2m';
22
+ const GREEN = '\x1b[32m';
23
+ const CYAN = '\x1b[36m';
24
+ const MAGENTA = '\x1b[35m';
25
+ const YELLOW = '\x1b[33m';
26
+ const RED = '\x1b[31m';
27
+ const RESET = '\x1b[0m';
28
+ const MESHSIG_DIR = resolve(homedir(), '.meshsig');
29
+ const IDENTITY_FILE = resolve(MESHSIG_DIR, 'identity.json');
30
+ const DEFAULT_SERVER = 'http://localhost:4888';
31
+ // -- Helpers -----------------------------------------------------------------
32
+ function ensureDir() {
33
+ if (!existsSync(MESHSIG_DIR))
34
+ mkdirSync(MESHSIG_DIR, { recursive: true });
35
+ }
36
+ function loadIdentity() {
37
+ if (!existsSync(IDENTITY_FILE))
38
+ return null;
39
+ return JSON.parse(readFileSync(IDENTITY_FILE, 'utf-8'));
40
+ }
41
+ function printIdentity(id) {
42
+ console.log(`
43
+ ${CYAN}${BOLD}MeshSig Identity${RESET}
44
+
45
+ ${DIM}DID${RESET} ${CYAN}${id.did}${RESET}
46
+ ${DIM}PUBLIC KEY${RESET} ${id.publicKey}
47
+ ${DIM}CREATED${RESET} ${id.createdAt}
48
+ ${DIM}STORED${RESET} ${DIM}${IDENTITY_FILE}${RESET}
49
+ `);
50
+ }
51
+ // -- Commands ----------------------------------------------------------------
52
+ async function cmdInit(force) {
53
+ ensureDir();
54
+ if (existsSync(IDENTITY_FILE) && !force) {
55
+ const existing = loadIdentity();
56
+ console.log(`\n ${YELLOW}Identity already exists.${RESET} Use ${CYAN}--force${RESET} to regenerate.\n`);
57
+ printIdentity(existing);
58
+ return;
59
+ }
60
+ const identity = await generateIdentity();
61
+ writeFileSync(IDENTITY_FILE, JSON.stringify(identity, null, 2));
62
+ console.log(`\n ${GREEN}${BOLD}✓ Identity generated${RESET}`);
63
+ printIdentity(identity);
64
+ console.log(` ${DIM}Your private key is stored locally. Never share it.${RESET}\n`);
65
+ }
66
+ async function cmdSign(message) {
67
+ const identity = loadIdentity();
68
+ if (!identity) {
69
+ console.log(`\n ${RED}No identity found.${RESET} Run ${CYAN}meshsig init${RESET} first.\n`);
70
+ process.exit(1);
71
+ }
72
+ const signature = await sign(message, identity.privateKey);
73
+ const hash = hashPayload(message);
74
+ if (process.argv.includes('--json')) {
75
+ console.log(JSON.stringify({
76
+ did: identity.did,
77
+ message,
78
+ signature,
79
+ hash,
80
+ publicKey: identity.publicKey,
81
+ timestamp: new Date().toISOString(),
82
+ }, null, 2));
83
+ return;
84
+ }
85
+ console.log(`
86
+ ${GREEN}${BOLD}✓ Message signed${RESET}
87
+
88
+ ${DIM}FROM${RESET} ${CYAN}${identity.did}${RESET}
89
+ ${DIM}MESSAGE${RESET} ${message.slice(0, 80)}${message.length > 80 ? '...' : ''}
90
+ ${DIM}SIGNATURE${RESET} ${signature}
91
+ ${DIM}HASH${RESET} ${hash}
92
+ ${DIM}PUBLIC KEY${RESET} ${identity.publicKey}
93
+ `);
94
+ }
95
+ async function cmdVerify(message, signature, keyOrDid) {
96
+ let valid;
97
+ let label;
98
+ if (isValidDid(keyOrDid)) {
99
+ valid = await verifyWithDid(message, signature, keyOrDid);
100
+ label = `DID: ${keyOrDid}`;
101
+ }
102
+ else {
103
+ valid = await verify(message, signature, keyOrDid);
104
+ label = `Key: ${keyOrDid.slice(0, 30)}...`;
105
+ }
106
+ if (process.argv.includes('--json')) {
107
+ console.log(JSON.stringify({ valid, message, signature, signer: keyOrDid }));
108
+ if (!valid)
109
+ process.exit(1);
110
+ return;
111
+ }
112
+ if (valid) {
113
+ console.log(`\n ${GREEN}${BOLD}✓ SIGNATURE VALID${RESET}\n\n ${DIM}${label}${RESET}\n`);
114
+ }
115
+ else {
116
+ console.log(`\n ${RED}${BOLD}✗ SIGNATURE INVALID${RESET}\n\n ${DIM}${label}${RESET}\n`);
117
+ process.exit(1);
118
+ }
119
+ }
120
+ function cmdIdentity() {
121
+ const identity = loadIdentity();
122
+ if (!identity) {
123
+ console.log(`\n ${RED}No identity found.${RESET} Run ${CYAN}meshsig init${RESET} first.\n`);
124
+ process.exit(1);
125
+ }
126
+ if (process.argv.includes('--json')) {
127
+ console.log(JSON.stringify({
128
+ did: identity.did,
129
+ publicKey: identity.publicKey,
130
+ createdAt: identity.createdAt,
131
+ }, null, 2));
132
+ return;
133
+ }
134
+ printIdentity(identity);
135
+ }
136
+ async function cmdAgents(server) {
137
+ try {
138
+ const res = await fetch(`${server}/agents`);
139
+ const data = await res.json();
140
+ if (process.argv.includes('--json')) {
141
+ console.log(JSON.stringify(data, null, 2));
142
+ return;
143
+ }
144
+ console.log(`\n ${CYAN}${BOLD}MeshSig Agents${RESET} — ${server}\n`);
145
+ if (!data.agents || data.agents.length === 0) {
146
+ console.log(` ${DIM}No agents registered.${RESET}\n`);
147
+ return;
148
+ }
149
+ for (const a of data.agents) {
150
+ const origin = a.origin === 'remote' ? `${YELLOW}remote${RESET}` : `${GREEN}local${RESET}`;
151
+ const trust = a.trustScore > 0 ? ` · ${(a.trustScore * 100).toFixed(0)}%` : '';
152
+ const caps = (a.capabilities || []).map((c) => c.type).join(', ');
153
+ console.log(` ${CYAN}${a.displayName}${RESET} ${DIM}${a.did.slice(0, 30)}...${RESET}`);
154
+ console.log(` ${origin} ${DIM}${caps}${trust}${RESET}`);
155
+ }
156
+ console.log(`\n ${DIM}${data.agents.length} agents total${RESET}\n`);
157
+ }
158
+ catch {
159
+ console.log(`\n ${RED}Cannot connect to ${server}${RESET}`);
160
+ console.log(` ${DIM}Start the server: meshsig start${RESET}\n`);
161
+ process.exit(1);
162
+ }
163
+ }
164
+ async function cmdAudit(server, format) {
165
+ try {
166
+ const [msgRes, agentRes, connRes] = await Promise.all([
167
+ fetch(`${server}/messages`),
168
+ fetch(`${server}/agents`),
169
+ fetch(`${server}/connections`),
170
+ ]);
171
+ const messages = (await msgRes.json()).messages || [];
172
+ const agents = (await agentRes.json()).agents || [];
173
+ const connections = (await connRes.json()).connections || [];
174
+ if (format === 'json') {
175
+ console.log(JSON.stringify({
176
+ exported: new Date().toISOString(),
177
+ server,
178
+ summary: {
179
+ agents: agents.length,
180
+ connections: connections.length,
181
+ messages: messages.length,
182
+ verifiedMessages: messages.filter((m) => m.verified).length,
183
+ },
184
+ agents: agents.map((a) => ({
185
+ did: a.did,
186
+ name: a.displayName,
187
+ publicKey: a.publicKey,
188
+ trustScore: a.trustScore,
189
+ origin: a.origin,
190
+ })),
191
+ messages: messages.map((m) => ({
192
+ from: m.fromDid,
193
+ to: m.toDid,
194
+ content: m.content,
195
+ signature: m.signature,
196
+ verified: m.verified,
197
+ timestamp: m.createdAt,
198
+ })),
199
+ }, null, 2));
200
+ return;
201
+ }
202
+ // Pretty print
203
+ console.log(`
204
+ ${CYAN}${BOLD}MeshSig Audit Report${RESET}
205
+ ${DIM}Generated: ${new Date().toISOString()}${RESET}
206
+ ${DIM}Server: ${server}${RESET}
207
+
208
+ ${BOLD}SUMMARY${RESET}
209
+ Agents: ${CYAN}${agents.length}${RESET}
210
+ Connections: ${CYAN}${connections.length}${RESET}
211
+ Messages: ${CYAN}${messages.length}${RESET}
212
+ Verified: ${GREEN}${messages.filter((m) => m.verified).length}${RESET}
213
+ Failed: ${RED}${messages.filter((m) => !m.verified).length}${RESET}
214
+ `);
215
+ if (messages.length > 0) {
216
+ console.log(` ${BOLD}SIGNED MESSAGES${RESET}\n`);
217
+ for (const m of messages.slice(-20)) {
218
+ const v = m.verified ? `${GREEN}✓${RESET}` : `${RED}✗${RESET}`;
219
+ const from = agents.find((a) => a.did === m.fromDid)?.displayName || m.fromDid?.slice(0, 20);
220
+ const to = agents.find((a) => a.did === m.toDid)?.displayName || m.toDid?.slice(0, 20);
221
+ console.log(` ${v} ${DIM}${m.createdAt}${RESET} ${CYAN}${from}${RESET} → ${CYAN}${to}${RESET}`);
222
+ console.log(` ${DIM}${m.content?.slice(0, 60) || ''}${RESET}`);
223
+ console.log(` ${DIM}sig: ${m.signature?.slice(0, 40)}...${RESET}\n`);
224
+ }
225
+ }
226
+ }
227
+ catch {
228
+ console.log(`\n ${RED}Cannot connect to ${server}${RESET}\n`);
229
+ process.exit(1);
230
+ }
231
+ }
232
+ async function cmdStats(server) {
233
+ try {
234
+ const res = await fetch(`${server}/stats`);
235
+ const data = await res.json();
236
+ if (process.argv.includes('--json')) {
237
+ console.log(JSON.stringify(data, null, 2));
238
+ return;
239
+ }
240
+ const up = Math.floor(data.uptime || 0);
241
+ const h = Math.floor(up / 3600);
242
+ const m = Math.floor((up % 3600) / 60);
243
+ console.log(`
244
+ ${CYAN}${BOLD}MeshSig Status${RESET} — ${server}
245
+
246
+ ${DIM}AGENTS${RESET} ${CYAN}${BOLD}${data.agents}${RESET}
247
+ ${DIM}ACTIVE${RESET} ${CYAN}${data.active}${RESET}
248
+ ${DIM}CONNECTIONS${RESET} ${CYAN}${data.connections}${RESET}
249
+ ${DIM}MESSAGES${RESET} ${CYAN}${data.messages}${RESET}
250
+ ${DIM}UPTIME${RESET} ${DIM}${h}h ${m}m${RESET}
251
+ `);
252
+ }
253
+ catch {
254
+ console.log(`\n ${RED}Cannot connect to ${server}${RESET}\n`);
255
+ process.exit(1);
256
+ }
257
+ }
258
+ // -- Server command ----------------------------------------------------------
259
+ function parseStartArgs() {
260
+ const args = process.argv.slice(3); // skip 'node', 'main.js', 'start'
261
+ const config = { peers: [] };
262
+ for (let i = 0; i < args.length; i++) {
263
+ switch (args[i]) {
264
+ case '--demo':
265
+ config.demo = true;
266
+ break;
267
+ case '--port':
268
+ case '-p':
269
+ config.port = parseInt(args[++i]);
270
+ break;
271
+ case '--host':
272
+ config.host = args[++i];
273
+ break;
274
+ case '--db':
275
+ config.dbPath = args[++i];
276
+ break;
277
+ case '--name':
278
+ config.name = args[++i];
279
+ break;
280
+ case '--peer':
281
+ config.peers.push(args[++i]);
282
+ break;
283
+ case '--no-terminal':
284
+ config.noTerminal = true;
285
+ break;
286
+ }
287
+ }
288
+ return config;
289
+ }
290
+ async function cmdStart() {
291
+ const config = parseStartArgs();
292
+ const port = config.port || 4888;
293
+ const host = config.host || '0.0.0.0';
294
+ ensureDir();
295
+ const dbPath = config.dbPath || resolve(MESHSIG_DIR, 'mesh.db');
296
+ const server = new MeshServer({ port, host, dbPath, name: config.name, peers: config.peers || [] });
297
+ const terminal = new TerminalDisplay();
298
+ await server.start();
299
+ console.log(`
300
+
301
+ ${CYAN} ███╗ ███╗███████╗███████╗██╗ ██╗███████╗██╗ ██████╗
302
+ ████╗ ████║██╔════╝██╔════╝██║ ██║██╔════╝██║██╔════╝
303
+ ██╔████╔██║█████╗ ███████╗███████║███████╗██║██║ ███╗
304
+ ██║╚██╔╝██║██╔══╝ ╚════██║██╔══██║╚════██║██║██║ ██║
305
+ ██║ ╚═╝ ██║███████╗███████║██║ ██║███████║██║╚██████╔╝
306
+ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═════╝${RESET}
307
+
308
+ ${MAGENTA} ◈${RESET} ${BOLD}Cryptographic security layer for AI agents${RESET}
309
+
310
+ ${DIM} ─────────────────────────────────────────────────────────${RESET}
311
+
312
+ ${GREEN}●${RESET} ${DIM}DASHBOARD${RESET} ${CYAN}${BOLD}http://localhost:${port}${RESET}
313
+ ${GREEN}●${RESET} ${DIM}API${RESET} ${CYAN}http://localhost:${port}/health${RESET}
314
+ ${GREEN}●${RESET} ${DIM}WEBSOCKET${RESET} ${CYAN}ws://localhost:${port}${RESET}
315
+
316
+ ${DIM} ─────────────────────────────────────────────────────────${RESET}
317
+
318
+ ${DIM}CRYPTO${RESET} Ed25519 digital signatures
319
+ ${DIM}DID${RESET} did:msig:* ${DIM}W3C decentralized identity${RESET}
320
+ ${DIM}VERIFY${RESET} Mutual challenge-response handshake
321
+ ${DIM}TRUST${RESET} Earned through verified interactions
322
+
323
+ ${DIM} ─────────────────────────────────────────────────────────${RESET}
324
+ `);
325
+ if (config.demo) {
326
+ await runDemo(server);
327
+ }
328
+ else if (!config.noTerminal) {
329
+ setTimeout(() => terminal.start(), 1000);
330
+ }
331
+ else {
332
+ console.log(` ${DIM}Mesh active. Waiting for agents.${RESET}\n`);
333
+ }
334
+ const shutdown = async () => {
335
+ terminal.stop();
336
+ console.log(`\n ${DIM}Shutting down MeshSig...${RESET}`);
337
+ await server.stop();
338
+ process.exit(0);
339
+ };
340
+ process.on('SIGINT', shutdown);
341
+ process.on('SIGTERM', shutdown);
342
+ }
343
+ // -- Help --------------------------------------------------------------------
344
+ function showHelp() {
345
+ console.log(`
346
+ ${CYAN}${BOLD}MeshSig${RESET} — Cryptographic security layer for AI agents
347
+
348
+ ${BOLD}COMMANDS${RESET}
349
+
350
+ ${CYAN}meshsig init${RESET} Generate Ed25519 identity
351
+ ${CYAN}meshsig sign${RESET} ${DIM}<message>${RESET} Sign a message with your key
352
+ ${CYAN}meshsig verify${RESET} ${DIM}<msg> <sig> <key|did>${RESET} Verify a signature
353
+ ${CYAN}meshsig identity${RESET} Show your DID and public key
354
+ ${CYAN}meshsig agents${RESET} List agents on the mesh
355
+ ${CYAN}meshsig stats${RESET} Server statistics
356
+ ${CYAN}meshsig audit${RESET} Export signed message audit log
357
+ ${CYAN}meshsig start${RESET} Start the MeshSig server
358
+
359
+ ${BOLD}OPTIONS${RESET}
360
+
361
+ ${DIM}--server <url>${RESET} MeshSig server (default: http://localhost:4888)
362
+ ${DIM}--json${RESET} Output as JSON (for piping)
363
+ ${DIM}--force${RESET} Overwrite existing identity on init
364
+
365
+ ${BOLD}SERVER OPTIONS${RESET} (meshsig start)
366
+
367
+ ${DIM}--port, -p <n>${RESET} Server port (default: 4888)
368
+ ${DIM}--demo${RESET} Start with demo agents
369
+ ${DIM}--peer <url>${RESET} Connect to another MeshSig
370
+ ${DIM}--no-terminal${RESET} Disable live terminal display
371
+
372
+ ${BOLD}EXAMPLES${RESET}
373
+
374
+ ${GREEN}# Generate your identity${RESET}
375
+ meshsig init
376
+
377
+ ${GREEN}# Sign a message${RESET}
378
+ meshsig sign "Deploy the new model to production"
379
+
380
+ ${GREEN}# Verify someone's signature${RESET}
381
+ meshsig verify "message" "base64sig" "did:msig:abc123..."
382
+
383
+ ${GREEN}# Export audit log as JSON${RESET}
384
+ meshsig audit --json > audit-report.json
385
+
386
+ ${GREEN}# Start the server${RESET}
387
+ meshsig start --port 4888
388
+
389
+ ${GREEN}# Pipe: sign and verify in one shot${RESET}
390
+ meshsig sign "hello" --json | meshsig verify --json
391
+
392
+ ${DIM}https://meshsig.ai${RESET} — ${DIM}https://github.com/carlostroy/meshsig${RESET}
393
+ `);
394
+ }
395
+ // -- Main router -------------------------------------------------------------
396
+ async function main() {
397
+ const cmd = process.argv[2];
398
+ const args = process.argv.slice(3);
399
+ // Find --server flag
400
+ const serverIdx = args.indexOf('--server');
401
+ const server = serverIdx >= 0 ? args[serverIdx + 1] : DEFAULT_SERVER;
402
+ switch (cmd) {
403
+ case 'init':
404
+ await cmdInit(args.includes('--force'));
405
+ break;
406
+ case 'sign':
407
+ const msg = args.find(a => !a.startsWith('-'));
408
+ if (!msg) {
409
+ console.log(`\n ${RED}Usage: meshsig sign <message>${RESET}\n`);
410
+ process.exit(1);
411
+ }
412
+ await cmdSign(msg);
413
+ break;
414
+ case 'verify': {
415
+ const vArgs = args.filter(a => !a.startsWith('-'));
416
+ if (vArgs.length < 3) {
417
+ console.log(`\n ${RED}Usage: meshsig verify <message> <signature> <publicKey|did>${RESET}\n`);
418
+ process.exit(1);
419
+ }
420
+ await cmdVerify(vArgs[0], vArgs[1], vArgs[2]);
421
+ break;
422
+ }
423
+ case 'identity':
424
+ case 'id':
425
+ case 'whoami':
426
+ cmdIdentity();
427
+ break;
428
+ case 'agents':
429
+ case 'ls':
430
+ await cmdAgents(server);
431
+ break;
432
+ case 'stats':
433
+ case 'status':
434
+ await cmdStats(server);
435
+ break;
436
+ case 'audit':
437
+ const format = args.includes('--json') ? 'json' : 'pretty';
438
+ await cmdAudit(server, format);
439
+ break;
440
+ case 'start':
441
+ await cmdStart();
442
+ break;
443
+ case 'help':
444
+ case '--help':
445
+ case '-h':
446
+ case undefined:
447
+ showHelp();
448
+ break;
449
+ default:
450
+ console.log(`\n ${RED}Unknown command: ${cmd}${RESET}`);
451
+ showHelp();
452
+ process.exit(1);
453
+ }
454
+ }
455
+ main().catch(err => {
456
+ console.error(`\n ${RED}Error: ${err.message}${RESET}\n`);
457
+ process.exit(1);
458
+ });
459
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { WebSocket } from 'ws';
2
+ import { EventEmitter } from 'node:events';
3
+ import type { Registry, AgentRecord } from './registry.js';
4
+ export interface PeerInfo {
5
+ id: string;
6
+ url: string;
7
+ status: 'connecting' | 'connected' | 'disconnected';
8
+ name: string | null;
9
+ agents: string[];
10
+ connectedAt: string;
11
+ }
12
+ export declare class PeerNetwork extends EventEmitter {
13
+ private peers;
14
+ private registry;
15
+ private serverName;
16
+ private reconnectTimers;
17
+ private syncInterval;
18
+ constructor(registry: Registry, serverName: string);
19
+ connectTo(url: string): PeerInfo;
20
+ handleIncoming(ws: WebSocket, fromName: string): void;
21
+ private sendAnnounce;
22
+ private announceAll;
23
+ private handlePeerMessage;
24
+ /**
25
+ * Try to route a message to a remote agent on a connected peer.
26
+ */
27
+ routeToRemote(toDid: string, payload: any): boolean;
28
+ /**
29
+ * Query all peers for discovery.
30
+ */
31
+ discoverRemote(query: any, timeoutMs?: number): Promise<AgentRecord[]>;
32
+ listPeers(): PeerInfo[];
33
+ getConnectedCount(): number;
34
+ close(): void;
35
+ }