ds-harness-remote 0.4.16 → 0.4.17

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 (39) hide show
  1. package/dist/client-runtime.js +1 -1
  2. package/dist/client-runtime.js.map +1 -1
  3. package/dist/client.github.js +57 -18
  4. package/dist/client.js +57 -18
  5. package/dist/client.js.map +1 -1
  6. package/dist/codex/domain.d.ts +2 -0
  7. package/dist/codex/domain.d.ts.map +1 -1
  8. package/dist/codex/domain.js +15 -0
  9. package/dist/codex/domain.js.map +1 -1
  10. package/dist/codex/session-id.d.ts +10 -0
  11. package/dist/codex/session-id.d.ts.map +1 -0
  12. package/dist/codex/session-id.js +15 -0
  13. package/dist/codex/session-id.js.map +1 -0
  14. package/dist/codex/virtual-harness.d.ts +3 -2
  15. package/dist/codex/virtual-harness.d.ts.map +1 -1
  16. package/dist/codex/virtual-harness.js +32 -3
  17. package/dist/codex/virtual-harness.js.map +1 -1
  18. package/dist/codex-workspace-bridge.d.ts +108 -0
  19. package/dist/codex-workspace-bridge.d.ts.map +1 -0
  20. package/dist/codex-workspace-bridge.js +475 -0
  21. package/dist/codex-workspace-bridge.js.map +1 -0
  22. package/dist/harness-remote-bridge.d.ts +4 -2
  23. package/dist/harness-remote-bridge.d.ts.map +1 -1
  24. package/dist/harness-remote-bridge.js +22 -2
  25. package/dist/harness-remote-bridge.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +616 -78
  28. package/dist/index.js.map +4 -4
  29. package/dist/service.d.ts +7 -1
  30. package/dist/service.d.ts.map +1 -1
  31. package/dist/service.js +8 -2
  32. package/dist/service.js.map +1 -1
  33. package/dist/terminal-policy.d.ts.map +1 -1
  34. package/dist/terminal-policy.js +8 -2
  35. package/dist/terminal-policy.js.map +1 -1
  36. package/dist/version.d.ts +1 -1
  37. package/dist/version.js +1 -1
  38. package/dsh-plugin.json +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,108 @@
