@commit451/salamander 1.0.5 → 1.0.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.
package/README.md CHANGED
@@ -1,55 +1,55 @@
1
- # Salamander CLI
2
-
3
- Never be AFK.
4
-
5
- Command-line interface for Salamander AI runners. This tool allows you to run AI-powered command execution on your local machine and receive commands from the Salamander app.
6
-
7
- ## Installation
8
- You should first install [Claude's CLI](https://docs.anthropic.com/en/docs/claude-code/cli-reference) so that your machine has the needed `claude` command available.
9
-
10
- ```bash
11
- npm install -g @commit451/salamander
12
- ```
13
-
14
- ## Usage
15
-
16
- ### Start the CLI (main interface)
17
- ```bash
18
- salamander
19
- ```
20
-
21
- ### Create a new runner
22
- ```bash
23
- salamander create
24
- ```
25
-
26
- ### Start runner selection
27
- ```bash
28
- salamander start
29
- ```
30
-
31
- ### Logout
32
- ```bash
33
- salamander logout
34
- ```
35
-
36
- ## Development
37
-
38
- ```bash
39
- # Install dependencies
40
- npm install
41
-
42
- # Run in development mode
43
- npm run dev
44
-
45
- # Build the project
46
- npm run build
47
-
48
- # Run the built version
49
- npm start
50
- ```
51
-
52
- ## Publish
53
- ```
54
- npm run pub
55
- ```
1
+ # Salamander CLI
2
+
3
+ Never be AFK.
4
+
5
+ Command-line interface for Salamander AI runners. This tool allows you to run AI-powered command execution on your local machine and receive commands from the Salamander app.
6
+
7
+ ## Installation
8
+ You should first install [Claude's CLI](https://docs.anthropic.com/en/docs/claude-code/cli-reference) so that your machine has the needed `claude` command available.
9
+
10
+ ```bash
11
+ npm install -g @commit451/salamander
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ### Start the CLI (main interface)
17
+ ```bash
18
+ salamander
19
+ ```
20
+
21
+ ### Create a new runner
22
+ ```bash
23
+ salamander create
24
+ ```
25
+
26
+ ### Start runner selection
27
+ ```bash
28
+ salamander start
29
+ ```
30
+
31
+ ### Logout
32
+ ```bash
33
+ salamander logout
34
+ ```
35
+
36
+ ## Development
37
+
38
+ ```bash
39
+ # Install dependencies
40
+ npm install
41
+
42
+ # Run in development mode
43
+ npm run dev
44
+
45
+ # Build the project
46
+ npm run build
47
+
48
+ # Run the built version
49
+ npm start
50
+ ```
51
+
52
+ ## Publish
53
+ ```
54
+ npm run pub
55
+ ```
package/bin/salamander.js CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  import('../dist/index.js').then(m => m.default()).catch(console.error);
@@ -58,34 +58,34 @@ export class AuthService {
58
58
  }
59
59
  if (code) {
60
60
  res.writeHead(200, { 'Content-Type': 'text/html' });
61
- res.end(`
62
- <!DOCTYPE html>
63
- <html>
64
- <head>
65
- <title>Authentication Successful</title>
66
- <style>
67
- body {
68
- background-color: #000000;
69
- color: #ffffff;
70
- font-family: Arial, sans-serif;
71
- text-align: center;
72
- padding: 50px;
73
- margin: 0;
74
- }
75
- h1 {
76
- font-size: 2.5em;
77
- margin-bottom: 20px;
78
- }
79
- p {
80
- font-size: 1.2em;
81
- }
82
- </style>
83
- </head>
84
- <body>
85
- <h1>Authentication Successful!</h1>
86
- <p>You can close this window and return to the CLI.</p>
87
- </body>
88
- </html>
61
+ res.end(`
62
+ <!DOCTYPE html>
63
+ <html>
64
+ <head>
65
+ <title>Authentication Successful</title>
66
+ <style>
67
+ body {
68
+ background-color: #000000;
69
+ color: #ffffff;
70
+ font-family: Arial, sans-serif;
71
+ text-align: center;
72
+ padding: 50px;
73
+ margin: 0;
74
+ }
75
+ h1 {
76
+ font-size: 2.5em;
77
+ margin-bottom: 20px;
78
+ }
79
+ p {
80
+ font-size: 1.2em;
81
+ }
82
+ </style>
83
+ </head>
84
+ <body>
85
+ <h1>Authentication Successful!</h1>
86
+ <p>You can close this window and return to the CLI.</p>
87
+ </body>
88
+ </html>
89
89
  `);
90
90
  authCodeResolve(code);
91
91
  }
@@ -41,7 +41,7 @@ export class CommandListener {
41
41
  // Create assistant message for the result
42
42
  await RunnerService.createMessage({
43
43
  content: result.output,
44
- senderName: '',
44
+ senderName: runner.name,
45
45
  type: 'runner',
46
46
  runnerId: runner.id
47
47
  });
@@ -57,7 +57,7 @@ export class CommandListener {
57
57
  // Create assistant message for the error
58
58
  await RunnerService.createMessage({
59
59
  content: errorMessage,
60
- senderName: '',
60
+ senderName: runner.name,
61
61
  type: 'runner',
62
62
  runnerId: runner.id
63
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"command-listener.js","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-listener.js","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface User {
2
+ id: string;
3
+ email: string;
4
+ displayName?: string;
5
+ tier: 'free' | 'premium' | 'unlimited';
6
+ messagesRemaining: number;
7
+ runnerCount: number;
8
+ lastMessageReset?: Date;
9
+ }
10
+ export interface Plan {
11
+ id: string;
12
+ name: string;
13
+ messageLimit: number;
14
+ runnerLimit: number;
15
+ priceInCents: number;
16
+ priceCurrency: string;
17
+ tagline: string;
18
+ }
19
+ export declare class UserService {
20
+ private static readonly USERS_COLLECTION;
21
+ private static readonly PLANS_COLLECTION;
22
+ static getCurrentUser(): Promise<User | null>;
23
+ static getUserPlan(tier: string): Promise<Plan | null>;
24
+ static getRunnersAvailable(): Promise<{
25
+ available: number;
26
+ total: number;
27
+ current: number;
28
+ }>;
29
+ }
30
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAW;WAEtC,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;WA4BtC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;WAuB/C,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAqBrG"}
@@ -0,0 +1,72 @@
1
+ import { doc, getDoc } from 'firebase/firestore';
2
+ import { db } from '../config/firebase.js';
3
+ import { AuthService } from './auth.js';
4
+ export class UserService {
5
+ static USERS_COLLECTION = 'users';
6
+ static PLANS_COLLECTION = 'plans';
7
+ static async getCurrentUser() {
8
+ const userId = AuthService.userId;
9
+ if (!userId) {
10
+ throw new Error('User not authenticated');
11
+ }
12
+ try {
13
+ const userDoc = await getDoc(doc(db, this.USERS_COLLECTION, userId));
14
+ if (!userDoc.exists()) {
15
+ return null;
16
+ }
17
+ const data = userDoc.data();
18
+ return {
19
+ id: userId,
20
+ email: data.email || '',
21
+ displayName: data.displayName,
22
+ tier: data.tier || 'free',
23
+ messagesRemaining: data.messagesRemaining || 0,
24
+ runnerCount: data.runnerCount || 0,
25
+ lastMessageReset: data.lastMessageReset?.toDate()
26
+ };
27
+ }
28
+ catch (error) {
29
+ throw new Error(`Failed to fetch user data: ${error.message}`);
30
+ }
31
+ }
32
+ static async getUserPlan(tier) {
33
+ try {
34
+ const planDoc = await getDoc(doc(db, this.PLANS_COLLECTION, tier));
35
+ if (!planDoc.exists()) {
36
+ return null;
37
+ }
38
+ const data = planDoc.data();
39
+ return {
40
+ id: planDoc.id,
41
+ name: data.name || tier,
42
+ messageLimit: data.messageLimit || 0,
43
+ runnerLimit: data.runnerLimit || 0,
44
+ priceInCents: data.priceInCents || 0,
45
+ priceCurrency: data.priceCurrency || 'USD',
46
+ tagline: data.tagline || ''
47
+ };
48
+ }
49
+ catch (error) {
50
+ throw new Error(`Failed to fetch plan data: ${error.message}`);
51
+ }
52
+ }
53
+ static async getRunnersAvailable() {
54
+ const user = await this.getCurrentUser();
55
+ if (!user) {
56
+ throw new Error('User not found');
57
+ }
58
+ const plan = await this.getUserPlan(user.tier);
59
+ if (!plan) {
60
+ throw new Error(`Plan '${user.tier}' not found`);
61
+ }
62
+ const current = user.runnerCount;
63
+ const total = plan.runnerLimit;
64
+ const available = Math.max(0, total - current);
65
+ return {
66
+ available,
67
+ total,
68
+ current
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { hostname, platform } from 'os';
1
+ import { hostname } from 'os';
2
2
  import { createHash } from 'crypto';
3
3
  export function getDeviceDisplayName() {
4
- return `${hostname()} (${platform()})`;
4
+ return `${hostname()}`;
5
5
  }
6
6
  export function generateDeviceId() {
7
- const deviceInfo = `${hostname()}-${platform()}`;
7
+ const deviceInfo = `${hostname()}`;
8
8
  return createHash('sha256').update(deviceInfo).digest('hex');
9
9
  }
10
10
  //# sourceMappingURL=device.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,MAAM,IAAI,CAAC;AACtC,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAElC,MAAM,UAAU,oBAAoB;IAChC,OAAO,GAAG,QAAQ,EAAE,KAAK,QAAQ,EAAE,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,MAAM,UAAU,GAAG,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,EAAE,CAAC;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAElC,MAAM,UAAU,oBAAoB;IAChC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,MAAM,UAAU,GAAG,GAAG,QAAQ,EAAE,EAAE,CAAC;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
package/package.json CHANGED
@@ -1,54 +1,54 @@
1
- {
2
- "name": "@commit451/salamander",
3
- "version": "1.0.5",
4
- "description": "Never be AFK",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "bin": {
8
- "salamander": "bin/salamander.js"
9
- },
10
- "scripts": {
11
- "build": "tsc",
12
- "dev": "tsx src/index.ts",
13
- "start": "node dist/index.js",
14
- "prepare": "npm run build",
15
- "pub": "npm publish --access public"
16
- },
17
- "engines": {
18
- "node": ">=18.0.0"
19
- },
20
- "dependencies": {
21
- "@inquirer/prompts": "^7.8.4",
22
- "chalk": "^5.6.2",
23
- "commander": "^14.0.0",
24
- "firebase": "^12.2.1",
25
- "uuid": "^13.0.0"
26
- },
27
- "devDependencies": {
28
- "@types/node": "^24.3.1",
29
- "@types/uuid": "^10.0.0",
30
- "tsx": "^4.20.5",
31
- "typescript": "^5.9.2"
32
- },
33
- "keywords": [
34
- "cli",
35
- "afk",
36
- "automation",
37
- "tool"
38
- ],
39
- "author": "",
40
- "license": "ISC",
41
- "repository": {
42
- "type": "git",
43
- "url": ""
44
- },
45
- "homepage": "",
46
- "bugs": {
47
- "url": ""
48
- },
49
- "files": [
50
- "dist/**/*",
51
- "bin/**/*",
52
- "README.md"
53
- ]
54
- }
1
+ {
2
+ "name": "@commit451/salamander",
3
+ "version": "1.0.6",
4
+ "description": "Never be AFK",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "salamander": "bin/salamander.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "prepare": "npm run build",
15
+ "pub": "npm publish --access public"
16
+ },
17
+ "engines": {
18
+ "node": ">=18.0.0"
19
+ },
20
+ "dependencies": {
21
+ "@inquirer/prompts": "^7.8.4",
22
+ "chalk": "^5.6.2",
23
+ "commander": "^14.0.0",
24
+ "firebase": "^12.2.1",
25
+ "uuid": "^13.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^24.3.1",
29
+ "@types/uuid": "^10.0.0",
30
+ "tsx": "^4.20.5",
31
+ "typescript": "^5.9.2"
32
+ },
33
+ "keywords": [
34
+ "cli",
35
+ "afk",
36
+ "automation",
37
+ "tool"
38
+ ],
39
+ "author": "",
40
+ "license": "ISC",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": ""
44
+ },
45
+ "homepage": "",
46
+ "bugs": {
47
+ "url": ""
48
+ },
49
+ "files": [
50
+ "dist/**/*",
51
+ "bin/**/*",
52
+ "README.md"
53
+ ]
54
+ }