clay-server 2.26.0-beta.1 → 2.26.0-beta.11
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/bin/cli.js +5 -9
- package/lib/browser-mcp-server.js +496 -0
- package/lib/daemon.js +1 -1
- package/lib/os-users.js +23 -0
- package/lib/project-debate.js +243 -95
- package/lib/project-mate-interaction.js +766 -0
- package/lib/project-memory.js +677 -0
- package/lib/project.js +546 -1361
- package/lib/public/app.js +817 -175
- package/lib/public/css/debate.css +224 -2
- package/lib/public/css/icon-strip.css +10 -10
- package/lib/public/css/input.css +296 -83
- package/lib/public/css/mates.css +56 -57
- package/lib/public/css/mention.css +7 -4
- package/lib/public/css/menus.css +7 -0
- package/lib/public/css/messages.css +17 -0
- package/lib/public/css/mobile-nav.css +3 -1
- package/lib/public/css/overlays.css +181 -0
- package/lib/public/css/rewind.css +79 -0
- package/lib/public/css/server-settings.css +1 -0
- package/lib/public/css/sidebar.css +10 -0
- package/lib/public/css/title-bar.css +189 -3
- package/lib/public/index.html +53 -16
- package/lib/public/modules/context-sources.js +328 -0
- package/lib/public/modules/debate.js +184 -97
- package/lib/public/modules/input.js +18 -1
- package/lib/public/modules/mate-knowledge.js +11 -11
- package/lib/public/modules/mate-memory.js +5 -5
- package/lib/public/modules/mate-sidebar.js +13 -9
- package/lib/public/modules/mention.js +40 -2
- package/lib/public/modules/notifications.js +109 -1
- package/lib/public/modules/rewind.js +36 -0
- package/lib/public/modules/sidebar.js +107 -28
- package/lib/public/modules/terminal.js +8 -0
- package/lib/public/modules/theme.js +2 -1
- package/lib/public/modules/tools.js +69 -24
- package/lib/sdk-bridge.js +81 -7
- package/lib/sdk-worker.js +13 -1
- package/lib/server.js +42 -0
- package/lib/sessions.js +39 -7
- package/lib/terminal-manager.js +36 -6
- package/package.json +2 -2
package/lib/terminal-manager.js
CHANGED
|
@@ -16,7 +16,7 @@ function createTerminalManager(opts) {
|
|
|
16
16
|
var nextId = 1;
|
|
17
17
|
var terminals = new Map(); // id -> terminal session
|
|
18
18
|
|
|
19
|
-
function create(cols, rows, osUserInfo) {
|
|
19
|
+
function create(cols, rows, osUserInfo, ownerWs) {
|
|
20
20
|
if (terminals.size >= MAX_TERMINALS) return null;
|
|
21
21
|
|
|
22
22
|
var pty = createTerminal(cwd, cols, rows, osUserInfo);
|
|
@@ -28,20 +28,24 @@ function createTerminalManager(opts) {
|
|
|
28
28
|
pty: pty,
|
|
29
29
|
scrollback: [],
|
|
30
30
|
scrollbackSize: 0,
|
|
31
|
+
totalBytesWritten: 0,
|
|
31
32
|
cols: cols || 80,
|
|
32
33
|
rows: rows || 24,
|
|
33
34
|
title: "Terminal " + id,
|
|
34
35
|
exited: false,
|
|
35
36
|
exitCode: null,
|
|
36
37
|
subscribers: new Set(),
|
|
38
|
+
ownerWs: ownerWs || null,
|
|
37
39
|
};
|
|
38
40
|
|
|
39
41
|
pty.onData(function (data) {
|
|
40
|
-
// Buffer scrollback
|
|
41
|
-
|
|
42
|
+
// Buffer scrollback with timestamps
|
|
43
|
+
var ts = Date.now();
|
|
44
|
+
session.scrollback.push({ ts: ts, data: data });
|
|
42
45
|
session.scrollbackSize += data.length;
|
|
46
|
+
session.totalBytesWritten += data.length;
|
|
43
47
|
while (session.scrollbackSize > SCROLLBACK_MAX && session.scrollback.length > 1) {
|
|
44
|
-
session.scrollbackSize -= session.scrollback[0].length;
|
|
48
|
+
session.scrollbackSize -= session.scrollback[0].data.length;
|
|
45
49
|
session.scrollback.shift();
|
|
46
50
|
}
|
|
47
51
|
|
|
@@ -80,10 +84,15 @@ function createTerminalManager(opts) {
|
|
|
80
84
|
|
|
81
85
|
// Replay scrollback only for newly attached clients
|
|
82
86
|
if (!alreadySubscribed && session.scrollback.length > 0) {
|
|
83
|
-
var replay = session.scrollback.join("");
|
|
87
|
+
var replay = session.scrollback.map(function(c) { return c.data; }).join("");
|
|
84
88
|
sendTo(ws, { type: "term_output", id: id, data: replay });
|
|
85
89
|
}
|
|
86
90
|
|
|
91
|
+
// Send current terminal dimensions so the client renders at the correct size
|
|
92
|
+
if (!alreadySubscribed && session.cols && session.rows) {
|
|
93
|
+
sendTo(ws, { type: "term_resized", id: id, cols: session.cols, rows: session.rows });
|
|
94
|
+
}
|
|
95
|
+
|
|
87
96
|
// If already exited, notify
|
|
88
97
|
if (session.exited) {
|
|
89
98
|
sendTo(ws, { type: "term_exited", id: id });
|
|
@@ -111,14 +120,22 @@ function createTerminalManager(opts) {
|
|
|
111
120
|
}
|
|
112
121
|
}
|
|
113
122
|
|
|
114
|
-
function resize(id, cols, rows) {
|
|
123
|
+
function resize(id, cols, rows, sourceWs) {
|
|
115
124
|
var session = terminals.get(id);
|
|
116
125
|
if (!session || !session.pty) return;
|
|
126
|
+
// Only the terminal owner can resize the PTY.
|
|
127
|
+
// Observers resizing would cause SIGWINCH and flood the owner with escape sequences.
|
|
128
|
+
if (session.ownerWs && sourceWs && sourceWs !== session.ownerWs) return;
|
|
117
129
|
if (cols > 0 && rows > 0) {
|
|
118
130
|
try {
|
|
119
131
|
session.pty.resize(cols, rows);
|
|
120
132
|
session.cols = cols;
|
|
121
133
|
session.rows = rows;
|
|
134
|
+
// Notify other subscribers about the resize so their xterm stays in sync
|
|
135
|
+
var msg = JSON.stringify({ type: "term_resized", id: id, cols: cols, rows: rows });
|
|
136
|
+
for (var ws of session.subscribers) {
|
|
137
|
+
if (ws.readyState === 1 && ws !== sourceWs) ws.send(msg);
|
|
138
|
+
}
|
|
122
139
|
} catch (e) {}
|
|
123
140
|
}
|
|
124
141
|
}
|
|
@@ -162,6 +179,18 @@ function createTerminalManager(opts) {
|
|
|
162
179
|
return result;
|
|
163
180
|
}
|
|
164
181
|
|
|
182
|
+
function getScrollback(id) {
|
|
183
|
+
var session = terminals.get(id);
|
|
184
|
+
if (!session) return null;
|
|
185
|
+
var content = session.scrollback.map(function(c) { return c.data; }).join("");
|
|
186
|
+
return {
|
|
187
|
+
content: content,
|
|
188
|
+
chunks: session.scrollback,
|
|
189
|
+
totalBytesWritten: session.totalBytesWritten,
|
|
190
|
+
bufferStart: session.totalBytesWritten - content.length
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
165
194
|
function destroyAll() {
|
|
166
195
|
for (var session of terminals.values()) {
|
|
167
196
|
if (session.pty) {
|
|
@@ -182,6 +211,7 @@ function createTerminalManager(opts) {
|
|
|
182
211
|
close: close,
|
|
183
212
|
rename: rename,
|
|
184
213
|
list: list,
|
|
214
|
+
getScrollback: getScrollback,
|
|
185
215
|
destroyAll: destroyAll,
|
|
186
216
|
};
|
|
187
217
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clay-server",
|
|
3
|
-
"version": "2.26.0-beta.
|
|
3
|
+
"version": "2.26.0-beta.11",
|
|
4
4
|
"description": "Self-hosted Claude Code in your browser. Multi-session, multi-user, push notifications.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"clay-server": "./bin/cli.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"homepage": "https://github.com/chadbyte/claude-relay#readme",
|
|
37
37
|
"author": "Chad",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.
|
|
39
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.92",
|
|
40
40
|
"@lydell/node-pty": "^1.2.0-beta.3",
|
|
41
41
|
"nodemailer": "^6.10.1",
|
|
42
42
|
"qrcode-terminal": "^0.12.0",
|