@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.
Files changed (181) hide show
  1. package/dist/commands/browser/close.d.ts +10 -0
  2. package/dist/commands/browser/close.d.ts.map +1 -0
  3. package/dist/commands/browser/close.js +60 -0
  4. package/dist/commands/browser/close.js.map +1 -0
  5. package/dist/commands/browser/command.d.ts +10 -0
  6. package/dist/commands/browser/command.d.ts.map +1 -0
  7. package/dist/commands/browser/command.js +67 -0
  8. package/dist/commands/browser/command.js.map +1 -0
  9. package/dist/commands/browser/create-profile.d.ts +10 -0
  10. package/dist/commands/browser/create-profile.d.ts.map +1 -0
  11. package/dist/commands/browser/create-profile.js +29 -0
  12. package/dist/commands/browser/create-profile.js.map +1 -0
  13. package/dist/commands/browser/delete-profile.d.ts +10 -0
  14. package/dist/commands/browser/delete-profile.d.ts.map +1 -0
  15. package/dist/commands/browser/delete-profile.js +27 -0
  16. package/dist/commands/browser/delete-profile.js.map +1 -0
  17. package/dist/commands/browser/install.d.ts +8 -0
  18. package/dist/commands/browser/install.d.ts.map +1 -0
  19. package/dist/commands/browser/install.js +49 -0
  20. package/dist/commands/browser/install.js.map +1 -0
  21. package/dist/commands/browser/open.d.ts +12 -0
  22. package/dist/commands/browser/open.d.ts.map +1 -0
  23. package/dist/commands/browser/open.js +65 -0
  24. package/dist/commands/browser/open.js.map +1 -0
  25. package/dist/commands/browser/status.d.ts +8 -0
  26. package/dist/commands/browser/status.d.ts.map +1 -0
  27. package/dist/commands/browser/status.js +48 -0
  28. package/dist/commands/browser/status.js.map +1 -0
  29. package/dist/commands/coding/[agent]/config.d.ts +18 -0
  30. package/dist/commands/coding/[agent]/config.d.ts.map +1 -0
  31. package/dist/commands/coding/[agent]/config.js +91 -0
  32. package/dist/commands/coding/[agent]/config.js.map +1 -0
  33. package/dist/commands/coding/config.d.ts +23 -0
  34. package/dist/commands/coding/config.d.ts.map +1 -0
  35. package/dist/commands/coding/config.js +116 -0
  36. package/dist/commands/coding/config.js.map +1 -0
  37. package/dist/commands/coding/index.d.ts +8 -0
  38. package/dist/commands/coding/index.d.ts.map +1 -0
  39. package/dist/commands/coding/index.js +42 -0
  40. package/dist/commands/coding/index.js.map +1 -0
  41. package/dist/commands/coding/remove.d.ts +10 -0
  42. package/dist/commands/coding/remove.d.ts.map +1 -0
  43. package/dist/commands/coding/remove.js +37 -0
  44. package/dist/commands/coding/remove.js.map +1 -0
  45. package/dist/commands/coding/setup.d.ts +8 -0
  46. package/dist/commands/coding/setup.d.ts.map +1 -0
  47. package/dist/commands/coding/setup.js +114 -0
  48. package/dist/commands/coding/setup.js.map +1 -0
  49. package/dist/commands/exec/config.d.ts +14 -0
  50. package/dist/commands/exec/config.d.ts.map +1 -0
  51. package/dist/commands/exec/config.js +79 -0
  52. package/dist/commands/exec/config.js.map +1 -0
  53. package/dist/commands/gateway/config.d.ts +8 -0
  54. package/dist/commands/gateway/config.d.ts.map +1 -0
  55. package/dist/commands/gateway/config.js +192 -0
  56. package/dist/commands/gateway/config.js.map +1 -0
  57. package/dist/commands/gateway/index.d.ts +14 -0
  58. package/dist/commands/gateway/index.d.ts.map +1 -0
  59. package/dist/commands/gateway/index.js +10 -0
  60. package/dist/commands/gateway/index.js.map +1 -0
  61. package/dist/commands/gateway/off.d.ts +8 -0
  62. package/dist/commands/gateway/off.d.ts.map +1 -0
  63. package/dist/commands/gateway/off.js +70 -0
  64. package/dist/commands/gateway/off.js.map +1 -0
  65. package/dist/commands/gateway/on.d.ts +8 -0
  66. package/dist/commands/gateway/on.d.ts.map +1 -0
  67. package/dist/commands/gateway/on.js +135 -0
  68. package/dist/commands/gateway/on.js.map +1 -0
  69. package/dist/commands/gateway/restart.d.ts +8 -0
  70. package/dist/commands/gateway/restart.d.ts.map +1 -0
  71. package/dist/commands/gateway/restart.js +70 -0
  72. package/dist/commands/gateway/restart.js.map +1 -0
  73. package/dist/commands/gateway/status.d.ts +8 -0
  74. package/dist/commands/gateway/status.d.ts.map +1 -0
  75. package/dist/commands/gateway/status.js +98 -0
  76. package/dist/commands/gateway/status.js.map +1 -0
  77. package/dist/commands/gateway/uninstall.d.ts +8 -0
  78. package/dist/commands/gateway/uninstall.d.ts.map +1 -0
  79. package/dist/commands/gateway/uninstall.js +80 -0
  80. package/dist/commands/gateway/uninstall.js.map +1 -0
  81. package/dist/commands/index.d.ts +1 -5
  82. package/dist/commands/index.d.ts.map +1 -1
  83. package/dist/commands/login.d.ts +1 -1
  84. package/dist/commands/login.d.ts.map +1 -1
  85. package/dist/commands/logout.d.ts +1 -1
  86. package/dist/commands/logout.d.ts.map +1 -1
  87. package/dist/commands/me.d.ts +1 -1
  88. package/dist/commands/me.d.ts.map +1 -1
  89. package/dist/commands/server.d.ts +10 -0
  90. package/dist/commands/server.d.ts.map +1 -0
  91. package/dist/commands/server.js +60 -0
  92. package/dist/commands/server.js.map +1 -0
  93. package/dist/commands/token.d.ts +1 -1
  94. package/dist/commands/token.d.ts.map +1 -1
  95. package/dist/components/error-message.d.ts.map +1 -1
  96. package/dist/components/error-message.js +6 -1
  97. package/dist/components/error-message.js.map +1 -1
  98. package/dist/components/info-message.d.ts.map +1 -1
  99. package/dist/components/info-message.js +5 -1
  100. package/dist/components/info-message.js.map +1 -1
  101. package/dist/components/success-message.d.ts.map +1 -1
  102. package/dist/components/success-message.js +5 -1
  103. package/dist/components/success-message.js.map +1 -1
  104. package/dist/components/warning-message.d.ts +2 -3
  105. package/dist/components/warning-message.d.ts.map +1 -1
  106. package/dist/components/warning-message.js +10 -4
  107. package/dist/components/warning-message.js.map +1 -1
  108. package/dist/config/index.d.ts +4 -0
  109. package/dist/config/index.d.ts.map +1 -1
  110. package/dist/config/index.js +31 -30
  111. package/dist/config/index.js.map +1 -1
  112. package/dist/config/paths.d.ts.map +1 -1
  113. package/dist/config/paths.js +4 -36
  114. package/dist/config/paths.js.map +1 -1
  115. package/dist/config/preferences.d.ts +14 -0
  116. package/dist/config/preferences.d.ts.map +1 -0
  117. package/dist/config/preferences.js +82 -0
  118. package/dist/config/preferences.js.map +1 -0
  119. package/dist/config/themes.d.ts +5 -0
  120. package/dist/config/themes.d.ts.map +1 -1
  121. package/dist/config/themes.js +5 -0
  122. package/dist/config/themes.js.map +1 -1
  123. package/dist/server/gateway-client.d.ts +80 -0
  124. package/dist/server/gateway-client.d.ts.map +1 -0
  125. package/dist/server/gateway-client.js +280 -0
  126. package/dist/server/gateway-client.js.map +1 -0
  127. package/dist/server/gateway-entry.d.ts +7 -0
  128. package/dist/server/gateway-entry.d.ts.map +1 -0
  129. package/dist/server/gateway-entry.js +138 -0
  130. package/dist/server/gateway-entry.js.map +1 -0
  131. package/dist/server/gateway.d.ts +5 -0
  132. package/dist/server/gateway.d.ts.map +1 -0
  133. package/dist/server/gateway.js +136 -0
  134. package/dist/server/gateway.js.map +1 -0
  135. package/dist/server/tools/browser-tools.d.ts +28 -0
  136. package/dist/server/tools/browser-tools.d.ts.map +1 -0
  137. package/dist/server/tools/browser-tools.js +179 -0
  138. package/dist/server/tools/browser-tools.js.map +1 -0
  139. package/dist/server/tools/coding-tools.d.ts +27 -0
  140. package/dist/server/tools/coding-tools.d.ts.map +1 -0
  141. package/dist/server/tools/coding-tools.js +345 -0
  142. package/dist/server/tools/coding-tools.js.map +1 -0
  143. package/dist/server/tools/exec-tools.d.ts +14 -0
  144. package/dist/server/tools/exec-tools.d.ts.map +1 -0
  145. package/dist/server/tools/exec-tools.js +203 -0
  146. package/dist/server/tools/exec-tools.js.map +1 -0
  147. package/dist/types/config.d.ts +36 -0
  148. package/dist/types/config.d.ts.map +1 -1
  149. package/dist/utils/agent-browser.d.ts +63 -0
  150. package/dist/utils/agent-browser.d.ts.map +1 -0
  151. package/dist/utils/agent-browser.js +301 -0
  152. package/dist/utils/agent-browser.js.map +1 -0
  153. package/dist/utils/coding-runner.d.ts +60 -0
  154. package/dist/utils/coding-runner.d.ts.map +1 -0
  155. package/dist/utils/coding-runner.js +174 -0
  156. package/dist/utils/coding-runner.js.map +1 -0
  157. package/dist/utils/coding-sessions.d.ts +61 -0
  158. package/dist/utils/coding-sessions.d.ts.map +1 -0
  159. package/dist/utils/coding-sessions.js +112 -0
  160. package/dist/utils/coding-sessions.js.map +1 -0
  161. package/dist/utils/process.d.ts +22 -0
  162. package/dist/utils/process.d.ts.map +1 -0
  163. package/dist/utils/process.js +81 -0
  164. package/dist/utils/process.js.map +1 -0
  165. package/dist/utils/service-manager/index.d.ts +49 -0
  166. package/dist/utils/service-manager/index.d.ts.map +1 -0
  167. package/dist/utils/service-manager/index.js +137 -0
  168. package/dist/utils/service-manager/index.js.map +1 -0
  169. package/dist/utils/service-manager/launchd.d.ts +31 -0
  170. package/dist/utils/service-manager/launchd.d.ts.map +1 -0
  171. package/dist/utils/service-manager/launchd.js +208 -0
  172. package/dist/utils/service-manager/launchd.js.map +1 -0
  173. package/dist/utils/service-manager/systemd.d.ts +31 -0
  174. package/dist/utils/service-manager/systemd.d.ts.map +1 -0
  175. package/dist/utils/service-manager/systemd.js +187 -0
  176. package/dist/utils/service-manager/systemd.js.map +1 -0
  177. package/dist/utils/tmux.d.ts +37 -0
  178. package/dist/utils/tmux.d.ts.map +1 -0
  179. package/dist/utils/tmux.js +96 -0
  180. package/dist/utils/tmux.js.map +1 -0
  181. package/package.json +15 -12
