@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 +55 -55
- package/bin/salamander.js +1 -1
- package/dist/services/auth.js +28 -28
- package/dist/services/command-listener.js +2 -2
- package/dist/services/command-listener.js.map +1 -1
- package/dist/services/user.d.ts +30 -0
- package/dist/services/user.d.ts.map +1 -0
- package/dist/services/user.js +72 -0
- package/dist/services/user.js.map +1 -0
- package/dist/utils/device.js +3 -3
- package/dist/utils/device.js.map +1 -1
- package/package.json +54 -54
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);
|
package/dist/services/auth.js
CHANGED
|
@@ -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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAO,eAAe;IAChB,eAAe,GAA4B,IAAI,GAAG,EAAE,CAAC;IACrD,cAAc,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,cAAc,CAAC,MAAc;QAC/B,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1E,OAAO;QACX,CAAC;QAED,gCAAgC;QAChC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,uBAAuB;QACvB,MAAM,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0EAA0E,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oFAAoF,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC,CAAC;QAErG,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;YAChF,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc;gBAAE,OAAO;YAElD,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAEhF,IAAI,CAAC;oBACD,wCAAwC;oBACxC,MAAM,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAEnD,sBAAsB;oBACtB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;oBAEjG,0CAA0C;oBAC1C,MAAM,aAAa,CAAC,aAAa,CAAC;wBAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;wBACtB,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"command-listener.js","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAO,eAAe;IAChB,eAAe,GAA4B,IAAI,GAAG,EAAE,CAAC;IACrD,cAAc,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,cAAc,CAAC,MAAc;QAC/B,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1E,OAAO;QACX,CAAC;QAED,gCAAgC;QAChC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,uBAAuB;QACvB,MAAM,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0EAA0E,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oFAAoF,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC,CAAC;QAErG,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;YAChF,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc;gBAAE,OAAO;YAElD,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAEhF,IAAI,CAAC;oBACD,wCAAwC;oBACxC,MAAM,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAEnD,sBAAsB;oBACtB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;oBAEjG,0CAA0C;oBAC1C,MAAM,aAAa,CAAC,aAAa,CAAC;wBAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;wBACtB,UAAU,EAAE,MAAM,CAAC,IAAI;wBACvB,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,MAAM,CAAC,EAAE;qBACtB,CAAC,CAAC;oBAEH,oCAAoC;oBACpC,MAAM,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAEvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAEzE,MAAM,YAAY,GAAG,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC;oBAEjE,IAAI,CAAC;wBACD,yCAAyC;wBACzC,MAAM,aAAa,CAAC,aAAa,CAAC;4BAC9B,OAAO,EAAE,YAAY;4BACrB,UAAU,EAAE,MAAM,CAAC,IAAI;4BACvB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,MAAM,CAAC,EAAE;yBACtB,CAAC,CAAC;wBAEH,MAAM,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;oBAC1E,CAAC;oBAAC,OAAO,WAAW,EAAE,CAAC;wBACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBAC1E,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAEjD,2BAA2B;QAC3B,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEtC,wBAAwB;YACxB,IAAI,CAAC;gBACD,MAAM,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC7D,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -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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"}
|
package/dist/utils/device.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { hostname
|
|
1
|
+
import { hostname } from 'os';
|
|
2
2
|
import { createHash } from 'crypto';
|
|
3
3
|
export function getDeviceDisplayName() {
|
|
4
|
-
return `${hostname()}
|
|
4
|
+
return `${hostname()}`;
|
|
5
5
|
}
|
|
6
6
|
export function generateDeviceId() {
|
|
7
|
-
const deviceInfo = `${hostname()}
|
|
7
|
+
const deviceInfo = `${hostname()}`;
|
|
8
8
|
return createHash('sha256').update(deviceInfo).digest('hex');
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=device.js.map
|
package/dist/utils/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,
|
|
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.
|
|
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
|
+
}
|