@sumicom/quicksave 0.5.0 → 0.5.1
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/connection/relay.d.ts +2 -1
- package/dist/connection/relay.d.ts.map +1 -1
- package/dist/connection/relay.js +7 -7
- package/dist/connection/relay.js.map +1 -1
- package/dist/handlers/messageHandler.js +1 -1
- package/dist/handlers/messageHandler.test.js +1 -1
- package/dist/index.js +2 -2
- package/dist/service/ensureDaemon.js +7 -2
- package/dist/service/ensureDaemon.js.map +1 -1
- package/dist/service/ipc.test.js +6 -6
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/run.js +1 -1
- package/dist/service/singleton.test.js +1 -1
- package/package.json +2 -2
|
@@ -12,8 +12,8 @@ export declare class SignalingClient extends EventEmitter {
|
|
|
12
12
|
private url;
|
|
13
13
|
private agentId;
|
|
14
14
|
private reconnectAttempts;
|
|
15
|
-
private maxReconnectAttempts;
|
|
16
15
|
private reconnectDelay;
|
|
16
|
+
private maxReconnectDelay;
|
|
17
17
|
private isConnected;
|
|
18
18
|
constructor(signalingServer: string, agentId: string);
|
|
19
19
|
connect(): Promise<void>;
|
|
@@ -24,6 +24,7 @@ export declare class SignalingClient extends EventEmitter {
|
|
|
24
24
|
private decompress;
|
|
25
25
|
private send;
|
|
26
26
|
private attemptReconnect;
|
|
27
|
+
private intentionalDisconnect;
|
|
27
28
|
disconnect(): void;
|
|
28
29
|
getAgentId(): string;
|
|
29
30
|
getConnectionUrl(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/connection/relay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/connection/relay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAAS;gBAEhB,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMpD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0DxB,OAAO,CAAC,aAAa;IA0BrB,OAAO,IAAI,IAAI;IAIf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;YAkB5C,QAAQ;YAKR,UAAU;IAMxB,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,qBAAqB,CAAS;IAEtC,UAAU,IAAI,IAAI;IASlB,UAAU,IAAI,MAAM;IAIpB,gBAAgB,IAAI,MAAM;CAG3B"}
|
package/dist/connection/relay.js
CHANGED
|
@@ -9,8 +9,8 @@ export class SignalingClient extends EventEmitter {
|
|
|
9
9
|
url;
|
|
10
10
|
agentId;
|
|
11
11
|
reconnectAttempts = 0;
|
|
12
|
-
maxReconnectAttempts = 5;
|
|
13
12
|
reconnectDelay = 1000;
|
|
13
|
+
maxReconnectDelay = 90000;
|
|
14
14
|
isConnected = false;
|
|
15
15
|
constructor(signalingServer, agentId) {
|
|
16
16
|
super();
|
|
@@ -138,21 +138,21 @@ export class SignalingClient extends EventEmitter {
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
attemptReconnect() {
|
|
141
|
-
if (this.
|
|
142
|
-
console.error('Max reconnect attempts reached');
|
|
141
|
+
if (this.intentionalDisconnect)
|
|
143
142
|
return;
|
|
144
|
-
}
|
|
145
143
|
this.reconnectAttempts++;
|
|
146
|
-
const
|
|
147
|
-
|
|
144
|
+
const jitter = Math.floor(Math.random() * 5000);
|
|
145
|
+
const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1) + jitter, this.maxReconnectDelay);
|
|
146
|
+
console.log(`Reconnecting in ${delay / 1000}s (attempt ${this.reconnectAttempts})`);
|
|
148
147
|
setTimeout(() => {
|
|
149
148
|
this.connect().catch((error) => {
|
|
150
149
|
console.error('Reconnect failed:', error);
|
|
151
150
|
});
|
|
152
151
|
}, delay);
|
|
153
152
|
}
|
|
153
|
+
intentionalDisconnect = false;
|
|
154
154
|
disconnect() {
|
|
155
|
-
this.
|
|
155
|
+
this.intentionalDisconnect = true; // Prevent reconnection
|
|
156
156
|
if (this.ws) {
|
|
157
157
|
this.sendBye();
|
|
158
158
|
this.ws.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/connection/relay.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAClC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAWtC,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACvC,EAAE,GAAqB,IAAI,CAAC;IAC5B,GAAG,CAAS;IACZ,OAAO,CAAS;IAChB,iBAAiB,GAAG,CAAC,CAAC;IACtB,
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/connection/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { join, dirname, basename } from 'path';
|
|
|
8
8
|
import { homedir } from 'os';
|
|
9
9
|
export class MessageHandler {
|
|
10
10
|
repos;
|
|
11
|
-
agentVersion = '0.5.
|
|
11
|
+
agentVersion = '0.5.1';
|
|
12
12
|
defaultRepoPath;
|
|
13
13
|
clientRepos = new Map(); // peerAddress -> repoPath
|
|
14
14
|
repoLocks = new Map(); // repoPath -> peerAddress holding lock
|
|
@@ -50,7 +50,7 @@ describe('MessageHandler', () => {
|
|
|
50
50
|
expect(response.type).toBe('handshake:ack');
|
|
51
51
|
expect(response.id).toBe(message.id);
|
|
52
52
|
expect(response.payload.success).toBe(true);
|
|
53
|
-
expect(response.payload.agentVersion).toBe('0.5.
|
|
53
|
+
expect(response.payload.agentVersion).toBe('0.5.1');
|
|
54
54
|
expect(response.payload.repoPath).toBe(testRepoPath);
|
|
55
55
|
});
|
|
56
56
|
});
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ function collectValues(value, previous) {
|
|
|
17
17
|
program
|
|
18
18
|
.name('quicksave-agent')
|
|
19
19
|
.description('Quicksave desktop agent for remote git control')
|
|
20
|
-
.version('0.5.
|
|
20
|
+
.version('0.5.1')
|
|
21
21
|
.allowExcessArguments(false)
|
|
22
22
|
.option('-r, --repo <path>', 'Path to git repository (can specify multiple)', collectValues, [])
|
|
23
23
|
.option('-c, --coding-path <path>', 'Path for Claude Code sessions (can specify multiple, non-git dirs OK)', collectValues, [])
|
|
@@ -49,7 +49,7 @@ program
|
|
|
49
49
|
try {
|
|
50
50
|
const result = await ensureDaemon();
|
|
51
51
|
client = result.client;
|
|
52
|
-
console.log(`Quicksave Agent v0.5.
|
|
52
|
+
console.log(`Quicksave Agent v0.5.1 (daemon pid: ${result.hello.daemonPid})`);
|
|
53
53
|
console.log('='.repeat(50));
|
|
54
54
|
}
|
|
55
55
|
catch (err) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* 5. If lock acquisition fails, retry attach with backoff (up to 3 attempts, 500ms base delay).
|
|
11
11
|
*/
|
|
12
12
|
import { fork } from 'child_process';
|
|
13
|
-
import { openSync } from 'fs';
|
|
13
|
+
import { openSync, mkdirSync } from 'fs';
|
|
14
14
|
import { join, resolve } from 'path';
|
|
15
15
|
import { fileURLToPath } from 'url';
|
|
16
16
|
import { IpcClient } from './ipcClient.js';
|
|
@@ -87,12 +87,17 @@ function spawnDaemon() {
|
|
|
87
87
|
const thisFile = fileURLToPath(import.meta.url);
|
|
88
88
|
const isTs = thisFile.endsWith('.ts');
|
|
89
89
|
const entryPath = resolve(thisFile, isTs ? '../../index.ts' : '../../index.js');
|
|
90
|
-
|
|
90
|
+
// Ensure run directory exists before opening log file (daemon hasn't started yet)
|
|
91
|
+
const runDir = getRunDir();
|
|
92
|
+
mkdirSync(runDir, { recursive: true });
|
|
93
|
+
const logFd = openSync(join(runDir, 'daemon.log'), 'a');
|
|
91
94
|
const child = fork(entryPath, ['service', 'run'], {
|
|
92
95
|
detached: true,
|
|
93
96
|
stdio: ['ignore', logFd, logFd, 'ipc'],
|
|
94
97
|
execArgv: isTs ? ['--import', 'tsx'] : [],
|
|
95
98
|
});
|
|
99
|
+
// Disconnect IPC so parent can exit immediately
|
|
100
|
+
child.disconnect();
|
|
96
101
|
child.unref();
|
|
97
102
|
}
|
|
98
103
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureDaemon.js","sourceRoot":"","sources":["../../src/service/ensureDaemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ensureDaemon.js","sourceRoot":"","sources":["../../src/service/ensureDaemon.ts"],"names":[],"mappings":"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"}
|
package/dist/service/ipc.test.js
CHANGED
|
@@ -30,7 +30,7 @@ describe('IPC Server + Client', () => {
|
|
|
30
30
|
}
|
|
31
31
|
async function createServer() {
|
|
32
32
|
const sock = socketPath();
|
|
33
|
-
server = new IpcServer({ version: '0.5.
|
|
33
|
+
server = new IpcServer({ version: '0.5.1' });
|
|
34
34
|
await server.listen(sock);
|
|
35
35
|
return sock;
|
|
36
36
|
}
|
|
@@ -43,7 +43,7 @@ describe('IPC Server + Client', () => {
|
|
|
43
43
|
it('hello handshake returns daemon version info', async () => {
|
|
44
44
|
const sock = await createServer();
|
|
45
45
|
const { hello } = await createClient(sock);
|
|
46
|
-
expect(hello.daemonVersion).toBe('0.5.
|
|
46
|
+
expect(hello.daemonVersion).toBe('0.5.1');
|
|
47
47
|
expect(hello.daemonIpcVersion).toBe(1);
|
|
48
48
|
expect(hello.daemonPid).toBe(process.pid);
|
|
49
49
|
expect(typeof hello.daemonBuildId).toBe('string');
|
|
@@ -52,7 +52,7 @@ describe('IPC Server + Client', () => {
|
|
|
52
52
|
const sock = await createServer();
|
|
53
53
|
const { client } = await createClient(sock);
|
|
54
54
|
const result = await client.request('ping');
|
|
55
|
-
expect(result.version).toBe('0.5.
|
|
55
|
+
expect(result.version).toBe('0.5.1');
|
|
56
56
|
expect(result.ipcVersion).toBe(1);
|
|
57
57
|
expect(typeof result.uptime).toBe('number');
|
|
58
58
|
expect(result.uptime).toBeGreaterThanOrEqual(0);
|
|
@@ -62,7 +62,7 @@ describe('IPC Server + Client', () => {
|
|
|
62
62
|
const { client } = await createClient(sock);
|
|
63
63
|
const result = await client.request('status');
|
|
64
64
|
expect(result.pid).toBe(process.pid);
|
|
65
|
-
expect(result.version).toBe('0.5.
|
|
65
|
+
expect(result.version).toBe('0.5.1');
|
|
66
66
|
expect(typeof result.uptime).toBe('number');
|
|
67
67
|
expect(result.connectionState).toBe('disconnected');
|
|
68
68
|
expect(result.peerCount).toBe(0);
|
|
@@ -85,8 +85,8 @@ describe('IPC Server + Client', () => {
|
|
|
85
85
|
const { client: c2 } = await createClient(sock);
|
|
86
86
|
const r1 = await c1.request('ping');
|
|
87
87
|
const r2 = await c2.request('ping');
|
|
88
|
-
expect(r1.version).toBe('0.5.
|
|
89
|
-
expect(r2.version).toBe('0.5.
|
|
88
|
+
expect(r1.version).toBe('0.5.1');
|
|
89
|
+
expect(r2.version).toBe('0.5.1');
|
|
90
90
|
expect(server.getClientCount()).toBe(2);
|
|
91
91
|
});
|
|
92
92
|
it('subscribe-events enables notifications', async () => {
|
package/dist/service/run.js
CHANGED
|
@@ -21,7 +21,7 @@ import { writeServiceState, removeServiceState } from './stateStore.js';
|
|
|
21
21
|
import { IPC_VERSION, BUILD_ID } from './types.js';
|
|
22
22
|
import { createMessage } from '@sumicom/quicksave-shared';
|
|
23
23
|
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
24
|
-
const PACKAGE_VERSION = '0.5.
|
|
24
|
+
const PACKAGE_VERSION = '0.5.1';
|
|
25
25
|
export async function runDaemon() {
|
|
26
26
|
ensureDirectories();
|
|
27
27
|
// Prevent unhandled rejections from silently killing the daemon
|
|
@@ -12,7 +12,7 @@ describe('isProcessAlive', () => {
|
|
|
12
12
|
});
|
|
13
13
|
describe('shouldRestartDaemon', () => {
|
|
14
14
|
const makeDaemon = (overrides = {}) => ({
|
|
15
|
-
daemonVersion: '0.5.
|
|
15
|
+
daemonVersion: '0.5.1',
|
|
16
16
|
daemonIpcVersion: IPC_VERSION,
|
|
17
17
|
daemonBuildId: BUILD_ID,
|
|
18
18
|
daemonPid: 12345,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sumicom/quicksave",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Quicksave agent - remote git control CLI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"qrcode-terminal": "^0.12.0",
|
|
37
37
|
"simple-git": "^3.22.0",
|
|
38
38
|
"ws": "^8.16.0",
|
|
39
|
-
"@sumicom/quicksave-shared": "0.5.
|
|
39
|
+
"@sumicom/quicksave-shared": "0.5.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/node": "^20.11.0",
|