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.
Files changed (42) hide show
  1. package/bin/cli.js +5 -9
  2. package/lib/browser-mcp-server.js +496 -0
  3. package/lib/daemon.js +1 -1
  4. package/lib/os-users.js +23 -0
  5. package/lib/project-debate.js +243 -95
  6. package/lib/project-mate-interaction.js +766 -0
  7. package/lib/project-memory.js +677 -0
  8. package/lib/project.js +546 -1361
  9. package/lib/public/app.js +817 -175
  10. package/lib/public/css/debate.css +224 -2
  11. package/lib/public/css/icon-strip.css +10 -10
  12. package/lib/public/css/input.css +296 -83
  13. package/lib/public/css/mates.css +56 -57
  14. package/lib/public/css/mention.css +7 -4
  15. package/lib/public/css/menus.css +7 -0
  16. package/lib/public/css/messages.css +17 -0
  17. package/lib/public/css/mobile-nav.css +3 -1
  18. package/lib/public/css/overlays.css +181 -0
  19. package/lib/public/css/rewind.css +79 -0
  20. package/lib/public/css/server-settings.css +1 -0
  21. package/lib/public/css/sidebar.css +10 -0
  22. package/lib/public/css/title-bar.css +189 -3
  23. package/lib/public/index.html +53 -16
  24. package/lib/public/modules/context-sources.js +328 -0
  25. package/lib/public/modules/debate.js +184 -97
  26. package/lib/public/modules/input.js +18 -1
  27. package/lib/public/modules/mate-knowledge.js +11 -11
  28. package/lib/public/modules/mate-memory.js +5 -5
  29. package/lib/public/modules/mate-sidebar.js +13 -9
  30. package/lib/public/modules/mention.js +40 -2
  31. package/lib/public/modules/notifications.js +109 -1
  32. package/lib/public/modules/rewind.js +36 -0
  33. package/lib/public/modules/sidebar.js +107 -28
  34. package/lib/public/modules/terminal.js +8 -0
  35. package/lib/public/modules/theme.js +2 -1
  36. package/lib/public/modules/tools.js +69 -24
  37. package/lib/sdk-bridge.js +81 -7
  38. package/lib/sdk-worker.js +13 -1
  39. package/lib/server.js +42 -0
  40. package/lib/sessions.js +39 -7
  41. package/lib/terminal-manager.js +36 -6
  42. package/package.json +2 -2
@@ -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
- session.scrollback.push(data);
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.1",
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.76",
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",