@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,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":"AAAA,OAAO,EAAC,KAAK,EAAoB,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAWxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;AAE3D,2EAA2E;AAC3E,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC/C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAsD,CAAC;IAC5E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC7B,MAAwB,EACxB,MAKC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtC,kBAAkB;IAClB,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IAED,YAAY;IACZ,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,MAAwB,EACxB,MAGC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,sDAAsD;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1C,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,CAC5C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,sCAAsC;IACtC,OAAO,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAChC,SAAiB,EACjB,MAAwB,EACxB,IAAc,EACd,gBAAwB;IAExB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE;QACxC,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,QAAQ,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,MAAM,WAAW,GAAmB;QACnC,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IAEF,iBAAiB;IACjB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAChC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAChC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,mEAAmE;IACnE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE5B,qCAAqC;QACrC,eAAe,CACd,SAAS,EACT,WAAW,CAAC,MAAM,EAClB,IAAI,KAAK,CAAC,EACV,WAAW,CAAC,MAAM,IAAI,SAAS,CAC/B,CAAC;QAEF,oDAAoD;QACpD,UAAU,CAAC,GAAG,EAAE;YACf,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC,EAAE,aAAa,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,WAAW,CAAC,MAAM,IAAI,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC;QACxD,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEzB,8BAA8B;QAC9B,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1E,mBAAmB;QACnB,UAAU,CAAC,GAAG,EAAE;YACf,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC,EAAE,aAAa,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE7C,OAAO,EAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAOlD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO;YACN,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,IAAI;SACd,CAAC;IACH,CAAC;IAED,OAAO;QACN,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IACjD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC/C,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAK/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO;QACN,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC;AACH,CAAC"}
@@ -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":"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"}
@@ -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"}