@abdasis/agentdeck 2.44.2
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/README.md +122 -0
- package/agent/dist/config.d.ts +31 -0
- package/agent/dist/config.d.ts.map +1 -0
- package/agent/dist/config.js +81 -0
- package/agent/dist/config.js.map +1 -0
- package/agent/dist/db/commands.d.ts +25 -0
- package/agent/dist/db/commands.d.ts.map +1 -0
- package/agent/dist/db/commands.js +93 -0
- package/agent/dist/db/commands.js.map +1 -0
- package/agent/dist/db/index.d.ts +30 -0
- package/agent/dist/db/index.d.ts.map +1 -0
- package/agent/dist/db/index.js +368 -0
- package/agent/dist/db/index.js.map +1 -0
- package/agent/dist/db/schema.d.ts +74 -0
- package/agent/dist/db/schema.d.ts.map +1 -0
- package/agent/dist/db/schema.js +100 -0
- package/agent/dist/db/schema.js.map +1 -0
- package/agent/dist/db/sessions.d.ts +46 -0
- package/agent/dist/db/sessions.d.ts.map +1 -0
- package/agent/dist/db/sessions.js +198 -0
- package/agent/dist/db/sessions.js.map +1 -0
- package/agent/dist/index.d.ts +2 -0
- package/agent/dist/index.d.ts.map +1 -0
- package/agent/dist/index.js +19 -0
- package/agent/dist/index.js.map +1 -0
- package/agent/dist/lib/command-session.d.ts +20 -0
- package/agent/dist/lib/command-session.d.ts.map +1 -0
- package/agent/dist/lib/command-session.js +64 -0
- package/agent/dist/lib/command-session.js.map +1 -0
- package/agent/dist/lib/git.d.ts +8 -0
- package/agent/dist/lib/git.d.ts.map +1 -0
- package/agent/dist/lib/git.js +194 -0
- package/agent/dist/lib/git.js.map +1 -0
- package/agent/dist/lib/init-script.d.ts +33 -0
- package/agent/dist/lib/init-script.d.ts.map +1 -0
- package/agent/dist/lib/init-script.js +523 -0
- package/agent/dist/lib/init-script.js.map +1 -0
- package/agent/dist/lib/transcript.d.ts +16 -0
- package/agent/dist/lib/transcript.d.ts.map +1 -0
- package/agent/dist/lib/transcript.js +64 -0
- package/agent/dist/lib/transcript.js.map +1 -0
- package/agent/dist/logger.d.ts +12 -0
- package/agent/dist/logger.d.ts.map +1 -0
- package/agent/dist/logger.js +39 -0
- package/agent/dist/logger.js.map +1 -0
- package/agent/dist/middleware/auth.d.ts +15 -0
- package/agent/dist/middleware/auth.d.ts.map +1 -0
- package/agent/dist/middleware/auth.js +55 -0
- package/agent/dist/middleware/auth.js.map +1 -0
- package/agent/dist/routes/commands.d.ts +8 -0
- package/agent/dist/routes/commands.d.ts.map +1 -0
- package/agent/dist/routes/commands.js +229 -0
- package/agent/dist/routes/commands.js.map +1 -0
- package/agent/dist/routes/files.d.ts +7 -0
- package/agent/dist/routes/files.d.ts.map +1 -0
- package/agent/dist/routes/files.js +206 -0
- package/agent/dist/routes/files.js.map +1 -0
- package/agent/dist/routes/hooks.d.ts +7 -0
- package/agent/dist/routes/hooks.d.ts.map +1 -0
- package/agent/dist/routes/hooks.js +147 -0
- package/agent/dist/routes/hooks.js.map +1 -0
- package/agent/dist/routes/index.d.ts +10 -0
- package/agent/dist/routes/index.d.ts.map +1 -0
- package/agent/dist/routes/index.js +10 -0
- package/agent/dist/routes/index.js.map +1 -0
- package/agent/dist/routes/pair.d.ts +26 -0
- package/agent/dist/routes/pair.d.ts.map +1 -0
- package/agent/dist/routes/pair.js +384 -0
- package/agent/dist/routes/pair.js.map +1 -0
- package/agent/dist/routes/projects.d.ts +6 -0
- package/agent/dist/routes/projects.d.ts.map +1 -0
- package/agent/dist/routes/projects.js +121 -0
- package/agent/dist/routes/projects.js.map +1 -0
- package/agent/dist/routes/sessions-git.d.ts +7 -0
- package/agent/dist/routes/sessions-git.d.ts.map +1 -0
- package/agent/dist/routes/sessions-git.js +31 -0
- package/agent/dist/routes/sessions-git.js.map +1 -0
- package/agent/dist/routes/sessions-tmux.d.ts +7 -0
- package/agent/dist/routes/sessions-tmux.d.ts.map +1 -0
- package/agent/dist/routes/sessions-tmux.js +94 -0
- package/agent/dist/routes/sessions-tmux.js.map +1 -0
- package/agent/dist/routes/sessions.d.ts +7 -0
- package/agent/dist/routes/sessions.d.ts.map +1 -0
- package/agent/dist/routes/sessions.js +172 -0
- package/agent/dist/routes/sessions.js.map +1 -0
- package/agent/dist/server.d.ts +6 -0
- package/agent/dist/server.d.ts.map +1 -0
- package/agent/dist/server.js +95 -0
- package/agent/dist/server.js.map +1 -0
- package/agent/dist/terminal.d.ts +19 -0
- package/agent/dist/terminal.d.ts.map +1 -0
- package/agent/dist/terminal.js +175 -0
- package/agent/dist/terminal.js.map +1 -0
- package/agent/dist/updater.d.ts +18 -0
- package/agent/dist/updater.d.ts.map +1 -0
- package/agent/dist/updater.js +122 -0
- package/agent/dist/updater.js.map +1 -0
- package/agent/dist/version.d.ts +20 -0
- package/agent/dist/version.d.ts.map +1 -0
- package/agent/dist/version.js +66 -0
- package/agent/dist/version.js.map +1 -0
- package/agent/dist/websocket-handlers.d.ts +38 -0
- package/agent/dist/websocket-handlers.d.ts.map +1 -0
- package/agent/dist/websocket-handlers.js +389 -0
- package/agent/dist/websocket-handlers.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts +235 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js +5 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/package.json +29 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +304 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +187 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +109 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +38 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +156 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/service.d.ts +3 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +235 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +122 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +48 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +23 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +129 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +39 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +68 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +156 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +67 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +353 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/paths.d.ts +36 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +77 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +60 -0
- package/dist/lib/prerequisites.d.ts.map +1 -0
- package/dist/lib/prerequisites.js +266 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +40 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +192 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/service/index.d.ts +44 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +18 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/launchd.d.ts +18 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +208 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/systemd.d.ts +18 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +196 -0
- package/dist/service/systemd.js.map +1 -0
- package/hooks/notify-agentdeck.sh +53 -0
- package/package.json +83 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket handlers for terminal connections and sessions subscriptions.
|
|
3
|
+
* Simplified version without status tracking, worktree or execution manager features.
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocket } from 'ws';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { createTerminal } from './terminal.js';
|
|
8
|
+
import { config } from './config.js';
|
|
9
|
+
import * as sessionsDb from './db/sessions.js';
|
|
10
|
+
import { getAgentVersion, needsUpdate } from './version.js';
|
|
11
|
+
import { triggerUpdate, isUpdateInProgress } from './updater.js';
|
|
12
|
+
// Connection tracking
|
|
13
|
+
const activeConnections = new Map();
|
|
14
|
+
const sessionsSubscribers = new Set();
|
|
15
|
+
// Generate unique session name
|
|
16
|
+
let sessionCounter = 0;
|
|
17
|
+
function generateSessionName(project) {
|
|
18
|
+
const timestamp = Date.now().toString(36);
|
|
19
|
+
const counter = (sessionCounter++).toString(36);
|
|
20
|
+
return `${project}--${timestamp}${counter}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if a tmux session exists
|
|
24
|
+
*/
|
|
25
|
+
function tmuxSessionExists(sessionName) {
|
|
26
|
+
try {
|
|
27
|
+
execSync(`tmux has-session -t "${sessionName}" 2>/dev/null`);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Broadcast session removed event to all subscribers
|
|
36
|
+
*/
|
|
37
|
+
export function broadcastSessionRemoved(sessionName) {
|
|
38
|
+
const message = {
|
|
39
|
+
type: 'session-removed',
|
|
40
|
+
sessionName,
|
|
41
|
+
};
|
|
42
|
+
const payload = JSON.stringify(message);
|
|
43
|
+
for (const ws of sessionsSubscribers) {
|
|
44
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
45
|
+
ws.send(payload);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Broadcast session archived event to all subscribers
|
|
51
|
+
*/
|
|
52
|
+
export function broadcastSessionArchived(sessionName, session) {
|
|
53
|
+
const message = {
|
|
54
|
+
type: 'session-archived',
|
|
55
|
+
sessionName,
|
|
56
|
+
session,
|
|
57
|
+
};
|
|
58
|
+
const payload = JSON.stringify(message);
|
|
59
|
+
for (const ws of sessionsSubscribers) {
|
|
60
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
61
|
+
ws.send(payload);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Broadcast session status update to all subscribers
|
|
67
|
+
* Called when a hook notifies the agent of a status change
|
|
68
|
+
*/
|
|
69
|
+
export function broadcastStatusUpdate(session) {
|
|
70
|
+
const message = {
|
|
71
|
+
type: 'status-update',
|
|
72
|
+
session,
|
|
73
|
+
};
|
|
74
|
+
const payload = JSON.stringify(message);
|
|
75
|
+
console.log(`[Sessions WS] Broadcasting status update: session=${session.name} status=${session.status} reason=${session.attentionReason}`);
|
|
76
|
+
for (const ws of sessionsSubscribers) {
|
|
77
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
78
|
+
ws.send(payload);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Build the current sessions list from tmux + DB.
|
|
84
|
+
* Shared by the initial list sent on subscriber connect and by the broadcast
|
|
85
|
+
* fired when a session is created/removed, so the sidebar stays consistent.
|
|
86
|
+
*/
|
|
87
|
+
async function buildSessionsList() {
|
|
88
|
+
const { exec } = await import('child_process');
|
|
89
|
+
const { promisify } = await import('util');
|
|
90
|
+
const execAsync = promisify(exec);
|
|
91
|
+
const sessions = [];
|
|
92
|
+
// tmux list-sessions exit 1 (bukan error) saat tidak ada session/server
|
|
93
|
+
// jalan — anggap kosong, sama pola dengan routes/sessions.ts.
|
|
94
|
+
let stdout = '';
|
|
95
|
+
try {
|
|
96
|
+
const out = await execAsync('tmux list-sessions -F "#{session_name}|#{session_created}" 2>/dev/null');
|
|
97
|
+
stdout = out.stdout;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return sessions;
|
|
101
|
+
}
|
|
102
|
+
for (const line of stdout.trim().split('\n').filter(Boolean)) {
|
|
103
|
+
const [name, created] = line.split('|');
|
|
104
|
+
const [project] = name.split('--');
|
|
105
|
+
const dbSession = sessionsDb.getSession(name);
|
|
106
|
+
sessions.push(sessionsDb.dbSessionToInfo(name, project, parseInt(created) * 1000, dbSession));
|
|
107
|
+
}
|
|
108
|
+
return sessions;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Broadcast the full current sessions list to all /sessions subscribers.
|
|
112
|
+
* Called after a session is created so the sidebar updates without a reload
|
|
113
|
+
* (the WS /sessions stream is the source of truth, not the 30s HTTP poll).
|
|
114
|
+
*/
|
|
115
|
+
export async function broadcastSessionsList() {
|
|
116
|
+
try {
|
|
117
|
+
const sessions = await buildSessionsList();
|
|
118
|
+
const payload = JSON.stringify({
|
|
119
|
+
type: 'sessions-list',
|
|
120
|
+
sessions,
|
|
121
|
+
});
|
|
122
|
+
for (const ws of sessionsSubscribers) {
|
|
123
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
124
|
+
ws.send(payload);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error('[Sessions WS] Failed to broadcast sessions list:', err);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Handle terminal WebSocket connections
|
|
134
|
+
*/
|
|
135
|
+
export function handleTerminalConnection(ws, url) {
|
|
136
|
+
const project = url.searchParams.get('project');
|
|
137
|
+
const urlSessionName = url.searchParams.get('session');
|
|
138
|
+
const createFlag = url.searchParams.get('create') === 'true';
|
|
139
|
+
const sessionName = urlSessionName || generateSessionName(project || 'root');
|
|
140
|
+
// Validate project (empty string is allowed for "terminal at root")
|
|
141
|
+
const whitelist = config.projects.whitelist;
|
|
142
|
+
const hasWhitelist = whitelist && whitelist.length > 0;
|
|
143
|
+
// Allow empty string for root, but reject null/undefined
|
|
144
|
+
const isRootTerminal = project === '';
|
|
145
|
+
const isAllowed = isRootTerminal || (hasWhitelist ? whitelist.includes(project) : true);
|
|
146
|
+
if (project === null || project === undefined || !isAllowed) {
|
|
147
|
+
ws.close(1008, 'Project not allowed');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// For root terminal, use basePath directly; otherwise append project name
|
|
151
|
+
const basePath = config.projects.basePath.replace('~', process.env.HOME);
|
|
152
|
+
const projectPath = isRootTerminal ? basePath : `${basePath}/${project}`;
|
|
153
|
+
console.log(`New terminal connection for project: ${project}`);
|
|
154
|
+
console.log(`Project path: ${projectPath}`);
|
|
155
|
+
// Buffer for messages received before async setup completes
|
|
156
|
+
const messageBuffer = [];
|
|
157
|
+
let setupComplete = false;
|
|
158
|
+
let terminalRef = null;
|
|
159
|
+
// Register message handler IMMEDIATELY (before any async code)
|
|
160
|
+
ws.on('message', (data) => {
|
|
161
|
+
const msgStr = data.toString();
|
|
162
|
+
console.log(`[Terminal] Received message for '${sessionName}': ${msgStr.substring(0, 100)}...`);
|
|
163
|
+
if (!setupComplete || !terminalRef) {
|
|
164
|
+
console.log(`[Terminal] Buffering message (setup not complete)`);
|
|
165
|
+
messageBuffer.push(data);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const msg = JSON.parse(msgStr);
|
|
170
|
+
handleTerminalMessage(msg, terminalRef, ws, sessionName, project, projectPath);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
console.error('Failed to parse message:', err);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
// Async initialization
|
|
177
|
+
(async () => {
|
|
178
|
+
const fs = await import('fs');
|
|
179
|
+
if (!fs.existsSync(projectPath)) {
|
|
180
|
+
console.error(`Path does not exist: ${projectPath}`);
|
|
181
|
+
ws.close(1008, 'Project path not found');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Check if session exists before attempting to create/connect
|
|
185
|
+
const sessionExists = tmuxSessionExists(sessionName);
|
|
186
|
+
// If session doesn't exist and no create flag, reject the connection
|
|
187
|
+
if (!sessionExists && !createFlag) {
|
|
188
|
+
console.log(`[Terminal] Session '${sessionName}' not found and create flag not set, rejecting connection`);
|
|
189
|
+
ws.close(4001, 'Session not found');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Create terminal
|
|
193
|
+
let terminal;
|
|
194
|
+
try {
|
|
195
|
+
terminal = createTerminal(projectPath, sessionName, {});
|
|
196
|
+
terminalRef = terminal;
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
console.error('Failed to create terminal:', err);
|
|
200
|
+
ws.close(1011, 'Failed to create terminal');
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// Track connection
|
|
204
|
+
if (!activeConnections.has(sessionName)) {
|
|
205
|
+
activeConnections.set(sessionName, new Set());
|
|
206
|
+
}
|
|
207
|
+
activeConnections.get(sessionName).add(ws);
|
|
208
|
+
// Handle existing session reconnect
|
|
209
|
+
if (terminal.isExistingSession()) {
|
|
210
|
+
console.log(`Reconnecting to existing session '${sessionName}'`);
|
|
211
|
+
terminal
|
|
212
|
+
.captureHistory(10000)
|
|
213
|
+
.then((history) => {
|
|
214
|
+
if (history && ws.readyState === WebSocket.OPEN) {
|
|
215
|
+
ws.send(JSON.stringify({ type: 'history', data: history, lines: history.split('\n').length }));
|
|
216
|
+
}
|
|
217
|
+
})
|
|
218
|
+
.catch((err) => {
|
|
219
|
+
console.error(`Failed to capture history for '${sessionName}':`, err);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// New session - register in DB
|
|
224
|
+
const now = Date.now();
|
|
225
|
+
try {
|
|
226
|
+
sessionsDb.upsertSession(sessionName, {
|
|
227
|
+
project: project,
|
|
228
|
+
lastEvent: 'SessionCreated',
|
|
229
|
+
lastActivity: now,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
console.error(`Failed to persist session '${sessionName}':`, err);
|
|
234
|
+
}
|
|
235
|
+
// Notify sidebar subscribers so the new session appears without a reload.
|
|
236
|
+
broadcastSessionsList();
|
|
237
|
+
}
|
|
238
|
+
// Forward terminal output
|
|
239
|
+
terminal.onData((data) => {
|
|
240
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
241
|
+
ws.send(data);
|
|
242
|
+
if (data.length > 10 && !data.startsWith('\x1b')) {
|
|
243
|
+
console.log(`[Terminal] Sending ${data.length} bytes to client: ${data.substring(0, 100).replace(/\n/g, '\\n')}...`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
terminal.onExit(({ exitCode }) => {
|
|
248
|
+
console.log(`Terminal exited with code ${exitCode}`);
|
|
249
|
+
if (ws.readyState === WebSocket.OPEN)
|
|
250
|
+
ws.close(1000, 'Terminal closed');
|
|
251
|
+
});
|
|
252
|
+
// Process any messages that were buffered during async setup
|
|
253
|
+
setupComplete = true;
|
|
254
|
+
console.log(`[Terminal] Setup complete for '${sessionName}', processing ${messageBuffer.length} buffered messages`);
|
|
255
|
+
if (messageBuffer.length > 0) {
|
|
256
|
+
for (const bufferedData of messageBuffer) {
|
|
257
|
+
try {
|
|
258
|
+
const msg = JSON.parse(bufferedData.toString());
|
|
259
|
+
console.log(`[Terminal] Processing buffered message type: ${msg.type}`);
|
|
260
|
+
handleTerminalMessage(msg, terminal, ws, sessionName, project, projectPath);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
console.error('Failed to parse buffered message:', err);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
messageBuffer.length = 0;
|
|
267
|
+
}
|
|
268
|
+
ws.on('close', () => {
|
|
269
|
+
console.log(`Client disconnected, tmux session '${sessionName}' preserved`);
|
|
270
|
+
try {
|
|
271
|
+
terminal.removeAllListeners?.('data');
|
|
272
|
+
terminal.removeAllListeners?.('exit');
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
/* ignore */
|
|
276
|
+
}
|
|
277
|
+
terminal.detach();
|
|
278
|
+
const connections = activeConnections.get(sessionName);
|
|
279
|
+
if (connections) {
|
|
280
|
+
connections.delete(ws);
|
|
281
|
+
if (connections.size === 0)
|
|
282
|
+
activeConnections.delete(sessionName);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
ws.on('error', (err) => console.error('WebSocket error:', err));
|
|
286
|
+
})();
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Broadcast update-pending message to all sessions subscribers
|
|
290
|
+
*/
|
|
291
|
+
export function broadcastUpdatePending(targetVersion, message) {
|
|
292
|
+
const msg = {
|
|
293
|
+
type: 'update-pending',
|
|
294
|
+
targetVersion,
|
|
295
|
+
message,
|
|
296
|
+
};
|
|
297
|
+
const payload = JSON.stringify(msg);
|
|
298
|
+
for (const ws of sessionsSubscribers) {
|
|
299
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
300
|
+
ws.send(payload);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Handle individual terminal messages
|
|
306
|
+
*/
|
|
307
|
+
function handleTerminalMessage(msg, terminal, ws, _sessionName, _project, _projectPath) {
|
|
308
|
+
switch (msg.type) {
|
|
309
|
+
case 'input':
|
|
310
|
+
terminal.write(msg.data);
|
|
311
|
+
break;
|
|
312
|
+
case 'resize':
|
|
313
|
+
terminal.resize(msg.cols, msg.rows);
|
|
314
|
+
break;
|
|
315
|
+
case 'start-claude':
|
|
316
|
+
terminal.write(msg.mode === 'skip-permissions' ? 'claude --dangerously-skip-permissions\r' : 'claude\r');
|
|
317
|
+
break;
|
|
318
|
+
case 'ping':
|
|
319
|
+
ws.send(JSON.stringify({ type: 'pong' }));
|
|
320
|
+
break;
|
|
321
|
+
case 'request-history':
|
|
322
|
+
terminal
|
|
323
|
+
.captureHistory(msg.lines || 10000)
|
|
324
|
+
.then((history) => {
|
|
325
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
326
|
+
ws.send(JSON.stringify({ type: 'history', data: history, lines: history.split('\n').length }));
|
|
327
|
+
}
|
|
328
|
+
})
|
|
329
|
+
.catch((err) => console.error(`Failed to capture history:`, err));
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Handle sessions WebSocket connections (real-time session list updates)
|
|
335
|
+
*/
|
|
336
|
+
export function handleSessionsConnection(ws, url) {
|
|
337
|
+
console.log('[Sessions WS] New subscriber connected');
|
|
338
|
+
sessionsSubscribers.add(ws);
|
|
339
|
+
// Extract web version from query params and check for updates
|
|
340
|
+
const webVersion = url?.searchParams.get('v');
|
|
341
|
+
const agentVersion = getAgentVersion();
|
|
342
|
+
// Send agent version info to client
|
|
343
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
344
|
+
const versionMessage = {
|
|
345
|
+
type: 'version-info',
|
|
346
|
+
agentVersion,
|
|
347
|
+
};
|
|
348
|
+
ws.send(JSON.stringify(versionMessage));
|
|
349
|
+
}
|
|
350
|
+
// Check if update needed (only upgrade, never downgrade)
|
|
351
|
+
// Skip auto-update in cloud/Docker environments
|
|
352
|
+
const isCloudAgent = process.env.CLOUD_AGENT === 'true';
|
|
353
|
+
if (webVersion &&
|
|
354
|
+
!isUpdateInProgress() &&
|
|
355
|
+
!isCloudAgent &&
|
|
356
|
+
needsUpdate(agentVersion, webVersion)) {
|
|
357
|
+
console.log(`[Update] Version mismatch detected: agent=${agentVersion} web=${webVersion}`);
|
|
358
|
+
// Delay update to allow client connection to stabilize
|
|
359
|
+
setTimeout(() => {
|
|
360
|
+
triggerUpdate(webVersion);
|
|
361
|
+
}, 2000);
|
|
362
|
+
}
|
|
363
|
+
// Send initial session list
|
|
364
|
+
(async () => {
|
|
365
|
+
try {
|
|
366
|
+
const sessions = await buildSessionsList();
|
|
367
|
+
const message = { type: 'sessions-list', sessions };
|
|
368
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
369
|
+
ws.send(JSON.stringify(message));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
console.error('[Sessions WS] Failed to get initial sessions:', err);
|
|
374
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
375
|
+
const message = { type: 'sessions-list', sessions: [] };
|
|
376
|
+
ws.send(JSON.stringify(message));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
})();
|
|
380
|
+
ws.on('close', () => {
|
|
381
|
+
sessionsSubscribers.delete(ws);
|
|
382
|
+
console.log(`[Sessions WS] Subscriber disconnected (remaining: ${sessionsSubscribers.size})`);
|
|
383
|
+
});
|
|
384
|
+
ws.on('error', (err) => {
|
|
385
|
+
console.error('[Sessions WS] Error:', err);
|
|
386
|
+
sessionsSubscribers.delete(ws);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=websocket-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handlers.js","sourceRoot":"","sources":["../src/websocket-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
export type SessionStatus = 'init' | 'working' | 'needs_attention' | 'idle';
|
|
2
|
+
export type AttentionReason = string;
|
|
3
|
+
export type StatusSource = 'hook' | 'tmux';
|
|
4
|
+
export interface AttentionNotification {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
status: SessionStatus;
|
|
7
|
+
attentionReason?: AttentionReason;
|
|
8
|
+
source: StatusSource;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
eventType: string;
|
|
11
|
+
/** Path ke transcript JSONL Claude Code (dari hook Stop/SessionStart). */
|
|
12
|
+
transcriptPath?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Token usage kumulatif sebuah sesi, dijumlah dari transcript JSONL.
|
|
16
|
+
* Angka mentah (token count), bukan biaya.
|
|
17
|
+
*/
|
|
18
|
+
export interface SessionTokenUsage {
|
|
19
|
+
inputTokens: number;
|
|
20
|
+
outputTokens: number;
|
|
21
|
+
cacheReadTokens: number;
|
|
22
|
+
cacheCreationTokens: number;
|
|
23
|
+
}
|
|
24
|
+
export interface Machine {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
status: 'online' | 'offline';
|
|
28
|
+
lastSeen: Date | null;
|
|
29
|
+
config: MachineConfig | null;
|
|
30
|
+
createdAt: Date;
|
|
31
|
+
}
|
|
32
|
+
export interface MachineConfig {
|
|
33
|
+
projects: string[];
|
|
34
|
+
agentUrl?: string;
|
|
35
|
+
defaultProject?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface Session {
|
|
38
|
+
id: string;
|
|
39
|
+
machineId: string;
|
|
40
|
+
project: string | null;
|
|
41
|
+
tmuxSession: string | null;
|
|
42
|
+
startedAt: Date;
|
|
43
|
+
endedAt: Date | null;
|
|
44
|
+
}
|
|
45
|
+
export interface User {
|
|
46
|
+
id: string;
|
|
47
|
+
email: string;
|
|
48
|
+
name: string | null;
|
|
49
|
+
createdAt: Date;
|
|
50
|
+
}
|
|
51
|
+
export type ClaudeStartMode = 'normal' | 'skip-permissions';
|
|
52
|
+
export type WSMessageToAgent = {
|
|
53
|
+
type: 'input';
|
|
54
|
+
data: string;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'resize';
|
|
57
|
+
cols: number;
|
|
58
|
+
rows: number;
|
|
59
|
+
} | {
|
|
60
|
+
type: 'start-claude';
|
|
61
|
+
mode?: ClaudeStartMode;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'ping';
|
|
64
|
+
} | {
|
|
65
|
+
type: 'request-history';
|
|
66
|
+
lines?: number;
|
|
67
|
+
};
|
|
68
|
+
export type WSMessageFromAgent = {
|
|
69
|
+
type: 'output';
|
|
70
|
+
data: string;
|
|
71
|
+
} | {
|
|
72
|
+
type: 'connected';
|
|
73
|
+
session: string;
|
|
74
|
+
} | {
|
|
75
|
+
type: 'disconnected';
|
|
76
|
+
} | {
|
|
77
|
+
type: 'pong';
|
|
78
|
+
} | {
|
|
79
|
+
type: 'history';
|
|
80
|
+
data: string;
|
|
81
|
+
lines: number;
|
|
82
|
+
};
|
|
83
|
+
export interface WSSessionInfo {
|
|
84
|
+
name: string;
|
|
85
|
+
project: string;
|
|
86
|
+
lastEvent?: string;
|
|
87
|
+
createdAt: number;
|
|
88
|
+
lastActivity?: number;
|
|
89
|
+
archivedAt?: number;
|
|
90
|
+
status?: SessionStatus;
|
|
91
|
+
statusSource?: StatusSource;
|
|
92
|
+
attentionReason?: AttentionReason;
|
|
93
|
+
lastStatusChange?: number;
|
|
94
|
+
usage?: SessionTokenUsage;
|
|
95
|
+
model?: string;
|
|
96
|
+
costUsd?: number;
|
|
97
|
+
commandId?: number;
|
|
98
|
+
}
|
|
99
|
+
export type WSSessionsMessageFromAgent = {
|
|
100
|
+
type: 'sessions-list';
|
|
101
|
+
sessions: WSSessionInfo[];
|
|
102
|
+
} | {
|
|
103
|
+
type: 'session-removed';
|
|
104
|
+
sessionName: string;
|
|
105
|
+
} | {
|
|
106
|
+
type: 'session-archived';
|
|
107
|
+
sessionName: string;
|
|
108
|
+
session: WSSessionInfo;
|
|
109
|
+
} | {
|
|
110
|
+
type: 'status-update';
|
|
111
|
+
session: WSSessionInfo;
|
|
112
|
+
} | {
|
|
113
|
+
type: 'version-info';
|
|
114
|
+
agentVersion: string;
|
|
115
|
+
} | {
|
|
116
|
+
type: 'update-pending';
|
|
117
|
+
targetVersion: string;
|
|
118
|
+
message: string;
|
|
119
|
+
};
|
|
120
|
+
export interface RegisterMachineRequest {
|
|
121
|
+
id: string;
|
|
122
|
+
name: string;
|
|
123
|
+
config?: MachineConfig;
|
|
124
|
+
}
|
|
125
|
+
export interface AgentInfo {
|
|
126
|
+
machine: {
|
|
127
|
+
id: string;
|
|
128
|
+
name: string;
|
|
129
|
+
};
|
|
130
|
+
status: 'online' | 'offline';
|
|
131
|
+
projects: string[];
|
|
132
|
+
}
|
|
133
|
+
export interface ArchiveSessionResponse {
|
|
134
|
+
success: boolean;
|
|
135
|
+
message: string;
|
|
136
|
+
session?: WSSessionInfo;
|
|
137
|
+
}
|
|
138
|
+
export interface SessionOutputResponse {
|
|
139
|
+
sessionName: string;
|
|
140
|
+
output: string;
|
|
141
|
+
totalLines: number;
|
|
142
|
+
returnedLines: number;
|
|
143
|
+
isRunning: boolean;
|
|
144
|
+
capturedAt: number;
|
|
145
|
+
source?: 'live' | 'file' | 'database';
|
|
146
|
+
}
|
|
147
|
+
export interface SessionInputRequest {
|
|
148
|
+
text: string;
|
|
149
|
+
sendEnter?: boolean;
|
|
150
|
+
}
|
|
151
|
+
export interface SessionInputResponse {
|
|
152
|
+
success: boolean;
|
|
153
|
+
sessionName?: string;
|
|
154
|
+
bytesSent?: number;
|
|
155
|
+
error?: string;
|
|
156
|
+
}
|
|
157
|
+
export interface ProjectCommandRunState {
|
|
158
|
+
sessionName: string | null;
|
|
159
|
+
status: SessionStatus | null;
|
|
160
|
+
lastActivity: number | null;
|
|
161
|
+
}
|
|
162
|
+
export interface ProjectCommand {
|
|
163
|
+
id: number;
|
|
164
|
+
project: string;
|
|
165
|
+
name: string;
|
|
166
|
+
command: string;
|
|
167
|
+
cwd: string | null;
|
|
168
|
+
position: number;
|
|
169
|
+
createdAt: number;
|
|
170
|
+
updatedAt: number;
|
|
171
|
+
}
|
|
172
|
+
export interface ProjectCommandWithRunState extends ProjectCommand {
|
|
173
|
+
runState: ProjectCommandRunState;
|
|
174
|
+
}
|
|
175
|
+
export interface AgentConfig {
|
|
176
|
+
machine: {
|
|
177
|
+
id: string;
|
|
178
|
+
name: string;
|
|
179
|
+
};
|
|
180
|
+
agent?: {
|
|
181
|
+
port: number;
|
|
182
|
+
url: string;
|
|
183
|
+
};
|
|
184
|
+
projects: {
|
|
185
|
+
basePath: string;
|
|
186
|
+
whitelist: string[];
|
|
187
|
+
};
|
|
188
|
+
dashboard: {
|
|
189
|
+
apiUrl: string;
|
|
190
|
+
apiKey: string;
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
export interface GitCommit {
|
|
194
|
+
sha: string;
|
|
195
|
+
author: string;
|
|
196
|
+
email: string;
|
|
197
|
+
date: string;
|
|
198
|
+
message: string;
|
|
199
|
+
}
|
|
200
|
+
export type GitChangeStatus = 'M' | 'A' | 'D' | 'R' | 'C' | '?' | 'U';
|
|
201
|
+
export interface GitChange {
|
|
202
|
+
path: string;
|
|
203
|
+
status: GitChangeStatus;
|
|
204
|
+
oldPath?: string;
|
|
205
|
+
}
|
|
206
|
+
export interface GitHistoryResponse {
|
|
207
|
+
repo: boolean;
|
|
208
|
+
branch?: string;
|
|
209
|
+
ahead?: number;
|
|
210
|
+
behind?: number;
|
|
211
|
+
commits: GitCommit[];
|
|
212
|
+
changes: GitChange[];
|
|
213
|
+
insertions?: number;
|
|
214
|
+
deletions?: number;
|
|
215
|
+
fetchedAt: number;
|
|
216
|
+
}
|
|
217
|
+
export type DirEntryType = 'file' | 'dir' | 'symlink';
|
|
218
|
+
export interface DirEntry {
|
|
219
|
+
name: string;
|
|
220
|
+
type: DirEntryType;
|
|
221
|
+
}
|
|
222
|
+
export interface FileListResponse {
|
|
223
|
+
path: string;
|
|
224
|
+
entries: DirEntry[];
|
|
225
|
+
}
|
|
226
|
+
export interface FileContentResponse {
|
|
227
|
+
path: string;
|
|
228
|
+
name: string;
|
|
229
|
+
mimeType: string;
|
|
230
|
+
size: number;
|
|
231
|
+
encoding: 'text' | 'base64';
|
|
232
|
+
content: string;
|
|
233
|
+
truncated?: boolean;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Session Status Types (Hook-based attention notifications)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4DAA4D;AAC5D,+EAA+E"}
|