shogun-core 3.3.5 → 3.3.7

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.
Files changed (149) hide show
  1. package/dist/browser/shogun-core.js +81267 -192044
  2. package/dist/browser/shogun-core.js.map +1 -1
  3. package/dist/{src/core.js → core.js} +2 -2
  4. package/dist/{src/gundb → gundb}/db.js +44 -15
  5. package/dist/{src/index.js → index.js} +0 -1
  6. package/dist/{src/managers → managers}/AuthManager.js +4 -3
  7. package/dist/{src/managers → managers}/CoreInitializer.js +1 -7
  8. package/dist/{src/storage → storage}/storage.js +0 -16
  9. package/dist/types/{src/core.d.ts → core.d.ts} +1 -1
  10. package/dist/types/{src/gundb → gundb}/db.d.ts +15 -6
  11. package/dist/types/{src/index.d.ts → index.d.ts} +0 -1
  12. package/dist/types/{src/interfaces → interfaces}/events.d.ts +1 -1
  13. package/dist/types/{src/interfaces → interfaces}/shogun.d.ts +7 -1
  14. package/dist/types/{src/managers → managers}/AuthManager.d.ts +1 -1
  15. package/package.json +10 -26
  16. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_axios_index_js.shogun-core.js +0 -4078
  17. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_axios_index_js.shogun-core.js.map +0 -1
  18. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_is-ipfs_dist_src_index_js.shogun-core.js +0 -4908
  19. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_is-ipfs_dist_src_index_js.shogun-core.js.map +0 -1
  20. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_uint8-varint_dist_src_index_js-node_modu-0db5ba.shogun-core.js +0 -2109
  21. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_uint8-varint_dist_src_index_js-node_modu-0db5ba.shogun-core.js.map +0 -1
  22. package/dist/ship/examples/identity-cli.js +0 -511
  23. package/dist/ship/examples/messenger-cli.js +0 -745
  24. package/dist/ship/examples/stealth-cli.js +0 -433
  25. package/dist/ship/examples/storage-cli.js +0 -615
  26. package/dist/ship/examples/vault-cli.js +0 -444
  27. package/dist/ship/examples/wallet-cli.js +0 -767
  28. package/dist/ship/implementation/SHIP_00.js +0 -478
  29. package/dist/ship/implementation/SHIP_01.js +0 -433
  30. package/dist/ship/implementation/SHIP_02.js +0 -1366
  31. package/dist/ship/implementation/SHIP_03.js +0 -855
  32. package/dist/ship/implementation/SHIP_04.js +0 -589
  33. package/dist/ship/implementation/SHIP_05.js +0 -1064
  34. package/dist/ship/implementation/SHIP_06.js +0 -635
  35. package/dist/ship/index.js +0 -17
  36. package/dist/ship/interfaces/ISHIP_00.js +0 -135
  37. package/dist/ship/interfaces/ISHIP_01.js +0 -128
  38. package/dist/ship/interfaces/ISHIP_02.js +0 -57
  39. package/dist/ship/interfaces/ISHIP_03.js +0 -61
  40. package/dist/ship/interfaces/ISHIP_04.js +0 -62
  41. package/dist/ship/interfaces/ISHIP_05.js +0 -59
  42. package/dist/ship/interfaces/ISHIP_06.js +0 -194
  43. package/dist/src/types/events.js +0 -70
  44. package/dist/src/types/shogun.js +0 -21
  45. package/dist/types/ship/examples/identity-cli.d.ts +0 -40
  46. package/dist/types/ship/examples/messenger-cli.d.ts +0 -37
  47. package/dist/types/ship/examples/stealth-cli.d.ts +0 -31
  48. package/dist/types/ship/examples/storage-cli.d.ts +0 -48
  49. package/dist/types/ship/examples/vault-cli.d.ts +0 -13
  50. package/dist/types/ship/examples/wallet-cli.d.ts +0 -131
  51. package/dist/types/ship/implementation/SHIP_00.d.ts +0 -113
  52. package/dist/types/ship/implementation/SHIP_01.d.ts +0 -80
  53. package/dist/types/ship/implementation/SHIP_02.d.ts +0 -297
  54. package/dist/types/ship/implementation/SHIP_03.d.ts +0 -127
  55. package/dist/types/ship/implementation/SHIP_04.d.ts +0 -76
  56. package/dist/types/ship/implementation/SHIP_05.d.ts +0 -70
  57. package/dist/types/ship/implementation/SHIP_06.d.ts +0 -101
  58. package/dist/types/ship/index.d.ts +0 -14
  59. package/dist/types/ship/interfaces/ISHIP_00.d.ts +0 -410
  60. package/dist/types/ship/interfaces/ISHIP_01.d.ts +0 -343
  61. package/dist/types/ship/interfaces/ISHIP_02.d.ts +0 -470
  62. package/dist/types/ship/interfaces/ISHIP_03.d.ts +0 -295
  63. package/dist/types/ship/interfaces/ISHIP_04.d.ts +0 -245
  64. package/dist/types/ship/interfaces/ISHIP_05.d.ts +0 -234
  65. package/dist/types/ship/interfaces/ISHIP_06.d.ts +0 -522
  66. package/dist/types/src/types/events.d.ts +0 -59
  67. package/dist/types/src/types/shogun.d.ts +0 -188
  68. /package/dist/{src/config → config}/simplified-config.js +0 -0
  69. /package/dist/{src/examples → examples}/api-test.js +0 -0
  70. /package/dist/{src/examples → examples}/simple-api-test.js +0 -0
  71. /package/dist/{src/gundb → gundb}/api.js +0 -0
  72. /package/dist/{src/gundb → gundb}/crypto.js +0 -0
  73. /package/dist/{src/gundb → gundb}/derive.js +0 -0
  74. /package/dist/{src/gundb → gundb}/errors.js +0 -0
  75. /package/dist/{src/gundb → gundb}/index.js +0 -0
  76. /package/dist/{src/gundb → gundb}/rxjs.js +0 -0
  77. /package/dist/{src/gundb → gundb}/types.js +0 -0
  78. /package/dist/{src/interfaces → interfaces}/common.js +0 -0
  79. /package/dist/{src/interfaces → interfaces}/events.js +0 -0
  80. /package/dist/{src/interfaces → interfaces}/plugin.js +0 -0
  81. /package/dist/{src/interfaces → interfaces}/shogun.js +0 -0
  82. /package/dist/{src/managers → managers}/EventManager.js +0 -0
  83. /package/dist/{src/managers → managers}/PluginManager.js +0 -0
  84. /package/dist/{src/migration-test.js → migration-test.js} +0 -0
  85. /package/dist/{src/plugins → plugins}/base.js +0 -0
  86. /package/dist/{src/plugins → plugins}/index.js +0 -0
  87. /package/dist/{src/plugins → plugins}/nostr/index.js +0 -0
  88. /package/dist/{src/plugins → plugins}/nostr/nostrConnector.js +0 -0
  89. /package/dist/{src/plugins → plugins}/nostr/nostrConnectorPlugin.js +0 -0
  90. /package/dist/{src/plugins → plugins}/nostr/nostrSigner.js +0 -0
  91. /package/dist/{src/plugins → plugins}/nostr/types.js +0 -0
  92. /package/dist/{src/plugins → plugins}/oauth/index.js +0 -0
  93. /package/dist/{src/plugins → plugins}/oauth/oauthConnector.js +0 -0
  94. /package/dist/{src/plugins → plugins}/oauth/oauthPlugin.js +0 -0
  95. /package/dist/{src/plugins → plugins}/oauth/types.js +0 -0
  96. /package/dist/{src/plugins → plugins}/web3/index.js +0 -0
  97. /package/dist/{src/plugins → plugins}/web3/types.js +0 -0
  98. /package/dist/{src/plugins → plugins}/web3/web3Connector.js +0 -0
  99. /package/dist/{src/plugins → plugins}/web3/web3ConnectorPlugin.js +0 -0
  100. /package/dist/{src/plugins → plugins}/web3/web3Signer.js +0 -0
  101. /package/dist/{src/plugins → plugins}/webauthn/index.js +0 -0
  102. /package/dist/{src/plugins → plugins}/webauthn/types.js +0 -0
  103. /package/dist/{src/plugins → plugins}/webauthn/webauthn.js +0 -0
  104. /package/dist/{src/plugins → plugins}/webauthn/webauthnPlugin.js +0 -0
  105. /package/dist/{src/plugins → plugins}/webauthn/webauthnSigner.js +0 -0
  106. /package/dist/types/{src/config → config}/simplified-config.d.ts +0 -0
  107. /package/dist/types/{src/examples → examples}/api-test.d.ts +0 -0
  108. /package/dist/types/{src/examples → examples}/simple-api-test.d.ts +0 -0
  109. /package/dist/types/{src/gundb → gundb}/api.d.ts +0 -0
  110. /package/dist/types/{src/gundb → gundb}/crypto.d.ts +0 -0
  111. /package/dist/types/{src/gundb → gundb}/derive.d.ts +0 -0
  112. /package/dist/types/{src/gundb → gundb}/errors.d.ts +0 -0
  113. /package/dist/types/{src/gundb → gundb}/index.d.ts +0 -0
  114. /package/dist/types/{src/gundb → gundb}/rxjs.d.ts +0 -0
  115. /package/dist/types/{src/gundb → gundb}/types.d.ts +0 -0
  116. /package/dist/types/{src/interfaces → interfaces}/common.d.ts +0 -0
  117. /package/dist/types/{src/interfaces → interfaces}/plugin.d.ts +0 -0
  118. /package/dist/types/{src/managers → managers}/CoreInitializer.d.ts +0 -0
  119. /package/dist/types/{src/managers → managers}/EventManager.d.ts +0 -0
  120. /package/dist/types/{src/managers → managers}/PluginManager.d.ts +0 -0
  121. /package/dist/types/{src/migration-test.d.ts → migration-test.d.ts} +0 -0
  122. /package/dist/types/{src/plugins → plugins}/base.d.ts +0 -0
  123. /package/dist/types/{src/plugins → plugins}/index.d.ts +0 -0
  124. /package/dist/types/{src/plugins → plugins}/nostr/index.d.ts +0 -0
  125. /package/dist/types/{src/plugins → plugins}/nostr/nostrConnector.d.ts +0 -0
  126. /package/dist/types/{src/plugins → plugins}/nostr/nostrConnectorPlugin.d.ts +0 -0
  127. /package/dist/types/{src/plugins → plugins}/nostr/nostrSigner.d.ts +0 -0
  128. /package/dist/types/{src/plugins → plugins}/nostr/types.d.ts +0 -0
  129. /package/dist/types/{src/plugins → plugins}/oauth/index.d.ts +0 -0
  130. /package/dist/types/{src/plugins → plugins}/oauth/oauthConnector.d.ts +0 -0
  131. /package/dist/types/{src/plugins → plugins}/oauth/oauthPlugin.d.ts +0 -0
  132. /package/dist/types/{src/plugins → plugins}/oauth/types.d.ts +0 -0
  133. /package/dist/types/{src/plugins → plugins}/web3/index.d.ts +0 -0
  134. /package/dist/types/{src/plugins → plugins}/web3/types.d.ts +0 -0
  135. /package/dist/types/{src/plugins → plugins}/web3/web3Connector.d.ts +0 -0
  136. /package/dist/types/{src/plugins → plugins}/web3/web3ConnectorPlugin.d.ts +0 -0
  137. /package/dist/types/{src/plugins → plugins}/web3/web3Signer.d.ts +0 -0
  138. /package/dist/types/{src/plugins → plugins}/webauthn/index.d.ts +0 -0
  139. /package/dist/types/{src/plugins → plugins}/webauthn/types.d.ts +0 -0
  140. /package/dist/types/{src/plugins → plugins}/webauthn/webauthn.d.ts +0 -0
  141. /package/dist/types/{src/plugins → plugins}/webauthn/webauthnPlugin.d.ts +0 -0
  142. /package/dist/types/{src/plugins → plugins}/webauthn/webauthnSigner.d.ts +0 -0
  143. /package/dist/types/{src/storage → storage}/storage.d.ts +0 -0
  144. /package/dist/types/{src/utils → utils}/errorHandler.d.ts +0 -0
  145. /package/dist/types/{src/utils → utils}/eventEmitter.d.ts +0 -0
  146. /package/dist/types/{src/utils → utils}/validation.d.ts +0 -0
  147. /package/dist/{src/utils → utils}/errorHandler.js +0 -0
  148. /package/dist/{src/utils → utils}/eventEmitter.js +0 -0
  149. /package/dist/{src/utils → utils}/validation.js +0 -0
