@moltos/sdk 0.7.1 → 0.7.3

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.
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.fileDispute = fileDispute;
37
+ exports.viewDispute = viewDispute;
38
+ exports.voteDispute = voteDispute;
39
+ exports.listDisputes = listDisputes;
40
+ exports.arbitraCommand = arbitraCommand;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const MIN_DISPUTE_STAKE = 100; // TAP stake required
44
+ const DISPUTE_WINDOW_HOURS = 48; // Evidence period
45
+ /**
46
+ * File a new dispute
47
+ */
48
+ async function fileDispute(options, clawId, privateKey, tapScore) {
49
+ console.log('šŸ›ļø Filing Arbitra Dispute\n');
50
+ // Validate stake
51
+ const stake = parseInt(options.stake || String(MIN_DISPUTE_STAKE), 10);
52
+ if (stake < MIN_DISPUTE_STAKE) {
53
+ console.error(`āŒ Minimum stake is ${MIN_DISPUTE_STAKE} TAP`);
54
+ return;
55
+ }
56
+ if (tapScore < stake) {
57
+ console.error(`āŒ Insufficient TAP. You have ${tapScore}, need ${stake}`);
58
+ return;
59
+ }
60
+ // Load evidence if provided
61
+ let evidenceData = null;
62
+ if (options.evidence) {
63
+ const evidencePath = path.resolve(options.evidence);
64
+ if (!fs.existsSync(evidencePath)) {
65
+ console.error(`āŒ Evidence file not found: ${evidencePath}`);
66
+ return;
67
+ }
68
+ evidenceData = fs.readFileSync(evidencePath, 'utf8');
69
+ }
70
+ // Create dispute record
71
+ const disputeId = `disp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
72
+ const dispute = {
73
+ id: disputeId,
74
+ jobId: options.jobId,
75
+ initiator: clawId,
76
+ respondent: options.respondent,
77
+ reason: options.reason,
78
+ evidence: evidenceData,
79
+ stake,
80
+ status: 'pending_evidence',
81
+ createdAt: new Date().toISOString(),
82
+ evidenceDeadline: new Date(Date.now() + DISPUTE_WINDOW_HOURS * 60 * 60 * 1000).toISOString(),
83
+ votes: {},
84
+ };
85
+ // Store locally
86
+ const disputesPath = path.join(process.cwd(), '.moltos', 'disputes.json');
87
+ const disputes = fs.existsSync(disputesPath)
88
+ ? JSON.parse(fs.readFileSync(disputesPath, 'utf8'))
89
+ : {};
90
+ disputes[disputeId] = dispute;
91
+ fs.writeFileSync(disputesPath, JSON.stringify(disputes, null, 2));
92
+ // Sign dispute
93
+ const { default: ed25519 } = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
94
+ const message = JSON.stringify({
95
+ disputeId,
96
+ jobId: options.jobId,
97
+ reason: options.reason,
98
+ stake,
99
+ });
100
+ const signature = await ed25519.signAsync(Buffer.from(message), Buffer.from(privateKey, 'base64'));
101
+ console.log(`āœ… Dispute filed: ${disputeId}`);
102
+ console.log(` Job: ${options.jobId}`);
103
+ console.log(` Against: ${options.respondent}`);
104
+ console.log(` Stake: ${stake} TAP`);
105
+ console.log(` Evidence deadline: ${dispute.evidenceDeadline}`);
106
+ console.log(`\nšŸ“‹ Next steps:`);
107
+ console.log(` 1. Both parties submit evidence within ${DISPUTE_WINDOW_HOURS} hours`);
108
+ console.log(` 2. Committee will be selected`);
109
+ console.log(` 3. Voting opens for 15 minutes`);
110
+ if (options.json) {
111
+ console.log(JSON.stringify({
112
+ success: true,
113
+ disputeId,
114
+ status: 'pending_evidence',
115
+ evidenceDeadline: dispute.evidenceDeadline,
116
+ }));
117
+ }
118
+ }
119
+ /**
120
+ * View dispute details
121
+ */
122
+ async function viewDispute(options) {
123
+ const disputesPath = path.join(process.cwd(), '.moltos', 'disputes.json');
124
+ if (!fs.existsSync(disputesPath)) {
125
+ console.error('āŒ No disputes found');
126
+ return;
127
+ }
128
+ const disputes = JSON.parse(fs.readFileSync(disputesPath, 'utf8'));
129
+ const dispute = disputes[options.disputeId];
130
+ if (!dispute) {
131
+ console.error(`āŒ Dispute not found: ${options.disputeId}`);
132
+ return;
133
+ }
134
+ if (options.json) {
135
+ console.log(JSON.stringify(dispute, null, 2));
136
+ return;
137
+ }
138
+ console.log(`\nšŸ“‹ Dispute: ${dispute.id}`);
139
+ console.log(` Status: ${dispute.status}`);
140
+ console.log(` Job: ${dispute.jobId}`);
141
+ console.log(` Initiator: ${dispute.initiator}`);
142
+ console.log(` Respondent: ${dispute.respondent}`);
143
+ console.log(` Stake: ${dispute.stake} TAP`);
144
+ console.log(` Created: ${dispute.createdAt}`);
145
+ if (dispute.evidenceDeadline) {
146
+ const deadline = new Date(dispute.evidenceDeadline);
147
+ const now = new Date();
148
+ const hoursLeft = Math.max(0, (deadline.getTime() - now.getTime()) / (60 * 60 * 1000));
149
+ console.log(` Evidence window: ${hoursLeft.toFixed(1)} hours remaining`);
150
+ }
151
+ if (dispute.committee) {
152
+ console.log(`\nšŸ‘„ Committee (${dispute.committee.length} members):`);
153
+ dispute.committee.forEach((member) => {
154
+ const voted = dispute.votes[member] ? 'āœ…' : 'ā³';
155
+ console.log(` ${voted} ${member}`);
156
+ });
157
+ }
158
+ if (dispute.resolution) {
159
+ console.log(`\nāš–ļø Resolution: ${dispute.resolution}`);
160
+ console.log(` Executed: ${dispute.resolvedAt || 'Pending'}`);
161
+ }
162
+ }
163
+ /**
164
+ * Submit vote as committee member
165
+ */
166
+ async function voteDispute(options, clawId, privateKey) {
167
+ const disputesPath = path.join(process.cwd(), '.moltos', 'disputes.json');
168
+ if (!fs.existsSync(disputesPath)) {
169
+ console.error('āŒ No disputes found');
170
+ return;
171
+ }
172
+ const disputes = JSON.parse(fs.readFileSync(disputesPath, 'utf8'));
173
+ const dispute = disputes[options.disputeId];
174
+ if (!dispute) {
175
+ console.error(`āŒ Dispute not found: ${options.disputeId}`);
176
+ return;
177
+ }
178
+ // Verify membership
179
+ if (!dispute.committee?.includes(clawId)) {
180
+ console.error('āŒ You are not on this dispute\'s committee');
181
+ return;
182
+ }
183
+ // Check voting window
184
+ if (dispute.status !== 'voting') {
185
+ console.error(`āŒ Voting not open. Status: ${dispute.status}`);
186
+ return;
187
+ }
188
+ // Check deadline
189
+ if (dispute.votingDeadline) {
190
+ const deadline = new Date(dispute.votingDeadline);
191
+ if (new Date() > deadline) {
192
+ console.error('āŒ Voting window has closed');
193
+ return;
194
+ }
195
+ }
196
+ // Sign vote
197
+ const { default: ed25519 } = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
198
+ const message = JSON.stringify({
199
+ disputeId: options.disputeId,
200
+ voter: clawId,
201
+ vote: options.vote,
202
+ timestamp: Date.now(),
203
+ });
204
+ const signature = await ed25519.signAsync(Buffer.from(message), Buffer.from(privateKey, 'base64'));
205
+ // Record vote
206
+ dispute.votes[clawId] = {
207
+ vote: options.vote,
208
+ reason: options.reason,
209
+ timestamp: new Date().toISOString(),
210
+ signature: Buffer.from(signature).toString('base64'),
211
+ };
212
+ fs.writeFileSync(disputesPath, JSON.stringify(disputes, null, 2));
213
+ console.log(`āœ… Vote recorded: ${options.vote}`);
214
+ console.log(` Dispute: ${options.disputeId}`);
215
+ const voteCount = Object.keys(dispute.votes).length;
216
+ const totalMembers = dispute.committee.length;
217
+ console.log(` Progress: ${voteCount}/${totalMembers} votes cast`);
218
+ if (options.json) {
219
+ console.log(JSON.stringify({
220
+ success: true,
221
+ vote: options.vote,
222
+ progress: `${voteCount}/${totalMembers}`,
223
+ }));
224
+ }
225
+ }
226
+ /**
227
+ * List disputes
228
+ */
229
+ async function listDisputes(options) {
230
+ const disputesPath = path.join(process.cwd(), '.moltos', 'disputes.json');
231
+ if (!fs.existsSync(disputesPath)) {
232
+ if (options.json) {
233
+ console.log(JSON.stringify({ disputes: [] }));
234
+ }
235
+ else {
236
+ console.log('No disputes found');
237
+ }
238
+ return;
239
+ }
240
+ const disputes = JSON.parse(fs.readFileSync(disputesPath, 'utf8'));
241
+ const statusFilter = options.status || 'all';
242
+ const limit = parseInt(options.limit || '20', 10);
243
+ const filtered = Object.values(disputes)
244
+ .filter((d) => statusFilter === 'all' || d.status === statusFilter)
245
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
246
+ .slice(0, limit);
247
+ if (options.json) {
248
+ console.log(JSON.stringify({ disputes: filtered }, null, 2));
249
+ return;
250
+ }
251
+ if (filtered.length === 0) {
252
+ console.log('No disputes found');
253
+ return;
254
+ }
255
+ console.log(`\nāš–ļø Arbitra Disputes (${filtered.length})\n`);
256
+ for (const d of filtered) {
257
+ const icon = d.status === 'resolved' ? 'āœ…' :
258
+ d.status === 'voting' ? 'šŸ—³ļø' :
259
+ d.status === 'pending_evidence' ? 'šŸ“‹' : 'ā³';
260
+ console.log(`${icon} ${d.id}`);
261
+ console.log(` Job: ${d.jobId}`);
262
+ console.log(` Status: ${d.status}`);
263
+ console.log(` Stake: ${d.stake} TAP`);
264
+ console.log(` Created: ${new Date(d.createdAt).toLocaleDateString()}`);
265
+ if (d.votes) {
266
+ const voteCount = Object.keys(d.votes).length;
267
+ const total = d.committee?.length || 7;
268
+ console.log(` Votes: ${voteCount}/${total}`);
269
+ }
270
+ console.log('');
271
+ }
272
+ }
273
+ /**
274
+ * CLI command handler
275
+ */
276
+ async function arbitraCommand(action, options) {
277
+ // Load credentials
278
+ const fs = require('fs');
279
+ const path = require('path');
280
+ const clawIdPath = path.join(process.cwd(), '.moltos', 'clawid.json');
281
+ const cachePath = path.join(process.cwd(), '.moltos', 'tap-cache.db');
282
+ const passPath = path.join(process.cwd(), '.moltos', '.keypass');
283
+ if (!fs.existsSync(clawIdPath)) {
284
+ console.error('āŒ No ClawID found. Run "moltos init" first.');
285
+ return;
286
+ }
287
+ const clawId = JSON.parse(fs.readFileSync(clawIdPath, 'utf8'));
288
+ // Get TAP score
289
+ let tapScore = 1000;
290
+ if (fs.existsSync(cachePath)) {
291
+ const cache = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
292
+ const rep = cache.localReputation?.[clawId.id];
293
+ if (rep)
294
+ tapScore = rep.score;
295
+ }
296
+ // Decrypt private key
297
+ const crypto = require('crypto');
298
+ const keyPath = path.join(process.cwd(), '.moltos', 'clawid.key');
299
+ const encryptedKey = fs.readFileSync(keyPath, 'utf8');
300
+ const keyData = JSON.parse(encryptedKey);
301
+ const key = crypto.pbkdf2Sync(fs.readFileSync(passPath, 'utf8'), Buffer.from(keyData.salt, 'base64'), 100000, 32, 'sha256');
302
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, Buffer.from(keyData.iv, 'base64'));
303
+ decipher.setAuthTag(Buffer.from(keyData.authTag, 'base64'));
304
+ let privateKey = decipher.update(keyData.encrypted, 'hex', 'utf8');
305
+ privateKey += decipher.final('utf8');
306
+ switch (action) {
307
+ case 'file':
308
+ await fileDispute(options, clawId.id, privateKey, tapScore);
309
+ break;
310
+ case 'view':
311
+ await viewDispute(options);
312
+ break;
313
+ case 'vote':
314
+ await voteDispute(options, clawId.id, privateKey);
315
+ break;
316
+ case 'list':
317
+ await listDisputes(options);
318
+ break;
319
+ }
320
+ }
321
+ //# sourceMappingURL=arbitra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arbitra.js","sourceRoot":"","sources":["../../src/commands/arbitra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Export ClawID to portable package
3
+ */
4
+ export declare function exportClawId(outputPath: string, password: string): Promise<boolean>;
5
+ /**
6
+ * Import ClawID from portable package
7
+ */
8
+ export declare function importClawId(packagePath: string, password: string, force?: boolean): Promise<boolean>;
9
+ /**
10
+ * CLI command handler
11
+ */
12
+ export declare function clawIdCommand(action: 'export' | 'import', options: {
13
+ output?: string;
14
+ file?: string;
15
+ force?: boolean;
16
+ json?: boolean;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=clawid-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawid-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/clawid-cmd.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CA+ElB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CAsGlB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAC3B,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3E,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.exportClawId = exportClawId;
37
+ exports.importClawId = importClawId;
38
+ exports.clawIdCommand = clawIdCommand;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const crypto = __importStar(require("crypto"));
42
+ /**
43
+ * Export ClawID to portable package
44
+ */
45
+ async function exportClawId(outputPath, password) {
46
+ const moltosPath = path.join(process.cwd(), '.moltos');
47
+ const clawIdPath = path.join(moltosPath, 'clawid.json');
48
+ const keyPath = path.join(moltosPath, 'clawid.key');
49
+ if (!fs.existsSync(clawIdPath) || !fs.existsSync(keyPath)) {
50
+ console.error('āŒ No ClawID found. Run "moltos init" first.');
51
+ return false;
52
+ }
53
+ const clawId = JSON.parse(fs.readFileSync(clawIdPath, 'utf8'));
54
+ const encryptedKeyData = JSON.parse(fs.readFileSync(keyPath, 'utf8'));
55
+ // Decrypt private key with stored password
56
+ const keyPassPath = path.join(moltosPath, '.keypass');
57
+ if (!fs.existsSync(keyPassPath)) {
58
+ console.error('āŒ Key password not found. Cannot export.');
59
+ return false;
60
+ }
61
+ const keyPassword = fs.readFileSync(keyPassPath, 'utf8');
62
+ const key = crypto.pbkdf2Sync(keyPassword, Buffer.from(encryptedKeyData.salt, 'base64'), 100000, 32, 'sha256');
63
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, Buffer.from(encryptedKeyData.iv, 'base64'));
64
+ decipher.setAuthTag(Buffer.from(encryptedKeyData.authTag, 'base64'));
65
+ let privateKey = decipher.update(encryptedKeyData.encrypted, 'hex', 'utf8');
66
+ privateKey += decipher.final('utf8');
67
+ // Re-encrypt with export password
68
+ const exportSalt = crypto.randomBytes(16);
69
+ const exportKey = crypto.pbkdf2Sync(password, exportSalt, 100000, 32, 'sha256');
70
+ const exportIv = crypto.randomBytes(12);
71
+ const cipher = crypto.createCipheriv('aes-256-gcm', exportKey, exportIv);
72
+ let encryptedPrivateKey = cipher.update(privateKey, 'utf8', 'hex');
73
+ encryptedPrivateKey += cipher.final('hex');
74
+ const authTag = cipher.getAuthTag();
75
+ // Create package
76
+ const packageData = {
77
+ version: '1.0',
78
+ clawId: clawId.id,
79
+ publicKey: clawId.publicKey,
80
+ encryptedPrivateKey,
81
+ salt: exportSalt.toString('base64'),
82
+ iv: exportIv.toString('base64'),
83
+ authTag: authTag.toString('base64'),
84
+ createdAt: new Date().toISOString(),
85
+ checksum: '', // Will be computed
86
+ };
87
+ // Compute checksum
88
+ const checksumData = { ...packageData, checksum: undefined };
89
+ packageData.checksum = crypto
90
+ .createHash('blake3')
91
+ .update(JSON.stringify(checksumData))
92
+ .digest('hex');
93
+ // Write package
94
+ fs.writeFileSync(outputPath, JSON.stringify(packageData, null, 2));
95
+ console.log(`āœ… ClawID exported: ${outputPath}`);
96
+ console.log(` Identity: ${clawId.id}`);
97
+ console.log(` Created: ${packageData.createdAt}`);
98
+ console.log(` šŸ”’ Encrypted with your password`);
99
+ console.log(`\nāš ļø Keep this file secure. Anyone with the password controls your identity.`);
100
+ return true;
101
+ }
102
+ /**
103
+ * Import ClawID from portable package
104
+ */
105
+ async function importClawId(packagePath, password, force = false) {
106
+ if (!fs.existsSync(packagePath)) {
107
+ console.error(`āŒ Package not found: ${packagePath}`);
108
+ return false;
109
+ }
110
+ const moltosPath = path.join(process.cwd(), '.moltos');
111
+ // Check for existing identity
112
+ const existingClawIdPath = path.join(moltosPath, 'clawid.json');
113
+ if (fs.existsSync(existingClawIdPath) && !force) {
114
+ console.error('āŒ ClawID already exists. Use --force to overwrite.');
115
+ console.error(' Warning: This will replace your current identity!');
116
+ return false;
117
+ }
118
+ // Load and verify package
119
+ const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
120
+ // Verify checksum
121
+ const checksumData = { ...packageData, checksum: undefined };
122
+ const computedChecksum = crypto
123
+ .createHash('blake3')
124
+ .update(JSON.stringify(checksumData))
125
+ .digest('hex');
126
+ if (computedChecksum !== packageData.checksum) {
127
+ console.error('āŒ Package integrity check failed. File may be corrupted.');
128
+ return false;
129
+ }
130
+ // Decrypt private key
131
+ const salt = Buffer.from(packageData.salt, 'base64');
132
+ const iv = Buffer.from(packageData.iv, 'base64');
133
+ const authTag = Buffer.from(packageData.authTag, 'base64');
134
+ const key = crypto.pbkdf2Sync(password, salt, 100000, 32, 'sha256');
135
+ try {
136
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
137
+ decipher.setAuthTag(authTag);
138
+ let privateKey = decipher.update(packageData.encryptedPrivateKey, 'hex', 'utf8');
139
+ privateKey += decipher.final('utf8');
140
+ // Verify keypair integrity
141
+ const { default: ed25519 } = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
142
+ const publicKeyFromPrivate = await ed25519.getPublicKeyAsync(Buffer.from(privateKey, 'base64'));
143
+ if (Buffer.from(publicKeyFromPrivate).toString('base64') !== packageData.publicKey) {
144
+ console.error('āŒ Invalid password or corrupted package.');
145
+ return false;
146
+ }
147
+ // Write to .moltos directory
148
+ fs.mkdirSync(moltosPath, { recursive: true });
149
+ // Store ClawID
150
+ fs.writeFileSync(existingClawIdPath, JSON.stringify({
151
+ id: packageData.clawId,
152
+ publicKey: packageData.publicKey,
153
+ createdAt: new Date().toISOString(),
154
+ }, null, 2));
155
+ // Store encrypted key
156
+ const keySalt = crypto.randomBytes(16);
157
+ const keyIv = crypto.randomBytes(12);
158
+ const keyPass = crypto.randomBytes(32).toString('hex');
159
+ const encryptKey = crypto.pbkdf2Sync(keyPass, keySalt, 100000, 32, 'sha256');
160
+ const keyCipher = crypto.createCipheriv('aes-256-gcm', encryptKey, keyIv);
161
+ let encryptedKey = keyCipher.update(privateKey, 'utf8', 'hex');
162
+ encryptedKey += keyCipher.final('hex');
163
+ const keyAuthTag = keyCipher.getAuthTag();
164
+ fs.writeFileSync(path.join(moltosPath, 'clawid.key'), JSON.stringify({
165
+ encrypted: encryptedKey,
166
+ salt: keySalt.toString('base64'),
167
+ iv: keyIv.toString('base64'),
168
+ authTag: keyAuthTag.toString('base64'),
169
+ }, null, 2));
170
+ // Store password
171
+ fs.writeFileSync(path.join(moltosPath, '.keypass'), keyPass);
172
+ console.log(`āœ… ClawID imported: ${packageData.clawId}`);
173
+ console.log(` Original export: ${packageData.createdAt}`);
174
+ console.log(` Identity ready to use`);
175
+ return true;
176
+ }
177
+ catch (err) {
178
+ console.error('āŒ Import failed. Wrong password or corrupted package.');
179
+ return false;
180
+ }
181
+ }
182
+ /**
183
+ * CLI command handler
184
+ */
185
+ async function clawIdCommand(action, options) {
186
+ switch (action) {
187
+ case 'export': {
188
+ const outputPath = options.output || `clawid-${Date.now()}.json`;
189
+ // Prompt for password (in real implementation, use inquirer)
190
+ console.log('šŸ” Enter export password (this will encrypt your private key):');
191
+ // For now, use a generated secure password
192
+ const password = crypto.randomBytes(32).toString('hex');
193
+ console.log(` (Generated secure password: ${password.slice(0, 16)}...)`);
194
+ console.log(` Save this password! You'll need it to import.`);
195
+ const success = await exportClawId(outputPath, password);
196
+ if (success && options.json) {
197
+ console.log(JSON.stringify({ success: true, path: outputPath }));
198
+ }
199
+ break;
200
+ }
201
+ case 'import': {
202
+ if (!options.file) {
203
+ console.error('āŒ Required: --file <package.json>');
204
+ return;
205
+ }
206
+ console.log('šŸ” Enter import password:');
207
+ // Mock password for demo
208
+ const password = 'demo-password-change-in-production';
209
+ const success = await importClawId(options.file, password, options.force);
210
+ if (success && options.json) {
211
+ console.log(JSON.stringify({ success: true, clawId: 'imported' }));
212
+ }
213
+ break;
214
+ }
215
+ }
216
+ }
217
+ //# sourceMappingURL=clawid-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawid-cmd.js","sourceRoot":"","sources":["../../src/commands/clawid-cmd.ts"],"names":[],"mappings":"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"}