1
+ import type { TypertRpcResult } from './typert-gateway-contract.js';
2
+ export declare class CodexWorkspaceState {
3
+ readonly terminals: Map<string, TerminalContext>;
4
+ }
5
+ export type CodexCwdResolver = (threadId: string, signal: AbortSignal) => Promise<string | undefined>;
6
+ interface ShellSpec {
7
+ path: string;
8
+ args: string[];
9
+ name: string;
10
+ }
11
+ /** Request for one Host-owned terminal process. */
12
+ export interface RemoteTerminalSpec {
13
+ argv: readonly string[];
14
+ cwd: string;
15
+ cols: number;
16
+ rows: number;
17
+ terminalType: string;
18
+ env: Record<string, string>;
19
+ }
20
+ /** Terminal process surface the bridge needs; PTY-backed when the Host provides one. */
21
+ export interface RemoteTerminalProcess {
22
+ output: AsyncIterable<string>;
23
+ write(data: string): void | Promise<void>;
24
+ resize(cols: number, rows: number): void | Promise<void>;
25
+ terminate(): void | Promise<void>;
26
+ completed: Promise<{
27
+ exitCode: number | null;
28
+ }>;
29
+ }
30
+ export type RemoteTerminalSpawner = (spec: RemoteTerminalSpec) => Promise<RemoteTerminalProcess>;
31
+ /** Structural view of the Host `subprocess` service this carrier can use. */
32
+ export interface HostSubprocessLike {
33
+ spawnTerminal(spec: Record<string, unknown>): Promise<unknown>;
34
+ }
35
+ interface TerminalContext {
36
+ sessionId: string;
37
+ id: string;
38
+ title: string;
39
+ shell: ShellSpec;
40
+ cwd: string;
41
+ cols: number;
42
+ rows: number;
43
+ process?: RemoteTerminalProcess;
44
+ /** Attachment that currently owns input; absent while nobody is attached. */
45
+ controllerId?: string;
46
+ /** Monotonic across the Host terminal lifetime and never reset on reconnect. */
47
+ sequence: number;
48
+ /** Bounded raw output replayed to a reconnecting emulator. */
49
+ screen: string[];
50
+ screenBytes: number;
51
+ truncated: boolean;
52
+ subscribers: Set<AsyncQueue<unknown>>;
53
+ state: 'running' | 'exited' | 'failed';
54
+ exitCode: number | null;
55
+ error?: string;
56
+ }
57
+ declare class AsyncQueue<T> implements AsyncIterable<T> {
58
+ private values;
59
+ private waiters;
60
+ private ended;
61
+ push(value: T): void;
62
+ end(): void;
63
+ next(): Promise<IteratorResult<T>>;
64
+ [Symbol.asyncIterator](): AsyncIterator<T>;
65
+ }
66
+ /** Host-owned CodeX file and terminal carrier used by Harness Remote RPC. */
67
+ export declare class CodexWorkspaceBridge {
68
+ private readonly resolveCwd;
69
+ private readonly terminalEnabled;
70
+ private readonly terminals;
71
+ private readonly ownedSubscribers;
72
+ private readonly spawnTerminal;
73
+ constructor(resolveCwd: CodexCwdResolver, terminalEnabled: () => boolean, state?: CodexWorkspaceState, spawnTerminal?: RemoteTerminalSpawner);
74
+ isCodeXScope(value: unknown): boolean;
75
+ call(endpoint: string, payload: unknown, signal: AbortSignal): Promise<TypertRpcResult | undefined>;
76
+ open(endpoint: string, payload: unknown, signal: AbortSignal): Promise<AsyncIterable<unknown> | undefined>;
77
+ closeAll(): Promise<void>;
78
+ private fileCall;
79
+ private watchChanges;
80
+ /**
81
+ * `terminal/retain` only acknowledges the retention window: it never takes
82
+ * input ownership and never replays output. Recovery reads the next snapshot.
83
+ */
84
+ private retain;
85
+ /** `terminal/follow` takes input ownership and starts with a screen snapshot. */
86
+ private follow;
87
+ private terminalCall;
88
+ private createTerminal;
89
+ /** Streams process output as ordered `output` frames, then reports the exit. */
90
+ private pump;
91
+ private appendScreen;
92
+ private rootFor;
93
+ private safePath;
94
+ private emit;
95
+ private endSubscribers;
96
+ private requireTerminal;
97
+ private assertTerminalEnabled;
98
+ private disposeTerminal;
99
+ }
100
+ /** Default terminal process: a plain child process, used when the Host exposes no PTY provider. */
101
+ export declare function pipeTerminalSpawner(): RemoteTerminalSpawner;
102
+ /**
103
+ * Terminal process backed by the Host `subprocess` service, which owns PTY
104
+ * allocation, containment, and process-range termination.
105
+ */
106
+ export declare function subprocessTerminalSpawner(subprocess: HostSubprocessLike): RemoteTerminalSpawner;
107
+ export {};
108
+ //# sourceMappingURL=codex-workspace-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-workspace-bridge.d.ts","sourceRoot":"","sources":["../src/codex-workspace-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,475 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { realpath, lstat, readdir, readFile, stat, watch } from 'node:fs/promises';
3
+ import { isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { RpcError } from './safe-error.js';
5
+ import { parseCodexSessionId } from './codex/session-id.js';
6
+ const MAX_READ_BYTES = 4 * 1024 * 1024;
7
+ const MAX_INPUT_BYTES = 64 * 1024;
8
+ const MAX_COLS = 240;
9
+ const MAX_ROWS = 100;
10
+ const MAX_TERMINALS = 256;
11
+ /** Replay journal bound for one terminal; the newest output always survives. */
12
+ const MAX_SCREEN_BYTES = 256 * 1024;
13
+ /** Advertised scrollback rows, matching the official terminal environment shape. */
14
+ const TERMINAL_SCROLLBACK = 2000;
15
+ const TERMINAL_TYPE = 'xterm-256color';
16
+ export class CodexWorkspaceState {
17
+ terminals = new Map();
18
+ }
19
+ /** One shell this carrier can start; the client only ever picks from `terminal/shells`. */
20
+ const DEFAULT_SHELL = process.platform === 'win32'
21
+ ? { path: 'cmd.exe', args: [], name: 'Command Prompt' }
22
+ : { path: '/bin/sh', args: [], name: 'sh' };
23
+ class AsyncQueue {
24
+ values = [];
25
+ waiters = [];
26
+ ended = false;
27
+ push(value) {
28
+ if (this.ended)
29
+ return;
30
+ const waiter = this.waiters.shift();
31
+ if (waiter)
32
+ waiter({ done: false, value });
33
+ else
34
+ this.values.push(value);
35
+ }
36
+ end() {
37
+ this.ended = true;
38
+ while (this.waiters.length)
39
+ this.waiters.shift()({ done: true, value: undefined });
40
+ }
41
+ next() {
42
+ const value = this.values.shift();
43
+ if (value !== undefined)
44
+ return Promise.resolve({ done: false, value });
45
+ if (this.ended)
46
+ return Promise.resolve({ done: true, value: undefined });
47
+ return new Promise(resolve => this.waiters.push(resolve));
48
+ }
49
+ [Symbol.asyncIterator]() { return this; }
50
+ }
51
+ /** Host-owned CodeX file and terminal carrier used by Harness Remote RPC. */
52
+ export class CodexWorkspaceBridge {
53
+ resolveCwd;
54
+ terminalEnabled;
55
+ terminals;
56
+ ownedSubscribers = new Set();
57
+ spawnTerminal;
58
+ constructor(resolveCwd, terminalEnabled, state = new CodexWorkspaceState(), spawnTerminal = pipeTerminalSpawner()) {
59
+ this.resolveCwd = resolveCwd;
60
+ this.terminalEnabled = terminalEnabled;
61
+ this.terminals = state.terminals;
62
+ this.spawnTerminal = spawnTerminal;
63
+ }
64
+ isCodeXScope(value) {
65
+ return parseCodexSessionId(value) !== undefined;
66
+ }
67
+ async call(endpoint, payload, signal) {
68
+ const args = argsOf(payload);
69
+ const scope = args.workspaceFileScopeId;
70
+ const session = args.agentId ?? args.sessionId;
71
+ const raw = scope ?? session;
72
+ const codex = parseCodexSessionId(raw);
73
+ if (codex === undefined) {
74
+ if (typeof raw === 'string' && raw.startsWith('codex:'))
75
+ throw new RpcError('CODEX_SESSION_INVALID', 'The CodeX session identifier is invalid.');
76
+ return undefined;
77
+ }
78
+ if (endpoint.startsWith('workspaceFiles/'))
79
+ return this.fileCall(endpoint, codex.sessionId, args, signal);
80
+ if (endpoint.startsWith('terminal/'))
81
+ return this.terminalCall(endpoint, codex.sessionId, args, signal);
82
+ return undefined;
83
+ }
84
+ async open(endpoint, payload, signal) {
85
+ const args = argsOf(payload);
86
+ const raw = args.workspaceFileScopeId ?? args.agentId ?? args.sessionId;
87
+ const codex = parseCodexSessionId(raw);
88
+ if (codex === undefined) {
89
+ if (typeof raw === 'string' && raw.startsWith('codex:'))
90
+ throw new RpcError('CODEX_SESSION_INVALID', 'The CodeX session identifier is invalid.');
91
+ return undefined;
92
+ }
93
+ if (endpoint === 'workspaceFiles/changes')
94
+ return this.watchChanges(codex.sessionId, args, signal);
95
+ if (endpoint === 'terminal/retain')
96
+ return this.retain(codex.sessionId, args, signal);
97
+ if (endpoint === 'terminal/follow')
98
+ return this.follow(codex.sessionId, args, signal);
99
+ return undefined;
100
+ }
101
+ async closeAll() {
102
+ // A transport disconnect closes subscriptions but retains Host-owned terminal
103
+ // processes so a reconnect can use terminal/retain, matching Harness policy.
104
+ for (const queue of this.ownedSubscribers)
105
+ queue.end();
106
+ this.ownedSubscribers.clear();
107
+ }
108
+ async fileCall(endpoint, sessionId, args, signal) {
109
+ const root = await this.rootFor(sessionId, signal);
110
+ const path = typeof args.path === 'string' ? args.path : '.';
111
+ const target = await this.safePath(root, path, endpoint === 'workspaceFiles/list');
112
+ try {
113
+ if (endpoint === 'workspaceFiles/list') {
114
+ const entries = await readdir(target, { withFileTypes: true });
115
+ const result = [];
116
+ for (const entry of entries.slice(0, 500)) {
117
+ const item = join(target, entry.name);
118
+ const info = await lstat(item);
119
+ if (info.isSymbolicLink())
120
+ continue;
121
+ result.push({ name: entry.name, type: info.isDirectory() ? 'directory' : info.isFile() ? 'file' : 'other', ...(info.isFile() ? { size: info.size } : {}) });
122
+ }
123
+ return { ok: true, value: { path, entries: result, truncated: entries.length > 500 } };
124
+ }
125
+ const info = await stat(target);
126
+ if (endpoint === 'workspaceFiles/stat')
127
+ return { ok: true, value: { path, type: info.isDirectory() ? 'directory' : info.isFile() ? 'file' : 'other', size: info.size, modifiedAt: info.mtimeMs } };
128
+ if (!info.isFile())
129
+ throw new RpcError('CODEX_WORKSPACE_INVALID_PATH', 'The requested workspace path is not a file.');
130
+ const offset = readOffset(args);
131
+ const limit = readLimit(args);
132
+ const bytes = await readFile(target);
133
+ if (bytes.byteLength > MAX_READ_BYTES)
134
+ throw new RpcError('CODEX_WORKSPACE_TOO_LARGE', 'The requested workspace file is too large.');
135
+ if (endpoint === 'workspaceFiles/readBytes') {
136
+ const slice = bytes.subarray(offset, Math.min(offset + limit, bytes.length));
137
+ return { ok: true, value: { path, offset, bytes: slice.toString('base64'), eof: offset + slice.length >= bytes.length } };
138
+ }
139
+ const text = bytes.toString('utf8');
140
+ const slice = text.slice(offset, offset + limit);
141
+ return { ok: true, value: { absolutePath: target, version: `${info.mtimeMs}:${info.size}`, text: slice, offset, lines: slice.split('\n').length, eof: offset + slice.length >= text.length } };
142
+ }
143
+ catch (error) {
144
+ if (error instanceof RpcError)
145
+ throw error;
146
+ throw new RpcError('CODEX_WORKSPACE_UNAVAILABLE', 'The CodeX workspace file is unavailable.');
147
+ }
148
+ }
149
+ async watchChanges(sessionId, args, signal) {
150
+ const root = await this.rootFor(sessionId, signal);
151
+ const target = await this.safePath(root, typeof args.path === 'string' ? args.path : '.', true);
152
+ const queue = new AsyncQueue();
153
+ const watcher = watch(target, { recursive: false });
154
+ const abort = () => { watcher.return?.(); queue.end(); };
155
+ signal.addEventListener('abort', abort, { once: true });
156
+ void (async () => {
157
+ try {
158
+ for await (const event of watcher)
159
+ queue.push({ type: event.eventType, path: event.filename ?? '' });
160
+ }
161
+ catch { /* stream close is reported by the gateway */ }
162
+ finally {
163
+ signal.removeEventListener('abort', abort);
164
+ queue.end();
165
+ }
166
+ })();
167
+ return queue;
168
+ }
169
+ /**
170
+ * `terminal/retain` only acknowledges the retention window: it never takes
171
+ * input ownership and never replays output. Recovery reads the next snapshot.
172
+ */
173
+ async retain(sessionId, args, signal) {
174
+ this.assertTerminalEnabled();
175
+ await this.rootFor(sessionId, signal);
176
+ this.requireTerminal(sessionId, String(args.id));
177
+ const queue = new AsyncQueue();
178
+ queue.push({ type: 'retained' });
179
+ this.ownedSubscribers.add(queue);
180
+ signal.addEventListener('abort', () => { this.ownedSubscribers.delete(queue); queue.end(); }, { once: true });
181
+ return queue;
182
+ }
183
+ /** `terminal/follow` takes input ownership and starts with a screen snapshot. */
184
+ async follow(sessionId, args, signal) {
185
+ this.assertTerminalEnabled();
186
+ await this.rootFor(sessionId, signal);
187
+ const attachmentId = typeof args.attachmentId === 'string' && args.attachmentId.length > 0 ? args.attachmentId : undefined;
188
+ if (attachmentId === undefined)
189
+ throw new RpcError('INVALID_MESSAGE', 'The terminal attachment is invalid.');
190
+ const terminal = this.requireTerminal(sessionId, String(args.id));
191
+ const queue = new AsyncQueue();
192
+ if (terminal.controllerId !== attachmentId) {
193
+ terminal.controllerId = attachmentId;
194
+ // Existing followers keep their output but lose input to the new attachment.
195
+ this.emit(terminal, { type: 'state', info: terminalInfo(terminal) });
196
+ }
197
+ queue.push({ type: 'snapshot', sequence: terminal.sequence, screen: screenOf(terminal), info: terminalInfo(terminal) });
198
+ terminal.subscribers.add(queue);
199
+ this.ownedSubscribers.add(queue);
200
+ signal.addEventListener('abort', () => {
201
+ terminal.subscribers.delete(queue);
202
+ this.ownedSubscribers.delete(queue);
203
+ queue.end();
204
+ if (terminal.controllerId === attachmentId) {
205
+ terminal.controllerId = undefined;
206
+ this.emit(terminal, { type: 'state', info: terminalInfo(terminal) });
207
+ }
208
+ }, { once: true });
209
+ return queue;
210
+ }
211
+ async terminalCall(endpoint, sessionId, args, signal) {
212
+ this.assertTerminalEnabled();
213
+ const cwd = await this.rootFor(sessionId, signal);
214
+ if (endpoint === 'terminal/environment') {
215
+ return { ok: true, value: { cwd, maxInputBytes: MAX_INPUT_BYTES, maxCols: MAX_COLS, maxRows: MAX_ROWS, scrollback: TERMINAL_SCROLLBACK } };
216
+ }
217
+ if (endpoint === 'terminal/shells')
218
+ return { ok: true, value: [shellInfo(DEFAULT_SHELL)] };
219
+ if (endpoint === 'terminal/list')
220
+ return { ok: true, value: [...this.terminals.values()].filter(item => item.sessionId === sessionId).map(terminalInfo) };
221
+ if (endpoint === 'terminal/create')
222
+ return this.createTerminal(sessionId, cwd, args);
223
+ const id = stringId(args.id);
224
+ const terminal = this.requireTerminal(sessionId, id);
225
+ if (endpoint === 'terminal/write') {
226
+ const data = typeof args.data === 'string' ? args.data : '';
227
+ if (Buffer.byteLength(data) > MAX_INPUT_BYTES)
228
+ throw new RpcError('INVALID_MESSAGE', 'Terminal input is too large.');
229
+ if (terminal.process === undefined)
230
+ throw new RpcError('CODEX_TERMINAL_NOT_FOUND', 'The CodeX terminal is no longer available.');
231
+ await terminal.process.write(data);
232
+ return { ok: true };
233
+ }
234
+ if (endpoint === 'terminal/resize') {
235
+ terminal.cols = bounded(args.cols, terminal.cols, MAX_COLS);
236
+ terminal.rows = bounded(args.rows, terminal.rows, MAX_ROWS);
237
+ await terminal.process?.resize(terminal.cols, terminal.rows);
238
+ return { ok: true };
239
+ }
240
+ if (endpoint === 'terminal/rename') {
241
+ if (typeof args.title === 'string' && args.title.length > 0)
242
+ terminal.title = args.title.slice(0, 128);
243
+ return { ok: true };
244
+ }
245
+ if (endpoint === 'terminal/close') {
246
+ this.disposeTerminal(terminal);
247
+ this.terminals.delete(`${sessionId}/${id}`);
248
+ return { ok: true };
249
+ }
250
+ throw new RpcError('METHOD_NOT_FOUND', 'The requested terminal method does not exist.');
251
+ }
252
+ async createTerminal(sessionId, cwd, args) {
253
+ const request = isRecord(args.request) ? args.request : {};
254
+ const id = stringId(request.id);
255
+ if ([...this.terminals.values()].some(item => item.sessionId === sessionId && item.id === id))
256
+ throw new RpcError('REQUEST_CONFLICT', 'The terminal id is already active.');
257
+ if (this.terminals.size >= MAX_TERMINALS)
258
+ throw new RpcError('RATE_LIMITED', 'Too many remote terminals are active.', undefined, true);
259
+ if (request.shellPath !== undefined && request.shellPath !== DEFAULT_SHELL.path)
260
+ throw new RpcError('INVALID_MESSAGE', 'The requested shell is not available for this workspace.');
261
+ const cols = bounded(request.cols, 80, MAX_COLS);
262
+ const rows = bounded(request.rows, 24, MAX_ROWS);
263
+ const terminal = {
264
+ sessionId, id, title: DEFAULT_SHELL.name, shell: DEFAULT_SHELL, cwd, cols, rows,
265
+ sequence: 0, screen: [], screenBytes: 0, truncated: false, subscribers: new Set(),
266
+ state: 'running', exitCode: null,
267
+ };
268
+ this.terminals.set(`${sessionId}/${id}`, terminal);
269
+ try {
270
+ terminal.process = await this.spawnTerminal({
271
+ argv: [DEFAULT_SHELL.path, ...DEFAULT_SHELL.args],
272
+ cwd,
273
+ cols,
274
+ rows,
275
+ terminalType: TERMINAL_TYPE,
276
+ env: { DSH_SESSION_ID: sessionId },
277
+ });
278
+ }
279
+ catch {
280
+ this.terminals.delete(`${sessionId}/${id}`);
281
+ throw new RpcError('CODEX_TERMINAL_UNAVAILABLE', 'The CodeX terminal could not be started.');
282
+ }
283
+ void this.pump(terminal, terminal.process);
284
+ return { ok: true, value: terminalInfo(terminal) };
285
+ }
286
+ /** Streams process output as ordered `output` frames, then reports the exit. */
287
+ async pump(terminal, process) {
288
+ try {
289
+ for await (const chunk of process.output) {
290
+ if (chunk.length === 0)
291
+ continue;
292
+ terminal.sequence += 1;
293
+ this.appendScreen(terminal, chunk);
294
+ this.emit(terminal, { type: 'output', sequence: terminal.sequence, data: chunk });
295
+ }
296
+ }
297
+ catch {
298
+ terminal.state = 'failed';
299
+ terminal.error = 'The terminal output stream failed.';
300
+ }
301
+ const outcome = await process.completed;
302
+ terminal.exitCode = outcome.exitCode;
303
+ if (terminal.state === 'running')
304
+ terminal.state = 'exited';
305
+ this.emit(terminal, { type: 'state', info: terminalInfo(terminal) });
306
+ this.endSubscribers(terminal);
307
+ }
308
+ appendScreen(terminal, chunk) {
309
+ terminal.screen.push(chunk);
310
+ terminal.screenBytes += Buffer.byteLength(chunk);
311
+ while (terminal.screenBytes > MAX_SCREEN_BYTES && terminal.screen.length > 1) {
312
+ terminal.screenBytes -= Buffer.byteLength(terminal.screen.shift());
313
+ terminal.truncated = true;
314
+ }
315
+ }
316
+ async rootFor(sessionId, signal) {
317
+ const parsed = parseCodexSessionId(sessionId);
318
+ if (!parsed)
319
+ throw new RpcError('CODEX_SESSION_INVALID', 'The CodeX session identifier is invalid.');
320
+ const cwd = await this.resolveCwd(parsed.threadId, signal);
321
+ if (!cwd)
322
+ throw new RpcError('CODEX_WORKSPACE_UNAVAILABLE', 'The CodeX thread has no available workspace.');
323
+ try {
324
+ const root = await realpath(cwd);
325
+ const info = await stat(root);
326
+ if (!info.isDirectory())
327
+ throw new Error();
328
+ return root;
329
+ }
330
+ catch {
331
+ throw new RpcError('CODEX_WORKSPACE_UNAVAILABLE', 'The CodeX workspace is unavailable.');
332
+ }
333
+ }
334
+ async safePath(root, path, directory) {
335
+ if (isAbsolute(path))
336
+ throw new RpcError('CODEX_WORKSPACE_PATH_DENIED', 'The requested workspace path is outside the CodeX workspace.');
337
+ const candidate = resolve(root, path);
338
+ const rel = relative(root, candidate);
339
+ if (rel.startsWith('..') || isAbsolute(rel))
340
+ throw new RpcError('CODEX_WORKSPACE_PATH_DENIED', 'The requested workspace path is outside the CodeX workspace.');
341
+ try {
342
+ const info = await lstat(candidate);
343
+ if (info.isSymbolicLink())
344
+ throw new Error();
345
+ const canonical = await realpath(candidate);
346
+ const canonicalRel = relative(root, canonical);
347
+ if (canonicalRel.startsWith('..') || isAbsolute(canonicalRel))
348
+ throw new Error();
349
+ if (directory && !info.isDirectory())
350
+ throw new Error();
351
+ return canonical;
352
+ }
353
+ catch {
354
+ throw new RpcError('CODEX_WORKSPACE_PATH_DENIED', 'The requested workspace path is unavailable.');
355
+ }
356
+ }
357
+ emit(terminal, value) {
358
+ for (const subscriber of terminal.subscribers)
359
+ subscriber.push(value);
360
+ }
361
+ endSubscribers(terminal) {
362
+ for (const subscriber of terminal.subscribers)
363
+ subscriber.end();
364
+ terminal.subscribers.clear();
365
+ }
366
+ requireTerminal(sessionId, id) {
367
+ const terminal = this.terminals.get(`${sessionId}/${id}`);
368
+ if (!terminal)
369
+ throw new RpcError('CODEX_TERMINAL_NOT_FOUND', 'The CodeX terminal is no longer available.');
370
+ return terminal;
371
+ }
372
+ assertTerminalEnabled() { if (!this.terminalEnabled())
373
+ throw new RpcError('TERMINAL_DISABLED', 'Remote terminal is disabled on this Host.'); }
374
+ disposeTerminal(terminal) {
375
+ void Promise.resolve(terminal.process?.terminate()).catch(() => undefined);
376
+ if (terminal.state === 'running') {
377
+ // Followers see a terminal state before their stream ends, so a close from
378
+ // another connection cannot leave a view stuck on "running".
379
+ terminal.state = 'exited';
380
+ this.emit(terminal, { type: 'state', info: terminalInfo(terminal) });
381
+ }
382
+ this.endSubscribers(terminal);
383
+ }
384
+ }
385
+ /** Default terminal process: a plain child process, used when the Host exposes no PTY provider. */
386
+ export function pipeTerminalSpawner() {
387
+ return async (spec) => {
388
+ const child = spawn(spec.argv[0], spec.argv.slice(1), {
389
+ cwd: spec.cwd,
390
+ stdio: 'pipe',
391
+ windowsHide: true,
392
+ env: { ...process.env, ...spec.env },
393
+ });
394
+ const queue = new AsyncQueue();
395
+ child.stdout.on('data', data => queue.push(Buffer.from(data).toString('utf8')));
396
+ child.stderr.on('data', data => queue.push(Buffer.from(data).toString('utf8')));
397
+ child.on('error', () => queue.end());
398
+ const completed = new Promise(resolve => {
399
+ child.on('error', () => { queue.end(); resolve({ exitCode: null }); });
400
+ child.on('exit', code => { queue.end(); resolve({ exitCode: code }); });
401
+ });
402
+ return {
403
+ output: queue,
404
+ write: data => { child.stdin.write(data); },
405
+ resize: () => undefined,
406
+ terminate: () => { if (!child.killed)
407
+ child.kill(); },
408
+ completed,
409
+ };
410
+ };
411
+ }
412
+ /**
413
+ * Terminal process backed by the Host `subprocess` service, which owns PTY
414
+ * allocation, containment, and process-range termination.
415
+ */
416
+ export function subprocessTerminalSpawner(subprocess) {
417
+ return async (spec) => {
418
+ const handle = await subprocess.spawnTerminal({
419
+ argv: [...spec.argv],
420
+ cwd: spec.cwd,
421
+ cols: spec.cols,
422
+ rows: spec.rows,
423
+ terminalType: spec.terminalType,
424
+ env: spec.env,
425
+ });
426
+ const queue = new AsyncQueue();
427
+ handle.output.setEncoding?.('utf8');
428
+ handle.output.on('data', chunk => queue.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8')));
429
+ handle.output.once('close', () => queue.end());
430
+ handle.output.once('error', () => queue.end());
431
+ return {
432
+ output: queue,
433
+ write: data => handle.write(data),
434
+ resize: (cols, rows) => handle.resize(cols, rows),
435
+ terminate: () => handle.terminate(),
436
+ completed: handle.done
437
+ .then(outcome => ({ exitCode: typeof outcome?.exitCode === 'number' ? outcome.exitCode : null }))
438
+ .catch(() => ({ exitCode: null })),
439
+ };
440
+ };
441
+ }
442
+ function shellInfo(shell) {
443
+ return { path: shell.path, args: [...shell.args], name: shell.name };
444
+ }
445
+ /** Official WebTerminalInfo shape, including the attachment that owns input. */
446
+ function terminalInfo(terminal) {
447
+ return {
448
+ id: terminal.id,
449
+ title: terminal.title,
450
+ shell: shellInfo(terminal.shell),
451
+ cwd: terminal.cwd,
452
+ cols: terminal.cols,
453
+ rows: terminal.rows,
454
+ state: terminal.state,
455
+ exitCode: terminal.exitCode,
456
+ ...(terminal.error === undefined ? {} : { error: terminal.error }),
457
+ ...(terminal.controllerId === undefined ? {} : { controllerId: terminal.controllerId }),
458
+ };
459
+ }
460
+ /**
461
+ * The carrier has no terminal emulator: the bounded raw journal is replayed into
462
+ * the client emulator, which re-executes the same control sequences. A truncated
463
+ * journal starts with a reset so a half-captured sequence cannot leak in.
464
+ */
465
+ function screenOf(terminal) {
466
+ return (terminal.truncated ? '\u001bc' : '') + terminal.screen.join('');
467
+ }
468
+ function argsOf(payload) { const value = isRecord(payload) ? payload : {}; return isRecord(value.args) ? value.args : value; }
469
+ function isRecord(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); }
470
+ function stringId(value) { if (typeof value !== 'string' || !/^[A-Za-z0-9_.:-]{1,128}$/.test(value))
471
+ throw new RpcError('INVALID_MESSAGE', 'The terminal identifier is invalid.'); return value; }
472
+ function bounded(value, fallback, max) { return typeof value === 'number' && Number.isInteger(value) && value > 0 ? Math.min(value, max) : fallback; }
473
+ function readOffset(args) { const range = isRecord(args.range) ? args.range : args; return typeof range.offset === 'number' && Number.isInteger(range.offset) && range.offset >= 0 ? range.offset : 0; }
474
+ function readLimit(args) { const range = isRecord(args.range) ? args.range : args; return typeof range.limit === 'number' && Number.isInteger(range.limit) && range.limit > 0 ? Math.min(range.limit, MAX_READ_BYTES) : MAX_READ_BYTES; }
475
+ //# sourceMappingURL=codex-workspace-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-workspace-bridge.js","sourceRoot":"","sources":["../src/codex-workspace-bridge.ts"],"names":[],"mappings":"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"}