genbox-agent 0.0.2 → 1.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.
- package/dist/configure-hooks.d.ts +17 -0
- package/dist/configure-hooks.d.ts.map +1 -0
- package/dist/configure-hooks.js +235 -0
- package/dist/configure-hooks.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/base-provider.d.ts +125 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +217 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +35 -0
- package/dist/providers/claude-provider.d.ts.map +1 -0
- package/dist/providers/claude-provider.js +298 -0
- package/dist/providers/claude-provider.js.map +1 -0
- package/dist/providers/codex-provider.d.ts +73 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +426 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/gemini-provider.d.ts +37 -0
- package/dist/providers/gemini-provider.d.ts.map +1 -0
- package/dist/providers/gemini-provider.js +352 -0
- package/dist/providers/gemini-provider.js.map +1 -0
- package/dist/providers/index.d.ts +128 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +293 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/index.d.ts +123 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/unified-daemon.d.ts +18 -0
- package/dist/unified-daemon.d.ts.map +1 -0
- package/dist/unified-daemon.js +309 -0
- package/dist/unified-daemon.js.map +1 -0
- package/dist/unified-hook.d.ts +24 -0
- package/dist/unified-hook.d.ts.map +1 -0
- package/dist/unified-hook.js +173 -0
- package/dist/unified-hook.js.map +1 -0
- package/package.json +34 -8
- package/src/daemon.ts +0 -329
- package/src/hook.ts +0 -200
- package/src/index.ts +0 -1
- package/src/session-manager.ts +0 -270
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Unified Genbox Agent Daemon
|
|
5
|
+
*
|
|
6
|
+
* WebSocket client that runs on each genbox VM and supports multiple AI CLI tools:
|
|
7
|
+
* - Claude Code
|
|
8
|
+
* - Gemini CLI
|
|
9
|
+
* - OpenAI Codex CLI
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* 1. Connects to the backend monitoring service
|
|
13
|
+
* 2. Receives remote commands (send_prompt, send_keystroke, create_session)
|
|
14
|
+
* 3. Manages tmux sessions for all supported AI CLIs
|
|
15
|
+
* 4. Streams terminal output back to the dashboard
|
|
16
|
+
* 5. Auto-detects installed AI CLIs
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
20
|
+
const providers_1 = require("./providers");
|
|
21
|
+
// Configuration from environment
|
|
22
|
+
const GENBOX_ID = process.env.GENBOX_ID || '';
|
|
23
|
+
const GENBOX_TOKEN = process.env.GENBOX_TOKEN || '';
|
|
24
|
+
const MONITORING_WS_URL = process.env.MONITORING_WS_URL || 'http://localhost:3001';
|
|
25
|
+
// Output polling interval (ms)
|
|
26
|
+
const OUTPUT_POLL_INTERVAL = 2000;
|
|
27
|
+
class UnifiedGenboxDaemon {
|
|
28
|
+
genboxId;
|
|
29
|
+
token;
|
|
30
|
+
wsUrl;
|
|
31
|
+
socket = null;
|
|
32
|
+
sessionManager;
|
|
33
|
+
registry;
|
|
34
|
+
running = false;
|
|
35
|
+
outputPollers = new Map();
|
|
36
|
+
constructor(genboxId, token, wsUrl) {
|
|
37
|
+
this.genboxId = genboxId;
|
|
38
|
+
this.token = token;
|
|
39
|
+
this.wsUrl = wsUrl;
|
|
40
|
+
this.registry = providers_1.ProviderRegistry.getInstance();
|
|
41
|
+
this.sessionManager = new providers_1.UnifiedSessionManager(genboxId);
|
|
42
|
+
}
|
|
43
|
+
async connect() {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
console.log(`[${this.genboxId}] Connecting to ${this.wsUrl}/ai-monitoring...`);
|
|
46
|
+
this.socket = (0, socket_io_client_1.io)(`${this.wsUrl}/ai-monitoring`, {
|
|
47
|
+
query: { genboxId: this.genboxId, type: 'genbox' },
|
|
48
|
+
auth: { genboxId: this.genboxId, token: this.token },
|
|
49
|
+
transports: ['websocket', 'polling'],
|
|
50
|
+
reconnection: true,
|
|
51
|
+
reconnectionAttempts: Infinity,
|
|
52
|
+
reconnectionDelay: 1000,
|
|
53
|
+
reconnectionDelayMax: 30000,
|
|
54
|
+
});
|
|
55
|
+
this.socket.on('connect', () => {
|
|
56
|
+
console.log(`[${this.genboxId}] Connected to monitoring server`);
|
|
57
|
+
this.running = true;
|
|
58
|
+
this.onConnect();
|
|
59
|
+
resolve(true);
|
|
60
|
+
});
|
|
61
|
+
this.socket.on('disconnect', (reason) => {
|
|
62
|
+
console.log(`[${this.genboxId}] Disconnected: ${reason}`);
|
|
63
|
+
this.running = false;
|
|
64
|
+
});
|
|
65
|
+
this.socket.on('connect_error', (error) => {
|
|
66
|
+
console.error(`[${this.genboxId}] Connection error:`, error.message);
|
|
67
|
+
});
|
|
68
|
+
// Register event handlers
|
|
69
|
+
this.socket.on('send_prompt', this.onSendPrompt.bind(this));
|
|
70
|
+
this.socket.on('send_keystroke', this.onSendKeystroke.bind(this));
|
|
71
|
+
this.socket.on('create_session', this.onCreateSession.bind(this));
|
|
72
|
+
this.socket.on('get_output', this.onGetOutput.bind(this));
|
|
73
|
+
this.socket.on('kill_session', this.onKillSession.bind(this));
|
|
74
|
+
this.socket.on('list_sessions', this.onListSessions.bind(this));
|
|
75
|
+
this.socket.on('get_providers', this.onGetProviders.bind(this));
|
|
76
|
+
this.socket.on('error', this.onError.bind(this));
|
|
77
|
+
// Timeout after 10 seconds
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
if (!this.socket?.connected) {
|
|
80
|
+
console.error('Connection timeout');
|
|
81
|
+
resolve(false);
|
|
82
|
+
}
|
|
83
|
+
}, 10000);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
onConnect() {
|
|
87
|
+
// Get detected providers
|
|
88
|
+
const detectedProviders = this.sessionManager.getDetectedProviders();
|
|
89
|
+
const providers = [];
|
|
90
|
+
for (const [provider, detection] of detectedProviders) {
|
|
91
|
+
if (detection.detected) {
|
|
92
|
+
providers.push({ provider, version: detection.version });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Register as genbox agent with provider info
|
|
96
|
+
this.socket?.emit('register_agent', {
|
|
97
|
+
genboxId: this.genboxId,
|
|
98
|
+
token: this.token,
|
|
99
|
+
providers,
|
|
100
|
+
});
|
|
101
|
+
// Send initial session list
|
|
102
|
+
const sessions = this.sessionManager.listAllSessions();
|
|
103
|
+
this.socket?.emit('agent_sessions', {
|
|
104
|
+
genboxId: this.genboxId,
|
|
105
|
+
sessions,
|
|
106
|
+
});
|
|
107
|
+
console.log(`[${this.genboxId}] Detected providers:`, providers.map(p => p.provider).join(', '));
|
|
108
|
+
}
|
|
109
|
+
onSendPrompt(data) {
|
|
110
|
+
const { sessionId, prompt, requestId } = data;
|
|
111
|
+
if (!sessionId || !prompt)
|
|
112
|
+
return;
|
|
113
|
+
console.log(`[${this.genboxId}] Sending prompt to ${sessionId}: ${prompt.slice(0, 50)}...`);
|
|
114
|
+
const success = this.sessionManager.sendPrompt(sessionId, prompt);
|
|
115
|
+
this.socket?.emit('prompt_result', {
|
|
116
|
+
genboxId: this.genboxId,
|
|
117
|
+
sessionId,
|
|
118
|
+
requestId,
|
|
119
|
+
success,
|
|
120
|
+
});
|
|
121
|
+
// Capture output after a delay
|
|
122
|
+
if (success) {
|
|
123
|
+
setTimeout(() => this.captureAndSendOutput(sessionId), 1000);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
onSendKeystroke(data) {
|
|
127
|
+
const { sessionId, key, requestId } = data;
|
|
128
|
+
if (!sessionId || !key)
|
|
129
|
+
return;
|
|
130
|
+
console.log(`[${this.genboxId}] Sending keystroke to ${sessionId}: ${key}`);
|
|
131
|
+
const success = this.sessionManager.sendKeystroke(sessionId, key);
|
|
132
|
+
this.socket?.emit('keystroke_result', {
|
|
133
|
+
genboxId: this.genboxId,
|
|
134
|
+
sessionId,
|
|
135
|
+
requestId,
|
|
136
|
+
success,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
onCreateSession(data) {
|
|
140
|
+
const { projectPath = '/home/dev', provider, requestId } = data;
|
|
141
|
+
console.log(`[${this.genboxId}] Creating new ${provider || 'default'} session at ${projectPath}`);
|
|
142
|
+
const session = this.sessionManager.createSession(projectPath, provider);
|
|
143
|
+
if (session) {
|
|
144
|
+
this.socket?.emit('session_created', {
|
|
145
|
+
genboxId: this.genboxId,
|
|
146
|
+
sessionId: session.sessionId,
|
|
147
|
+
sessionName: session.sessionName,
|
|
148
|
+
provider: session.provider,
|
|
149
|
+
projectPath: session.projectPath,
|
|
150
|
+
requestId,
|
|
151
|
+
success: true,
|
|
152
|
+
});
|
|
153
|
+
// Start output polling for this session
|
|
154
|
+
this.startOutputPolling(session.sessionId);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
this.socket?.emit('session_created', {
|
|
158
|
+
genboxId: this.genboxId,
|
|
159
|
+
requestId,
|
|
160
|
+
success: false,
|
|
161
|
+
error: 'Failed to create session',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
onGetOutput(data) {
|
|
166
|
+
const { sessionId, lines = 100, requestId } = data;
|
|
167
|
+
if (!sessionId)
|
|
168
|
+
return;
|
|
169
|
+
const output = this.sessionManager.getOutput(sessionId, lines);
|
|
170
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
171
|
+
this.socket?.emit('output_update', {
|
|
172
|
+
genboxId: this.genboxId,
|
|
173
|
+
sessionId,
|
|
174
|
+
requestId,
|
|
175
|
+
output: output || '',
|
|
176
|
+
status,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
onKillSession(data) {
|
|
180
|
+
const { sessionId, requestId } = data;
|
|
181
|
+
if (!sessionId)
|
|
182
|
+
return;
|
|
183
|
+
console.log(`[${this.genboxId}] Killing session ${sessionId}`);
|
|
184
|
+
const success = this.sessionManager.killSession(sessionId);
|
|
185
|
+
this.stopOutputPolling(sessionId);
|
|
186
|
+
this.socket?.emit('session_killed', {
|
|
187
|
+
genboxId: this.genboxId,
|
|
188
|
+
sessionId,
|
|
189
|
+
requestId,
|
|
190
|
+
success,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
onListSessions(data) {
|
|
194
|
+
const { requestId } = data;
|
|
195
|
+
const sessions = this.sessionManager.listAllSessions();
|
|
196
|
+
this.socket?.emit('sessions_list', {
|
|
197
|
+
genboxId: this.genboxId,
|
|
198
|
+
requestId,
|
|
199
|
+
sessions,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
onGetProviders(data) {
|
|
203
|
+
const { requestId } = data;
|
|
204
|
+
const detectedProviders = this.sessionManager.getDetectedProviders();
|
|
205
|
+
const providers = [];
|
|
206
|
+
for (const [provider, detection] of detectedProviders) {
|
|
207
|
+
providers.push({
|
|
208
|
+
provider,
|
|
209
|
+
detected: detection.detected,
|
|
210
|
+
version: detection.version,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
this.socket?.emit('providers_list', {
|
|
214
|
+
genboxId: this.genboxId,
|
|
215
|
+
requestId,
|
|
216
|
+
providers,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
onError(data) {
|
|
220
|
+
console.error(`[${this.genboxId}] Error from server:`, data);
|
|
221
|
+
}
|
|
222
|
+
startOutputPolling(sessionId) {
|
|
223
|
+
if (this.outputPollers.has(sessionId))
|
|
224
|
+
return;
|
|
225
|
+
let lastOutput = '';
|
|
226
|
+
const poller = setInterval(() => {
|
|
227
|
+
if (!this.running) {
|
|
228
|
+
this.stopOutputPolling(sessionId);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const output = this.sessionManager.getOutput(sessionId, 100);
|
|
232
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
233
|
+
// Only send if output changed
|
|
234
|
+
if (output && output !== lastOutput) {
|
|
235
|
+
lastOutput = output;
|
|
236
|
+
this.socket?.emit('output_update', {
|
|
237
|
+
genboxId: this.genboxId,
|
|
238
|
+
sessionId,
|
|
239
|
+
output,
|
|
240
|
+
status,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// Stop polling if session ended
|
|
244
|
+
if (status === 'ended') {
|
|
245
|
+
this.stopOutputPolling(sessionId);
|
|
246
|
+
}
|
|
247
|
+
}, OUTPUT_POLL_INTERVAL);
|
|
248
|
+
this.outputPollers.set(sessionId, poller);
|
|
249
|
+
}
|
|
250
|
+
stopOutputPolling(sessionId) {
|
|
251
|
+
const poller = this.outputPollers.get(sessionId);
|
|
252
|
+
if (poller) {
|
|
253
|
+
clearInterval(poller);
|
|
254
|
+
this.outputPollers.delete(sessionId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
captureAndSendOutput(sessionId) {
|
|
258
|
+
const output = this.sessionManager.getOutput(sessionId, 100);
|
|
259
|
+
const status = this.sessionManager.getSessionStatus(sessionId);
|
|
260
|
+
if (output && this.socket?.connected) {
|
|
261
|
+
this.socket.emit('output_update', {
|
|
262
|
+
genboxId: this.genboxId,
|
|
263
|
+
sessionId,
|
|
264
|
+
output,
|
|
265
|
+
status,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async run() {
|
|
270
|
+
console.log(`Starting Unified Genbox Agent Daemon for ${this.genboxId}`);
|
|
271
|
+
const connected = await this.connect();
|
|
272
|
+
if (!connected) {
|
|
273
|
+
console.log('Initial connection failed, will keep retrying...');
|
|
274
|
+
}
|
|
275
|
+
// Keep running
|
|
276
|
+
await new Promise((resolve) => {
|
|
277
|
+
const shutdown = () => {
|
|
278
|
+
console.log('Shutting down...');
|
|
279
|
+
this.running = false;
|
|
280
|
+
// Stop all output pollers
|
|
281
|
+
for (const sessionId of this.outputPollers.keys()) {
|
|
282
|
+
this.stopOutputPolling(sessionId);
|
|
283
|
+
}
|
|
284
|
+
this.socket?.disconnect();
|
|
285
|
+
resolve();
|
|
286
|
+
};
|
|
287
|
+
process.on('SIGTERM', shutdown);
|
|
288
|
+
process.on('SIGINT', shutdown);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Main entry point
|
|
293
|
+
async function main() {
|
|
294
|
+
if (!GENBOX_ID) {
|
|
295
|
+
console.error('Error: GENBOX_ID environment variable not set');
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
if (!GENBOX_TOKEN) {
|
|
299
|
+
console.error('Error: GENBOX_TOKEN environment variable not set');
|
|
300
|
+
process.exit(1);
|
|
301
|
+
}
|
|
302
|
+
const daemon = new UnifiedGenboxDaemon(GENBOX_ID, GENBOX_TOKEN, MONITORING_WS_URL);
|
|
303
|
+
await daemon.run();
|
|
304
|
+
}
|
|
305
|
+
main().catch((error) => {
|
|
306
|
+
console.error('Fatal error:', error);
|
|
307
|
+
process.exit(1);
|
|
308
|
+
});
|
|
309
|
+
//# sourceMappingURL=unified-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-daemon.js","sourceRoot":"","sources":["../src/unified-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Unified AI CLI Hook Script
|
|
4
|
+
*
|
|
5
|
+
* A single hook script that handles events from all supported AI CLI tools:
|
|
6
|
+
* - Claude Code
|
|
7
|
+
* - Gemini CLI
|
|
8
|
+
* - OpenAI Codex CLI
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ai-hook <provider> <event_type>
|
|
12
|
+
*
|
|
13
|
+
* Examples:
|
|
14
|
+
* ai-hook claude PreToolUse
|
|
15
|
+
* ai-hook gemini BeforeTool
|
|
16
|
+
* ai-hook codex agent-turn-complete
|
|
17
|
+
*
|
|
18
|
+
* Environment variables:
|
|
19
|
+
* GENBOX_ID: Unique identifier for this genbox
|
|
20
|
+
* GENBOX_TOKEN: Authentication token for the API
|
|
21
|
+
* MONITORING_API_URL: Base URL for the monitoring API
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=unified-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-hook.d.ts","sourceRoot":"","sources":["../src/unified-hook.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Unified AI CLI Hook Script
|
|
5
|
+
*
|
|
6
|
+
* A single hook script that handles events from all supported AI CLI tools:
|
|
7
|
+
* - Claude Code
|
|
8
|
+
* - Gemini CLI
|
|
9
|
+
* - OpenAI Codex CLI
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ai-hook <provider> <event_type>
|
|
13
|
+
*
|
|
14
|
+
* Examples:
|
|
15
|
+
* ai-hook claude PreToolUse
|
|
16
|
+
* ai-hook gemini BeforeTool
|
|
17
|
+
* ai-hook codex agent-turn-complete
|
|
18
|
+
*
|
|
19
|
+
* Environment variables:
|
|
20
|
+
* GENBOX_ID: Unique identifier for this genbox
|
|
21
|
+
* GENBOX_TOKEN: Authentication token for the API
|
|
22
|
+
* MONITORING_API_URL: Base URL for the monitoring API
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const http = __importStar(require("http"));
|
|
60
|
+
const https = __importStar(require("https"));
|
|
61
|
+
const providers_1 = require("./providers");
|
|
62
|
+
// Configuration
|
|
63
|
+
const GENBOX_ID = process.env.GENBOX_ID || '';
|
|
64
|
+
const GENBOX_TOKEN = process.env.GENBOX_TOKEN || '';
|
|
65
|
+
const MONITORING_API_URL = process.env.MONITORING_API_URL || 'http://localhost:3001';
|
|
66
|
+
/**
|
|
67
|
+
* Send event to the monitoring API
|
|
68
|
+
*/
|
|
69
|
+
async function sendEvent(event) {
|
|
70
|
+
if (!GENBOX_ID || !GENBOX_TOKEN) {
|
|
71
|
+
console.error('Warning: GENBOX_ID or GENBOX_TOKEN not set, skipping event');
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const url = new URL('/api/v1/ai-monitoring/events', MONITORING_API_URL);
|
|
75
|
+
const data = JSON.stringify({
|
|
76
|
+
...event,
|
|
77
|
+
genboxId: GENBOX_ID,
|
|
78
|
+
genboxToken: GENBOX_TOKEN,
|
|
79
|
+
});
|
|
80
|
+
const isHttps = url.protocol === 'https:';
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
const options = {
|
|
83
|
+
hostname: url.hostname,
|
|
84
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
85
|
+
path: url.pathname,
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: {
|
|
88
|
+
'Content-Type': 'application/json',
|
|
89
|
+
'Content-Length': Buffer.byteLength(data),
|
|
90
|
+
'X-Genbox-Token': GENBOX_TOKEN,
|
|
91
|
+
},
|
|
92
|
+
timeout: 5000,
|
|
93
|
+
};
|
|
94
|
+
const req = (isHttps ? https : http).request(options, (res) => {
|
|
95
|
+
resolve(res.statusCode === 200 || res.statusCode === 201);
|
|
96
|
+
});
|
|
97
|
+
req.on('error', (error) => {
|
|
98
|
+
console.error(`Warning: Failed to send event: ${error.message}`);
|
|
99
|
+
resolve(false);
|
|
100
|
+
});
|
|
101
|
+
req.on('timeout', () => {
|
|
102
|
+
req.destroy();
|
|
103
|
+
console.error('Warning: Request timeout');
|
|
104
|
+
resolve(false);
|
|
105
|
+
});
|
|
106
|
+
req.write(data);
|
|
107
|
+
req.end();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse command line arguments
|
|
112
|
+
*/
|
|
113
|
+
function parseArgs() {
|
|
114
|
+
const args = process.argv.slice(2);
|
|
115
|
+
if (args.length < 2) {
|
|
116
|
+
console.error('Usage: ai-hook <provider> <event_type>');
|
|
117
|
+
console.error('Providers: claude, gemini, codex');
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const provider = args[0];
|
|
121
|
+
const eventType = args[1];
|
|
122
|
+
if (!['claude', 'gemini', 'codex'].includes(provider)) {
|
|
123
|
+
console.error(`Unknown provider: ${provider}`);
|
|
124
|
+
console.error('Supported providers: claude, gemini, codex');
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return { provider, eventType };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Read input from stdin
|
|
131
|
+
*/
|
|
132
|
+
function readStdin() {
|
|
133
|
+
try {
|
|
134
|
+
if (!process.stdin.isTTY) {
|
|
135
|
+
return fs.readFileSync(0, 'utf-8');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignore read errors
|
|
140
|
+
}
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Main entry point
|
|
145
|
+
*/
|
|
146
|
+
async function main() {
|
|
147
|
+
const args = parseArgs();
|
|
148
|
+
if (!args) {
|
|
149
|
+
process.exit(0); // Don't block the AI CLI
|
|
150
|
+
}
|
|
151
|
+
const { provider, eventType } = args;
|
|
152
|
+
// Read input from stdin
|
|
153
|
+
const rawInput = readStdin();
|
|
154
|
+
// Get the provider instance
|
|
155
|
+
const registry = providers_1.ProviderRegistry.getInstance();
|
|
156
|
+
const providerInstance = registry.getProvider(provider, GENBOX_ID);
|
|
157
|
+
if (!providerInstance) {
|
|
158
|
+
console.error(`Failed to get provider: ${provider}`);
|
|
159
|
+
process.exit(0);
|
|
160
|
+
}
|
|
161
|
+
// Parse the hook input
|
|
162
|
+
const event = providerInstance.parseHookInput(eventType, rawInput);
|
|
163
|
+
// Add tmux session info if available
|
|
164
|
+
if (process.env.TMUX) {
|
|
165
|
+
event.tmuxSession = process.env.TMUX_PANE?.split(',')[0];
|
|
166
|
+
}
|
|
167
|
+
// Send the event (fire and forget)
|
|
168
|
+
sendEvent(event).catch(() => { });
|
|
169
|
+
// Exit immediately - hooks should not block the AI CLI
|
|
170
|
+
process.exit(0);
|
|
171
|
+
}
|
|
172
|
+
main().catch(() => process.exit(0));
|
|
173
|
+
//# sourceMappingURL=unified-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-hook.js","sourceRoot":"","sources":["../src/unified-hook.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genbox-agent",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Unified agent for monitoring and controlling AI CLI sessions (Claude Code, Gemini CLI, OpenAI Codex) in genbox VMs",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
|
-
"genbox-agent": "./dist/daemon.js",
|
|
9
|
-
"
|
|
8
|
+
"genbox-agent": "./dist/unified-daemon.js",
|
|
9
|
+
"genbox-agent-legacy": "./dist/daemon.js",
|
|
10
|
+
"ai-hook": "./dist/unified-hook.js",
|
|
11
|
+
"claude-hook": "./dist/hook.js",
|
|
12
|
+
"genbox-configure-hooks": "./dist/configure-hooks.js"
|
|
10
13
|
},
|
|
11
14
|
"scripts": {
|
|
12
15
|
"build": "tsc",
|
|
13
|
-
"start": "node dist/daemon.js",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
+
"start": "node dist/unified-daemon.js",
|
|
17
|
+
"start:legacy": "node dist/daemon.js",
|
|
18
|
+
"dev": "tsx watch src/unified-daemon.ts",
|
|
19
|
+
"hook": "node dist/unified-hook.js",
|
|
20
|
+
"configure-hooks": "node dist/configure-hooks.js"
|
|
16
21
|
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"genbox",
|
|
24
|
+
"claude",
|
|
25
|
+
"gemini",
|
|
26
|
+
"codex",
|
|
27
|
+
"ai",
|
|
28
|
+
"cli",
|
|
29
|
+
"monitoring",
|
|
30
|
+
"remote-control",
|
|
31
|
+
"tmux"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/goodpass/aigens.git",
|
|
36
|
+
"directory": "packages/genbox-agent"
|
|
37
|
+
},
|
|
38
|
+
"license": "MIT",
|
|
17
39
|
"dependencies": {
|
|
18
40
|
"socket.io-client": "^4.8.0"
|
|
19
41
|
},
|
|
@@ -24,5 +46,9 @@
|
|
|
24
46
|
},
|
|
25
47
|
"engines": {
|
|
26
48
|
"node": ">=18.0.0"
|
|
27
|
-
}
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist",
|
|
52
|
+
"README.md"
|
|
53
|
+
]
|
|
28
54
|
}
|