@commit451/salamander 1.1.0 → 1.2.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.
- package/README.md +42 -55
- package/bin/salamander.js +1 -1
- package/dist/commands/create-runner.d.ts.map +1 -1
- package/dist/commands/create-runner.js +18 -3
- package/dist/commands/create-runner.js.map +1 -1
- package/dist/commands/delete-runner.d.ts.map +1 -1
- package/dist/commands/delete-runner.js +6 -0
- package/dist/commands/delete-runner.js.map +1 -1
- package/dist/commands/runner-selection.d.ts.map +1 -1
- package/dist/commands/runner-selection.js +2 -2
- package/dist/commands/runner-selection.js.map +1 -1
- package/dist/services/api.d.ts +3 -0
- package/dist/services/api.d.ts.map +1 -1
- package/dist/services/api.js.map +1 -1
- package/dist/services/auth.js +36 -36
- package/dist/services/command-listener.d.ts +5 -0
- package/dist/services/command-listener.d.ts.map +1 -1
- package/dist/services/command-listener.js +89 -3
- package/dist/services/command-listener.js.map +1 -1
- package/dist/services/executor.d.ts +2 -0
- package/dist/services/executor.d.ts.map +1 -1
- package/dist/services/executor.js +45 -3
- package/dist/services/executor.js.map +1 -1
- package/dist/services/runner.d.ts +2 -1
- package/dist/services/runner.d.ts.map +1 -1
- package/dist/services/runner.js +22 -3
- package/dist/services/runner.js.map +1 -1
- package/dist/types/runner.d.ts +1 -0
- package/dist/types/runner.d.ts.map +1 -1
- package/package.json +52 -52
- package/dist/services/crypto.d.ts +0 -52
- package/dist/services/crypto.d.ts.map +0 -1
- package/dist/services/crypto.js +0 -104
- package/dist/services/crypto.js.map +0 -1
- package/dist/services/key-manager.d.ts +0 -45
- package/dist/services/key-manager.d.ts.map +0 -1
- package/dist/services/key-manager.js +0 -123
- package/dist/services/key-manager.js.map +0 -1
- package/dist/services/multi-device-key-manager.d.ts +0 -56
- package/dist/services/multi-device-key-manager.d.ts.map +0 -1
- package/dist/services/multi-device-key-manager.js +0 -159
- package/dist/services/multi-device-key-manager.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,55 +1,42 @@
|
|
|
1
|
-
# Salamander CLI
|
|
2
|
-
|
|
3
|
-
Never be AFK.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
See [the site](https://salamander.space/) for usage.
|
|
6
|
+
|
|
7
|
+
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.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
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.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @commit451/salamander
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### Start the CLI
|
|
19
|
+
```bash
|
|
20
|
+
salamander
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Development
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Install dependencies
|
|
27
|
+
npm install
|
|
28
|
+
|
|
29
|
+
# Run in development mode
|
|
30
|
+
npm run dev
|
|
31
|
+
|
|
32
|
+
# Build the project
|
|
33
|
+
npm run build
|
|
34
|
+
|
|
35
|
+
# Run the built version
|
|
36
|
+
npm start
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Publish
|
|
40
|
+
```
|
|
41
|
+
npm run pub
|
|
42
|
+
```
|
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);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-runner.d.ts","sourceRoot":"","sources":["../../src/commands/create-runner.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create-runner.d.ts","sourceRoot":"","sources":["../../src/commands/create-runner.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwFtD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { input } from '@inquirer/prompts';
|
|
1
|
+
import { input, select } from '@inquirer/prompts';
|
|
2
2
|
import { resolve } from 'path';
|
|
3
3
|
import { access } from 'fs/promises';
|
|
4
4
|
import chalk from 'chalk';
|
|
@@ -50,8 +50,23 @@ export async function createRunnerFlow() {
|
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
52
|
const directory = resolve(directoryInput);
|
|
53
|
-
//
|
|
54
|
-
const runnerType =
|
|
53
|
+
// Select runner type
|
|
54
|
+
const runnerType = await select({
|
|
55
|
+
message: 'Select runner type:',
|
|
56
|
+
choices: [
|
|
57
|
+
{
|
|
58
|
+
name: 'Claude',
|
|
59
|
+
value: RunnerType.CLAUDE,
|
|
60
|
+
description: 'Use Claude AI to execute commands'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Codex',
|
|
64
|
+
value: RunnerType.CODEX,
|
|
65
|
+
description: 'Use Codex AI to execute commands'
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
default: RunnerType.CLAUDE
|
|
69
|
+
});
|
|
55
70
|
console.log(chalk.yellow('⏳ Creating runner...'));
|
|
56
71
|
const runner = await RunnerService.createRunner({
|
|
57
72
|
name: name.trim(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-runner.js","sourceRoot":"","sources":["../../src/commands/create-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-runner.js","sourceRoot":"","sources":["../../src/commands/create-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-runner.d.ts","sourceRoot":"","sources":["../../src/commands/delete-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-runner.d.ts","sourceRoot":"","sources":["../../src/commands/delete-runner.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DtD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { confirm, select } from '@inquirer/prompts';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { RunnerService } from '../services/runner.js';
|
|
4
|
+
import { CommandListener } from '../services/command-listener.js';
|
|
4
5
|
export async function deleteRunnerFlow() {
|
|
5
6
|
console.log(chalk.blue('\n🗑️ Delete Runner'));
|
|
6
7
|
try {
|
|
@@ -37,6 +38,11 @@ export async function deleteRunnerFlow() {
|
|
|
37
38
|
return;
|
|
38
39
|
}
|
|
39
40
|
console.log(chalk.yellow('⏳ Deleting runner...'));
|
|
41
|
+
// Stop any active listeners before deleting to avoid Firestore stream errors
|
|
42
|
+
const listener = CommandListener.getInstance();
|
|
43
|
+
await listener.stopAll();
|
|
44
|
+
// Small delay to allow unlisten messages to flush before deletion
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
40
46
|
await RunnerService.deleteRunner(runnerId);
|
|
41
47
|
console.log(chalk.green('✅ Runner deleted successfully!'));
|
|
42
48
|
console.log(chalk.gray(` Removed: ${selectedRunner.name}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-runner.js","sourceRoot":"","sources":["../../src/commands/delete-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"delete-runner.js","sourceRoot":"","sources":["../../src/commands/delete-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-selection.d.ts","sourceRoot":"","sources":["../../src/commands/runner-selection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-selection.d.ts","sourceRoot":"","sources":["../../src/commands/runner-selection.ts"],"names":[],"mappings":"AAQA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuEzD"}
|
|
@@ -33,7 +33,7 @@ export async function runnerSelectionFlow() {
|
|
|
33
33
|
...localRunners.map(runner => ({
|
|
34
34
|
name: formatRunnerChoice(runner),
|
|
35
35
|
value: `run:${runner.id}`,
|
|
36
|
-
description: `Listen for commands in ${runner.directory}`
|
|
36
|
+
description: `Listen for ${runner.runnerType} commands in ${runner.directory}`
|
|
37
37
|
})),
|
|
38
38
|
{ name: '➕ Create new runner', value: 'create' },
|
|
39
39
|
{ name: '🗑️ Delete runner', value: 'delete' },
|
|
@@ -59,7 +59,7 @@ export async function runnerSelectionFlow() {
|
|
|
59
59
|
const runnerId = selection.replace('run:', '');
|
|
60
60
|
const runner = localRunners.find(r => r.id === runnerId);
|
|
61
61
|
if (runner) {
|
|
62
|
-
const listener =
|
|
62
|
+
const listener = CommandListener.getInstance();
|
|
63
63
|
await listener.startListening(runner);
|
|
64
64
|
}
|
|
65
65
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-selection.js","sourceRoot":"","sources":["../../src/commands/runner-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner-selection.js","sourceRoot":"","sources":["../../src/commands/runner-selection.ts"],"names":[],"mappings":"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"}
|
package/dist/services/api.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ interface CreateRunnerRequest {
|
|
|
3
3
|
machineId: string;
|
|
4
4
|
machineName: string;
|
|
5
5
|
name: string;
|
|
6
|
+
runnerType: string;
|
|
6
7
|
encryptionVerification?: string;
|
|
7
8
|
}
|
|
8
9
|
interface UpdateRunnerRequest {
|
|
@@ -10,6 +11,8 @@ interface UpdateRunnerRequest {
|
|
|
10
11
|
clearPendingCommand?: boolean | null;
|
|
11
12
|
updateLastUsed?: boolean | null;
|
|
12
13
|
lastMessage?: string;
|
|
14
|
+
pendingCommand?: string;
|
|
15
|
+
threadId?: string;
|
|
13
16
|
}
|
|
14
17
|
export interface CreateMessageRequest {
|
|
15
18
|
content: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAeA,UAAU,mBAAmB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,UAAU,mBAAmB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAeA,UAAU,mBAAmB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,UAAU,mBAAmB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;mBACE,YAAY;mBAUZ,WAAW;WAwCnB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;WAOxD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC;WAOlF,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;WAO1E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK7D"}
|
package/dist/services/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAEtC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAEvD,MAAM,QAAS,SAAQ,KAAK;IAGb;IACA;IAHX,YACI,OAAe,EACR,MAAc,EACd,QAAc;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAM;QAGrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
|
package/dist/services/auth.js
CHANGED
|
@@ -15,42 +15,42 @@ export class AuthService {
|
|
|
15
15
|
static WEB_APP_URL = 'https://salamander.space';
|
|
16
16
|
static generateAuthResponseHTML(isSuccess, title, message) {
|
|
17
17
|
const headingColor = isSuccess ? '#10b981' : '#f87171';
|
|
18
|
-
return `
|
|
19
|
-
<!DOCTYPE html>
|
|
20
|
-
<html>
|
|
21
|
-
<head>
|
|
22
|
-
<title>${title}</title>
|
|
23
|
-
<style>
|
|
24
|
-
body {
|
|
25
|
-
background-color: #111827;
|
|
26
|
-
color: #f9fafb;
|
|
27
|
-
font-family: 'Fira Code', 'JetBrains Mono', monospace;
|
|
28
|
-
text-align: center;
|
|
29
|
-
padding: 50px;
|
|
30
|
-
margin: 0;
|
|
31
|
-
}
|
|
32
|
-
h1 { color: ${headingColor}; }
|
|
33
|
-
.logo {
|
|
34
|
-
width: 48px;
|
|
35
|
-
height: 48px;
|
|
36
|
-
margin: 0 auto 24px;
|
|
37
|
-
background: #ff6b35;
|
|
38
|
-
border-radius: 8px;
|
|
39
|
-
display: flex;
|
|
40
|
-
align-items: center;
|
|
41
|
-
justify-content: center;
|
|
42
|
-
font-size: 24px;
|
|
43
|
-
color: white;
|
|
44
|
-
font-weight: bold;
|
|
45
|
-
}
|
|
46
|
-
</style>
|
|
47
|
-
</head>
|
|
48
|
-
<body>
|
|
49
|
-
<div class="logo">S</div>
|
|
50
|
-
<h1>${title}</h1>
|
|
51
|
-
<p>${message}</p>
|
|
52
|
-
</body>
|
|
53
|
-
</html>
|
|
18
|
+
return `
|
|
19
|
+
<!DOCTYPE html>
|
|
20
|
+
<html>
|
|
21
|
+
<head>
|
|
22
|
+
<title>${title}</title>
|
|
23
|
+
<style>
|
|
24
|
+
body {
|
|
25
|
+
background-color: #111827;
|
|
26
|
+
color: #f9fafb;
|
|
27
|
+
font-family: 'Fira Code', 'JetBrains Mono', monospace;
|
|
28
|
+
text-align: center;
|
|
29
|
+
padding: 50px;
|
|
30
|
+
margin: 0;
|
|
31
|
+
}
|
|
32
|
+
h1 { color: ${headingColor}; }
|
|
33
|
+
.logo {
|
|
34
|
+
width: 48px;
|
|
35
|
+
height: 48px;
|
|
36
|
+
margin: 0 auto 24px;
|
|
37
|
+
background: #ff6b35;
|
|
38
|
+
border-radius: 8px;
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
41
|
+
justify-content: center;
|
|
42
|
+
font-size: 24px;
|
|
43
|
+
color: white;
|
|
44
|
+
font-weight: bold;
|
|
45
|
+
}
|
|
46
|
+
</style>
|
|
47
|
+
</head>
|
|
48
|
+
<body>
|
|
49
|
+
<div class="logo">S</div>
|
|
50
|
+
<h1>${title}</h1>
|
|
51
|
+
<p>${message}</p>
|
|
52
|
+
</body>
|
|
53
|
+
</html>
|
|
54
54
|
`;
|
|
55
55
|
}
|
|
56
56
|
static async openBrowser(url) {
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { Runner } from '../types/runner.js';
|
|
2
2
|
export declare class CommandListener {
|
|
3
|
+
private static instance;
|
|
3
4
|
private activeListeners;
|
|
4
5
|
private isShuttingDown;
|
|
6
|
+
private rl;
|
|
7
|
+
static getInstance(): CommandListener;
|
|
5
8
|
startListening(runner: Runner): Promise<void>;
|
|
9
|
+
private setupLocalCommandPrompt;
|
|
6
10
|
stopListening(runnerId: string): Promise<void>;
|
|
11
|
+
stopAll(): Promise<void>;
|
|
7
12
|
}
|
|
8
13
|
//# sourceMappingURL=command-listener.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-listener.d.ts","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-listener.d.ts","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAO1C,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,EAAE,CAAmC;IAE7C,MAAM,CAAC,WAAW,IAAI,eAAe;IAO/B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+InD,OAAO,CAAC,uBAAuB;IAsDzB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBjC"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import * as readline from 'readline/promises';
|
|
2
3
|
import { RunnerService } from './runner.js';
|
|
3
4
|
import { CommandExecutor } from './executor.js';
|
|
4
5
|
import { generateDeviceId } from '../utils/device.js';
|
|
5
6
|
import { EncryptionService } from '../utils/encryption.js';
|
|
6
7
|
import { loadEncryption, saveEncryption } from '../utils/storage.js';
|
|
7
8
|
export class CommandListener {
|
|
9
|
+
static instance = null;
|
|
8
10
|
activeListeners = new Map();
|
|
9
11
|
isShuttingDown = false;
|
|
12
|
+
rl = null;
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (!CommandListener.instance) {
|
|
15
|
+
CommandListener.instance = new CommandListener();
|
|
16
|
+
}
|
|
17
|
+
return CommandListener.instance;
|
|
18
|
+
}
|
|
10
19
|
async startListening(runner) {
|
|
11
20
|
if (this.activeListeners.has(runner.id)) {
|
|
12
21
|
console.log(chalk.yellow(`Already listening to runner "${runner.name}"`));
|
|
@@ -40,12 +49,19 @@ export class CommandListener {
|
|
|
40
49
|
console.log(chalk.gray(' connect to this runner. Your messages and commands are end to end encrypted'));
|
|
41
50
|
console.log('');
|
|
42
51
|
console.log(chalk.yellow('⚠️ SECURITY WARNING'));
|
|
43
|
-
|
|
52
|
+
if (runner.runnerType === 'claude') {
|
|
53
|
+
console.log(chalk.yellow(' Claude commands will be executed with --dangerously-skip-permissions'));
|
|
54
|
+
}
|
|
55
|
+
else if (runner.runnerType === 'codex') {
|
|
56
|
+
console.log(chalk.yellow(' Codex commands will be executed with --full-auto and --skip-git-repo-check'));
|
|
57
|
+
}
|
|
44
58
|
console.log(chalk.yellow(' This bypasses normal permission checks for file access and operations'));
|
|
45
59
|
console.log(chalk.yellow(' Be careful about what directories you run this in and what commands you execute'));
|
|
46
60
|
console.log('');
|
|
47
61
|
console.log(chalk.gray(` Press Ctrl+C to stop`));
|
|
48
62
|
console.log(chalk.gray(` Keep in mind, if your machine goes to sleep, it won't process commands`));
|
|
63
|
+
// Set up non-blocking readline for local commands
|
|
64
|
+
this.setupLocalCommandPrompt(runner.id, encryptionCode);
|
|
49
65
|
const unsubscribe = RunnerService.listenToRunner(runner.id, async (updatedRunner) => {
|
|
50
66
|
if (!updatedRunner || this.isShuttingDown)
|
|
51
67
|
return;
|
|
@@ -74,8 +90,8 @@ export class CommandListener {
|
|
|
74
90
|
senderName: runner.name,
|
|
75
91
|
type: 'runner',
|
|
76
92
|
});
|
|
77
|
-
// Update the runner with the encrypted result
|
|
78
|
-
await RunnerService.updateRunnerAfterCommand(runner.id, encryptedOutput);
|
|
93
|
+
// Update the runner with the encrypted result and threadId
|
|
94
|
+
await RunnerService.updateRunnerAfterCommand(runner.id, encryptedOutput, result.threadId);
|
|
79
95
|
console.log(chalk.blue(`💌 Message sent`));
|
|
80
96
|
console.log(chalk.gray('Waiting for next command...'));
|
|
81
97
|
}
|
|
@@ -118,12 +134,82 @@ export class CommandListener {
|
|
|
118
134
|
process.on('uncaughtException', cleanup);
|
|
119
135
|
process.on('unhandledRejection', cleanup);
|
|
120
136
|
}
|
|
137
|
+
setupLocalCommandPrompt(runnerId, encryptionCode) {
|
|
138
|
+
if (this.isShuttingDown)
|
|
139
|
+
return;
|
|
140
|
+
// Create readline interface if it doesn't exist
|
|
141
|
+
if (!this.rl) {
|
|
142
|
+
this.rl = readline.createInterface({
|
|
143
|
+
input: process.stdin,
|
|
144
|
+
output: process.stdout,
|
|
145
|
+
prompt: chalk.green('> ')
|
|
146
|
+
});
|
|
147
|
+
console.log(chalk.cyan('\n💬 You can enter a command here (or press Ctrl+C to exit):'));
|
|
148
|
+
this.rl.prompt();
|
|
149
|
+
// Listen for line events (non-blocking)
|
|
150
|
+
this.rl.on('line', async (userInput) => {
|
|
151
|
+
if (this.isShuttingDown)
|
|
152
|
+
return;
|
|
153
|
+
// If user provided input, send it as a command
|
|
154
|
+
if (userInput && userInput.trim().length > 0) {
|
|
155
|
+
const command = userInput.trim();
|
|
156
|
+
console.log(chalk.cyan(`📤 Sending command: ${command}`));
|
|
157
|
+
try {
|
|
158
|
+
// Encrypt the command
|
|
159
|
+
const encryptResult = EncryptionService.encrypt(command, encryptionCode);
|
|
160
|
+
const encryptedCommand = encryptResult.success ? encryptResult.encrypted : command;
|
|
161
|
+
// Create a user message in Firestore
|
|
162
|
+
await RunnerService.createMessage(runnerId, {
|
|
163
|
+
content: encryptedCommand,
|
|
164
|
+
senderName: '',
|
|
165
|
+
type: 'user',
|
|
166
|
+
});
|
|
167
|
+
// Update the runner with the pending command (this will trigger the listener)
|
|
168
|
+
await RunnerService.updateRunner(runnerId, encryptedCommand);
|
|
169
|
+
console.log(chalk.blue(`✅ Command submitted successfully`));
|
|
170
|
+
console.log(chalk.gray('Processing...'));
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error(chalk.red(`❌ Error submitting command: ${error.message}`));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Show prompt again for next command
|
|
177
|
+
if (!this.isShuttingDown && this.rl) {
|
|
178
|
+
this.rl.prompt();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
121
183
|
async stopListening(runnerId) {
|
|
122
184
|
const unsubscribe = this.activeListeners.get(runnerId);
|
|
123
185
|
if (unsubscribe) {
|
|
124
186
|
unsubscribe();
|
|
125
187
|
this.activeListeners.delete(runnerId);
|
|
126
188
|
}
|
|
189
|
+
// Close readline interface if it exists
|
|
190
|
+
if (this.rl) {
|
|
191
|
+
this.rl.close();
|
|
192
|
+
this.rl = null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async stopAll() {
|
|
196
|
+
// Unsubscribe all active Firestore listeners
|
|
197
|
+
for (const [id, unsubscribe] of this.activeListeners.entries()) {
|
|
198
|
+
try {
|
|
199
|
+
unsubscribe();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// no-op
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
this.activeListeners.delete(id);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Close readline interface if present
|
|
209
|
+
if (this.rl) {
|
|
210
|
+
this.rl.close();
|
|
211
|
+
this.rl = null;
|
|
212
|
+
}
|
|
127
213
|
}
|
|
128
214
|
}
|
|
129
215
|
//# sourceMappingURL=command-listener.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-listener.js","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"command-listener.js","sourceRoot":"","sources":["../../src/services/command-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,13 @@ export interface CommandResult {
|
|
|
3
3
|
output: string;
|
|
4
4
|
success: boolean;
|
|
5
5
|
executionTime: number;
|
|
6
|
+
threadId?: string;
|
|
6
7
|
}
|
|
7
8
|
export declare class CommandExecutor {
|
|
8
9
|
static executeCommand(runner: Runner, command: string): Promise<CommandResult>;
|
|
9
10
|
private static executeRunnerCommand;
|
|
10
11
|
private static buildCommandLine;
|
|
12
|
+
private static parseCodexOutput;
|
|
11
13
|
private static getToolName;
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/services/executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/services/executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAYD,qBAAa,eAAe;WACX,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA4CpF,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAsBnC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAyB/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgC/B,OAAO,CAAC,MAAM,CAAC,WAAW;CAY7B"}
|
|
@@ -9,14 +9,23 @@ export class CommandExecutor {
|
|
|
9
9
|
console.log(chalk.gray(`Type: ${runner.runnerType}\n`));
|
|
10
10
|
const startTime = Date.now();
|
|
11
11
|
try {
|
|
12
|
-
const
|
|
12
|
+
const rawOutput = this.executeRunnerCommand(runner, command);
|
|
13
13
|
const executionTime = Date.now() - startTime;
|
|
14
|
+
// Parse Codex output if needed
|
|
15
|
+
let output = rawOutput;
|
|
16
|
+
let threadId;
|
|
17
|
+
if (runner.runnerType === RunnerType.CODEX) {
|
|
18
|
+
const parsed = this.parseCodexOutput(rawOutput);
|
|
19
|
+
output = parsed.output;
|
|
20
|
+
threadId = parsed.threadId;
|
|
21
|
+
}
|
|
14
22
|
console.log(chalk.green('✅ Command completed successfully'));
|
|
15
23
|
console.log(chalk.grey(output));
|
|
16
24
|
return {
|
|
17
25
|
output: output || 'Command executed successfully (no output)',
|
|
18
26
|
success: true,
|
|
19
|
-
executionTime
|
|
27
|
+
executionTime,
|
|
28
|
+
threadId
|
|
20
29
|
};
|
|
21
30
|
}
|
|
22
31
|
catch (error) {
|
|
@@ -60,8 +69,41 @@ export class CommandExecutor {
|
|
|
60
69
|
case RunnerType.GEMINI:
|
|
61
70
|
return `gemini -p "${escapedInput}" --yolo`;
|
|
62
71
|
case RunnerType.CODEX:
|
|
63
|
-
|
|
72
|
+
// Build base command
|
|
73
|
+
let codexCmd = `codex exec "${escapedInput}" --experimental-json --full-auto --skip-git-repo-check`;
|
|
74
|
+
// Add resume with threadId if we have one
|
|
75
|
+
if (runner.threadId) {
|
|
76
|
+
codexCmd += ` resume "${runner.threadId}"`;
|
|
77
|
+
}
|
|
78
|
+
return codexCmd;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
static parseCodexOutput(rawOutput) {
|
|
82
|
+
const lines = rawOutput.trim().split('\n');
|
|
83
|
+
const agentMessages = [];
|
|
84
|
+
let threadId;
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
try {
|
|
87
|
+
const event = JSON.parse(line);
|
|
88
|
+
// Extract thread ID from thread.started event
|
|
89
|
+
if (event.type === 'thread.started' && event.thread_id) {
|
|
90
|
+
threadId = event.thread_id;
|
|
91
|
+
}
|
|
92
|
+
// Extract agent messages from item.completed events
|
|
93
|
+
if (event.type === 'item.completed' && event.item?.type === 'agent_message') {
|
|
94
|
+
agentMessages.push(event.item.text);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Ignore lines that aren't valid JSON
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
64
101
|
}
|
|
102
|
+
// Combine all agent messages
|
|
103
|
+
const output = agentMessages.length > 0
|
|
104
|
+
? agentMessages.join('\n\n')
|
|
105
|
+
: rawOutput; // Fallback to raw output if no agent messages found
|
|
106
|
+
return { output, threadId };
|
|
65
107
|
}
|
|
66
108
|
static getToolName(runnerType) {
|
|
67
109
|
switch (runnerType) {
|