@@ -0,0 +1,137 @@
1
+ import { platform } from 'node:os';
2
+ import { installLaunchdService, uninstallLaunchdService, isLaunchdServiceInstalled, getLaunchdServiceStatus, startLaunchdService, stopLaunchdService, getLaunchdServicePid, LAUNCHD_SERVICE_NAME, } from './launchd.js';
3
+ import { installSystemdService, uninstallSystemdService, isSystemdServiceInstalled, getSystemdServiceStatus, startSystemdService, stopSystemdService, getSystemdServicePid, SYSTEMD_SERVICE_NAME, } from './systemd.js';
4
+ /**
5
+ * Detect the appropriate service manager for the current platform
6
+ */
7
+ export function getServiceType() {
8
+ const os = platform();
9
+ if (os === 'darwin') {
10
+ return 'launchd';
11
+ }
12
+ if (os === 'linux') {
13
+ return 'systemd';
14
+ }
15
+ return 'none';
16
+ }
17
+ /**
18
+ * Get the service name for the current platform
19
+ */
20
+ export function getServiceName() {
21
+ const serviceType = getServiceType();
22
+ switch (serviceType) {
23
+ case 'launchd':
24
+ return LAUNCHD_SERVICE_NAME;
25
+ case 'systemd':
26
+ return SYSTEMD_SERVICE_NAME;
27
+ default:
28
+ return 'corebrain-gateway';
29
+ }
30
+ }
31
+ /**
32
+ * Install the gateway as an OS-level service
33
+ */
34
+ export async function installService(config) {
35
+ const serviceType = getServiceType();
36
+ switch (serviceType) {
37
+ case 'launchd':
38
+ await installLaunchdService(config);
39
+ break;
40
+ case 'systemd':
41
+ await installSystemdService(config);
42
+ break;
43
+ case 'none':
44
+ throw new Error('Service installation is not supported on this platform. Only macOS (launchd) and Linux (systemd) are supported.');
45
+ }
46
+ }
47
+ /**
48
+ * Uninstall the gateway OS-level service
49
+ */
50
+ export async function uninstallService(name) {
51
+ const serviceType = getServiceType();
52
+ switch (serviceType) {
53
+ case 'launchd':
54
+ await uninstallLaunchdService(name);
55
+ break;
56
+ case 'systemd':
57
+ await uninstallSystemdService(name);
58
+ break;
59
+ case 'none':
60
+ throw new Error('Service management is not supported on this platform.');
61
+ }
62
+ }
63
+ /**
64
+ * Check if the gateway service is installed
65
+ */
66
+ export async function isServiceInstalled(name) {
67
+ const serviceType = getServiceType();
68
+ switch (serviceType) {
69
+ case 'launchd':
70
+ return isLaunchdServiceInstalled(name);
71
+ case 'systemd':
72
+ return isSystemdServiceInstalled(name);
73
+ case 'none':
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Get the current status of the gateway service
79
+ */
80
+ export async function getServiceStatus(name) {
81
+ const serviceType = getServiceType();
82
+ switch (serviceType) {
83
+ case 'launchd':
84
+ return getLaunchdServiceStatus(name);
85
+ case 'systemd':
86
+ return getSystemdServiceStatus(name);
87
+ case 'none':
88
+ return 'not-installed';
89
+ }
90
+ }
91
+ /**
92
+ * Start the gateway service
93
+ */
94
+ export async function startService(name) {
95
+ const serviceType = getServiceType();
96
+ switch (serviceType) {
97
+ case 'launchd':
98
+ await startLaunchdService(name);
99
+ break;
100
+ case 'systemd':
101
+ await startSystemdService(name);
102
+ break;
103
+ case 'none':
104
+ throw new Error('Service management is not supported on this platform.');
105
+ }
106
+ }
107
+ /**
108
+ * Stop the gateway service
109
+ */
110
+ export async function stopService(name) {
111
+ const serviceType = getServiceType();
112
+ switch (serviceType) {
113
+ case 'launchd':
114
+ await stopLaunchdService(name);
115
+ break;
116
+ case 'systemd':
117
+ await stopSystemdService(name);
118
+ break;
119
+ case 'none':
120
+ throw new Error('Service management is not supported on this platform.');
121
+ }
122
+ }
123
+ /**
124
+ * Get the PID of the running gateway service
125
+ */
126
+ export function getServicePid(name) {
127
+ const serviceType = getServiceType();
128
+ switch (serviceType) {
129
+ case 'launchd':
130
+ return getLaunchdServicePid(name);
131
+ case 'systemd':
132
+ return getSystemdServicePid(name);
133
+ case 'none':
134
+ return null;
135
+ }
136
+ }
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/service-manager/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ServiceConfig, ServiceStatus } from './index.js';
2
+ export declare const LAUNCHD_SERVICE_NAME = "dev.corebrain.gateway";
3
+ /**
4
+ * Install the gateway as a launchd service
5
+ */
6
+ export declare function installLaunchdService(config: ServiceConfig): Promise<void>;
7
+ /**
8
+ * Uninstall the launchd service
9
+ */
10
+ export declare function uninstallLaunchdService(name: string): Promise<void>;
11
+ /**
12
+ * Check if the launchd service is installed
13
+ */
14
+ export declare function isLaunchdServiceInstalled(name: string): boolean;
15
+ /**
16
+ * Get the status of the launchd service
17
+ */
18
+ export declare function getLaunchdServiceStatus(name: string): Promise<ServiceStatus>;
19
+ /**
20
+ * Start the launchd service
21
+ */
22
+ export declare function startLaunchdService(name: string): Promise<void>;
23
+ /**
24
+ * Stop the launchd service
25
+ */
26
+ export declare function stopLaunchdService(name: string): Promise<void>;
27
+ /**
28
+ * Get the PID of the running launchd service
29
+ */
30
+ export declare function getLaunchdServicePid(name: string): number | null;
31
+ //# sourceMappingURL=launchd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../../../src/utils/service-manager/launchd.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAE1D,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAqE5D;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC5C,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhE"}
@@ -0,0 +1,208 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ export const LAUNCHD_SERVICE_NAME = 'dev.corebrain.gateway';
6
+ const LAUNCH_AGENTS_DIR = join(homedir(), 'Library', 'LaunchAgents');
7
+ function getPlistPath(name) {
8
+ return join(LAUNCH_AGENTS_DIR, `${name}.plist`);
9
+ }
10
+ function generatePlist(config) {
11
+ // Expand ~ to home directory for log paths
12
+ const expandPath = (p) => p.replace(/^~/, homedir());
13
+ const logPath = expandPath(config.logPath);
14
+ const errorLogPath = expandPath(config.errorLogPath);
15
+ // Ensure log directory exists
16
+ const logDir = logPath.substring(0, logPath.lastIndexOf('/'));
17
+ if (!existsSync(logDir)) {
18
+ mkdirSync(logDir, { recursive: true });
19
+ }
20
+ // Build program arguments array
21
+ const programArgs = [config.command, ...config.args]
22
+ .map(arg => ` <string>${escapeXml(arg)}</string>`)
23
+ .join('\n');
24
+ const userPath = process.env.PATH;
25
+ return `<?xml version="1.0" encoding="UTF-8"?>
26
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
27
+ <plist version="1.0">
28
+ <dict>
29
+ <key>Label</key>
30
+ <string>${escapeXml(config.name)}</string>
31
+ <key>ProgramArguments</key>
32
+ <array>
33
+ ${programArgs}
34
+ </array>
35
+ <key>WorkingDirectory</key>
36
+ <string>${escapeXml(config.workingDirectory)}</string>
37
+ <key>RunAtLoad</key>
38
+ <true/>
39
+ <key>KeepAlive</key>
40
+ <dict>
41
+ <key>SuccessfulExit</key>
42
+ <false/>
43
+ </dict>
44
+ <key>StandardOutPath</key>
45
+ <string>${escapeXml(logPath)}</string>
46
+ <key>StandardErrorPath</key>
47
+ <string>${escapeXml(errorLogPath)}</string>
48
+ <key>EnvironmentVariables</key>
49
+ <dict>
50
+ <key>PATH</key>
51
+ <string>${userPath}</string>
52
+ </dict>
53
+ </dict>
54
+ </plist>
55
+ `;
56
+ }
57
+ function escapeXml(str) {
58
+ return str
59
+ .replace(/&/g, '&amp;')
60
+ .replace(/</g, '&lt;')
61
+ .replace(/>/g, '&gt;')
62
+ .replace(/"/g, '&quot;')
63
+ .replace(/'/g, '&apos;');
64
+ }
65
+ /**
66
+ * Install the gateway as a launchd service
67
+ */
68
+ export async function installLaunchdService(config) {
69
+ // Ensure LaunchAgents directory exists
70
+ if (!existsSync(LAUNCH_AGENTS_DIR)) {
71
+ mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });
72
+ }
73
+ const plistPath = getPlistPath(config.name);
74
+ // Unload existing service if it exists
75
+ if (existsSync(plistPath)) {
76
+ try {
77
+ execSync(`launchctl unload "${plistPath}"`, { stdio: 'ignore' });
78
+ }
79
+ catch {
80
+ // Ignore errors if service wasn't loaded
81
+ }
82
+ }
83
+ // Generate and write plist file
84
+ const plistContent = generatePlist(config);
85
+ writeFileSync(plistPath, plistContent, 'utf-8');
86
+ // Load the service
87
+ try {
88
+ execSync(`launchctl load "${plistPath}"`, { stdio: 'pipe' });
89
+ }
90
+ catch (error) {
91
+ throw new Error(`Failed to load launchd service: ${error instanceof Error ? error.message : String(error)}`);
92
+ }
93
+ }
94
+ /**
95
+ * Uninstall the launchd service
96
+ */
97
+ export async function uninstallLaunchdService(name) {
98
+ const plistPath = getPlistPath(name);
99
+ if (!existsSync(plistPath)) {
100
+ return; // Nothing to uninstall
101
+ }
102
+ // Unload the service
103
+ try {
104
+ execSync(`launchctl unload "${plistPath}"`, { stdio: 'ignore' });
105
+ }
106
+ catch {
107
+ // Ignore errors if service wasn't loaded
108
+ }
109
+ // Remove the plist file
110
+ unlinkSync(plistPath);
111
+ }
112
+ /**
113
+ * Check if the launchd service is installed
114
+ */
115
+ export function isLaunchdServiceInstalled(name) {
116
+ const plistPath = getPlistPath(name);
117
+ return existsSync(plistPath);
118
+ }
119
+ /**
120
+ * Get the status of the launchd service
121
+ */
122
+ export async function getLaunchdServiceStatus(name) {
123
+ if (!isLaunchdServiceInstalled(name)) {
124
+ return 'not-installed';
125
+ }
126
+ try {
127
+ // Use launchctl list | grep to get tabular format: "PID\tStatus\tLabel"
128
+ const output = execSync(`launchctl list | grep "${name}" 2>/dev/null`, {
129
+ encoding: 'utf-8',
130
+ });
131
+ // Parse output: "86602\t0\tdev.corebrain.gateway" or "-\t0\tdev.corebrain.gateway"
132
+ const line = output.trim();
133
+ if (line) {
134
+ const parts = line.split(/\s+/);
135
+ if (parts.length >= 1) {
136
+ const pid = parts[0];
137
+ if (pid && pid !== '-' && !isNaN(parseInt(pid, 10))) {
138
+ return 'running';
139
+ }
140
+ }
141
+ }
142
+ return 'stopped';
143
+ }
144
+ catch {
145
+ // Service not loaded or grep found nothing
146
+ return 'stopped';
147
+ }
148
+ }
149
+ /**
150
+ * Start the launchd service
151
+ */
152
+ export async function startLaunchdService(name) {
153
+ const plistPath = getPlistPath(name);
154
+ if (!existsSync(plistPath)) {
155
+ throw new Error(`Service ${name} is not installed`);
156
+ }
157
+ try {
158
+ // First ensure it's loaded
159
+ execSync(`launchctl load "${plistPath}" 2>/dev/null`, { stdio: 'ignore' });
160
+ }
161
+ catch {
162
+ // May already be loaded, ignore
163
+ }
164
+ try {
165
+ // Start the service
166
+ execSync(`launchctl start "${name}"`, { stdio: 'pipe' });
167
+ }
168
+ catch (error) {
169
+ throw new Error(`Failed to start service: ${error instanceof Error ? error.message : String(error)}`);
170
+ }
171
+ }
172
+ /**
173
+ * Stop the launchd service
174
+ */
175
+ export async function stopLaunchdService(name) {
176
+ try {
177
+ execSync(`launchctl stop "${name}"`, { stdio: 'pipe' });
178
+ }
179
+ catch (error) {
180
+ throw new Error(`Failed to stop service: ${error instanceof Error ? error.message : String(error)}`);
181
+ }
182
+ }
183
+ /**
184
+ * Get the PID of the running launchd service
185
+ */
186
+ export function getLaunchdServicePid(name) {
187
+ try {
188
+ // Use launchctl list | grep to get tabular format
189
+ const output = execSync(`launchctl list | grep "${name}" 2>/dev/null`, {
190
+ encoding: 'utf-8',
191
+ });
192
+ const line = output.trim();
193
+ if (line) {
194
+ const parts = line.split(/\s+/);
195
+ if (parts.length >= 1) {
196
+ const pid = parseInt(parts[0], 10);
197
+ if (!isNaN(pid) && pid > 0) {
198
+ return pid;
199
+ }
200
+ }
201
+ }
202
+ return null;
203
+ }
204
+ catch {
205
+ return null;
206
+ }
207
+ }
208
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../src/utils/service-manager/launchd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ServiceConfig, ServiceStatus } from './index.js';
2
+ export declare const SYSTEMD_SERVICE_NAME = "corebrain-gateway";
3
+ /**
4
+ * Install the gateway as a systemd user service
5
+ */
6
+ export declare function installSystemdService(config: ServiceConfig): Promise<void>;
7
+ /**
8
+ * Uninstall the systemd user service
9
+ */
10
+ export declare function uninstallSystemdService(name: string): Promise<void>;
11
+ /**
12
+ * Check if the systemd service is installed
13
+ */
14
+ export declare function isSystemdServiceInstalled(name: string): boolean;
15
+ /**
16
+ * Get the status of the systemd service
17
+ */
18
+ export declare function getSystemdServiceStatus(name: string): Promise<ServiceStatus>;
19
+ /**
20
+ * Start the systemd service
21
+ */
22
+ export declare function startSystemdService(name: string): Promise<void>;
23
+ /**
24
+ * Stop the systemd service
25
+ */
26
+ export declare function stopSystemdService(name: string): Promise<void>;
27
+ /**
28
+ * Get the PID of the running systemd service
29
+ */
30
+ export declare function getSystemdServicePid(name: string): number | null;
31
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../../src/utils/service-manager/systemd.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5D,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AA0CxD;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ChF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BzE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBlF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBhE"}
@@ -0,0 +1,187 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ export const SYSTEMD_SERVICE_NAME = 'corebrain-gateway';
6
+ const SYSTEMD_USER_DIR = join(homedir(), '.config', 'systemd', 'user');
7
+ function getServiceFilePath(name) {
8
+ return join(SYSTEMD_USER_DIR, `${name}.service`);
9
+ }
10
+ function generateServiceUnit(config) {
11
+ // Expand ~ to home directory for log paths
12
+ const expandPath = (p) => p.replace(/^~/, homedir());
13
+ const logPath = expandPath(config.logPath);
14
+ const errorLogPath = expandPath(config.errorLogPath);
15
+ // Ensure log directory exists
16
+ const logDir = logPath.substring(0, logPath.lastIndexOf('/'));
17
+ if (!existsSync(logDir)) {
18
+ mkdirSync(logDir, { recursive: true });
19
+ }
20
+ // Build ExecStart command
21
+ const execStart = [config.command, ...config.args].join(' ');
22
+ return `[Unit]
23
+ Description=${config.displayName}
24
+ After=network.target
25
+
26
+ [Service]
27
+ Type=simple
28
+ ExecStart=${execStart}
29
+ WorkingDirectory=${config.workingDirectory}
30
+ Restart=on-failure
31
+ RestartSec=5
32
+ StandardOutput=append:${logPath}
33
+ StandardError=append:${errorLogPath}
34
+ Environment=PATH=/usr/local/bin:/usr/bin:/bin
35
+
36
+ [Install]
37
+ WantedBy=default.target
38
+ `;
39
+ }
40
+ /**
41
+ * Install the gateway as a systemd user service
42
+ */
43
+ export async function installSystemdService(config) {
44
+ // Ensure systemd user directory exists
45
+ if (!existsSync(SYSTEMD_USER_DIR)) {
46
+ mkdirSync(SYSTEMD_USER_DIR, { recursive: true });
47
+ }
48
+ const servicePath = getServiceFilePath(config.name);
49
+ // Stop existing service if running
50
+ try {
51
+ execSync(`systemctl --user stop ${config.name}`, { stdio: 'ignore' });
52
+ }
53
+ catch {
54
+ // Ignore errors if service wasn't running
55
+ }
56
+ // Generate and write service file
57
+ const serviceContent = generateServiceUnit(config);
58
+ writeFileSync(servicePath, serviceContent, 'utf-8');
59
+ // Reload systemd daemon
60
+ try {
61
+ execSync('systemctl --user daemon-reload', { stdio: 'pipe' });
62
+ }
63
+ catch (error) {
64
+ throw new Error(`Failed to reload systemd daemon: ${error instanceof Error ? error.message : String(error)}`);
65
+ }
66
+ // Enable the service (start on login)
67
+ try {
68
+ execSync(`systemctl --user enable ${config.name}`, { stdio: 'pipe' });
69
+ }
70
+ catch (error) {
71
+ throw new Error(`Failed to enable systemd service: ${error instanceof Error ? error.message : String(error)}`);
72
+ }
73
+ // Start the service
74
+ try {
75
+ execSync(`systemctl --user start ${config.name}`, { stdio: 'pipe' });
76
+ }
77
+ catch (error) {
78
+ throw new Error(`Failed to start systemd service: ${error instanceof Error ? error.message : String(error)}`);
79
+ }
80
+ }
81
+ /**
82
+ * Uninstall the systemd user service
83
+ */
84
+ export async function uninstallSystemdService(name) {
85
+ const servicePath = getServiceFilePath(name);
86
+ // Stop the service
87
+ try {
88
+ execSync(`systemctl --user stop ${name}`, { stdio: 'ignore' });
89
+ }
90
+ catch {
91
+ // Ignore errors if service wasn't running
92
+ }
93
+ // Disable the service
94
+ try {
95
+ execSync(`systemctl --user disable ${name}`, { stdio: 'ignore' });
96
+ }
97
+ catch {
98
+ // Ignore errors if service wasn't enabled
99
+ }
100
+ // Remove the service file
101
+ if (existsSync(servicePath)) {
102
+ unlinkSync(servicePath);
103
+ }
104
+ // Reload systemd daemon
105
+ try {
106
+ execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
107
+ }
108
+ catch {
109
+ // Ignore errors
110
+ }
111
+ }
112
+ /**
113
+ * Check if the systemd service is installed
114
+ */
115
+ export function isSystemdServiceInstalled(name) {
116
+ const servicePath = getServiceFilePath(name);
117
+ return existsSync(servicePath);
118
+ }
119
+ /**
120
+ * Get the status of the systemd service
121
+ */
122
+ export async function getSystemdServiceStatus(name) {
123
+ if (!isSystemdServiceInstalled(name)) {
124
+ return 'not-installed';
125
+ }
126
+ try {
127
+ const output = execSync(`systemctl --user is-active ${name} 2>/dev/null`, {
128
+ encoding: 'utf-8',
129
+ });
130
+ const status = output.trim();
131
+ if (status === 'active') {
132
+ return 'running';
133
+ }
134
+ return 'stopped';
135
+ }
136
+ catch {
137
+ // Service not active or error checking
138
+ return 'stopped';
139
+ }
140
+ }
141
+ /**
142
+ * Start the systemd service
143
+ */
144
+ export async function startSystemdService(name) {
145
+ if (!isSystemdServiceInstalled(name)) {
146
+ throw new Error(`Service ${name} is not installed`);
147
+ }
148
+ try {
149
+ execSync(`systemctl --user start ${name}`, { stdio: 'pipe' });
150
+ }
151
+ catch (error) {
152
+ throw new Error(`Failed to start service: ${error instanceof Error ? error.message : String(error)}`);
153
+ }
154
+ }
155
+ /**
156
+ * Stop the systemd service
157
+ */
158
+ export async function stopSystemdService(name) {
159
+ try {
160
+ execSync(`systemctl --user stop ${name}`, { stdio: 'pipe' });
161
+ }
162
+ catch (error) {
163
+ throw new Error(`Failed to stop service: ${error instanceof Error ? error.message : String(error)}`);
164
+ }
165
+ }
166
+ /**
167
+ * Get the PID of the running systemd service
168
+ */
169
+ export function getSystemdServicePid(name) {
170
+ try {
171
+ const output = execSync(`systemctl --user show ${name} --property=MainPID 2>/dev/null`, {
172
+ encoding: 'utf-8',
173
+ });
174
+ const match = output.match(/MainPID=(\d+)/);
175
+ if (match) {
176
+ const pid = parseInt(match[1], 10);
177
+ if (pid > 0) {
178
+ return pid;
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ }
187
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../../src/utils/service-manager/systemd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEvE,SAAS,kBAAkB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB;IACjD,2CAA2C;IAC3C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAErD,8BAA8B;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,OAAO;cACM,MAAM,CAAC,WAAW;;;;;YAKpB,SAAS;mBACF,MAAM,CAAC,gBAAgB;;;wBAGlB,OAAO;uBACR,YAAY;;;;;CAKlC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAqB;IAChE,uCAAuC;IACvC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEpD,mCAAmC;IACnC,IAAI,CAAC;QACJ,QAAQ,CAAC,yBAAyB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACR,0CAA0C;IAC3C,CAAC;IAED,kCAAkC;IAClC,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,wBAAwB;IACxB,IAAI,CAAC;QACJ,QAAQ,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC;QACJ,QAAQ,CAAC,2BAA2B,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7F,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACJ,QAAQ,CAAC,0BAA0B,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACzD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE7C,mBAAmB;IACnB,IAAI,CAAC;QACJ,QAAQ,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACR,0CAA0C;IAC3C,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC;QACJ,QAAQ,CAAC,4BAA4B,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACR,0CAA0C;IAC3C,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACJ,QAAQ,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACR,gBAAgB;IACjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACzD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,eAAe,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,8BAA8B,IAAI,cAAc,EAAE;YACzE,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACrD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC;QACJ,QAAQ,CAAC,0BAA0B,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACpF,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACpD,IAAI,CAAC;QACJ,QAAQ,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnF,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,IAAI,iCAAiC,EAAE;YACvF,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACb,OAAO,GAAG,CAAC;YACZ,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Check if tmux is installed and available
3
+ */
4
+ export declare function isTmuxAvailable(): Promise<boolean>;
5
+ /**
6
+ * Check if a tmux session exists
7
+ */
8
+ export declare function sessionExists(name: string): Promise<boolean>;
9
+ /**
10
+ * Create a new detached tmux session with a command
11
+ */
12
+ export declare function createSession(name: string, command: string): Promise<void>;
13
+ /**
14
+ * Kill a tmux session
15
+ */
16
+ export declare function killSession(name: string): Promise<void>;
17
+ /**
18
+ * Get the PID of a tmux session
19
+ */
20
+ export declare function getSessionPid(name: string): Promise<number | null>;
21
+ /**
22
+ * List all tmux sessions
23
+ */
24
+ export declare function listSessions(): Promise<string[]>;
25
+ /**
26
+ * Get the content of a tmux pane
27
+ */
28
+ export declare function getSessionContent(name: string, lines?: number): Promise<string>;
29
+ /**
30
+ * Send keys to a tmux session
31
+ */
32
+ export declare function sendKeys(name: string, keys: string): Promise<void>;
33
+ /**
34
+ * Check if a process with the given PID is running
35
+ */
36
+ export declare function isPidRunning(pid: number): boolean;
37
+ //# sourceMappingURL=tmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/utils/tmux.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOtD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,SAAM,GACT,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQjD"}