@sumicom/quicksave 0.3.1 → 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 (81) 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 +16 -17
  18. package/dist/connection/connection.d.ts.map +1 -1
  19. package/dist/connection/connection.js +72 -57
  20. package/dist/connection/connection.js.map +1 -1
  21. package/dist/connection/{signaling.d.ts → relay.d.ts} +3 -5
  22. package/dist/connection/relay.d.ts.map +1 -0
  23. package/dist/connection/{signaling.js → relay.js} +18 -19
  24. package/dist/connection/relay.js.map +1 -0
  25. package/dist/git/operations.d.ts +27 -1
  26. package/dist/git/operations.d.ts.map +1 -1
  27. package/dist/git/operations.js +113 -4
  28. package/dist/git/operations.js.map +1 -1
  29. package/dist/git/operations.test.js +69 -1
  30. package/dist/git/operations.test.js.map +1 -1
  31. package/dist/handlers/messageHandler.d.ts +31 -4
  32. package/dist/handlers/messageHandler.d.ts.map +1 -1
  33. package/dist/handlers/messageHandler.js +491 -62
  34. package/dist/handlers/messageHandler.js.map +1 -1
  35. package/dist/handlers/messageHandler.test.js +130 -2
  36. package/dist/handlers/messageHandler.test.js.map +1 -1
  37. package/dist/index.js +229 -89
  38. package/dist/index.js.map +1 -1
  39. package/dist/service/ensureDaemon.d.ts +23 -0
  40. package/dist/service/ensureDaemon.d.ts.map +1 -0
  41. package/dist/service/ensureDaemon.js +138 -0
  42. package/dist/service/ensureDaemon.js.map +1 -0
  43. package/dist/service/index.d.ts +8 -0
  44. package/dist/service/index.d.ts.map +1 -0
  45. package/dist/service/index.js +8 -0
  46. package/dist/service/index.js.map +1 -0
  47. package/dist/service/ipc.test.d.ts +2 -0
  48. package/dist/service/ipc.test.d.ts.map +1 -0
  49. package/dist/service/ipc.test.js +140 -0
  50. package/dist/service/ipc.test.js.map +1 -0
  51. package/dist/service/ipcClient.d.ts +36 -0
  52. package/dist/service/ipcClient.d.ts.map +1 -0
  53. package/dist/service/ipcClient.js +167 -0
  54. package/dist/service/ipcClient.js.map +1 -0
  55. package/dist/service/ipcServer.d.ts +53 -0
  56. package/dist/service/ipcServer.d.ts.map +1 -0
  57. package/dist/service/ipcServer.js +245 -0
  58. package/dist/service/ipcServer.js.map +1 -0
  59. package/dist/service/run.d.ts +13 -0
  60. package/dist/service/run.d.ts.map +1 -0
  61. package/dist/service/run.js +292 -0
  62. package/dist/service/run.js.map +1 -0
  63. package/dist/service/singleton.d.ts +31 -0
  64. package/dist/service/singleton.d.ts.map +1 -0
  65. package/dist/service/singleton.js +96 -0
  66. package/dist/service/singleton.js.map +1 -0
  67. package/dist/service/singleton.test.d.ts +2 -0
  68. package/dist/service/singleton.test.d.ts.map +1 -0
  69. package/dist/service/singleton.test.js +39 -0
  70. package/dist/service/singleton.test.js.map +1 -0
  71. package/dist/service/stateStore.d.ts +11 -0
  72. package/dist/service/stateStore.d.ts.map +1 -0
  73. package/dist/service/stateStore.js +35 -0
  74. package/dist/service/stateStore.js.map +1 -0
  75. package/dist/service/types.d.ts +111 -0
  76. package/dist/service/types.d.ts.map +1 -0
  77. package/dist/service/types.js +76 -0
  78. package/dist/service/types.js.map +1 -0
  79. package/package.json +3 -2
  80. package/dist/connection/signaling.d.ts.map +0 -1
  81. package/dist/connection/signaling.js.map +0 -1
package/dist/index.js CHANGED
@@ -2,126 +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';
6
- import { WebRTCConnection } from './connection/connection.js';
7
- import { MessageHandler } from './handlers/messageHandler.js';
5
+ import { resolve } from 'path';
6
+ import { hostname } from 'os';
7
+ import { getConfigPath, rotateKeyPair, addManagedRepo, addManagedCodingPath } from './config.js';
8
8
  import { GitOperations } from './git/operations.js';
9
- import { getOrCreateConfig, getConfigPath, rotateKeyPair } from './config.js';
10
- 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';
11
13
  const program = new Command();
12
- function collectRepos(value, previous) {
14
+ function collectValues(value, previous) {
13
15
  return previous.concat([value]);
14
16
  }
15
17
  program
16
18
  .name('quicksave-agent')
17
19
  .description('Quicksave desktop agent for remote git control')
18
- .version('0.1.0')
19
- .option('-r, --repo <path>', 'Path to git repository (can specify multiple)', collectRepos, [])
20
- .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')
21
25
  .option('--no-qr', 'Disable QR code display')
22
26
  .action(async (options) => {
23
- // Default to current directory if no repos specified
24
- const repoPaths = options.repo.length > 0 ? options.repo : ['.'];
25
- const resolvedPaths = repoPaths.map((p) => resolve(p));
26
- const signalingServer = options.signaling;
27
- console.log('Quicksave Agent v0.1.0');
28
- console.log('='.repeat(50));
29
- // Verify all git repositories
30
- const validRepos = [];
31
- for (const repoPath of resolvedPaths) {
32
- const git = new GitOperations(repoPath);
33
- const isValid = await git.isValidRepo();
34
- if (!isValid) {
35
- console.error(`Warning: ${repoPath} is not a valid git repository, skipping`);
36
- continue;
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));
31
+ }
32
+ const codingPaths = options.codingPath || [];
33
+ for (const p of codingPaths) {
34
+ addManagedCodingPath(resolve(p));
35
+ }
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);
37
44
  }
