episoda 0.2.5 → 0.2.8

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 (73) hide show
  1. package/dist/index.d.ts +2 -8
  2. package/dist/index.js +3735 -82
  3. package/dist/index.js.map +1 -1
  4. package/package.json +5 -4
  5. package/dist/commands/auth.d.ts +0 -22
  6. package/dist/commands/auth.d.ts.map +0 -1
  7. package/dist/commands/auth.js +0 -384
  8. package/dist/commands/auth.js.map +0 -1
  9. package/dist/commands/dev.d.ts +0 -20
  10. package/dist/commands/dev.d.ts.map +0 -1
  11. package/dist/commands/dev.js +0 -305
  12. package/dist/commands/dev.js.map +0 -1
  13. package/dist/commands/status.d.ts +0 -13
  14. package/dist/commands/status.d.ts.map +0 -1
  15. package/dist/commands/status.js +0 -102
  16. package/dist/commands/status.js.map +0 -1
  17. package/dist/commands/stop.d.ts +0 -17
  18. package/dist/commands/stop.d.ts.map +0 -1
  19. package/dist/commands/stop.js +0 -81
  20. package/dist/commands/stop.js.map +0 -1
  21. package/dist/daemon/daemon-manager.d.ts +0 -71
  22. package/dist/daemon/daemon-manager.d.ts.map +0 -1
  23. package/dist/daemon/daemon-manager.js +0 -289
  24. package/dist/daemon/daemon-manager.js.map +0 -1
  25. package/dist/daemon/daemon-process.d.ts +0 -13
  26. package/dist/daemon/daemon-process.d.ts.map +0 -1
  27. package/dist/daemon/daemon-process.js +0 -662
  28. package/dist/daemon/daemon-process.js.map +0 -1
  29. package/dist/daemon/identity-server.d.ts +0 -51
  30. package/dist/daemon/identity-server.d.ts.map +0 -1
  31. package/dist/daemon/identity-server.js +0 -162
  32. package/dist/daemon/identity-server.js.map +0 -1
  33. package/dist/daemon/machine-id.d.ts +0 -36
  34. package/dist/daemon/machine-id.d.ts.map +0 -1
  35. package/dist/daemon/machine-id.js +0 -195
  36. package/dist/daemon/machine-id.js.map +0 -1
  37. package/dist/daemon/project-tracker.d.ts +0 -92
  38. package/dist/daemon/project-tracker.d.ts.map +0 -1
  39. package/dist/daemon/project-tracker.js +0 -259
  40. package/dist/daemon/project-tracker.js.map +0 -1
  41. package/dist/dev-wrapper.d.ts +0 -88
  42. package/dist/dev-wrapper.d.ts.map +0 -1
  43. package/dist/dev-wrapper.js +0 -288
  44. package/dist/dev-wrapper.js.map +0 -1
  45. package/dist/framework-detector.d.ts +0 -29
  46. package/dist/framework-detector.d.ts.map +0 -1
  47. package/dist/framework-detector.js +0 -276
  48. package/dist/framework-detector.js.map +0 -1
  49. package/dist/git-helpers/git-credential-helper.d.ts +0 -29
  50. package/dist/git-helpers/git-credential-helper.d.ts.map +0 -1
  51. package/dist/git-helpers/git-credential-helper.js +0 -349
  52. package/dist/git-helpers/git-credential-helper.js.map +0 -1
  53. package/dist/index.d.ts.map +0 -1
  54. package/dist/ipc/ipc-client.d.ts +0 -116
  55. package/dist/ipc/ipc-client.d.ts.map +0 -1
  56. package/dist/ipc/ipc-client.js +0 -216
  57. package/dist/ipc/ipc-client.js.map +0 -1
  58. package/dist/ipc/ipc-server.d.ts +0 -55
  59. package/dist/ipc/ipc-server.d.ts.map +0 -1
  60. package/dist/ipc/ipc-server.js +0 -177
  61. package/dist/ipc/ipc-server.js.map +0 -1
  62. package/dist/output.d.ts +0 -48
  63. package/dist/output.d.ts.map +0 -1
  64. package/dist/output.js +0 -129
  65. package/dist/output.js.map +0 -1
  66. package/dist/utils/port-check.d.ts +0 -15
  67. package/dist/utils/port-check.d.ts.map +0 -1
  68. package/dist/utils/port-check.js +0 -79
  69. package/dist/utils/port-check.js.map +0 -1
  70. package/dist/utils/update-checker.d.ts +0 -23
  71. package/dist/utils/update-checker.d.ts.map +0 -1
  72. package/dist/utils/update-checker.js +0 -95
  73. package/dist/utils/update-checker.js.map +0 -1
