@agent-link/server 0.1.25 → 0.1.27
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/service.js +34 -15
- package/dist/service.js.map +1 -1
- package/dist/ws-agent.js +13 -2
- package/dist/ws-agent.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +11 -3
package/dist/service.js
CHANGED
|
@@ -13,15 +13,30 @@ function getCliPath() {
|
|
|
13
13
|
function getNodePath() {
|
|
14
14
|
return process.execPath;
|
|
15
15
|
}
|
|
16
|
-
// ── Linux (systemd
|
|
16
|
+
// ── Linux (systemd) ──
|
|
17
|
+
function isRoot() {
|
|
18
|
+
return process.getuid?.() === 0;
|
|
19
|
+
}
|
|
17
20
|
function getSystemdUnitPath() {
|
|
21
|
+
if (isRoot()) {
|
|
22
|
+
return join('/etc/systemd/system', `${SERVICE_NAME}.service`);
|
|
23
|
+
}
|
|
18
24
|
return join(homedir(), '.config', 'systemd', 'user', `${SERVICE_NAME}.service`);
|
|
19
25
|
}
|
|
26
|
+
function systemctl(...args) {
|
|
27
|
+
const cmd = isRoot()
|
|
28
|
+
? `systemctl ${args.join(' ')}`
|
|
29
|
+
: `systemctl --user ${args.join(' ')}`;
|
|
30
|
+
execSync(cmd);
|
|
31
|
+
}
|
|
20
32
|
function generateSystemdUnit(port) {
|
|
21
33
|
const nodePath = getNodePath();
|
|
22
34
|
const cliPath = getCliPath();
|
|
23
35
|
const logDir = getLogDir();
|
|
24
36
|
const nodeBinDir = dirname(nodePath);
|
|
37
|
+
const userSection = isRoot()
|
|
38
|
+
? ''
|
|
39
|
+
: `Environment=PATH=${nodeBinDir}:${homedir()}/.local/bin:${homedir()}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin\n`;
|
|
25
40
|
return `[Unit]
|
|
26
41
|
Description=AgentLink Relay Server
|
|
27
42
|
After=network-online.target
|
|
@@ -32,12 +47,11 @@ Type=simple
|
|
|
32
47
|
ExecStart=${nodePath} ${cliPath} start --port ${port}
|
|
33
48
|
Restart=on-failure
|
|
34
49
|
RestartSec=10
|
|
35
|
-
|
|
36
|
-
StandardOutput=append:${logDir}/server.log
|
|
50
|
+
${userSection}StandardOutput=append:${logDir}/server.log
|
|
37
51
|
StandardError=append:${logDir}/server.err
|
|
38
52
|
|
|
39
53
|
[Install]
|
|
40
|
-
WantedBy
|
|
54
|
+
WantedBy=${isRoot() ? 'multi-user.target' : 'default.target'}
|
|
41
55
|
`;
|
|
42
56
|
}
|
|
43
57
|
function linuxInstall(port) {
|
|
@@ -45,24 +59,29 @@ function linuxInstall(port) {
|
|
|
45
59
|
mkdirSync(dirname(unitPath), { recursive: true });
|
|
46
60
|
mkdirSync(getLogDir(), { recursive: true });
|
|
47
61
|
writeFileSync(unitPath, generateSystemdUnit(port));
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
systemctl('daemon-reload');
|
|
63
|
+
systemctl('enable', SERVICE_NAME);
|
|
64
|
+
systemctl('start', SERVICE_NAME);
|
|
65
|
+
const scope = isRoot() ? 'system' : 'user';
|
|
66
|
+
const ctl = isRoot() ? 'systemctl' : 'systemctl --user';
|
|
67
|
+
const jctl = isRoot() ? 'journalctl' : 'journalctl --user';
|
|
68
|
+
console.log(`Service installed and started (${scope}-level).`);
|
|
52
69
|
console.log(`\nUnit file: ${unitPath}`);
|
|
53
70
|
console.log('\nUseful commands:');
|
|
54
|
-
console.log(`
|
|
55
|
-
console.log(`
|
|
56
|
-
|
|
57
|
-
|
|
71
|
+
console.log(` ${ctl} status ${SERVICE_NAME}`);
|
|
72
|
+
console.log(` ${jctl} -u ${SERVICE_NAME} -f`);
|
|
73
|
+
if (!isRoot()) {
|
|
74
|
+
console.log('\nTo run when not logged in:');
|
|
75
|
+
console.log(' sudo loginctl enable-linger $(whoami)');
|
|
76
|
+
}
|
|
58
77
|
}
|
|
59
78
|
function linuxUninstall() {
|
|
60
79
|
try {
|
|
61
|
-
|
|
80
|
+
systemctl('stop', `${SERVICE_NAME} 2>/dev/null`);
|
|
62
81
|
}
|
|
63
82
|
catch { }
|
|
64
83
|
try {
|
|
65
|
-
|
|
84
|
+
systemctl('disable', `${SERVICE_NAME} 2>/dev/null`);
|
|
66
85
|
}
|
|
67
86
|
catch { }
|
|
68
87
|
const unitPath = getSystemdUnitPath();
|
|
@@ -70,7 +89,7 @@ function linuxUninstall() {
|
|
|
70
89
|
unlinkSync(unitPath);
|
|
71
90
|
}
|
|
72
91
|
try {
|
|
73
|
-
|
|
92
|
+
systemctl('daemon-reload');
|
|
74
93
|
}
|
|
75
94
|
catch { }
|
|
76
95
|
console.log('Service uninstalled.');
|
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EACL,SAAS,EAAE,sBAAsB,EAAE,uBAAuB,EAC1D,WAAW,EAAE,cAAc,GAC5B,MAAM,aAAa,CAAC;AAErB,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAE7C,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/ws-agent.js
CHANGED
|
@@ -8,7 +8,9 @@ export function handleAgentConnection(ws, req) {
|
|
|
8
8
|
const name = url.searchParams.get('name') || `Agent-${agentId.slice(0, 8)}`;
|
|
9
9
|
const workDir = url.searchParams.get('workDir') || 'unknown';
|
|
10
10
|
const hostname = url.searchParams.get('hostname') || '';
|
|
11
|
-
|
|
11
|
+
// Reuse requested sessionId (agent reconnecting) or generate a new one
|
|
12
|
+
const requestedSessionId = url.searchParams.get('sessionId');
|
|
13
|
+
const sessionId = requestedSessionId || generateSessionId();
|
|
12
14
|
const sessionKey = generateSessionKey();
|
|
13
15
|
const agent = {
|
|
14
16
|
ws,
|
|
@@ -23,7 +25,7 @@ export function handleAgentConnection(ws, req) {
|
|
|
23
25
|
};
|
|
24
26
|
agents.set(agentId, agent);
|
|
25
27
|
sessionToAgent.set(sessionId, agentId);
|
|
26
|
-
console.log(`[Agent] Registered: ${name} (${agentId}), session: ${sessionId}`);
|
|
28
|
+
console.log(`[Agent] Registered: ${name} (${agentId}), session: ${sessionId}${requestedSessionId ? ' (reconnect)' : ''}`);
|
|
27
29
|
// Send registration with session key (this initial message is plain text)
|
|
28
30
|
ws.send(JSON.stringify({
|
|
29
31
|
type: 'registered',
|
|
@@ -31,6 +33,15 @@ export function handleAgentConnection(ws, req) {
|
|
|
31
33
|
sessionId,
|
|
32
34
|
sessionKey: encodeKey(sessionKey),
|
|
33
35
|
}));
|
|
36
|
+
// Notify any web clients already connected to this session (reconnect scenario)
|
|
37
|
+
for (const [, client] of webClients) {
|
|
38
|
+
if (client.sessionId === sessionId && client.ws.readyState === WebSocket.OPEN) {
|
|
39
|
+
encryptAndSend(client.ws, {
|
|
40
|
+
type: 'agent_reconnected',
|
|
41
|
+
agent: { agentId, name, hostname, workDir },
|
|
42
|
+
}, client.sessionKey);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
34
45
|
ws.on('message', (data) => {
|
|
35
46
|
handleAgentMessage(agentId, data.toString());
|
|
36
47
|
});
|
package/dist/ws-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,GAAoB;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAExD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -886,13 +886,21 @@ const App = {
|
|
|
886
886
|
error.value = 'Agent is not connected yet.';
|
|
887
887
|
}
|
|
888
888
|
} else if (msg.type === 'agent_disconnected') {
|
|
889
|
-
status.value = '
|
|
889
|
+
status.value = 'Waiting';
|
|
890
890
|
agentName.value = '';
|
|
891
891
|
hostname.value = '';
|
|
892
|
-
|
|
893
|
-
error.value = 'Agent has disconnected.';
|
|
892
|
+
error.value = 'Agent disconnected. Waiting for reconnect...';
|
|
894
893
|
isProcessing.value = false;
|
|
895
894
|
isCompacting.value = false;
|
|
895
|
+
} else if (msg.type === 'agent_reconnected') {
|
|
896
|
+
status.value = 'Connected';
|
|
897
|
+
error.value = '';
|
|
898
|
+
if (msg.agent) {
|
|
899
|
+
agentName.value = msg.agent.name;
|
|
900
|
+
hostname.value = msg.agent.hostname || '';
|
|
901
|
+
workDir.value = msg.agent.workDir;
|
|
902
|
+
}
|
|
903
|
+
requestSessionList();
|
|
896
904
|
} else if (msg.type === 'error') {
|
|
897
905
|
status.value = 'Error';
|
|
898
906
|
error.value = msg.message;
|