@clsh/agent 0.0.1

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 (53) hide show
  1. package/dist/auth.d.ts +37 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +62 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/config.d.ts +23 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +119 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/control-mode-parser.d.ts +68 -0
  10. package/dist/control-mode-parser.d.ts.map +1 -0
  11. package/dist/control-mode-parser.js +111 -0
  12. package/dist/control-mode-parser.js.map +1 -0
  13. package/dist/db.d.ts +44 -0
  14. package/dist/db.d.ts.map +1 -0
  15. package/dist/db.js +63 -0
  16. package/dist/db.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +114 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/power.d.ts +9 -0
  22. package/dist/power.d.ts.map +1 -0
  23. package/dist/power.js +29 -0
  24. package/dist/power.js.map +1 -0
  25. package/dist/pty-manager.d.ts +110 -0
  26. package/dist/pty-manager.d.ts.map +1 -0
  27. package/dist/pty-manager.js +468 -0
  28. package/dist/pty-manager.js.map +1 -0
  29. package/dist/server.d.ts +24 -0
  30. package/dist/server.d.ts.map +1 -0
  31. package/dist/server.js +160 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/sse-handler.d.ts +13 -0
  34. package/dist/sse-handler.d.ts.map +1 -0
  35. package/dist/sse-handler.js +76 -0
  36. package/dist/sse-handler.js.map +1 -0
  37. package/dist/tmux.d.ts +34 -0
  38. package/dist/tmux.d.ts.map +1 -0
  39. package/dist/tmux.js +114 -0
  40. package/dist/tmux.js.map +1 -0
  41. package/dist/tunnel.d.ts +43 -0
  42. package/dist/tunnel.d.ts.map +1 -0
  43. package/dist/tunnel.js +294 -0
  44. package/dist/tunnel.js.map +1 -0
  45. package/dist/types.d.ts +76 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +2 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/ws-handler.d.ts +13 -0
  50. package/dist/ws-handler.d.ts.map +1 -0
  51. package/dist/ws-handler.js +266 -0
  52. package/dist/ws-handler.js.map +1 -0
  53. package/package.json +47 -0
