@sumicom/quicksave 0.4.0 → 0.5.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 (75) hide show
  1. package/dist/ai/claudeCodeService.d.ts +89 -0
  2. package/dist/ai/claudeCodeService.d.ts.map +1 -0
  3. package/dist/ai/claudeCodeService.js +602 -0
  4. package/dist/ai/claudeCodeService.js.map +1 -0
  5. package/dist/ai/sessionStore.d.ts +31 -0
  6. package/dist/ai/sessionStore.d.ts.map +1 -0
  7. package/dist/ai/sessionStore.js +72 -0
  8. package/dist/ai/sessionStore.js.map +1 -0
  9. package/dist/ai/sessionStore.test.d.ts +2 -0
  10. package/dist/ai/sessionStore.test.d.ts.map +1 -0
  11. package/dist/ai/sessionStore.test.js +99 -0
  12. package/dist/ai/sessionStore.test.js.map +1 -0
  13. package/dist/config.d.ts +7 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +39 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/connection/connection.d.ts +2 -0
  18. package/dist/connection/connection.d.ts.map +1 -1
  19. package/dist/connection/connection.js +14 -5
  20. package/dist/connection/connection.js.map +1 -1
  21. package/dist/connection/relay.d.ts.map +1 -1
  22. package/dist/connection/relay.js +2 -0
  23. package/dist/connection/relay.js.map +1 -1
  24. package/dist/git/operations.d.ts +8 -1
  25. package/dist/git/operations.d.ts.map +1 -1
  26. package/dist/git/operations.js +71 -4
  27. package/dist/git/operations.js.map +1 -1
  28. package/dist/handlers/messageHandler.d.ts +18 -1
  29. package/dist/handlers/messageHandler.d.ts.map +1 -1
  30. package/dist/handlers/messageHandler.js +231 -11
  31. package/dist/handlers/messageHandler.js.map +1 -1
  32. package/dist/handlers/messageHandler.test.js +1 -1
  33. package/dist/index.js +228 -94
  34. package/dist/index.js.map +1 -1
  35. package/dist/service/ensureDaemon.d.ts +23 -0
  36. package/dist/service/ensureDaemon.d.ts.map +1 -0
  37. package/dist/service/ensureDaemon.js +138 -0
  38. package/dist/service/ensureDaemon.js.map +1 -0
  39. package/dist/service/index.d.ts +8 -0
  40. package/dist/service/index.d.ts.map +1 -0
  41. package/dist/service/index.js +8 -0
  42. package/dist/service/index.js.map +1 -0
  43. package/dist/service/ipc.test.d.ts +2 -0
  44. package/dist/service/ipc.test.d.ts.map +1 -0
  45. package/dist/service/ipc.test.js +140 -0
  46. package/dist/service/ipc.test.js.map +1 -0
  47. package/dist/service/ipcClient.d.ts +36 -0
  48. package/dist/service/ipcClient.d.ts.map +1 -0
  49. package/dist/service/ipcClient.js +167 -0
  50. package/dist/service/ipcClient.js.map +1 -0
  51. package/dist/service/ipcServer.d.ts +53 -0
  52. package/dist/service/ipcServer.d.ts.map +1 -0
  53. package/dist/service/ipcServer.js +245 -0
  54. package/dist/service/ipcServer.js.map +1 -0
  55. package/dist/service/run.d.ts +13 -0
  56. package/dist/service/run.d.ts.map +1 -0
  57. package/dist/service/run.js +292 -0
  58. package/dist/service/run.js.map +1 -0
  59. package/dist/service/singleton.d.ts +31 -0
  60. package/dist/service/singleton.d.ts.map +1 -0
  61. package/dist/service/singleton.js +96 -0
  62. package/dist/service/singleton.js.map +1 -0
  63. package/dist/service/singleton.test.d.ts +2 -0
  64. package/dist/service/singleton.test.d.ts.map +1 -0
  65. package/dist/service/singleton.test.js +39 -0
  66. package/dist/service/singleton.test.js.map +1 -0
  67. package/dist/service/stateStore.d.ts +11 -0
  68. package/dist/service/stateStore.d.ts.map +1 -0
  69. package/dist/service/stateStore.js +35 -0
  70. package/dist/service/stateStore.js.map +1 -0
  71. package/dist/service/types.d.ts +111 -0
  72. package/dist/service/types.d.ts.map +1 -0
  73. package/dist/service/types.js +76 -0
  74. package/dist/service/types.js.map +1 -0
  75. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -2,132 +2,135 @@
