nterminal 1.2.79 → 1.2.81

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.
Files changed (101) hide show
  1. package/SECURITY.md +6 -0
  2. package/dist/client/assets/MarkdownPreview-Dq1fT9EP.js +1 -0
  3. package/dist/client/assets/{TranscriptMarkdownBody-9-cPRj-d.js → TranscriptMarkdownBody-DDFnUWuE.js} +1 -1
  4. package/dist/client/assets/{index-bffyLU7T.js → index-D7w92nCI.js} +1 -1
  5. package/dist/client/assets/index-Di6LPXrS.js +57 -0
  6. package/dist/client/assets/index-hoeidjW4.css +1 -0
  7. package/dist/client/index.html +2 -2
  8. package/dist/scripts/onboarding.js +10 -1
  9. package/dist/scripts/onboarding.js.map +1 -1
  10. package/dist/server/agent/agentProxy.d.ts +7 -2
  11. package/dist/server/agent/agentProxy.js +75 -9
  12. package/dist/server/agent/agentProxy.js.map +1 -1
  13. package/dist/server/agent/agentRoutes.js +199 -33
  14. package/dist/server/agent/agentRoutes.js.map +1 -1
  15. package/dist/server/agent/agentWebSocketProxy.d.ts +10 -1
  16. package/dist/server/agent/agentWebSocketProxy.js +24 -4
  17. package/dist/server/agent/agentWebSocketProxy.js.map +1 -1
  18. package/dist/server/auth/authService.d.ts +18 -4
  19. package/dist/server/auth/authService.js +57 -6
  20. package/dist/server/auth/authService.js.map +1 -1
  21. package/dist/server/eventLoopDelayMonitor.d.ts +11 -0
  22. package/dist/server/eventLoopDelayMonitor.js +37 -0
  23. package/dist/server/eventLoopDelayMonitor.js.map +1 -0
  24. package/dist/server/http.js +11 -4
  25. package/dist/server/http.js.map +1 -1
  26. package/dist/server/index.js +18 -2
  27. package/dist/server/index.js.map +1 -1
  28. package/dist/server/routes/agentManagementRoutes.d.ts +2 -1
  29. package/dist/server/routes/agentManagementRoutes.js +120 -37
  30. package/dist/server/routes/agentManagementRoutes.js.map +1 -1
  31. package/dist/server/routes/authRoutes.js +4 -1
  32. package/dist/server/routes/authRoutes.js.map +1 -1
  33. package/dist/server/routes/authenticatedSocketRegistry.d.ts +25 -0
  34. package/dist/server/routes/authenticatedSocketRegistry.js +171 -0
  35. package/dist/server/routes/authenticatedSocketRegistry.js.map +1 -0
  36. package/dist/server/routes/codeServerRoutes.d.ts +3 -1
  37. package/dist/server/routes/codeServerRoutes.js +139 -26
  38. package/dist/server/routes/codeServerRoutes.js.map +1 -1
  39. package/dist/server/routes/fileRoutes.js +1 -1
  40. package/dist/server/routes/fileRoutes.js.map +1 -1
  41. package/dist/server/routes/httpProxyBody.d.ts +2 -1
  42. package/dist/server/routes/httpProxyBody.js +8 -1
  43. package/dist/server/routes/httpProxyBody.js.map +1 -1
  44. package/dist/server/routes/socketBackpressure.d.ts +2 -0
  45. package/dist/server/routes/socketBackpressure.js +21 -10
  46. package/dist/server/routes/socketBackpressure.js.map +1 -1
  47. package/dist/server/routes/terminalRoutes.d.ts +4 -3
  48. package/dist/server/routes/terminalRoutes.js +113 -14
  49. package/dist/server/routes/terminalRoutes.js.map +1 -1
  50. package/dist/server/routes/terminalSocketMessage.d.ts +34 -0
  51. package/dist/server/routes/terminalSocketMessage.js +188 -0
  52. package/dist/server/routes/terminalSocketMessage.js.map +1 -0
  53. package/dist/server/routes/terminalWebSocket.d.ts +3 -1
  54. package/dist/server/routes/terminalWebSocket.js +191 -116
  55. package/dist/server/routes/terminalWebSocket.js.map +1 -1
  56. package/dist/server/routes/webSocketRelay.d.ts +14 -0
  57. package/dist/server/routes/webSocketRelay.js +188 -18
  58. package/dist/server/routes/webSocketRelay.js.map +1 -1
  59. package/dist/server/routes/webSocketUpgradeAuth.d.ts +5 -0
  60. package/dist/server/routes/webSocketUpgradeAuth.js +21 -0
  61. package/dist/server/routes/webSocketUpgradeAuth.js.map +1 -0
  62. package/dist/server/system/stats.d.ts +1 -1
  63. package/dist/server/system/stats.js +11 -7
  64. package/dist/server/system/stats.js.map +1 -1
  65. package/dist/server/terminal/PtyAdapter.d.ts +25 -8
  66. package/dist/server/terminal/PtyAdapter.js +12 -1
  67. package/dist/server/terminal/PtyAdapter.js.map +1 -1
  68. package/dist/server/terminal/TerminalManager.d.ts +87 -14
  69. package/dist/server/terminal/TerminalManager.js +1049 -168
  70. package/dist/server/terminal/TerminalManager.js.map +1 -1
  71. package/dist/server/terminal/TmuxPtyAdapter.d.ts +91 -15
  72. package/dist/server/terminal/TmuxPtyAdapter.js +1392 -404
  73. package/dist/server/terminal/TmuxPtyAdapter.js.map +1 -1
  74. package/dist/server/terminal/asyncCommand.d.ts +17 -0
  75. package/dist/server/terminal/asyncCommand.js +60 -0
  76. package/dist/server/terminal/asyncCommand.js.map +1 -0
  77. package/dist/server/terminal/codexTranscriptSource.d.ts +4 -4
  78. package/dist/server/terminal/codexTranscriptSource.js +91 -105
  79. package/dist/server/terminal/codexTranscriptSource.js.map +1 -1
  80. package/dist/server/terminal/outputBuffer.d.ts +5 -1
  81. package/dist/server/terminal/outputBuffer.js +29 -3
  82. package/dist/server/terminal/outputBuffer.js.map +1 -1
  83. package/dist/server/terminal/procfs.d.ts +7 -8
  84. package/dist/server/terminal/procfs.js +56 -47
  85. package/dist/server/terminal/procfs.js.map +1 -1
  86. package/dist/server/terminal/subagentSources.d.ts +15 -0
  87. package/dist/server/terminal/subagentSources.js +801 -0
  88. package/dist/server/terminal/subagentSources.js.map +1 -0
  89. package/dist/server/terminal/transcriptHistory.d.ts +2 -1
  90. package/dist/server/terminal/transcriptHistory.js +207 -49
  91. package/dist/server/terminal/transcriptHistory.js.map +1 -1
  92. package/dist/server/terminal/ttlCache.d.ts +1 -0
  93. package/dist/server/terminal/ttlCache.js +3 -0
  94. package/dist/server/terminal/ttlCache.js.map +1 -1
  95. package/dist/shared/protocol.d.ts +42 -0
  96. package/dist/shared/protocol.js +25 -2
  97. package/dist/shared/protocol.js.map +1 -1
  98. package/package.json +1 -1
  99. package/dist/client/assets/MarkdownPreview-BBppqaO6.js +0 -1
  100. package/dist/client/assets/index-B3_mYQzf.css +0 -1
  101. package/dist/client/assets/index-DAjEhbeV.js +0 -57