@@ -0,0 +1,76 @@
1
+ /** Shell types supported by the PTY manager. */
2
+ export type ShellType = 'zsh' | 'tmux' | 'claude';
3
+ /** Messages sent from client to server over WebSocket. */
4
+ export type ClientMessage = {
5
+ type: 'stdin';
6
+ sessionId: string;
7
+ data: string;
8
+ } | {
9
+ type: 'resize';
10
+ sessionId: string;
11
+ cols: number;
12
+ rows: number;
13
+ } | {
14
+ type: 'session_create';
15
+ shell: ShellType;
16
+ name?: string;
17
+ } | {
18
+ type: 'session_close';
19
+ sessionId: string;
20
+ } | {
21
+ type: 'session_rename';
22
+ sessionId: string;
23
+ name: string;
24
+ } | {
25
+ type: 'session_subscribe';
26
+ sessionId: string;
27
+ } | {
28
+ type: 'session_list';
29
+ } | {
30
+ type: 'ping';
31
+ };
32
+ /** Messages sent from server to client over WebSocket. */
33
+ export type ServerMessage = {
34
+ type: 'stdout';
35
+ sessionId: string;
36
+ data: string;
37
+ } | {
38
+ type: 'stderr';
39
+ sessionId: string;
40
+ data: string;
41
+ } | {
42
+ type: 'exit';
43
+ sessionId: string;
44
+ exitCode: number;
45
+ signal?: number;
46
+ } | {
47
+ type: 'session';
48
+ sessionId: string;
49
+ shell: string;
50
+ pid: number;
51
+ name: string;
52
+ cwd: string;
53
+ status: 'run' | 'idle';
54
+ } | {
55
+ type: 'session_list';
56
+ sessions: Array<{
57
+ id: string;
58
+ shell: string;
59
+ pid: number;
60
+ name: string;
61
+ cwd: string;
62
+ status: 'run' | 'idle';
63
+ }>;
64
+ } | {
65
+ type: 'session_update';
66
+ sessionId: string;
67
+ name: string;
68
+ cwd: string;
69
+ status: 'run' | 'idle';
70
+ } | {
71
+ type: 'error';
72
+ message: string;
73
+ } | {
74
+ type: 'pong';
75
+ };
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElD,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,GACrH;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAChH,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { PTYManager } from './pty-manager.js';
3
+ /** WebSocket close codes. */
4
+ declare const WS_CLOSE_UNAUTHORIZED = 4001;
5
+ declare const WS_CLOSE_NORMAL = 1000;
6
+ /**
7
+ * Sets up the WebSocket handler on the given WebSocketServer.
8
+ * Authenticates connections via JWT in the query string, then routes
9
+ * messages to the PTY manager.
10
+ */
11
+ export declare function setupWebSocketHandler(wss: WebSocketServer, ptyManager: PTYManager, jwtSecret: string): void;
12
+ export { WS_CLOSE_UNAUTHORIZED, WS_CLOSE_NORMAL };
13
+ //# sourceMappingURL=ws-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../src/ws-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,IAAI,CAAC;AAIhD,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAG/D,6BAA6B;AAC7B,QAAA,MAAM,qBAAqB,OAAO,CAAC;AACnC,QAAA,MAAM,eAAe,OAAO,CAAC;AA+B7B;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,GAChB,IAAI,CAMN;AA8SD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,266 @@
1
+ import { WebSocket } from 'ws';
2
+ import { URL } from 'node:url';
3
+ import { verifyJWT } from './auth.js';
4
+ /** WebSocket close codes. */
5
+ const WS_CLOSE_UNAUTHORIZED = 4001;
6
+ const WS_CLOSE_NORMAL = 1000;
7
+ function send(ws, message) {
8
+ if (ws.readyState === WebSocket.OPEN) {
9
+ ws.send(JSON.stringify(message));
10
+ }
11
+ }
12
+ function sendError(ws, message) {
13
+ send(ws, { type: 'error', message });
14
+ }
15
+ function isValidShell(shell) {
16
+ return shell === 'zsh' || shell === 'tmux' || shell === 'claude';
17
+ }
18
+ function parseClientMessage(raw) {
19
+ try {
20
+ const parsed = JSON.parse(raw);
21
+ if (typeof parsed !== 'object' || parsed === null || !('type' in parsed)) {
22
+ return null;
23
+ }
24
+ return parsed;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Sets up the WebSocket handler on the given WebSocketServer.
32
+ * Authenticates connections via JWT in the query string, then routes
33
+ * messages to the PTY manager.
34
+ */
35
+ export function setupWebSocketHandler(wss, ptyManager, jwtSecret) {
36
+ const subscriptions = new Map();
37
+ wss.on('connection', (ws, req) => {
38
+ void handleConnection(ws, req, ptyManager, jwtSecret, subscriptions);
39
+ });
40
+ }
41
+ async function handleConnection(ws, req, ptyManager, jwtSecret, subscriptions) {
42
+ // Extract JWT from query parameter
43
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
44
+ const token = url.searchParams.get('token');
45
+ if (!token) {
46
+ ws.close(WS_CLOSE_UNAUTHORIZED, 'Missing authentication token');
47
+ return;
48
+ }
49
+ try {
50
+ await verifyJWT(token, jwtSecret);
51
+ }
52
+ catch {
53
+ ws.close(WS_CLOSE_UNAUTHORIZED, 'Invalid or expired token');
54
+ return;
55
+ }
56
+ // Authentication succeeded -- set up message handling
57
+ ws.isAlive = true;
58
+ ws.on('pong', () => { ws.isAlive = true; });
59
+ subscriptions.set(ws, new Set());
60
+ ws.on('message', (rawData) => {
61
+ const data = typeof rawData === 'string' ? rawData : rawData.toString('utf-8');
62
+ const message = parseClientMessage(data);
63
+ if (!message) {
64
+ sendError(ws, 'Invalid message format');
65
+ return;
66
+ }
67
+ handleMessage(ws, message, ptyManager, subscriptions);
68
+ });
69
+ ws.on('close', () => {
70
+ // Clear subscriptions but do NOT destroy sessions (allow reconnection)
71
+ subscriptions.delete(ws);
72
+ });
73
+ ws.on('error', () => {
74
+ subscriptions.delete(ws);
75
+ });
76
+ }
77
+ function handleMessage(ws, message, ptyManager, subscriptions) {
78
+ switch (message.type) {
79
+ case 'ping':
80
+ send(ws, { type: 'pong' });
81
+ break;
82
+ case 'session_create':
83
+ handleSessionCreate(ws, message.shell, message.name, ptyManager, subscriptions);
84
+ break;
85
+ case 'session_subscribe':
86
+ handleSessionSubscribe(ws, message.sessionId, ptyManager, subscriptions);
87
+ break;
88
+ case 'session_close':
89
+ handleSessionClose(ws, message.sessionId, ptyManager, subscriptions);
90
+ break;
91
+ case 'session_rename':
92
+ handleSessionRename(ws, message.sessionId, message.name, ptyManager);
93
+ break;
94
+ case 'session_list':
95
+ handleSessionList(ws, ptyManager);
96
+ break;
97
+ case 'stdin':
98
+ handleStdin(ws, message.sessionId, message.data, ptyManager);
99
+ break;
100
+ case 'resize':
101
+ handleResize(ws, message.sessionId, message.cols, message.rows, ptyManager);
102
+ break;
103
+ }
104
+ }
105
+ function handleSessionCreate(ws, shell, name, ptyManager, subscriptions) {
106
+ if (!isValidShell(shell)) {
107
+ sendError(ws, `Invalid shell type: ${String(shell)}`);
108
+ return;
109
+ }
110
+ let session;
111
+ try {
112
+ session = ptyManager.create(shell, 80, 24, name);
113
+ }
114
+ catch (err) {
115
+ const errMsg = err instanceof Error ? err.message : 'Failed to create session';
116
+ sendError(ws, errMsg);
117
+ return;
118
+ }
119
+ // Subscribe this client to the new session
120
+ const clientSubs = subscriptions.get(ws);
121
+ if (clientSubs) {
122
+ clientSubs.add(session.id);
123
+ }
124
+ // Send session info back to client
125
+ send(ws, {
126
+ type: 'session',
127
+ sessionId: session.id,
128
+ shell,
129
+ pid: session.pty.pid,
130
+ name: session.name,
131
+ cwd: session.cwd,
132
+ status: session.status,
133
+ });
134
+ // Replay buffer for reconnection
135
+ for (const chunk of session.buffer) {
136
+ send(ws, { type: 'stdout', sessionId: session.id, data: chunk });
137
+ }
138
+ // Stream PTY output to this WebSocket client
139
+ session.onData((data) => {
140
+ const subs = subscriptions.get(ws);
141
+ if (subs?.has(session.id)) {
142
+ send(ws, { type: 'stdout', sessionId: session.id, data });
143
+ }
144
+ });
145
+ // Stream session metadata updates to this WebSocket client
146
+ session.onUpdate((meta) => {
147
+ const subs = subscriptions.get(ws);
148
+ if (subs?.has(session.id)) {
149
+ send(ws, { type: 'session_update', sessionId: session.id, ...meta });
150
+ }
151
+ });
152
+ // Notify client when the session exits
153
+ session.onExit((event) => {
154
+ send(ws, {
155
+ type: 'exit',
156
+ sessionId: session.id,
157
+ exitCode: event.exitCode,
158
+ signal: event.signal,
159
+ });
160
+ const subs = subscriptions.get(ws);
161
+ if (subs) {
162
+ subs.delete(session.id);
163
+ }
164
+ });
165
+ }
166
+ function handleSessionSubscribe(ws, sessionId, ptyManager, subscriptions) {
167
+ const session = ptyManager.get(sessionId);
168
+ if (!session) {
169
+ sendError(ws, `Session not found: ${sessionId}`);
170
+ return;
171
+ }
172
+ // Subscribe this client
173
+ const clientSubs = subscriptions.get(ws);
174
+ if (clientSubs) {
175
+ if (clientSubs.has(sessionId))
176
+ return; // already subscribed
177
+ clientSubs.add(sessionId);
178
+ }
179
+ // Send session info
180
+ send(ws, {
181
+ type: 'session',
182
+ sessionId: session.id,
183
+ shell: session.shell,
184
+ pid: session.pty.pid,
185
+ name: session.name,
186
+ cwd: session.cwd,
187
+ status: session.status,
188
+ });
189
+ // Replay buffer
190
+ for (const chunk of session.buffer) {
191
+ send(ws, { type: 'stdout', sessionId: session.id, data: chunk });
192
+ }
193
+ // Wire up live streaming
194
+ session.onData((data) => {
195
+ const subs = subscriptions.get(ws);
196
+ if (subs?.has(session.id)) {
197
+ send(ws, { type: 'stdout', sessionId: session.id, data });
198
+ }
199
+ });
200
+ session.onUpdate((meta) => {
201
+ const subs = subscriptions.get(ws);
202
+ if (subs?.has(session.id)) {
203
+ send(ws, { type: 'session_update', sessionId: session.id, ...meta });
204
+ }
205
+ });
206
+ session.onExit((event) => {
207
+ send(ws, {
208
+ type: 'exit',
209
+ sessionId: session.id,
210
+ exitCode: event.exitCode,
211
+ signal: event.signal,
212
+ });
213
+ const subs = subscriptions.get(ws);
214
+ if (subs) {
215
+ subs.delete(session.id);
216
+ }
217
+ });
218
+ }
219
+ function handleSessionClose(ws, sessionId, ptyManager, subscriptions) {
220
+ ptyManager.destroy(sessionId);
221
+ const subs = subscriptions.get(ws);
222
+ if (subs) {
223
+ subs.delete(sessionId);
224
+ }
225
+ send(ws, { type: 'exit', sessionId, exitCode: 0 });
226
+ }
227
+ function handleSessionList(ws, ptyManager) {
228
+ const sessions = ptyManager.list().map((s) => ({
229
+ id: s.id,
230
+ shell: s.shell,
231
+ pid: s.pty.pid,
232
+ name: s.name,
233
+ cwd: s.cwd,
234
+ status: s.status,
235
+ }));
236
+ send(ws, { type: 'session_list', sessions });
237
+ }
238
+ function handleSessionRename(ws, sessionId, name, ptyManager) {
239
+ try {
240
+ ptyManager.rename(sessionId, name);
241
+ }
242
+ catch (err) {
243
+ const errMsg = err instanceof Error ? err.message : 'Rename failed';
244
+ sendError(ws, errMsg);
245
+ }
246
+ }
247
+ function handleStdin(ws, sessionId, data, ptyManager) {
248
+ try {
249
+ ptyManager.write(sessionId, data);
250
+ }
251
+ catch (err) {
252
+ const errMsg = err instanceof Error ? err.message : 'Write failed';
253
+ sendError(ws, errMsg);
254
+ }
255
+ }
256
+ function handleResize(ws, sessionId, cols, rows, ptyManager) {
257
+ try {
258
+ ptyManager.resize(sessionId, cols, rows);
259
+ }
260
+ catch (err) {
261
+ const errMsg = err instanceof Error ? err.message : 'Resize failed';
262
+ sendError(ws, errMsg);
263
+ }
264
+ }
265
+ export { WS_CLOSE_UNAUTHORIZED, WS_CLOSE_NORMAL };
266
+ //# sourceMappingURL=ws-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-handler.js","sourceRoot":"","sources":["../src/ws-handler.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@clsh/agent",
3
+ "version": "0.0.1",
4
+ "description": "clsh local agent — PTY manager, WebSocket server, auth, and ngrok tunnel",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/my-claude-utils/clsh.git",
9
+ "directory": "packages/agent"
10
+ },
11
+ "homepage": "https://clsh.dev",
12
+ "bugs": {
13
+ "url": "https://github.com/my-claude-utils/clsh/issues"
14
+ },
15
+ "type": "module",
16
+ "files": ["dist"],
17
+ "main": "dist/index.js",
18
+ "types": "dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "scripts": {
26
+ "dev": "WEB_PORT=4031 tsx watch src/index.ts",
27
+ "build": "tsc",
28
+ "lint": "eslint src/",
29
+ "typecheck": "tsc --noEmit",
30
+ "test": "echo \"No tests yet\""
31
+ },
32
+ "dependencies": {
33
+ "@ngrok/ngrok": "^1.4.0",
34
+ "better-sqlite3": "^11.0.0",
35
+ "express": "^4.21.0",
36
+ "jose": "^5.9.0",
37
+ "node-pty": "^1.0.0",
38
+ "qrcode-terminal": "^0.12.0",
39
+ "ws": "^8.18.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/better-sqlite3": "^7.6.0",
43
+ "@types/express": "^5.0.0",
44
+ "@types/ws": "^8.5.0",
45
+ "tsx": "^4.19.0"
46
+ }
47
+ }