@@ -1,259 +0,0 @@
1
- "use strict";
2
- /**
3
- * Project tracking for daemon
4
- *
5
- * Manages ~/.episoda/projects.json which tracks all projects
6
- * the daemon is monitoring.
7
- *
8
- * Format:
9
- * {
10
- * "projects": [
11
- * {
12
- * "id": "proj_abc123",
13
- * "path": "/Users/alan/Dev/my-project",
14
- * "name": "my-project",
15
- * "added_at": "2025-01-18T10:30:00.000Z",
16
- * "last_active": "2025-01-18T12:45:00.000Z"
17
- * }
18
- * ]
19
- * }
20
- */
21
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
- if (k2 === undefined) k2 = k;
23
- var desc = Object.getOwnPropertyDescriptor(m, k);
24
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
- desc = { enumerable: true, get: function() { return m[k]; } };
26
- }
27
- Object.defineProperty(o, k2, desc);
28
- }) : (function(o, m, k, k2) {
29
- if (k2 === undefined) k2 = k;
30
- o[k2] = m[k];
31
- }));
32
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
- Object.defineProperty(o, "default", { enumerable: true, value: v });
34
- }) : function(o, v) {
35
- o["default"] = v;
36
- });
37
- var __importStar = (this && this.__importStar) || (function () {
38
- var ownKeys = function(o) {
39
- ownKeys = Object.getOwnPropertyNames || function (o) {
40
- var ar = [];
41
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
- return ar;
43
- };
44
- return ownKeys(o);
45
- };
46
- return function (mod) {
47
- if (mod && mod.__esModule) return mod;
48
- var result = {};
49
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
- __setModuleDefault(result, mod);
51
- return result;
52
- };
53
- })();
54
- Object.defineProperty(exports, "__esModule", { value: true });
55
- exports.addProject = addProject;
56
- exports.removeProject = removeProject;
57
- exports.getProject = getProject;
58
- exports.getProjectById = getProjectById;
59
- exports.getAllProjects = getAllProjects;
60
- exports.touchProject = touchProject;
61
- exports.cleanupStaleProjects = cleanupStaleProjects;
62
- exports.clearAllProjects = clearAllProjects;
63
- const fs = __importStar(require("fs"));
64
- const path = __importStar(require("path"));
65
- const core_1 = require("@episoda/core");
66
- /**
67
- * Get path to projects.json file
68
- */
69
- function getProjectsFilePath() {
70
- return path.join((0, core_1.getConfigDir)(), 'projects.json');
71
- }
72
- /**
73
- * Read projects from file
74
- *
75
- * @returns Projects data, or empty list if file doesn't exist
76
- */
77
- function readProjects() {
78
- const projectsPath = getProjectsFilePath();
79
- try {
80
- if (!fs.existsSync(projectsPath)) {
81
- return { projects: [] };
82
- }
83
- const content = fs.readFileSync(projectsPath, 'utf-8');
84
- const data = JSON.parse(content);
85
- // Validate structure
86
- if (!data.projects || !Array.isArray(data.projects)) {
87
- console.warn('Invalid projects.json structure, resetting');
88
- return { projects: [] };
89
- }
90
- return data;
91
- }
92
- catch (error) {
93
- console.error('Error reading projects.json:', error);
94
- return { projects: [] };
95
- }
96
- }
97
- /**
98
- * Write projects to file
99
- */
100
- function writeProjects(data) {
101
- const projectsPath = getProjectsFilePath();
102
- try {
103
- // Ensure directory exists
104
- const dir = path.dirname(projectsPath);
105
- if (!fs.existsSync(dir)) {
106
- fs.mkdirSync(dir, { recursive: true });
107
- }
108
- fs.writeFileSync(projectsPath, JSON.stringify(data, null, 2), 'utf-8');
109
- }
110
- catch (error) {
111
- throw new Error(`Failed to write projects.json: ${error}`);
112
- }
113
- }
114
- /**
115
- * Add or update a project
116
- *
117
- * EP593: Now enforces one entry per projectId to prevent duplicate connections.
118
- * When adding a project:
119
- * - If same path exists, update last_active
120
- * - If same projectId exists with different path, REPLACE the old entry
121
- * (user wants git operations in the new directory)
122
- * - Otherwise, add new project
123
- *
124
- * @param projectId Supabase project ID
125
- * @param projectPath Absolute path to project
126
- * @returns The tracked project
127
- */
128
- function addProject(projectId, projectPath) {
129
- const data = readProjects();
130
- const now = new Date().toISOString();
131
- // Check if project already exists by path (exact match)
132
- const existingByPath = data.projects.find(p => p.path === projectPath);
133
- if (existingByPath) {
134
- // Update existing project
135
- existingByPath.id = projectId; // Update ID in case it changed
136
- existingByPath.last_active = now;
137
- writeProjects(data);
138
- return existingByPath;
139
- }
140
- // EP593: Check if project exists by ID (different path)
141
- // This prevents multiple entries for the same project from different directories
142
- const existingByIdIndex = data.projects.findIndex(p => p.id === projectId);
143
- if (existingByIdIndex !== -1) {
144
- const existingById = data.projects[existingByIdIndex];
145
- console.log(`[ProjectTracker] Replacing project entry: ${existingById.path} -> ${projectPath}`);
146
- // Remove the old entry
147
- data.projects.splice(existingByIdIndex, 1);
148
- }
149
- // Add new project
150
- const projectName = path.basename(projectPath);
151
- const newProject = {
152
- id: projectId,
153
- path: projectPath,
154
- name: projectName,
155
- added_at: now,
156
- last_active: now,
157
- };
158
- data.projects.push(newProject);
159
- writeProjects(data);
160
- return newProject;
161
- }
162
- /**
163
- * Remove a project
164
- *
165
- * @param projectPath Absolute path to project
166
- * @returns true if removed, false if not found
167
- */
168
- function removeProject(projectPath) {
169
- const data = readProjects();
170
- const initialLength = data.projects.length;
171
- data.projects = data.projects.filter(p => p.path !== projectPath);
172
- if (data.projects.length < initialLength) {
173
- writeProjects(data);
174
- return true;
175
- }
176
- return false;
177
- }
178
- /**
179
- * Get a project by path
180
- *
181
- * @param projectPath Absolute path to project
182
- * @returns Project if found, null otherwise
183
- */
184
- function getProject(projectPath) {
185
- const data = readProjects();
186
- return data.projects.find(p => p.path === projectPath) || null;
187
- }
188
- /**
189
- * Get a project by ID
190
- *
191
- * @param projectId Supabase project ID
192
- * @returns Project if found, null otherwise
193
- */
194
- function getProjectById(projectId) {
195
- const data = readProjects();
196
- return data.projects.find(p => p.id === projectId) || null;
197
- }
198
- /**
199
- * Get all tracked projects
200
- *
201
- * @returns Array of tracked projects
202
- */
203
- function getAllProjects() {
204
- const data = readProjects();
205
- return data.projects;
206
- }
207
- /**
208
- * Update last active timestamp for a project
209
- *
210
- * @param projectPath Absolute path to project
211
- */
212
- function touchProject(projectPath) {
213
- const data = readProjects();
214
- const project = data.projects.find(p => p.path === projectPath);
215
- if (project) {
216
- project.last_active = new Date().toISOString();
217
- writeProjects(data);
218
- }
219
- }
220
- /**
221
- * Clean up stale projects
222
- *
223
- * Removes projects that:
224
- * - Haven't been active in N days
225
- * - Directory no longer exists
226
- *
227
- * @param maxAgeDays Maximum age in days (default: 30)
228
- * @returns Number of projects removed
229
- */
230
- function cleanupStaleProjects(maxAgeDays = 30) {
231
- const data = readProjects();
232
- const now = Date.now();
233
- const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
234
- const initialLength = data.projects.length;
235
- data.projects = data.projects.filter(project => {
236
- // Check if directory still exists
237
- if (!fs.existsSync(project.path)) {
238
- return false;
239
- }
240
- // Check if too old
241
- const lastActive = new Date(project.last_active).getTime();
242
- const age = now - lastActive;
243
- return age < maxAgeMs;
244
- });
245
- const removedCount = initialLength - data.projects.length;
246
- if (removedCount > 0) {
247
- writeProjects(data);
248
- }
249
- return removedCount;
250
- }
251
- /**
252
- * Clear all projects
253
- *
254
- * USE WITH CAUTION - removes all tracked projects
255
- */
256
- function clearAllProjects() {
257
- writeProjects({ projects: [] });
258
- }
259
- //# sourceMappingURL=project-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-tracker.js","sourceRoot":"","sources":["../../src/daemon/project-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,88 +0,0 @@
1
- /**
2
- * Dev Server Wrapper
3
- *
4
- * This module wraps the user's dev server command and keeps it running
5
- * while maintaining the WebSocket connection to episoda.dev
6
- */
7
- export interface DevServerStatus {
8
- running: boolean;
9
- pid?: number;
10
- command: string[];
11
- restartCount: number;
12
- connectedToCloud: boolean;
13
- }
14
- export interface DevWrapperOptions {
15
- command?: string[];
16
- cwd?: string;
17
- autoRestart?: boolean;
18
- wsUrl?: string;
19
- token?: string;
20
- projectId?: string;
21
- userId?: string;
22
- workspaceId?: string;
23
- apiUrl?: string;
24
- }
25
- /**
26
- * DevServerWrapper class manages the dev server process and WebSocket connection
27
- */
28
- export declare class DevServerWrapper {
29
- private devProcess?;
30
- private wsClient?;
31
- private gitExecutor;
32
- private command?;
33
- private cwd;
34
- private autoRestart;
35
- private restartCount;
36
- private shuttingDown;
37
- private wsUrl?;
38
- private token?;
39
- private projectId?;
40
- private userId?;
41
- private workspaceId?;
42
- private apiUrl?;
43
- private connectionOnlyMode;
44
- constructor(options: DevWrapperOptions);
45
- /**
46
- * Start the dev server and WebSocket connection
47
- */
48
- start(): Promise<void>;
49
- /**
50
- * Start the dev server process
51
- */
52
- private startDevServer;
53
- /**
54
- * Connect to episoda.dev WebSocket
55
- */
56
- private connectWebSocket;
57
- /**
58
- * Handle git command from server
59
- */
60
- private handleGitCommand;
61
- /**
62
- * Format git command for display
63
- */
64
- private formatGitCommand;
65
- /**
66
- * Set up signal handlers for graceful shutdown
67
- */
68
- private setupSignalHandlers;
69
- /**
70
- * Gracefully shutdown dev server and WebSocket
71
- */
72
- shutdown(): Promise<void>;
73
- /**
74
- * Get current status
75
- */
76
- getStatus(): DevServerStatus;
77
- }
78
- /**
79
- * Wrap and run a dev server command
80
- * @param command - Command to run (e.g., ["npm", "start"])
81
- * @param options - Additional options
82
- */
83
- export declare function wrapDevServer(command: string[], options?: Partial<DevWrapperOptions>): Promise<DevServerWrapper>;
84
- /**
85
- * Stop the wrapped dev server
86
- */
87
- export declare function stopDevServer(): Promise<void>;
88
- //# sourceMappingURL=dev-wrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-wrapper.d.ts","sourceRoot":"","sources":["../src/dev-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,OAAO,EAAE,iBAAiB;IActC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;YACW,cAAc;IAyC5B;;OAEG;YACW,gBAAgB;IAyC9B;;OAEG;YACW,gBAAgB;IAwC9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C/B;;OAEG;IACH,SAAS,IAAI,eAAe;CAS7B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAOD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD"}
@@ -1,288 +0,0 @@
1
- "use strict";
2
- /**
3
- * Dev Server Wrapper
4
- *
5
- * This module wraps the user's dev server command and keeps it running
6
- * while maintaining the WebSocket connection to episoda.dev
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.DevServerWrapper = void 0;
10
- exports.wrapDevServer = wrapDevServer;
11
- exports.stopDevServer = stopDevServer;
12
- const child_process_1 = require("child_process");
13
- const core_1 = require("@episoda/core");
14
- const output_1 = require("./output");
15
- /**
16
- * DevServerWrapper class manages the dev server process and WebSocket connection
17
- */
18
- class DevServerWrapper {
19
- constructor(options) {
20
- this.restartCount = 0;
21
- this.shuttingDown = false;
22
- this.command = options.command;
23
- this.cwd = options.cwd || process.cwd();
24
- this.autoRestart = options.autoRestart ?? false;
25
- this.wsUrl = options.wsUrl;
26
- this.token = options.token;
27
- this.projectId = options.projectId;
28
- this.userId = options.userId;
29
- this.workspaceId = options.workspaceId;
30
- this.apiUrl = options.apiUrl;
31
- this.connectionOnlyMode = !options.command || options.command.length === 0;
32
- this.gitExecutor = new core_1.GitExecutor();
33
- }
34
- /**
35
- * Start the dev server and WebSocket connection
36
- */
37
- async start() {
38
- // Set up signal handlers for graceful shutdown
39
- this.setupSignalHandlers();
40
- // Start WebSocket connection (if credentials provided)
41
- if (this.wsUrl && this.token) {
42
- await this.connectWebSocket();
43
- }
44
- // Start dev server (skip if in connection-only mode)
45
- if (!this.connectionOnlyMode && this.command) {
46
- await this.startDevServer();
47
- }
48
- else if (this.connectionOnlyMode) {
49
- output_1.status.info('Running in connection-only mode (no dev server wrapped)');
50
- output_1.status.info('Connection will be maintained until you press Ctrl+C');
51
- output_1.status.info('');
52
- }
53
- }
54
- /**
55
- * Start the dev server process
56
- */
57
- async startDevServer() {
58
- if (!this.command || this.command.length === 0) {
59
- throw new Error('No command provided to start dev server');
60
- }
61
- output_1.status.info(`Starting dev server: ${this.command.join(' ')}`);
62
- this.devProcess = (0, child_process_1.spawn)(this.command[0], this.command.slice(1), {
63
- cwd: this.cwd,
64
- stdio: ['inherit', 'inherit', 'inherit'], // Forward all stdio
65
- shell: true
66
- });
67
- // Track process events
68
- this.devProcess.on('exit', (code, signal) => {
69
- if (this.shuttingDown) {
70
- output_1.status.info('Dev server stopped');
71
- return;
72
- }
73
- if (code === 0) {
74
- output_1.status.success('Dev server exited successfully');
75
- }
76
- else {
77
- output_1.status.error(`Dev server exited with code ${code}${signal ? ` (signal: ${signal})` : ''}`);
78
- }
79
- // Auto-restart if enabled
80
- if (this.autoRestart && !this.shuttingDown) {
81
- this.restartCount++;
82
- output_1.status.info(`Auto-restarting dev server (attempt ${this.restartCount})...`);
83
- setTimeout(() => {
84
- this.startDevServer();
85
- }, 2000); // Wait 2 seconds before restart
86
- }
87
- });
88
- this.devProcess.on('error', (error) => {
89
- output_1.status.error(`Dev server error: ${error.message}`);
90
- });
91
- }
92
- /**
93
- * Connect to episoda.dev WebSocket
94
- */
95
- async connectWebSocket() {
96
- if (!this.wsUrl || !this.token) {
97
- output_1.status.debug('WebSocket credentials not provided, skipping connection');
98
- return;
99
- }
100
- try {
101
- output_1.status.info('Connecting to episoda.dev...');
102
- this.wsClient = new core_1.EpisodaClient();
103
- // Set up event handlers BEFORE connecting
104
- this.wsClient.on('command', async (event) => {
105
- if (event.type === 'command') {
106
- // Type narrowing: event is { type: 'command'; id: string; command: GitCommand }
107
- const { id, command } = event;
108
- await this.handleGitCommand(id, command);
109
- }
110
- });
111
- this.wsClient.on('ping', async () => {
112
- // Ping handled automatically by client
113
- output_1.status.debug('Received ping from server');
114
- });
115
- this.wsClient.on('error', (event) => {
116
- if (event.type === 'error') {
117
- // Type narrowing: event is { type: 'error'; code: string; message: string }
118
- const { message: errMsg } = event;
119
- output_1.status.error(`WebSocket error: ${errMsg}`);
120
- }
121
- });
122
- // Connect to server
123
- await this.wsClient.connect(this.wsUrl, this.token);
124
- output_1.status.success(`Connected to episoda.dev${this.projectId ? ` (${this.projectId})` : ''}`);
125
- }
126
- catch (error) {
127
- output_1.status.warning(`Failed to connect to episoda.dev: ${error instanceof Error ? error.message : String(error)}`);
128
- output_1.status.info('Dev server will continue running without cloud connection');
129
- }
130
- }
131
- /**
132
- * Handle git command from server
133
- */
134
- async handleGitCommand(commandId, command) {
135
- try {
136
- // Log the command
137
- const commandStr = this.formatGitCommand(command);
138
- (0, output_1.printGitCommand)(commandStr);
139
- // Execute git command
140
- const result = await this.gitExecutor.execute(command, {
141
- cwd: this.cwd
142
- });
143
- // Print result
144
- console.log((0, output_1.formatResult)(result));
145
- // Send result back to server
146
- if (this.wsClient) {
147
- await this.wsClient.send({
148
- type: 'result',
149
- commandId,
150
- result
151
- });
152
- }
153
- }
154
- catch (error) {
155
- output_1.status.error(`Failed to execute git command: ${error instanceof Error ? error.message : String(error)}`);
156
- // Send error result to server
157
- if (this.wsClient) {
158
- await this.wsClient.send({
159
- type: 'result',
160
- commandId,
161
- result: {
162
- success: false,
163
- error: 'UNKNOWN_ERROR',
164
- output: error instanceof Error ? error.message : String(error)
165
- }
166
- });
167
- }
168
- }
169
- }
170
- /**
171
- * Format git command for display
172
- */
173
- formatGitCommand(command) {
174
- switch (command.action) {
175
- case 'checkout':
176
- return `git checkout ${command.create ? '-b ' : ''}${command.branch}`;
177
- case 'create_branch':
178
- return `git checkout -b ${command.branch}${command.from ? ` ${command.from}` : ''}`;
179
- case 'commit':
180
- return `git commit -m "${command.message}"${command.files ? ` ${command.files.join(' ')}` : ''}`;
181
- case 'push':
182
- return `git push${command.force ? ' --force' : ''}${command.setUpstream ? ' -u origin ' : ' '}${command.branch}`;
183
- case 'status':
184
- return 'git status';
185
- case 'pull':
186
- return `git pull${command.branch ? ` origin ${command.branch}` : ''}`;
187
- case 'delete_branch':
188
- return `git branch ${command.force ? '-D' : '-d'} ${command.branch}`;
189
- default:
190
- return 'git (unknown command)';
191
- }
192
- }
193
- /**
194
- * Set up signal handlers for graceful shutdown
195
- */
196
- setupSignalHandlers() {
197
- const shutdown = async () => {
198
- await this.shutdown();
199
- process.exit(0);
200
- };
201
- process.on('SIGINT', shutdown);
202
- process.on('SIGTERM', shutdown);
203
- }
204
- /**
205
- * Gracefully shutdown dev server and WebSocket
206
- */
207
- async shutdown() {
208
- if (this.shuttingDown) {
209
- return;
210
- }
211
- this.shuttingDown = true;
212
- output_1.status.info('Shutting down...');
213
- // Disconnect WebSocket
214
- if (this.wsClient) {
215
- try {
216
- await this.wsClient.disconnect();
217
- output_1.status.debug('WebSocket disconnected');
218
- }
219
- catch (error) {
220
- output_1.status.debug(`WebSocket disconnect error: ${error}`);
221
- }
222
- }
223
- // Stop dev server
224
- if (this.devProcess && !this.devProcess.killed) {
225
- try {
226
- this.devProcess.kill('SIGTERM');
227
- // Wait up to 5 seconds for graceful shutdown
228
- await new Promise((resolve) => {
229
- const timeout = setTimeout(() => {
230
- if (this.devProcess && !this.devProcess.killed) {
231
- output_1.status.warning('Force killing dev server...');
232
- this.devProcess.kill('SIGKILL');
233
- }
234
- resolve();
235
- }, 5000);
236
- this.devProcess?.on('exit', () => {
237
- clearTimeout(timeout);
238
- resolve();
239
- });
240
- });
241
- }
242
- catch (error) {
243
- output_1.status.debug(`Dev server shutdown error: ${error}`);
244
- }
245
- }
246
- output_1.status.success('Shutdown complete');
247
- }
248
- /**
249
- * Get current status
250
- */
251
- getStatus() {
252
- return {
253
- running: this.connectionOnlyMode ? true : (this.devProcess !== undefined && !this.devProcess.killed),
254
- pid: this.devProcess?.pid,
255
- command: this.command || [],
256
- restartCount: this.restartCount,
257
- connectedToCloud: this.wsClient?.getStatus().connected || false
258
- };
259
- }
260
- }
261
- exports.DevServerWrapper = DevServerWrapper;
262
- /**
263
- * Wrap and run a dev server command
264
- * @param command - Command to run (e.g., ["npm", "start"])
265
- * @param options - Additional options
266
- */
267
- async function wrapDevServer(command, options) {
268
- const wrapper = new DevServerWrapper({
269
- command,
270
- ...options
271
- });
272
- await wrapper.start();
273
- return wrapper;
274
- }
275
- /**
276
- * Global wrapper instance for tracking
277
- */
278
- let globalWrapper = null;
279
- /**
280
- * Stop the wrapped dev server
281
- */
282
- async function stopDevServer() {
283
- if (globalWrapper) {
284
- await globalWrapper.shutdown();
285
- globalWrapper = null;
286
- }
287
- }
288
- //# sourceMappingURL=dev-wrapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-wrapper.js","sourceRoot":"","sources":["../src/dev-wrapper.ts"],"names":[],"mappings":"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"}