aicodeman 0.3.11 → 0.3.12
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/web/public/api-client.eb389d1b.js.gz +0 -0
- package/dist/web/public/{app.f337e3f8.js → app.397a8476.js} +4 -4
- package/dist/web/public/app.397a8476.js.br +0 -0
- package/dist/web/public/app.397a8476.js.gz +0 -0
- package/dist/web/public/constants.7555acc0.js.gz +0 -0
- package/dist/web/public/index.html +1 -1
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/keyboard-accessory.30cd57bd.js.gz +0 -0
- package/dist/web/public/mobile-handlers.91ad48b8.js.gz +0 -0
- package/dist/web/public/mobile.42fde818.css.gz +0 -0
- package/dist/web/public/notification-manager.2e817554.js.gz +0 -0
- package/dist/web/public/ralph-wizard.44a8d04a.js.gz +0 -0
- package/dist/web/public/styles.a4b3aefc.css.gz +0 -0
- package/dist/web/public/subagent-windows.eb8470b0.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.4c22ccd8.js.gz +0 -0
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/ws-routes.d.ts +31 -0
- package/dist/web/routes/ws-routes.d.ts.map +1 -0
- package/dist/web/routes/ws-routes.js +159 -0
- package/dist/web/routes/ws-routes.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +5 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +3 -1
- package/dist/web/public/app.f337e3f8.js.br +0 -0
- package/dist/web/public/app.f337e3f8.js.gz +0 -0
|
Binary file
|
package/dist/web/public/sw.js.gz
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -13,4 +13,5 @@ export { registerSessionRoutes } from './session-routes.js';
|
|
|
13
13
|
export { registerRespawnRoutes } from './respawn-routes.js';
|
|
14
14
|
export { registerRalphRoutes } from './ralph-routes.js';
|
|
15
15
|
export { registerPlanRoutes } from './plan-routes.js';
|
|
16
|
+
export { registerWsRoutes } from './ws-routes.js';
|
|
16
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/web/routes/index.js
CHANGED
|
@@ -13,4 +13,5 @@ export { registerSessionRoutes } from './session-routes.js';
|
|
|
13
13
|
export { registerRespawnRoutes } from './respawn-routes.js';
|
|
14
14
|
export { registerRalphRoutes } from './ralph-routes.js';
|
|
15
15
|
export { registerPlanRoutes } from './plan-routes.js';
|
|
16
|
+
export { registerWsRoutes } from './ws-routes.js';
|
|
16
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WebSocket terminal I/O route.
|
|
3
|
+
*
|
|
4
|
+
* Provides a low-latency bidirectional channel for terminal input/output,
|
|
5
|
+
* bypassing the HTTP POST + SSE path that adds per-request middleware overhead.
|
|
6
|
+
* Auth is checked once on the WebSocket upgrade handshake (cookies are included
|
|
7
|
+
* automatically by the browser). After upgrade, the connection is raw — no
|
|
8
|
+
* per-message middleware processing.
|
|
9
|
+
*
|
|
10
|
+
* Additive: the existing HTTP POST /api/sessions/:id/input and SSE session:terminal
|
|
11
|
+
* paths remain fully functional. The frontend opts into WS when available and
|
|
12
|
+
* falls back transparently.
|
|
13
|
+
*
|
|
14
|
+
* Terminal output is micro-batched at 8ms to group Ink's rapid cursor-up redraws
|
|
15
|
+
* into single frames, preventing flicker from split ANSI sequences. This matches
|
|
16
|
+
* the SSE path's server-side batching (16-50ms) but at a shorter interval since
|
|
17
|
+
* WS has no Traefik buffering overhead.
|
|
18
|
+
*
|
|
19
|
+
* Protocol (all JSON text frames):
|
|
20
|
+
* Server -> Client:
|
|
21
|
+
* {"t":"o","d":"..."} — terminal output
|
|
22
|
+
* {"t":"c"} — clear terminal
|
|
23
|
+
* {"t":"r"} — needs refresh (reload buffer)
|
|
24
|
+
* Client -> Server:
|
|
25
|
+
* {"t":"i","d":"..."} — input (keystroke or paste)
|
|
26
|
+
* {"t":"z","c":N,"r":N} — resize terminal
|
|
27
|
+
*/
|
|
28
|
+
import { FastifyInstance } from 'fastify';
|
|
29
|
+
import type { SessionPort } from '../ports/session-port.js';
|
|
30
|
+
export declare function registerWsRoutes(app: FastifyInstance, ctx: SessionPort): void;
|
|
31
|
+
//# sourceMappingURL=ws-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAwB5D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA4H7E"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WebSocket terminal I/O route.
|
|
3
|
+
*
|
|
4
|
+
* Provides a low-latency bidirectional channel for terminal input/output,
|
|
5
|
+
* bypassing the HTTP POST + SSE path that adds per-request middleware overhead.
|
|
6
|
+
* Auth is checked once on the WebSocket upgrade handshake (cookies are included
|
|
7
|
+
* automatically by the browser). After upgrade, the connection is raw — no
|
|
8
|
+
* per-message middleware processing.
|
|
9
|
+
*
|
|
10
|
+
* Additive: the existing HTTP POST /api/sessions/:id/input and SSE session:terminal
|
|
11
|
+
* paths remain fully functional. The frontend opts into WS when available and
|
|
12
|
+
* falls back transparently.
|
|
13
|
+
*
|
|
14
|
+
* Terminal output is micro-batched at 8ms to group Ink's rapid cursor-up redraws
|
|
15
|
+
* into single frames, preventing flicker from split ANSI sequences. This matches
|
|
16
|
+
* the SSE path's server-side batching (16-50ms) but at a shorter interval since
|
|
17
|
+
* WS has no Traefik buffering overhead.
|
|
18
|
+
*
|
|
19
|
+
* Protocol (all JSON text frames):
|
|
20
|
+
* Server -> Client:
|
|
21
|
+
* {"t":"o","d":"..."} — terminal output
|
|
22
|
+
* {"t":"c"} — clear terminal
|
|
23
|
+
* {"t":"r"} — needs refresh (reload buffer)
|
|
24
|
+
* Client -> Server:
|
|
25
|
+
* {"t":"i","d":"..."} — input (keystroke or paste)
|
|
26
|
+
* {"t":"z","c":N,"r":N} — resize terminal
|
|
27
|
+
*/
|
|
28
|
+
import { MAX_INPUT_LENGTH } from '../../config/terminal-limits.js';
|
|
29
|
+
/** Micro-batch interval for terminal output (ms). Short enough for low latency,
|
|
30
|
+
* long enough to group Ink's rapid cursor-up redraw sequences into single frames. */
|
|
31
|
+
const WS_BATCH_INTERVAL_MS = 8;
|
|
32
|
+
/** Flush immediately when batch exceeds this size (bytes) for responsiveness. */
|
|
33
|
+
const WS_BATCH_FLUSH_THRESHOLD = 16384;
|
|
34
|
+
/** How often to ping each WebSocket client (ms). Detects stale connections that
|
|
35
|
+
* TCP keepalive won't catch for minutes, especially through tunnels/proxies. */
|
|
36
|
+
const WS_PING_INTERVAL_MS = 30_000;
|
|
37
|
+
/** If pong isn't received within this window after a ping, terminate the socket. */
|
|
38
|
+
const WS_PONG_TIMEOUT_MS = 10_000;
|
|
39
|
+
/** DEC 2026 synchronized update markers. Wrapping output in these tells xterm.js
|
|
40
|
+
* to buffer all content and render atomically in a single frame — eliminates
|
|
41
|
+
* flicker from cursor-up redraws that Ink sends without its own sync markers
|
|
42
|
+
* (DA capability negotiation fails through the PTY→server→WS proxy chain). */
|
|
43
|
+
const DEC_2026_START = '\x1b[?2026h';
|
|
44
|
+
const DEC_2026_END = '\x1b[?2026l';
|
|
45
|
+
export function registerWsRoutes(app, ctx) {
|
|
46
|
+
app.get('/ws/sessions/:id/terminal', { websocket: true }, (socket, req) => {
|
|
47
|
+
const { id } = req.params;
|
|
48
|
+
const session = ctx.sessions.get(id);
|
|
49
|
+
if (!session) {
|
|
50
|
+
socket.close(4004, 'Session not found');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Per-connection micro-batch state
|
|
54
|
+
let batchChunks = [];
|
|
55
|
+
let batchSize = 0;
|
|
56
|
+
let batchTimer = null;
|
|
57
|
+
const flushBatch = () => {
|
|
58
|
+
batchTimer = null;
|
|
59
|
+
if (batchChunks.length === 0 || socket.readyState !== 1) {
|
|
60
|
+
batchChunks = [];
|
|
61
|
+
batchSize = 0;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const data = batchChunks.join('');
|
|
65
|
+
batchChunks = [];
|
|
66
|
+
batchSize = 0;
|
|
67
|
+
socket.send(`{"t":"o","d":${JSON.stringify(DEC_2026_START + data + DEC_2026_END)}}`);
|
|
68
|
+
};
|
|
69
|
+
// Attach message handler synchronously BEFORE any async work
|
|
70
|
+
// (@fastify/websocket requirement to avoid dropped messages).
|
|
71
|
+
socket.on('message', (raw) => {
|
|
72
|
+
try {
|
|
73
|
+
const msg = JSON.parse(String(raw));
|
|
74
|
+
if (msg.t === 'i' && typeof msg.d === 'string') {
|
|
75
|
+
if (msg.d.length > MAX_INPUT_LENGTH)
|
|
76
|
+
return;
|
|
77
|
+
session.write(msg.d);
|
|
78
|
+
}
|
|
79
|
+
else if (msg.t === 'z' &&
|
|
80
|
+
Number.isInteger(msg.c) &&
|
|
81
|
+
Number.isInteger(msg.r) &&
|
|
82
|
+
msg.c >= 1 &&
|
|
83
|
+
msg.c <= 500 &&
|
|
84
|
+
msg.r >= 1 &&
|
|
85
|
+
msg.r <= 200) {
|
|
86
|
+
session.resize(msg.c, msg.r);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Ignore malformed messages
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Terminal output -> micro-batched WS send
|
|
94
|
+
const onTerminal = (data) => {
|
|
95
|
+
batchChunks.push(data);
|
|
96
|
+
batchSize += data.length;
|
|
97
|
+
// Flush immediately for large batches (responsiveness during bulk output)
|
|
98
|
+
if (batchSize > WS_BATCH_FLUSH_THRESHOLD) {
|
|
99
|
+
if (batchTimer) {
|
|
100
|
+
clearTimeout(batchTimer);
|
|
101
|
+
}
|
|
102
|
+
flushBatch();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Start timer if not already running
|
|
106
|
+
if (!batchTimer) {
|
|
107
|
+
batchTimer = setTimeout(flushBatch, WS_BATCH_INTERVAL_MS);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const onClearTerminal = () => {
|
|
111
|
+
if (socket.readyState === 1) {
|
|
112
|
+
socket.send('{"t":"c"}');
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const onNeedsRefresh = () => {
|
|
116
|
+
if (socket.readyState === 1) {
|
|
117
|
+
socket.send('{"t":"r"}');
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
session.on('terminal', onTerminal);
|
|
121
|
+
session.on('clearTerminal', onClearTerminal);
|
|
122
|
+
session.on('needsRefresh', onNeedsRefresh);
|
|
123
|
+
// Heartbeat: detect stale connections (especially through tunnels where
|
|
124
|
+
// TCP RST can take minutes to propagate).
|
|
125
|
+
let pongTimeout = null;
|
|
126
|
+
let alive = true;
|
|
127
|
+
socket.on('pong', () => {
|
|
128
|
+
alive = true;
|
|
129
|
+
if (pongTimeout) {
|
|
130
|
+
clearTimeout(pongTimeout);
|
|
131
|
+
pongTimeout = null;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
const pingInterval = setInterval(() => {
|
|
135
|
+
if (!alive) {
|
|
136
|
+
// Previous ping never got a pong — connection is dead
|
|
137
|
+
socket.terminate();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
alive = false;
|
|
141
|
+
socket.ping();
|
|
142
|
+
pongTimeout = setTimeout(() => {
|
|
143
|
+
socket.terminate();
|
|
144
|
+
}, WS_PONG_TIMEOUT_MS);
|
|
145
|
+
}, WS_PING_INTERVAL_MS);
|
|
146
|
+
socket.on('close', () => {
|
|
147
|
+
clearInterval(pingInterval);
|
|
148
|
+
if (pongTimeout)
|
|
149
|
+
clearTimeout(pongTimeout);
|
|
150
|
+
if (batchTimer)
|
|
151
|
+
clearTimeout(batchTimer);
|
|
152
|
+
batchChunks = [];
|
|
153
|
+
session.off('terminal', onTerminal);
|
|
154
|
+
session.off('clearTerminal', onClearTerminal);
|
|
155
|
+
session.off('needsRefresh', onNeedsRefresh);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ws-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"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"}
|
package/dist/web/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
|
package/dist/web/server.js
CHANGED
|
@@ -30,6 +30,7 @@ import Fastify from 'fastify';
|
|
|
30
30
|
import fastifyCompress from '@fastify/compress';
|
|
31
31
|
import fastifyCookie from '@fastify/cookie';
|
|
32
32
|
import fastifyStatic from '@fastify/static';
|
|
33
|
+
import fastifyWebsocket from '@fastify/websocket';
|
|
33
34
|
import { join, dirname } from 'node:path';
|
|
34
35
|
import { fileURLToPath } from 'node:url';
|
|
35
36
|
import { existsSync, mkdirSync, readFileSync, chmodSync } from 'node:fs';
|
|
@@ -62,7 +63,7 @@ import { CleanupManager, KeyedDebouncer, StaleExpirationMap } from '../utils/ind
|
|
|
62
63
|
import { MAX_CONCURRENT_SESSIONS, MAX_SSE_CLIENTS } from '../config/map-limits.js';
|
|
63
64
|
import { SseEvent } from './sse-events.js';
|
|
64
65
|
import { registerAuthMiddleware, registerSecurityHeaders } from './middleware/auth.js';
|
|
65
|
-
import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerScheduledRoutes, registerHookEventRoutes, registerSystemRoutes, registerCaseRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, } from './routes/index.js';
|
|
66
|
+
import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerScheduledRoutes, registerHookEventRoutes, registerSystemRoutes, registerCaseRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, registerWsRoutes, } from './routes/index.js';
|
|
66
67
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
67
68
|
import { TERMINAL_BATCH_INTERVAL, TASK_UPDATE_BATCH_INTERVAL, STATE_UPDATE_DEBOUNCE_INTERVAL, SESSIONS_LIST_CACHE_TTL, SCHEDULED_CLEANUP_INTERVAL, SCHEDULED_RUN_MAX_AGE, SSE_HEARTBEAT_INTERVAL, SSE_PADDING_SIZE, SESSION_LIMIT_WAIT_MS, ITERATION_PAUSE_MS, BATCH_FLUSH_THRESHOLD, STATS_COLLECTION_INTERVAL_MS, INACTIVITY_TIMEOUT_MS, } from '../config/server-timing.js';
|
|
68
69
|
// SSE padding for Cloudflare tunnel buffer flushing.
|
|
@@ -429,6 +430,8 @@ export class WebServer extends EventEmitter {
|
|
|
429
430
|
this.authFailures = authState.authFailures;
|
|
430
431
|
this.qrAuthFailures = authState.qrAuthFailures;
|
|
431
432
|
}
|
|
433
|
+
// WebSocket support (terminal I/O — low-latency bidirectional channel)
|
|
434
|
+
await this.app.register(fastifyWebsocket);
|
|
432
435
|
// Security headers + CORS
|
|
433
436
|
registerSecurityHeaders(this.app, this.https);
|
|
434
437
|
// Service worker must never be cached — browsers check for SW updates on navigation
|
|
@@ -560,6 +563,7 @@ export class WebServer extends EventEmitter {
|
|
|
560
563
|
registerRespawnRoutes(this.app, ctx);
|
|
561
564
|
registerRalphRoutes(this.app, ctx);
|
|
562
565
|
registerPlanRoutes(this.app, ctx);
|
|
566
|
+
registerWsRoutes(this.app, ctx);
|
|
563
567
|
}
|
|
564
568
|
/**
|
|
565
569
|
* Start a transcript watcher for a session.
|