@@ -0,0 +1,188 @@
1
+ import { terminalInputDedupRetentionMs } from '../../shared/protocol.js';
2
+ export const terminalSocketMaxMessageBytes = 16 * 1024 * 1024;
3
+ export const terminalInputDedupEntriesPerTerminal = 1024;
4
+ export const terminalInputDedupUnconfirmedTtlMs = terminalInputDedupRetentionMs;
5
+ export const terminalInputDedupConfirmedTtlMs = terminalInputDedupRetentionMs;
6
+ export class TerminalInputDeduplicator {
7
+ maxEntriesPerTerminal;
8
+ maxTerminals;
9
+ options;
10
+ terminals = new Map();
11
+ constructor(maxEntriesPerTerminal = terminalInputDedupEntriesPerTerminal,
12
+ // Buckets can only be created through an authenticated socket for a real
13
+ // terminal and are cleared when that terminal exits. TerminalManager, not
14
+ // this delivery helper, owns the number of live terminals.
15
+ maxTerminals = Number.POSITIVE_INFINITY, options = {}) {
16
+ this.maxEntriesPerTerminal = maxEntriesPerTerminal;
17
+ this.maxTerminals = maxTerminals;
18
+ this.options = options;
19
+ }
20
+ async deliver(terminalId, messageId, write) {
21
+ if (messageId === undefined) {
22
+ return {
23
+ accepted: await write(),
24
+ duplicate: false,
25
+ saturated: false
26
+ };
27
+ }
28
+ const now = this.now();
29
+ const bucket = this.getOrCreateBucket(terminalId, now);
30
+ if (!bucket) {
31
+ return { accepted: false, duplicate: false, saturated: true };
32
+ }
33
+ if (bucket.tombstones.has(messageId)) {
34
+ return { accepted: true, duplicate: true, saturated: false };
35
+ }
36
+ const existing = bucket.entries.get(messageId);
37
+ if (existing) {
38
+ return {
39
+ accepted: await existing.promise,
40
+ duplicate: true,
41
+ saturated: false
42
+ };
43
+ }
44
+ if (!this.makeEntryRoom(bucket)) {
45
+ return { accepted: false, duplicate: false, saturated: true };
46
+ }
47
+ let resolveDelivery;
48
+ let rejectDelivery;
49
+ const promise = new Promise((resolve, reject) => {
50
+ resolveDelivery = resolve;
51
+ rejectDelivery = reject;
52
+ });
53
+ const entry = { promise, settled: false, expiresAt: null };
54
+ bucket.entries.set(messageId, entry);
55
+ try {
56
+ Promise.resolve(write()).then((accepted) => {
57
+ entry.settled = true;
58
+ entry.expiresAt = accepted
59
+ ? this.now() + this.unconfirmedTtlMs()
60
+ : null;
61
+ if (!accepted && bucket.entries.get(messageId) === entry) {
62
+ bucket.entries.delete(messageId);
63
+ this.deleteBucketIfEmpty(terminalId, bucket);
64
+ }
65
+ resolveDelivery(accepted);
66
+ }, (error) => {
67
+ entry.settled = true;
68
+ if (bucket.entries.get(messageId) === entry) {
69
+ bucket.entries.delete(messageId);
70
+ this.deleteBucketIfEmpty(terminalId, bucket);
71
+ }
72
+ rejectDelivery(error);
73
+ });
74
+ }
75
+ catch (error) {
76
+ entry.settled = true;
77
+ bucket.entries.delete(messageId);
78
+ this.deleteBucketIfEmpty(terminalId, bucket);
79
+ rejectDelivery(error);
80
+ }
81
+ return {
82
+ accepted: await promise,
83
+ duplicate: false,
84
+ saturated: false
85
+ };
86
+ }
87
+ confirm(terminalId, messageId) {
88
+ const bucket = this.terminals.get(terminalId);
89
+ if (!bucket) {
90
+ return false;
91
+ }
92
+ this.pruneExpired(bucket, this.now());
93
+ if (bucket.tombstones.has(messageId)) {
94
+ return true;
95
+ }
96
+ const entry = bucket?.entries.get(messageId);
97
+ if (!entry?.settled) {
98
+ return false;
99
+ }
100
+ bucket.entries.delete(messageId);
101
+ this.addTombstone(bucket, messageId);
102
+ return true;
103
+ }
104
+ clear(terminalId) {
105
+ this.terminals.delete(terminalId);
106
+ }
107
+ deleteBucketIfEmpty(terminalId, bucket) {
108
+ if (bucket.entries.size === 0 &&
109
+ bucket.tombstones.size === 0 &&
110
+ this.terminals.get(terminalId) === bucket) {
111
+ this.terminals.delete(terminalId);
112
+ }
113
+ }
114
+ getOrCreateBucket(terminalId, now) {
115
+ const existing = this.terminals.get(terminalId);
116
+ if (existing) {
117
+ this.pruneExpired(existing, now);
118
+ this.terminals.delete(terminalId);
119
+ this.terminals.set(terminalId, existing);
120
+ return existing;
121
+ }
122
+ this.pruneExpiredBuckets(now);
123
+ if (Number.isFinite(this.maxTerminals) &&
124
+ this.terminals.size >= this.maxTerminals) {
125
+ return null;
126
+ }
127
+ const bucket = {
128
+ entries: new Map(),
129
+ tombstones: new Map()
130
+ };
131
+ this.terminals.set(terminalId, bucket);
132
+ return bucket;
133
+ }
134
+ makeEntryRoom(bucket) {
135
+ return bucket.entries.size < this.maxEntriesPerTerminal;
136
+ }
137
+ addTombstone(bucket, messageId) {
138
+ bucket.tombstones.delete(messageId);
139
+ bucket.tombstones.set(messageId, this.now() + this.confirmedTtlMs());
140
+ while (bucket.tombstones.size > this.maxEntriesPerTerminal) {
141
+ const oldest = bucket.tombstones.keys().next().value;
142
+ if (oldest === undefined) {
143
+ break;
144
+ }
145
+ bucket.tombstones.delete(oldest);
146
+ }
147
+ }
148
+ pruneExpired(bucket, now) {
149
+ for (const [messageId, entry] of bucket.entries) {
150
+ if (entry.settled && entry.expiresAt !== null && entry.expiresAt <= now) {
151
+ bucket.entries.delete(messageId);
152
+ }
153
+ }
154
+ for (const [messageId, expiresAt] of bucket.tombstones) {
155
+ if (expiresAt <= now) {
156
+ bucket.tombstones.delete(messageId);
157
+ }
158
+ }
159
+ }
160
+ pruneExpiredBuckets(now) {
161
+ for (const [terminalId, bucket] of this.terminals) {
162
+ this.pruneExpired(bucket, now);
163
+ this.deleteBucketIfEmpty(terminalId, bucket);
164
+ }
165
+ }
166
+ now() {
167
+ return this.options.now?.() ?? Date.now();
168
+ }
169
+ unconfirmedTtlMs() {
170
+ return this.options.unconfirmedTtlMs ?? terminalInputDedupUnconfirmedTtlMs;
171
+ }
172
+ confirmedTtlMs() {
173
+ return this.options.confirmedTtlMs ?? terminalInputDedupConfirmedTtlMs;
174
+ }
175
+ }
176
+ export function terminalSocketMessageTooLarge(data) {
177
+ return rawDataByteLength(data) > terminalSocketMaxMessageBytes;
178
+ }
179
+ function rawDataByteLength(data) {
180
+ if (Buffer.isBuffer(data)) {
181
+ return data.byteLength;
182
+ }
183
+ if (Array.isArray(data)) {
184
+ return data.reduce((total, chunk) => total + chunk.byteLength, 0);
185
+ }
186
+ return data.byteLength;
187
+ }
188
+ //# sourceMappingURL=terminalSocketMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalSocketMessage.js","sourceRoot":"","sources":["../../../src/server/routes/terminalSocketMessage.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,10 @@ import type { FastifyInstance } from 'fastify';
2
2
  import { type AppConfig } from '../config.js';
