@agent-link/agent 0.1.36 → 0.1.37
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/auto-update.d.ts +13 -0
- package/dist/auto-update.js +116 -0
- package/dist/auto-update.js.map +1 -0
- package/dist/daemon.js +1 -1
- package/dist/daemon.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update: periodically checks npm for a newer version of @agent-link/agent.
|
|
3
|
+
* When an update is found, waits for idle (no active Claude turn), installs the
|
|
4
|
+
* new version via npm, and restarts the daemon. The session URL is preserved
|
|
5
|
+
* through the existing agent.json sessionId restore mechanism.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Start the auto-update check loop.
|
|
9
|
+
* @param daemon - true if running in daemon mode (will auto-install + restart);
|
|
10
|
+
* false for foreground mode (prints notification only).
|
|
11
|
+
*/
|
|
12
|
+
export declare function startAutoUpdate(daemon: boolean): void;
|
|
13
|
+
export declare function stopAutoUpdate(): void;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update: periodically checks npm for a newer version of @agent-link/agent.
|
|
3
|
+
* When an update is found, waits for idle (no active Claude turn), installs the
|
|
4
|
+
* new version via npm, and restarts the daemon. The session URL is preserved
|
|
5
|
+
* through the existing agent.json sessionId restore mechanism.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import { createRequire } from 'module';
|
|
9
|
+
import { getConversation } from './claude.js';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const pkg = require('../package.json');
|
|
12
|
+
const CHECK_DELAY = 30_000; // first check 30s after startup
|
|
13
|
+
const CHECK_INTERVAL = 4 * 3600_000; // then every 4 hours
|
|
14
|
+
const IDLE_POLL_INTERVAL = 5_000; // poll turn status every 5s
|
|
15
|
+
const IDLE_TIMEOUT = 10 * 60_000; // give up waiting after 10 min
|
|
16
|
+
let timer = null;
|
|
17
|
+
function getLatestVersion() {
|
|
18
|
+
try {
|
|
19
|
+
return execSync('npm view @agent-link/agent version', {
|
|
20
|
+
encoding: 'utf-8',
|
|
21
|
+
timeout: 30_000,
|
|
22
|
+
windowsHide: true,
|
|
23
|
+
}).trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function isTurnActive() {
|
|
30
|
+
const conv = getConversation();
|
|
31
|
+
return conv?.turnActive === true;
|
|
32
|
+
}
|
|
33
|
+
async function waitForIdle() {
|
|
34
|
+
if (!isTurnActive())
|
|
35
|
+
return true;
|
|
36
|
+
console.log('[AutoUpdate] Waiting for current turn to finish...');
|
|
37
|
+
const deadline = Date.now() + IDLE_TIMEOUT;
|
|
38
|
+
while (Date.now() < deadline) {
|
|
39
|
+
await new Promise(r => setTimeout(r, IDLE_POLL_INTERVAL));
|
|
40
|
+
if (!isTurnActive())
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
async function checkAndUpdate(daemon) {
|
|
46
|
+
const currentVersion = pkg.version;
|
|
47
|
+
const latestVersion = getLatestVersion();
|
|
48
|
+
if (!latestVersion || latestVersion === currentVersion)
|
|
49
|
+
return;
|
|
50
|
+
console.log(`[AutoUpdate] New version available: ${currentVersion} → ${latestVersion}`);
|
|
51
|
+
if (!daemon) {
|
|
52
|
+
// Foreground mode: just notify, don't auto-update
|
|
53
|
+
console.log('[AutoUpdate] Run "agentlink-client upgrade" to update.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Wait for idle
|
|
57
|
+
const idle = await waitForIdle();
|
|
58
|
+
if (!idle) {
|
|
59
|
+
console.log('[AutoUpdate] Turn still active after timeout, skipping this update cycle.');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Install new version
|
|
63
|
+
console.log(`[AutoUpdate] Installing @agent-link/agent@${latestVersion}...`);
|
|
64
|
+
try {
|
|
65
|
+
execSync('npm install -g @agent-link/agent@latest', {
|
|
66
|
+
stdio: 'ignore',
|
|
67
|
+
timeout: 120_000,
|
|
68
|
+
windowsHide: true,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error(`[AutoUpdate] Install failed: ${err.message}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log(`[AutoUpdate] Updated to v${latestVersion}. Restarting daemon...`);
|
|
76
|
+
// Don't clear agent.json — the new process will restore sessionId from it.
|
|
77
|
+
// Restart via agentlink-client start --daemon (new binary from the updated package)
|
|
78
|
+
try {
|
|
79
|
+
execSync('agentlink-client start --daemon', {
|
|
80
|
+
stdio: 'ignore',
|
|
81
|
+
timeout: 15_000,
|
|
82
|
+
windowsHide: true,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
console.error('[AutoUpdate] Failed to restart daemon. Manual restart needed: agentlink-client start --daemon');
|
|
87
|
+
}
|
|
88
|
+
// Exit current process — new daemon is already running
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Start the auto-update check loop.
|
|
93
|
+
* @param daemon - true if running in daemon mode (will auto-install + restart);
|
|
94
|
+
* false for foreground mode (prints notification only).
|
|
95
|
+
*/
|
|
96
|
+
export function startAutoUpdate(daemon) {
|
|
97
|
+
// First check after a delay so startup isn't slowed
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
checkAndUpdate(daemon).catch(() => { });
|
|
100
|
+
// Subsequent checks on interval
|
|
101
|
+
timer = setInterval(() => {
|
|
102
|
+
checkAndUpdate(daemon).catch(() => { });
|
|
103
|
+
}, CHECK_INTERVAL);
|
|
104
|
+
// Don't keep process alive just for the timer
|
|
105
|
+
if (timer && typeof timer === 'object' && 'unref' in timer) {
|
|
106
|
+
timer.unref();
|
|
107
|
+
}
|
|
108
|
+
}, CHECK_DELAY);
|
|
109
|
+
}
|
|
110
|
+
export function stopAutoUpdate() {
|
|
111
|
+
if (timer) {
|
|
112
|
+
clearInterval(timer);
|
|
113
|
+
timer = null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.js
CHANGED
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,IAAI,CAAC,SAAS,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,MAAmB,CAAC;AACxB,IAAI,CAAC;IACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;AAChD,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,IAAI,CAAC,SAAS,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,MAAmB,CAAC;AACxB,IAAI,CAAC;IACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;AAChD,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAChC,OAAO,CAAC,KAAK,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { AgentConfig } from './config.js';
|
|
2
|
-
export declare function start(config: AgentConfig): Promise<void>;
|
|
2
|
+
export declare function start(config: AgentConfig, daemon?: boolean): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { saveRuntimeState, clearRuntimeState } from './config.js';
|
|
2
2
|
import { connect, disconnect } from './connection.js';
|
|
3
|
-
|
|
3
|
+
import { startAutoUpdate, stopAutoUpdate } from './auto-update.js';
|
|
4
|
+
export async function start(config, daemon = false) {
|
|
4
5
|
console.log('[AgentLink] Starting agent...');
|
|
5
6
|
console.log(`[AgentLink] Working directory: ${config.dir}`);
|
|
6
7
|
console.log(`[AgentLink] Relay server: ${config.server}`);
|
|
@@ -25,9 +26,12 @@ export async function start(config) {
|
|
|
25
26
|
console.log('');
|
|
26
27
|
console.log(`[AgentLink] Session URL: ${sessionUrl}`);
|
|
27
28
|
console.log('[AgentLink] Waiting for connections...');
|
|
29
|
+
// Start auto-update checker
|
|
30
|
+
startAutoUpdate(daemon);
|
|
28
31
|
// Keep process alive, handle graceful shutdown
|
|
29
32
|
const shutdown = () => {
|
|
30
33
|
console.log('\n[AgentLink] Shutting down...');
|
|
34
|
+
stopAutoUpdate();
|
|
31
35
|
clearRuntimeState();
|
|
32
36
|
disconnect();
|
|
33
37
|
process.exit(0);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|