@redplanethq/corebrain 1.0.0 → 2.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.
- package/dist/commands/browser/close.d.ts +10 -0
- package/dist/commands/browser/close.d.ts.map +1 -0
- package/dist/commands/browser/close.js +60 -0
- package/dist/commands/browser/close.js.map +1 -0
- package/dist/commands/browser/command.d.ts +10 -0
- package/dist/commands/browser/command.d.ts.map +1 -0
- package/dist/commands/browser/command.js +67 -0
- package/dist/commands/browser/command.js.map +1 -0
- package/dist/commands/browser/create-profile.d.ts +10 -0
- package/dist/commands/browser/create-profile.d.ts.map +1 -0
- package/dist/commands/browser/create-profile.js +29 -0
- package/dist/commands/browser/create-profile.js.map +1 -0
- package/dist/commands/browser/delete-profile.d.ts +10 -0
- package/dist/commands/browser/delete-profile.d.ts.map +1 -0
- package/dist/commands/browser/delete-profile.js +27 -0
- package/dist/commands/browser/delete-profile.js.map +1 -0
- package/dist/commands/browser/install.d.ts +8 -0
- package/dist/commands/browser/install.d.ts.map +1 -0
- package/dist/commands/browser/install.js +49 -0
- package/dist/commands/browser/install.js.map +1 -0
- package/dist/commands/browser/open.d.ts +12 -0
- package/dist/commands/browser/open.d.ts.map +1 -0
- package/dist/commands/browser/open.js +65 -0
- package/dist/commands/browser/open.js.map +1 -0
- package/dist/commands/browser/status.d.ts +8 -0
- package/dist/commands/browser/status.d.ts.map +1 -0
- package/dist/commands/browser/status.js +48 -0
- package/dist/commands/browser/status.js.map +1 -0
- package/dist/commands/coding/[agent]/config.d.ts +18 -0
- package/dist/commands/coding/[agent]/config.d.ts.map +1 -0
- package/dist/commands/coding/[agent]/config.js +91 -0
- package/dist/commands/coding/[agent]/config.js.map +1 -0
- package/dist/commands/coding/config.d.ts +23 -0
- package/dist/commands/coding/config.d.ts.map +1 -0
- package/dist/commands/coding/config.js +116 -0
- package/dist/commands/coding/config.js.map +1 -0
- package/dist/commands/coding/index.d.ts +8 -0
- package/dist/commands/coding/index.d.ts.map +1 -0
- package/dist/commands/coding/index.js +42 -0
- package/dist/commands/coding/index.js.map +1 -0
- package/dist/commands/coding/remove.d.ts +10 -0
- package/dist/commands/coding/remove.d.ts.map +1 -0
- package/dist/commands/coding/remove.js +37 -0
- package/dist/commands/coding/remove.js.map +1 -0
- package/dist/commands/coding/setup.d.ts +8 -0
- package/dist/commands/coding/setup.d.ts.map +1 -0
- package/dist/commands/coding/setup.js +114 -0
- package/dist/commands/coding/setup.js.map +1 -0
- package/dist/commands/exec/config.d.ts +14 -0
- package/dist/commands/exec/config.d.ts.map +1 -0
- package/dist/commands/exec/config.js +79 -0
- package/dist/commands/exec/config.js.map +1 -0
- package/dist/commands/gateway/config.d.ts +8 -0
- package/dist/commands/gateway/config.d.ts.map +1 -0
- package/dist/commands/gateway/config.js +192 -0
- package/dist/commands/gateway/config.js.map +1 -0
- package/dist/commands/gateway/index.d.ts +14 -0
- package/dist/commands/gateway/index.d.ts.map +1 -0
- package/dist/commands/gateway/index.js +10 -0
- package/dist/commands/gateway/index.js.map +1 -0
- package/dist/commands/gateway/off.d.ts +8 -0
- package/dist/commands/gateway/off.d.ts.map +1 -0
- package/dist/commands/gateway/off.js +70 -0
- package/dist/commands/gateway/off.js.map +1 -0
- package/dist/commands/gateway/on.d.ts +8 -0
- package/dist/commands/gateway/on.d.ts.map +1 -0
- package/dist/commands/gateway/on.js +135 -0
- package/dist/commands/gateway/on.js.map +1 -0
- package/dist/commands/gateway/restart.d.ts +8 -0
- package/dist/commands/gateway/restart.d.ts.map +1 -0
- package/dist/commands/gateway/restart.js +70 -0
- package/dist/commands/gateway/restart.js.map +1 -0
- package/dist/commands/gateway/status.d.ts +8 -0
- package/dist/commands/gateway/status.d.ts.map +1 -0
- package/dist/commands/gateway/status.js +98 -0
- package/dist/commands/gateway/status.js.map +1 -0
- package/dist/commands/gateway/uninstall.d.ts +8 -0
- package/dist/commands/gateway/uninstall.d.ts.map +1 -0
- package/dist/commands/gateway/uninstall.js +80 -0
- package/dist/commands/gateway/uninstall.js.map +1 -0
- package/dist/commands/index.d.ts +1 -5
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/logout.d.ts +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/me.d.ts +1 -1
- package/dist/commands/me.d.ts.map +1 -1
- package/dist/commands/server.d.ts +10 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +60 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/token.d.ts +1 -1
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/components/error-message.d.ts.map +1 -1
- package/dist/components/error-message.js +6 -1
- package/dist/components/error-message.js.map +1 -1
- package/dist/components/info-message.d.ts.map +1 -1
- package/dist/components/info-message.js +5 -1
- package/dist/components/info-message.js.map +1 -1
- package/dist/components/success-message.d.ts.map +1 -1
- package/dist/components/success-message.js +5 -1
- package/dist/components/success-message.js.map +1 -1
- package/dist/components/warning-message.d.ts +2 -3
- package/dist/components/warning-message.d.ts.map +1 -1
- package/dist/components/warning-message.js +10 -4
- package/dist/components/warning-message.js.map +1 -1
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +31 -30
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +4 -36
- package/dist/config/paths.js.map +1 -1
- package/dist/config/preferences.d.ts +14 -0
- package/dist/config/preferences.d.ts.map +1 -0
- package/dist/config/preferences.js +82 -0
- package/dist/config/preferences.js.map +1 -0
- package/dist/config/themes.d.ts +5 -0
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +5 -0
- package/dist/config/themes.js.map +1 -1
- package/dist/server/gateway-client.d.ts +80 -0
- package/dist/server/gateway-client.d.ts.map +1 -0
- package/dist/server/gateway-client.js +280 -0
- package/dist/server/gateway-client.js.map +1 -0
- package/dist/server/gateway-entry.d.ts +7 -0
- package/dist/server/gateway-entry.d.ts.map +1 -0
- package/dist/server/gateway-entry.js +138 -0
- package/dist/server/gateway-entry.js.map +1 -0
- package/dist/server/gateway.d.ts +5 -0
- package/dist/server/gateway.d.ts.map +1 -0
- package/dist/server/gateway.js +136 -0
- package/dist/server/gateway.js.map +1 -0
- package/dist/server/tools/browser-tools.d.ts +28 -0
- package/dist/server/tools/browser-tools.d.ts.map +1 -0
- package/dist/server/tools/browser-tools.js +179 -0
- package/dist/server/tools/browser-tools.js.map +1 -0
- package/dist/server/tools/coding-tools.d.ts +27 -0
- package/dist/server/tools/coding-tools.d.ts.map +1 -0
- package/dist/server/tools/coding-tools.js +345 -0
- package/dist/server/tools/coding-tools.js.map +1 -0
- package/dist/server/tools/exec-tools.d.ts +14 -0
- package/dist/server/tools/exec-tools.d.ts.map +1 -0
- package/dist/server/tools/exec-tools.js +203 -0
- package/dist/server/tools/exec-tools.js.map +1 -0
- package/dist/types/config.d.ts +36 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/agent-browser.d.ts +63 -0
- package/dist/utils/agent-browser.d.ts.map +1 -0
- package/dist/utils/agent-browser.js +301 -0
- package/dist/utils/agent-browser.js.map +1 -0
- package/dist/utils/coding-runner.d.ts +60 -0
- package/dist/utils/coding-runner.d.ts.map +1 -0
- package/dist/utils/coding-runner.js +174 -0
- package/dist/utils/coding-runner.js.map +1 -0
- package/dist/utils/coding-sessions.d.ts +61 -0
- package/dist/utils/coding-sessions.d.ts.map +1 -0
- package/dist/utils/coding-sessions.js +112 -0
- package/dist/utils/coding-sessions.js.map +1 -0
- package/dist/utils/process.d.ts +22 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +81 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/service-manager/index.d.ts +49 -0
- package/dist/utils/service-manager/index.d.ts.map +1 -0
- package/dist/utils/service-manager/index.js +137 -0
- package/dist/utils/service-manager/index.js.map +1 -0
- package/dist/utils/service-manager/launchd.d.ts +31 -0
- package/dist/utils/service-manager/launchd.d.ts.map +1 -0
- package/dist/utils/service-manager/launchd.js +208 -0
- package/dist/utils/service-manager/launchd.js.map +1 -0
- package/dist/utils/service-manager/systemd.d.ts +31 -0
- package/dist/utils/service-manager/systemd.d.ts.map +1 -0
- package/dist/utils/service-manager/systemd.js +187 -0
- package/dist/utils/service-manager/systemd.js.map +1 -0
- package/dist/utils/tmux.d.ts +37 -0
- package/dist/utils/tmux.d.ts.map +1 -0
- package/dist/utils/tmux.js +96 -0
- package/dist/utils/tmux.js.map +1 -0
- package/package.json +15 -12
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { CliBackendConfig } from '../types/config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get agent configuration by name
|
|
4
|
+
*/
|
|
5
|
+
export declare function getAgentConfig(agentName: string): CliBackendConfig | null;
|
|
6
|
+
/**
|
|
7
|
+
* Build command arguments for starting a new session
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildStartArgs(config: CliBackendConfig, params: {
|
|
10
|
+
prompt: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
systemPrompt?: string;
|
|
14
|
+
}): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Build command arguments for resuming an existing session
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildResumeArgs(config: CliBackendConfig, params: {
|
|
19
|
+
prompt: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
}): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Start an agent process in the background
|
|
24
|
+
* Returns immediately, process runs in background
|
|
25
|
+
* Auto-saves output and cleans up memory when process exits
|
|
26
|
+
*/
|
|
27
|
+
export declare function startAgentProcess(sessionId: string, config: CliBackendConfig, args: string[], workingDirectory: string): {
|
|
28
|
+
pid: number | undefined;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Read output from a running or completed process
|
|
32
|
+
*/
|
|
33
|
+
export declare function readProcessOutput(sessionId: string): {
|
|
34
|
+
found: boolean;
|
|
35
|
+
stdout: string;
|
|
36
|
+
stderr: string;
|
|
37
|
+
running: boolean;
|
|
38
|
+
exitCode: number | null;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Check if a process is still running
|
|
42
|
+
*/
|
|
43
|
+
export declare function isProcessRunning(sessionId: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Stop/kill a running process
|
|
46
|
+
*/
|
|
47
|
+
export declare function stopProcess(sessionId: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Clean up a process from memory
|
|
50
|
+
*/
|
|
51
|
+
export declare function cleanupProcess(sessionId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get process info
|
|
54
|
+
*/
|
|
55
|
+
export declare function getProcessInfo(sessionId: string): {
|
|
56
|
+
pid: number | undefined;
|
|
57
|
+
running: boolean;
|
|
58
|
+
startedAt: number;
|
|
59
|
+
} | null;
|
|
60
|
+
//# sourceMappingURL=coding-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding-runner.d.ts","sourceRoot":"","sources":["../../src/utils/coding-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAiBrD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,GACC,MAAM,EAAE,CAoCV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB,GACC,MAAM,EAAE,CAYV;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EAAE,EACd,gBAAgB,EAAE,MAAM,GACtB;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CA4D3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAmBA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAUP"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { getPreferences } from '../config/preferences.js';
|
|
3
|
+
import { completeSession } from '../utils/coding-sessions.js';
|
|
4
|
+
const runningProcesses = new Map();
|
|
5
|
+
// Cleanup delay after process exits (ms) - gives time to read final output
|
|
6
|
+
const CLEANUP_DELAY = 5000;
|
|
7
|
+
/**
|
|
8
|
+
* Get agent configuration by name
|
|
9
|
+
*/
|
|
10
|
+
export function getAgentConfig(agentName) {
|
|
11
|
+
const prefs = getPreferences();
|
|
12
|
+
const coding = prefs.coding;
|
|
13
|
+
if (!coding || !coding[agentName]) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return coding[agentName];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build command arguments for starting a new session
|
|
20
|
+
*/
|
|
21
|
+
export function buildStartArgs(config, params) {
|
|
22
|
+
const args = [...(config.args || [])];
|
|
23
|
+
// Add session arg
|
|
24
|
+
if (config.sessionArg && config.sessionMode === 'always') {
|
|
25
|
+
args.push(config.sessionArg, params.sessionId);
|
|
26
|
+
}
|
|
27
|
+
// Add allowed tools
|
|
28
|
+
if (config.allowedTools && config.allowedTools.length > 0) {
|
|
29
|
+
for (const tool of config.allowedTools) {
|
|
30
|
+
args.push('--allowedTools', tool);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Add disallowed tools
|
|
34
|
+
if (config.disallowedTools && config.disallowedTools.length > 0) {
|
|
35
|
+
for (const tool of config.disallowedTools) {
|
|
36
|
+
args.push('--disallowedTools', tool);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Add model
|
|
40
|
+
if (params.model && config.modelArg) {
|
|
41
|
+
args.push(config.modelArg, params.model);
|
|
42
|
+
}
|
|
43
|
+
// Add system prompt
|
|
44
|
+
if (params.systemPrompt && config.systemPromptArg) {
|
|
45
|
+
args.push(config.systemPromptArg, params.systemPrompt);
|
|
46
|
+
}
|
|
47
|
+
// Add the prompt as the last argument
|
|
48
|
+
args.push(params.prompt);
|
|
49
|
+
return args;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build command arguments for resuming an existing session
|
|
53
|
+
*/
|
|
54
|
+
export function buildResumeArgs(config, params) {
|
|
55
|
+
if (config.resumeArgs) {
|
|
56
|
+
// Use resume args and replace {sessionId} placeholder
|
|
57
|
+
const args = config.resumeArgs.map((arg) => arg.replace('{sessionId}', params.sessionId));
|
|
58
|
+
args.push(params.prompt);
|
|
59
|
+
return args;
|
|
60
|
+
}
|
|
61
|
+
// Fallback to start args with session
|
|
62
|
+
return buildStartArgs(config, params);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Start an agent process in the background
|
|
66
|
+
* Returns immediately, process runs in background
|
|
67
|
+
* Auto-saves output and cleans up memory when process exits
|
|
68
|
+
*/
|
|
69
|
+
export function startAgentProcess(sessionId, config, args, workingDirectory) {
|
|
70
|
+
const proc = spawn(config.command, args, {
|
|
71
|
+
cwd: workingDirectory,
|
|
72
|
+
shell: true,
|
|
73
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
74
|
+
detached: false,
|
|
75
|
+
});
|
|
76
|
+
const runningProc = {
|
|
77
|
+
process: proc,
|
|
78
|
+
stdout: '',
|
|
79
|
+
stderr: '',
|
|
80
|
+
exitCode: null,
|
|
81
|
+
startedAt: Date.now(),
|
|
82
|
+
};
|
|
83
|
+
// Collect stdout
|
|
84
|
+
proc.stdout?.on('data', (data) => {
|
|
85
|
+
runningProc.stdout += data.toString();
|
|
86
|
+
});
|
|
87
|
+
// Collect stderr
|
|
88
|
+
proc.stderr?.on('data', (data) => {
|
|
89
|
+
runningProc.stderr += data.toString();
|
|
90
|
+
});
|
|
91
|
+
// Handle process exit - save to sessions.json and schedule cleanup
|
|
92
|
+
proc.on('close', (code) => {
|
|
93
|
+
runningProc.exitCode = code;
|
|
94
|
+
// Save final output to sessions.json
|
|
95
|
+
completeSession(sessionId, runningProc.stdout, code === 0, runningProc.stderr || undefined);
|
|
96
|
+
// Schedule cleanup after delay to allow final reads
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
runningProcesses.delete(sessionId);
|
|
99
|
+
}, CLEANUP_DELAY);
|
|
100
|
+
});
|
|
101
|
+
proc.on('error', (err) => {
|
|
102
|
+
runningProc.stderr += `\nProcess error: ${err.message}`;
|
|
103
|
+
runningProc.exitCode = 1;
|
|
104
|
+
// Save error to sessions.json
|
|
105
|
+
completeSession(sessionId, runningProc.stdout, false, runningProc.stderr);
|
|
106
|
+
// Schedule cleanup
|
|
107
|
+
setTimeout(() => {
|
|
108
|
+
runningProcesses.delete(sessionId);
|
|
109
|
+
}, CLEANUP_DELAY);
|
|
110
|
+
});
|
|
111
|
+
runningProcesses.set(sessionId, runningProc);
|
|
112
|
+
return { pid: proc.pid };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Read output from a running or completed process
|
|
116
|
+
*/
|
|
117
|
+
export function readProcessOutput(sessionId) {
|
|
118
|
+
const proc = runningProcesses.get(sessionId);
|
|
119
|
+
if (!proc) {
|
|
120
|
+
return {
|
|
121
|
+
found: false,
|
|
122
|
+
stdout: '',
|
|
123
|
+
stderr: '',
|
|
124
|
+
running: false,
|
|
125
|
+
exitCode: null,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
found: true,
|
|
130
|
+
stdout: proc.stdout,
|
|
131
|
+
stderr: proc.stderr,
|
|
132
|
+
running: proc.exitCode === null,
|
|
133
|
+
exitCode: proc.exitCode,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if a process is still running
|
|
138
|
+
*/
|
|
139
|
+
export function isProcessRunning(sessionId) {
|
|
140
|
+
const proc = runningProcesses.get(sessionId);
|
|
141
|
+
return proc ? proc.exitCode === null : false;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Stop/kill a running process
|
|
145
|
+
*/
|
|
146
|
+
export function stopProcess(sessionId) {
|
|
147
|
+
const proc = runningProcesses.get(sessionId);
|
|
148
|
+
if (proc && proc.exitCode === null) {
|
|
149
|
+
proc.process.kill('SIGTERM');
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Clean up a process from memory
|
|
156
|
+
*/
|
|
157
|
+
export function cleanupProcess(sessionId) {
|
|
158
|
+
runningProcesses.delete(sessionId);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get process info
|
|
162
|
+
*/
|
|
163
|
+
export function getProcessInfo(sessionId) {
|
|
164
|
+
const proc = runningProcesses.get(sessionId);
|
|
165
|
+
if (!proc) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
pid: proc.process.pid,
|
|
170
|
+
running: proc.exitCode === null,
|
|
171
|
+
startedAt: proc.startedAt,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=coding-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding-runner.js","sourceRoot":"","sources":["../../src/utils/coding-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type SessionStatus = 'running' | 'completed' | 'error' | 'closed';
|
|
2
|
+
export interface StoredSession {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
agent: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
dir: string;
|
|
7
|
+
status: SessionStatus;
|
|
8
|
+
output?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
startedAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
}
|
|
13
|
+
export interface SessionsData {
|
|
14
|
+
sessions: Record<string, StoredSession>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Ensure sessions directory exists
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureSessionsDir(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Load all sessions from disk
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadSessions(): SessionsData;
|
|
24
|
+
/**
|
|
25
|
+
* Save all sessions to disk
|
|
26
|
+
*/
|
|
27
|
+
export declare function saveSessions(data: SessionsData): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get a single session by ID
|
|
30
|
+
*/
|
|
31
|
+
export declare function getSession(sessionId: string): StoredSession | null;
|
|
32
|
+
/**
|
|
33
|
+
* Create or update a session
|
|
34
|
+
*/
|
|
35
|
+
export declare function updateSession(session: StoredSession): void;
|
|
36
|
+
/**
|
|
37
|
+
* Delete a session by ID
|
|
38
|
+
*/
|
|
39
|
+
export declare function deleteSession(sessionId: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* List all sessions
|
|
42
|
+
*/
|
|
43
|
+
export declare function listSessions(): StoredSession[];
|
|
44
|
+
/**
|
|
45
|
+
* Create a new session object
|
|
46
|
+
*/
|
|
47
|
+
export declare function createSession(params: {
|
|
48
|
+
sessionId: string;
|
|
49
|
+
agent: string;
|
|
50
|
+
prompt: string;
|
|
51
|
+
dir: string;
|
|
52
|
+
}): StoredSession;
|
|
53
|
+
/**
|
|
54
|
+
* Mark session as completed with output
|
|
55
|
+
*/
|
|
56
|
+
export declare function completeSession(sessionId: string, output: string, success: boolean, error?: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Mark session as closed
|
|
59
|
+
*/
|
|
60
|
+
export declare function closeSession(sessionId: string): boolean;
|
|
61
|
+
//# sourceMappingURL=coding-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding-sessions.d.ts","sourceRoot":"","sources":["../../src/utils/coding-sessions.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAGzE,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAW3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAGlE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAI1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAG9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACZ,GAAG,aAAa,CAUhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,GACZ,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CASvD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getConfigPath } from '../config/paths.js';
|
|
4
|
+
// Sessions file path - uses same directory as config
|
|
5
|
+
const SESSIONS_DIR = getConfigPath();
|
|
6
|
+
const SESSIONS_FILE = join(SESSIONS_DIR, 'sessions.json');
|
|
7
|
+
/**
|
|
8
|
+
* Ensure sessions directory exists
|
|
9
|
+
*/
|
|
10
|
+
export function ensureSessionsDir() {
|
|
11
|
+
if (!existsSync(SESSIONS_DIR)) {
|
|
12
|
+
mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load all sessions from disk
|
|
17
|
+
*/
|
|
18
|
+
export function loadSessions() {
|
|
19
|
+
ensureSessionsDir();
|
|
20
|
+
try {
|
|
21
|
+
if (existsSync(SESSIONS_FILE)) {
|
|
22
|
+
const data = readFileSync(SESSIONS_FILE, 'utf-8');
|
|
23
|
+
return JSON.parse(data);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Ignore errors, return empty
|
|
28
|
+
}
|
|
29
|
+
return { sessions: {} };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Save all sessions to disk
|
|
33
|
+
*/
|
|
34
|
+
export function saveSessions(data) {
|
|
35
|
+
ensureSessionsDir();
|
|
36
|
+
writeFileSync(SESSIONS_FILE, JSON.stringify(data, null, 2), 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a single session by ID
|
|
40
|
+
*/
|
|
41
|
+
export function getSession(sessionId) {
|
|
42
|
+
const data = loadSessions();
|
|
43
|
+
return data.sessions[sessionId] || null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create or update a session
|
|
47
|
+
*/
|
|
48
|
+
export function updateSession(session) {
|
|
49
|
+
const data = loadSessions();
|
|
50
|
+
data.sessions[session.sessionId] = session;
|
|
51
|
+
saveSessions(data);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Delete a session by ID
|
|
55
|
+
*/
|
|
56
|
+
export function deleteSession(sessionId) {
|
|
57
|
+
const data = loadSessions();
|
|
58
|
+
if (data.sessions[sessionId]) {
|
|
59
|
+
delete data.sessions[sessionId];
|
|
60
|
+
saveSessions(data);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* List all sessions
|
|
67
|
+
*/
|
|
68
|
+
export function listSessions() {
|
|
69
|
+
const data = loadSessions();
|
|
70
|
+
return Object.values(data.sessions);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a new session object
|
|
74
|
+
*/
|
|
75
|
+
export function createSession(params) {
|
|
76
|
+
return {
|
|
77
|
+
sessionId: params.sessionId,
|
|
78
|
+
agent: params.agent,
|
|
79
|
+
prompt: params.prompt,
|
|
80
|
+
dir: params.dir,
|
|
81
|
+
status: 'running',
|
|
82
|
+
startedAt: Date.now(),
|
|
83
|
+
updatedAt: Date.now(),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Mark session as completed with output
|
|
88
|
+
*/
|
|
89
|
+
export function completeSession(sessionId, output, success, error) {
|
|
90
|
+
const session = getSession(sessionId);
|
|
91
|
+
if (session) {
|
|
92
|
+
session.output = output;
|
|
93
|
+
session.status = success ? 'completed' : 'error';
|
|
94
|
+
session.error = error;
|
|
95
|
+
session.updatedAt = Date.now();
|
|
96
|
+
updateSession(session);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Mark session as closed
|
|
101
|
+
*/
|
|
102
|
+
export function closeSession(sessionId) {
|
|
103
|
+
const session = getSession(sessionId);
|
|
104
|
+
if (session) {
|
|
105
|
+
session.status = 'closed';
|
|
106
|
+
session.updatedAt = Date.now();
|
|
107
|
+
updateSession(session);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=coding-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding-sessions.js","sourceRoot":"","sources":["../../src/utils/coding-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAE7C,qDAAqD;AACrD,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC;AACrC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAsB1D;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAChC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,YAAY,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC5C,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,iBAAiB,EAAE,CAAC;IACpB,IAAI,CAAC;QACJ,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QACzC,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,8BAA8B;IAC/B,CAAC;IACD,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC9C,iBAAiB,EAAE,CAAC;IACpB,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC3C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB;IACnD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC9C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAK7B;IACA,OAAO;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,SAAiB,EACjB,MAAc,EACd,OAAgB,EAChB,KAAc;IAEd,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QACjD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,aAAa,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface SpawnOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
env?: NodeJS.ProcessEnv;
|
|
4
|
+
logFile?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Spawn a detached background process that continues running after parent exits
|
|
8
|
+
*/
|
|
9
|
+
export declare function spawnDetached(command: string, args: string[], options?: SpawnOptions): number;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a process is running by PID
|
|
12
|
+
*/
|
|
13
|
+
export declare function isPidRunning(pid: number): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Kill a process by PID
|
|
16
|
+
*/
|
|
17
|
+
export declare function killProcess(pid: number, signal?: NodeJS.Signals): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Kill a process and wait for it to exit
|
|
20
|
+
*/
|
|
21
|
+
export declare function killProcessAndWait(pid: number, timeout?: number): Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,YAAiB,GACxB,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,OAAO,CAOpF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,SAAO,GACZ,OAAO,CAAC,OAAO,CAAC,CAuBlB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getConfigPath } from '../config/paths.js';
|
|
5
|
+
const COREBRAIN_DIR = getConfigPath();
|
|
6
|
+
const LOGS_DIR = join(COREBRAIN_DIR, 'logs');
|
|
7
|
+
// Ensure directories exist
|
|
8
|
+
if (!existsSync(COREBRAIN_DIR)) {
|
|
9
|
+
mkdirSync(COREBRAIN_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
if (!existsSync(LOGS_DIR)) {
|
|
12
|
+
mkdirSync(LOGS_DIR, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Spawn a detached background process that continues running after parent exits
|
|
16
|
+
*/
|
|
17
|
+
export function spawnDetached(command, args, options = {}) {
|
|
18
|
+
const logFile = options.logFile || join(LOGS_DIR, `gateway-${Date.now()}.log`);
|
|
19
|
+
const child = spawn(command, args, {
|
|
20
|
+
detached: true,
|
|
21
|
+
stdio: 'ignore', // Detach from parent's stdio
|
|
22
|
+
cwd: options.cwd || process.cwd(),
|
|
23
|
+
env: { ...process.env, ...options.env },
|
|
24
|
+
});
|
|
25
|
+
// Unref so parent can exit independently
|
|
26
|
+
child.unref();
|
|
27
|
+
// Write PID to log for debugging
|
|
28
|
+
writeFileSync(logFile, `Started process ${child.pid} at ${new Date().toISOString()}\n`);
|
|
29
|
+
if (!child.pid) {
|
|
30
|
+
throw new Error('Failed to spawn process - no PID returned');
|
|
31
|
+
}
|
|
32
|
+
return child.pid;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a process is running by PID
|
|
36
|
+
*/
|
|
37
|
+
export function isPidRunning(pid) {
|
|
38
|
+
try {
|
|
39
|
+
// Sending signal 0 checks if process exists without killing it
|
|
40
|
+
process.kill(pid, 0);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Kill a process by PID
|
|
49
|
+
*/
|
|
50
|
+
export function killProcess(pid, signal = 'SIGTERM') {
|
|
51
|
+
try {
|
|
52
|
+
process.kill(pid, signal);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Kill a process and wait for it to exit
|
|
61
|
+
*/
|
|
62
|
+
export async function killProcessAndWait(pid, timeout = 5000) {
|
|
63
|
+
if (!isPidRunning(pid)) {
|
|
64
|
+
return true; // Already dead
|
|
65
|
+
}
|
|
66
|
+
// Try graceful shutdown first
|
|
67
|
+
killProcess(pid, 'SIGTERM');
|
|
68
|
+
const start = Date.now();
|
|
69
|
+
while (Date.now() - start < timeout) {
|
|
70
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
71
|
+
if (!isPidRunning(pid)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Force kill if still running
|
|
76
|
+
killProcess(pid, 'SIGKILL');
|
|
77
|
+
// Wait a bit more
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
79
|
+
return !isPidRunning(pid);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type ServiceType = 'launchd' | 'systemd' | 'none';
|
|
2
|
+
export type ServiceStatus = 'running' | 'stopped' | 'not-installed';
|
|
3
|
+
export interface ServiceConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
command: string;
|
|
7
|
+
args: string[];
|
|
8
|
+
port: number;
|
|
9
|
+
workingDirectory: string;
|
|
10
|
+
logPath: string;
|
|
11
|
+
errorLogPath: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Detect the appropriate service manager for the current platform
|
|
15
|
+
*/
|
|
16
|
+
export declare function getServiceType(): ServiceType;
|
|
17
|
+
/**
|
|
18
|
+
* Get the service name for the current platform
|
|
19
|
+
*/
|
|
20
|
+
export declare function getServiceName(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Install the gateway as an OS-level service
|
|
23
|
+
*/
|
|
24
|
+
export declare function installService(config: ServiceConfig): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Uninstall the gateway OS-level service
|
|
27
|
+
*/
|
|
28
|
+
export declare function uninstallService(name: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if the gateway service is installed
|
|
31
|
+
*/
|
|
32
|
+
export declare function isServiceInstalled(name: string): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the current status of the gateway service
|
|
35
|
+
*/
|
|
36
|
+
export declare function getServiceStatus(name: string): Promise<ServiceStatus>;
|
|
37
|
+
/**
|
|
38
|
+
* Start the gateway service
|
|
39
|
+
*/
|
|
40
|
+
export declare function startService(name: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Stop the gateway service
|
|
43
|
+
*/
|
|
44
|
+
export declare function stopService(name: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get the PID of the running gateway service
|
|
47
|
+
*/
|
|
48
|
+
export declare function getServicePid(name: string): number | null;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/service-manager/index.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAS5C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAelE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAW3E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWzD"}
|