@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.
- package/dist/ai/claudeCodeService.d.ts +89 -0
- package/dist/ai/claudeCodeService.d.ts.map +1 -0
- package/dist/ai/claudeCodeService.js +602 -0
- package/dist/ai/claudeCodeService.js.map +1 -0
- package/dist/ai/sessionStore.d.ts +31 -0
- package/dist/ai/sessionStore.d.ts.map +1 -0
- package/dist/ai/sessionStore.js +72 -0
- package/dist/ai/sessionStore.js.map +1 -0
- package/dist/ai/sessionStore.test.d.ts +2 -0
- package/dist/ai/sessionStore.test.d.ts.map +1 -0
- package/dist/ai/sessionStore.test.js +99 -0
- package/dist/ai/sessionStore.test.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -1
- package/dist/connection/connection.d.ts +2 -0
- package/dist/connection/connection.d.ts.map +1 -1
- package/dist/connection/connection.js +14 -5
- package/dist/connection/connection.js.map +1 -1
- package/dist/connection/relay.d.ts.map +1 -1
- package/dist/connection/relay.js +2 -0
- package/dist/connection/relay.js.map +1 -1
- package/dist/git/operations.d.ts +8 -1
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +71 -4
- package/dist/git/operations.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +18 -1
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +231 -11
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/handlers/messageHandler.test.js +1 -1
- package/dist/index.js +228 -94
- package/dist/index.js.map +1 -1
- package/dist/service/ensureDaemon.d.ts +23 -0
- package/dist/service/ensureDaemon.d.ts.map +1 -0
- package/dist/service/ensureDaemon.js +138 -0
- package/dist/service/ensureDaemon.js.map +1 -0
- package/dist/service/index.d.ts +8 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +8 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/ipc.test.d.ts +2 -0
- package/dist/service/ipc.test.d.ts.map +1 -0
- package/dist/service/ipc.test.js +140 -0
- package/dist/service/ipc.test.js.map +1 -0
- package/dist/service/ipcClient.d.ts +36 -0
- package/dist/service/ipcClient.d.ts.map +1 -0
- package/dist/service/ipcClient.js +167 -0
- package/dist/service/ipcClient.js.map +1 -0
- package/dist/service/ipcServer.d.ts +53 -0
- package/dist/service/ipcServer.d.ts.map +1 -0
- package/dist/service/ipcServer.js +245 -0
- package/dist/service/ipcServer.js.map +1 -0
- package/dist/service/run.d.ts +13 -0
- package/dist/service/run.d.ts.map +1 -0
- package/dist/service/run.js +292 -0
- package/dist/service/run.js.map +1 -0
- package/dist/service/singleton.d.ts +31 -0
- package/dist/service/singleton.d.ts.map +1 -0
- package/dist/service/singleton.js +96 -0
- package/dist/service/singleton.js.map +1 -0
- package/dist/service/singleton.test.d.ts +2 -0
- package/dist/service/singleton.test.d.ts.map +1 -0
- package/dist/service/singleton.test.js +39 -0
- package/dist/service/singleton.test.js.map +1 -0
- package/dist/service/stateStore.d.ts +11 -0
- package/dist/service/stateStore.d.ts.map +1 -0
- package/dist/service/stateStore.js +35 -0
- package/dist/service/stateStore.js.map +1 -0
- package/dist/service/types.d.ts +111 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +76 -0
- package/dist/service/types.js.map +1 -0
- 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
|
|
5
|
+
import { resolve } from 'path';
|
|
6
6
|
import { hostname } from 'os';
|
|
7
|
-
import {
|
|
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 {
|
|
11
|
-
|
|
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
|
|
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.
|
|
20
|
-
.
|
|
21
|
-
.option('-
|
|
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
|
-
//
|
|
25
|
-
const repoPaths = options.repo
|
|
26
|
-
const
|
|
27
|
-
|
|
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
|
-
|
|
51
|
-
for (const
|
|
52
|
-
|
|
32
|
+
const codingPaths = options.codingPath || [];
|
|
33
|
+
for (const p of codingPaths) {
|
|
34
|
+
addManagedCodingPath(resolve(p));
|
|
53
35
|
}
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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
|
|
90
|
-
|
|
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 (
|
|
93
|
-
console.error('Failed to
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error('Failed to connect to daemon:', err.message);
|
|
94
57
|
process.exit(1);
|
|
95
58
|
}
|
|
96
|
-
//
|
|
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('\
|
|
99
|
-
|
|
106
|
+
console.log('\nDetaching (daemon still running)...');
|
|
107
|
+
client.close();
|
|
100
108
|
process.exit(0);
|
|
101
109
|
});
|
|
102
110
|
process.on('SIGTERM', () => {
|
|
103
|
-
|
|
111
|
+
client.close();
|
|
104
112
|
process.exit(0);
|
|
105
113
|
});
|
|
106
114
|
});
|
|
107
|
-
function
|
|
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(` ${
|
|
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(
|
|
125
|
+
qrcode.generate(info.pairingUrl, { small: true });
|
|
128
126
|
}
|
|
129
127
|
console.log('');
|
|
130
|
-
|
|
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
|
-
|
|
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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,4CAA4C;AAC5C,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,SAAS,aAAa,CAAC,KAAa,EAAE,QAAkB;IACtD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC;KAChB,oBAAoB,CAAC,KAAK,CAAC;KAC3B,MAAM,CAAC,mBAAmB,EAAE,+CAA+C,EAAE,aAAa,EAAE,EAAE,CAAC;KAC/F,MAAM,CAAC,0BAA0B,EAAE,uEAAuE,EAAE,aAAa,EAAE,EAAE,CAAC;KAC9H,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;KACvD,MAAM,CAAC,SAAS,EAAE,yBAAyB,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,wDAAwD;IACxD,MAAM,SAAS,GAAa,OAAO,CAAC,IAAI,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,WAAW,GAAa,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,uCAAuC;IACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YACpC,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACnE,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,uCAAuC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC,CAAC,yDAAyD,CAAC,CAAC;IACvE,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAoB,kBAAkB,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,MAAM,KAAK,qBAAqB,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,MAA+C,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxG,CAAC;aAAM,IAAI,MAAM,KAAK,wBAAwB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,MAA+C,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3G,CAAC;aAAM,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,MAAkD,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,MAA0B,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;YAC3C,6CAA6C;YAC7C,IAAK,MAAc,CAAC,aAAa,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,SAAS,kBAAkB,CAAC,IAAuB,EAAE,MAAe;IAClE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CAAC,GAAG,EAAE;IACX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,SAAS,UAAU,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,oCAAoC,MAAM,CAAC,OAAO,OAAO,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,kBAAkB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClK,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,UAAU,GAAG,OAAO;KACvB,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,yCAAyC,CAAC,CAAC;AAE1D,UAAU;KACP,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,2BAA2B;IAC3B,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACrE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACvE,iBAAiB,EAAE,CAAC;QACpB,kBAAkB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAe,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAChC,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.test.d.ts","sourceRoot":"","sources":["../../src/service/ipc.test.ts"],"names":[],"mappings":""}
|