2
2
  import { Command } from 'commander';
3
3
  // @ts-ignore - no types for qrcode-terminal
4
4
  import qrcode from 'qrcode-terminal';
5
- import { resolve, basename } from 'path';
5
+ import { resolve } from 'path';
6
6
  import { hostname } from 'os';
7
- import { AgentConnection } from './connection/connection.js';
8
- import { MessageHandler } from './handlers/messageHandler.js';
7
+ import { getConfigPath, rotateKeyPair, addManagedRepo, addManagedCodingPath } from './config.js';
9
8
  import { GitOperations } from './git/operations.js';
10
- import { getOrCreateConfig, getConfigPath, rotateKeyPair } from './config.js';
11
- const DEFAULT_SIGNALING_SERVER = process.env.QUICKSAVE_SIGNALING_URL || 'wss://signal.quicksave.dev';
9
+ import { runDaemon } from './service/run.js';
10
+ import { IpcClient as IpcClientClass } from './service/ipcClient.js';
11
+ import { readServiceState } from './service/stateStore.js';
12
+ import { isProcessAlive } from './service/singleton.js';
12
13
  const program = new Command();
13
- function collectRepos(value, previous) {
14
+ function collectValues(value, previous) {
14
15
  return previous.concat([value]);
15
16
  }
16
17
  program
17
18
  .name('quicksave-agent')
18
19
  .description('Quicksave desktop agent for remote git control')
19
- .version('0.1.0')
20
- .option('-r, --repo <path>', 'Path to git repository (can specify multiple)', collectRepos, [])
21
- .option('-s, --signaling <url>', 'Signaling server URL', DEFAULT_SIGNALING_SERVER)
20
+ .version('0.5.0')
21
+ .allowExcessArguments(false)
22
+ .option('-r, --repo <path>', 'Path to git repository (can specify multiple)', collectValues, [])
23
+ .option('-c, --coding-path <path>', 'Path for Claude Code sessions (can specify multiple, non-git dirs OK)', collectValues, [])
24
+ .option('-s, --signaling <url>', 'Signaling server URL')
22
25
  .option('--no-qr', 'Disable QR code display')
23
26
  .action(async (options) => {
24
- // Default to current directory if no repos specified
25
- const repoPaths = options.repo.length > 0 ? options.repo : ['.'];
26
- const resolvedPaths = repoPaths.map((p) => resolve(p));
27
- const signalingServer = options.signaling;
28
- console.log('Quicksave Agent v0.1.0');
29
- console.log('='.repeat(50));
30
- // Verify all git repositories
31
- const validRepos = [];
32
- for (const repoPath of resolvedPaths) {
33
- const git = new GitOperations(repoPath);
34
- const isValid = await git.isValidRepo();
35
- if (!isValid) {
36
- console.error(`Warning: ${repoPath} is not a valid git repository, skipping`);
37
- continue;
38
- }
39
- const { current: currentBranch } = await git.getBranches();
40
- validRepos.push({
41
- path: repoPath,
42
- name: basename(repoPath),
43
- currentBranch,
44
- });
45
- }
46
- if (validRepos.length === 0) {
47
- console.error('Error: No valid git repositories found');
48
- process.exit(1);
27
+ // Persist any CLI-provided repos/coding paths to config
28
+ const repoPaths = options.repo;
29
+ for (const p of repoPaths) {
30
+ addManagedRepo(resolve(p));
49
31
  }
50
- console.log(`Repositories (${validRepos.length}):`);
51
- for (const repo of validRepos) {
52
- console.log(` - ${repo.name} (${repo.path}) [${repo.currentBranch}]`);
32
+ const codingPaths = options.codingPath || [];
33
+ for (const p of codingPaths) {
34
+ addManagedCodingPath(resolve(p));
53
35
  }
54
- // Load or create config
55
- const config = getOrCreateConfig(signalingServer);
56
- console.log(`Config: ${getConfigPath()}`);
57
- console.log(`Signaling: ${signalingServer}`);
58
- console.log('');
59
- // Create connection
60
- const connection = new AgentConnection({
61
- signalingServer,
62
- agentId: config.agentId,
63
- keyPair: config.keyPair,
64
- });
65
- // Create message handler with all valid repos
66
- const messageHandler = new MessageHandler(validRepos, config.license);
67
- // Handle incoming messages
68
- connection.on('message', async (message, peerAddress) => {
69
- const response = await messageHandler.handleMessage(message, peerAddress);
70
- connection.send(response, peerAddress);
71
- });
72
- connection.on('connected', (peerAddress) => {
73
- const peerKey = peerAddress.replace('pwa:', '');
74
- console.log(`\n+ PWA connected: ${peerKey.slice(0, 12)}... (${connection.getPeerCount()} client${connection.getPeerCount() !== 1 ? 's' : ''})`);
75
- });
76
- connection.on('disconnected', (peerAddress) => {
77
- const peerKey = peerAddress.replace('pwa:', '');
78
- messageHandler.removeClient(peerAddress);
79
- console.log(`\n- PWA disconnected: ${peerKey.slice(0, 12)}... (${connection.getPeerCount()} client${connection.getPeerCount() !== 1 ? 's' : ''})`);
80
- if (!connection.hasPeers()) {
81
- displayConnectionInfo(config.agentId, config.keyPair.publicKey, options.qr);
36
+ // Auto-detect current directory's repo
37
+ if (repoPaths.length === 0) {
38
+ const cwd = process.cwd();
39
+ const git = new GitOperations(cwd);
40
+ if (await git.isValidRepo()) {
41
+ const root = await git.getGitRoot();
42
+ addManagedRepo(root);
43
+ repoPaths.push(root);
82
44
  }
83
- });
84
- connection.on('error', (error) => {
85
- console.error('Connection error:', error.message);
86
- });
87
- // Start connection
45
+ }
46
+ // Ensure daemon is running
47
+ const { ensureDaemon } = await import('./service/ensureDaemon.js');
48
+ let client;
88
49
  try {
89
- await connection.start();
90
- displayConnectionInfo(config.agentId, config.keyPair.publicKey, options.qr);
50
+ const result = await ensureDaemon();
51
+ client = result.client;
52
+ console.log(`Quicksave Agent v0.5.0 (daemon pid: ${result.hello.daemonPid})`);
53
+ console.log('='.repeat(50));
91
54
  }
92
- catch (error) {
93
- console.error('Failed to start agent:', error);
55
+ catch (err) {
56
+ console.error('Failed to connect to daemon:', err.message);
94
57
  process.exit(1);
95
58
  }
96
- // Handle shutdown
59
+ // Notify the running daemon about repos (idempotent — no-op if already known)
60
+ for (const p of repoPaths) {
61
+ try {
62
+ await client.request('add-repo', { path: resolve(p) });
63
+ }
64
+ catch { /* daemon already has it or will pick it up on restart */ }
65
+ }
66
+ // Get pairing info and display
67
+ try {
68
+ const info = await client.request('get-pairing-info');
69
+ console.log(`Config: ${getConfigPath()}`);
70
+ console.log('');
71
+ displayPairingInfo(info, options.qr);
72
+ }
73
+ catch (err) {
74
+ console.error('Failed to get pairing info:', err.message);
75
+ }
76
+ // Subscribe to live events
77
+ await client.request('subscribe-events');
78
+ client.onNotification((method, params) => {
79
+ if (method === 'event.peerConnected') {
80
+ const p = params;
81
+ console.log(`\n+ PWA connected: ${p.peerId}... (${p.peerCount} peer${p.peerCount !== 1 ? 's' : ''})`);
82
+ }
83
+ else if (method === 'event.peerDisconnected') {
84
+ const p = params;
85
+ console.log(`\n- PWA disconnected: ${p.peerId}... (${p.peerCount} peer${p.peerCount !== 1 ? 's' : ''})`);
86
+ }
87
+ else if (method === 'event.repoAdded') {
88
+ const p = params;
89
+ console.log(`\n+ Repo added: ${p.repo.name} (${p.repo.path})`);
90
+ }
91
+ else if (method === 'event.repoRemoved') {
92
+ const p = params;
93
+ console.log(`\n- Repo removed: ${p.path}`);
94
+ }
95
+ else if (method === 'event.daemonStatus') {
96
+ // Daemon status change (e.g., shutting down)
97
+ if (params.shutting_down) {
98
+ console.log('\nDaemon is shutting down...');
99
+ client.close();
100
+ process.exit(0);
101
+ }
102
+ }
103
+ });
104
+ // Ctrl+C detaches (leaves daemon running)
97
105
  process.on('SIGINT', () => {
98
- console.log('\nShutting down...');
99
- connection.disconnect();
106
+ console.log('\nDetaching (daemon still running)...');
107
+ client.close();
100
108
  process.exit(0);
101
109
  });
102
110
  process.on('SIGTERM', () => {
103
- connection.disconnect();
111
+ client.close();
104
112
  process.exit(0);
105
113
  });
106
114
  });
107
- function displayConnectionInfo(agentId, publicKey, showQr) {
108
- console.log('');
109
- console.log('='.repeat(50));
110
- console.log('Connection Info');
111
- console.log('='.repeat(50));
112
- console.log('');
115
+ function displayPairingInfo(info, showQr) {
113
116
  console.log('Agent ID:');
114
- console.log(` ${agentId}`);
117
+ console.log(` ${info.agentId}`);
115
118
  console.log('');
116
- console.log('Public Key:');
117
- console.log(` ${publicKey}`);
118
- console.log('');
119
- // Create connection URL for PWA
120
- const connectionUrl = `https://quicksave.dev/connect?id=${agentId}&pk=${encodeURIComponent(publicKey)}&name=${encodeURIComponent(hostname())}`;
121
119
  console.log('Connection URL:');
122
- console.log(` ${connectionUrl}`);
120
+ console.log(` ${info.pairingUrl}`);
123
121
  console.log('');
124
122
  if (showQr) {
125
123
  console.log('Scan QR code to connect:');
126
124
  console.log('');
127
- qrcode.generate(connectionUrl, { small: true });
125
+ qrcode.generate(info.pairingUrl, { small: true });
128
126
  }
129
127
  console.log('');
130
- console.log('Waiting for PWA connection...');
128
+ if (info.peerCount > 0) {
129
+ console.log(`Connected to ${info.peerCount} peer${info.peerCount !== 1 ? 's' : ''}`);
130
+ }
131
+ else {
132
+ console.log('Waiting for PWA connection...');
133
+ }
131
134
  }
132
135
  program
133
136
  .command('rotate-keys')
@@ -140,12 +143,143 @@ program
140
143
  console.log(` Public Key: ${config.keyPair.publicKey} (NEW)\n`);
141
144
  console.log('All existing PWA connections are now invalid.');
142
145
  console.log('Re-scan the QR code on your trusted devices to reconnect.\n');
143
- displayConnectionInfo(config.agentId, config.keyPair.publicKey, true);
146
+ const pairingUrl = `https://quicksave.dev/connect?id=${config.agentId}&pk=${encodeURIComponent(config.keyPair.publicKey)}&name=${encodeURIComponent(hostname())}`;
147
+ console.log('Connection URL:');
148
+ console.log(` ${pairingUrl}\n`);
149
+ qrcode.generate(pairingUrl, { small: true });
144
150
  }
145
151
  catch (err) {
146
152
  console.error('Failed to rotate keys:', err.message);
147
153
  process.exit(1);
148
154
  }
149
155
  });
156
+ // ---------------------------------------------------------------------------
157
+ // Service subcommands
158
+ // ---------------------------------------------------------------------------
159
+ const serviceCmd = program
160
+ .command('service')
161
+ .description('Manage the quicksave background service');
162
+ serviceCmd
163
+ .command('run')
164
+ .description('Run the daemon in the foreground (not normally invoked directly)')
165
+ .action(async () => {
166
+ await runDaemon();
167
+ });
168
+ serviceCmd
169
+ .command('start')
170
+ .description('Start the background daemon')
171
+ .action(async () => {
172
+ // Check if already running
173
+ const state = readServiceState();
174
+ if (state && isProcessAlive(state.pid)) {
175
+ console.log(`Daemon is already running (pid: ${state.pid})`);
176
+ return;
177
+ }
178
+ const { ensureDaemon } = await import('./service/ensureDaemon.js');
179
+ try {
180
+ const { hello } = await ensureDaemon();
181
+ console.log(`Daemon started (pid: ${hello.daemonPid})`);
182
+ }
183
+ catch (err) {
184
+ console.error('Failed to start daemon:', err.message);
185
+ process.exit(1);
186
+ }
187
+ });
188
+ serviceCmd
189
+ .command('stop')
190
+ .description('Stop the running daemon')
191
+ .action(async () => {
192
+ const state = readServiceState();
193
+ if (!state) {
194
+ console.log('No daemon is running.');
195
+ return;
196
+ }
197
+ if (!isProcessAlive(state.pid)) {
198
+ console.log('Daemon process is dead. Cleaning up stale files...');
199
+ const { cleanStaleRuntime } = await import('./service/singleton.js');
200
+ const { removeServiceState } = await import('./service/stateStore.js');
201
+ cleanStaleRuntime();
202
+ removeServiceState();
203
+ console.log('Done.');
204
+ return;
205
+ }
206
+ try {
207
+ const client = new IpcClientClass();
208
+ await client.connect(state.socketPath);
209
+ await client.request('shutdown');
210
+ client.close();
211
+ console.log('Daemon stopped.');
212
+ }
213
+ catch (err) {
214
+ console.error('Failed to stop daemon:', err.message);
215
+ process.exit(1);
216
+ }
217
+ });
218
+ serviceCmd
219
+ .command('status')
220
+ .description('Show daemon status')
221
+ .action(async () => {
222
+ const state = readServiceState();
223
+ if (!state) {
224
+ console.log('No daemon is running.');
225
+ return;
226
+ }
227
+ if (!isProcessAlive(state.pid)) {
228
+ console.log('Daemon process is dead (stale service.json).');
229
+ console.log(` Last PID: ${state.pid}`);
230
+ console.log(` Started: ${state.startedAt}`);
231
+ return;
232
+ }
233
+ try {
234
+ const client = new IpcClientClass();
235
+ await client.connect(state.socketPath);
236
+ const status = await client.request('status');
237
+ client.close();
238
+ console.log('Quicksave daemon is running');
239
+ console.log(` PID: ${status.pid}`);
240
+ console.log(` Version: ${status.version}`);
241
+ console.log(` Uptime: ${formatUptime(status.uptime)}`);
242
+ console.log(` Connection: ${status.connectionState}`);
243
+ console.log(` Peers: ${status.peerCount}`);
244
+ console.log(` Active sessions: ${status.activeSessions}`);
245
+ console.log(` Managed repos: ${status.managedRepos}`);
246
+ }
247
+ catch (err) {
248
+ console.error('Failed to query daemon:', err.message);
249
+ process.exit(1);
250
+ }
251
+ });
252
+ serviceCmd
253
+ .command('info')
254
+ .description('Show daemon info from service.json (no IPC required)')
255
+ .action(() => {
256
+ const state = readServiceState();
257
+ if (!state) {
258
+ console.log('No service state file found.');
259
+ return;
260
+ }
261
+ const alive = isProcessAlive(state.pid);
262
+ console.log(`PID: ${state.pid} (${alive ? 'alive' : 'dead'})`);
263
+ console.log(`Version: ${state.version}`);
264
+ console.log(`IPC: ${state.ipcVersion}`);
265
+ console.log(`Build ID: ${state.buildId}`);
266
+ console.log(`Started: ${state.startedAt}`);
267
+ console.log(`Heartbeat: ${state.lastHeartbeatAt}`);
268
+ console.log(`Socket: ${state.socketPath}`);
269
+ console.log(`Agent ID: ${state.agentId}`);
270
+ console.log(`Signaling: ${state.signalingServer}`);
271
+ console.log(`Connection: ${state.connectionState}`);
272
+ console.log(`Peers: ${state.peerCount}`);
273
+ });
274
+ function formatUptime(seconds) {
275
+ const h = Math.floor(seconds / 3600);
276
+ const m = Math.floor((seconds % 3600) / 60);
277
+ const s = seconds % 60;
278
+ if (h > 0)
279
+ return `${h}h ${m}m ${s}s`;
280
+ if (m > 0)
281
+ return `${m}m ${s}s`;
282
+ return `${s}s`;
283
+ }
150
284
  program.parse();
151
285
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ensureDaemon — connect to an existing daemon or auto-start one.
3
+ *
4
+ * Flow:
5
+ * 1. Read service.json for socket path. Quick pre-check: if PID is dead, skip to step 4.
6
+ * 2. Connect to socket, send hello (both liveness check and version exchange).
7
+ * 3. Inspect HelloResult for version compatibility. If compatible, attach.
8
+ * If restart needed, proceed to step 4.
9
+ * 4. If stale or version mismatch, remove stale runtime files and start a new daemon.
10
+ * 5. If lock acquisition fails, retry attach with backoff (up to 3 attempts, 500ms base delay).
11
+ */
12
+ import { IpcClient } from './ipcClient.js';
13
+ import type { HelloResult } from './types.js';
14
+ export interface EnsureDaemonResult {
15
+ client: IpcClient;
16
+ hello: HelloResult;
17
+ }
18
+ /**
19
+ * Ensure the daemon is running and return a connected IPC client.
20
+ * Auto-starts a new daemon if needed.
21
+ */
22
+ export declare function ensureDaemon(): Promise<EnsureDaemonResult>;
23
+ //# sourceMappingURL=ensureDaemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureDaemon.d.ts","sourceRoot":"","sources":["../../src/service/ensureDaemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAoDhE"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * ensureDaemon — connect to an existing daemon or auto-start one.
3
+ *
4
+ * Flow:
5
+ * 1. Read service.json for socket path. Quick pre-check: if PID is dead, skip to step 4.
6
+ * 2. Connect to socket, send hello (both liveness check and version exchange).
7
+ * 3. Inspect HelloResult for version compatibility. If compatible, attach.
8
+ * If restart needed, proceed to step 4.
9
+ * 4. If stale or version mismatch, remove stale runtime files and start a new daemon.
10
+ * 5. If lock acquisition fails, retry attach with backoff (up to 3 attempts, 500ms base delay).
11
+ */
12
+ import { fork } from 'child_process';
13
+ import { openSync } from 'fs';
14
+ import { join, resolve } from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import { IpcClient } from './ipcClient.js';
17
+ import { readServiceState } from './stateStore.js';
18
+ import { isProcessAlive, cleanStaleRuntime, getRunDir } from './singleton.js';
19
+ import { shouldRestartDaemon, IPC_VERSION, BUILD_ID } from './types.js';
20
+ const MAX_ATTACH_RETRIES = 3;
21
+ const BASE_RETRY_DELAY_MS = 500;
22
+ const DAEMON_READY_TIMEOUT_MS = 10_000;
23
+ const DAEMON_READY_POLL_MS = 200;
24
+ /**
25
+ * Ensure the daemon is running and return a connected IPC client.
26
+ * Auto-starts a new daemon if needed.
27
+ */
28
+ export async function ensureDaemon() {
29
+ for (let attempt = 0; attempt <= MAX_ATTACH_RETRIES; attempt++) {
30
+ // Step 1: Read service.json
31
+ const state = readServiceState();
32
+ if (state) {
33
+ // Quick pre-check: is the PID alive?
34
+ if (!isProcessAlive(state.pid)) {
35
+ cleanStaleRuntime();
36
+ return startAndConnect();
37
+ }
38
+ // Step 2: Try connecting
39
+ try {
40
+ const client = new IpcClient();
41
+ const hello = await client.connect(state.socketPath);
42
+ // Step 3: Check version compatibility
43
+ const check = shouldRestartDaemon(hello, { ipcVersion: IPC_VERSION, buildId: BUILD_ID });
44
+ if (check.action === 'ok') {
45
+ return { client, hello };
46
+ }
47
+ if (check.action === 'warn_outdated') {
48
+ console.warn('Warning: CLI is outdated. Please update quicksave.');
49
+ return { client, hello };
50
+ }
51
+ // action === 'restart'
52
+ client.close();
53
+ await requestShutdownAndWait(state.socketPath);
54
+ cleanStaleRuntime();
55
+ return startAndConnect();
56
+ }
57
+ catch {
58
+ // Connection failed — daemon might be stale or starting
59
+ if (attempt < MAX_ATTACH_RETRIES) {
60
+ await sleep(BASE_RETRY_DELAY_MS * (attempt + 1));
61
+ continue;
62
+ }
63
+ // Last attempt — clean up and start fresh
64
+ cleanStaleRuntime();
65
+ return startAndConnect();
66
+ }
67
+ }
68
+ else {
69
+ // No service.json — start a new daemon
70
+ return startAndConnect();
71
+ }
72
+ }
73
+ // Should not reach here, but just in case
74
+ throw new Error('Failed to connect to daemon after retries');
75
+ }
76
+ /**
77
+ * Spawn a new daemon process in detached mode and wait for it to be ready.
78
+ */
79
+ async function startAndConnect() {
80
+ spawnDaemon();
81
+ return waitForDaemon();
82
+ }
83
+ /**
84
+ * Spawn `quicksave service run` as a detached background process.
85
+ */
86
+ function spawnDaemon() {
87
+ const thisFile = fileURLToPath(import.meta.url);
88
+ const isTs = thisFile.endsWith('.ts');
89
+ const entryPath = resolve(thisFile, isTs ? '../../index.ts' : '../../index.js');
90
+ const logFd = openSync(join(getRunDir(), 'daemon.log'), 'a');
91
+ const child = fork(entryPath, ['service', 'run'], {
92
+ detached: true,
93
+ stdio: ['ignore', logFd, logFd, 'ipc'],
94
+ execArgv: isTs ? ['--import', 'tsx'] : [],
95
+ });
96
+ child.unref();
97
+ }
98
+ /**
99
+ * Poll until the daemon is ready (service.json exists and IPC responds).
100
+ */
101
+ async function waitForDaemon() {
102
+ const deadline = Date.now() + DAEMON_READY_TIMEOUT_MS;
103
+ while (Date.now() < deadline) {
104
+ const state = readServiceState();
105
+ if (state && isProcessAlive(state.pid)) {
106
+ try {
107
+ const client = new IpcClient();
108
+ const hello = await client.connect(state.socketPath);
109
+ return { client, hello };
110
+ }
111
+ catch {
112
+ // Not ready yet
113
+ }
114
+ }
115
+ await sleep(DAEMON_READY_POLL_MS);
116
+ }
117
+ throw new Error('Timed out waiting for daemon to start');
118
+ }
119
+ /**
120
+ * Send shutdown to the daemon and wait for the process to exit.
121
+ */
122
+ async function requestShutdownAndWait(socketPath) {
123
+ try {
124
+ const client = new IpcClient();
125
+ await client.connect(socketPath);
126
+ await client.request('shutdown');
127
+ client.close();
128
+ }
129
+ catch {
130
+ // If we can't connect, the daemon is already gone
131
+ }
132
+ // Wait briefly for the process to exit
133
+ await sleep(500);
134
+ }
135
+ function sleep(ms) {
136
+ return new Promise((resolve) => setTimeout(resolve, ms));
137
+ }
138
+ //# sourceMappingURL=ensureDaemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureDaemon.js","sourceRoot":"","sources":["../../src/service/ensureDaemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { runDaemon } from './run.js';
2
+ export { ensureDaemon } from './ensureDaemon.js';
3
+ export { IpcClient, IpcDisconnectedError, RpcError } from './ipcClient.js';
4
+ export { IpcServer } from './ipcServer.js';
5
+ export { readServiceState, writeServiceState, removeServiceState } from './stateStore.js';
6
+ export { acquireLock, cleanStaleRuntime, isProcessAlive, getSocketPath, getRunDir, getStateDir, getSessionsDir, getLogsDir, ensureDirectories, } from './singleton.js';
7
+ export * from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { runDaemon } from './run.js';
2
+ export { ensureDaemon } from './ensureDaemon.js';
3
+ export { IpcClient, IpcDisconnectedError, RpcError } from './ipcClient.js';
4
+ export { IpcServer } from './ipcServer.js';
5
+ export { readServiceState, writeServiceState, removeServiceState } from './stateStore.js';
6
+ export { acquireLock, cleanStaleRuntime, isProcessAlive, getSocketPath, getRunDir, getStateDir, getSessionsDir, getLogsDir, ensureDirectories, } from './singleton.js';
7
+ export * from './types.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ipc.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.test.d.ts","sourceRoot":"","sources":["../../src/service/ipc.test.ts"],"names":[],"mappings":""}