@mrpatronz/nexusflow 2.13.0 → 2.14.0

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 (60) hide show
  1. package/dist/core/work-guidance.d.ts +4 -4
  2. package/dist/gui/assets/{AgentsPage-DpHlroWm.js → AgentsPage-CJMUiowX.js} +1 -1
  3. package/dist/gui/assets/DashboardPage-CPMjNCSd.js +1 -0
  4. package/dist/gui/assets/{GettingStartedPage-Y4ixhR8B.js → GettingStartedPage-vdPpxxX3.js} +1 -1
  5. package/dist/gui/assets/{MonacoDiffAdapter-CGXPlqCv.js → MonacoDiffAdapter-p1QUAz5J.js} +1 -1
  6. package/dist/gui/assets/ProjectsPage-vy3814fL.js +1 -0
  7. package/dist/gui/assets/{ScaffoldRepoInline-tpk7a07z.js → ScaffoldRepoInline-C0aEuaen.js} +1 -1
  8. package/dist/gui/assets/{SettingsPage-BEozi7bF.js → SettingsPage-CjrpeCko.js} +1 -1
  9. package/dist/gui/assets/{SkillsPage-M1iYmQWO.js → SkillsPage-BRczkn37.js} +4 -4
  10. package/dist/gui/assets/StartWorkPage-Bb8nNYOL.js +1 -0
  11. package/dist/gui/assets/{StrategiesPage-CXsVcMW7.js → StrategiesPage-BYoYlyl3.js} +2 -2
  12. package/dist/gui/assets/WorkroomsPage-C2QVQ1jm.js +4 -0
  13. package/dist/gui/assets/WorkspacesPage-BuQTcejb.js +16 -0
  14. package/dist/gui/assets/{alert-dialog-B6jzcNCC.js → alert-dialog-BQTrpDEB.js} +1 -1
  15. package/dist/gui/assets/index-D-sx2qJG.js +78 -0
  16. package/dist/gui/assets/index-n0pVdSJ7.css +2 -0
  17. package/dist/gui/assets/status-CKOvrZ16.js +1 -0
  18. package/dist/gui/assets/{tabs-PHbAf5Cq.js → tabs-ClWne-mz.js} +1 -1
  19. package/dist/gui/assets/{vsc-CY5HXJ8W.js → vsc-EOWFTqft.js} +1 -1
  20. package/dist/gui/index.html +3 -2
  21. package/dist/server.d.ts.map +1 -1
  22. package/dist/server.js +14 -1
  23. package/dist/server.js.map +1 -1
  24. package/dist/terminal/manager.d.ts +57 -0
  25. package/dist/terminal/manager.d.ts.map +1 -0
  26. package/dist/terminal/manager.js +256 -0
  27. package/dist/terminal/manager.js.map +1 -0
  28. package/dist/terminal/native.d.ts +6 -0
  29. package/dist/terminal/native.d.ts.map +1 -0
  30. package/dist/terminal/native.js +30 -0
  31. package/dist/terminal/native.js.map +1 -0
  32. package/dist/terminal/routes.d.ts +17 -0
  33. package/dist/terminal/routes.d.ts.map +1 -0
  34. package/dist/terminal/routes.js +207 -0
  35. package/dist/terminal/routes.js.map +1 -0
  36. package/dist/terminal/smoke.d.ts +2 -0
  37. package/dist/terminal/smoke.d.ts.map +1 -0
  38. package/dist/terminal/smoke.js +30 -0
  39. package/dist/terminal/smoke.js.map +1 -0
  40. package/dist/terminal/targets.d.ts +49 -0
  41. package/dist/terminal/targets.d.ts.map +1 -0
  42. package/dist/terminal/targets.js +94 -0
  43. package/dist/terminal/targets.js.map +1 -0
  44. package/dist/types.d.ts +5 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/utils/session-finder.d.ts +1 -0
  47. package/dist/utils/session-finder.d.ts.map +1 -1
  48. package/dist/utils/session-finder.js +66 -27
  49. package/dist/utils/session-finder.js.map +1 -1
  50. package/dist/utils/terminal-launch.d.ts.map +1 -1
  51. package/dist/utils/terminal-launch.js +5 -1
  52. package/dist/utils/terminal-launch.js.map +1 -1
  53. package/package.json +4 -1
  54. package/dist/gui/assets/DashboardPage-BN0FQixO.js +0 -1
  55. package/dist/gui/assets/ProjectsPage-i8Egpjps.js +0 -1
  56. package/dist/gui/assets/StartWorkPage-DUC8e-My.js +0 -1
  57. package/dist/gui/assets/WorkroomsPage-DypyfzgM.js +0 -4
  58. package/dist/gui/assets/WorkspacesPage-aSR6TyA2.js +0 -16
  59. package/dist/gui/assets/index-BRvfvR0q.js +0 -57
  60. package/dist/gui/assets/index-C4GcVl9Z.css +0 -2
