genbox-agent 0.0.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/dist/daemon.d.ts +12 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +272 -0
- package/dist/daemon.js.map +1 -0
- package/dist/hook.d.ts +15 -0
- package/dist/hook.d.ts.map +1 -0
- package/dist/hook.js +207 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/session-manager.d.ts +52 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +253 -0
- package/dist/session-manager.js.map +1 -0
- package/package.json +28 -0
- package/src/daemon.ts +329 -0
- package/src/hook.ts +200 -0
- package/src/index.ts +1 -0
- package/src/session-manager.ts +270 -0
- package/tsconfig.json +19 -0
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Genbox Agent Daemon
|
|
4
|
+
*
|
|
5
|
+
* WebSocket client that runs on each genbox VM and:
|
|
6
|
+
* 1. Connects to the backend monitoring service
|
|
7
|
+
* 2. Receives remote commands (send_prompt, send_keystroke, create_session)
|
|
8
|
+
* 3. Manages tmux sessions running Claude Code
|
|
9
|
+
* 4. Streams terminal output back to the dashboard
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Genbox Agent Daemon
|
|
5
|
+
*
|
|
6
|
+
* WebSocket client that runs on each genbox VM and:
|
|
7
|
+
* 1. Connects to the backend monitoring service
|
|
8
|
+
* 2. Receives remote commands (send_prompt, send_keystroke, create_session)
|
|
9
|
+
* 3. Manages tmux sessions running Claude Code
|
|
10
|
+
* 4. Streams terminal output back to the dashboard
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
14
|
+
const session_manager_1 = require("./session-manager");
|
|
15
|
+
// Configuration from environment
|
|
16
|
+
const GENBOX_ID = process.env.GENBOX_ID || '';
|
|
17
|
+
const GENBOX_TOKEN = process.env.GENBOX_TOKEN || '';
|
|
18
|
+
const MONITORING_WS_URL = process.env.MONITORING_WS_URL || 'http://localhost:3001';
|
|
19
|
+
// Output polling interval (ms)
|
|
20
|
+
const OUTPUT_POLL_INTERVAL = 2000;
|
|
21
|
+
class GenboxAgentDaemon {
|
|
22
|
+
genboxId;
|
|
23
|
+
token;
|
|
24
|
+
wsUrl;
|
|
25
|
+
socket = null;
|
|
26
|
+
sessionManager;
|
|
27
|
+
running = false;
|
|
28
|
+
outputPollers = new Map();
|
|
29
|
+
constructor(genboxId, token, wsUrl) {
|
|
30
|
+
this.genboxId = genboxId;
|
|
31
|
+
this.token = token;
|
|
32
|
+
this.wsUrl = wsUrl;
|
|
33
|
+
this.sessionManager = new session_manager_1.SessionManager(genboxId);
|
|
34
|
+
}
|
|
35
|
+
async connect() {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
console.log(`Connecting to ${this.wsUrl}/claude-ws...`);
|
|
38
|
+
this.socket = (0, socket_io_client_1.io)(`${this.wsUrl}/claude-ws`, {
|
|
39
|
+
query: { genboxId: this.genboxId, type: 'genbox' },
|
|
40
|
+
auth: { genboxId: this.genboxId, token: this.token },
|
|
41
|
+
transports: ['websocket', 'polling'],
|
|
42
|
+
reconnection: true,
|
|
43
|
+
reconnectionAttempts: Infinity,
|
|
44
|
+
reconnectionDelay: 1000,
|
|
45
|
+
reconnectionDelayMax: 30000,
|
|
46
|
+
});
|
|
47
|
+
this.socket.on('connect', () => {
|
|
48
|
+
console.log(`[${this.genboxId}] Connected to monitoring server`);
|
|
49
|
+
this.running = true;
|
|
50
|
+
this.onConnect();
|
|
51
|
+
resolve(true);
|
|
52
|
+
});
|
|
53
|
+
this.socket.on('disconnect', (reason) => {
|
|
54
|
+
console.log(`[${this.genboxId}] Disconnected: ${reason}`);
|
|
55
|
+
this.running = false;
|
|
56
|
+
});
|
|
57
|
+
this.socket.on('connect_error', (error) => {
|
|
58
|
+
console.error(`[${this.genboxId}] Connection error:`, error.message);
|
|
59
|
+
});
|
|
60
|
+
// Register event handlers
|
|
61
|
+
this.socket.on('send_prompt', this.onSendPrompt.bind(this));
|
|
62
|
+
this.socket.on('send_keystroke', this.onSendKeystroke.bind(this));
|
|
63
|
+
this.socket.on('create_session', this.onCreateSession.bind(this));
|
|
64
|
+
this.socket.on('get_output', this.onGetOutput.bind(this));
|
|
65
|
+
this.socket.on('kill_session', this.onKillSession.bind(this));
|
|
66
|
+
this.socket.on('list_sessions', this.onListSessions.bind(this));
|
|
67
|
+
this.socket.on('error', this.onError.bind(this));
|
|
68
|
+
// Timeout after 10 seconds
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
if (!this.socket?.connected) {
|
|
71
|
+
console.error('Connection timeout');
|
|
72
|
+
resolve(false);
|
|
73
|
+
}
|
|
74
|
+
}, 10000);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
onConnect() {
|
|
78
|
+
// Register as genbox agent
|
|
79
|
+
this.socket?.emit('register_agent', {
|
|
80
|
+
genboxId: this.genboxId,
|
|
81
|
+
token: this.token,
|
|
82
|
+
});
|
|
83
|
+
// Send initial session list
|
|
84
|
+
const sessions = this.sessionManager.listSessions();
|
|
85
|
+
this.socket?.emit('agent_sessions', {
|
|
86
|
+
genboxId: this.genboxId,
|
|
87
|
+
sessions,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
onSendPrompt(data) {
|
|
91
|
+
const { sessionId, prompt, requestId } = data;
|
|
92
|
+
if (!sessionId || !prompt)
|
|
93
|
+
return;
|
|
94
|
+
console.log(`[${this.genboxId}] Sending prompt to ${sessionId}: ${prompt.slice(0, 50)}...`);
|
|
95
|
+
const success = this.sessionManager.sendPrompt(sessionId, prompt);
|
|
96
|
+
this.socket?.emit('prompt_result', {
|
|
97
|
+
genboxId: this.genboxId,
|
|
98
|
+
sessionId,
|
|
99
|
+
requestId,
|
|
100
|
+
success,
|
|
101
|
+
});
|
|
102
|
+
// Capture output after a delay
|
|
103
|
+
if (success) {
|
|
104
|
+
setTimeout(() => this.captureAndSendOutput(sessionId), 1000);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
onSendKeystroke(data) {
|
|
108
|
+
const { sessionId, key, requestId } = data;
|
|
109
|
+
if (!sessionId || !key)
|
|
110
|
+
return;
|
|
111
|
+
console.log(`[${this.genboxId}] Sending keystroke to ${sessionId}: ${key}`);
|
|
112
|
+
const success = this.sessionManager.sendKeystroke(sessionId, key);
|
|
113
|
+
this.socket?.emit('keystroke_result', {
|
|
114
|
+
genboxId: this.genboxId,
|
|
115
|
+
sessionId,
|
|
116
|
+
requestId,
|
|
117
|
+
success,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
onCreateSession(data) {
|
|
121
|
+
const { projectPath = '/home/dev', requestId } = data;
|
|
122
|
+
console.log(`[${this.genboxId}] Creating new session at ${projectPath}`);
|
|
123
|
+
const session = this.sessionManager.createSession(projectPath);
|
|
124
|
+
if (session) {
|
|
125
|
+
this.socket?.emit('session_created', {
|
|
126
|
+
genboxId: this.genboxId,
|
|
127
|
+
sessionId: session.sessionId,
|
|
128
|
+
sessionName: session.sessionName,
|
|
129
|
+
projectPath: session.projectPath,
|
|
130
|
+
requestId,
|
|
131
|
+
success: true,
|
|
132
|
+
});
|
|
133
|
+
// Start output polling for this session
|
|
134
|
+
this.startOutputPolling(session.sessionId);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.socket?.emit('session_created', {
|
|
138
|
+
genboxId: this.genboxId,
|
|
139
|
+
requestId,
|
|
140
|
+
success: false,
|
|
141
|
+
error: 'Failed to create session',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
onGetOutput(data) {
|
|
146
|
+
const { sessionId, lines = 100, requestId } = data;
|
|
147
|
+
if (!sessionId)
|
|
148
|
+
return;
|
|
149
|
+
const output = this.sessionManager.getOutput(sessionId, lines);
|
|
150
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
151
|
+
this.socket?.emit('output_update', {
|
|
152
|
+
genboxId: this.genboxId,
|
|
153
|
+
sessionId,
|
|
154
|
+
requestId,
|
|
155
|
+
output: output || '',
|
|
156
|
+
status,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
onKillSession(data) {
|
|
160
|
+
const { sessionId, requestId } = data;
|
|
161
|
+
if (!sessionId)
|
|
162
|
+
return;
|
|
163
|
+
console.log(`[${this.genboxId}] Killing session ${sessionId}`);
|
|
164
|
+
const success = this.sessionManager.killSession(sessionId);
|
|
165
|
+
this.stopOutputPolling(sessionId);
|
|
166
|
+
this.socket?.emit('session_killed', {
|
|
167
|
+
genboxId: this.genboxId,
|
|
168
|
+
sessionId,
|
|
169
|
+
requestId,
|
|
170
|
+
success,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
onListSessions(data) {
|
|
174
|
+
const { requestId } = data;
|
|
175
|
+
const sessions = this.sessionManager.listSessions();
|
|
176
|
+
this.socket?.emit('sessions_list', {
|
|
177
|
+
genboxId: this.genboxId,
|
|
178
|
+
requestId,
|
|
179
|
+
sessions,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
onError(data) {
|
|
183
|
+
console.error(`[${this.genboxId}] Error from server:`, data);
|
|
184
|
+
}
|
|
185
|
+
startOutputPolling(sessionId) {
|
|
186
|
+
if (this.outputPollers.has(sessionId))
|
|
187
|
+
return;
|
|
188
|
+
let lastOutput = '';
|
|
189
|
+
const poller = setInterval(() => {
|
|
190
|
+
if (!this.running) {
|
|
191
|
+
this.stopOutputPolling(sessionId);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const output = this.sessionManager.getOutput(sessionId, 100);
|
|
195
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
196
|
+
// Only send if output changed
|
|
197
|
+
if (output && output !== lastOutput) {
|
|
198
|
+
lastOutput = output;
|
|
199
|
+
this.socket?.emit('output_update', {
|
|
200
|
+
genboxId: this.genboxId,
|
|
201
|
+
sessionId,
|
|
202
|
+
output,
|
|
203
|
+
status,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// Stop polling if session ended
|
|
207
|
+
if (status === 'ended') {
|
|
208
|
+
this.stopOutputPolling(sessionId);
|
|
209
|
+
}
|
|
210
|
+
}, OUTPUT_POLL_INTERVAL);
|
|
211
|
+
this.outputPollers.set(sessionId, poller);
|
|
212
|
+
}
|
|
213
|
+
stopOutputPolling(sessionId) {
|
|
214
|
+
const poller = this.outputPollers.get(sessionId);
|
|
215
|
+
if (poller) {
|
|
216
|
+
clearInterval(poller);
|
|
217
|
+
this.outputPollers.delete(sessionId);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
captureAndSendOutput(sessionId) {
|
|
221
|
+
const output = this.sessionManager.getOutput(sessionId, 100);
|
|
222
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
223
|
+
if (output && this.socket?.connected) {
|
|
224
|
+
this.socket.emit('output_update', {
|
|
225
|
+
genboxId: this.genboxId,
|
|
226
|
+
sessionId,
|
|
227
|
+
output,
|
|
228
|
+
status,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async run() {
|
|
233
|
+
console.log(`Starting Genbox Agent Daemon for ${this.genboxId}`);
|
|
234
|
+
const connected = await this.connect();
|
|
235
|
+
if (!connected) {
|
|
236
|
+
console.log('Initial connection failed, will keep retrying...');
|
|
237
|
+
}
|
|
238
|
+
// Keep running
|
|
239
|
+
await new Promise((resolve) => {
|
|
240
|
+
const shutdown = () => {
|
|
241
|
+
console.log('Shutting down...');
|
|
242
|
+
this.running = false;
|
|
243
|
+
// Stop all output pollers
|
|
244
|
+
for (const sessionId of this.outputPollers.keys()) {
|
|
245
|
+
this.stopOutputPolling(sessionId);
|
|
246
|
+
}
|
|
247
|
+
this.socket?.disconnect();
|
|
248
|
+
resolve();
|
|
249
|
+
};
|
|
250
|
+
process.on('SIGTERM', shutdown);
|
|
251
|
+
process.on('SIGINT', shutdown);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Main entry point
|
|
256
|
+
async function main() {
|
|
257
|
+
if (!GENBOX_ID) {
|
|
258
|
+
console.error('Error: GENBOX_ID environment variable not set');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
if (!GENBOX_TOKEN) {
|
|
262
|
+
console.error('Error: GENBOX_TOKEN environment variable not set');
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
const daemon = new GenboxAgentDaemon(GENBOX_ID, GENBOX_TOKEN, MONITORING_WS_URL);
|
|
266
|
+
await daemon.run();
|
|
267
|
+
}
|
|
268
|
+
main().catch((error) => {
|
|
269
|
+
console.error('Fatal error:', error);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/hook.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code Hook Script
|
|
4
|
+
*
|
|
5
|
+
* Called by Claude Code hooks to report all interactions to the backend.
|
|
6
|
+
* This script reads from stdin (hook input) and POSTs to the monitoring API.
|
|
7
|
+
*
|
|
8
|
+
* Environment variables:
|
|
9
|
+
* - GENBOX_ID: Unique identifier for this genbox
|
|
10
|
+
* - GENBOX_TOKEN: Authentication token for the API
|
|
11
|
+
* - MONITORING_API_URL: Base URL for the monitoring API
|
|
12
|
+
* - CLAUDE_HOOK_TYPE: The type of hook being called (set by Claude Code)
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
package/dist/hook.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Claude Code Hook Script
|
|
5
|
+
*
|
|
6
|
+
* Called by Claude Code hooks to report all interactions to the backend.
|
|
7
|
+
* This script reads from stdin (hook input) and POSTs to the monitoring API.
|
|
8
|
+
*
|
|
9
|
+
* Environment variables:
|
|
10
|
+
* - GENBOX_ID: Unique identifier for this genbox
|
|
11
|
+
* - GENBOX_TOKEN: Authentication token for the API
|
|
12
|
+
* - MONITORING_API_URL: Base URL for the monitoring API
|
|
13
|
+
* - CLAUDE_HOOK_TYPE: The type of hook being called (set by Claude Code)
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const crypto = __importStar(require("crypto"));
|
|
52
|
+
const http = __importStar(require("http"));
|
|
53
|
+
const https = __importStar(require("https"));
|
|
54
|
+
// Configuration
|
|
55
|
+
const GENBOX_ID = process.env.GENBOX_ID || '';
|
|
56
|
+
const GENBOX_TOKEN = process.env.GENBOX_TOKEN || '';
|
|
57
|
+
const MONITORING_API_URL = process.env.MONITORING_API_URL || 'http://localhost:3001';
|
|
58
|
+
const HOOK_TYPE = process.env.CLAUDE_HOOK_TYPE || 'Unknown';
|
|
59
|
+
// Session file path
|
|
60
|
+
const SESSION_FILE = path.join(process.env.HOME || '/tmp', '.claude-session-id');
|
|
61
|
+
function getOrCreateSessionId() {
|
|
62
|
+
try {
|
|
63
|
+
if (fs.existsSync(SESSION_FILE)) {
|
|
64
|
+
return fs.readFileSync(SESSION_FILE, 'utf-8').trim();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Ignore read errors
|
|
69
|
+
}
|
|
70
|
+
// Generate new session ID
|
|
71
|
+
const sessionId = crypto
|
|
72
|
+
.createHash('sha256')
|
|
73
|
+
.update(`${GENBOX_ID}-${Date.now()}-${process.pid}`)
|
|
74
|
+
.digest('hex')
|
|
75
|
+
.slice(0, 32);
|
|
76
|
+
try {
|
|
77
|
+
fs.writeFileSync(SESSION_FILE, sessionId);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Ignore write errors
|
|
81
|
+
}
|
|
82
|
+
return sessionId;
|
|
83
|
+
}
|
|
84
|
+
function clearSessionId() {
|
|
85
|
+
try {
|
|
86
|
+
if (fs.existsSync(SESSION_FILE)) {
|
|
87
|
+
fs.unlinkSync(SESSION_FILE);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Ignore errors
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function getTmuxSession() {
|
|
95
|
+
if (process.env.TMUX) {
|
|
96
|
+
const tmuxPane = process.env.TMUX_PANE || '';
|
|
97
|
+
return tmuxPane.split(',')[0] || undefined;
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
async function sendEvent(eventData) {
|
|
102
|
+
if (!GENBOX_ID || !GENBOX_TOKEN) {
|
|
103
|
+
console.error('Warning: GENBOX_ID or GENBOX_TOKEN not set, skipping event');
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const url = new URL('/claude/events', MONITORING_API_URL);
|
|
107
|
+
// Add metadata
|
|
108
|
+
eventData.genboxId = GENBOX_ID;
|
|
109
|
+
eventData.genboxToken = GENBOX_TOKEN;
|
|
110
|
+
eventData.sessionId = getOrCreateSessionId();
|
|
111
|
+
eventData.tmuxSession = getTmuxSession();
|
|
112
|
+
eventData.projectPath = process.cwd();
|
|
113
|
+
eventData.timestamp = new Date().toISOString();
|
|
114
|
+
const data = JSON.stringify(eventData);
|
|
115
|
+
const isHttps = url.protocol === 'https:';
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
const options = {
|
|
118
|
+
hostname: url.hostname,
|
|
119
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
120
|
+
path: url.pathname,
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'Content-Length': Buffer.byteLength(data),
|
|
125
|
+
'X-Genbox-Token': GENBOX_TOKEN,
|
|
126
|
+
},
|
|
127
|
+
timeout: 5000,
|
|
128
|
+
};
|
|
129
|
+
const req = (isHttps ? https : http).request(options, (res) => {
|
|
130
|
+
resolve(res.statusCode === 200 || res.statusCode === 201);
|
|
131
|
+
});
|
|
132
|
+
req.on('error', (error) => {
|
|
133
|
+
console.error(`Warning: Failed to send event: ${error.message}`);
|
|
134
|
+
resolve(false);
|
|
135
|
+
});
|
|
136
|
+
req.on('timeout', () => {
|
|
137
|
+
req.destroy();
|
|
138
|
+
console.error('Warning: Request timeout');
|
|
139
|
+
resolve(false);
|
|
140
|
+
});
|
|
141
|
+
req.write(data);
|
|
142
|
+
req.end();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function parseHookInput(input) {
|
|
146
|
+
try {
|
|
147
|
+
if (!input.trim()) {
|
|
148
|
+
return {};
|
|
149
|
+
}
|
|
150
|
+
return JSON.parse(input);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return { raw_input: input };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function main() {
|
|
157
|
+
// Read input from stdin
|
|
158
|
+
let input = '';
|
|
159
|
+
if (!process.stdin.isTTY) {
|
|
160
|
+
input = fs.readFileSync(0, 'utf-8');
|
|
161
|
+
}
|
|
162
|
+
const hookInput = parseHookInput(input);
|
|
163
|
+
// Build event data based on hook type
|
|
164
|
+
const eventData = {
|
|
165
|
+
eventType: HOOK_TYPE,
|
|
166
|
+
};
|
|
167
|
+
switch (HOOK_TYPE) {
|
|
168
|
+
case 'PreToolUse':
|
|
169
|
+
eventData.toolName = hookInput.tool_name || '';
|
|
170
|
+
eventData.toolInput = hookInput.tool_input || {};
|
|
171
|
+
break;
|
|
172
|
+
case 'PostToolUse':
|
|
173
|
+
eventData.toolName = hookInput.tool_name || '';
|
|
174
|
+
eventData.toolInput = hookInput.tool_input || {};
|
|
175
|
+
eventData.toolResponse = hookInput.tool_response || {};
|
|
176
|
+
eventData.success = hookInput.tool_response?.success !== false;
|
|
177
|
+
break;
|
|
178
|
+
case 'UserPromptSubmit':
|
|
179
|
+
const prompt = hookInput.prompt || '';
|
|
180
|
+
eventData.prompt = prompt;
|
|
181
|
+
eventData.promptLength = prompt.length;
|
|
182
|
+
break;
|
|
183
|
+
case 'Stop':
|
|
184
|
+
eventData.stopReason = hookInput.stop_reason || '';
|
|
185
|
+
break;
|
|
186
|
+
case 'SubagentStop':
|
|
187
|
+
eventData.subagentType = hookInput.subagent_type || '';
|
|
188
|
+
eventData.stopReason = hookInput.stop_reason || '';
|
|
189
|
+
break;
|
|
190
|
+
case 'Notification':
|
|
191
|
+
eventData.notification = hookInput.message || '';
|
|
192
|
+
break;
|
|
193
|
+
case 'SessionStart':
|
|
194
|
+
eventData.cliVersion = hookInput.cli_version || '';
|
|
195
|
+
break;
|
|
196
|
+
case 'SessionEnd':
|
|
197
|
+
clearSessionId();
|
|
198
|
+
eventData.sessionDuration = hookInput.duration_ms || 0;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
// Send the event (don't await - fire and forget)
|
|
202
|
+
sendEvent(eventData).catch(() => { });
|
|
203
|
+
// Exit immediately - hooks should not block Claude
|
|
204
|
+
process.exit(0);
|
|
205
|
+
}
|
|
206
|
+
main().catch(() => process.exit(0));
|
|
207
|
+
//# sourceMappingURL=hook.js.map
|
package/dist/hook.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionManager = void 0;
|
|
4
|
+
var session_manager_1 = require("./session-manager");
|
|
5
|
+
Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_manager_1.SessionManager; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkE;AAAzD,iHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface ClaudeSession {
|
|
2
|
+
sessionName: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
projectPath: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
status: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Manages tmux sessions running Claude Code.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SessionManager {
|
|
12
|
+
private readonly genboxId;
|
|
13
|
+
private readonly TMUX_PREFIX;
|
|
14
|
+
private sessions;
|
|
15
|
+
constructor(genboxId: string);
|
|
16
|
+
private runTmux;
|
|
17
|
+
private generateSessionId;
|
|
18
|
+
/**
|
|
19
|
+
* Create a new Claude Code session in tmux.
|
|
20
|
+
*/
|
|
21
|
+
createSession(projectPath?: string): ClaudeSession | null;
|
|
22
|
+
/**
|
|
23
|
+
* Send a prompt to a Claude Code session.
|
|
24
|
+
*/
|
|
25
|
+
sendPrompt(sessionId: string, prompt: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Send a keystroke to a Claude Code session.
|
|
28
|
+
*/
|
|
29
|
+
sendKeystroke(sessionId: string, key: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Capture the terminal output from a session.
|
|
32
|
+
*/
|
|
33
|
+
getOutput(sessionId: string, lines?: number): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Get the status of a session.
|
|
36
|
+
*/
|
|
37
|
+
getSessionStatus(sessionId: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Kill a Claude Code session.
|
|
40
|
+
*/
|
|
41
|
+
killSession(sessionId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* List all Claude Code sessions.
|
|
44
|
+
*/
|
|
45
|
+
listSessions(): Array<{
|
|
46
|
+
sessionId: string;
|
|
47
|
+
sessionName: string;
|
|
48
|
+
createdAt: number;
|
|
49
|
+
status: string;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAyC;gBAE5B,QAAQ,EAAE,MAAM;IAE7C,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,aAAa,CAAC,WAAW,SAAc,GAAG,aAAa,GAAG,IAAI;IAwC9D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAgCtD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAiCtD;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,GAAG,IAAI;IAcxD;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA8B3C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAavC;;OAEG;IACH,YAAY,IAAI,KAAK,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAoCH"}
|