38
- const { current: currentBranch } = await git.getBranches();
39
- validRepos.push({
40
- path: repoPath,
41
- name: basename(repoPath),
42
- currentBranch,
43
- });
44
- }
45
- if (validRepos.length === 0) {
46
- console.error('Error: No valid git repositories found');
45
+ }
46
+ // Ensure daemon is running
47
+ const { ensureDaemon } = await import('./service/ensureDaemon.js');
48
+ let client;
49
+ try {
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));
54
+ }
55
+ catch (err) {
56
+ console.error('Failed to connect to daemon:', err.message);
47
57
  process.exit(1);
48
58
  }
49
- console.log(`Repositories (${validRepos.length}):`);
50
- for (const repo of validRepos) {
51
- console.log(` - ${repo.name} (${repo.path}) [${repo.currentBranch}]`);
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 */ }
52
65
  }
53
- // Load or create config
54
- const config = getOrCreateConfig(signalingServer);
55
- console.log(`Config: ${getConfigPath()}`);
56
- console.log(`Signaling: ${signalingServer}`);
57
- console.log('');
58
- // Create connection
59
- const connection = new WebRTCConnection({
60
- signalingServer,
61
- agentId: config.agentId,
62
- keyPair: config.keyPair,
63
- });
64
- // Create message handler with all valid repos
65
- const messageHandler = new MessageHandler(validRepos, config.license);
66
- // Handle incoming messages
67
- connection.on('message', async (message) => {
68
- const response = await messageHandler.handleMessage(message);
69
- connection.send(response);
70
- });
71
- connection.on('connected', () => {
72
- console.log('\n✓ PWA connected! Ready for git operations.');
73
- });
74
- connection.on('disconnected', () => {
75
- console.log('\n✗ PWA disconnected. Waiting for reconnection...');
76
- displayConnectionInfo(config.agentId, config.keyPair.publicKey, options.qr);
77
- });
78
- connection.on('error', (error) => {
79
- console.error('Connection error:', error.message);
80
- });
81
- // Start connection
66
+ // Get pairing info and display
82
67
  try {
83
- await connection.start();
84
- displayConnectionInfo(config.agentId, config.keyPair.publicKey, options.qr);
68
+ const info = await client.request('get-pairing-info');
69
+ console.log(`Config: ${getConfigPath()}`);
70
+ console.log('');
71
+ displayPairingInfo(info, options.qr);
85
72
  }
86
- catch (error) {
87
- console.error('Failed to start agent:', error);
88
- process.exit(1);
73
+ catch (err) {
74
+ console.error('Failed to get pairing info:', err.message);
89
75
  }
90
- // Handle shutdown
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)
91
105
  process.on('SIGINT', () => {
92
- console.log('\nShutting down...');
93
- connection.disconnect();
106
+ console.log('\nDetaching (daemon still running)...');
107
+ client.close();
94
108
  process.exit(0);
95
109
  });
96
110
  process.on('SIGTERM', () => {
97
- connection.disconnect();
111
+ client.close();
98
112
  process.exit(0);
99
113
  });
100
114
  });
101
- function displayConnectionInfo(agentId, publicKey, showQr) {
102
- console.log('');
103
- console.log('='.repeat(50));
104
- console.log('Connection Info');
105
- console.log('='.repeat(50));
106
- console.log('');
115
+ function displayPairingInfo(info, showQr) {
107
116
  console.log('Agent ID:');
108
- console.log(` ${agentId}`);
109
- console.log('');
110
- console.log('Public Key:');
111
- console.log(` ${publicKey}`);
117
+ console.log(` ${info.agentId}`);
112
118
  console.log('');
113
- // Create connection URL for PWA
114
- const connectionUrl = `https://quicksave.dev/connect?id=${agentId}&pk=${encodeURIComponent(publicKey)}`;
115
119
  console.log('Connection URL:');
116
- console.log(` ${connectionUrl}`);
120
+ console.log(` ${info.pairingUrl}`);
117
121
  console.log('');
118
122
  if (showQr) {
119
123
  console.log('Scan QR code to connect:');
120
124
  console.log('');
121
- qrcode.generate(connectionUrl, { small: true });
125
+ qrcode.generate(info.pairingUrl, { small: true });
122
126
  }
123
127
  console.log('');
124
- 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
+ }
125
134
  }
126
135
  program
127
136
  .command('rotate-keys')
@@ -134,12 +143,143 @@ program
134
143
  console.log(` Public Key: ${config.keyPair.publicKey} (NEW)\n`);
135
144
  console.log('All existing PWA connections are now invalid.');
136
145
  console.log('Re-scan the QR code on your trusted devices to reconnect.\n');
137
- 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 });
138
150
  }
139
151
  catch (err) {
140
152
  console.error('Failed to rotate keys:', err.message);
141
153
  process.exit(1);
142
154
  }
143
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
+ }
144
284
  program.parse();
145
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":""}