episoda 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/auth.d.ts +22 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +384 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/dev.d.ts +20 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +305 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +75 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +17 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +81 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/core/auth.d.ts +26 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +113 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/command-protocol.d.ts +262 -0
- package/dist/core/command-protocol.d.ts.map +1 -0
- package/dist/core/command-protocol.js +13 -0
- package/dist/core/command-protocol.js.map +1 -0
- package/dist/core/connection-manager.d.ts +58 -0
- package/dist/core/connection-manager.d.ts.map +1 -0
- package/dist/core/connection-manager.js +215 -0
- package/dist/core/connection-manager.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +55 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/git-executor.d.ts +157 -0
- package/dist/core/git-executor.d.ts.map +1 -0
- package/dist/core/git-executor.js +1605 -0
- package/dist/core/git-executor.js.map +1 -0
- package/dist/core/git-parser.d.ts +40 -0
- package/dist/core/git-parser.d.ts.map +1 -0
- package/dist/core/git-parser.js +194 -0
- package/dist/core/git-parser.js.map +1 -0
- package/dist/core/git-validator.d.ts +42 -0
- package/dist/core/git-validator.d.ts.map +1 -0
- package/dist/core/git-validator.js +102 -0
- package/dist/core/git-validator.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +41 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/version.d.ts +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +19 -0
- package/dist/core/version.js.map +1 -0
- package/dist/core/websocket-client.d.ts +122 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +438 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/daemon/daemon-manager.d.ts +71 -0
- package/dist/daemon/daemon-manager.d.ts.map +1 -0
- package/dist/daemon/daemon-manager.js +289 -0
- package/dist/daemon/daemon-manager.js.map +1 -0
- package/dist/daemon/daemon-process.d.ts +13 -0
- package/dist/daemon/daemon-process.d.ts.map +1 -0
- package/dist/daemon/daemon-process.js +608 -0
- package/dist/daemon/daemon-process.js.map +1 -0
- package/dist/daemon/machine-id.d.ts +36 -0
- package/dist/daemon/machine-id.d.ts.map +1 -0
- package/dist/daemon/machine-id.js +195 -0
- package/dist/daemon/machine-id.js.map +1 -0
- package/dist/daemon/project-tracker.d.ts +92 -0
- package/dist/daemon/project-tracker.d.ts.map +1 -0
- package/dist/daemon/project-tracker.js +259 -0
- package/dist/daemon/project-tracker.js.map +1 -0
- package/dist/dev-wrapper.d.ts +88 -0
- package/dist/dev-wrapper.d.ts.map +1 -0
- package/dist/dev-wrapper.js +288 -0
- package/dist/dev-wrapper.js.map +1 -0
- package/dist/framework-detector.d.ts +29 -0
- package/dist/framework-detector.d.ts.map +1 -0
- package/dist/framework-detector.js +276 -0
- package/dist/framework-detector.js.map +1 -0
- package/dist/git-helpers/git-credential-helper.d.ts +29 -0
- package/dist/git-helpers/git-credential-helper.d.ts.map +1 -0
- package/dist/git-helpers/git-credential-helper.js +349 -0
- package/dist/git-helpers/git-credential-helper.js.map +1 -0
- package/dist/hooks/post-checkout +296 -0
- package/dist/hooks/pre-commit +139 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/ipc-client.d.ts +95 -0
- package/dist/ipc/ipc-client.d.ts.map +1 -0
- package/dist/ipc/ipc-client.js +204 -0
- package/dist/ipc/ipc-client.js.map +1 -0
- package/dist/ipc/ipc-server.d.ts +55 -0
- package/dist/ipc/ipc-server.d.ts.map +1 -0
- package/dist/ipc/ipc-server.js +177 -0
- package/dist/ipc/ipc-server.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +129 -0
- package/dist/output.js.map +1 -0
- package/dist/utils/port-check.d.ts +15 -0
- package/dist/utils/port-check.d.ts.map +1 -0
- package/dist/utils/port-check.js +79 -0
- package/dist/utils/port-check.js.map +1 -0
- package/dist/utils/update-checker.d.ts +23 -0
- package/dist/utils/update-checker.d.ts.map +1 -0
- package/dist/utils/update-checker.js +95 -0
- package/dist/utils/update-checker.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Daemon lifecycle management
|
|
4
|
+
*
|
|
5
|
+
* Manages the Episoda daemon process lifecycle:
|
|
6
|
+
* - Spawning daemon in detached mode
|
|
7
|
+
* - Checking daemon status
|
|
8
|
+
* - Stopping daemon gracefully
|
|
9
|
+
* - PID file management
|
|
10
|
+
*
|
|
11
|
+
* Ensures only one daemon runs per user.
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.killAllEpisodaProcesses = killAllEpisodaProcesses;
|
|
48
|
+
exports.getPidFilePath = getPidFilePath;
|
|
49
|
+
exports.isDaemonRunning = isDaemonRunning;
|
|
50
|
+
exports.startDaemon = startDaemon;
|
|
51
|
+
exports.stopDaemon = stopDaemon;
|
|
52
|
+
exports.restartDaemon = restartDaemon;
|
|
53
|
+
exports.getDaemonStatus = getDaemonStatus;
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const child_process_1 = require("child_process");
|
|
57
|
+
const core_1 = require("../core");
|
|
58
|
+
/**
|
|
59
|
+
* EP734: Kill all stale Episoda processes
|
|
60
|
+
*
|
|
61
|
+
* Finds and kills any existing episoda-related processes to ensure
|
|
62
|
+
* a clean slate before starting a new daemon. This prevents:
|
|
63
|
+
* - Multiple daemon processes running simultaneously
|
|
64
|
+
* - Stale `episoda dev` foreground processes from previous sessions
|
|
65
|
+
* - Orphaned node processes running daemon-process.js
|
|
66
|
+
*
|
|
67
|
+
* @returns Number of processes killed
|
|
68
|
+
*/
|
|
69
|
+
function killAllEpisodaProcesses() {
|
|
70
|
+
const currentPid = process.pid;
|
|
71
|
+
let killedCount = 0;
|
|
72
|
+
// EP734: Windows not supported for process cleanup - skip with warning
|
|
73
|
+
if (process.platform === 'win32') {
|
|
74
|
+
console.warn('[Cleanup] Process cleanup not supported on Windows - skipping');
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
// Find all episoda-related processes using ps (Unix/macOS only)
|
|
79
|
+
// Patterns: 'episoda dev', 'daemon-process.js', 'episoda status', 'ws-server.js'
|
|
80
|
+
// EP797: Added ws-server.js to catch orphaned WebSocket server processes
|
|
81
|
+
const psOutput = (0, child_process_1.execSync)('ps aux | grep -E "(episoda (dev|status|stop)|daemon-process\\.js|node ws-server\\.js)" | grep -v grep || true', { encoding: 'utf-8', timeout: 5000 });
|
|
82
|
+
const lines = psOutput.trim().split('\n').filter(line => line.length > 0);
|
|
83
|
+
for (const line of lines) {
|
|
84
|
+
// Parse PID from ps aux output (second column)
|
|
85
|
+
const parts = line.trim().split(/\s+/);
|
|
86
|
+
if (parts.length < 2)
|
|
87
|
+
continue;
|
|
88
|
+
const pid = parseInt(parts[1], 10);
|
|
89
|
+
if (isNaN(pid) || pid === currentPid)
|
|
90
|
+
continue;
|
|
91
|
+
try {
|
|
92
|
+
process.kill(pid, 'SIGTERM');
|
|
93
|
+
killedCount++;
|
|
94
|
+
console.log(`[Cleanup] Killed stale process PID ${pid}`);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
// Process might have already exited, ignore
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Give processes a moment to terminate
|
|
101
|
+
if (killedCount > 0) {
|
|
102
|
+
(0, child_process_1.execSync)('sleep 0.5', { timeout: 2000 });
|
|
103
|
+
}
|
|
104
|
+
// Clean up stale files
|
|
105
|
+
const configDir = (0, core_1.getConfigDir)();
|
|
106
|
+
const pidPath = path.join(configDir, 'daemon.pid');
|
|
107
|
+
const sockPath = path.join(configDir, 'daemon.sock');
|
|
108
|
+
if (fs.existsSync(pidPath)) {
|
|
109
|
+
fs.unlinkSync(pidPath);
|
|
110
|
+
}
|
|
111
|
+
if (fs.existsSync(sockPath)) {
|
|
112
|
+
fs.unlinkSync(sockPath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
// Non-fatal - best effort cleanup
|
|
117
|
+
console.warn('[Cleanup] Error during process cleanup:', error instanceof Error ? error.message : error);
|
|
118
|
+
}
|
|
119
|
+
return killedCount;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get path to daemon PID file
|
|
123
|
+
*/
|
|
124
|
+
function getPidFilePath() {
|
|
125
|
+
return path.join((0, core_1.getConfigDir)(), 'daemon.pid');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if daemon is running
|
|
129
|
+
*
|
|
130
|
+
* Reads PID from file and checks if process exists.
|
|
131
|
+
*
|
|
132
|
+
* @returns PID if running, null if not
|
|
133
|
+
*/
|
|
134
|
+
function isDaemonRunning() {
|
|
135
|
+
const pidPath = getPidFilePath();
|
|
136
|
+
try {
|
|
137
|
+
if (!fs.existsSync(pidPath)) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const pidStr = fs.readFileSync(pidPath, 'utf-8').trim();
|
|
141
|
+
const pid = parseInt(pidStr, 10);
|
|
142
|
+
if (isNaN(pid)) {
|
|
143
|
+
// Invalid PID, clean up file
|
|
144
|
+
fs.unlinkSync(pidPath);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
// Check if process exists
|
|
148
|
+
try {
|
|
149
|
+
// Sending signal 0 checks existence without killing
|
|
150
|
+
process.kill(pid, 0);
|
|
151
|
+
return pid;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Process doesn't exist, clean up stale PID file
|
|
155
|
+
fs.unlinkSync(pidPath);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.error('Error checking daemon status:', error);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Start the daemon process
|
|
166
|
+
*
|
|
167
|
+
* Spawns daemon in detached mode. Daemon survives terminal close.
|
|
168
|
+
*
|
|
169
|
+
* @throws Error if daemon already running or spawn fails
|
|
170
|
+
*/
|
|
171
|
+
async function startDaemon() {
|
|
172
|
+
// Check if already running
|
|
173
|
+
const existingPid = isDaemonRunning();
|
|
174
|
+
if (existingPid) {
|
|
175
|
+
throw new Error(`Daemon already running (PID: ${existingPid})`);
|
|
176
|
+
}
|
|
177
|
+
// Ensure config directory exists
|
|
178
|
+
const configDir = (0, core_1.getConfigDir)();
|
|
179
|
+
if (!fs.existsSync(configDir)) {
|
|
180
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
// Path to daemon entry point
|
|
183
|
+
// When built: dist/daemon/daemon-process.js
|
|
184
|
+
// For now, assume we're in development and can run via ts-node or compiled version
|
|
185
|
+
const daemonScript = path.join(__dirname, 'daemon-process.js');
|
|
186
|
+
if (!fs.existsSync(daemonScript)) {
|
|
187
|
+
throw new Error(`Daemon script not found: ${daemonScript}. Make sure CLI is built.`);
|
|
188
|
+
}
|
|
189
|
+
// Spawn daemon as detached process
|
|
190
|
+
const child = (0, child_process_1.spawn)('node', [daemonScript], {
|
|
191
|
+
detached: true, // Run independently of parent
|
|
192
|
+
stdio: 'ignore', // Don't inherit stdio (prevents hanging)
|
|
193
|
+
env: {
|
|
194
|
+
...process.env,
|
|
195
|
+
EPISODA_DAEMON_MODE: '1', // Signal to daemon it's running in daemon mode
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
// Detach from parent process
|
|
199
|
+
child.unref();
|
|
200
|
+
const pid = child.pid;
|
|
201
|
+
// Save PID to file
|
|
202
|
+
const pidPath = getPidFilePath();
|
|
203
|
+
fs.writeFileSync(pidPath, pid.toString(), 'utf-8');
|
|
204
|
+
// Give daemon a moment to start
|
|
205
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
206
|
+
// Verify daemon actually started
|
|
207
|
+
const runningPid = isDaemonRunning();
|
|
208
|
+
if (!runningPid) {
|
|
209
|
+
throw new Error('Daemon failed to start');
|
|
210
|
+
}
|
|
211
|
+
return pid;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Stop the daemon process
|
|
215
|
+
*
|
|
216
|
+
* Sends SIGTERM for graceful shutdown. If daemon doesn't stop
|
|
217
|
+
* within timeout, sends SIGKILL.
|
|
218
|
+
*
|
|
219
|
+
* @param timeout Milliseconds to wait before SIGKILL (default: 5000)
|
|
220
|
+
* @returns true if stopped, false if wasn't running
|
|
221
|
+
*/
|
|
222
|
+
async function stopDaemon(timeout = 5000) {
|
|
223
|
+
const pid = isDaemonRunning();
|
|
224
|
+
if (!pid) {
|
|
225
|
+
// Clean up PID file just in case
|
|
226
|
+
const pidPath = getPidFilePath();
|
|
227
|
+
if (fs.existsSync(pidPath)) {
|
|
228
|
+
fs.unlinkSync(pidPath);
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
// Send SIGTERM for graceful shutdown
|
|
234
|
+
process.kill(pid, 'SIGTERM');
|
|
235
|
+
// Wait for process to exit
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
while (Date.now() - startTime < timeout) {
|
|
238
|
+
try {
|
|
239
|
+
process.kill(pid, 0); // Check if still alive
|
|
240
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
// Process exited
|
|
244
|
+
const pidPath = getPidFilePath();
|
|
245
|
+
if (fs.existsSync(pidPath)) {
|
|
246
|
+
fs.unlinkSync(pidPath);
|
|
247
|
+
}
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Timeout reached, force kill
|
|
252
|
+
console.warn(`Daemon didn't stop gracefully, forcing shutdown (PID: ${pid})`);
|
|
253
|
+
process.kill(pid, 'SIGKILL');
|
|
254
|
+
// Clean up PID file
|
|
255
|
+
const pidPath = getPidFilePath();
|
|
256
|
+
if (fs.existsSync(pidPath)) {
|
|
257
|
+
fs.unlinkSync(pidPath);
|
|
258
|
+
}
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
console.error('Error stopping daemon:', error);
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Restart the daemon
|
|
268
|
+
*
|
|
269
|
+
* Stops existing daemon and starts new one.
|
|
270
|
+
*
|
|
271
|
+
* @returns PID of new daemon
|
|
272
|
+
*/
|
|
273
|
+
async function restartDaemon() {
|
|
274
|
+
await stopDaemon();
|
|
275
|
+
return startDaemon();
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get daemon status information
|
|
279
|
+
*
|
|
280
|
+
* @returns Status object with running state and PID
|
|
281
|
+
*/
|
|
282
|
+
function getDaemonStatus() {
|
|
283
|
+
const pid = isDaemonRunning();
|
|
284
|
+
return {
|
|
285
|
+
running: pid !== null,
|
|
286
|
+
pid,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=daemon-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../src/daemon/daemon-manager.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,0DA6DC;AAKD,wCAEC;AASD,0CA+BC;AASD,kCAmDC;AAWD,gCA8CC;AASD,sCAGC;AAOD,0CAMC;AA1QD,uCAAwB;AACxB,2CAA4B;AAC5B,iDAA+C;AAC/C,kCAAsC;AAEtC;;;;;;;;;;GAUG;AACH,SAAgB,uBAAuB;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAA;IAC9B,IAAI,WAAW,GAAG,CAAC,CAAA;IAEnB,uEAAuE;IACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;QAC7E,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,iFAAiF;QACjF,yEAAyE;QACzE,MAAM,QAAQ,GAAG,IAAA,wBAAQ,EACvB,+GAA+G,EAC/G,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACrC,CAAA;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,+CAA+C;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAE9B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAClC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,UAAU;gBAAE,SAAQ;YAE9C,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;gBAC5B,WAAW,EAAE,CAAA;gBACb,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAA;YAC1D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,4CAA4C;YAC9C,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,IAAA,wBAAQ,EAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAA,mBAAY,GAAE,CAAA;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAEpD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kCAAkC;QAClC,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACzG,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,mBAAY,GAAE,EAAE,YAAY,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe;IAC7B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;IAEhC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAEhC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,6BAA6B;YAC7B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC;YACH,oDAAoD;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACpB,OAAO,GAAG,CAAA;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iDAAiD;YACjD,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;QACrD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,WAAW;IAC/B,2BAA2B;IAC3B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IACrC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,GAAG,CAAC,CAAA;IACjE,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAA,mBAAY,GAAE,CAAA;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,6BAA6B;IAC7B,4CAA4C;IAC5C,mFAAmF;IACnF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAA;IAE9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,2BAA2B,CAAC,CAAA;IACtF,CAAC;IAED,mCAAmC;IACnC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE;QAC1C,QAAQ,EAAE,IAAI,EAAS,8BAA8B;QACrD,KAAK,EAAE,QAAQ,EAAQ,yCAAyC;QAChE,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,mBAAmB,EAAE,GAAG,EAAE,+CAA+C;SAC1E;KACF,CAAC,CAAA;IAEF,6BAA6B;IAC7B,KAAK,CAAC,KAAK,EAAE,CAAA;IAEb,MAAM,GAAG,GAAG,KAAK,CAAC,GAAI,CAAA;IAEtB,mBAAmB;IACnB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;IAChC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;IAElD,gCAAgC;IAChC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IAEtD,iCAAiC;IACjC,MAAM,UAAU,GAAG,eAAe,EAAE,CAAA;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,UAAU,CAAC,UAAkB,IAAI;IACrD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAA;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,iCAAiC;QACjC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC;QACH,qCAAqC;QACrC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAE5B,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA,CAAC,uBAAuB;gBAC5C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;YACxD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iBAAiB;gBACjB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;gBAChC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;gBACxB,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,IAAI,CAAC,yDAAyD,GAAG,GAAG,CAAC,CAAA;QAC7E,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAE5B,oBAAoB;QACpB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa;IACjC,MAAM,UAAU,EAAE,CAAA;IAClB,OAAO,WAAW,EAAE,CAAA;AACtB,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAA;IAC7B,OAAO;QACL,OAAO,EAAE,GAAG,KAAK,IAAI;QACrB,GAAG;KACJ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Episoda Daemon Process
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the persistent daemon that:
|
|
5
|
+
* - Maintains WebSocket connections to multiple projects
|
|
6
|
+
* - Listens for IPC commands from CLI
|
|
7
|
+
* - Handles graceful shutdown
|
|
8
|
+
* - Survives terminal close
|
|
9
|
+
*
|
|
10
|
+
* This file is spawned by daemon-manager.ts in detached mode.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=daemon-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-process.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|