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.
Files changed (111) hide show
  1. package/dist/commands/auth.d.ts +22 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +384 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/dev.d.ts +20 -0
  6. package/dist/commands/dev.d.ts.map +1 -0
  7. package/dist/commands/dev.js +305 -0
  8. package/dist/commands/dev.js.map +1 -0
  9. package/dist/commands/status.d.ts +9 -0
  10. package/dist/commands/status.d.ts.map +1 -0
  11. package/dist/commands/status.js +75 -0
  12. package/dist/commands/status.js.map +1 -0
  13. package/dist/commands/stop.d.ts +17 -0
  14. package/dist/commands/stop.d.ts.map +1 -0
  15. package/dist/commands/stop.js +81 -0
  16. package/dist/commands/stop.js.map +1 -0
  17. package/dist/core/auth.d.ts +26 -0
  18. package/dist/core/auth.d.ts.map +1 -0
  19. package/dist/core/auth.js +113 -0
  20. package/dist/core/auth.js.map +1 -0
  21. package/dist/core/command-protocol.d.ts +262 -0
  22. package/dist/core/command-protocol.d.ts.map +1 -0
  23. package/dist/core/command-protocol.js +13 -0
  24. package/dist/core/command-protocol.js.map +1 -0
  25. package/dist/core/connection-manager.d.ts +58 -0
  26. package/dist/core/connection-manager.d.ts.map +1 -0
  27. package/dist/core/connection-manager.js +215 -0
  28. package/dist/core/connection-manager.js.map +1 -0
  29. package/dist/core/errors.d.ts +18 -0
  30. package/dist/core/errors.d.ts.map +1 -0
  31. package/dist/core/errors.js +55 -0
  32. package/dist/core/errors.js.map +1 -0
  33. package/dist/core/git-executor.d.ts +157 -0
  34. package/dist/core/git-executor.d.ts.map +1 -0
  35. package/dist/core/git-executor.js +1605 -0
  36. package/dist/core/git-executor.js.map +1 -0
  37. package/dist/core/git-parser.d.ts +40 -0
  38. package/dist/core/git-parser.d.ts.map +1 -0
  39. package/dist/core/git-parser.js +194 -0
  40. package/dist/core/git-parser.js.map +1 -0
  41. package/dist/core/git-validator.d.ts +42 -0
  42. package/dist/core/git-validator.d.ts.map +1 -0
  43. package/dist/core/git-validator.js +102 -0
  44. package/dist/core/git-validator.js.map +1 -0
  45. package/dist/core/index.d.ts +17 -0
  46. package/dist/core/index.d.ts.map +1 -0
  47. package/dist/core/index.js +41 -0
  48. package/dist/core/index.js.map +1 -0
  49. package/dist/core/version.d.ts +9 -0
  50. package/dist/core/version.d.ts.map +1 -0
  51. package/dist/core/version.js +19 -0
  52. package/dist/core/version.js.map +1 -0
  53. package/dist/core/websocket-client.d.ts +122 -0
  54. package/dist/core/websocket-client.d.ts.map +1 -0
  55. package/dist/core/websocket-client.js +438 -0
  56. package/dist/core/websocket-client.js.map +1 -0
  57. package/dist/daemon/daemon-manager.d.ts +71 -0
  58. package/dist/daemon/daemon-manager.d.ts.map +1 -0
  59. package/dist/daemon/daemon-manager.js +289 -0
  60. package/dist/daemon/daemon-manager.js.map +1 -0
  61. package/dist/daemon/daemon-process.d.ts +13 -0
  62. package/dist/daemon/daemon-process.d.ts.map +1 -0
  63. package/dist/daemon/daemon-process.js +608 -0
  64. package/dist/daemon/daemon-process.js.map +1 -0
  65. package/dist/daemon/machine-id.d.ts +36 -0
  66. package/dist/daemon/machine-id.d.ts.map +1 -0
  67. package/dist/daemon/machine-id.js +195 -0
  68. package/dist/daemon/machine-id.js.map +1 -0
  69. package/dist/daemon/project-tracker.d.ts +92 -0
  70. package/dist/daemon/project-tracker.d.ts.map +1 -0
  71. package/dist/daemon/project-tracker.js +259 -0
  72. package/dist/daemon/project-tracker.js.map +1 -0
  73. package/dist/dev-wrapper.d.ts +88 -0
  74. package/dist/dev-wrapper.d.ts.map +1 -0
  75. package/dist/dev-wrapper.js +288 -0
  76. package/dist/dev-wrapper.js.map +1 -0
  77. package/dist/framework-detector.d.ts +29 -0
  78. package/dist/framework-detector.d.ts.map +1 -0
  79. package/dist/framework-detector.js +276 -0
  80. package/dist/framework-detector.js.map +1 -0
  81. package/dist/git-helpers/git-credential-helper.d.ts +29 -0
  82. package/dist/git-helpers/git-credential-helper.d.ts.map +1 -0
  83. package/dist/git-helpers/git-credential-helper.js +349 -0
  84. package/dist/git-helpers/git-credential-helper.js.map +1 -0
  85. package/dist/hooks/post-checkout +296 -0
  86. package/dist/hooks/pre-commit +139 -0
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +102 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/ipc/ipc-client.d.ts +95 -0
  92. package/dist/ipc/ipc-client.d.ts.map +1 -0
  93. package/dist/ipc/ipc-client.js +204 -0
  94. package/dist/ipc/ipc-client.js.map +1 -0
  95. package/dist/ipc/ipc-server.d.ts +55 -0
  96. package/dist/ipc/ipc-server.d.ts.map +1 -0
  97. package/dist/ipc/ipc-server.js +177 -0
  98. package/dist/ipc/ipc-server.js.map +1 -0
  99. package/dist/output.d.ts +48 -0
  100. package/dist/output.d.ts.map +1 -0
  101. package/dist/output.js +129 -0
  102. package/dist/output.js.map +1 -0
  103. package/dist/utils/port-check.d.ts +15 -0
  104. package/dist/utils/port-check.d.ts.map +1 -0
  105. package/dist/utils/port-check.js +79 -0
  106. package/dist/utils/port-check.js.map +1 -0
  107. package/dist/utils/update-checker.d.ts +23 -0
  108. package/dist/utils/update-checker.d.ts.map +1 -0
  109. package/dist/utils/update-checker.js +95 -0
  110. package/dist/utils/update-checker.js.map +1 -0
  111. package/package.json +51 -0
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ /**
3
+ * `episoda dev` command
4
+ *
5
+ * K722 Architecture:
6
+ * - Ensures daemon is running
7
+ * - Adds project to daemon for WebSocket connection
8
+ * - Optionally wraps user's dev server command
9
+ * - Daemon handles WebSocket persistence across terminal sessions
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.devCommand = devCommand;
46
+ const core_1 = require("../core");
47
+ const framework_detector_1 = require("../framework-detector");
48
+ const output_1 = require("../output");
49
+ const daemon_manager_1 = require("../daemon/daemon-manager");
50
+ const ipc_client_1 = require("../ipc/ipc-client");
51
+ const child_process_1 = require("child_process");
52
+ const path = __importStar(require("path"));
53
+ const port_check_1 = require("../utils/port-check");
54
+ // EP734: Connection retry configuration (polling removed - now event-driven)
55
+ const CONNECTION_MAX_RETRIES = 3; // Retry up to 3 times on failure
56
+ /**
57
+ * EP593: Find the git repository root directory
58
+ * This ensures we always use the same project path regardless of where episoda dev is run
59
+ */
60
+ function findGitRoot(startDir) {
61
+ try {
62
+ const result = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
63
+ cwd: startDir,
64
+ encoding: 'utf-8',
65
+ stdio: ['pipe', 'pipe', 'pipe']
66
+ });
67
+ return result.trim();
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * Execute the `episoda dev` command
75
+ * @param options - Command options
76
+ */
77
+ async function devCommand(options = {}) {
78
+ try {
79
+ // K722: Load existing config (created by /api/start OAuth flow)
80
+ const config = await (0, core_1.loadConfig)();
81
+ if (!config || !config.access_token || !config.project_id) {
82
+ output_1.status.error('No authentication found. Please run:');
83
+ output_1.status.info('');
84
+ output_1.status.info(' episoda auth');
85
+ output_1.status.info('');
86
+ output_1.status.info('This will authenticate with episoda.dev and configure the CLI.');
87
+ process.exit(1);
88
+ }
89
+ // EP734: Clean up any stale episoda processes before starting
90
+ // This ensures only one daemon runs per device
91
+ const killedCount = (0, daemon_manager_1.killAllEpisodaProcesses)();
92
+ if (killedCount > 0) {
93
+ output_1.status.info(`Cleaned up ${killedCount} stale process${killedCount > 1 ? 'es' : ''}`);
94
+ }
95
+ // EP734: Determine project path using cached settings (avoids network call)
96
+ // Priority: 1. Cached settings (if fresh), 2. Git root detection, 3. Current working directory
97
+ const serverUrl = config.api_url || process.env.EPISODA_API_URL || 'https://episoda.dev';
98
+ let projectPath;
99
+ // EP734: Check if we have fresh cached settings (< 24 hours old)
100
+ const SETTINGS_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours in ms
101
+ const cachedSettings = config.project_settings;
102
+ const isCacheFresh = cachedSettings?.cached_at &&
103
+ (Date.now() - cachedSettings.cached_at) < SETTINGS_CACHE_TTL;
104
+ if (isCacheFresh && cachedSettings?.local_project_path) {
105
+ // Use cached project path
106
+ projectPath = cachedSettings.local_project_path;
107
+ output_1.status.debug(`Using cached project path: ${projectPath}`);
108
+ }
109
+ else {
110
+ // No cache or stale - detect git root locally (no network call)
111
+ const detectedRoot = findGitRoot(options.cwd || process.cwd());
112
+ projectPath = detectedRoot || path.resolve(options.cwd || process.cwd());
113
+ if (detectedRoot) {
114
+ output_1.status.debug(`Detected project root: ${projectPath}`);
115
+ }
116
+ else {
117
+ output_1.status.warning(`Could not detect git root, using: ${projectPath}`);
118
+ }
119
+ // Cache the detected path locally
120
+ const updatedConfig = {
121
+ ...config,
122
+ project_settings: {
123
+ ...cachedSettings,
124
+ local_project_path: projectPath,
125
+ cached_at: Date.now()
126
+ }
127
+ };
128
+ await (0, core_1.saveConfig)(updatedConfig);
129
+ output_1.status.debug('Cached project settings locally');
130
+ // Background: Save to server (don't await - fire and forget)
131
+ const settingsUrl = `${serverUrl}/api/projects/${config.project_id}/settings`;
132
+ fetch(settingsUrl, {
133
+ method: 'PATCH',
134
+ headers: {
135
+ 'Authorization': `Bearer ${config.access_token}`,
136
+ 'Content-Type': 'application/json'
137
+ },
138
+ body: JSON.stringify({ local_project_path: projectPath })
139
+ }).catch(() => { }); // Ignore errors - server sync is best-effort
140
+ }
141
+ // K722: Ensure daemon is running
142
+ let daemonPid = (0, daemon_manager_1.isDaemonRunning)();
143
+ if (!daemonPid) {
144
+ output_1.status.info('Starting Episoda daemon...');
145
+ try {
146
+ daemonPid = await (0, daemon_manager_1.startDaemon)();
147
+ output_1.status.success(`Daemon started (PID: ${daemonPid})`);
148
+ }
149
+ catch (error) {
150
+ output_1.status.error(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
151
+ process.exit(1);
152
+ }
153
+ }
154
+ else {
155
+ output_1.status.debug(`Daemon already running (PID: ${daemonPid})`);
156
+ }
157
+ // Verify daemon is reachable via IPC
158
+ const reachable = await (0, ipc_client_1.isDaemonReachable)();
159
+ if (!reachable) {
160
+ output_1.status.error('Daemon is running but not responding. Try: episoda stop && episoda dev');
161
+ process.exit(1);
162
+ }
163
+ // EP734: Add project to daemon - now blocking (no more polling)
164
+ // The addProject IPC call waits for WebSocket connection to complete
165
+ output_1.status.info(`Connecting project to Episoda...`);
166
+ let connected = false;
167
+ let lastError;
168
+ for (let retry = 0; retry < CONNECTION_MAX_RETRIES && !connected; retry++) {
169
+ if (retry > 0) {
170
+ output_1.status.info(`Retrying connection (attempt ${retry + 1}/${CONNECTION_MAX_RETRIES})...`);
171
+ await new Promise(resolve => setTimeout(resolve, 1000));
172
+ }
173
+ try {
174
+ // EP734: Blocking call - waits for connection to complete
175
+ const result = await (0, ipc_client_1.addProject)(config.project_id, projectPath);
176
+ if (result.connected) {
177
+ connected = true;
178
+ }
179
+ else {
180
+ lastError = result.error || 'Connection failed';
181
+ }
182
+ }
183
+ catch (error) {
184
+ lastError = error instanceof Error ? error.message : String(error);
185
+ }
186
+ }
187
+ if (!connected) {
188
+ output_1.status.error(`Failed to connect: ${lastError}`);
189
+ output_1.status.info('Check server status at https://episoda.dev/api/system/health');
190
+ process.exit(1);
191
+ }
192
+ output_1.status.success('Connected to Episoda');
193
+ // Determine if we should start a dev server or just connect
194
+ let command;
195
+ let detection;
196
+ let connectionOnlyMode = false;
197
+ // Check if user explicitly requested connection-only mode
198
+ if (options.command && options.command.length === 0) {
199
+ connectionOnlyMode = true;
200
+ output_1.status.debug('Connection-only mode (explicit)');
201
+ }
202
+ else if (!options.command) {
203
+ // Auto-detect: Check if server is already running
204
+ const serverPort = (0, port_check_1.getServerPort)();
205
+ const portInUse = await (0, port_check_1.isPortInUse)(serverPort);
206
+ if (portInUse) {
207
+ connectionOnlyMode = true;
208
+ output_1.status.info(`Server already running on port ${serverPort}`);
209
+ output_1.status.info('Connecting to existing server...');
210
+ }
211
+ }
212
+ // Resolve dev command if not in connection-only mode
213
+ if (!connectionOnlyMode) {
214
+ try {
215
+ const result = await (0, framework_detector_1.resolveDevCommand)(options.command || null, projectPath);
216
+ command = result.command;
217
+ detection = result.detection;
218
+ // Show framework detection if auto-detected
219
+ if (detection && !options.command) {
220
+ (0, output_1.printFrameworkDetection)(detection.framework, detection.command, detection.confidence);
221
+ }
222
+ }
223
+ catch (error) {
224
+ // No command detected
225
+ output_1.status.debug('No dev command detected');
226
+ command = undefined;
227
+ }
228
+ }
229
+ // If dev command provided, wrap it
230
+ if (command && command.length > 0) {
231
+ await runDevServer(command, projectPath, options.autoRestart ?? false);
232
+ }
233
+ else {
234
+ // Connection-only mode
235
+ output_1.status.info('');
236
+ output_1.status.info('Connected! Git operations will be executed by Episoda.');
237
+ output_1.status.info('Press Ctrl+C to disconnect.');
238
+ output_1.status.info('');
239
+ // Keep process alive
240
+ await new Promise(() => { });
241
+ }
242
+ }
243
+ catch (error) {
244
+ output_1.status.error(`Failed: ${error instanceof Error ? error.message : String(error)}`);
245
+ process.exit(1);
246
+ }
247
+ }
248
+ /**
249
+ * Run dev server process
250
+ */
251
+ async function runDevServer(command, cwd, autoRestart) {
252
+ let devProcess;
253
+ let restartCount = 0;
254
+ let shuttingDown = false;
255
+ const startServer = () => {
256
+ output_1.status.info(`Starting dev server: ${command.join(' ')}`);
257
+ devProcess = (0, child_process_1.spawn)(command[0], command.slice(1), {
258
+ cwd,
259
+ stdio: ['inherit', 'inherit', 'inherit'],
260
+ shell: true
261
+ });
262
+ devProcess.on('exit', (code, signal) => {
263
+ if (shuttingDown) {
264
+ output_1.status.info('Dev server stopped');
265
+ return;
266
+ }
267
+ if (code === 0) {
268
+ output_1.status.success('Dev server exited successfully');
269
+ }
270
+ else {
271
+ output_1.status.error(`Dev server exited with code ${code}${signal ? ` (signal: ${signal})` : ''}`);
272
+ }
273
+ // Auto-restart if enabled
274
+ if (autoRestart && !shuttingDown) {
275
+ restartCount++;
276
+ output_1.status.info(`Auto-restarting dev server (attempt ${restartCount})...`);
277
+ setTimeout(() => {
278
+ startServer();
279
+ }, 2000);
280
+ }
281
+ });
282
+ devProcess.on('error', (error) => {
283
+ output_1.status.error(`Dev server error: ${error.message}`);
284
+ });
285
+ };
286
+ // Setup shutdown handler
287
+ const shutdownHandler = async (signal) => {
288
+ if (shuttingDown)
289
+ return;
290
+ shuttingDown = true;
291
+ output_1.status.info(`\nReceived ${signal}, shutting down...`);
292
+ if (devProcess) {
293
+ devProcess.kill('SIGTERM');
294
+ }
295
+ // Note: Daemon keeps running in background
296
+ output_1.status.info('Dev server stopped. Daemon continues running in background.');
297
+ process.exit(0);
298
+ };
299
+ process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
300
+ process.on('SIGINT', () => shutdownHandler('SIGINT'));
301
+ startServer();
302
+ // Keep process alive
303
+ await new Promise(() => { });
304
+ }
305
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `episoda status` command
3
+ *
4
+ * Shows the current CLI connection status and configuration details.
5
+ * EP734: Simplified to only check local daemon state (removed server comparison).
6
+ * EP738: Now uses IPC instead of HTTP (localhost:3002 server removed).
7
+ */
8
+ export declare function statusCommand(): Promise<void>;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiEnD"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * `episoda status` command
4
+ *
5
+ * Shows the current CLI connection status and configuration details.
6
+ * EP734: Simplified to only check local daemon state (removed server comparison).
7
+ * EP738: Now uses IPC instead of HTTP (localhost:3002 server removed).
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.statusCommand = statusCommand;
11
+ const core_1 = require("../core");
12
+ const ipc_client_1 = require("../ipc/ipc-client");
13
+ const output_1 = require("../output");
14
+ async function statusCommand() {
15
+ output_1.status.info('Checking CLI status...');
16
+ output_1.status.info('');
17
+ // Check if config exists
18
+ const config = await (0, core_1.loadConfig)();
19
+ if (!config) {
20
+ output_1.status.error('✗ CLI not initialized');
21
+ output_1.status.info('');
22
+ output_1.status.info('Run the following to initialize:');
23
+ output_1.status.info(' episoda init --project <project_id> --token <setup_token>');
24
+ output_1.status.info('');
25
+ output_1.status.info('Get a setup token from: Settings > Local Development');
26
+ return;
27
+ }
28
+ // Show config details
29
+ output_1.status.success('✓ CLI initialized');
30
+ output_1.status.info('');
31
+ output_1.status.info('Configuration:');
32
+ output_1.status.info(` Project ID: ${config.project_id}`);
33
+ output_1.status.info(` API URL: ${config.api_url}`);
34
+ output_1.status.info(` CLI Version: ${config.cli_version}`);
35
+ output_1.status.info(` Config file: ${(0, core_1.getConfigPath)()}`);
36
+ output_1.status.info('');
37
+ if (!config.access_token || config.access_token === '') {
38
+ output_1.status.warning('⚠ Not authenticated');
39
+ output_1.status.info(' Run "episoda auth" to authenticate.');
40
+ return;
41
+ }
42
+ // EP738: Query daemon via IPC instead of HTTP
43
+ let daemonStatus = null;
44
+ try {
45
+ daemonStatus = await (0, ipc_client_1.getStatus)();
46
+ }
47
+ catch {
48
+ // Daemon not running or IPC failed
49
+ }
50
+ if (!daemonStatus) {
51
+ output_1.status.warning('⚠ Daemon not running');
52
+ output_1.status.info(' Run "episoda dev" to start the daemon.');
53
+ return;
54
+ }
55
+ // Check if any project is connected
56
+ const connectedProject = daemonStatus.projects.find(p => p.connected);
57
+ if (connectedProject) {
58
+ output_1.status.success('✓ Connected to server');
59
+ output_1.status.info(` Device: ${daemonStatus.hostname}`);
60
+ output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
61
+ output_1.status.info(` Project: ${connectedProject.name}`);
62
+ }
63
+ else if (daemonStatus.projects.length > 0) {
64
+ output_1.status.warning('⚠ Daemon running but not connected');
65
+ output_1.status.info(` Device: ${daemonStatus.hostname}`);
66
+ output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
67
+ output_1.status.info(' Run "episoda dev" in a project directory to connect.');
68
+ }
69
+ else {
70
+ output_1.status.warning('⚠ Daemon running but no projects registered');
71
+ output_1.status.info(` Device: ${daemonStatus.hostname}`);
72
+ output_1.status.info(' Run "episoda dev" in a project directory to connect.');
73
+ }
74
+ }
75
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `episoda stop` command
3
+ *
4
+ * K722: Stop the Episoda daemon
5
+ * - Sends shutdown signal to daemon via IPC
6
+ * - Waits for daemon to stop gracefully
7
+ * - Falls back to forceful shutdown if needed
8
+ */
9
+ export interface StopCommandOptions {
10
+ force?: boolean;
11
+ }
12
+ /**
13
+ * Execute the `episoda stop` command
14
+ * @param options - Command options
15
+ */
16
+ export declare function stopCommand(options?: StopCommandOptions): Promise<void>;
17
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjF"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * `episoda stop` command
4
+ *
5
+ * K722: Stop the Episoda daemon
6
+ * - Sends shutdown signal to daemon via IPC
7
+ * - Waits for daemon to stop gracefully
8
+ * - Falls back to forceful shutdown if needed
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.stopCommand = stopCommand;
12
+ const output_1 = require("../output");
13
+ const daemon_manager_1 = require("../daemon/daemon-manager");
14
+ const ipc_client_1 = require("../ipc/ipc-client");
15
+ /**
16
+ * Execute the `episoda stop` command
17
+ * @param options - Command options
18
+ */
19
+ async function stopCommand(options = {}) {
20
+ try {
21
+ // Check if daemon is running
22
+ const pid = (0, daemon_manager_1.isDaemonRunning)();
23
+ if (!pid) {
24
+ output_1.status.info('Daemon is not running');
25
+ return;
26
+ }
27
+ output_1.status.info(`Stopping daemon (PID: ${pid})...`);
28
+ if (options.force) {
29
+ // Force kill
30
+ const stopped = await (0, daemon_manager_1.stopDaemon)(1000); // 1 second timeout before SIGKILL
31
+ if (stopped) {
32
+ output_1.status.success('Daemon force-stopped');
33
+ }
34
+ else {
35
+ output_1.status.error('Failed to stop daemon');
36
+ process.exit(1);
37
+ }
38
+ }
39
+ else {
40
+ // Graceful shutdown via IPC
41
+ try {
42
+ // Check if daemon is reachable
43
+ const reachable = await (0, ipc_client_1.isDaemonReachable)();
44
+ if (reachable) {
45
+ // Send shutdown command
46
+ await (0, ipc_client_1.shutdownDaemon)();
47
+ output_1.status.success('Daemon stopped');
48
+ }
49
+ else {
50
+ // Daemon not reachable, force stop
51
+ output_1.status.warning('Daemon not responding, forcing shutdown...');
52
+ const stopped = await (0, daemon_manager_1.stopDaemon)(1000);
53
+ if (stopped) {
54
+ output_1.status.success('Daemon stopped');
55
+ }
56
+ else {
57
+ output_1.status.error('Failed to stop daemon');
58
+ process.exit(1);
59
+ }
60
+ }
61
+ }
62
+ catch (error) {
63
+ // IPC failed, try direct stop
64
+ output_1.status.warning('Failed to communicate with daemon, trying direct shutdown...');
65
+ const stopped = await (0, daemon_manager_1.stopDaemon)(5000);
66
+ if (stopped) {
67
+ output_1.status.success('Daemon stopped');
68
+ }
69
+ else {
70
+ output_1.status.error(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
71
+ process.exit(1);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ output_1.status.error(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
78
+ process.exit(1);
79
+ }
80
+ }
81
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAcH,kCAwDC;AApED,sCAAkC;AAClC,6DAAsE;AACtE,kDAAqE;AAMrE;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,UAA8B,EAAE;IAChE,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,GAAG,GAAG,IAAA,gCAAe,GAAE,CAAA;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YACpC,OAAM;QACR,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,CAAA;QAE/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,aAAa;YACb,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA,CAAC,kCAAkC;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,eAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,IAAI,CAAC;gBACH,+BAA+B;gBAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,8BAAiB,GAAE,CAAA;gBAC3C,IAAI,SAAS,EAAE,CAAC;oBACd,wBAAwB;oBACxB,MAAM,IAAA,2BAAc,GAAE,CAAA;oBACtB,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,eAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAA;oBAC5D,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA;oBACtC,IAAI,OAAO,EAAE,CAAC;wBACZ,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;oBAClC,CAAC;yBAAM,CAAC;wBACN,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;wBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8BAA8B;gBAC9B,eAAM,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,OAAO,EAAE,CAAC;oBACZ,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACN,eAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;oBAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Authentication utilities
3
+ */
4
+ import { EpisodaConfig } from './command-protocol';
5
+ /**
6
+ * Get the config directory path
7
+ * Supports EPISODA_CONFIG_DIR env var for running multiple environments
8
+ */
9
+ export declare function getConfigDir(): string;
10
+ /**
11
+ * Get the full path to the config file
12
+ */
13
+ export declare function getConfigPath(configPath?: string): string;
14
+ /**
15
+ * Load configuration from .episoda/config.json
16
+ */
17
+ export declare function loadConfig(configPath?: string): Promise<EpisodaConfig | null>;
18
+ /**
19
+ * Save configuration to .episoda/config.json
20
+ */
21
+ export declare function saveConfig(config: EpisodaConfig, configPath?: string): Promise<void>;
22
+ /**
23
+ * Validate an access token
24
+ */
25
+ export declare function validateToken(token: string): Promise<boolean>;
26
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzD;AAYD;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAenF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE"}