shogun-core 3.3.5 → 3.3.6

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 +79919 -190726
  2. package/dist/browser/shogun-core.js.map +1 -1
  3. package/dist/{src/index.js → index.js} +0 -1
  4. package/dist/{src/managers → managers}/CoreInitializer.js +0 -6
  5. package/dist/{src/storage → storage}/storage.js +0 -16
  6. package/dist/types/{src/index.d.ts → index.d.ts} +0 -1
  7. package/package.json +10 -26
  8. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_axios_index_js.shogun-core.js +0 -4078
  9. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_axios_index_js.shogun-core.js.map +0 -1
  10. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_is-ipfs_dist_src_index_js.shogun-core.js +0 -4908
  11. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_is-ipfs_dist_src_index_js.shogun-core.js.map +0 -1
  12. package/dist/browser/defaultVendors-node_modules_shogun-ipfs_node_modules_uint8-varint_dist_src_index_js-node_modu-0db5ba.shogun-core.js +0 -2109
  13. 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
  14. package/dist/ship/examples/identity-cli.js +0 -511
  15. package/dist/ship/examples/messenger-cli.js +0 -745
  16. package/dist/ship/examples/stealth-cli.js +0 -433
  17. package/dist/ship/examples/storage-cli.js +0 -615
  18. package/dist/ship/examples/vault-cli.js +0 -444
  19. package/dist/ship/examples/wallet-cli.js +0 -767
  20. package/dist/ship/implementation/SHIP_00.js +0 -478
  21. package/dist/ship/implementation/SHIP_01.js +0 -433
  22. package/dist/ship/implementation/SHIP_02.js +0 -1366
  23. package/dist/ship/implementation/SHIP_03.js +0 -855
  24. package/dist/ship/implementation/SHIP_04.js +0 -589
  25. package/dist/ship/implementation/SHIP_05.js +0 -1064
  26. package/dist/ship/implementation/SHIP_06.js +0 -635
  27. package/dist/ship/index.js +0 -17
  28. package/dist/ship/interfaces/ISHIP_00.js +0 -135
  29. package/dist/ship/interfaces/ISHIP_01.js +0 -128
  30. package/dist/ship/interfaces/ISHIP_02.js +0 -57
  31. package/dist/ship/interfaces/ISHIP_03.js +0 -61
  32. package/dist/ship/interfaces/ISHIP_04.js +0 -62
  33. package/dist/ship/interfaces/ISHIP_05.js +0 -59
  34. package/dist/ship/interfaces/ISHIP_06.js +0 -194
  35. package/dist/types/ship/examples/identity-cli.d.ts +0 -40
  36. package/dist/types/ship/examples/messenger-cli.d.ts +0 -37
  37. package/dist/types/ship/examples/stealth-cli.d.ts +0 -31
  38. package/dist/types/ship/examples/storage-cli.d.ts +0 -48
  39. package/dist/types/ship/examples/vault-cli.d.ts +0 -13
  40. package/dist/types/ship/examples/wallet-cli.d.ts +0 -131
  41. package/dist/types/ship/implementation/SHIP_00.d.ts +0 -113
  42. package/dist/types/ship/implementation/SHIP_01.d.ts +0 -80
  43. package/dist/types/ship/implementation/SHIP_02.d.ts +0 -297
  44. package/dist/types/ship/implementation/SHIP_03.d.ts +0 -127
  45. package/dist/types/ship/implementation/SHIP_04.d.ts +0 -76
  46. package/dist/types/ship/implementation/SHIP_05.d.ts +0 -70
  47. package/dist/types/ship/implementation/SHIP_06.d.ts +0 -101
  48. package/dist/types/ship/index.d.ts +0 -14
  49. package/dist/types/ship/interfaces/ISHIP_00.d.ts +0 -410
  50. package/dist/types/ship/interfaces/ISHIP_01.d.ts +0 -343
  51. package/dist/types/ship/interfaces/ISHIP_02.d.ts +0 -470
  52. package/dist/types/ship/interfaces/ISHIP_03.d.ts +0 -295
  53. package/dist/types/ship/interfaces/ISHIP_04.d.ts +0 -245
  54. package/dist/types/ship/interfaces/ISHIP_05.d.ts +0 -234
  55. package/dist/types/ship/interfaces/ISHIP_06.d.ts +0 -522
  56. /package/dist/{src/config → config}/simplified-config.js +0 -0
  57. /package/dist/{src/core.js → core.js} +0 -0
  58. /package/dist/{src/examples → examples}/api-test.js +0 -0
  59. /package/dist/{src/examples → examples}/simple-api-test.js +0 -0
  60. /package/dist/{src/gundb → gundb}/api.js +0 -0
  61. /package/dist/{src/gundb → gundb}/crypto.js +0 -0
  62. /package/dist/{src/gundb → gundb}/db.js +0 -0
  63. /package/dist/{src/gundb → gundb}/derive.js +0 -0
  64. /package/dist/{src/gundb → gundb}/errors.js +0 -0
  65. /package/dist/{src/gundb → gundb}/index.js +0 -0
  66. /package/dist/{src/gundb → gundb}/rxjs.js +0 -0
  67. /package/dist/{src/gundb → gundb}/types.js +0 -0
  68. /package/dist/{src/interfaces → interfaces}/common.js +0 -0
  69. /package/dist/{src/interfaces → interfaces}/events.js +0 -0
  70. /package/dist/{src/interfaces → interfaces}/plugin.js +0 -0
  71. /package/dist/{src/interfaces → interfaces}/shogun.js +0 -0
  72. /package/dist/{src/managers → managers}/AuthManager.js +0 -0
  73. /package/dist/{src/managers → managers}/EventManager.js +0 -0
  74. /package/dist/{src/managers → managers}/PluginManager.js +0 -0
  75. /package/dist/{src/migration-test.js → migration-test.js} +0 -0
  76. /package/dist/{src/plugins → plugins}/base.js +0 -0
  77. /package/dist/{src/plugins → plugins}/index.js +0 -0
  78. /package/dist/{src/plugins → plugins}/nostr/index.js +0 -0
  79. /package/dist/{src/plugins → plugins}/nostr/nostrConnector.js +0 -0
  80. /package/dist/{src/plugins → plugins}/nostr/nostrConnectorPlugin.js +0 -0
  81. /package/dist/{src/plugins → plugins}/nostr/nostrSigner.js +0 -0
  82. /package/dist/{src/plugins → plugins}/nostr/types.js +0 -0
  83. /package/dist/{src/plugins → plugins}/oauth/index.js +0 -0
  84. /package/dist/{src/plugins → plugins}/oauth/oauthConnector.js +0 -0
  85. /package/dist/{src/plugins → plugins}/oauth/oauthPlugin.js +0 -0
  86. /package/dist/{src/plugins → plugins}/oauth/types.js +0 -0
  87. /package/dist/{src/plugins → plugins}/web3/index.js +0 -0
  88. /package/dist/{src/plugins → plugins}/web3/types.js +0 -0
  89. /package/dist/{src/plugins → plugins}/web3/web3Connector.js +0 -0
  90. /package/dist/{src/plugins → plugins}/web3/web3ConnectorPlugin.js +0 -0
  91. /package/dist/{src/plugins → plugins}/web3/web3Signer.js +0 -0
  92. /package/dist/{src/plugins → plugins}/webauthn/index.js +0 -0
  93. /package/dist/{src/plugins → plugins}/webauthn/types.js +0 -0
  94. /package/dist/{src/plugins → plugins}/webauthn/webauthn.js +0 -0
  95. /package/dist/{src/plugins → plugins}/webauthn/webauthnPlugin.js +0 -0
  96. /package/dist/{src/plugins → plugins}/webauthn/webauthnSigner.js +0 -0
  97. /package/dist/types/{src/config → config}/simplified-config.d.ts +0 -0
  98. /package/dist/types/{src/core.d.ts → core.d.ts} +0 -0
  99. /package/dist/{src/types → types}/events.js +0 -0
  100. /package/dist/types/{src/examples → examples}/api-test.d.ts +0 -0
  101. /package/dist/types/{src/examples → examples}/simple-api-test.d.ts +0 -0
  102. /package/dist/types/{src/gundb → gundb}/api.d.ts +0 -0
  103. /package/dist/types/{src/gundb → gundb}/crypto.d.ts +0 -0
  104. /package/dist/types/{src/gundb → gundb}/db.d.ts +0 -0
  105. /package/dist/types/{src/gundb → gundb}/derive.d.ts +0 -0
  106. /package/dist/types/{src/gundb → gundb}/errors.d.ts +0 -0
  107. /package/dist/types/{src/gundb → gundb}/index.d.ts +0 -0
  108. /package/dist/types/{src/gundb → gundb}/rxjs.d.ts +0 -0
  109. /package/dist/types/{src/gundb → gundb}/types.d.ts +0 -0
  110. /package/dist/types/{src/interfaces → interfaces}/common.d.ts +0 -0
  111. /package/dist/types/{src/interfaces → interfaces}/events.d.ts +0 -0
  112. /package/dist/types/{src/interfaces → interfaces}/plugin.d.ts +0 -0
  113. /package/dist/types/{src/interfaces → interfaces}/shogun.d.ts +0 -0
  114. /package/dist/types/{src/managers → managers}/AuthManager.d.ts +0 -0
  115. /package/dist/types/{src/managers → managers}/CoreInitializer.d.ts +0 -0
  116. /package/dist/types/{src/managers → managers}/EventManager.d.ts +0 -0
  117. /package/dist/types/{src/managers → managers}/PluginManager.d.ts +0 -0
  118. /package/dist/types/{src/migration-test.d.ts → migration-test.d.ts} +0 -0
  119. /package/dist/types/{src/plugins → plugins}/base.d.ts +0 -0
  120. /package/dist/types/{src/plugins → plugins}/index.d.ts +0 -0
  121. /package/dist/types/{src/plugins → plugins}/nostr/index.d.ts +0 -0
  122. /package/dist/types/{src/plugins → plugins}/nostr/nostrConnector.d.ts +0 -0
  123. /package/dist/types/{src/plugins → plugins}/nostr/nostrConnectorPlugin.d.ts +0 -0
  124. /package/dist/types/{src/plugins → plugins}/nostr/nostrSigner.d.ts +0 -0
  125. /package/dist/types/{src/plugins → plugins}/nostr/types.d.ts +0 -0
  126. /package/dist/types/{src/plugins → plugins}/oauth/index.d.ts +0 -0
  127. /package/dist/types/{src/plugins → plugins}/oauth/oauthConnector.d.ts +0 -0
  128. /package/dist/types/{src/plugins → plugins}/oauth/oauthPlugin.d.ts +0 -0
  129. /package/dist/types/{src/plugins → plugins}/oauth/types.d.ts +0 -0
  130. /package/dist/types/{src/plugins → plugins}/web3/index.d.ts +0 -0
  131. /package/dist/types/{src/plugins → plugins}/web3/types.d.ts +0 -0
  132. /package/dist/types/{src/plugins → plugins}/web3/web3Connector.d.ts +0 -0
  133. /package/dist/types/{src/plugins → plugins}/web3/web3ConnectorPlugin.d.ts +0 -0
  134. /package/dist/types/{src/plugins → plugins}/web3/web3Signer.d.ts +0 -0
  135. /package/dist/types/{src/plugins → plugins}/webauthn/index.d.ts +0 -0
  136. /package/dist/types/{src/plugins → plugins}/webauthn/types.d.ts +0 -0
  137. /package/dist/types/{src/plugins → plugins}/webauthn/webauthn.d.ts +0 -0
  138. /package/dist/types/{src/plugins → plugins}/webauthn/webauthnPlugin.d.ts +0 -0
  139. /package/dist/types/{src/plugins → plugins}/webauthn/webauthnSigner.d.ts +0 -0
  140. /package/dist/{src/types → types}/shogun.js +0 -0
  141. /package/dist/types/{src/storage → storage}/storage.d.ts +0 -0
  142. /package/dist/types/{src/types → types}/events.d.ts +0 -0
  143. /package/dist/types/{src/types → types}/shogun.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
- }