@thenewlabs/entangle-serve 2.2.1 → 2.4.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.
- package/dist/agent.d.ts +7 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +9 -1
- package/dist/agent.js.map +1 -1
- package/dist/box-renderer.d.ts +52 -0
- package/dist/box-renderer.d.ts.map +1 -0
- package/dist/box-renderer.js +138 -0
- package/dist/box-renderer.js.map +1 -0
- package/dist/host-terminal.d.ts +23 -0
- package/dist/host-terminal.d.ts.map +1 -0
- package/dist/host-terminal.js +217 -0
- package/dist/host-terminal.js.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/multi-session.d.ts +3 -0
- package/dist/multi-session.d.ts.map +1 -1
- package/dist/multi-session.js +143 -1
- package/dist/multi-session.js.map +1 -1
- package/dist/session.d.ts +3 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +6 -1
- package/dist/session.js.map +1 -1
- package/dist/shared-session.d.ts +78 -0
- package/dist/shared-session.d.ts.map +1 -0
- package/dist/shared-session.js +146 -0
- package/dist/shared-session.js.map +1 -0
- package/dist/shared-workspace.d.ts +128 -0
- package/dist/shared-workspace.d.ts.map +1 -0
- package/dist/shared-workspace.js +295 -0
- package/dist/shared-workspace.js.map +1 -0
- package/dist/vt-grid.d.ts +41 -0
- package/dist/vt-grid.d.ts.map +1 -0
- package/dist/vt-grid.js +311 -0
- package/dist/vt-grid.js.map +1 -0
- package/package.json +4 -4
package/dist/agent.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { type CapabilityInfo } from './capability.js';
|
|
2
|
+
import type { SharedWorkspace } from './shared-workspace.js';
|
|
2
3
|
interface AgentOptions {
|
|
3
4
|
serverUrl: string;
|
|
4
5
|
outputMode?: string;
|
|
5
6
|
password?: string;
|
|
6
7
|
pinnedCapability?: CapabilityInfo;
|
|
8
|
+
sharedWorkspace?: SharedWorkspace;
|
|
9
|
+
onCapabilityReady?: (info: {
|
|
10
|
+
link: string;
|
|
11
|
+
capId: string;
|
|
12
|
+
S: string;
|
|
13
|
+
}) => void;
|
|
7
14
|
}
|
|
8
15
|
export declare function startAgent(options: AgentOptions): Promise<void>;
|
|
9
16
|
export {};
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAGlC,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChF;AAgBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrE"}
|
package/dist/agent.js
CHANGED
|
@@ -13,6 +13,8 @@ export async function startAgent(options) {
|
|
|
13
13
|
output,
|
|
14
14
|
...(options.outputMode && { outputMode: options.outputMode }),
|
|
15
15
|
...(options.password && { password: options.password }),
|
|
16
|
+
...(options.sharedWorkspace && { sharedWorkspace: options.sharedWorkspace }),
|
|
17
|
+
...(options.onCapabilityReady && { onCapabilityReady: options.onCapabilityReady }),
|
|
16
18
|
};
|
|
17
19
|
output.info('Starting agent');
|
|
18
20
|
// Hash password if provided (Argon2id with a random salt).
|
|
@@ -85,7 +87,7 @@ async function connectToServer(state, serverUrl) {
|
|
|
85
87
|
state.output.info(`Invoker connected: socketId=${socketId}, capId=${capId}`);
|
|
86
88
|
// Register synchronously (no await) so the session exists before this
|
|
87
89
|
// invoker's AUTH1 arrives on the next relay message.
|
|
88
|
-
const session = handleInvokerConnection(state.ws, socketId, cap, state.passwordHash);
|
|
90
|
+
const session = handleInvokerConnection(state.ws, socketId, cap, state.passwordHash, state.sharedWorkspace);
|
|
89
91
|
relaySessions.set(socketId, session);
|
|
90
92
|
}
|
|
91
93
|
else if (msg.type === 'RELAY_MSG') {
|
|
@@ -132,6 +134,12 @@ function displayCapability(state) {
|
|
|
132
134
|
if (!cap)
|
|
133
135
|
return;
|
|
134
136
|
const link = `${relayUrl}/cap/${cap.capId}#S=${cap.S}`;
|
|
137
|
+
// In shared-terminal mode the host UI owns the display (it shows the URL in
|
|
138
|
+
// the session frame), so hand it the link instead of printing the block.
|
|
139
|
+
if (state.onCapabilityReady) {
|
|
140
|
+
state.onCapabilityReady({ link, capId: cap.capId, S: cap.S });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
135
143
|
state.output.info('');
|
|
136
144
|
state.output.info('=====================================');
|
|
137
145
|
state.output.info(state.pinned ? 'Using pinned capability' : 'Ephemeral capability created (not stored)');
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { VtGrid } from './vt-grid.js';
|
|
2
|
+
/** A window as the tab bar needs to see it (index is positional). */
|
|
3
|
+
export interface TabInfo {
|
|
4
|
+
title: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class BoxRenderer {
|
|
7
|
+
private grid;
|
|
8
|
+
cols: number;
|
|
9
|
+
rows: number;
|
|
10
|
+
constructor(grid: VtGrid, cols: number, rows: number);
|
|
11
|
+
/** Interior width available to the shell (inside the side rails). */
|
|
12
|
+
get innerCols(): number;
|
|
13
|
+
/** Interior height available to the shell (below the title, above the bar). */
|
|
14
|
+
get innerRows(): number;
|
|
15
|
+
/** Update the total terminal size after a resize. */
|
|
16
|
+
resize(cols: number, rows: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Compose one complete frame: hides the cursor, repaints every border and
|
|
19
|
+
* interior row from the grid, then re-places and shows the real cursor at the
|
|
20
|
+
* grid's cursor position (offset into the box).
|
|
21
|
+
*/
|
|
22
|
+
frame(state: {
|
|
23
|
+
viewers: number;
|
|
24
|
+
url: string | undefined;
|
|
25
|
+
windows: readonly TabInfo[];
|
|
26
|
+
activeIndex: number;
|
|
27
|
+
}): string;
|
|
28
|
+
/**
|
|
29
|
+
* Top border doubling as the tab bar:
|
|
30
|
+
*
|
|
31
|
+
* ╔═ ⧉ entangle │ ‹1:shell› 2:logs 3:build │ N viewers ═══╗
|
|
32
|
+
*
|
|
33
|
+
* The active tab is drawn in reverse video. Tabs take priority over the
|
|
34
|
+
* viewer count: the count is only appended if it fits after the brand and
|
|
35
|
+
* tabs, and the tab list itself is truncated with `…` at the terminal width.
|
|
36
|
+
*/
|
|
37
|
+
private topBorder;
|
|
38
|
+
/**
|
|
39
|
+
* Render `│ 1:shell 2:logs …` into at most `maxVis` visible columns, the
|
|
40
|
+
* active tab in reverse video, appending `…` if the list is truncated.
|
|
41
|
+
* Returns the styled string and its visible width (SGR bytes excluded).
|
|
42
|
+
*/
|
|
43
|
+
private renderTabs;
|
|
44
|
+
private bottomBorder;
|
|
45
|
+
/**
|
|
46
|
+
* Pad a border prefix (already including its leading corner) out to the full
|
|
47
|
+
* terminal width with `═`, ending in `endCorner`. Over-long prefixes are
|
|
48
|
+
* truncated so the line never exceeds the terminal width.
|
|
49
|
+
*/
|
|
50
|
+
private padBorder;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=box-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-renderer.d.ts","sourceRoot":"","sources":["../src/box-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAyB3C,qEAAqE;AACrE,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IAEpB,OAAO,CAAC,IAAI;IACL,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;gBAFX,IAAI,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAGrB,qEAAqE;IACrE,IAAI,SAAS,IAAI,MAAM,CAAuC;IAE9D,+EAA+E;IAC/E,IAAI,SAAS,IAAI,MAAM,CAAuC;IAE9D,qDAAqD;IACrD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxC;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IAwBV;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAqBjB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,YAAY;IAKpB;;;;OAIG;IACH,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draws the shared shell inside a full-terminal "session frame": side rails, a
|
|
3
|
+
* title bar naming the session and its viewer count, and a bottom bar showing
|
|
4
|
+
* the URL to join. The shell itself is held in a {@link VtGrid} sized to the box
|
|
5
|
+
* interior; this renderer only composes ANSI for one frame — it performs no I/O
|
|
6
|
+
* so the host module owns all writes and lifecycle.
|
|
7
|
+
*
|
|
8
|
+
* The interior is `(cols - 2) x (rows - 2)` at terminal offset row 2, col 2, so
|
|
9
|
+
* grid cell (x, y) maps to terminal (col x + 2, row y + 2).
|
|
10
|
+
*/
|
|
11
|
+
const TOP_LEFT = '╔';
|
|
12
|
+
const TOP_RIGHT = '╗';
|
|
13
|
+
const BOTTOM_LEFT = '╚';
|
|
14
|
+
const BOTTOM_RIGHT = '╝';
|
|
15
|
+
const HORIZONTAL = '═';
|
|
16
|
+
const VERTICAL = '║';
|
|
17
|
+
const SEP = '│';
|
|
18
|
+
/** Reverse-video wrap used to highlight the active window's tab. */
|
|
19
|
+
const REVERSE_ON = '\x1b[7m';
|
|
20
|
+
const REVERSE_OFF = '\x1b[27m';
|
|
21
|
+
export class BoxRenderer {
|
|
22
|
+
grid;
|
|
23
|
+
cols;
|
|
24
|
+
rows;
|
|
25
|
+
constructor(grid, cols, rows) {
|
|
26
|
+
this.grid = grid;
|
|
27
|
+
this.cols = cols;
|
|
28
|
+
this.rows = rows;
|
|
29
|
+
}
|
|
30
|
+
/** Interior width available to the shell (inside the side rails). */
|
|
31
|
+
get innerCols() { return Math.max(1, this.cols - 2); }
|
|
32
|
+
/** Interior height available to the shell (below the title, above the bar). */
|
|
33
|
+
get innerRows() { return Math.max(1, this.rows - 2); }
|
|
34
|
+
/** Update the total terminal size after a resize. */
|
|
35
|
+
resize(cols, rows) {
|
|
36
|
+
this.cols = cols;
|
|
37
|
+
this.rows = rows;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Compose one complete frame: hides the cursor, repaints every border and
|
|
41
|
+
* interior row from the grid, then re-places and shows the real cursor at the
|
|
42
|
+
* grid's cursor position (offset into the box).
|
|
43
|
+
*/
|
|
44
|
+
frame(state) {
|
|
45
|
+
const parts = ['\x1b[?25l\x1b[0m'];
|
|
46
|
+
// Title/tab bar.
|
|
47
|
+
parts.push('\x1b[1;1H', this.topBorder(state.windows, state.activeIndex, state.viewers));
|
|
48
|
+
// Interior rows: rail + shell row + rail.
|
|
49
|
+
const gridRows = this.grid.renderRows();
|
|
50
|
+
for (let i = 0; i < this.innerRows; i++) {
|
|
51
|
+
const row = gridRows[i] ?? ' '.repeat(this.innerCols);
|
|
52
|
+
parts.push(`\x1b[${i + 2};1H`, VERTICAL, row, VERTICAL);
|
|
53
|
+
}
|
|
54
|
+
// Bottom bar.
|
|
55
|
+
parts.push(`\x1b[${this.rows};1H`, this.bottomBorder(state.url));
|
|
56
|
+
// Real cursor, clamped into the interior and offset by the frame.
|
|
57
|
+
const cx = Math.min(Math.max(0, this.grid.cursorX), this.innerCols - 1) + 2;
|
|
58
|
+
const cy = Math.min(Math.max(0, this.grid.cursorY), this.innerRows - 1) + 2;
|
|
59
|
+
parts.push(`\x1b[${cy};${cx}H`, '\x1b[?25h');
|
|
60
|
+
return parts.join('');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Top border doubling as the tab bar:
|
|
64
|
+
*
|
|
65
|
+
* ╔═ ⧉ entangle │ ‹1:shell› 2:logs 3:build │ N viewers ═══╗
|
|
66
|
+
*
|
|
67
|
+
* The active tab is drawn in reverse video. Tabs take priority over the
|
|
68
|
+
* viewer count: the count is only appended if it fits after the brand and
|
|
69
|
+
* tabs, and the tab list itself is truncated with `…` at the terminal width.
|
|
70
|
+
*/
|
|
71
|
+
topBorder(windows, activeIndex, viewers) {
|
|
72
|
+
const budget = Math.max(0, this.cols - 1); // reserve the end corner
|
|
73
|
+
const brand = `${TOP_LEFT}${HORIZONTAL} ⧉ entangle `;
|
|
74
|
+
const viewerSeg = `${SEP} ${viewers} viewer${viewers === 1 ? '' : 's'} `;
|
|
75
|
+
let styled = brand;
|
|
76
|
+
let vis = brand.length;
|
|
77
|
+
// Keep the viewer count only if the tabs still get a usable slice.
|
|
78
|
+
const showViewers = budget - vis - viewerSeg.length >= 6;
|
|
79
|
+
const tabsBudget = Math.max(0, budget - vis - (showViewers ? viewerSeg.length : 0));
|
|
80
|
+
const tabs = this.renderTabs(windows, activeIndex, tabsBudget);
|
|
81
|
+
styled += tabs.styled;
|
|
82
|
+
vis += tabs.vis;
|
|
83
|
+
if (showViewers) {
|
|
84
|
+
styled += viewerSeg;
|
|
85
|
+
vis += viewerSeg.length;
|
|
86
|
+
}
|
|
87
|
+
if (vis < budget)
|
|
88
|
+
styled += HORIZONTAL.repeat(budget - vis);
|
|
89
|
+
return styled + TOP_RIGHT;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Render `│ 1:shell 2:logs …` into at most `maxVis` visible columns, the
|
|
93
|
+
* active tab in reverse video, appending `…` if the list is truncated.
|
|
94
|
+
* Returns the styled string and its visible width (SGR bytes excluded).
|
|
95
|
+
*/
|
|
96
|
+
renderTabs(windows, activeIndex, maxVis) {
|
|
97
|
+
if (maxVis <= 2 || windows.length === 0)
|
|
98
|
+
return { styled: '', vis: 0 };
|
|
99
|
+
let styled = `${SEP}`;
|
|
100
|
+
let vis = 1;
|
|
101
|
+
for (let i = 0; i < windows.length; i++) {
|
|
102
|
+
const title = windows[i].title.replace(/[\x00-\x1f\x7f]/g, '');
|
|
103
|
+
const token = ` ${i + 1}:${title} `;
|
|
104
|
+
if (vis + token.length > maxVis) {
|
|
105
|
+
// Not enough room: fit what we can, then an ellipsis, and stop.
|
|
106
|
+
const remain = maxVis - vis - 1;
|
|
107
|
+
if (remain > 0) {
|
|
108
|
+
const slice = token.slice(0, remain);
|
|
109
|
+
styled += i === activeIndex ? `${REVERSE_ON}${slice}${REVERSE_OFF}` : slice;
|
|
110
|
+
vis += remain;
|
|
111
|
+
}
|
|
112
|
+
styled += '…';
|
|
113
|
+
vis += 1;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
styled += i === activeIndex ? `${REVERSE_ON}${token}${REVERSE_OFF}` : token;
|
|
117
|
+
vis += token.length;
|
|
118
|
+
}
|
|
119
|
+
return { styled, vis };
|
|
120
|
+
}
|
|
121
|
+
bottomBorder(url) {
|
|
122
|
+
const shown = url ?? 'connecting…';
|
|
123
|
+
return this.padBorder(`${BOTTOM_LEFT}${HORIZONTAL} ${shown} `, BOTTOM_RIGHT);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Pad a border prefix (already including its leading corner) out to the full
|
|
127
|
+
* terminal width with `═`, ending in `endCorner`. Over-long prefixes are
|
|
128
|
+
* truncated so the line never exceeds the terminal width.
|
|
129
|
+
*/
|
|
130
|
+
padBorder(label, endCorner) {
|
|
131
|
+
const width = this.cols;
|
|
132
|
+
if (label.length + 1 >= width) {
|
|
133
|
+
return label.slice(0, Math.max(0, width - 1)) + endCorner;
|
|
134
|
+
}
|
|
135
|
+
return label + HORIZONTAL.repeat(width - label.length - 1) + endCorner;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=box-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-renderer.js","sourceRoot":"","sources":["../src/box-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OutputHandler } from '@thenewlabs/entangle-utils';
|
|
2
|
+
import type { SharedWorkspace } from './shared-workspace.js';
|
|
3
|
+
/**
|
|
4
|
+
* Handle returned by {@link attachHostTerminal}. The session URL is only known
|
|
5
|
+
* once the relay assigns the capability, so index.ts feeds it in later via
|
|
6
|
+
* {@link HostTerminalHandle.setUrl}; until then the bottom bar shows a
|
|
7
|
+
* "connecting…" placeholder.
|
|
8
|
+
*/
|
|
9
|
+
export interface HostTerminalHandle {
|
|
10
|
+
setUrl(link: string): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Wire the host's own terminal to the shared session.
|
|
14
|
+
*
|
|
15
|
+
* On a real, big-enough terminal the host sees their shell rendered *inside* a
|
|
16
|
+
* bordered session frame (side rails, a title bar with the live viewer count,
|
|
17
|
+
* and a bottom bar with the join URL). The shell output is parsed into a
|
|
18
|
+
* {@link VtGrid} sized to the box interior and repainted on a throttle so a
|
|
19
|
+
* left rail is never overwritten. Elsewhere (too small, or not a TTY) it falls
|
|
20
|
+
* back to raw pass-through.
|
|
21
|
+
*/
|
|
22
|
+
export declare function attachHostTerminal(shared: SharedWorkspace, output: OutputHandler): HostTerminalHandle;
|
|
23
|
+
//# sourceMappingURL=host-terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-terminal.d.ts","sourceRoot":"","sources":["../src/host-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQ3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAc7D;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAYrG"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { VtGrid } from './vt-grid.js';
|
|
2
|
+
import { BoxRenderer } from './box-renderer.js';
|
|
3
|
+
/** Minimum terminal size that can hold the session frame with a usable interior. */
|
|
4
|
+
const MIN_COLS = 20;
|
|
5
|
+
const MIN_ROWS = 6;
|
|
6
|
+
/** Repaint cadence: coalesce shell output into ~30ms frames rather than per byte. */
|
|
7
|
+
const FRAME_MS = 30;
|
|
8
|
+
/** Host window-management prefix (Ctrl-B), tmux-style. */
|
|
9
|
+
const PREFIX = 0x02;
|
|
10
|
+
/**
|
|
11
|
+
* Wire the host's own terminal to the shared session.
|
|
12
|
+
*
|
|
13
|
+
* On a real, big-enough terminal the host sees their shell rendered *inside* a
|
|
14
|
+
* bordered session frame (side rails, a title bar with the live viewer count,
|
|
15
|
+
* and a bottom bar with the join URL). The shell output is parsed into a
|
|
16
|
+
* {@link VtGrid} sized to the box interior and repainted on a throttle so a
|
|
17
|
+
* left rail is never overwritten. Elsewhere (too small, or not a TTY) it falls
|
|
18
|
+
* back to raw pass-through.
|
|
19
|
+
*/
|
|
20
|
+
export function attachHostTerminal(shared, output) {
|
|
21
|
+
const stdout = process.stdout;
|
|
22
|
+
const stdin = process.stdin;
|
|
23
|
+
const cols = stdout.columns || 0;
|
|
24
|
+
const rows = stdout.rows || 0;
|
|
25
|
+
const boxable = !!stdout.isTTY && !!stdin.isTTY && cols >= MIN_COLS && rows >= MIN_ROWS;
|
|
26
|
+
return boxable
|
|
27
|
+
? attachBoxTerminal(shared, output, cols, rows)
|
|
28
|
+
: attachRawTerminal(shared, output);
|
|
29
|
+
}
|
|
30
|
+
/** Bordered session-frame UI (the normal interactive host experience). */
|
|
31
|
+
function attachBoxTerminal(shared, output, cols, rows) {
|
|
32
|
+
const stdout = process.stdout;
|
|
33
|
+
const stdin = process.stdin;
|
|
34
|
+
const write = (s) => { try {
|
|
35
|
+
stdout.write(s);
|
|
36
|
+
}
|
|
37
|
+
catch { } };
|
|
38
|
+
const grid = new VtGrid(cols - 2, rows - 2);
|
|
39
|
+
const renderer = new BoxRenderer(grid, cols, rows);
|
|
40
|
+
// The shell is authoritative-sized to the box interior, not the full terminal.
|
|
41
|
+
shared.resize(renderer.innerCols, renderer.innerRows);
|
|
42
|
+
// Paint whatever the shell emitted before we attached.
|
|
43
|
+
const initial = shared.getReplay();
|
|
44
|
+
if (initial.length > 0)
|
|
45
|
+
grid.write(Buffer.from(initial).toString('utf8'));
|
|
46
|
+
let url;
|
|
47
|
+
let viewers = shared.viewerCount();
|
|
48
|
+
let dirty = true;
|
|
49
|
+
let clearFirst = true;
|
|
50
|
+
// Local mirror of the workspace's window set, kept in sync via onWindowState
|
|
51
|
+
// and rendered as the tab bar. Seeded with the current state.
|
|
52
|
+
const initialState = shared.windowState();
|
|
53
|
+
let windows = initialState.windows;
|
|
54
|
+
let activeIndex = initialState.activeIndex;
|
|
55
|
+
const paint = () => {
|
|
56
|
+
if (!dirty)
|
|
57
|
+
return;
|
|
58
|
+
dirty = false;
|
|
59
|
+
if (clearFirst) {
|
|
60
|
+
write('\x1b[2J\x1b[H');
|
|
61
|
+
clearFirst = false;
|
|
62
|
+
}
|
|
63
|
+
write(renderer.frame({ viewers, url, windows, activeIndex }));
|
|
64
|
+
};
|
|
65
|
+
// Coalesce shell output and title changes into throttled frames.
|
|
66
|
+
const timer = setInterval(paint, FRAME_MS);
|
|
67
|
+
timer.unref?.();
|
|
68
|
+
shared.onHostData((chunk) => { grid.write(chunk.toString('utf8')); dirty = true; });
|
|
69
|
+
shared.onViewersChange((n) => { viewers = n; dirty = true; });
|
|
70
|
+
shared.onWindowState((state) => {
|
|
71
|
+
windows = state.windows;
|
|
72
|
+
activeIndex = state.activeIndex;
|
|
73
|
+
dirty = true;
|
|
74
|
+
});
|
|
75
|
+
const wasRaw = !!stdin.isRaw;
|
|
76
|
+
stdin.setRawMode(true);
|
|
77
|
+
stdin.resume();
|
|
78
|
+
// Window-management commands after a Ctrl-B prefix. Unknown keys are swallowed.
|
|
79
|
+
const runCommand = (byte) => {
|
|
80
|
+
const ch = String.fromCharCode(byte);
|
|
81
|
+
if (ch === 'c')
|
|
82
|
+
shared.newWindow();
|
|
83
|
+
else if (ch === 'n')
|
|
84
|
+
shared.nextWindow();
|
|
85
|
+
else if (ch === 'p')
|
|
86
|
+
shared.prevWindow();
|
|
87
|
+
else if (ch === 'x')
|
|
88
|
+
shared.closeWindow(activeIndex);
|
|
89
|
+
else if (ch >= '0' && ch <= '9') {
|
|
90
|
+
// Tabs are labelled 1-based ("1:shell" = index 0), so digit 1..9 selects
|
|
91
|
+
// window 0..8 and 0 selects window 9 (ignored if out of range).
|
|
92
|
+
const digit = byte - 0x30;
|
|
93
|
+
shared.selectWindow(digit === 0 ? 9 : digit - 1);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
// Ctrl-B prefix state machine: a lone Ctrl-B arms the prefix; the next byte is
|
|
97
|
+
// a command (Ctrl-B again = a literal Ctrl-B to the active window). All other
|
|
98
|
+
// bytes forward to the active window, flushed around each prefix boundary so
|
|
99
|
+
// ordering across a window switch is preserved.
|
|
100
|
+
let pendingPrefix = false;
|
|
101
|
+
const onInput = (d) => {
|
|
102
|
+
let start = 0;
|
|
103
|
+
for (let i = 0; i < d.length; i++) {
|
|
104
|
+
const byte = d[i];
|
|
105
|
+
if (pendingPrefix) {
|
|
106
|
+
pendingPrefix = false;
|
|
107
|
+
if (byte === PREFIX)
|
|
108
|
+
shared.write(new Uint8Array([PREFIX]));
|
|
109
|
+
else
|
|
110
|
+
runCommand(byte);
|
|
111
|
+
start = i + 1;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (byte === PREFIX) {
|
|
115
|
+
if (i > start)
|
|
116
|
+
shared.write(new Uint8Array(d.subarray(start, i)));
|
|
117
|
+
pendingPrefix = true;
|
|
118
|
+
start = i + 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (d.length > start)
|
|
122
|
+
shared.write(new Uint8Array(d.subarray(start)));
|
|
123
|
+
};
|
|
124
|
+
stdin.on('data', onInput);
|
|
125
|
+
const onResize = () => {
|
|
126
|
+
const nextCols = stdout.columns || 0;
|
|
127
|
+
const nextRows = stdout.rows || 0;
|
|
128
|
+
renderer.resize(nextCols, nextRows);
|
|
129
|
+
grid.resize(renderer.innerCols, renderer.innerRows);
|
|
130
|
+
shared.resize(renderer.innerCols, renderer.innerRows);
|
|
131
|
+
clearFirst = true;
|
|
132
|
+
dirty = true;
|
|
133
|
+
};
|
|
134
|
+
stdout.on('resize', onResize);
|
|
135
|
+
let restored = false;
|
|
136
|
+
const restore = () => {
|
|
137
|
+
if (restored)
|
|
138
|
+
return;
|
|
139
|
+
restored = true;
|
|
140
|
+
clearInterval(timer);
|
|
141
|
+
stdin.removeListener('data', onInput);
|
|
142
|
+
stdout.removeListener('resize', onResize);
|
|
143
|
+
write('\x1b[?25h'); // show cursor
|
|
144
|
+
if (stdin.isTTY) {
|
|
145
|
+
try {
|
|
146
|
+
stdin.setRawMode(wasRaw);
|
|
147
|
+
}
|
|
148
|
+
catch { }
|
|
149
|
+
}
|
|
150
|
+
stdin.pause();
|
|
151
|
+
};
|
|
152
|
+
shared.onExit((code) => {
|
|
153
|
+
restore();
|
|
154
|
+
write('\n');
|
|
155
|
+
output.info('Shared session ended.');
|
|
156
|
+
process.exit(code ?? 0);
|
|
157
|
+
});
|
|
158
|
+
process.on('exit', restore);
|
|
159
|
+
process.on('SIGINT', () => { restore(); process.exit(130); });
|
|
160
|
+
// Clear once and draw the first frame immediately.
|
|
161
|
+
paint();
|
|
162
|
+
return { setUrl(link) { url = link; dirty = true; } };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Raw pass-through: mirror the shell byte-for-byte and forward keystrokes, with
|
|
166
|
+
* no frame. Used when the terminal is too small for a box (or not a TTY).
|
|
167
|
+
*/
|
|
168
|
+
function attachRawTerminal(shared, output) {
|
|
169
|
+
const stdin = process.stdin;
|
|
170
|
+
const stdout = process.stdout;
|
|
171
|
+
const initial = shared.getReplay();
|
|
172
|
+
if (initial.length > 0) {
|
|
173
|
+
try {
|
|
174
|
+
stdout.write(Buffer.from(initial));
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
shared.onHostData((chunk) => { try {
|
|
179
|
+
stdout.write(chunk);
|
|
180
|
+
}
|
|
181
|
+
catch { } });
|
|
182
|
+
const wasRaw = !!stdin.isRaw;
|
|
183
|
+
if (stdin.isTTY)
|
|
184
|
+
stdin.setRawMode(true);
|
|
185
|
+
stdin.resume();
|
|
186
|
+
const onInput = (d) => shared.write(new Uint8Array(d));
|
|
187
|
+
stdin.on('data', onInput);
|
|
188
|
+
const onResize = () => shared.resize(stdout.columns || 80, stdout.rows || 24);
|
|
189
|
+
stdout.on('resize', onResize);
|
|
190
|
+
let restored = false;
|
|
191
|
+
const restore = () => {
|
|
192
|
+
if (restored)
|
|
193
|
+
return;
|
|
194
|
+
restored = true;
|
|
195
|
+
stdin.removeListener('data', onInput);
|
|
196
|
+
stdout.removeListener('resize', onResize);
|
|
197
|
+
if (stdin.isTTY) {
|
|
198
|
+
try {
|
|
199
|
+
stdin.setRawMode(wasRaw);
|
|
200
|
+
}
|
|
201
|
+
catch { }
|
|
202
|
+
}
|
|
203
|
+
stdin.pause();
|
|
204
|
+
};
|
|
205
|
+
shared.onExit((code) => {
|
|
206
|
+
restore();
|
|
207
|
+
output.info(`Shared session ended (code=${code ?? 0}).`);
|
|
208
|
+
process.exit(code ?? 0);
|
|
209
|
+
});
|
|
210
|
+
process.on('exit', restore);
|
|
211
|
+
return {
|
|
212
|
+
setUrl(link) {
|
|
213
|
+
output.info(`⧉ entangle session shared — open to collaborate:\n ${link}\n`);
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=host-terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-terminal.js","sourceRoot":"","sources":["../src/host-terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ import { getConfig, getVersionInfo, OutputHandler, parseOutputMode } from '@then
|
|
|
4
4
|
import { startAgent } from './agent.js';
|
|
5
5
|
import { createCapability, resolveServeTarget } from './capability.js';
|
|
6
6
|
import { promptHidden } from './prompt.js';
|
|
7
|
+
import { SharedWorkspace } from './shared-workspace.js';
|
|
8
|
+
import { attachHostTerminal } from './host-terminal.js';
|
|
7
9
|
const program = new Command();
|
|
8
10
|
program
|
|
9
11
|
.name('entangle-serve')
|
|
@@ -21,6 +23,8 @@ program
|
|
|
21
23
|
.option('--server <url>', 'Relay server URL (overrides the origin of the positional URL)')
|
|
22
24
|
.option('--password [password]', 'Require a password to connect; pass the flag alone to be prompted, or set AGENT_PASSWORD')
|
|
23
25
|
.option('--capability <url>', 'Serve a specific capability URL (https://relay/cap/<capId>#S=<secret>) instead of minting a fresh ephemeral one; its host is also used as the relay server')
|
|
26
|
+
.option('--shared', 'Serve one shared terminal that everyone with the URL attaches to (default when run in a terminal)')
|
|
27
|
+
.option('--headless', 'Run headless: each connection gets its own shell instead of a shared terminal')
|
|
24
28
|
.action(async (url, options) => {
|
|
25
29
|
try {
|
|
26
30
|
// Propagate output mode to all loggers in this process
|
|
@@ -49,11 +53,38 @@ program
|
|
|
49
53
|
else {
|
|
50
54
|
password = process.env.AGENT_PASSWORD;
|
|
51
55
|
}
|
|
56
|
+
// Shared-terminal mode: on by default when attached to a real terminal,
|
|
57
|
+
// forced by --shared, disabled by --headless/--no-shared. Only meaningful
|
|
58
|
+
// in text mode (stream-json is for programmatic invokers).
|
|
59
|
+
const isTty = !!process.stdout.isTTY && !!process.stdin.isTTY;
|
|
60
|
+
const shared = options.headless === true ? false
|
|
61
|
+
: options.shared === true ? true
|
|
62
|
+
: isTty && outputMode === 'text';
|
|
63
|
+
let sharedWorkspace;
|
|
64
|
+
// The host UI (when attached) sizes the active window to the box interior
|
|
65
|
+
// and takes the session URL for its bottom bar once the relay assigns it.
|
|
66
|
+
let hostHandle;
|
|
67
|
+
if (shared) {
|
|
68
|
+
const cols = process.stdout.columns || 80;
|
|
69
|
+
const rows = process.stdout.rows || 24;
|
|
70
|
+
sharedWorkspace = new SharedWorkspace(output, { cols, rows });
|
|
71
|
+
if (isTty)
|
|
72
|
+
hostHandle = attachHostTerminal(sharedWorkspace, output);
|
|
73
|
+
}
|
|
52
74
|
await startAgent({
|
|
53
75
|
serverUrl,
|
|
54
76
|
outputMode: program.opts().outputMode,
|
|
55
77
|
...(password ? { password } : {}),
|
|
56
78
|
...(pinnedCapability && { pinnedCapability }),
|
|
79
|
+
...(sharedWorkspace && {
|
|
80
|
+
sharedWorkspace,
|
|
81
|
+
onCapabilityReady: ({ link }) => {
|
|
82
|
+
if (hostHandle)
|
|
83
|
+
hostHandle.setUrl(link);
|
|
84
|
+
else
|
|
85
|
+
output.info(`⧉ entangle session shared — open to collaborate:\n ${link}\n`);
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
57
88
|
});
|
|
58
89
|
}
|
|
59
90
|
catch (error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/multi-session.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { deriveKeys } from '@thenewlabs/entangle-crypto';
|
|
|
4
4
|
import { BidirectionalCounters, StreamCounters } from '@thenewlabs/entangle-utils';
|
|
5
5
|
import { StreamManager } from './stream-manager.js';
|
|
6
6
|
import type { CapabilityInfo } from './capability.js';
|
|
7
|
+
import type { SharedWorkspace } from './shared-workspace.js';
|
|
7
8
|
export interface MultiSession {
|
|
8
9
|
socketId: string;
|
|
9
10
|
ws: WebSocket;
|
|
@@ -18,6 +19,8 @@ export interface MultiSession {
|
|
|
18
19
|
nonceC?: string;
|
|
19
20
|
streamManager?: StreamManager;
|
|
20
21
|
terminated?: boolean;
|
|
22
|
+
sharedWorkspace?: SharedWorkspace | undefined;
|
|
23
|
+
sharedViewers?: Set<string>;
|
|
21
24
|
}
|
|
22
25
|
export declare function handleMultiStreamFrame(session: MultiSession, frame: {
|
|
23
26
|
type: FrameType;
|