@commit451/salamander 1.0.8 → 1.1.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.
Files changed (47) hide show
  1. package/dist/commands/runner-selection.d.ts.map +1 -1
  2. package/dist/commands/runner-selection.js +1 -5
  3. package/dist/commands/runner-selection.js.map +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +10 -9
  6. package/dist/index.js.map +1 -1
  7. package/dist/services/api.d.ts +7 -0
  8. package/dist/services/api.d.ts.map +1 -1
  9. package/dist/services/api.js +6 -0
  10. package/dist/services/api.js.map +1 -1
  11. package/dist/services/auth.d.ts +4 -6
  12. package/dist/services/auth.d.ts.map +1 -1
  13. package/dist/services/auth.js +85 -202
  14. package/dist/services/auth.js.map +1 -1
  15. package/dist/services/command-listener.d.ts.map +1 -1
  16. package/dist/services/command-listener.js +45 -12
  17. package/dist/services/command-listener.js.map +1 -1
  18. package/dist/services/crypto.d.ts +52 -0
  19. package/dist/services/crypto.d.ts.map +1 -0
  20. package/dist/services/crypto.js +104 -0
  21. package/dist/services/crypto.js.map +1 -0
  22. package/dist/services/key-manager.d.ts +45 -0
  23. package/dist/services/key-manager.d.ts.map +1 -0
  24. package/dist/services/key-manager.js +123 -0
  25. package/dist/services/key-manager.js.map +1 -0
  26. package/dist/services/multi-device-key-manager.d.ts +56 -0
  27. package/dist/services/multi-device-key-manager.d.ts.map +1 -0
  28. package/dist/services/multi-device-key-manager.js +159 -0
  29. package/dist/services/multi-device-key-manager.js.map +1 -0
  30. package/dist/services/runner.d.ts +3 -3
  31. package/dist/services/runner.d.ts.map +1 -1
  32. package/dist/services/runner.js +23 -26
  33. package/dist/services/runner.js.map +1 -1
  34. package/dist/services/user.d.ts.map +1 -1
  35. package/dist/services/user.js +0 -3
  36. package/dist/services/user.js.map +1 -1
  37. package/dist/types/runner.d.ts +0 -18
  38. package/dist/types/runner.d.ts.map +1 -1
  39. package/dist/utils/encryption.d.ts +29 -0
  40. package/dist/utils/encryption.d.ts.map +1 -0
  41. package/dist/utils/encryption.js +64 -0
  42. package/dist/utils/encryption.js.map +1 -0
  43. package/dist/utils/storage.d.ts +4 -8
  44. package/dist/utils/storage.d.ts.map +1 -1
  45. package/dist/utils/storage.js +5 -13
  46. package/dist/utils/storage.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,159 @@