@@ -0,0 +1,57 @@
1
+ import type { IPty } from 'node-pty';
2
+ import type { LaunchSpec } from './targets.js';
3
+ export type PtyProcess = Pick<IPty, 'pid' | 'write' | 'resize' | 'pause' | 'resume' | 'kill' | 'onData' | 'onExit'>;
4
+ export type PtyFactory = (launch: LaunchSpec, cwd: string, cols: number, rows: number) => Promise<PtyProcess>;
5
+ export interface TerminalClient {
6
+ send(data: string): void;
7
+ close(): void;
8
+ }
9
+ export interface TerminalInfo {
10
+ id: string;
11
+ workspace: string;
12
+ target: string;
13
+ label: string;
14
+ cwd: string;
15
+ sessionId?: string;
16
+ state: 'running' | 'exited';
17
+ exitCode?: number;
18
+ }
19
+ export declare function nativePtyAvailable(): Promise<{
20
+ available: boolean;
21
+ reason?: string;
22
+ }>;
23
+ export declare const spawnNativePty: PtyFactory;
24
+ /** Terminate owned PTY descendants too, including foreground job process groups. */
25
+ export declare function terminatePty(pty: PtyProcess, platform?: NodeJS.Platform): void;
26
+ export declare class TerminalManager {
27
+ private factory;
28
+ private terminate;
29
+ private graceMs;
30
+ private sessions;
31
+ private pending;
32
+ private closing;
33
+ private resuming;
34
+ constructor(factory?: PtyFactory, terminate?: typeof terminatePty, graceMs?: number);
35
+ private info;
36
+ list(owner: string, workspace: string): TerminalInfo[];
37
+ private owned;
38
+ create(input: {
39
+ owner: string;
40
+ workspace: string;
41
+ cwd: string;
42
+ target: string;
43
+ sessionId?: string;
44
+ launchId: string;
45
+ launch: LaunchSpec;
46
+ }): Promise<TerminalInfo>;
47
+ private expire;
48
+ private send;
49
+ private output;
50
+ private flow;
51
+ attach(owner: string, workspace: string, id: string, client: TerminalClient): void;
52
+ detach(owner: string, workspace: string, id: string, client: TerminalClient): void;
53
+ control(owner: string, workspace: string, id: string, client: TerminalClient, message: unknown): void;
54
+ stop(owner: string, workspace: string, id: string): void;
55
+ dispose(): void;
56
+ }
57
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/terminal/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;AACpH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAC9G,MAAM,WAAW,cAAc;IAAG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE;AAC3E,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAQ/K,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3F;AACD,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,kBAAmB,GAAG,IAAI,CAc/E;AAED,qBAAa,eAAe;IAKd,OAAO,CAAC,OAAO;IAA+B,OAAO,CAAC,SAAS;IAAiB,OAAO,CAAC,OAAO;IAJ3G,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAqB;gBACjB,OAAO,GAAE,UAA2B,EAAU,SAAS,sBAAe,EAAU,OAAO,SAAa;IACxH,OAAO,CAAC,IAAI;IAIZ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAGtD,OAAO,CAAC,KAAK;IAKP,MAAM,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvK,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;IAGZ,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;IASZ,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAUlF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK3E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO;IAa9F,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAKjD,OAAO;CAKR"}
@@ -0,0 +1,256 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { preparePtyHelper } from './native.js';
4
+ const MAX_REPLAY = 512 * 1024;
5
+ const HIGH_WATER = 128 * 1024;
6
+ export async function nativePtyAvailable() {
7
+ try {
8
+ await preparePtyHelper();
9
+ await import('node-pty');
10
+ return { available: true };
11
+ }
12
+ catch {
13
+ return { available: false, reason: 'Native terminal support could not load. Reinstall a supported ContextSpace build or rebuild node-pty for this runtime.' };
14
+ }
15
+ }
16
+ export const spawnNativePty = async (launch, cwd, cols, rows) => {
17
+ await preparePtyHelper();
18
+ const pty = await import('node-pty').catch(() => { throw new Error('Native terminal support is unavailable. Reinstall ContextSpace or rebuild node-pty for this runtime.'); });
19
+ return pty.spawn(launch.file, launch.args, { name: 'xterm-256color', cwd, cols, rows, env: launch.env });
20
+ };
21
+ /** Terminate owned PTY descendants too, including foreground job process groups. */
22
+ export function terminatePty(pty, platform = process.platform) {
23
+ if (platform === 'win32') {
24
+ try {
25
+ execFileSync('taskkill.exe', ['/pid', String(pty.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true, timeout: 5000 });
26
+ }
27
+ catch { /* may have exited */ }
28
+ }
29
+ else {
30
+ try {
31
+ const rows = execFileSync('/bin/ps', ['-A', '-o', 'pid=,ppid='], { encoding: 'utf8', timeout: 2000 }).trim().split('\n').map(line => line.trim().split(/\s+/).map(Number));
32
+ const descendants = [];
33
+ const visit = (pid) => { for (const [child, parent] of rows)
34
+ if (parent === pid && child > 1) {
35
+ visit(child);
36
+ descendants.push(child);
37
+ } };
38
+ visit(pty.pid);
39
+ for (const pid of descendants) {
40
+ try {
41
+ process.kill(pid, 'SIGKILL');
42
+ }
43
+ catch { /* gone */ }
44
+ }
45
+ }
46
+ catch { /* still kill the PTY's group below */ }
47
+ try {
48
+ process.kill(-pty.pid, 'SIGKILL');
49
+ }
50
+ catch { /* no group */ }
51
+ }
52
+ try {
53
+ pty.kill(platform === 'win32' ? undefined : 'SIGKILL');
54
+ }
55
+ catch { /* gone */ }
56
+ }
57
+ export class TerminalManager {
58
+ factory;
59
+ terminate;
60
+ graceMs;
61
+ sessions = new Map();
62
+ pending = new Map();
63
+ closing = false;
64
+ resuming = new Set();
65
+ constructor(factory = spawnNativePty, terminate = terminatePty, graceMs = 5 * 60_000) {
66
+ this.factory = factory;
67
+ this.terminate = terminate;
68
+ this.graceMs = graceMs;
69
+ }
70
+ info(s) {
71
+ const { id, workspace, target, label, cwd, sessionId, state, exitCode } = s;
72
+ return { id, workspace, target, label, cwd, sessionId, state, exitCode };
73
+ }
74
+ list(owner, workspace) {
75
+ return [...this.sessions.values()].filter(s => s.owner === owner && s.workspace === workspace).map(s => this.info(s));
76
+ }
77
+ owned(owner, workspace, id) {
78
+ const s = this.sessions.get(id);
79
+ if (!s || s.owner !== owner || s.workspace !== workspace)
80
+ throw new Error('Terminal not found in this workspace.');
81
+ return s;
82
+ }
83
+ async create(input) {
84
+ if (this.closing)
85
+ throw new Error('Terminal service is shutting down.');
86
+ const key = `${input.owner}:${input.workspace}:${input.launchId}`;
87
+ const existing = [...this.sessions.values()].find(s => s.owner === input.owner && s.workspace === input.workspace && s.launchId === input.launchId);
88
+ if (existing)
89
+ return this.info(existing);
90
+ const pending = this.pending.get(key);
91
+ if (pending)
92
+ return pending;
93
+ if (this.sessions.size + this.pending.size >= 32 || this.list(input.owner, input.workspace).filter(s => s.state === 'running').length + this.pending.size >= 8)
94
+ throw new Error('Terminal limit reached. End an existing session first.');
95
+ // Keep saved conversations single-writer even across separate browser owners.
96
+ const resumeKey = input.sessionId ? `${input.target}:${input.sessionId}` : undefined;
97
+ const running = [...this.sessions.values()].find(s => s.state === 'running' && s.target === input.target && s.sessionId === input.sessionId && !!input.sessionId);
98
+ if (running?.owner === input.owner && running.workspace === input.workspace)
99
+ return this.info(running);
100
+ if (resumeKey && this.resuming.has(resumeKey))
101
+ throw new Error('This saved conversation is already starting.');
102
+ if (input.sessionId && [...this.sessions.values()].some(s => s.state === 'running' && s.target === input.target && s.sessionId === input.sessionId))
103
+ throw new Error('This saved conversation already has a running terminal.');
104
+ if (resumeKey)
105
+ this.resuming.add(resumeKey);
106
+ const promise = (async () => {
107
+ const pty = await this.factory(input.launch, input.cwd, 80, 24);
108
+ if (this.closing) {
109
+ this.terminate(pty);
110
+ throw new Error('Terminal service is shutting down.');
111
+ }
112
+ const s = { id: randomUUID(), workspace: input.workspace, owner: input.owner, cwd: input.cwd, target: input.target, sessionId: input.sessionId, launchId: input.launchId, label: input.launch.label, pty, state: 'running', chunks: [], length: 0, truncated: false, unacked: 0, paused: false };
113
+ this.sessions.set(s.id, s);
114
+ pty.onData(data => this.output(s, data));
115
+ pty.onExit(({ exitCode }) => { s.state = 'exited'; s.exitCode = exitCode; this.send(s, { type: 'exit', exitCode }); this.expire(s); });
116
+ this.expire(s);
117
+ return this.info(s);
118
+ })();
119
+ this.pending.set(key, promise);
120
+ try {
121
+ return await promise;
122
+ }
123
+ finally {
124
+ this.pending.delete(key);
125
+ if (resumeKey)
126
+ this.resuming.delete(resumeKey);
127
+ }
128
+ }
129
+ expire(s) {
130
+ clearTimeout(s.timer);
131
+ s.timer = setTimeout(() => {
132
+ if (s.state === 'running')
133
+ this.terminate(s.pty);
134
+ clearTimeout(s.stall);
135
+ s.client?.close();
136
+ this.sessions.delete(s.id);
137
+ }, this.graceMs);
138
+ s.timer.unref();
139
+ }
140
+ send(s, message) {
141
+ try {
142
+ s.client?.send(JSON.stringify(message));
143
+ }
144
+ catch {
145
+ if (s.client)
146
+ this.detach(s.owner, s.workspace, s.id, s.client);
147
+ }
148
+ }
149
+ output(s, data) {
150
+ // Split large native events to bound WebSocket frame size and replay chunks.
151
+ for (let at = 0; at < data.length; at += 16_384) {
152
+ const chunk = data.slice(at, at + 16_384);
153
+ s.chunks.push(chunk);
154
+ s.length += chunk.length;
155
+ while (s.length > MAX_REPLAY && s.chunks.length) {
156
+ s.length -= s.chunks.shift().length;
157
+ s.truncated = true;
158
+ }
159
+ if (s.client) {
160
+ s.unacked += chunk.length;
161
+ this.send(s, { type: 'output', data: chunk });
162
+ }
163
+ }
164
+ this.flow(s);
165
+ }
166
+ flow(s) {
167
+ if (s.state !== 'running')
168
+ return;
169
+ const pause = !!s.client && s.unacked >= HIGH_WATER;
170
+ if (pause && !s.paused) {
171
+ s.pty.pause();
172
+ s.paused = true;
173
+ s.stall = setTimeout(() => { const client = s.client; if (client) {
174
+ this.detach(s.owner, s.workspace, s.id, client);
175
+ client.close();
176
+ } }, 30_000);
177
+ s.stall.unref();
178
+ }
179
+ else if (!pause && s.paused) {
180
+ clearTimeout(s.stall);
181
+ s.pty.resume();
182
+ s.paused = false;
183
+ }
184
+ }
185
+ attach(owner, workspace, id, client) {
186
+ const s = this.owned(owner, workspace, id);
187
+ if (s.client && s.client !== client)
188
+ throw new Error('This terminal is already attached to another window. Close that connection first.');
189
+ clearTimeout(s.timer);
190
+ s.client = client;
191
+ s.unacked = s.length;
192
+ this.send(s, { type: 'ready', terminal: this.info(s), truncated: s.truncated });
193
+ for (const data of s.chunks)
194
+ this.send(s, { type: 'output', data });
195
+ this.send(s, { type: 'replayed' });
196
+ if (s.state === 'exited') {
197
+ this.send(s, { type: 'exit', exitCode: s.exitCode });
198
+ this.expire(s);
199
+ }
200
+ this.flow(s);
201
+ }
202
+ detach(owner, workspace, id, client) {
203
+ const s = this.sessions.get(id);
204
+ if (!s || s.owner !== owner || s.workspace !== workspace || s.client !== client)
205
+ return;
206
+ s.client = undefined;
207
+ s.unacked = 0;
208
+ this.flow(s);
209
+ this.expire(s);
210
+ }
211
+ control(owner, workspace, id, client, message) {
212
+ const s = this.owned(owner, workspace, id);
213
+ if (s.client !== client)
214
+ throw new Error('Terminal connection no longer owns input.');
215
+ if (!message || typeof message !== 'object')
216
+ throw new Error('Invalid terminal message.');
217
+ const m = message;
218
+ if (m.type === 'ack' && Number.isSafeInteger(m.count) && m.count > 0 && m.count <= s.unacked) {
219
+ s.unacked -= m.count;
220
+ this.flow(s);
221
+ return;
222
+ }
223
+ if (s.state !== 'running')
224
+ throw new Error('This terminal has exited.');
225
+ if (m.type === 'input' && typeof m.data === 'string' && m.data.length <= 16_384) {
226
+ s.pty.write(m.data);
227
+ return;
228
+ }
229
+ if (m.type === 'resize' && Number.isInteger(m.cols) && Number.isInteger(m.rows) && Number(m.cols) >= 2 && Number(m.cols) <= 500 && Number(m.rows) >= 1 && Number(m.rows) <= 300) {
230
+ s.pty.resize(Number(m.cols), Number(m.rows));
231
+ return;
232
+ }
233
+ throw new Error('Invalid or oversized terminal message.');
234
+ }
235
+ stop(owner, workspace, id) {
236
+ const s = this.owned(owner, workspace, id);
237
+ if (s.state === 'running') {
238
+ this.terminate(s.pty);
239
+ s.state = 'exited';
240
+ this.send(s, { type: 'exit', exitCode: null });
241
+ }
242
+ this.expire(s);
243
+ }
244
+ dispose() {
245
+ this.closing = true;
246
+ for (const s of this.sessions.values()) {
247
+ clearTimeout(s.timer);
248
+ clearTimeout(s.stall);
249
+ if (s.state === 'running')
250
+ this.terminate(s.pty);
251
+ s.client?.close();
252
+ }
253
+ this.sessions.clear();
254
+ }
255
+ }
256
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/terminal/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** node-pty 1.1.0 ships Darwin prebuild helpers without executable permissions.
2
+ * Repair the installed helper before use (also before signing desktop packages).
3
+ * https://github.com/microsoft/node-pty/issues/850
4
+ */
5
+ export declare function preparePtyHelper(platform?: NodeJS.Platform, moduleRoot?: string, arch?: NodeJS.Architecture): Promise<void>;
6
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/terminal/native.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,kBAAmB,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,sBAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3H"}
@@ -0,0 +1,30 @@
1
+ import { lstat, chmod } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import * as path from 'node:path';
4
+ const require = createRequire(import.meta.url);
5
+ /** node-pty 1.1.0 ships Darwin prebuild helpers without executable permissions.
6
+ * Repair the installed helper before use (also before signing desktop packages).
7
+ * https://github.com/microsoft/node-pty/issues/850
8
+ */
9
+ export async function preparePtyHelper(platform = process.platform, moduleRoot, arch = process.arch) {
10
+ if (platform !== 'darwin')
11
+ return;
12
+ const root = moduleRoot ?? path.dirname(require.resolve('node-pty/package.json'));
13
+ for (const dir of ['build/Release', 'build/Debug', `prebuilds/darwin-${arch}`]) {
14
+ const helper = path.join(root, dir, 'spawn-helper');
15
+ let stat;
16
+ try {
17
+ stat = await lstat(helper);
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT')
21
+ continue;
22
+ throw error;
23
+ }
24
+ if (!stat.isFile())
25
+ throw new Error('Native terminal spawn helper must be a regular file.');
26
+ if ((stat.mode & 0o111) !== 0o111)
27
+ await chmod(helper, stat.mode | 0o111);
28
+ }
29
+ }
30
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/terminal/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAmB,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI;IAC1G,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO;IAClC,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YAAC,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACnC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK;YAAE,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Hono } from 'hono';
2
+ import type { UpgradeWebSocket } from 'hono/ws';
3
+ import { TerminalManager } from './manager.js';
4
+ export declare function trustedTerminalOrigin(origin: string | undefined, requestUrl: string, developmentOrigin?: string | undefined): boolean;
5
+ export declare function containedTerminalCwd(root: string, requested?: string): Promise<string>;
6
+ export declare class TerminalAccess {
7
+ private owners;
8
+ bootstrap(cookie?: string): {
9
+ owner: string;
10
+ token: string;
11
+ expiresAt: number;
12
+ };
13
+ validate(owner: string | undefined, token: unknown): owner is string;
14
+ }
15
+ export declare const terminalManager: TerminalManager;
16
+ export declare function registerTerminalRoutes(app: Hono, upgrade: UpgradeWebSocket<any, any>, resolveWorkspace: (id: string) => Promise<string | null>, manager?: TerminalManager): void;
17
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/terminal/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAOhD,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAC;AAWxF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,qBAA4C,GAAG,OAAO,CAQ5J;AACD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzF;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA2E;IACzF,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;;;;;IAczB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;CAMrE;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC;AACrD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,OAAO,kBAAkB,QAiGzK"}
@@ -0,0 +1,207 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import { getCookie, setCookie } from 'hono/cookie';
5
+ import { bodyLimit } from 'hono/body-limit';
6
+ import { z } from 'zod';
7
+ import { checkGenerationLock } from '../core/generation-lock.js';
8
+ import { loadWorkspaceManifest } from '../core/workspace.js';
9
+ import { canOpenCodexSessionInWorkspace, canTransferClaudeSessionInWorkspace, findSessions } from '../utils/session-finder.js';
10
+ import { TerminalManager, nativePtyAvailable } from './manager.js';
11
+ import { listTerminalTargets, resolveLaunch } from './targets.js';
12
+ const COOKIE = 'contextspace_terminal_owner';
13
+ const HEADER = 'x-contextspace-terminal';
14
+ const TOKEN_TTL = 5 * 60_000;
15
+ const OWNER_TTL = 24 * 60 * 60_000;
16
+ const uuid = z.string().uuid();
17
+ const workspaceId = z.string().min(1).max(200);
18
+ const createSchema = z.object({ launchId: uuid, target: z.enum(['shell', 'antigravity', 'codex', 'claude', 'copilot', 'cursor', 'pi']), cwd: z.string().max(4096).optional(), sessionId: uuid.optional() }).strict();
19
+ export function trustedTerminalOrigin(origin, requestUrl, developmentOrigin = process.env.CONTEXTSPACE_DASHBOARD_ORIGIN) {
20
+ if (!origin)
21
+ return false;
22
+ try {
23
+ const supplied = new URL(origin), request = new URL(requestUrl);
24
+ const local = (u) => ['localhost', '127.0.0.1', '[::1]'].includes(u.hostname) && ['http:', 'https:'].includes(u.protocol) && !u.username && !u.password;
25
+ if (!local(supplied) || !local(request) || supplied.origin !== origin)
26
+ return false;
27
+ return origin === request.origin || (!!developmentOrigin && origin === new URL(developmentOrigin).origin);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export async function containedTerminalCwd(root, requested = '.') {
34
+ const base = await fs.realpath(root);
35
+ const cwd = await fs.realpath(path.resolve(base, requested));
36
+ const relative = path.relative(base, cwd);
37
+ if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative) || !(await fs.stat(cwd)).isDirectory())
38
+ throw new Error('Terminal directory must be inside this workspace.');
39
+ return cwd;
40
+ }
41
+ export class TerminalAccess {
42
+ owners = new Map();
43
+ bootstrap(cookie) {
44
+ const now = Date.now();
45
+ for (const [id, item] of this.owners)
46
+ if (item.lastSeen + OWNER_TTL < now)
47
+ this.owners.delete(id);
48
+ let owner = cookie && this.owners.has(cookie) ? cookie : undefined;
49
+ if (!owner) {
50
+ if (this.owners.size >= 128)
51
+ throw new Error('Too many terminal browser sessions. Restart the local server.');
52
+ owner = randomBytes(32).toString('hex');
53
+ }
54
+ let item = this.owners.get(owner);
55
+ // Reuse a live token so parallel workspace panels do not invalidate one another.
56
+ if (!item || item.expires <= now)
57
+ item = { token: randomBytes(32).toString('hex'), expires: now + TOKEN_TTL, lastSeen: now };
58
+ item.lastSeen = now;
59
+ this.owners.set(owner, item);
60
+ return { owner, token: item.token, expiresAt: item.expires };
61
+ }
62
+ validate(owner, token) {
63
+ if (!owner || typeof token !== 'string')
64
+ return false;
65
+ const item = this.owners.get(owner);
66
+ if (!item || item.expires <= Date.now() || token !== item.token)
67
+ return false;
68
+ item.lastSeen = Date.now();
69
+ return true;
70
+ }
71
+ }
72
+ export const terminalManager = new TerminalManager();
73
+ export function registerTerminalRoutes(app, upgrade, resolveWorkspace, manager = terminalManager) {
74
+ const access = new TerminalAccess();
75
+ const boundary = (c) => {
76
+ const origin = c.req.header('origin');
77
+ // Same-origin fetch need not send Origin; Fetch Metadata plus our custom
78
+ // header supplies a browser-only boundary. Cross-origin dev uses an exact opt-in.
79
+ return origin ? trustedTerminalOrigin(origin, c.req.url) : c.req.header('sec-fetch-site') === 'same-origin';
80
+ };
81
+ app.use('/api/terminals/*', bodyLimit({ maxSize: 16_384 }));
82
+ app.use('/api/terminals/*', async (c, next) => {
83
+ c.header('Cache-Control', 'no-store');
84
+ if (!boundary(c) || !c.req.header(HEADER))
85
+ return c.json({ error: 'Terminal access requires the local ContextSpace window.' }, 403);
86
+ if (c.req.path === '/api/terminals/bootstrap')
87
+ return next();
88
+ if (!access.validate(getCookie(c, COOKIE), c.req.header(HEADER)))
89
+ return c.json({ error: 'Terminal access expired. Reconnect from ContextSpace.' }, 403);
90
+ return next();
91
+ });
92
+ app.post('/api/terminals/bootstrap', c => {
93
+ try {
94
+ const session = access.bootstrap(getCookie(c, COOKIE));
95
+ setCookie(c, COOKIE, session.owner, { httpOnly: true, sameSite: 'Strict', path: '/', maxAge: OWNER_TTL / 1000, secure: new URL(c.req.url).protocol === 'https:' });
96
+ return c.json({ token: session.token, expiresAt: session.expiresAt });
97
+ }
98
+ catch (error) {
99
+ return c.json({ error: error.message }, 429);
100
+ }
101
+ });
102
+ const rootFor = async (id) => {
103
+ const root = await resolveWorkspace(workspaceId.parse(id));
104
+ if (!root)
105
+ throw new Error('Workspace not found.');
106
+ return root;
107
+ };
108
+ app.post('/api/terminals/:workspace/status', async (c) => {
109
+ try {
110
+ const id = c.req.param('workspace');
111
+ await rootFor(id);
112
+ return c.json({ ...await nativePtyAvailable(), targets: listTerminalTargets(), sessions: manager.list(getCookie(c, COOKIE), id) });
113
+ }
114
+ catch (error) {
115
+ return c.json({ error: error.message }, 400);
116
+ }
117
+ });
118
+ app.post('/api/terminals/:workspace/create', async (c) => {
119
+ try {
120
+ const id = c.req.param('workspace'), root = await rootFor(id);
121
+ const input = createSchema.parse(await c.req.json());
122
+ await checkGenerationLock(root, { markDocuments: true });
123
+ let cwd = await containedTerminalCwd(root, input.cwd);
124
+ if (input.sessionId) {
125
+ const manifest = await loadWorkspaceManifest(root);
126
+ const repos = (await Promise.all((manifest?.repos ?? []).map(repo => containedTerminalCwd(root, path.basename(repo)).catch(() => null)))).filter((repo) => !!repo);
127
+ const checker = input.target === 'codex' ? canOpenCodexSessionInWorkspace : input.target === 'claude' ? canTransferClaudeSessionInWorkspace : null;
128
+ if (checker && !await checker(root, repos, input.sessionId))
129
+ throw new Error('Saved session ownership could not be verified for this workspace and harness.');
130
+ const found = (await findSessions(root, repos)).find(s => s.assistant === input.target && s.id === input.sessionId);
131
+ if (!found?.recordedCwd)
132
+ throw new Error('Saved session ownership could not be verified. Open the harness and use its own session picker.');
133
+ if (found.threadKind === 'subagent')
134
+ throw new Error('This is a subagent session. Resume its main conversation instead.');
135
+ cwd = await containedTerminalCwd(root, found.recordedCwd);
136
+ }
137
+ const terminal = await manager.create({ owner: getCookie(c, COOKIE), workspace: id, cwd, target: input.target, sessionId: input.sessionId, launchId: input.launchId, launch: resolveLaunch(input.target, input.sessionId) });
138
+ return c.json({ terminal });
139
+ }
140
+ catch (error) {
141
+ return c.json({ error: error instanceof z.ZodError ? 'Invalid terminal launch parameters.' : error.message }, 400);
142
+ }
143
+ });
144
+ app.post('/api/terminals/:workspace/:id/stop', async (c) => {
145
+ try {
146
+ const workspace = c.req.param('workspace');
147
+ await rootFor(workspace);
148
+ manager.stop(getCookie(c, COOKIE), workspace, uuid.parse(c.req.param('id')));
149
+ return c.json({ success: true });
150
+ }
151
+ catch (error) {
152
+ return c.json({ error: error.message }, 400);
153
+ }
154
+ });
155
+ app.get('/ws/terminal', async (c, next) => {
156
+ // node-ws synthesizes c.req.url against http://localhost, losing the real
157
+ // port. The browser's Host header retains the exact upgrade destination.
158
+ const upgradeUrl = `http://${c.req.header('host') ?? new URL(c.req.url).host}/ws/terminal`;
159
+ if (!trustedTerminalOrigin(c.req.header('origin'), upgradeUrl))
160
+ return c.text('Forbidden', 403);
161
+ const owner = getCookie(c, COOKIE);
162
+ if (!owner)
163
+ return c.text('Forbidden', 403);
164
+ let client, workspace = '', id = '', attached = false, connecting = false, closed = false;
165
+ let deadline;
166
+ return upgrade(() => ({
167
+ onOpen(_event, ws) {
168
+ client = { send: data => ws.send(data), close: () => ws.close(1008) };
169
+ deadline = setTimeout(() => ws.close(1008), 5000);
170
+ deadline.unref();
171
+ },
172
+ async onMessage(event, ws) {
173
+ try {
174
+ if (typeof event.data !== 'string' || event.data.length > 20_000)
175
+ throw new Error('Invalid terminal frame.');
176
+ const message = JSON.parse(event.data);
177
+ if (!attached) {
178
+ if (connecting)
179
+ throw new Error('Terminal attachment is pending.');
180
+ if (message.type !== 'attach' || !access.validate(owner, message.token))
181
+ throw new Error('Terminal access expired. Reconnect from ContextSpace.');
182
+ connecting = true;
183
+ workspace = workspaceId.parse(message.workspace);
184
+ id = uuid.parse(message.id);
185
+ await rootFor(workspace);
186
+ if (closed)
187
+ return;
188
+ manager.attach(owner, workspace, id, client);
189
+ attached = true;
190
+ clearTimeout(deadline);
191
+ }
192
+ else
193
+ manager.control(owner, workspace, id, client, message);
194
+ }
195
+ catch (error) {
196
+ ws.send(JSON.stringify({ type: 'error', message: error instanceof z.ZodError ? 'Invalid terminal attachment.' : error.message }));
197
+ ws.close(1008);
198
+ }
199
+ },
200
+ onClose() { closed = true; clearTimeout(deadline); if (client && attached)
201
+ manager.detach(owner, workspace, id, client); },
202
+ onError() { closed = true; clearTimeout(deadline); if (client && attached)
203
+ manager.detach(owner, workspace, id, client); },
204
+ }))(c, next);
205
+ });
206
+ }
207
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/terminal/routes.ts"],"names":[],"mappings":"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"}