@agent-link/server 0.1.188 → 0.1.189
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/auth-manager.d.ts +36 -0
- package/dist/auth-manager.js +96 -0
- package/dist/auth-manager.js.map +1 -0
- package/dist/http.d.ts +4 -0
- package/dist/http.js +85 -0
- package/dist/http.js.map +1 -0
- package/dist/index.js +5 -82
- package/dist/index.js.map +1 -1
- package/dist/message-relay.d.ts +17 -0
- package/dist/message-relay.js +23 -0
- package/dist/message-relay.js.map +1 -0
- package/dist/session-manager.d.ts +44 -0
- package/dist/session-manager.js +83 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/ws-agent.js +19 -27
- package/dist/ws-agent.js.map +1 -1
- package/dist/ws-client.js +31 -37
- package/dist/ws-client.js.map +1 -1
- package/package.json +1 -1
- package/web/dist/assets/{index-C9bIrYkZ.js → index-DIO7Hox0.js} +30 -30
- package/web/dist/assets/{index-C9bIrYkZ.js.map → index-DIO7Hox0.js.map} +1 -1
- package/web/dist/index.html +1 -1
- package/dist/auth.d.ts +0 -13
- package/dist/auth.js +0 -65
- package/dist/auth.js.map +0 -1
- package/dist/context.d.ts +0 -52
- package/dist/context.js +0 -60
- package/dist/context.js.map +0 -1
package/dist/ws-agent.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
|
-
import {
|
|
3
|
+
import { sessions } from './session-manager.js';
|
|
4
|
+
import { auth } from './auth-manager.js';
|
|
5
|
+
import { MessageRelay } from './message-relay.js';
|
|
4
6
|
import { generateSessionKey, encodeKey, parseMessage, encryptAndSend } from './encryption.js';
|
|
5
|
-
|
|
6
|
-
// Per-agent message processing queue to guarantee relay order.
|
|
7
|
-
// Without this, concurrent async handleAgentMessage calls can finish out-of-order
|
|
8
|
-
// (e.g. a large message needing gzip encryption completes after a smaller subsequent one),
|
|
9
|
-
// causing turn_completed to arrive before the last claude_output on the web client.
|
|
10
|
-
const agentSendQueues = new Map();
|
|
7
|
+
const agentRelay = new MessageRelay();
|
|
11
8
|
export function handleAgentConnection(ws, req) {
|
|
12
9
|
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
13
10
|
const agentId = url.searchParams.get('id') || randomUUID();
|
|
@@ -20,13 +17,13 @@ export function handleAgentConnection(ws, req) {
|
|
|
20
17
|
let passwordHash = null;
|
|
21
18
|
let passwordSalt = null;
|
|
22
19
|
if (password) {
|
|
23
|
-
const h = hashPassword(password);
|
|
20
|
+
const h = auth.hashPassword(password);
|
|
24
21
|
passwordHash = h.hash;
|
|
25
22
|
passwordSalt = h.salt;
|
|
26
23
|
}
|
|
27
24
|
// Reuse requested sessionId (agent reconnecting) or generate a new one
|
|
28
25
|
const requestedSessionId = url.searchParams.get('sessionId');
|
|
29
|
-
const sessionId = requestedSessionId || generateSessionId();
|
|
26
|
+
const sessionId = requestedSessionId || sessions.generateSessionId();
|
|
30
27
|
if (!requestedSessionId) {
|
|
31
28
|
console.log(`[Agent] No sessionId in query params for ${name} — generated new: ${sessionId}`);
|
|
32
29
|
}
|
|
@@ -45,11 +42,10 @@ export function handleAgentConnection(ws, req) {
|
|
|
45
42
|
passwordHash,
|
|
46
43
|
passwordSalt,
|
|
47
44
|
};
|
|
48
|
-
|
|
49
|
-
sessionToAgent.set(sessionId, agentId);
|
|
45
|
+
sessions.registerAgent(agentId, agent);
|
|
50
46
|
// Persist password auth per session so it survives agent disconnects
|
|
51
47
|
if (passwordHash && passwordSalt) {
|
|
52
|
-
|
|
48
|
+
auth.setSessionPassword(sessionId, passwordHash, passwordSalt);
|
|
53
49
|
}
|
|
54
50
|
console.log(`[Agent] Registered: ${name} (${agentId}), session: ${sessionId}${requestedSessionId ? ' (reconnect)' : ''}${passwordHash ? ' (password protected)' : ''}`);
|
|
55
51
|
// Send registration with session key (this initial message is plain text)
|
|
@@ -60,8 +56,8 @@ export function handleAgentConnection(ws, req) {
|
|
|
60
56
|
sessionKey: encodeKey(sessionKey),
|
|
61
57
|
}));
|
|
62
58
|
// Notify any web clients already connected to this session (reconnect scenario)
|
|
63
|
-
for (const
|
|
64
|
-
if (client.
|
|
59
|
+
for (const client of sessions.getClientsForSession(sessionId)) {
|
|
60
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
65
61
|
encryptAndSend(client.ws, {
|
|
66
62
|
type: 'agent_reconnected',
|
|
67
63
|
agent: { agentId, name, hostname, workDir, version },
|
|
@@ -69,23 +65,20 @@ export function handleAgentConnection(ws, req) {
|
|
|
69
65
|
}
|
|
70
66
|
}
|
|
71
67
|
ws.on('message', (data) => {
|
|
72
|
-
|
|
73
|
-
const prev = agentSendQueues.get(agentId) || Promise.resolve();
|
|
74
|
-
agentSendQueues.set(agentId, prev.then(() => handleAgentMessage(agentId, data.toString())).catch(() => { }));
|
|
68
|
+
agentRelay.enqueue(agentId, () => handleAgentMessage(agentId, data.toString()));
|
|
75
69
|
});
|
|
76
70
|
ws.on('close', () => {
|
|
77
71
|
console.log(`[Agent] Disconnected: ${name} (${agentId})`);
|
|
78
|
-
|
|
72
|
+
agentRelay.cleanup(agentId);
|
|
79
73
|
// Only clean up if this WebSocket is still the current one for this agent.
|
|
80
74
|
// On reconnect, the new connection overwrites the agents Map entry before
|
|
81
75
|
// the old connection's close event fires — deleting would remove the new entry.
|
|
82
|
-
const current =
|
|
76
|
+
const current = sessions.getAgent(agentId);
|
|
83
77
|
if (current && current.ws === ws) {
|
|
84
|
-
|
|
85
|
-
agents.delete(agentId);
|
|
78
|
+
sessions.removeAgent(agentId);
|
|
86
79
|
// Notify connected web clients that agent is gone
|
|
87
|
-
for (const
|
|
88
|
-
if (client.
|
|
80
|
+
for (const client of sessions.getClientsForSession(sessionId)) {
|
|
81
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
89
82
|
encryptAndSend(client.ws, { type: 'agent_disconnected' }, client.sessionKey);
|
|
90
83
|
}
|
|
91
84
|
}
|
|
@@ -96,7 +89,7 @@ export function handleAgentConnection(ws, req) {
|
|
|
96
89
|
});
|
|
97
90
|
}
|
|
98
91
|
async function handleAgentMessage(agentId, raw) {
|
|
99
|
-
const agent =
|
|
92
|
+
const agent = sessions.getAgent(agentId);
|
|
100
93
|
if (!agent)
|
|
101
94
|
return;
|
|
102
95
|
const msg = await parseMessage(raw, agent.sessionKey);
|
|
@@ -114,10 +107,9 @@ async function handleAgentMessage(agentId, raw) {
|
|
|
114
107
|
console.log(`[Agent] ${agent.name} changed workDir to: ${msg.workDir}`);
|
|
115
108
|
}
|
|
116
109
|
// Forward agent messages to all web clients connected to this session
|
|
117
|
-
// Re-encrypt with each client's own session key
|
|
118
110
|
let relayCount = 0;
|
|
119
|
-
for (const
|
|
120
|
-
if (client.
|
|
111
|
+
for (const client of sessions.getClientsForSession(agent.sessionId)) {
|
|
112
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
121
113
|
await encryptAndSend(client.ws, msg, client.sessionKey);
|
|
122
114
|
relayCount++;
|
|
123
115
|
}
|
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,
|
|
1
|
+
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/ws-client.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
3
|
import { createRequire } from 'module';
|
|
4
|
-
import {
|
|
4
|
+
import { sessions } from './session-manager.js';
|
|
5
|
+
import { auth } from './auth-manager.js';
|
|
6
|
+
import { MessageRelay } from './message-relay.js';
|
|
5
7
|
import { generateSessionKey, encodeKey, parseMessage, encryptAndSend } from './encryption.js';
|
|
6
|
-
import { isSessionLocked, recordFailure, clearFailures, verifyPassword, generateAuthToken, verifyAuthToken, } from './auth.js';
|
|
7
8
|
const require = createRequire(import.meta.url);
|
|
8
9
|
const serverPkg = require('../package.json');
|
|
9
|
-
|
|
10
|
-
const clientSendQueues = new Map();
|
|
10
|
+
const clientRelay = new MessageRelay();
|
|
11
11
|
export function handleWebConnection(ws, req) {
|
|
12
12
|
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
13
13
|
const sessionId = url.searchParams.get('sessionId');
|
|
@@ -19,21 +19,18 @@ export function handleWebConnection(ws, req) {
|
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
// Check if agent exists for this session
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const auth = sessionAuth.get(sessionId);
|
|
26
|
-
const requiresAuth = !!(auth?.passwordHash && auth?.passwordSalt);
|
|
22
|
+
const agent = sessions.getAgentBySession(sessionId);
|
|
23
|
+
// Password-protected session?
|
|
24
|
+
const requiresAuth = auth.requiresAuth(sessionId);
|
|
27
25
|
if (requiresAuth) {
|
|
28
26
|
// Check saved auth token first
|
|
29
|
-
if (authToken && verifyAuthToken(authToken, sessionId)) {
|
|
30
|
-
|
|
31
|
-
const refreshedToken = generateAuthToken(sessionId);
|
|
27
|
+
if (authToken && auth.verifyAuthToken(authToken, sessionId)) {
|
|
28
|
+
const refreshedToken = auth.generateAuthToken(sessionId);
|
|
32
29
|
completeConnection(ws, clientId, sessionId, agent, refreshedToken);
|
|
33
30
|
return;
|
|
34
31
|
}
|
|
35
32
|
// Check lockout
|
|
36
|
-
if (
|
|
33
|
+
if (auth.isLocked(sessionId)) {
|
|
37
34
|
ws.send(JSON.stringify({
|
|
38
35
|
type: 'auth_locked',
|
|
39
36
|
message: 'Too many failed attempts. Try again in 15 minutes.',
|
|
@@ -42,13 +39,13 @@ export function handleWebConnection(ws, req) {
|
|
|
42
39
|
return;
|
|
43
40
|
}
|
|
44
41
|
// Require authentication
|
|
45
|
-
|
|
42
|
+
auth.setPending(clientId, sessionId);
|
|
46
43
|
ws.send(JSON.stringify({ type: 'auth_required', sessionId }));
|
|
47
44
|
ws.on('message', (data) => {
|
|
48
45
|
handlePendingAuthMessage(clientId, ws, data.toString());
|
|
49
46
|
});
|
|
50
47
|
ws.on('close', () => {
|
|
51
|
-
|
|
48
|
+
auth.removePending(clientId);
|
|
52
49
|
});
|
|
53
50
|
return;
|
|
54
51
|
}
|
|
@@ -56,7 +53,7 @@ export function handleWebConnection(ws, req) {
|
|
|
56
53
|
completeConnection(ws, clientId, sessionId, agent);
|
|
57
54
|
}
|
|
58
55
|
function handlePendingAuthMessage(clientId, ws, raw) {
|
|
59
|
-
const sessionId =
|
|
56
|
+
const sessionId = auth.getPending(clientId);
|
|
60
57
|
if (!sessionId)
|
|
61
58
|
return;
|
|
62
59
|
let msg;
|
|
@@ -68,35 +65,34 @@ function handlePendingAuthMessage(clientId, ws, raw) {
|
|
|
68
65
|
}
|
|
69
66
|
if (msg.type !== 'authenticate' || typeof msg.password !== 'string')
|
|
70
67
|
return;
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
if (!auth?.passwordHash || !auth?.passwordSalt) {
|
|
68
|
+
const agent = sessions.getAgentBySession(sessionId);
|
|
69
|
+
const sessionAuth = auth.getSessionAuth(sessionId);
|
|
70
|
+
if (!sessionAuth?.passwordHash || !sessionAuth?.passwordSalt) {
|
|
75
71
|
// Password removed while authenticating
|
|
76
72
|
ws.send(JSON.stringify({ type: 'error', message: 'Session no longer available.' }));
|
|
77
|
-
|
|
73
|
+
auth.removePending(clientId);
|
|
78
74
|
ws.close();
|
|
79
75
|
return;
|
|
80
76
|
}
|
|
81
77
|
// Check lockout (may have been triggered by another client)
|
|
82
|
-
if (
|
|
78
|
+
if (auth.isLocked(sessionId)) {
|
|
83
79
|
ws.send(JSON.stringify({
|
|
84
80
|
type: 'auth_locked',
|
|
85
81
|
message: 'Too many failed attempts. Try again in 15 minutes.',
|
|
86
82
|
}));
|
|
87
|
-
|
|
83
|
+
auth.removePending(clientId);
|
|
88
84
|
ws.close();
|
|
89
85
|
return;
|
|
90
86
|
}
|
|
91
|
-
const valid = verifyPassword(msg.password,
|
|
87
|
+
const valid = auth.verifyPassword(msg.password, sessionAuth.passwordHash, sessionAuth.passwordSalt);
|
|
92
88
|
if (!valid) {
|
|
93
|
-
const { locked, remaining } = recordFailure(sessionId);
|
|
89
|
+
const { locked, remaining } = auth.recordFailure(sessionId);
|
|
94
90
|
if (locked) {
|
|
95
91
|
ws.send(JSON.stringify({
|
|
96
92
|
type: 'auth_locked',
|
|
97
93
|
message: 'Too many failed attempts. Try again in 15 minutes.',
|
|
98
94
|
}));
|
|
99
|
-
|
|
95
|
+
auth.removePending(clientId);
|
|
100
96
|
ws.close();
|
|
101
97
|
}
|
|
102
98
|
else {
|
|
@@ -109,9 +105,9 @@ function handlePendingAuthMessage(clientId, ws, raw) {
|
|
|
109
105
|
return;
|
|
110
106
|
}
|
|
111
107
|
// Success
|
|
112
|
-
clearFailures(sessionId);
|
|
113
|
-
|
|
114
|
-
const token = generateAuthToken(sessionId);
|
|
108
|
+
auth.clearFailures(sessionId);
|
|
109
|
+
auth.removePending(clientId);
|
|
110
|
+
const token = auth.generateAuthToken(sessionId);
|
|
115
111
|
// Replace pending auth message handler with normal encrypted handler
|
|
116
112
|
ws.removeAllListeners('message');
|
|
117
113
|
ws.removeAllListeners('close');
|
|
@@ -127,7 +123,7 @@ function completeConnection(ws, clientId, sessionId, agent, authToken) {
|
|
|
127
123
|
connectedAt: new Date(),
|
|
128
124
|
isAlive: true,
|
|
129
125
|
};
|
|
130
|
-
|
|
126
|
+
sessions.registerClient(clientId, client);
|
|
131
127
|
// Build connected payload
|
|
132
128
|
const payload = {
|
|
133
129
|
type: 'connected',
|
|
@@ -148,20 +144,19 @@ function completeConnection(ws, clientId, sessionId, agent, authToken) {
|
|
|
148
144
|
ws.send(JSON.stringify(payload));
|
|
149
145
|
console.log(`[Web] Client ${clientId.slice(0, 8)} connected to session ${sessionId}, agent: ${agent ? agent.name : 'none'}${authToken ? ' (authenticated)' : ''}`);
|
|
150
146
|
ws.on('message', (data) => {
|
|
151
|
-
|
|
152
|
-
clientSendQueues.set(clientId, prev.then(() => handleWebMessage(clientId, data.toString())).catch(() => { }));
|
|
147
|
+
clientRelay.enqueue(clientId, () => handleWebMessage(clientId, data.toString()));
|
|
153
148
|
});
|
|
154
149
|
ws.on('close', () => {
|
|
155
150
|
console.log(`[Web] Client ${clientId.slice(0, 8)} disconnected`);
|
|
156
|
-
|
|
157
|
-
|
|
151
|
+
clientRelay.cleanup(clientId);
|
|
152
|
+
sessions.removeClient(clientId);
|
|
158
153
|
});
|
|
159
154
|
ws.on('pong', () => {
|
|
160
155
|
client.isAlive = true;
|
|
161
156
|
});
|
|
162
157
|
}
|
|
163
158
|
async function handleWebMessage(clientId, raw) {
|
|
164
|
-
const client =
|
|
159
|
+
const client = sessions.getClient(clientId);
|
|
165
160
|
if (!client)
|
|
166
161
|
return;
|
|
167
162
|
const msg = await parseMessage(raw, client.sessionKey);
|
|
@@ -173,8 +168,7 @@ async function handleWebMessage(clientId, raw) {
|
|
|
173
168
|
console.log(`[Web] ${clientId.slice(0, 8)} → ${msg.type}`);
|
|
174
169
|
}
|
|
175
170
|
// Find the agent for this session and forward
|
|
176
|
-
const
|
|
177
|
-
const agent = agentId ? agents.get(agentId) : undefined;
|
|
171
|
+
const agent = sessions.getAgentBySession(client.sessionId);
|
|
178
172
|
if (!agent || agent.ws.readyState !== WebSocket.OPEN) {
|
|
179
173
|
await encryptAndSend(client.ws, { type: 'error', message: 'Agent not connected' }, client.sessionKey);
|
|
180
174
|
return;
|
package/dist/ws-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"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"}
|