@linkshell/gateway 0.2.46 → 0.2.48
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/gateway/src/agent-permission-http.d.ts +18 -9
- package/dist/gateway/src/agent-permission-http.js +18 -10
- package/dist/gateway/src/agent-permission-http.js.map +1 -1
- package/dist/gateway/src/embedded.js +119 -55
- package/dist/gateway/src/embedded.js.map +1 -1
- package/dist/gateway/src/index.js +158 -91
- package/dist/gateway/src/index.js.map +1 -1
- package/dist/gateway/src/pairings.d.ts +3 -3
- package/dist/gateway/src/pairings.js +4 -5
- package/dist/gateway/src/pairings.js.map +1 -1
- package/dist/gateway/src/relay.d.ts +1 -1
- package/dist/gateway/src/relay.js +25 -18
- package/dist/gateway/src/relay.js.map +1 -1
- package/dist/gateway/src/sessions.d.ts +35 -28
- package/dist/gateway/src/sessions.js +165 -145
- package/dist/gateway/src/sessions.js.map +1 -1
- package/dist/gateway/src/state-store.d.ts +9 -6
- package/dist/gateway/src/state-store.js +26 -19
- package/dist/gateway/src/state-store.js.map +1 -1
- package/dist/gateway/src/tokens.d.ts +27 -7
- package/dist/gateway/src/tokens.js +86 -60
- package/dist/gateway/src/tokens.js.map +1 -1
- package/dist/gateway/src/tunnel.d.ts +11 -10
- package/dist/gateway/src/tunnel.js +46 -35
- package/dist/gateway/src/tunnel.js.map +1 -1
- package/dist/gateway/tsconfig.tsbuildinfo +1 -1
- package/dist/shared-protocol/src/index.d.ts +662 -494
- package/dist/shared-protocol/src/index.js +52 -15
- package/dist/shared-protocol/src/index.js.map +1 -1
- package/package.json +2 -2
- package/src/agent-permission-http.ts +18 -10
- package/src/embedded.ts +122 -54
- package/src/index.ts +162 -91
- package/src/pairings.ts +6 -7
- package/src/relay.ts +28 -20
- package/src/sessions.ts +179 -150
- package/src/state-store.ts +41 -25
- package/src/tokens.ts +109 -63
- package/src/tunnel.ts +57 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairings.js","sourceRoot":"","sources":["../../../src/pairings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"pairings.js","sourceRoot":"","sources":["../../../src/pairings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type WebSocket from "ws";
|
|
2
2
|
import type { SessionManager } from "./sessions.js";
|
|
3
|
-
export declare function handleSocketMessage(socket: WebSocket, raw: string, role: "host" | "client",
|
|
3
|
+
export declare function handleSocketMessage(socket: WebSocket, raw: string, role: "host" | "client", hostDeviceId: string, deviceId: string, sessions: SessionManager): void;
|
|
@@ -2,22 +2,22 @@ import { parseEnvelope, parseTypedPayload, protocolMessageSchemas, serializeEnve
|
|
|
2
2
|
import { ZodError } from "zod";
|
|
3
3
|
import { handleTunnelResponse, handleTunnelWsData, handleTunnelWsClose, } from "./tunnel.js";
|
|
4
4
|
import { resolveAgentPermissionHttpAck } from "./agent-permission-http.js";
|
|
5
|
-
export function handleSocketMessage(socket, raw, role,
|
|
5
|
+
export function handleSocketMessage(socket, raw, role, hostDeviceId, deviceId, sessions) {
|
|
6
6
|
let envelope;
|
|
7
7
|
try {
|
|
8
8
|
envelope = parseEnvelope(raw);
|
|
9
9
|
}
|
|
10
10
|
catch {
|
|
11
|
-
sendSessionError(socket,
|
|
11
|
+
sendSessionError(socket, hostDeviceId, "invalid_message", "Failed to parse envelope");
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
|
-
if (envelope.
|
|
15
|
-
sendSessionError(socket,
|
|
14
|
+
if (envelope.hostDeviceId !== hostDeviceId) {
|
|
15
|
+
sendSessionError(socket, hostDeviceId, "invalid_message", "Envelope hostDeviceId does not match connection hostDeviceId");
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
const session = sessions.get(
|
|
18
|
+
const session = sessions.get(hostDeviceId);
|
|
19
19
|
if (!session) {
|
|
20
|
-
sendSessionError(socket,
|
|
20
|
+
sendSessionError(socket, hostDeviceId, "device_not_found", "Device not found");
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
try {
|
|
@@ -36,31 +36,32 @@ export function handleSocketMessage(socket, raw, role, sessionId, deviceId, sess
|
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
if (error instanceof ZodError) {
|
|
39
|
-
sendSessionError(socket,
|
|
39
|
+
sendSessionError(socket, hostDeviceId, "invalid_message", error.errors[0]?.message ?? "Invalid message payload");
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
sendSessionError(socket,
|
|
42
|
+
sendSessionError(socket, hostDeviceId, "invalid_message", "Failed to handle message");
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
function isProtocolMessageType(type) {
|
|
46
46
|
return Object.prototype.hasOwnProperty.call(protocolMessageSchemas, type);
|
|
47
47
|
}
|
|
48
|
-
function sendSessionError(socket,
|
|
48
|
+
function sendSessionError(socket, hostDeviceId, code, message) {
|
|
49
49
|
if (socket.readyState !== socket.OPEN)
|
|
50
50
|
return;
|
|
51
51
|
socket.send(serializeEnvelope(createEnvelope({
|
|
52
|
-
type: "
|
|
53
|
-
|
|
52
|
+
type: "device.error",
|
|
53
|
+
hostDeviceId,
|
|
54
54
|
payload: { code, message },
|
|
55
55
|
})));
|
|
56
56
|
}
|
|
57
57
|
function handleHostMessage(envelope, session, sessions) {
|
|
58
58
|
switch (envelope.type) {
|
|
59
|
+
case "device.connect":
|
|
59
60
|
case "session.connect": {
|
|
60
61
|
// Extract metadata from host's connect message
|
|
61
62
|
const p = parseTypedPayload("session.connect", envelope.payload);
|
|
62
|
-
if (p.
|
|
63
|
-
sessions.setMetadata(session.id,
|
|
63
|
+
if (p.machineId || p.hostname || p.platform || p.cwd || p.capabilities) {
|
|
64
|
+
sessions.setMetadata(session.id, undefined, p.machineId ?? undefined, p.hostname ?? undefined, p.platform ?? undefined, p.cwd ?? undefined, undefined, p.capabilities ?? undefined);
|
|
64
65
|
}
|
|
65
66
|
break;
|
|
66
67
|
}
|
|
@@ -74,6 +75,7 @@ function handleHostMessage(envelope, session, sessions) {
|
|
|
74
75
|
broadcastToClients(session, envelope);
|
|
75
76
|
break;
|
|
76
77
|
}
|
|
78
|
+
case "device.heartbeat":
|
|
77
79
|
case "session.heartbeat":
|
|
78
80
|
break;
|
|
79
81
|
case "permission.decision.result": {
|
|
@@ -132,6 +134,7 @@ function handleHostMessage(envelope, session, sessions) {
|
|
|
132
134
|
case "terminal.spawned":
|
|
133
135
|
case "terminal.list":
|
|
134
136
|
case "terminal.browse.result":
|
|
137
|
+
case "terminal.file.read.result":
|
|
135
138
|
broadcastToClients(session, envelope);
|
|
136
139
|
break;
|
|
137
140
|
// Structured status from hooks
|
|
@@ -149,8 +152,8 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
149
152
|
if (session.controllerId === deviceId)
|
|
150
153
|
return true;
|
|
151
154
|
socket.send(serializeEnvelope(createEnvelope({
|
|
152
|
-
type: "
|
|
153
|
-
|
|
155
|
+
type: "device.error",
|
|
156
|
+
hostDeviceId: session.id,
|
|
154
157
|
payload: {
|
|
155
158
|
code: "control_conflict",
|
|
156
159
|
message: "Not the controller",
|
|
@@ -171,11 +174,13 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
171
174
|
sendToHost(session, envelope);
|
|
172
175
|
break;
|
|
173
176
|
}
|
|
177
|
+
case "device.ack":
|
|
174
178
|
case "session.ack": {
|
|
175
179
|
// Forward ACK to host
|
|
176
180
|
sendToHost(session, envelope);
|
|
177
181
|
break;
|
|
178
182
|
}
|
|
183
|
+
case "device.resume":
|
|
179
184
|
case "session.resume": {
|
|
180
185
|
const p = parseTypedPayload("session.resume", envelope.payload);
|
|
181
186
|
// Replay from gateway buffer first
|
|
@@ -184,7 +189,7 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
184
189
|
const payload = msg.payload;
|
|
185
190
|
socket.send(serializeEnvelope(createEnvelope({
|
|
186
191
|
type: "terminal.output",
|
|
187
|
-
|
|
192
|
+
hostDeviceId: session.id,
|
|
188
193
|
terminalId: msg.terminalId,
|
|
189
194
|
seq: msg.seq,
|
|
190
195
|
payload: { ...payload, isReplay: true },
|
|
@@ -211,7 +216,7 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
211
216
|
sessions.claimControl(session.id, deviceId);
|
|
212
217
|
const grantMsg = createEnvelope({
|
|
213
218
|
type: "control.grant",
|
|
214
|
-
|
|
219
|
+
hostDeviceId: session.id,
|
|
215
220
|
payload: { deviceId },
|
|
216
221
|
});
|
|
217
222
|
// Broadcast to ALL clients so previous controller updates its state
|
|
@@ -223,13 +228,14 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
223
228
|
sessions.releaseControl(session.id, deviceId);
|
|
224
229
|
const releaseMsg = createEnvelope({
|
|
225
230
|
type: "control.release",
|
|
226
|
-
|
|
231
|
+
hostDeviceId: session.id,
|
|
227
232
|
payload: { deviceId },
|
|
228
233
|
});
|
|
229
234
|
broadcastToClients(session, releaseMsg);
|
|
230
235
|
sendToHost(session, releaseMsg);
|
|
231
236
|
break;
|
|
232
237
|
}
|
|
238
|
+
case "device.heartbeat":
|
|
233
239
|
case "session.heartbeat":
|
|
234
240
|
break;
|
|
235
241
|
// Screen sharing: client → host
|
|
@@ -253,6 +259,7 @@ function handleClientMessage(envelope, socket, session, deviceId, sessions) {
|
|
|
253
259
|
case "terminal.kill":
|
|
254
260
|
case "terminal.list":
|
|
255
261
|
case "terminal.browse":
|
|
262
|
+
case "terminal.file.read":
|
|
256
263
|
case "terminal.mkdir":
|
|
257
264
|
case "terminal.history.request":
|
|
258
265
|
case "file.upload":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/relay.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAE3E,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,GAAW,EACX,IAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import type WebSocket from "ws";
|
|
2
2
|
import type { Envelope } from "@linkshell/protocol";
|
|
3
|
-
export type
|
|
3
|
+
export type DeviceState = "active" | "host_disconnected" | "terminated";
|
|
4
|
+
export type SessionState = DeviceState;
|
|
4
5
|
export interface ConnectedDevice {
|
|
5
6
|
socket: WebSocket;
|
|
6
7
|
role: "host" | "client";
|
|
7
8
|
deviceId: string;
|
|
9
|
+
token?: string;
|
|
10
|
+
authorizationId?: string;
|
|
8
11
|
connectedAt: number;
|
|
9
12
|
}
|
|
10
|
-
export interface
|
|
13
|
+
export interface HostDevice {
|
|
11
14
|
id: string;
|
|
12
|
-
|
|
15
|
+
hostDeviceId: string;
|
|
16
|
+
state: DeviceState;
|
|
13
17
|
host: ConnectedDevice | undefined;
|
|
14
18
|
clients: Map<string, ConnectedDevice>;
|
|
15
19
|
controllerId: string | undefined;
|
|
@@ -18,55 +22,58 @@ export interface Session {
|
|
|
18
22
|
outputBuffers: Map<string, Envelope[]>;
|
|
19
23
|
lastStatusByTerminal: Map<string, Envelope>;
|
|
20
24
|
hostDisconnectedAt: number | undefined;
|
|
21
|
-
provider: string | undefined;
|
|
22
25
|
machineId: string | undefined;
|
|
23
26
|
hostname: string | undefined;
|
|
24
27
|
platform: string | undefined;
|
|
25
28
|
cwd: string | undefined;
|
|
26
|
-
|
|
29
|
+
capabilities: string[];
|
|
27
30
|
userId: string | undefined;
|
|
28
31
|
}
|
|
29
|
-
export
|
|
30
|
-
|
|
32
|
+
export type Session = HostDevice;
|
|
33
|
+
export declare class DeviceManager {
|
|
34
|
+
private devices;
|
|
31
35
|
private cleanupTimer;
|
|
32
36
|
constructor();
|
|
33
|
-
getOrCreate(
|
|
34
|
-
get(
|
|
35
|
-
setHost(
|
|
36
|
-
addClient(
|
|
37
|
-
removeHost(
|
|
37
|
+
getOrCreate(hostDeviceId: string): HostDevice;
|
|
38
|
+
get(hostDeviceId: string): HostDevice | undefined;
|
|
39
|
+
setHost(hostDeviceId: string, socketDevice: ConnectedDevice): void;
|
|
40
|
+
addClient(hostDeviceId: string, socketDevice: ConnectedDevice): void;
|
|
41
|
+
removeHost(hostDeviceId: string): {
|
|
38
42
|
clients: Map<string, ConnectedDevice>;
|
|
39
43
|
} | undefined;
|
|
40
|
-
removeClient(
|
|
41
|
-
|
|
42
|
-
forceDelete(
|
|
43
|
-
bufferOutput(
|
|
44
|
-
cacheStatus(
|
|
45
|
-
getStatusReplay(
|
|
46
|
-
getReplayFrom(
|
|
47
|
-
claimControl(
|
|
48
|
-
releaseControl(
|
|
49
|
-
terminate(
|
|
50
|
-
listActive():
|
|
51
|
-
getSummary(
|
|
44
|
+
removeClient(hostDeviceId: string, deviceId: string): void;
|
|
45
|
+
disconnectAuthorization(hostDeviceId: string, authorizationId: string): number;
|
|
46
|
+
forceDelete(hostDeviceId: string): boolean;
|
|
47
|
+
bufferOutput(hostDeviceId: string, envelope: Envelope): void;
|
|
48
|
+
cacheStatus(hostDeviceId: string, envelope: Envelope): void;
|
|
49
|
+
getStatusReplay(hostDeviceId: string): Envelope[];
|
|
50
|
+
getReplayFrom(hostDeviceId: string, afterSeqByTerminal: Record<string, number>, fallbackAfterSeq?: number): Envelope[];
|
|
51
|
+
claimControl(hostDeviceId: string, deviceId: string): boolean;
|
|
52
|
+
releaseControl(hostDeviceId: string, deviceId: string): boolean;
|
|
53
|
+
terminate(hostDeviceId: string): void;
|
|
54
|
+
listActive(): HostDevice[];
|
|
55
|
+
getSummary(hostDeviceId: string): {
|
|
52
56
|
id: string;
|
|
53
|
-
|
|
57
|
+
hostDeviceId: string;
|
|
58
|
+
state: DeviceState;
|
|
59
|
+
online: boolean;
|
|
54
60
|
hasHost: boolean;
|
|
55
61
|
clientCount: number;
|
|
56
62
|
controllerId: string | null;
|
|
57
63
|
lastActivity: number;
|
|
58
64
|
createdAt: number;
|
|
59
65
|
bufferSize: number;
|
|
60
|
-
provider: string | null;
|
|
61
66
|
machineId: string | null;
|
|
62
67
|
hostname: string | null;
|
|
63
68
|
platform: string | null;
|
|
64
69
|
cwd: string | null;
|
|
65
|
-
|
|
70
|
+
capabilities: string[];
|
|
66
71
|
userId: string | null;
|
|
67
72
|
} | undefined;
|
|
68
|
-
setMetadata(
|
|
73
|
+
setMetadata(hostDeviceId: string, _provider?: string, machineId?: string, hostname?: string, platform?: string, cwd?: string, _projectName?: string, capabilities?: string[]): void;
|
|
69
74
|
private maybeDelete;
|
|
70
75
|
private cleanup;
|
|
71
76
|
destroy(): void;
|
|
72
77
|
}
|
|
78
|
+
export declare class SessionManager extends DeviceManager {
|
|
79
|
+
}
|