1
+ import { CryptoService } from './crypto.js';
2
+ import { StorageService } from '../utils/storage.js';
3
+ export class MultiDeviceKeyManagerService {
4
+ static KEYS_STORAGE_KEY = 'salamander_multi_device_keys';
5
+ static KEY_EXPIRY_DAYS = 30;
6
+ /**
7
+ * Initialize keys for a new runner (CLI side)
8
+ */
9
+ static async initializeRunnerKeys(runnerId) {
10
+ const ecdhKeyPair = CryptoService.generateECDHKeyPair();
11
+ const keyData = {
12
+ ecdhKeyPair,
13
+ sharedSecrets: {},
14
+ keyHashes: {},
15
+ createdAt: Date.now()
16
+ };
17
+ await this.storeRunnerKeys(runnerId, keyData);
18
+ return ecdhKeyPair;
19
+ }
20
+ /**
21
+ * Register a new device and derive shared secret
22
+ */
23
+ static async registerDevice(runnerId, deviceKey) {
24
+ const keyData = await this.getRunnerKeys(runnerId);
25
+ if (!keyData) {
26
+ throw new Error(`No keys found for runner ${runnerId}`);
27
+ }
28
+ // Derive shared secret with this device
29
+ const sharedSecret = CryptoService.deriveSharedSecret(keyData.ecdhKeyPair.privateKey, deviceKey.publicKey);
30
+ const keyHash = CryptoService.createKeyHash(sharedSecret);
31
+ // Verify the key hash matches what the device expects
32
+ if (keyHash !== deviceKey.keyHash) {
33
+ throw new Error('Key hash mismatch during device registration');
34
+ }
35
+ // Store the shared secret for this device
36
+ keyData.sharedSecrets[deviceKey.deviceId] = sharedSecret;
37
+ keyData.keyHashes[deviceKey.deviceId] = keyHash;
38
+ await this.storeRunnerKeys(runnerId, keyData);
39
+ console.log(`✓ Device ${deviceKey.deviceId} registered for runner ${runnerId}`);
40
+ return sharedSecret;
41
+ }
42
+ /**
43
+ * Remove a device from the runner
44
+ */
45
+ static async removeDevice(runnerId, deviceId) {
46
+ const keyData = await this.getRunnerKeys(runnerId);
47
+ if (!keyData) {
48
+ return; // No keys to clean up
49
+ }
50
+ delete keyData.sharedSecrets[deviceId];
51
+ delete keyData.keyHashes[deviceId];
52
+ await this.storeRunnerKeys(runnerId, keyData);
53
+ console.log(`Device ${deviceId} removed from runner ${runnerId}`);
54
+ }
55
+ /**
56
+ * Get shared secret for specific device
57
+ */
58
+ static async getSharedSecret(runnerId, deviceId) {
59
+ const keyData = await this.getRunnerKeys(runnerId);
60
+ if (!keyData) {
61
+ return null;
62
+ }
63
+ // Check if keys are expired
64
+ const daysSinceCreation = (Date.now() - keyData.createdAt) / (1000 * 60 * 60 * 24);
65
+ if (daysSinceCreation > this.KEY_EXPIRY_DAYS) {
66
+ console.warn(`Keys for runner ${runnerId} have expired. Consider key rotation.`);
67
+ }
68
+ return keyData.sharedSecrets[deviceId] || null;
69
+ }
70
+ /**
71
+ * Get all registered device IDs for a runner
72
+ */
73
+ static async getRegisteredDevices(runnerId) {
74
+ const keyData = await this.getRunnerKeys(runnerId);
75
+ if (!keyData) {
76
+ return [];
77
+ }
78
+ return Object.keys(keyData.sharedSecrets);
79
+ }
80
+ /**
81
+ * Encrypt command for specific device
82
+ */
83
+ static async encryptForDevice(runnerId, deviceId, command) {
84
+ const sharedSecret = await this.getSharedSecret(runnerId, deviceId);
85
+ if (!sharedSecret) {
86
+ throw new Error(`No shared secret found for device ${deviceId} on runner ${runnerId}`);
87
+ }
88
+ return CryptoService.safeEncrypt(command, sharedSecret);
89
+ }
90
+ /**
91
+ * Encrypt command for all registered devices
92
+ */
93
+ static async encryptForAllDevices(runnerId, command) {
94
+ const keyData = await this.getRunnerKeys(runnerId);
95
+ if (!keyData) {
96
+ throw new Error(`No keys found for runner ${runnerId}`);
97
+ }
98
+ const encryptedCommands = {};
99
+ for (const [deviceId, sharedSecret] of Object.entries(keyData.sharedSecrets)) {
100
+ try {
101
+ encryptedCommands[deviceId] = CryptoService.safeEncrypt(command, sharedSecret);
102
+ }
103
+ catch (error) {
104
+ console.warn(`Failed to encrypt command for device ${deviceId}: ${error}`);
105
+ }
106
+ }
107
+ if (Object.keys(encryptedCommands).length === 0) {
108
+ throw new Error(`No devices registered for runner ${runnerId}`);
109
+ }
110
+ return encryptedCommands;
111
+ }
112
+ /**
113
+ * Decrypt command from specific device
114
+ */
115
+ static async decryptFromDevice(runnerId, deviceId, encryptedCommand) {
116
+ const sharedSecret = await this.getSharedSecret(runnerId, deviceId);
117
+ if (!sharedSecret) {
118
+ throw new Error(`No shared secret found for device ${deviceId} on runner ${runnerId}`);
119
+ }
120
+ return CryptoService.safeDecrypt(encryptedCommand, sharedSecret);
121
+ }
122
+ /**
123
+ * Check if runner has any registered devices
124
+ */
125
+ static async hasRegisteredDevices(runnerId) {
126
+ const devices = await this.getRegisteredDevices(runnerId);
127
+ return devices.length > 0;
128
+ }
129
+ /**
130
+ * Clean up all keys for a runner
131
+ */
132
+ static async removeRunnerKeys(runnerId) {
133
+ const allKeys = await this.getAllStoredKeys();
134
+ delete allKeys[runnerId];
135
+ await StorageService.set(this.KEYS_STORAGE_KEY, allKeys);
136
+ console.log(`Cleaned up all keys for runner ${runnerId}`);
137
+ }
138
+ /**
139
+ * Get CLI's public key for a runner
140
+ */
141
+ static async getCliPublicKey(runnerId) {
142
+ const keyData = await this.getRunnerKeys(runnerId);
143
+ return keyData?.ecdhKeyPair.publicKey || null;
144
+ }
145
+ // Private helper methods
146
+ static async getRunnerKeys(runnerId) {
147
+ const allKeys = await this.getAllStoredKeys();
148
+ return allKeys[runnerId] || null;
149
+ }
150
+ static async storeRunnerKeys(runnerId, keys) {
151
+ const allKeys = await this.getAllStoredKeys();
152
+ allKeys[runnerId] = keys;
153
+ await StorageService.set(this.KEYS_STORAGE_KEY, allKeys);
154
+ }
155
+ static async getAllStoredKeys() {
156
+ return (await StorageService.get(this.KEYS_STORAGE_KEY)) ?? {};
157
+ }
158
+ }
159
+ //# sourceMappingURL=multi-device-key-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-device-key-manager.js","sourceRoot":"","sources":["../../src/services/multi-device-key-manager.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { type CreateMessageData, type CreateRunnerData, type Message, type Runner } from '../types/runner.js';
1
+ import { CreateMessageRequest } from './api.js';
2
+ import { type CreateRunnerData, type Runner } from '../types/runner.js';
2
3
  export declare class RunnerService {
3
4
  private static readonly RUNNERS_COLLECTION;
4
- private static readonly MESSAGES_COLLECTION;
5
5
  static getAllRunners(): Promise<Runner[]>;
6
6
  static createRunner(data: CreateRunnerData): Promise<Runner>;
7
7
  static deleteRunner(runnerId: string): Promise<void>;
8
8
  static clearPendingCommand(runnerId: string): Promise<void>;
9
9
  static updateRunnerAfterCommand(runnerId: string, result: string): Promise<void>;
10
- static createMessage(data: CreateMessageData): Promise<Message>;
10
+ static createMessage(runnerId: string, data: CreateMessageRequest): Promise<void>;
11
11
  static listenToRunner(runnerId: string, callback: (runner: Runner | null) => void): () => void;
12
12
  private static docToRunner;
13
13
  private static parseRunnerType;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/services/runner.ts"],"names":[],"mappings":"AAcA,OAAO,EAAC,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAGxH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAa;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAc;WAE5C,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;WAkBlC,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;WAgCrD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAMpD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAQzE,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCrE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAa9F,OAAO,CAAC,MAAM,CAAC,WAAW;IAgB1B,OAAO,CAAC,MAAM,CAAC,eAAe;CAWjC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/services/runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,oBAAoB,EAAC,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAC,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAKlF,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAa;WAE1C,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;WAkBlC,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;WAkDrD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAMpD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAQzE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAavF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAa9F,OAAO,CAAC,MAAM,CAAC,WAAW;IAgB1B,OAAO,CAAC,MAAM,CAAC,eAAe;CAWjC"}
@@ -1,12 +1,13 @@
1
- import { addDoc, collection, doc, getDocs, onSnapshot, orderBy, query, serverTimestamp, where, } from 'firebase/firestore';
1
+ import { collection, doc, getDocs, onSnapshot, orderBy, query, where, } from 'firebase/firestore';
2
2
  import { db } from '../config/firebase.js';
3
3
  import { AuthService } from './auth.js';
4
4
  import { ApiService } from './api.js';
5
5
  import { RunnerType } from '../types/runner.js';
6
6
  import { generateDeviceId, getDeviceDisplayName } from '../utils/device.js';
7
+ import { EncryptionService } from '../utils/encryption.js';
8
+ import { loadEncryption, saveEncryption } from '../utils/storage.js';
7
9
  export class RunnerService {
8
10
  static RUNNERS_COLLECTION = 'runners';
9
- static MESSAGES_COLLECTION = 'messages';
10
11
  static async getAllRunners() {
11
12
  const userId = AuthService.userId;
12
13
  const deviceId = generateDeviceId();
@@ -24,12 +25,27 @@ export class RunnerService {
24
25
  }
25
26
  const deviceId = generateDeviceId();
26
27
  const deviceName = getDeviceDisplayName();
27
- // Create runner via API
28
+ // Generate or load encryption code
29
+ let encryptionCode;
30
+ const storedEncryption = await loadEncryption();
31
+ if (storedEncryption?.encryptionCode) {
32
+ encryptionCode = storedEncryption.encryptionCode;
33
+ }
34
+ else {
35
+ // Generate new random encryption code
36
+ encryptionCode = EncryptionService.generateRandomSecret();
37
+ // Save to storage
38
+ await saveEncryption({ encryptionCode });
39
+ }
40
+ // Create verification string
41
+ const encryptionVerification = EncryptionService.createVerificationString(encryptionCode);
42
+ // Create runner via API with encryption verification
28
43
  const response = await ApiService.createRunner({
29
44
  name: data.name,
30
45
  directory: data.directory,
31
46
  machineId: deviceId,
32
- machineName: deviceName
47
+ machineName: deviceName,
48
+ encryptionVerification
33
49
  });
34
50
  const runnerId = response.id;
35
51
  return {
@@ -59,34 +75,15 @@ export class RunnerService {
59
75
  lastMessage: result ?? ''
60
76
  });
61
77
  }
62
- static async createMessage(data) {
78
+ static async createMessage(runnerId, data) {
63
79
  const userId = AuthService.userId;
64
80
  if (!userId) {
65
81
  throw new Error('User not authenticated');
66
82
  }
67
- if (!data.runnerId) {
83
+ if (!runnerId) {
68
84
  throw new Error('Runner ID is required to create a message');
69
85
  }
70
- const messageData = {
71
- content: data.content ?? '',
72
- senderName: data.senderName ?? '',
73
- type: data.type,
74
- userId,
75
- timestamp: serverTimestamp()
76
- };
77
- // Store message in the runner's messages subcollection
78
- const runnerDocRef = doc(db, this.RUNNERS_COLLECTION, data.runnerId);
79
- const messagesCollectionRef = collection(runnerDocRef, this.MESSAGES_COLLECTION);
80
- const docRef = await addDoc(messagesCollectionRef, messageData);
81
- return {
82
- id: docRef.id,
83
- content: data.content,
84
- senderName: data.senderName,
85
- type: data.type,
86
- userId,
87
- timestamp: new Date(),
88
- runnerId: data.runnerId
89
- };
86
+ await ApiService.createRunnerMessage(runnerId, data);
90
87
  }
91
88
  static listenToRunner(runnerId, callback) {
92
89
  const runnerDoc = doc(db, this.RUNNERS_COLLECTION, runnerId);
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/services/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/services/runner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,IAAI,EAAC,MAAM,oBAAoB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAW;WAEtC,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAiBnD,OAAO,CAAC,MAAM,CAAC,SAAS;CAS3B"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,IAAI,EAAC,MAAM,oBAAoB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAW;WAEtC,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAiBnD,OAAO,CAAC,MAAM,CAAC,SAAS;CAM3B"}
@@ -19,10 +19,7 @@ export class UserService {
19
19
  static docToUser(data, id) {
20
20
  return {
21
21
  id,
22
- email: data.email || '',
23
22
  runnersRemaining: data.runnersRemaining || 0,
24
- createdAt: data.createdAt?.toDate() || null,
25
- lastUsed: data.lastUsed?.toDate() || null,
26
23
  };
27
24
  }
28
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,EAAE,EAAC,MAAM,uBAAuB,CAAC;AACzC,OAAO,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAGtC,MAAM,OAAO,WAAW;IACZ,MAAM,CAAU,gBAAgB,GAAG,OAAO,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,cAAc;QACvB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,IAAS,EAAE,EAAU;QAC1C,OAAO;YACH,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI;YAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI;SAC5C,CAAC;IACN,CAAC"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,EAAE,EAAC,MAAM,uBAAuB,CAAC;AACzC,OAAO,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAGtC,MAAM,OAAO,WAAW;IACZ,MAAM,CAAU,gBAAgB,GAAG,OAAO,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,cAAc;QACvB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,IAAS,EAAE,EAAU;QAC1C,OAAO;YACH,EAAE;YACF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC;SAC/C,CAAC;IACN,CAAC"}
@@ -21,26 +21,8 @@ export interface CreateRunnerData {
21
21
  directory: string;
22
22
  runnerType: RunnerType;
23
23
  }
24
- export interface Message {
25
- id: string;
26
- content: string;
27
- senderName: string;
28
- timestamp: Date;
29
- type: 'user' | 'runner' | 'error';
30
- userId: string;
31
- runnerId?: string;
32
- }
33
- export interface CreateMessageData {
34
- content: string;
35
- senderName: string;
36
- type: 'user' | 'runner' | 'error';
37
- runnerId: string;
38
- }
39
24
  export interface User {
40
25
  id: string;
41
- email: string;
42
26
  runnersRemaining: number;
43
- createdAt: Date | null;
44
- lastUsed: Date | null;
45
27
  }
46
28
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IAClB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IAClB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,29 @@
1
+ export interface EncryptionResult {
2
+ encrypted: string;
3
+ success: boolean;
4
+ }
5
+ export interface DecryptionResult {
6
+ decrypted: string;
7
+ success: boolean;
8
+ }
9
+ export declare class EncryptionService {
10
+ /**
11
+ * Generate a random shared secret
12
+ * This ensures the backend never knows the encryption key
13
+ */
14
+ static generateRandomSecret(): string;
15
+ /**
16
+ * Simple XOR-based encryption compatible with Dart implementation
17
+ */
18
+ static encrypt(data: string, secret: string): EncryptionResult;
19
+ /**
20
+ * Simple XOR-based decryption
21
+ */
22
+ static decrypt(encryptedData: string, secret: string): DecryptionResult;
23
+ /**
24
+ * Create verification string encrypted with the secret
25
+ * This can be stored on the runner to verify the correct secret
26
+ */
27
+ static createVerificationString(secret: string): string;
28
+ }
29
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/utils/encryption.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC1B;;;OAGG;IACH,MAAM,CAAC,oBAAoB,IAAI,MAAM;IAMrC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAqB9D;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAsBvE;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAK1D"}
@@ -0,0 +1,64 @@
1
+ import { createHash, randomBytes } from 'crypto';
2
+ export class EncryptionService {
3
+ /**
4
+ * Generate a random shared secret
5
+ * This ensures the backend never knows the encryption key
6
+ */
7
+ static generateRandomSecret() {
8
+ // Generate 8 random bytes and convert to hex for a 16-character string
9
+ const randomBuffer = randomBytes(8);
10
+ return randomBuffer.toString('hex').toUpperCase();
11
+ }
12
+ /**
13
+ * Simple XOR-based encryption compatible with Dart implementation
14
+ */
15
+ static encrypt(data, secret) {
16
+ try {
17
+ // Use a hash of the secret to create consistent encryption
18
+ const secretHash = createHash('sha256').update(secret).digest('hex');
19
+ const keyBytes = Buffer.from(secretHash.substring(0, 32), 'utf8');
20
+ const dataBytes = Buffer.from(data, 'utf8');
21
+ const encrypted = Buffer.alloc(dataBytes.length);
22
+ for (let i = 0; i < dataBytes.length; i++) {
23
+ encrypted[i] = dataBytes[i] ^ keyBytes[i % keyBytes.length];
24
+ }
25
+ // Convert to hex string
26
+ const result = encrypted.toString('hex');
27
+ return { encrypted: result, success: true };
28
+ }
29
+ catch (error) {
30
+ return { encrypted: '', success: false };
31
+ }
32
+ }
33
+ /**
34
+ * Simple XOR-based decryption
35
+ */
36
+ static decrypt(encryptedData, secret) {
37
+ try {
38
+ // Use a hash of the secret to create consistent decryption key
39
+ const secretHash = createHash('sha256').update(secret).digest('hex');
40
+ const keyBytes = Buffer.from(secretHash.substring(0, 32), 'utf8');
41
+ // Convert hex string back to bytes
42
+ const encrypted = Buffer.from(encryptedData, 'hex');
43
+ const decrypted = Buffer.alloc(encrypted.length);
44
+ for (let i = 0; i < encrypted.length; i++) {
45
+ decrypted[i] = encrypted[i] ^ keyBytes[i % keyBytes.length];
46
+ }
47
+ const result = decrypted.toString('utf8');
48
+ return { decrypted: result, success: true };
49
+ }
50
+ catch (error) {
51
+ return { decrypted: '', success: false };
52
+ }
53
+ }
54
+ /**
55
+ * Create verification string encrypted with the secret
56
+ * This can be stored on the runner to verify the correct secret
57
+ */
58
+ static createVerificationString(secret) {
59
+ const verificationText = 'salamander_verification_success';
60
+ const result = this.encrypt(verificationText, secret);
61
+ return result.encrypted;
62
+ }
63
+ }
64
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/utils/encryption.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,6 @@
1
- export interface StoredAuth {
2
- refreshToken?: string;
3
- accessToken?: string;
4
- userId?: string;
5
- email?: string;
1
+ export interface StoredEncryption {
2
+ encryptionCode?: string;
6
3
  }
7
- export declare function saveAuth(auth: StoredAuth): Promise<void>;
8
- export declare function loadAuth(): Promise<StoredAuth | null>;
9
- export declare function clearAuth(): Promise<void>;
4
+ export declare function saveEncryption(encryption: StoredEncryption): Promise<void>;
5
+ export declare function loadEncryption(): Promise<StoredEncryption | null>;
10
6
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO3D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAUD,wBAAsB,cAAc,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOvE"}
@@ -2,7 +2,7 @@ import { promises as fs } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  const CONFIG_DIR = join(homedir(), '.salamander');
5
- const AUTH_FILE = join(CONFIG_DIR, 'auth.json');
5
+ const ENCRYPTION_FILE = join(CONFIG_DIR, 'encryption.json');
6
6
  async function ensureConfigDir() {
7
7
  try {
8
8
  await fs.access(CONFIG_DIR);
@@ -11,25 +11,17 @@ async function ensureConfigDir() {
11
11
  await fs.mkdir(CONFIG_DIR, { recursive: true });
12
12
  }
13
13
  }
14
- export async function saveAuth(auth) {
14
+ export async function saveEncryption(encryption) {
15
15
  await ensureConfigDir();
16
- await fs.writeFile(AUTH_FILE, JSON.stringify(auth, null, 2));
16
+ await fs.writeFile(ENCRYPTION_FILE, JSON.stringify(encryption, null, 2));
17
17
  }
18
- export async function loadAuth() {
18
+ export async function loadEncryption() {
19
19
  try {
20
- const data = await fs.readFile(AUTH_FILE, 'utf-8');
20
+ const data = await fs.readFile(ENCRYPTION_FILE, 'utf-8');
21
21
  return JSON.parse(data);
22
22
  }
23
23
  catch {
24
24
  return null;
25
25
  }
26
26
  }
27
- export async function clearAuth() {
28
- try {
29
- await fs.unlink(AUTH_FILE);
30
- }
31
- catch {
32
- // File doesn't exist, which is fine
33
- }
34
- }
35
27
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,IAAI,EAAE,EAAC,MAAM,IAAI,CAAC;AAClC,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAC,OAAO,EAAC,MAAM,IAAI,CAAC;AAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAUhD,KAAK,UAAU,eAAe;IAC1B,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAClD,CAAC;AACL,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAgB;IAC3C,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC1B,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,oCAAoC;IACxC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,IAAI,EAAE,EAAC,MAAM,IAAI,CAAC;AAClC,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAC,OAAO,EAAC,MAAM,IAAI,CAAC;AAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAM5D,KAAK,UAAU,eAAe;IAC1B,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAClD,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA4B;IAC7D,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAChC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commit451/salamander",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "Never be AFK",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",