genbox-agent 1.0.39 → 1.0.41
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/hook.d.ts +6 -5
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +200 -81
- package/dist/hook.js.map +1 -1
- package/dist/hooks/daemon-client.d.ts +39 -0
- package/dist/hooks/daemon-client.d.ts.map +1 -0
- package/dist/hooks/daemon-client.js +238 -0
- package/dist/hooks/daemon-client.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +23 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/server/auth.d.ts +51 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +154 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/index.d.ts +156 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +595 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/port-finder.d.ts +45 -0
- package/dist/server/port-finder.d.ts.map +1 -0
- package/dist/server/port-finder.js +267 -0
- package/dist/server/port-finder.js.map +1 -0
- package/dist/storage/index.d.ts +82 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +209 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/manager.d.ts +112 -0
- package/dist/storage/manager.d.ts.map +1 -0
- package/dist/storage/manager.js +200 -0
- package/dist/storage/manager.js.map +1 -0
- package/dist/storage/repositories/events.d.ts +101 -0
- package/dist/storage/repositories/events.d.ts.map +1 -0
- package/dist/storage/repositories/events.js +258 -0
- package/dist/storage/repositories/events.js.map +1 -0
- package/dist/storage/repositories/index.d.ts +9 -0
- package/dist/storage/repositories/index.d.ts.map +1 -0
- package/dist/storage/repositories/index.js +25 -0
- package/dist/storage/repositories/index.js.map +1 -0
- package/dist/storage/repositories/messages.d.ts +123 -0
- package/dist/storage/repositories/messages.d.ts.map +1 -0
- package/dist/storage/repositories/messages.js +209 -0
- package/dist/storage/repositories/messages.js.map +1 -0
- package/dist/storage/repositories/sessions.d.ts +158 -0
- package/dist/storage/repositories/sessions.d.ts.map +1 -0
- package/dist/storage/repositories/sessions.js +342 -0
- package/dist/storage/repositories/sessions.js.map +1 -0
- package/dist/storage/schema.d.ts +42 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +278 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/sync/background-sync.d.ts +83 -0
- package/dist/sync/background-sync.d.ts.map +1 -0
- package/dist/sync/background-sync.js +367 -0
- package/dist/sync/background-sync.js.map +1 -0
- package/dist/sync/index.d.ts +7 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +23 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/unified-daemon.js +219 -0
- package/dist/unified-daemon.js.map +1 -1
- package/dist/unified-hook.d.ts +4 -3
- package/dist/unified-hook.d.ts.map +1 -1
- package/dist/unified-hook.js +155 -31
- package/dist/unified-hook.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Local Daemon Client
|
|
4
|
+
*
|
|
5
|
+
* Client for hooks to communicate with the local daemon.
|
|
6
|
+
* Handles posting events to localhost and lazy daemon start.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.postToLocalDaemon = postToLocalDaemon;
|
|
43
|
+
exports.postHookEvent = postHookEvent;
|
|
44
|
+
exports.isDaemonAvailable = isDaemonAvailable;
|
|
45
|
+
exports.getDaemonPort = getDaemonPort;
|
|
46
|
+
const http = __importStar(require("http"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const childProcess = __importStar(require("child_process"));
|
|
50
|
+
// Default base port (same as server/port-finder.ts)
|
|
51
|
+
const BASE_PORT = 47191;
|
|
52
|
+
const MAX_PORT_OFFSET = 10;
|
|
53
|
+
const CONNECT_TIMEOUT = 1000;
|
|
54
|
+
const REQUEST_TIMEOUT = 3000;
|
|
55
|
+
// Port file location
|
|
56
|
+
const PORT_FILE = path.join(process.env.HOME || '/tmp', '.genbox-daemon-port');
|
|
57
|
+
const PID_FILE = path.join(process.env.HOME || '/tmp', '.genbox-daemon.pid');
|
|
58
|
+
/**
|
|
59
|
+
* Read the daemon port from the port file
|
|
60
|
+
*/
|
|
61
|
+
function readDaemonPort() {
|
|
62
|
+
try {
|
|
63
|
+
if (fs.existsSync(PORT_FILE)) {
|
|
64
|
+
const content = fs.readFileSync(PORT_FILE, 'utf-8').trim();
|
|
65
|
+
const port = parseInt(content, 10);
|
|
66
|
+
if (!isNaN(port) && port > 0) {
|
|
67
|
+
return port;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Ignore errors
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if daemon is running on a port
|
|
78
|
+
*/
|
|
79
|
+
async function isDaemonRunning(port) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
const req = http.request({
|
|
82
|
+
hostname: '127.0.0.1',
|
|
83
|
+
port,
|
|
84
|
+
path: '/health',
|
|
85
|
+
method: 'GET',
|
|
86
|
+
timeout: CONNECT_TIMEOUT,
|
|
87
|
+
}, (res) => {
|
|
88
|
+
resolve(res.statusCode === 200);
|
|
89
|
+
});
|
|
90
|
+
req.on('error', () => resolve(false));
|
|
91
|
+
req.on('timeout', () => {
|
|
92
|
+
req.destroy();
|
|
93
|
+
resolve(false);
|
|
94
|
+
});
|
|
95
|
+
req.end();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Find the daemon port by checking the port file or scanning ports
|
|
100
|
+
*/
|
|
101
|
+
async function findDaemonPort() {
|
|
102
|
+
// First check the port file
|
|
103
|
+
const savedPort = readDaemonPort();
|
|
104
|
+
if (savedPort && (await isDaemonRunning(savedPort))) {
|
|
105
|
+
return savedPort;
|
|
106
|
+
}
|
|
107
|
+
// Scan ports starting from BASE_PORT
|
|
108
|
+
for (let offset = 0; offset < MAX_PORT_OFFSET; offset++) {
|
|
109
|
+
const port = BASE_PORT + offset;
|
|
110
|
+
if (await isDaemonRunning(port)) {
|
|
111
|
+
return port;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Start the daemon if not running
|
|
118
|
+
*/
|
|
119
|
+
async function startDaemon() {
|
|
120
|
+
// Find the daemon executable
|
|
121
|
+
const possiblePaths = [
|
|
122
|
+
path.join(__dirname, '../../dist/unified-daemon.js'),
|
|
123
|
+
path.join(__dirname, '../unified-daemon.js'),
|
|
124
|
+
'genbox-daemon', // If installed globally
|
|
125
|
+
];
|
|
126
|
+
let daemonPath = null;
|
|
127
|
+
for (const p of possiblePaths) {
|
|
128
|
+
if (p === 'genbox-daemon' || fs.existsSync(p)) {
|
|
129
|
+
daemonPath = p;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!daemonPath) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
// Start daemon in background
|
|
138
|
+
const args = ['--mode', 'native', '--server'];
|
|
139
|
+
const isScript = daemonPath.endsWith('.js');
|
|
140
|
+
const proc = childProcess.spawn(isScript ? 'node' : daemonPath, isScript ? [daemonPath, ...args] : args, {
|
|
141
|
+
detached: true,
|
|
142
|
+
stdio: 'ignore',
|
|
143
|
+
env: {
|
|
144
|
+
...process.env,
|
|
145
|
+
GENBOX_DAEMON_BACKGROUND: '1',
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
proc.unref();
|
|
149
|
+
// Wait for daemon to start (up to 3 seconds)
|
|
150
|
+
for (let i = 0; i < 30; i++) {
|
|
151
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
152
|
+
const port = await findDaemonPort();
|
|
153
|
+
if (port) {
|
|
154
|
+
return port;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Ignore spawn errors
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Post event data to the local daemon
|
|
165
|
+
*/
|
|
166
|
+
async function postToLocalDaemon(endpoint, data) {
|
|
167
|
+
// Find running daemon
|
|
168
|
+
let port = await findDaemonPort();
|
|
169
|
+
// If no daemon running, try to start one (lazy start)
|
|
170
|
+
if (!port) {
|
|
171
|
+
port = await startDaemon();
|
|
172
|
+
}
|
|
173
|
+
if (!port) {
|
|
174
|
+
return { success: false, error: 'No daemon available' };
|
|
175
|
+
}
|
|
176
|
+
return new Promise((resolve) => {
|
|
177
|
+
const body = JSON.stringify(data);
|
|
178
|
+
const req = http.request({
|
|
179
|
+
hostname: '127.0.0.1',
|
|
180
|
+
port,
|
|
181
|
+
path: endpoint,
|
|
182
|
+
method: 'POST',
|
|
183
|
+
headers: {
|
|
184
|
+
'Content-Type': 'application/json',
|
|
185
|
+
'Content-Length': Buffer.byteLength(body),
|
|
186
|
+
},
|
|
187
|
+
timeout: REQUEST_TIMEOUT,
|
|
188
|
+
}, (res) => {
|
|
189
|
+
let responseData = '';
|
|
190
|
+
res.on('data', (chunk) => (responseData += chunk));
|
|
191
|
+
res.on('end', () => {
|
|
192
|
+
try {
|
|
193
|
+
const parsed = JSON.parse(responseData);
|
|
194
|
+
resolve({
|
|
195
|
+
success: res.statusCode === 200 || res.statusCode === 201,
|
|
196
|
+
data: parsed,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
resolve({
|
|
201
|
+
success: res.statusCode === 200 || res.statusCode === 201,
|
|
202
|
+
data: responseData,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
req.on('error', (error) => {
|
|
208
|
+
resolve({ success: false, error: error.message });
|
|
209
|
+
});
|
|
210
|
+
req.on('timeout', () => {
|
|
211
|
+
req.destroy();
|
|
212
|
+
resolve({ success: false, error: 'Request timeout' });
|
|
213
|
+
});
|
|
214
|
+
req.write(body);
|
|
215
|
+
req.end();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Post a hook event to the local daemon
|
|
220
|
+
*/
|
|
221
|
+
async function postHookEvent(eventData) {
|
|
222
|
+
const result = await postToLocalDaemon('/api/events', eventData);
|
|
223
|
+
return result.success;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if daemon is available (running or can be started)
|
|
227
|
+
*/
|
|
228
|
+
async function isDaemonAvailable() {
|
|
229
|
+
const port = await findDaemonPort();
|
|
230
|
+
return port !== null;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get daemon port if running
|
|
234
|
+
*/
|
|
235
|
+
async function getDaemonPort() {
|
|
236
|
+
return findDaemonPort();
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=daemon-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/hooks/daemon-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hooks Module
|
|
4
|
+
*
|
|
5
|
+
* Exports hook utilities and daemon client.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
__exportStar(require("./daemon-client"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,kDAAgC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication for Genbox Agent Server
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple authentication methods:
|
|
5
|
+
* 1. Control Token - For dashboard/CLI direct access (matches Session V2 controlToken)
|
|
6
|
+
* 2. API Key - For programmatic access
|
|
7
|
+
* 3. None - For local mode without authentication
|
|
8
|
+
*/
|
|
9
|
+
export interface AuthContext {
|
|
10
|
+
authenticated: boolean;
|
|
11
|
+
type?: 'control_token' | 'api_key' | 'none';
|
|
12
|
+
userId?: string;
|
|
13
|
+
permissions?: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate control token
|
|
17
|
+
* Uses constant-time comparison to prevent timing attacks
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateControlToken(provided: string, expected: string): AuthContext;
|
|
20
|
+
/**
|
|
21
|
+
* Validate API key
|
|
22
|
+
* Supports both plain and hashed keys
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateApiKey(provided: string, expected: string): AuthContext;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a new control token
|
|
27
|
+
* Uses crypto.randomUUID for compatibility with Session V2 controlToken format
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateControlToken(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Generate a new API key
|
|
32
|
+
* Uses a longer random string for programmatic access
|
|
33
|
+
*/
|
|
34
|
+
export declare function generateApiKey(prefix?: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Hash an API key for storage
|
|
37
|
+
*/
|
|
38
|
+
export declare function hashApiKey(apiKey: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a permission is allowed
|
|
41
|
+
*/
|
|
42
|
+
export declare function hasPermission(context: AuthContext, permission: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Middleware helper for checking authentication
|
|
45
|
+
*/
|
|
46
|
+
export declare function requireAuth(context: AuthContext): void;
|
|
47
|
+
/**
|
|
48
|
+
* Middleware helper for checking specific permission
|
|
49
|
+
*/
|
|
50
|
+
export declare function requirePermission(context: AuthContext, permission: string): void;
|
|
51
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAoBpF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAqC9E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAQ,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAItD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAKhF"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication for Genbox Agent Server
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple authentication methods:
|
|
6
|
+
* 1. Control Token - For dashboard/CLI direct access (matches Session V2 controlToken)
|
|
7
|
+
* 2. API Key - For programmatic access
|
|
8
|
+
* 3. None - For local mode without authentication
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.validateControlToken = validateControlToken;
|
|
45
|
+
exports.validateApiKey = validateApiKey;
|
|
46
|
+
exports.generateControlToken = generateControlToken;
|
|
47
|
+
exports.generateApiKey = generateApiKey;
|
|
48
|
+
exports.hashApiKey = hashApiKey;
|
|
49
|
+
exports.hasPermission = hasPermission;
|
|
50
|
+
exports.requireAuth = requireAuth;
|
|
51
|
+
exports.requirePermission = requirePermission;
|
|
52
|
+
const crypto = __importStar(require("crypto"));
|
|
53
|
+
/**
|
|
54
|
+
* Validate control token
|
|
55
|
+
* Uses constant-time comparison to prevent timing attacks
|
|
56
|
+
*/
|
|
57
|
+
function validateControlToken(provided, expected) {
|
|
58
|
+
if (!provided || !expected) {
|
|
59
|
+
return { authenticated: false };
|
|
60
|
+
}
|
|
61
|
+
// Constant-time comparison
|
|
62
|
+
const providedBuffer = Buffer.from(provided);
|
|
63
|
+
const expectedBuffer = Buffer.from(expected);
|
|
64
|
+
if (providedBuffer.length !== expectedBuffer.length) {
|
|
65
|
+
return { authenticated: false };
|
|
66
|
+
}
|
|
67
|
+
const isValid = crypto.timingSafeEqual(providedBuffer, expectedBuffer);
|
|
68
|
+
return {
|
|
69
|
+
authenticated: isValid,
|
|
70
|
+
type: 'control_token',
|
|
71
|
+
permissions: isValid ? ['read', 'write', 'control'] : [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate API key
|
|
76
|
+
* Supports both plain and hashed keys
|
|
77
|
+
*/
|
|
78
|
+
function validateApiKey(provided, expected) {
|
|
79
|
+
if (!provided || !expected) {
|
|
80
|
+
return { authenticated: false };
|
|
81
|
+
}
|
|
82
|
+
// If expected starts with 'sha256:', it's a hashed key
|
|
83
|
+
if (expected.startsWith('sha256:')) {
|
|
84
|
+
const expectedHash = expected.slice(7);
|
|
85
|
+
const providedHash = crypto.createHash('sha256').update(provided).digest('hex');
|
|
86
|
+
const isValid = crypto.timingSafeEqual(Buffer.from(providedHash), Buffer.from(expectedHash));
|
|
87
|
+
return {
|
|
88
|
+
authenticated: isValid,
|
|
89
|
+
type: 'api_key',
|
|
90
|
+
permissions: isValid ? ['read', 'write'] : [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Plain text comparison (for development)
|
|
94
|
+
const providedBuffer = Buffer.from(provided);
|
|
95
|
+
const expectedBuffer = Buffer.from(expected);
|
|
96
|
+
if (providedBuffer.length !== expectedBuffer.length) {
|
|
97
|
+
return { authenticated: false };
|
|
98
|
+
}
|
|
99
|
+
const isValid = crypto.timingSafeEqual(providedBuffer, expectedBuffer);
|
|
100
|
+
return {
|
|
101
|
+
authenticated: isValid,
|
|
102
|
+
type: 'api_key',
|
|
103
|
+
permissions: isValid ? ['read', 'write'] : [],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Generate a new control token
|
|
108
|
+
* Uses crypto.randomUUID for compatibility with Session V2 controlToken format
|
|
109
|
+
*/
|
|
110
|
+
function generateControlToken() {
|
|
111
|
+
return crypto.randomUUID();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate a new API key
|
|
115
|
+
* Uses a longer random string for programmatic access
|
|
116
|
+
*/
|
|
117
|
+
function generateApiKey(prefix = 'gba') {
|
|
118
|
+
const random = crypto.randomBytes(24).toString('base64url');
|
|
119
|
+
return `${prefix}_${random}`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Hash an API key for storage
|
|
123
|
+
*/
|
|
124
|
+
function hashApiKey(apiKey) {
|
|
125
|
+
return 'sha256:' + crypto.createHash('sha256').update(apiKey).digest('hex');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a permission is allowed
|
|
129
|
+
*/
|
|
130
|
+
function hasPermission(context, permission) {
|
|
131
|
+
if (!context.authenticated)
|
|
132
|
+
return false;
|
|
133
|
+
if (!context.permissions)
|
|
134
|
+
return false;
|
|
135
|
+
return context.permissions.includes(permission);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Middleware helper for checking authentication
|
|
139
|
+
*/
|
|
140
|
+
function requireAuth(context) {
|
|
141
|
+
if (!context.authenticated) {
|
|
142
|
+
throw new Error('Authentication required');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Middleware helper for checking specific permission
|
|
147
|
+
*/
|
|
148
|
+
function requirePermission(context, permission) {
|
|
149
|
+
requireAuth(context);
|
|
150
|
+
if (!hasPermission(context, permission)) {
|
|
151
|
+
throw new Error(`Permission '${permission}' required`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Genbox Agent Local Server
|
|
3
|
+
*
|
|
4
|
+
* HTTP + WebSocket server that runs on genbox VMs and local machines.
|
|
5
|
+
* Provides direct access to session management, output streaming, and stats.
|
|
6
|
+
*
|
|
7
|
+
* This enables edge-first architecture where:
|
|
8
|
+
* - Clients connect directly to genbox for real-time data
|
|
9
|
+
* - API server only handles registry + historical sync
|
|
10
|
+
* - Reduces load on central API server
|
|
11
|
+
*/
|
|
12
|
+
import { StorageManager } from '../storage/manager';
|
|
13
|
+
export { BASE_PORT } from './port-finder';
|
|
14
|
+
export interface ServerConfig {
|
|
15
|
+
port?: number;
|
|
16
|
+
host?: string;
|
|
17
|
+
genboxId?: string;
|
|
18
|
+
controlToken?: string;
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
enableCors?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SessionInfo {
|
|
23
|
+
sessionId: string;
|
|
24
|
+
provider: string;
|
|
25
|
+
projectPath?: string;
|
|
26
|
+
status: string;
|
|
27
|
+
createdAt?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface SystemStats {
|
|
30
|
+
loadAvg: [number, number, number];
|
|
31
|
+
diskUsagePercent: number;
|
|
32
|
+
diskUsedGb: number;
|
|
33
|
+
diskTotalGb: number;
|
|
34
|
+
memoryUsagePercent: number;
|
|
35
|
+
memoryUsedMb: number;
|
|
36
|
+
memoryTotalMb: number;
|
|
37
|
+
swapUsagePercent: number;
|
|
38
|
+
processCount: number;
|
|
39
|
+
uptimeSeconds: number;
|
|
40
|
+
dockerServices?: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
status: string;
|
|
43
|
+
health?: string;
|
|
44
|
+
}>;
|
|
45
|
+
pm2Services?: Array<{
|
|
46
|
+
name: string;
|
|
47
|
+
status: string;
|
|
48
|
+
cpu: number;
|
|
49
|
+
memory: number;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
export interface ServerHandlers {
|
|
53
|
+
listSessions: () => SessionInfo[];
|
|
54
|
+
getSession: (sessionId: string) => SessionInfo | null;
|
|
55
|
+
getSessionOutput: (sessionId: string, lines?: number) => string | null;
|
|
56
|
+
getSessionStatus: (sessionId: string) => string;
|
|
57
|
+
sendPrompt: (sessionId: string, prompt: string) => boolean;
|
|
58
|
+
sendKeystroke: (sessionId: string, key: string) => boolean;
|
|
59
|
+
createSession: (projectPath: string, provider?: string) => SessionInfo | null;
|
|
60
|
+
killSession: (sessionId: string) => boolean;
|
|
61
|
+
getSystemStats: () => SystemStats | null;
|
|
62
|
+
onSessionEvent?: (event: any) => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Local Agent Server
|
|
66
|
+
* Exposes daemon functionality via HTTP/WebSocket
|
|
67
|
+
*/
|
|
68
|
+
export declare class AgentServer {
|
|
69
|
+
private readonly config;
|
|
70
|
+
private readonly handlers;
|
|
71
|
+
private httpServer;
|
|
72
|
+
private io;
|
|
73
|
+
private port;
|
|
74
|
+
private running;
|
|
75
|
+
private outputPollers;
|
|
76
|
+
private connectedClients;
|
|
77
|
+
private storageManager;
|
|
78
|
+
constructor(config: ServerConfig, handlers: ServerHandlers);
|
|
79
|
+
/**
|
|
80
|
+
* Set the storage manager for event recording
|
|
81
|
+
*/
|
|
82
|
+
setStorageManager(manager: StorageManager): void;
|
|
83
|
+
/**
|
|
84
|
+
* Start the server
|
|
85
|
+
*/
|
|
86
|
+
start(): Promise<number>;
|
|
87
|
+
/**
|
|
88
|
+
* Stop the server
|
|
89
|
+
*/
|
|
90
|
+
stop(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Get the port the server is running on
|
|
93
|
+
*/
|
|
94
|
+
getPort(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Check if server is running
|
|
97
|
+
*/
|
|
98
|
+
isRunning(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Broadcast output update to all connected clients
|
|
101
|
+
*/
|
|
102
|
+
broadcastOutput(sessionId: string, output: string, status: string): void;
|
|
103
|
+
/**
|
|
104
|
+
* Broadcast system stats to all connected clients
|
|
105
|
+
*/
|
|
106
|
+
broadcastStats(stats: SystemStats): void;
|
|
107
|
+
/**
|
|
108
|
+
* Broadcast session event to all connected clients
|
|
109
|
+
*/
|
|
110
|
+
broadcastEvent(event: any): void;
|
|
111
|
+
/**
|
|
112
|
+
* Handle HTTP request
|
|
113
|
+
*/
|
|
114
|
+
private handleHttpRequest;
|
|
115
|
+
/**
|
|
116
|
+
* Authenticate request
|
|
117
|
+
*/
|
|
118
|
+
private authenticate;
|
|
119
|
+
/**
|
|
120
|
+
* Handle WebSocket connection
|
|
121
|
+
*/
|
|
122
|
+
private handleSocketConnection;
|
|
123
|
+
/**
|
|
124
|
+
* Start polling output for a session
|
|
125
|
+
*/
|
|
126
|
+
private startOutputPolling;
|
|
127
|
+
/**
|
|
128
|
+
* Stop polling output for a session
|
|
129
|
+
*/
|
|
130
|
+
private stopOutputPolling;
|
|
131
|
+
private handleHealth;
|
|
132
|
+
private handleListSessions;
|
|
133
|
+
private handleGetSession;
|
|
134
|
+
private handleGetOutput;
|
|
135
|
+
private handleSendPrompt;
|
|
136
|
+
private handleSendKeystroke;
|
|
137
|
+
private handleCreateSession;
|
|
138
|
+
private handleKillSession;
|
|
139
|
+
private handleGetStats;
|
|
140
|
+
/**
|
|
141
|
+
* Handle recording a hook event
|
|
142
|
+
*/
|
|
143
|
+
private handleRecordEvent;
|
|
144
|
+
/**
|
|
145
|
+
* Handle getting storage stats
|
|
146
|
+
*/
|
|
147
|
+
private handleStorageStats;
|
|
148
|
+
/**
|
|
149
|
+
* Handle getting pending sync counts
|
|
150
|
+
*/
|
|
151
|
+
private handlePendingSync;
|
|
152
|
+
private sendJson;
|
|
153
|
+
private sendError;
|
|
154
|
+
private readBody;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,cAAc,EAAuB,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK1C,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,cAAc;IAE7B,YAAY,EAAE,MAAM,WAAW,EAAE,CAAC;IAClC,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,CAAC;IACtD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvE,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,CAAC;IAC9E,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAG5C,cAAc,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAGzC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,qBAAa,WAAW;IAUpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,cAAc,CAA+B;gBAGlC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,cAAc;IAG3C;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAuD9B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C3B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASxE;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAOxC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAOhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6EzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoE9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4DzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;CAajB"}
|