3
3
  import type { AuthService } from '../auth/authService.js';
4
4
  import type { TerminalManager } from '../terminal/TerminalManager.js';
5
+ import type { AuthenticatedSocketRegistry } from './authenticatedSocketRegistry.js';
6
+ export declare const terminalSocketProcessInstanceId: `${string}-${string}-${string}-${string}-${string}`;
5
7
  export interface TerminalWebSocketServices {
6
8
  authService: AuthService;
7
9
  terminalManager: TerminalManager;
8
10
  }
9
- export declare function registerTerminalWebSocket(app: FastifyInstance, config: AppConfig, services: TerminalWebSocketServices): Promise<void>;
11
+ export declare function registerTerminalWebSocket(app: FastifyInstance, config: AppConfig, services: TerminalWebSocketServices, authenticatedSocketRegistry: AuthenticatedSocketRegistry): Promise<void>;
@@ -2,138 +2,213 @@ import WebSocket from 'ws';
2
2
  import { isAllowedOrigin } from '../config.js';
3
3
  import { parseClientTerminalMessage } from '../../shared/protocol.js';
4
4
  import { authenticateTerminalRequest } from './terminalRoutes.js';
5
- import { SocketBackpressure } from './socketBackpressure.js';
6
- // Bytes pending in this socket's outbound buffer before we ask the PTY to
7
- // pause. 1 MB is enough to absorb normal interactive spikes but small enough
8
- // that a stalled client can't grow it unbounded.
9
- const PAUSE_HIGH_WATER_BYTES = 1 << 20;
10
- // Resume once the buffer drains back below this — gives the socket headroom
11
- // before the next pause/resume cycle.
12
- const PAUSE_LOW_WATER_BYTES = 64 << 10;
13
- // How often to poll bufferedAmount while paused. ws doesn't emit a drain
14
- // event we can hook here, so we sample on a coarse interval.
15
- const DRAIN_POLL_MS = 50;
16
- export async function registerTerminalWebSocket(app, config, services) {
17
- app.get('/api/terminals/:id/ws', { websocket: true }, async (socket, request) => {
18
- if (!request.headers.origin) {
19
- request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'origin_required' }, 'terminal websocket rejected');
20
- socket.close(1008, 'origin required');
21
- return;
22
- }
23
- if (!isAllowedOrigin(config, request.headers.origin)) {
24
- request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'origin_not_allowed' }, 'terminal websocket rejected');
25
- socket.close(1008, 'origin not allowed');
26
- return;
27
- }
28
- const auth = await authenticateTerminalRequest(services.authService, request);
29
- if (!auth) {
30
- request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'auth_failed' }, 'terminal websocket rejected');
31
- socket.close(1008, 'unauthorized');
32
- return;
33
- }
34
- const terminalId = request.params.id;
35
- let snapshotSent = false;
36
- const pendingMessages = [];
37
- // Forward-declared so the subscriber closure (registered below) and the
38
- // backpressure sink can both reference it. Assigned exactly once before
39
- // any send occurs, so the optional chains in the sink stay null-safe
40
- // without ever actually hitting null in practice.
41
- let attachment = null;
42
- const backpressure = new SocketBackpressure({
43
- get bufferedAmount() {
44
- return socket.bufferedAmount;
45
- },
46
- isOpen: () => socket.readyState === WebSocket.OPEN
47
- }, {
48
- pause: () => attachment?.pause(),
49
- resume: () => attachment?.resume()
50
- }, {
51
- highWaterBytes: PAUSE_HIGH_WATER_BYTES,
52
- lowWaterBytes: PAUSE_LOW_WATER_BYTES,
53
- pollMs: DRAIN_POLL_MS
54
- });
55
- const sendWithBackpressure = (message) => {
56
- sendJson(socket, message);
57
- backpressure.observe();
58
- };
59
- attachment = services.terminalManager.attachTerminal(terminalId, (message) => {
60
- if (!snapshotSent) {
61
- pendingMessages.push(message);
62
- return;
63
- }
64
- sendWithBackpressure(message);
65
- }, { replay: false });
66
- if (!attachment) {
67
- backpressure.dispose();
68
- socket.close(1008, 'terminal not found');
69
- return;
70
- }
71
- sendWithBackpressure({ type: 'snapshot', terminal: attachment.terminal, output: attachment.output, history: attachment.history });
72
- snapshotSent = true;
73
- for (const message of pendingMessages) {
74
- sendWithBackpressure(message);
75
- }
76
- pendingMessages.length = 0;
77
- let isAlive = true;
78
- const heartbeat = setInterval(() => {
79
- if (socket.readyState !== WebSocket.OPEN) {
5
+ import { SocketBackpressure, terminalSocketBackpressureOptions } from './socketBackpressure.js';
6
+ import { TerminalInputDeduplicator, terminalSocketMessageTooLarge } from './terminalSocketMessage.js';
7
+ import { pauseWebSocketDuringSetup } from './webSocketRelay.js';
8
+ import { preValidateBrowserWebSocketUpgrade } from './webSocketUpgradeAuth.js';
9
+ export const terminalSocketProcessInstanceId = crypto.randomUUID();
10
+ export async function registerTerminalWebSocket(app, config, services, authenticatedSocketRegistry) {
11
+ const inputDeduplicator = new TerminalInputDeduplicator();
12
+ app.get('/api/terminals/:id/ws', {
13
+ websocket: true,
14
+ preValidation: (request, reply) => preValidateBrowserWebSocketUpgrade(config, services.authService, request, reply)
15
+ }, async (socket, request) => {
16
+ const resumeSetup = pauseWebSocketDuringSetup(socket);
17
+ try {
18
+ if (!request.headers.origin) {
19
+ request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'origin_required' }, 'terminal websocket rejected');
20
+ socket.close(1008, 'origin required');
80
21
  return;
81
22
  }
82
- if (!isAlive) {
83
- socket.terminate();
23
+ if (!isAllowedOrigin(config, request.headers.origin)) {
24
+ request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'origin_not_allowed' }, 'terminal websocket rejected');
25
+ socket.close(1008, 'origin not allowed');
84
26
  return;
85
27
  }
86
- isAlive = false;
87
- socket.ping();
88
- }, 30_000);
89
- socket.on('pong', () => {
90
- isAlive = true;
91
- });
92
- socket.on('message', (raw) => {
93
- const message = parseClientTerminalMessage(raw.toString());
94
- if (!message) {
95
- sendJson(socket, { type: 'error', message: 'invalid terminal message' });
28
+ const auth = await authenticateTerminalRequest(services.authService, request);
29
+ if (!auth) {
30
+ request.log.warn({ event: 'terminal_ws_rejected', terminalId: request.params.id, reason: 'auth_failed' }, 'terminal websocket rejected');
31
+ socket.close(1008, 'unauthorized');
96
32
  return;
97
33
  }
98
- if (message.type === 'ping') {
99
- sendJson(socket, { type: 'pong', nonce: message.nonce });
34
+ const socketRegistration = authenticatedSocketRegistry.register(socket, auth);
35
+ if (!socketRegistration) {
36
+ socket.close(1008, 'unauthorized');
100
37
  return;
101
38
  }
102
- if (message.terminalId !== terminalId) {
103
- sendJson(socket, { type: 'error', message: 'terminal id mismatch' });
104
- return;
105
- }
106
- if (message.type === 'refresh_cwd') {
107
- void services.terminalManager.refreshTerminalCwd(message.terminalId);
108
- return;
109
- }
110
- if (message.type === 'scrollback_scroll') {
111
- if (!services.terminalManager.scrollTerminalScrollback(message.terminalId, message.lines)) {
112
- sendJson(socket, { type: 'error', message: 'terminal scrollback is unavailable' });
39
+ const terminalId = request.params.id;
40
+ let snapshotSent = false;
41
+ const pendingMessages = [];
42
+ // Forward-declared so the subscriber closure (registered below) and the
43
+ // backpressure sink can both reference it. Assigned exactly once before
44
+ // any send occurs, so the optional chains in the sink stay null-safe
45
+ // without ever actually hitting null in practice.
46
+ let attachment = null;
47
+ const backpressure = new SocketBackpressure({
48
+ get bufferedAmount() {
49
+ return socket.bufferedAmount;
50
+ },
51
+ isOpen: () => socket.readyState === WebSocket.OPEN
52
+ }, {
53
+ pause: () => {
54
+ // A terminal can have multiple viewers. Pausing the shared PTY for
55
+ // one slow browser would freeze every viewer and eventually the
56
+ // child process itself, so isolate this consumer and let it
57
+ // reconnect from the retained output snapshot.
58
+ socketRegistration.unregister();
59
+ attachment?.dispose();
60
+ if (socket.readyState === WebSocket.OPEN) {
61
+ socket.close(1013, 'terminal client too slow');
62
+ }
63
+ },
64
+ resume: () => undefined
65
+ }, terminalSocketBackpressureOptions);
66
+ const sendWithBackpressure = (message) => {
67
+ if (!socketRegistration.isActive() || socket.readyState !== WebSocket.OPEN) {
68
+ return;
113
69
  }
114
- return;
115
- }
116
- if (message.type === 'cancel_scrollback') {
117
- if (!services.terminalManager.cancelTerminalScrollbackMode(message.terminalId)) {
118
- sendJson(socket, { type: 'error', message: 'terminal scrollback is unavailable' });
70
+ sendJson(socket, message);
71
+ backpressure.observe();
72
+ };
73
+ attachment = await services.terminalManager.attachTerminalAsync(terminalId, (message) => {
74
+ if (message.type === 'exit') {
75
+ inputDeduplicator.clear(terminalId);
76
+ }
77
+ if (!snapshotSent) {
78
+ pendingMessages.push(message);
79
+ return;
119
80
  }
81
+ sendWithBackpressure(message);
82
+ }, { replay: false });
83
+ if (!attachment) {
84
+ inputDeduplicator.clear(terminalId);
85
+ backpressure.dispose();
86
+ socketRegistration.unregister();
87
+ socket.close(1008, 'terminal not found');
120
88
  return;
121
89
  }
122
- if (message.type === 'input') {
123
- if (!services.terminalManager.writeToTerminal(message.terminalId, message.data, { cancelScrollbackMode: message.cancelScrollbackMode === true })) {
124
- sendJson(socket, { type: 'error', message: 'terminal is not writable' });
90
+ let isAlive = true;
91
+ const heartbeat = setInterval(() => {
92
+ if (socket.readyState !== WebSocket.OPEN) {
93
+ return;
94
+ }
95
+ if (!isAlive) {
96
+ socket.terminate();
97
+ return;
125
98
  }
99
+ isAlive = false;
100
+ socket.ping();
101
+ }, 30_000);
102
+ socket.on('pong', () => {
103
+ isAlive = true;
104
+ });
105
+ let cleanedUp = false;
106
+ let removeInvalidationListener = () => undefined;
107
+ const cleanup = () => {
108
+ if (cleanedUp) {
109
+ return;
110
+ }
111
+ cleanedUp = true;
112
+ removeInvalidationListener();
113
+ socketRegistration.unregister();
114
+ clearInterval(heartbeat);
115
+ backpressure.dispose();
116
+ attachment?.dispose();
117
+ };
118
+ socket.on('message', (raw) => {
119
+ if (!socketRegistration.isActive()) {
120
+ return;
121
+ }
122
+ if (terminalSocketMessageTooLarge(raw)) {
123
+ cleanup();
124
+ socket.close(1009, 'terminal message too large');
125
+ return;
126
+ }
127
+ const message = parseClientTerminalMessage(raw.toString());
128
+ if (!message) {
129
+ sendWithBackpressure({ type: 'error', message: 'invalid terminal message' });
130
+ return;
131
+ }
132
+ if (message.type === 'ping') {
133
+ sendWithBackpressure({ type: 'pong', nonce: message.nonce });
134
+ return;
135
+ }
136
+ if (message.terminalId !== terminalId) {
137
+ sendWithBackpressure({ type: 'error', message: 'terminal id mismatch' });
138
+ return;
139
+ }
140
+ if (message.type === 'input_ack_received') {
141
+ inputDeduplicator.confirm(message.terminalId, message.messageId);
142
+ sendWithBackpressure({
143
+ type: 'input_ack_confirmed',
144
+ terminalId: message.terminalId,
145
+ messageId: message.messageId
146
+ });
147
+ return;
148
+ }
149
+ if (message.type === 'refresh_cwd') {
150
+ void services.terminalManager.refreshTerminalCwd(message.terminalId);
151
+ return;
152
+ }
153
+ if (message.type === 'scrollback_scroll') {
154
+ void services.terminalManager.scrollTerminalScrollback(message.terminalId, message.lines, { canExecute: socketRegistration.isActive }).then((ok) => {
155
+ if (!ok)
156
+ sendWithBackpressure({ type: 'error', message: 'terminal scrollback is unavailable' });
157
+ }, () => sendWithBackpressure({ type: 'error', message: 'terminal scrollback is unavailable' }));
158
+ return;
159
+ }
160
+ if (message.type === 'cancel_scrollback') {
161
+ void services.terminalManager.cancelTerminalScrollbackMode(message.terminalId, { canExecute: socketRegistration.isActive }).then((ok) => {
162
+ if (!ok)
163
+ sendWithBackpressure({ type: 'error', message: 'terminal scrollback is unavailable' });
164
+ }, () => sendWithBackpressure({ type: 'error', message: 'terminal scrollback is unavailable' }));
165
+ return;
166
+ }
167
+ if (message.type === 'input') {
168
+ void inputDeduplicator.deliver(message.terminalId, message.messageId, () => services.terminalManager.writeToTerminal(message.terminalId, message.data, {
169
+ cancelScrollbackMode: message.cancelScrollbackMode === true,
170
+ canExecute: socketRegistration.isActive
171
+ })).then((result) => {
172
+ if (!result.accepted) {
173
+ sendWithBackpressure({ type: 'error', message: 'terminal is not writable' });
174
+ return;
175
+ }
176
+ if (message.messageId) {
177
+ sendWithBackpressure({
178
+ type: 'input_ack',
179
+ terminalId: message.terminalId,
180
+ messageId: message.messageId
181
+ });
182
+ }
183
+ }, () => sendWithBackpressure({ type: 'error', message: 'terminal is not writable' }));
184
+ return;
185
+ }
186
+ if (!services.terminalManager.resizeTerminal(message.terminalId, message.cols, message.rows)) {
187
+ sendWithBackpressure({ type: 'error', message: 'terminal is not resizable' });
188
+ }
189
+ });
190
+ removeInvalidationListener = socketRegistration.onInvalidated(cleanup);
191
+ socket.on('close', cleanup);
192
+ socket.on('error', cleanup);
193
+ if (!socketRegistration.isActive() || socket.readyState !== WebSocket.OPEN) {
126
194
  return;
127
195
  }
128
- if (!services.terminalManager.resizeTerminal(message.terminalId, message.cols, message.rows)) {
129
- sendJson(socket, { type: 'error', message: 'terminal is not resizable' });
196
+ sendWithBackpressure({
197
+ type: 'terminal_protocol',
198
+ inputAck: true,
199
+ instanceId: terminalSocketProcessInstanceId
200
+ });
201
+ resumeSetup();
202
+ sendWithBackpressure({ type: 'snapshot', terminal: attachment.terminal, output: attachment.output, history: attachment.history });
203
+ snapshotSent = true;
204
+ for (const message of pendingMessages) {
205
+ sendWithBackpressure(message);
130
206
  }
131
- });
132
- socket.on('close', () => {
133
- clearInterval(heartbeat);
134
- backpressure.dispose();
135
- attachment?.dispose();
136
- });
207
+ pendingMessages.length = 0;
208
+ }
209
+ finally {
210
+ resumeSetup();
211
+ }
137
212
  });
138
213
  }
139
214
  function sendJson(socket, payload) {
@@ -1 +1 @@
1
- {"version":3,"file":"terminalWebSocket.js","sourceRoot":"","sources":["../../../src/server/routes/terminalWebSocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terminalWebSocket.js","sourceRoot":"","sources":["../../../src/server/routes/terminalWebSocket.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,22 @@ interface WebSocketRelayOptions {
5
5
  pendingMessageOverflowCode?: number;
6
6
  pendingByteOverflowCode?: number;
7
7
  pendingOverflowReason?: string;
8
+ isClientActive?: () => boolean;
9
+ onClientInvalidated?: (listener: (code: number, reason: string) => void) => () => void;
8
10
  onClientMessage?: () => void;
9
11
  onUpstreamMessage?: () => void;
12
+ maxClientMessageBytes?: number;
13
+ maxUpstreamMessageBytes?: number;
14
+ mapUpstreamClose?: (code: number, reason: string) => {
15
+ code: number;
16
+ reason: string;
17
+ };
18
+ mapUpstreamUnexpectedResponse?: (statusCode: number) => {
19
+ code: number;
20
+ reason: string;
21
+ };
10
22
  }
23
+ export declare const outboundWebSocketMaxPayloadBytes: number;
24
+ export declare function pauseWebSocketDuringSetup(socket: WebSocket): () => void;
11
25
  export declare function relayWebSocketPair(clientSocket: WebSocket, upstreamSocket: WebSocket, options?: WebSocketRelayOptions): void;
12
26
  export {};