@@ -1,511 +0,0 @@
1
- #!/usr/bin/env tsx
2
- "use strict";
3
- /**
4
- * SHIP-00 Identity CLI Example
5
- *
6
- * Interactive CLI demonstrating SHIP-00 identity and authentication
7
- *
8
- * Usage:
9
- * yarn identity <username> <password>
10
- *
11
- * Features:
12
- * - User signup and login
13
- * - Login with keypair (multi-device)
14
- * - Public key publication
15
- * - User discovery and lookup
16
- * - Key pair export/import
17
- * - Ethereum address derivation
18
- */
19
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
- if (k2 === undefined) k2 = k;
21
- var desc = Object.getOwnPropertyDescriptor(m, k);
22
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
- desc = { enumerable: true, get: function() { return m[k]; } };
24
- }
25
- Object.defineProperty(o, k2, desc);
26
- }) : (function(o, m, k, k2) {
27
- if (k2 === undefined) k2 = k;
28
- o[k2] = m[k];
29
- }));
30
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
- Object.defineProperty(o, "default", { enumerable: true, value: v });
32
- }) : function(o, v) {
33
- o["default"] = v;
34
- });
35
- var __importStar = (this && this.__importStar) || (function () {
36
- var ownKeys = function(o) {
37
- ownKeys = Object.getOwnPropertyNames || function (o) {
38
- var ar = [];
39
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
- return ar;
41
- };
42
- return ownKeys(o);
43
- };
44
- return function (mod) {
45
- if (mod && mod.__esModule) return mod;
46
- var result = {};
47
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
- __setModuleDefault(result, mod);
49
- return result;
50
- };
51
- })();
52
- var __importDefault = (this && this.__importDefault) || function (mod) {
53
- return (mod && mod.__esModule) ? mod : { "default": mod };
54
- };
55
- Object.defineProperty(exports, "__esModule", { value: true });
56
- exports.IdentityCLI = void 0;
57
- const SHIP_00_1 = require("../implementation/SHIP_00");
58
- const readline = __importStar(require("readline"));
59
- const fs = __importStar(require("fs"));
60
- const figlet_1 = __importDefault(require("figlet"));
61
- // ============================================================================
62
- // CLI Interface
63
- // ============================================================================
64
- class IdentityCLI {
65
- constructor() {
66
- this.username = "";
67
- this.running = false;
68
- // Initialize SHIP-00 with hardcoded peers
69
- this.identity = new SHIP_00_1.SHIP_00({
70
- gunOptions: {
71
- peers: [
72
- "https://peer.wallie.io/gun",
73
- "https://v5g5jseqhgkp43lppgregcfbvi.srv.us/gun",
74
- "https://relay.shogun-eco.xyz/gun",
75
- ],
76
- radisk: true,
77
- localStorage: false,
78
- },
79
- });
80
- this.rl = readline.createInterface({
81
- input: process.stdin,
82
- output: process.stdout,
83
- });
84
- }
85
- // ==========================================================================
86
- // Authentication
87
- // ==========================================================================
88
- async login(username, password) {
89
- console.log(`\n🔐 Logging in as ${username}...`);
90
- try {
91
- // Try login first
92
- let result = await this.identity.login(username, password);
93
- if (!result.success) {
94
- // If login fails, offer to register
95
- console.log("📝 User not found, creating new identity...");
96
- const signupResult = await this.identity.signup(username, password);
97
- if (!signupResult.success) {
98
- console.error(`❌ Registration failed: ${signupResult.error}`);
99
- return false;
100
- }
101
- // Login after signup
102
- await new Promise((resolve) => setTimeout(resolve, 1000));
103
- result = await this.identity.login(username, password);
104
- }
105
- if (result.success) {
106
- this.username = username;
107
- console.log("\n✅ Authentication Successful!");
108
- console.log("━".repeat(60));
109
- console.log(` Username: ${username}`);
110
- console.log(` Public Key: ${result.userPub?.substring(0, 40)}...`);
111
- console.log(` Derived Address: ${result.derivedAddress}`);
112
- console.log("━".repeat(60));
113
- // Publish public key for discovery
114
- console.log("\n📢 Publishing public key to network...");
115
- await this.identity.publishPublicKey();
116
- await new Promise((resolve) => setTimeout(resolve, 1000));
117
- console.log("✅ Public key published!");
118
- return true;
119
- }
120
- else {
121
- console.error(`❌ Login failed: ${result.error}`);
122
- return false;
123
- }
124
- }
125
- catch (error) {
126
- console.error(`❌ Error: ${error.message}`);
127
- return false;
128
- }
129
- }
130
- async loginWithKeypair() {
131
- console.log("\n🔑 Login with Key Pair");
132
- console.log("━".repeat(60));
133
- const keypairStr = await this.prompt("Enter key pair (base64 or JSON): ");
134
- try {
135
- let seaPair;
136
- // Try base64 decode
137
- try {
138
- const decoded = Buffer.from(keypairStr.trim(), "base64").toString("utf-8");
139
- seaPair = JSON.parse(decoded);
140
- }
141
- catch {
142
- // Try direct JSON parse
143
- seaPair = JSON.parse(keypairStr.trim());
144
- }
145
- // Validate keypair
146
- if (!seaPair.pub || !seaPair.priv || !seaPair.epub || !seaPair.epriv) {
147
- throw new Error("Invalid keypair structure");
148
- }
149
- console.log("\n🔐 Authenticating with keypair...");
150
- const result = await this.identity.loginWithPair(seaPair);
151
- if (result.success) {
152
- this.username = result.username || seaPair.alias || "unknown";
153
- console.log("\n✅ Login Successful!");
154
- console.log("━".repeat(60));
155
- console.log(` Username: ${this.username}`);
156
- console.log(` Public Key: ${seaPair.pub.substring(0, 40)}...`);
157
- console.log(` Derived Address: ${result.derivedAddress}`);
158
- console.log("━".repeat(60));
159
- // Publish public key
160
- await this.identity.publishPublicKey();
161
- console.log("✅ Public key published!");
162
- }
163
- else {
164
- console.error(`❌ Login failed: ${result.error}`);
165
- }
166
- }
167
- catch (error) {
168
- console.error(`❌ Error: ${error.message}`);
169
- }
170
- }
171
- // ==========================================================================
172
- // Key Management
173
- // ==========================================================================
174
- async exportKeypair() {
175
- console.log("\n📤 Export Key Pair");
176
- console.log("━".repeat(60));
177
- const keypair = this.identity.exportKeyPair();
178
- if (!keypair) {
179
- console.error("❌ Not logged in");
180
- return;
181
- }
182
- // Create export object
183
- const exportData = {
184
- ...keypair,
185
- alias: this.username,
186
- exportedAt: Date.now(),
187
- };
188
- // Base64 encode
189
- const jsonString = JSON.stringify(exportData);
190
- const base64 = Buffer.from(jsonString).toString("base64");
191
- console.log("\n✅ KEY PAIR EXPORTED");
192
- console.log("═".repeat(60));
193
- console.log("\n🔑 Base64 Format:");
194
- console.log(base64);
195
- console.log("\n🔑 JSON Format:");
196
- console.log(JSON.stringify(exportData, null, 2));
197
- console.log("\n═".repeat(60));
198
- // Save to file
199
- const filename = `shogun-identity-${this.username}-${Date.now()}.txt`;
200
- fs.writeFileSync(filename, base64);
201
- console.log(`\n💾 Saved to: ${filename}`);
202
- console.log("\n⚠️ KEEP THIS SAFE! Contains your private keys!");
203
- console.log("━".repeat(60));
204
- }
205
- async showCurrentUser() {
206
- console.log("\n👤 Current User Info");
207
- console.log("━".repeat(60));
208
- const currentUser = this.identity.getCurrentUser();
209
- if (!currentUser) {
210
- console.log("❌ Not logged in");
211
- return;
212
- }
213
- console.log(` Alias: ${currentUser.alias}`);
214
- console.log(` Public Key: ${currentUser.pub}`);
215
- console.log(` Encryption Key: ${currentUser.epub}`);
216
- // Derive Ethereum address
217
- const ethAddress = await this.identity.deriveEthereumAddress();
218
- console.log(` Ethereum Address: ${ethAddress}`);
219
- console.log("━".repeat(60));
220
- }
221
- async showPublicKey() {
222
- console.log("\n🔑 Your Public Keys");
223
- console.log("━".repeat(60));
224
- const keypair = this.identity.getKeyPair();
225
- if (!keypair) {
226
- console.log("❌ Not logged in");
227
- return;
228
- }
229
- console.log("\n📝 Signing Keys:");
230
- console.log(` Public: ${keypair.pub}`);
231
- console.log(` Private: ${keypair.priv.substring(0, 20)}... (hidden)`);
232
- console.log("\n🔐 Encryption Keys:");
233
- console.log(` Public: ${keypair.epub}`);
234
- console.log(` Private: ${keypair.epriv.substring(0, 20)}... (hidden)`);
235
- console.log("\n💡 Share the PUBLIC keys only!");
236
- console.log("━".repeat(60));
237
- }
238
- // ==========================================================================
239
- // User Discovery
240
- // ==========================================================================
241
- async lookupUser() {
242
- console.log("\n🔍 Lookup User");
243
- console.log("━".repeat(60));
244
- const username = await this.prompt("Enter username to lookup: ");
245
- if (!username.trim()) {
246
- console.log("❌ Username required");
247
- return;
248
- }
249
- console.log(`\n🔍 Searching for ${username}...`);
250
- // Check if exists
251
- const exists = await this.identity.userExists(username.trim());
252
- if (!exists) {
253
- console.log(`\n❌ User not found: ${username}`);
254
- console.log("\n💡 User may not have registered yet");
255
- return;
256
- }
257
- // Get user data
258
- const userData = await this.identity.getUserByAlias(username.trim());
259
- if (userData) {
260
- console.log(`\n✅ User Found:`);
261
- console.log("━".repeat(60));
262
- console.log(` Username: ${userData.username}`);
263
- console.log(` Public Key: ${userData.userPub}`);
264
- console.log(` Encryption Key: ${userData.epub || "Not published"}`);
265
- if (userData.registeredAt) {
266
- console.log(` Registered: ${new Date(userData.registeredAt).toLocaleString()}`);
267
- }
268
- if (userData.lastSeen) {
269
- console.log(` Last Seen: ${new Date(userData.lastSeen).toLocaleString()}`);
270
- }
271
- }
272
- // Get public key data
273
- const publicKey = await this.identity.getPublicKey(username.trim());
274
- if (publicKey) {
275
- console.log("\n📝 Published Keys:");
276
- console.log(` Signing: ${publicKey.pub.substring(0, 40)}...`);
277
- console.log(` Encryption: ${publicKey.epub.substring(0, 40)}...`);
278
- if (publicKey.timestamp) {
279
- console.log(` Published: ${new Date(parseInt(publicKey.timestamp)).toLocaleString()}`);
280
- }
281
- }
282
- else {
283
- console.log("\n⚠️ User has not published public keys yet");
284
- }
285
- console.log("━".repeat(60));
286
- }
287
- async lookupByPublicKey() {
288
- console.log("\n🔍 Lookup by Public Key");
289
- console.log("━".repeat(60));
290
- const pubKey = await this.prompt("Enter public key: ");
291
- if (!pubKey.trim()) {
292
- console.log("❌ Public key required");
293
- return;
294
- }
295
- console.log(`\n🔍 Searching for public key...`);
296
- const userData = await this.identity.getUserByPub(pubKey.trim());
297
- if (!userData) {
298
- console.log(`\n❌ No user found for this public key`);
299
- return;
300
- }
301
- console.log(`\n✅ User Found:`);
302
- console.log("━".repeat(60));
303
- console.log(` Username: ${userData.username || "Unknown"}`);
304
- console.log(` Public Key: ${userData.userPub}`);
305
- console.log(` Encryption Key: ${userData.epub || "Not available"}`);
306
- console.log("━".repeat(60));
307
- }
308
- // ==========================================================================
309
- // Menu
310
- // ==========================================================================
311
- async showMenu() {
312
- while (this.running) {
313
- console.log("\n🗡️ SHIP-00 Identity Manager");
314
- console.log("━".repeat(60));
315
- console.log("1. View Current User");
316
- console.log("2. View Public Keys");
317
- console.log("3. Export Key Pair (Backup)");
318
- console.log("4. Login with Key Pair");
319
- console.log("5. Lookup User by Username");
320
- console.log("6. Lookup User by Public Key");
321
- console.log("7. Derive Ethereum Address");
322
- console.log("8. Publish Public Key");
323
- console.log("9. Logout");
324
- console.log("10. Exit");
325
- console.log("━".repeat(60));
326
- const choice = await this.prompt("\nChoose option: ");
327
- switch (choice.trim()) {
328
- case "1":
329
- await this.showCurrentUser();
330
- break;
331
- case "2":
332
- await this.showPublicKey();
333
- break;
334
- case "3":
335
- await this.exportKeypair();
336
- break;
337
- case "4":
338
- await this.loginWithKeypair();
339
- break;
340
- case "5":
341
- await this.lookupUser();
342
- break;
343
- case "6":
344
- await this.lookupByPublicKey();
345
- break;
346
- case "7":
347
- await this.deriveAddress();
348
- break;
349
- case "8":
350
- await this.publishPublicKey();
351
- break;
352
- case "9":
353
- await this.logout();
354
- break;
355
- case "10":
356
- this.running = false;
357
- console.log("\n👋 Goodbye!");
358
- this.cleanup();
359
- return;
360
- default:
361
- console.log("❌ Invalid choice");
362
- }
363
- }
364
- }
365
- async deriveAddress() {
366
- console.log("\n🔗 Derive Ethereum Address");
367
- console.log("━".repeat(60));
368
- if (!this.identity.isLoggedIn()) {
369
- console.log("❌ Not logged in");
370
- return;
371
- }
372
- const address = await this.identity.deriveEthereumAddress();
373
- console.log(`\n✅ Ethereum Address: ${address}`);
374
- console.log("\n💡 This address is deterministically derived from your SHIP-00 identity");
375
- console.log("💡 Same identity = same address (always)");
376
- console.log("━".repeat(60));
377
- }
378
- async publishPublicKey() {
379
- console.log("\n📢 Publish Public Key");
380
- console.log("━".repeat(60));
381
- if (!this.identity.isLoggedIn()) {
382
- console.log("❌ Not logged in");
383
- return;
384
- }
385
- const result = await this.identity.publishPublicKey();
386
- if (result.success) {
387
- console.log("✅ Public key published to Gun network!");
388
- console.log("💡 Other users can now discover you and send encrypted messages");
389
- }
390
- else {
391
- console.error(`❌ Error: ${result.error}`);
392
- }
393
- console.log("━".repeat(60));
394
- }
395
- async logout() {
396
- console.log("\n👋 Logout");
397
- console.log("━".repeat(60));
398
- if (!this.identity.isLoggedIn()) {
399
- console.log("❌ Not logged in");
400
- return;
401
- }
402
- this.identity.logout();
403
- this.username = "";
404
- console.log("✅ Logged out successfully");
405
- console.log("💡 Your data remains on the Gun network");
406
- console.log("━".repeat(60));
407
- }
408
- // ==========================================================================
409
- // Utilities
410
- // ==========================================================================
411
- printHeader() {
412
- (0, figlet_1.default)("SHOGUN IDENTITY", { font: 'Standard' }, function (err, data) {
413
- if (err) {
414
- console.log('Qualcosa è andato storto...');
415
- console.dir(err);
416
- return;
417
- }
418
- console.log(data);
419
- });
420
- }
421
- async prompt(question) {
422
- return new Promise((resolve) => {
423
- this.rl.question(question, (answer) => {
424
- resolve(answer);
425
- });
426
- });
427
- }
428
- cleanup() {
429
- this.rl.close();
430
- process.exit(0);
431
- }
432
- async start(username, password) {
433
- this.printHeader();
434
- if (username && password) {
435
- // Auto-login
436
- const success = await this.login(username, password);
437
- if (success) {
438
- this.running = true;
439
- await this.showMenu();
440
- }
441
- else {
442
- console.log("\n❌ Authentication failed");
443
- this.cleanup();
444
- }
445
- }
446
- else {
447
- // Manual login
448
- console.log("\n💡 Commands:");
449
- console.log(" yarn identity <username> <password> - Auto-login");
450
- console.log(" yarn identity - Manual login");
451
- const choice = await this.prompt("\n1. Login\n2. Login with Keypair\n3. Exit\n\nChoose option: ");
452
- switch (choice.trim()) {
453
- case "1":
454
- const user = await this.prompt("Username: ");
455
- const pass = await this.prompt("Password: ");
456
- const success = await this.login(user, pass);
457
- if (success) {
458
- this.running = true;
459
- await this.showMenu();
460
- }
461
- else {
462
- this.cleanup();
463
- }
464
- break;
465
- case "2":
466
- await this.loginWithKeypair();
467
- if (this.identity.isLoggedIn()) {
468
- this.running = true;
469
- await this.showMenu();
470
- }
471
- else {
472
- this.cleanup();
473
- }
474
- break;
475
- case "3":
476
- this.cleanup();
477
- break;
478
- default:
479
- console.log("❌ Invalid choice");
480
- this.cleanup();
481
- }
482
- }
483
- }
484
- }
485
- exports.IdentityCLI = IdentityCLI;
486
- // ============================================================================
487
- // Main Entry Point
488
- // ============================================================================
489
- async function main() {
490
- const args = process.argv.slice(2);
491
- const cli = new IdentityCLI();
492
- try {
493
- if (args.length >= 2) {
494
- // Auto-login mode
495
- const [username, password] = args;
496
- await cli.start(username, password);
497
- }
498
- else {
499
- // Manual login mode
500
- await cli.start();
501
- }
502
- }
503
- catch (error) {
504
- console.error("\n❌ Error:", error);
505
- process.exit(1);
506
- }
507
- }
508
- // Run if called directly
509
- if (require.main === module) {
510
- main();
511
- }