instar 1.3.397 → 1.3.399
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +94 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/MeshRpc.d.ts +3 -0
- package/dist/core/MeshRpc.d.ts.map +1 -1
- package/dist/core/MeshRpc.js +1 -0
- package/dist/core/MeshRpc.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/server/AgentServer.d.ts +14 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +12 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/StreamTicketStore.d.ts +54 -0
- package/dist/server/StreamTicketStore.d.ts.map +1 -0
- package/dist/server/StreamTicketStore.js +147 -0
- package/dist/server/StreamTicketStore.js.map +1 -0
- package/dist/server/WebSocketManager.d.ts +45 -0
- package/dist/server/WebSocketManager.d.ts.map +1 -1
- package/dist/server/WebSocketManager.js +178 -2
- package/dist/server/WebSocketManager.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +3 -3
- package/src/data/state-coherence-registry.json +13 -1
- package/upgrades/1.3.398.md +30 -0
- package/upgrades/1.3.399.md +34 -0
- package/upgrades/side-effects/dashboard-stream-phase2a-serving.md +69 -0
- package/upgrades/side-effects/dashboard-stream-phase2b-requesting.md +64 -0
|
@@ -29,6 +29,15 @@ import type { Server as HttpServer } from 'node:http';
|
|
|
29
29
|
import type { SessionManager } from '../core/SessionManager.js';
|
|
30
30
|
import type { StateManager } from '../core/StateManager.js';
|
|
31
31
|
import type { HookEventReceiver } from '../monitoring/HookEventReceiver.js';
|
|
32
|
+
import type { StreamTicketStore } from './StreamTicketStore.js';
|
|
33
|
+
import { type UpstreamTransport, type UpstreamHandlers } from './PeerStreamProxy.js';
|
|
34
|
+
/** Requesting side (§2.2): opens an upstream /pool-stream to a peer machine. The
|
|
35
|
+
* connector owns mint-ticket + ws-connect (it has the mesh client + peer URLs). */
|
|
36
|
+
export interface PoolStreamConnector {
|
|
37
|
+
/** Open an upstream link to `machineId`'s /pool-stream (mint a ticket, connect).
|
|
38
|
+
* Returns null if the peer is unreachable / has no URL. */
|
|
39
|
+
connect: (machineId: string, handlers: UpstreamHandlers) => UpstreamTransport | null;
|
|
40
|
+
}
|
|
32
41
|
export declare class WebSocketManager {
|
|
33
42
|
private wss;
|
|
34
43
|
private clients;
|
|
@@ -41,6 +50,18 @@ export declare class WebSocketManager {
|
|
|
41
50
|
private authToken?;
|
|
42
51
|
private registryPath?;
|
|
43
52
|
private hookEventReceiver?;
|
|
53
|
+
/** Pool Dashboard Streaming (serving side): consumes one-time tickets on the
|
|
54
|
+
* /pool-stream upgrade. Absent → /pool-stream is refused (feature dark). */
|
|
55
|
+
private streamTicketStore?;
|
|
56
|
+
/** Serving-side gate: may a PEER machine send input/key to a local session?
|
|
57
|
+
* Default false (security: keystroke forwarding is a lateral-movement vector). */
|
|
58
|
+
private poolStreamAllowRemoteInput;
|
|
59
|
+
/** Requesting side (§2.2): opens upstream /pool-stream links to peers. */
|
|
60
|
+
private poolStreamConnector?;
|
|
61
|
+
/** This machine's id — a subscribe whose machineId === this is served locally. */
|
|
62
|
+
private selfMachineId?;
|
|
63
|
+
/** One multiplexed upstream proxy per peer machine (requesting side). */
|
|
64
|
+
private peerProxies;
|
|
44
65
|
constructor(options: {
|
|
45
66
|
server: HttpServer;
|
|
46
67
|
sessionManager: SessionManager;
|
|
@@ -48,9 +69,33 @@ export declare class WebSocketManager {
|
|
|
48
69
|
authToken?: string;
|
|
49
70
|
instarDir?: string;
|
|
50
71
|
hookEventReceiver?: HookEventReceiver;
|
|
72
|
+
streamTicketStore?: StreamTicketStore;
|
|
73
|
+
poolStreamAllowRemoteInput?: boolean;
|
|
74
|
+
poolStreamConnector?: PoolStreamConnector;
|
|
75
|
+
selfMachineId?: string;
|
|
51
76
|
});
|
|
52
77
|
private authenticate;
|
|
53
78
|
private verifyToken;
|
|
79
|
+
/** §2.1: a session name must be tmux-safe before it ever reaches send-keys. */
|
|
80
|
+
private isValidSessionName;
|
|
81
|
+
/**
|
|
82
|
+
* Gate a write (input/key) before it reaches tmux. Returns true if allowed.
|
|
83
|
+
* On rejection it sends the honest error frame and returns false.
|
|
84
|
+
* - invalid name → invalid-session (§2.1 injection guard);
|
|
85
|
+
* - PEER client + remote input disabled → input-not-allowed (§2.3 default-off);
|
|
86
|
+
* - session not running locally → session-not-found (never relay to tmux blind).
|
|
87
|
+
*/
|
|
88
|
+
private gateWrite;
|
|
89
|
+
/** True when the subscribe targets a session on ANOTHER machine. */
|
|
90
|
+
private isRemoteTarget;
|
|
91
|
+
/** Get-or-create the one multiplexed upstream proxy for a peer machine. */
|
|
92
|
+
private peerProxyFor;
|
|
93
|
+
/** Fan a peer frame out to every LOCAL client subscribed to (machineId, session). */
|
|
94
|
+
private fanRemoteFrame;
|
|
95
|
+
/** Surface an honest error to every local client subscribed to (machineId, session). */
|
|
96
|
+
private sendRemoteError;
|
|
97
|
+
/** Tear down a client's remote subscriptions (on unsubscribe-all / close). */
|
|
98
|
+
private dropRemoteSubsForClient;
|
|
54
99
|
private handleMessage;
|
|
55
100
|
/**
|
|
56
101
|
* Stream terminal output to subscribed clients.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketManager.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAmB,MAAM,WAAW,CAAC;AAIvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"WebSocketManager.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,9 @@ import { WebSocketServer, WebSocket } from 'ws';
|
|
|
29
29
|
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
30
30
|
import fs from 'node:fs';
|
|
31
31
|
import path from 'node:path';
|
|
32
|
+
import { PeerStreamProxy } from './PeerStreamProxy.js';
|
|
33
|
+
/** Pool Dashboard Streaming §2.1: only tmux-safe session names ever reach tmux. */
|
|
34
|
+
const SAFE_SESSION_NAME = /^[A-Za-z0-9_.:@-]+$/;
|
|
32
35
|
export class WebSocketManager {
|
|
33
36
|
wss;
|
|
34
37
|
clients = new Map();
|
|
@@ -41,11 +44,27 @@ export class WebSocketManager {
|
|
|
41
44
|
authToken;
|
|
42
45
|
registryPath;
|
|
43
46
|
hookEventReceiver;
|
|
47
|
+
/** Pool Dashboard Streaming (serving side): consumes one-time tickets on the
|
|
48
|
+
* /pool-stream upgrade. Absent → /pool-stream is refused (feature dark). */
|
|
49
|
+
streamTicketStore;
|
|
50
|
+
/** Serving-side gate: may a PEER machine send input/key to a local session?
|
|
51
|
+
* Default false (security: keystroke forwarding is a lateral-movement vector). */
|
|
52
|
+
poolStreamAllowRemoteInput = false;
|
|
53
|
+
/** Requesting side (§2.2): opens upstream /pool-stream links to peers. */
|
|
54
|
+
poolStreamConnector;
|
|
55
|
+
/** This machine's id — a subscribe whose machineId === this is served locally. */
|
|
56
|
+
selfMachineId;
|
|
57
|
+
/** One multiplexed upstream proxy per peer machine (requesting side). */
|
|
58
|
+
peerProxies = new Map();
|
|
44
59
|
constructor(options) {
|
|
45
60
|
this.sessionManager = options.sessionManager;
|
|
46
61
|
this.state = options.state;
|
|
47
62
|
this.authToken = options.authToken;
|
|
48
63
|
this.hookEventReceiver = options.hookEventReceiver;
|
|
64
|
+
this.streamTicketStore = options.streamTicketStore;
|
|
65
|
+
this.poolStreamAllowRemoteInput = options.poolStreamAllowRemoteInput ?? false;
|
|
66
|
+
this.poolStreamConnector = options.poolStreamConnector;
|
|
67
|
+
this.selfMachineId = options.selfMachineId;
|
|
49
68
|
if (options.instarDir) {
|
|
50
69
|
this.registryPath = path.join(options.instarDir, 'topic-session-registry.json');
|
|
51
70
|
}
|
|
@@ -54,8 +73,31 @@ export class WebSocketManager {
|
|
|
54
73
|
});
|
|
55
74
|
// Handle upgrade manually for auth
|
|
56
75
|
options.server.on('upgrade', (request, socket, head) => {
|
|
57
|
-
// Only handle /ws path
|
|
58
76
|
const url = new URL(request.url || '/', `http://${request.headers.host || 'localhost'}`);
|
|
77
|
+
// ── /pool-stream: a PEER machine streaming a remote session (§2.3) ──
|
|
78
|
+
// Authenticated by a single-use bearer ticket minted over the machine-
|
|
79
|
+
// authed `pool-stream-ticket` mesh verb; identity comes from the ticket's
|
|
80
|
+
// mint record, never an unverified upgrade claim.
|
|
81
|
+
if (url.pathname === '/pool-stream') {
|
|
82
|
+
if (!this.streamTicketStore) {
|
|
83
|
+
socket.write('HTTP/1.1 503 Service Unavailable\r\n\r\n');
|
|
84
|
+
socket.destroy();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const ticket = url.searchParams.get('ticket') || request.headers['x-pool-stream-ticket'] || '';
|
|
88
|
+
const res = this.streamTicketStore.consume(ticket);
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
|
|
91
|
+
socket.destroy();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const peerMachineId = res.forMachineId;
|
|
95
|
+
this.wss.handleUpgrade(request, socket, head, (ws) => {
|
|
96
|
+
this.wss.emit('connection', ws, request, { isPeer: true, peerMachineId });
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// ── /ws: a local browser dashboard ──
|
|
59
101
|
if (url.pathname !== '/ws') {
|
|
60
102
|
socket.destroy();
|
|
61
103
|
return;
|
|
@@ -70,11 +112,12 @@ export class WebSocketManager {
|
|
|
70
112
|
this.wss.emit('connection', ws, request);
|
|
71
113
|
});
|
|
72
114
|
});
|
|
73
|
-
this.wss.on('connection', (ws) => {
|
|
115
|
+
this.wss.on('connection', (ws, _request, peerCtx) => {
|
|
74
116
|
const client = {
|
|
75
117
|
ws,
|
|
76
118
|
subscriptions: new Set(),
|
|
77
119
|
isAlive: true,
|
|
120
|
+
...(peerCtx?.isPeer ? { isPeer: true, peerMachineId: peerCtx.peerMachineId } : {}),
|
|
78
121
|
};
|
|
79
122
|
this.clients.set(ws, client);
|
|
80
123
|
// Send initial session list
|
|
@@ -92,9 +135,11 @@ export class WebSocketManager {
|
|
|
92
135
|
client.isAlive = true;
|
|
93
136
|
});
|
|
94
137
|
ws.on('close', () => {
|
|
138
|
+
this.dropRemoteSubsForClient(client);
|
|
95
139
|
this.clients.delete(ws);
|
|
96
140
|
});
|
|
97
141
|
ws.on('error', () => {
|
|
142
|
+
this.dropRemoteSubsForClient(client);
|
|
98
143
|
this.clients.delete(ws);
|
|
99
144
|
});
|
|
100
145
|
});
|
|
@@ -142,6 +187,100 @@ export class WebSocketManager {
|
|
|
142
187
|
const hb = createHash('sha256').update(this.authToken).digest();
|
|
143
188
|
return timingSafeEqual(ha, hb);
|
|
144
189
|
}
|
|
190
|
+
/** §2.1: a session name must be tmux-safe before it ever reaches send-keys. */
|
|
191
|
+
isValidSessionName(session) {
|
|
192
|
+
return SAFE_SESSION_NAME.test(session);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Gate a write (input/key) before it reaches tmux. Returns true if allowed.
|
|
196
|
+
* On rejection it sends the honest error frame and returns false.
|
|
197
|
+
* - invalid name → invalid-session (§2.1 injection guard);
|
|
198
|
+
* - PEER client + remote input disabled → input-not-allowed (§2.3 default-off);
|
|
199
|
+
* - session not running locally → session-not-found (never relay to tmux blind).
|
|
200
|
+
*/
|
|
201
|
+
gateWrite(client, session) {
|
|
202
|
+
if (!this.isValidSessionName(session)) {
|
|
203
|
+
this.send(client.ws, { type: 'error', code: 'invalid-session', session });
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (client.isPeer && !this.poolStreamAllowRemoteInput) {
|
|
207
|
+
this.send(client.ws, { type: 'error', code: 'input-not-allowed', session });
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
const exists = this.sessionManager.listRunningSessions().some((s) => s.tmuxSession === session);
|
|
211
|
+
if (!exists) {
|
|
212
|
+
this.send(client.ws, { type: 'error', code: 'session-not-found', session });
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
// ── Requesting side (§2.2): route a remote session through a peer proxy ──
|
|
218
|
+
/** True when the subscribe targets a session on ANOTHER machine. */
|
|
219
|
+
isRemoteTarget(machineId, session) {
|
|
220
|
+
if (!machineId || !this.poolStreamConnector)
|
|
221
|
+
return false;
|
|
222
|
+
if (this.selfMachineId && machineId === this.selfMachineId)
|
|
223
|
+
return false;
|
|
224
|
+
// A session that actually exists locally is served locally even if the
|
|
225
|
+
// client's machineId hint is stale (hint-staleness after a transfer, §2.1).
|
|
226
|
+
const local = this.sessionManager.listRunningSessions().some((s) => s.tmuxSession === session);
|
|
227
|
+
return !local;
|
|
228
|
+
}
|
|
229
|
+
/** Get-or-create the one multiplexed upstream proxy for a peer machine. */
|
|
230
|
+
peerProxyFor(machineId) {
|
|
231
|
+
let proxy = this.peerProxies.get(machineId);
|
|
232
|
+
if (proxy)
|
|
233
|
+
return proxy;
|
|
234
|
+
proxy = new PeerStreamProxy({
|
|
235
|
+
peerMachineId: machineId,
|
|
236
|
+
// The connector owns URL resolution; a non-null sentinel keeps the proxy's
|
|
237
|
+
// url-change guard inert (one peer = one connector).
|
|
238
|
+
resolveUrl: () => 'pool-stream',
|
|
239
|
+
connect: (_url, handlers) => {
|
|
240
|
+
const t = this.poolStreamConnector?.connect(machineId, handlers);
|
|
241
|
+
if (!t)
|
|
242
|
+
throw new Error(`no pool-stream connector route for ${machineId}`);
|
|
243
|
+
return t;
|
|
244
|
+
},
|
|
245
|
+
onFrameToClients: (session, frame) => this.fanRemoteFrame(machineId, session, frame),
|
|
246
|
+
onError: (session, code) => this.sendRemoteError(machineId, session, code),
|
|
247
|
+
now: () => Date.now(),
|
|
248
|
+
setTimer: (ms, fn) => { const h = setTimeout(fn, ms); return h; },
|
|
249
|
+
clearTimer: (h) => clearTimeout(h),
|
|
250
|
+
logger: (m) => { void m; },
|
|
251
|
+
});
|
|
252
|
+
this.peerProxies.set(machineId, proxy);
|
|
253
|
+
return proxy;
|
|
254
|
+
}
|
|
255
|
+
/** Fan a peer frame out to every LOCAL client subscribed to (machineId, session). */
|
|
256
|
+
fanRemoteFrame(machineId, session, frame) {
|
|
257
|
+
const key = `${machineId}::${session}`;
|
|
258
|
+
for (const c of this.clients.values()) {
|
|
259
|
+
if (c.remoteSubs?.has(key))
|
|
260
|
+
this.send(c.ws, { ...frame, machineId });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/** Surface an honest error to every local client subscribed to (machineId, session). */
|
|
264
|
+
sendRemoteError(machineId, session, code) {
|
|
265
|
+
const key = `${machineId}::${session}`;
|
|
266
|
+
for (const c of this.clients.values()) {
|
|
267
|
+
if (c.remoteSubs?.has(key))
|
|
268
|
+
this.send(c.ws, { type: 'error', code, session, machineId });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** Tear down a client's remote subscriptions (on unsubscribe-all / close). */
|
|
272
|
+
dropRemoteSubsForClient(client) {
|
|
273
|
+
if (!client.remoteSubs)
|
|
274
|
+
return;
|
|
275
|
+
const clientId = this.clientId(client);
|
|
276
|
+
for (const key of client.remoteSubs) {
|
|
277
|
+
const sep = key.indexOf('::');
|
|
278
|
+
const machineId = key.slice(0, sep);
|
|
279
|
+
const session = key.slice(sep + 2);
|
|
280
|
+
this.peerProxies.get(machineId)?.unsubscribe(session, clientId);
|
|
281
|
+
}
|
|
282
|
+
client.remoteSubs.clear();
|
|
283
|
+
}
|
|
145
284
|
handleMessage(client, msg) {
|
|
146
285
|
switch (msg.type) {
|
|
147
286
|
case 'subscribe': {
|
|
@@ -150,6 +289,20 @@ export class WebSocketManager {
|
|
|
150
289
|
this.send(client.ws, { type: 'error', message: 'Missing session name' });
|
|
151
290
|
return;
|
|
152
291
|
}
|
|
292
|
+
// §2.1: never let a crafted session name reach tmux (target injection).
|
|
293
|
+
if (!this.isValidSessionName(session)) {
|
|
294
|
+
this.send(client.ws, { type: 'error', code: 'invalid-session', session });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
// §2.2 requesting side: a session on ANOTHER machine routes through that
|
|
298
|
+
// peer's upstream proxy instead of the local capture path.
|
|
299
|
+
const subMachine = typeof msg.machineId === 'string' ? msg.machineId : undefined;
|
|
300
|
+
if (this.isRemoteTarget(subMachine, session)) {
|
|
301
|
+
(client.remoteSubs ??= new Set()).add(`${subMachine}::${session}`);
|
|
302
|
+
this.peerProxyFor(subMachine).subscribe(session, this.clientId(client));
|
|
303
|
+
this.send(client.ws, { type: 'subscribed', session, machineId: subMachine });
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
153
306
|
client.subscriptions.add(session);
|
|
154
307
|
// Send current output immediately — use large capture for initial load
|
|
155
308
|
const output = this.sessionManager.captureOutput(session, 2000);
|
|
@@ -162,6 +315,13 @@ export class WebSocketManager {
|
|
|
162
315
|
}
|
|
163
316
|
case 'unsubscribe': {
|
|
164
317
|
const session = String(msg.session || '');
|
|
318
|
+
const unsubMachine = typeof msg.machineId === 'string' ? msg.machineId : undefined;
|
|
319
|
+
if (unsubMachine && client.remoteSubs?.has(`${unsubMachine}::${session}`)) {
|
|
320
|
+
client.remoteSubs.delete(`${unsubMachine}::${session}`);
|
|
321
|
+
this.peerProxies.get(unsubMachine)?.unsubscribe(session, this.clientId(client));
|
|
322
|
+
this.send(client.ws, { type: 'unsubscribed', session, machineId: unsubMachine });
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
165
325
|
client.subscriptions.delete(session);
|
|
166
326
|
this.sessionOutputCache.delete(`${this.clientId(client)}:${session}`);
|
|
167
327
|
this.send(client.ws, { type: 'unsubscribed', session });
|
|
@@ -174,6 +334,15 @@ export class WebSocketManager {
|
|
|
174
334
|
this.send(client.ws, { type: 'error', message: 'Missing session or text' });
|
|
175
335
|
return;
|
|
176
336
|
}
|
|
337
|
+
const inMachine = typeof msg.machineId === 'string' ? msg.machineId : undefined;
|
|
338
|
+
if (inMachine && client.remoteSubs?.has(`${inMachine}::${session}`)) {
|
|
339
|
+
// Relay to the peer; the SERVING machine enforces its allowRemoteInput
|
|
340
|
+
// gate and replies input_ack / input-not-allowed, which we fan back.
|
|
341
|
+
this.peerProxies.get(inMachine)?.relayInput({ type: 'input', session, text });
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
if (!this.gateWrite(client, session))
|
|
345
|
+
return;
|
|
177
346
|
const success = this.sessionManager.sendInput(session, text);
|
|
178
347
|
this.send(client.ws, { type: 'input_ack', session, success });
|
|
179
348
|
break;
|
|
@@ -185,6 +354,13 @@ export class WebSocketManager {
|
|
|
185
354
|
this.send(client.ws, { type: 'error', message: 'Missing session or key' });
|
|
186
355
|
return;
|
|
187
356
|
}
|
|
357
|
+
const keyMachine = typeof msg.machineId === 'string' ? msg.machineId : undefined;
|
|
358
|
+
if (keyMachine && client.remoteSubs?.has(`${keyMachine}::${session}`)) {
|
|
359
|
+
this.peerProxies.get(keyMachine)?.relayInput({ type: 'key', session, key });
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
if (!this.gateWrite(client, session))
|
|
363
|
+
return;
|
|
188
364
|
const success = this.sessionManager.sendKey(session, key);
|
|
189
365
|
this.send(client.ws, { type: 'input_ack', session, success });
|
|
190
366
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketManager.js","sourceRoot":"","sources":["../../src/server/WebSocketManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebSocketManager.js","sourceRoot":"","sources":["../../src/server/WebSocketManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,OAAO,EAAE,eAAe,EAAiD,MAAM,sBAAsB,CAAC;AAEtG,mFAAmF;AACnF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAyBhD,MAAM,OAAO,gBAAgB;IACnB,GAAG,CAAkB;IACrB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IACjD,kBAAkB,GAAwB,IAAI,GAAG,EAAE,CAAC;IACpD,cAAc,GAA0C,IAAI,CAAC;IAC7D,iBAAiB,GAA0C,IAAI,CAAC;IAChE,wBAAwB,GAA0C,IAAI,CAAC;IACvE,cAAc,CAAiB;IAC/B,KAAK,CAAe;IACpB,SAAS,CAAU;IACnB,YAAY,CAAU;IACtB,iBAAiB,CAAqB;IAC9C;iFAC6E;IACrE,iBAAiB,CAAqB;IAC9C;uFACmF;IAC3E,0BAA0B,GAAG,KAAK,CAAC;IAC3C,0EAA0E;IAClE,mBAAmB,CAAuB;IAClD,kFAAkF;IAC1E,aAAa,CAAU;IAC/B,yEAAyE;IACjE,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEzD,YAAY,OAWX;QACC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,IAAI,KAAK,CAAC;QAC9E,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC;YAC7B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,mCAAmC;QACnC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;YAEzF,uEAAuE;YACvE,uEAAuE;YACvE,0EAA0E;YAC1E,kDAAkD;YAClD,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACzD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAK,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAY,IAAI,EAAE,CAAC;gBAC3G,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;oBAClD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC;gBACvC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;oBACnD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC5E,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,yCAAyC;YACzC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBACvD,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAClD,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBACnD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAoD,EAAE,EAAE;YAC/F,MAAM,MAAM,GAAgB;gBAC1B,EAAE;gBACF,aAAa,EAAE,IAAI,GAAG,EAAE;gBACxB,OAAO,EAAE,IAAI;gBACb,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAE7B,4BAA4B;YAC5B,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAEzB,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACxC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,uCAAuC;QACvC,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;YACxC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,EAAE,CAAC,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,sCAAsC;QACtC,IAAI,CAAC,wBAAwB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAEO,YAAY,CAAC,OAAwB,EAAE,GAAQ;QACrD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAEjC,0EAA0E;QAC1E,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,6BAA6B;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC3C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,+EAA+E;IACvE,kBAAkB,CAAC,OAAe;QACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACK,SAAS,CAAC,MAAmB,EAAE,OAAe;QACpD,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAE5E,oEAAoE;IAC5D,cAAc,CAAC,SAA6B,EAAE,OAAe;QACnE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO,KAAK,CAAC;QAC1D,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACzE,uEAAuE;QACvE,4EAA4E;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;QAC/F,OAAO,CAAC,KAAK,CAAC;IAChB,CAAC;IAED,2EAA2E;IACnE,YAAY,CAAC,SAAiB;QACpC,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,KAAK,GAAG,IAAI,eAAe,CAAC;YAC1B,aAAa,EAAE,SAAS;YACxB,2EAA2E;YAC3E,qDAAqD;YACrD,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa;YAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACjE,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,CAAC;YACX,CAAC;YACD,gBAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;YACpF,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;YAC1E,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAA0D,CAAC,CAAC,CAAC;YAC1H,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAA6C,CAAC;YAC9E,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qFAAqF;IAC7E,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAE,KAA8B;QACvF,MAAM,GAAG,GAAG,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,wFAAwF;IAChF,eAAe,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAY;QACtE,MAAM,GAAG,GAAG,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,8EAA8E;IACtE,uBAAuB,CAAC,MAAmB;QACjD,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,aAAa,CAAC,MAAmB,EAAE,GAA4B;QACrE,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;gBACD,wEAAwE;gBACxE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC1E,OAAO;gBACT,CAAC;gBACD,yEAAyE;gBACzE,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjF,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC7C,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;oBACnE,IAAI,CAAC,YAAY,CAAC,UAAW,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC7E,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClC,uEAAuE;gBACvE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAChE,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;oBAC3E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC1C,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnF,IAAI,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,YAAY,KAAK,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC1E,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,OAAO,EAAE,CAAC,CAAC;oBACxD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBAChF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;oBACjF,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;gBACxD,MAAM;YACR,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;oBAC5E,OAAO;gBACT,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChF,IAAI,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,EAAE,CAAC;oBACpE,uEAAuE;oBACvE,qEAAqE;oBACrE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9E,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;oBAAE,OAAO;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;oBAC3E,OAAO;gBACT,CAAC;gBACD,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjF,IAAI,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,UAAU,KAAK,OAAO,EAAE,CAAC,EAAE,CAAC;oBACtE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC5E,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;oBAAE,OAAO;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;gBACD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACxE,IAAI,aAAa,EAAE,CAAC;oBAClB,+EAA+E;oBAC/E,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;oBAClF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,OAAO,GAAG,EAAE,CAAC,CAAC;gBACzF,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvC,MAAM;YAER;gBACE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,0DAA0D;YAC1D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC7C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBAC3C,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,6CAA6C;YAC7C,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAEhE,sCAAsC;gBACtC,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;wBAAE,SAAS;oBAEjD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACvD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAErD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBACpB,yBAAyB;wBACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;4BACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;4BACzD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC3C,CAAC;wBACD,SAAS;oBACX,CAAC;oBAED,8BAA8B;oBAC9B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,oBAAoB;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,GAAG,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACrE,MAAM,cAAc,GAA2B,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;YACzE,MAAM,WAAW,GAA2B,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YACnE,4DAA4D;YAC5D,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,IAAI,EAAE,CAAC;oBACT,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,gBAAgB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACrB,MAAM,IAAI,GAA4B;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI;gBAC/C,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;aACxC,CAAC;YAEF,kDAAkD;YAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACxE,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,SAAS,GAAG;wBACf,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;wBAC1C,YAAY,EAAE,OAAO,CAAC,SAAS;qBAChC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,EAAa;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,KAA8B;QAC3C,kEAAkE;QAClE,kEAAkE;QAClE,iEAAiE;QACjE,qDAAqD;QACrD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,CAAC,CAAC;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,gBAAgB,GAAG,IAAI,GAAG,EAA4C,CAAC;IAC/E,eAAe,CAAC,EAA4C;QAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,MAAmB;QAClC,sDAAsD;QACtD,OAAO,MAAM,CAAE,MAAM,CAAC,EAAuD,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;IAEO,IAAI,CAAC,EAAa,EAAE,GAA4B;QACtD,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,iBAAiB;YAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,wBAAwB;YAAE,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEhF,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-07T07:31:58.234Z",
|
|
5
|
+
"instarVersion": "1.3.399",
|
|
6
6
|
"entryCount": 199,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -1506,7 +1506,7 @@
|
|
|
1506
1506
|
"type": "subsystem",
|
|
1507
1507
|
"domain": "server",
|
|
1508
1508
|
"sourcePath": "src/server/AgentServer.ts",
|
|
1509
|
-
"contentHash": "
|
|
1509
|
+
"contentHash": "8ce488c7a058f38782ce5a986e005f196372cb1a444f66b5d6f6f88d129b7eaf",
|
|
1510
1510
|
"since": "2025-01-01"
|
|
1511
1511
|
},
|
|
1512
1512
|
"subsystem:session-manager": {
|
|
@@ -959,6 +959,18 @@
|
|
|
959
959
|
"state/session-monitor-ctx-notified.json"
|
|
960
960
|
],
|
|
961
961
|
"grandfathered": false
|
|
962
|
+
},
|
|
963
|
+
{
|
|
964
|
+
"category": "stream-tickets",
|
|
965
|
+
"description": "Pool Dashboard Streaming single-use bearer tickets (POOL-DASHBOARD-STREAM-SPEC \u00a72.3). Minted by the pool-stream-ticket mesh verb, consumed once on the /pool-stream WS upgrade. Persisted so a captured ticket cannot replay across a serving-machine restart (consumed-set survives). Machine-local; single-writer (the store's own funnel); TTL-bounded + GC'd.",
|
|
966
|
+
"scope": "machine-local",
|
|
967
|
+
"freshness": "live",
|
|
968
|
+
"conflictShape": "single-writer",
|
|
969
|
+
"transport": "none",
|
|
970
|
+
"paths": [
|
|
971
|
+
"state/stream-tickets.json"
|
|
972
|
+
],
|
|
973
|
+
"grandfathered": false
|
|
962
974
|
}
|
|
963
975
|
]
|
|
964
|
-
}
|
|
976
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
The machine that owns a session can now serve its live terminal stream to a peer machine, securely. A peer requests a single-use bearer ticket over the existing machine-authed mesh channel (`pool-stream-ticket` verb); the serving machine mints it via the new StreamTicketStore (60s TTL, single-use, persisted so a captured ticket can't replay across a restart). The peer opens a `/pool-stream` WebSocket carrying that ticket; the serving machine consumes it once and treats the peer as a streaming client. Remote keystroke input is OFF by default (per-machine opt-in); session names are validated (tmux-safe charset + must be running) before anything reaches the shell.
|
|
9
|
+
|
|
10
|
+
This is the serving (has-the-session) half. The requesting half (the dashboard auto-opening these connections) and the on-screen UI are phases 2b and 3.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
Nothing changes on screen yet — this is the secure plumbing the click-to-stream feature will use. Default posture: other machines can watch, not type, unless you opt in.
|
|
15
|
+
|
|
16
|
+
- audience: agent-only
|
|
17
|
+
- maturity: preview
|
|
18
|
+
|
|
19
|
+
## Summary of New Capabilities
|
|
20
|
+
|
|
21
|
+
- `StreamTicketStore` — single-use, TTL-bounded, restart-replay-proof stream tickets.
|
|
22
|
+
- `pool-stream-ticket` mesh verb — mints a ticket for an authenticated peer.
|
|
23
|
+
- `/pool-stream` WebSocket serving endpoint — ticket-gated; peer streams a session.
|
|
24
|
+
- Serving-side guards: `dashboard.poolStream.allowRemoteInput` (default false); session-name validation (`^[A-Za-z0-9_.:@-]+$` + must-be-running) before tmux.
|
|
25
|
+
|
|
26
|
+
## Evidence
|
|
27
|
+
|
|
28
|
+
- `tests/unit/StreamTicketStore.test.ts` (11): single-use, expiry, wrong-machine, bearer mode, replay-across-restart, corrupt-fail-closed, GC.
|
|
29
|
+
- `tests/e2e/pool-stream-serving-alive.test.ts` (6, real http server + real ws): valid ticket streams; bad ticket → 401; single-use enforced; input gated off by default; input accepted when on; tmux-unsafe name refused.
|
|
30
|
+
- `tests/unit/WebSocketManager.test.ts` updated for the new existence-before-input guard. tsc clean; state registry + MeshRpc RBAC updated.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
The dashboard machine can now stream a session that lives on another machine. When a browser client subscribes with a remote `machineId`, the WebSocketManager routes it through a per-peer multiplexed upstream link (PeerStreamProxy from phase 1) instead of the local capture path: it mints a single-use ticket from the peer (the phase-2a mesh verb) and opens a real `/pool-stream` connection. Output frames fan back to the subscribed browser clients tagged with the source machine; input is relayed (the serving machine still enforces its own input gate); drops surface honest `peer-stream-lost`/`machine-unreachable` frames. A locally-running session is always served locally even if a stale remote `machineId` is hinted (transfer-staleness guard).
|
|
9
|
+
|
|
10
|
+
This completes the streaming engine end to end. The on-screen UI (clickable remote tiles + status badges) is phase 3.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
Almost there — the machinery to click a remote machine's session and stream it is now wired both ends. The visible click-to-stream tiles land in the next (final) phase.
|
|
15
|
+
|
|
16
|
+
- audience: agent-only
|
|
17
|
+
- maturity: preview
|
|
18
|
+
|
|
19
|
+
## Summary of New Capabilities
|
|
20
|
+
|
|
21
|
+
- WebSocketManager routes a remote-`machineId` subscribe through a per-peer
|
|
22
|
+
PeerStreamProxy; output fans back machine-tagged; input relayed; honest error frames.
|
|
23
|
+
- A `PoolStreamConnector` (in server boot) mints a ticket via the mesh verb and
|
|
24
|
+
opens the upstream `/pool-stream` ws; injected through AgentServer.
|
|
25
|
+
- Transfer-staleness guard: a locally-running session is served locally despite a stale remote hint.
|
|
26
|
+
|
|
27
|
+
## Evidence
|
|
28
|
+
|
|
29
|
+
- `tests/unit/WebSocketManager.test.ts` (+7): remote subscribe opens a proxy +
|
|
30
|
+
fans output tagged; self/local hints stay local; input relayed; drop →
|
|
31
|
+
peer-stream-lost; remote unsubscribe cleans up.
|
|
32
|
+
- `tests/e2e/pool-stream-roundtrip-alive.test.ts` (new): two real WebSocketManagers
|
|
33
|
+
+ two http servers — a browser subscribe to a remote session streams the serving
|
|
34
|
+
machine's output back over real sockets, machine-tagged.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Side-Effects Review — Pool dashboard streaming phase 2a (serving endpoint)
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `dashboard-stream-phase2a-serving`
|
|
4
|
+
**Date:** `2026-06-07`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Serving side of cross-machine streaming: StreamTicketStore (single-use ticket),
|
|
11
|
+
`pool-stream-ticket` mesh verb (mint), `/pool-stream` WS endpoint (ticket-gated
|
|
12
|
+
peer streaming reusing the existing WSManager client path), serving-side input
|
|
13
|
+
gate (allowRemoteInput default-off) + session-name validation.
|
|
14
|
+
|
|
15
|
+
## Decision-point inventory
|
|
16
|
+
|
|
17
|
+
(1) Ticket auth vs signed-headers-at-upgrade → ticket (bounded, single-use,
|
|
18
|
+
restart-replay-proof). (2) Remote input default → OFF (lateral-movement). (3)
|
|
19
|
+
Session-name handling → strict charset + must-be-running before tmux.
|
|
20
|
+
|
|
21
|
+
## 1. Over-block
|
|
22
|
+
|
|
23
|
+
Remote input is refused by default (input-not-allowed) — intended; watching is
|
|
24
|
+
unaffected. A session-name that isn't tmux-safe OR isn't running is refused
|
|
25
|
+
(invalid-session / session-not-found) — correct, never relay blind.
|
|
26
|
+
|
|
27
|
+
## 2. Under-block
|
|
28
|
+
|
|
29
|
+
The minted ticket is a bearer credential: anyone holding it (within 60s,
|
|
30
|
+
once) can open the stream. Mitigated: minted only to an authenticated peer
|
|
31
|
+
(mesh verb), single-use, short TTL, optional wrong-machine defense-in-depth. A
|
|
32
|
+
peer that can watch a session sees its output (disclosure accepted for
|
|
33
|
+
same-operator peers, per spec §2.3).
|
|
34
|
+
|
|
35
|
+
## 3. Level-of-abstraction fit
|
|
36
|
+
|
|
37
|
+
The peer reuses the existing WSManager client/handleMessage path (one streaming
|
|
38
|
+
implementation, not a fork); only the upgrade (ticket consume) and the
|
|
39
|
+
write-gate differ. Ticket minting rides the existing mesh dispatcher (no new
|
|
40
|
+
auth surface). Store persistence matches the PendingPullLedger idiom.
|
|
41
|
+
|
|
42
|
+
## 4. Signal vs authority compliance
|
|
43
|
+
|
|
44
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
45
|
+
|
|
46
|
+
The new authority (ticket consume, input gate, name validation) is structural
|
|
47
|
+
and fail-closed: no ticket → 503/401; bad name → refused; peer input off →
|
|
48
|
+
refused. Identity comes from the mint record / mesh-auth, never an unverified
|
|
49
|
+
upgrade claim.
|
|
50
|
+
|
|
51
|
+
## 5. Interactions
|
|
52
|
+
|
|
53
|
+
- WebSocketManager local (/ws) path: unchanged except the new existence-before-
|
|
54
|
+
input guard (a real improvement; the two existing input/key tests updated to
|
|
55
|
+
register the session).
|
|
56
|
+
- MeshRpc RBAC: pool-stream-ticket joins the read/observe class (mint discloses
|
|
57
|
+
nothing; ticket+gate are the controls).
|
|
58
|
+
- StreamTicketStore persistence: new durable category `stream-tickets`
|
|
59
|
+
registered in state-coherence-registry.
|
|
60
|
+
- Config: `dashboard.poolStream.allowRemoteInput` (absent = false = safe, so no
|
|
61
|
+
migrateConfig needed — absence is correct).
|
|
62
|
+
- Phases 2b (requesting side) + 3 (UI) consume this; not wired to the dashboard
|
|
63
|
+
UI yet.
|
|
64
|
+
|
|
65
|
+
## 6. External surfaces
|
|
66
|
+
|
|
67
|
+
New WS path `/pool-stream` (ticket-gated) + new mesh verb `pool-stream-ticket`.
|
|
68
|
+
No new HTTP route, no Telegram, no notifications. One new durable state file
|
|
69
|
+
(stream-tickets.json, names+expiry only — no secrets).
|