cerevox 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +388 -0
  2. package/dist/cli/cerevox-run.d.ts +3 -0
  3. package/dist/cli/cerevox-run.d.ts.map +1 -0
  4. package/dist/cli/cerevox-run.js +275 -0
  5. package/dist/cli/cerevox-run.js.map +1 -0
  6. package/dist/core/base.d.ts +57 -0
  7. package/dist/core/base.d.ts.map +1 -0
  8. package/dist/core/base.js +77 -0
  9. package/dist/core/base.js.map +1 -0
  10. package/dist/core/browser.d.ts +30 -0
  11. package/dist/core/browser.d.ts.map +1 -0
  12. package/dist/core/browser.js +107 -0
  13. package/dist/core/browser.js.map +1 -0
  14. package/dist/core/cerevox.d.ts +34 -0
  15. package/dist/core/cerevox.d.ts.map +1 -0
  16. package/dist/core/cerevox.js +153 -0
  17. package/dist/core/cerevox.js.map +1 -0
  18. package/dist/core/code-runner.d.ts +22 -0
  19. package/dist/core/code-runner.d.ts.map +1 -0
  20. package/dist/core/code-runner.js +56 -0
  21. package/dist/core/code-runner.js.map +1 -0
  22. package/dist/core/file-system.d.ts +116 -0
  23. package/dist/core/file-system.d.ts.map +1 -0
  24. package/dist/core/file-system.js +383 -0
  25. package/dist/core/file-system.js.map +1 -0
  26. package/dist/core/session.d.ts +32 -0
  27. package/dist/core/session.d.ts.map +1 -0
  28. package/dist/core/session.js +113 -0
  29. package/dist/core/session.js.map +1 -0
  30. package/dist/core/terminal.d.ts +104 -0
  31. package/dist/core/terminal.d.ts.map +1 -0
  32. package/dist/core/terminal.js +202 -0
  33. package/dist/core/terminal.js.map +1 -0
  34. package/dist/index.d.ts +9 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +29 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/utils/auth.d.ts +4 -0
  39. package/dist/utils/auth.d.ts.map +1 -0
  40. package/dist/utils/auth.js +14 -0
  41. package/dist/utils/auth.js.map +1 -0
  42. package/dist/utils/constants.d.ts +2 -0
  43. package/dist/utils/constants.d.ts.map +1 -0
  44. package/dist/utils/constants.js +5 -0
  45. package/dist/utils/constants.js.map +1 -0
  46. package/dist/utils/detect-code.d.ts +30 -0
  47. package/dist/utils/detect-code.d.ts.map +1 -0
  48. package/dist/utils/detect-code.js +95 -0
  49. package/dist/utils/detect-code.js.map +1 -0
  50. package/dist/utils/logger.d.ts +15 -0
  51. package/dist/utils/logger.d.ts.map +1 -0
  52. package/dist/utils/logger.js +127 -0
  53. package/dist/utils/logger.js.map +1 -0
  54. package/package.json +86 -0
@@ -0,0 +1,116 @@
1
+ import Sandbox from 'e2b';
2
+ import { BaseClass } from './base';
3
+ /**
4
+ * FileSystem 类 - 提供沙箱环境中的文件系统操作功能
5
+ *
6
+ * 主要功能:
7
+ * - 文件和目录的读写操作
8
+ * - 安全的文件同步(本地 ↔ 沙箱)
9
+ * - 递归目录同步
10
+ * - 二进制文件检测和处理
11
+ * - 路径安全验证
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const fileSystem = new FileSystem(sandbox);
16
+ *
17
+ * // 读取文件
18
+ * const content = await fileSystem.read('/path/to/file.txt');
19
+ *
20
+ * // 写入文件
21
+ * await fileSystem.write('/path/to/file.txt', 'Hello World');
22
+ *
23
+ * // 同步目录
24
+ * const localPath = await fileSystem.syncDownloadsDirectory();
25
+ * ```
26
+ */
27
+ export declare class FileSystem extends BaseClass {
28
+ /**
29
+ * 创建 FileSystem 实例
30
+ * @param sandbox - E2B 沙箱实例
31
+ * @param options - 可选配置参数
32
+ */
33
+ constructor(sandbox: Sandbox, options?: {
34
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
35
+ });
36
+ /**
37
+ * 检查文件是否为二进制文件(基于文件扩展名)
38
+ * @param filePath - 要检查的文件路径
39
+ * @returns 如果是二进制文件返回 true,否则返回 false
40
+ * @private
41
+ */
42
+ private isBinaryFile;
43
+ /**
44
+ * 验证路径是否安全,只允许同步 /home/user 目录下的子目录
45
+ * @param path - 要验证的路径
46
+ * @returns 是否为安全路径
47
+ * @private
48
+ */
49
+ private validateSafePathToDownload;
50
+ /**
51
+ * 根据指定编码格式转换数据
52
+ * @param data - 要转换的数据(Buffer 或 Uint8Array)
53
+ * @param encoding - 目标编码格式
54
+ * @returns 转换后的数据
55
+ * @private
56
+ */
57
+ private encodeContent;
58
+ /**
59
+ * 列出沙箱目录中的文件
60
+ * @param path - 沙箱中的目录路径
61
+ * @returns 文件名列表的 Promise
62
+ * @throws {Error} 当沙箱未运行或列表操作失败时抛出错误
63
+ */
64
+ listFiles(path: string): Promise<string[]>;
65
+ /**
66
+ * 检查远程路径是否为目录
67
+ * @param remotePath - 远程路径
68
+ * @returns 是否为目录
69
+ * @private
70
+ */
71
+ isDirectory(remotePath: string): Promise<boolean>;
72
+ /**
73
+ * 递归同步目录
74
+ * @param remotePath - 远程目录路径
75
+ * @param localPath - 本地目录路径
76
+ * @returns 同步的文件数量
77
+ * @private
78
+ */
79
+ private syncDirectoryRecursive;
80
+ /**
81
+ * 向沙箱中写入文件
82
+ * @param path - 沙箱中的文件路径
83
+ * @param content - 要写入的内容
84
+ */
85
+ write(path: string, content: string | ArrayBuffer): Promise<void>;
86
+ /**
87
+ * 从沙箱中读取文件
88
+ * @param remotePath - 沙箱中的文件路径
89
+ * @param options - 读取选项,包含编码格式
90
+ * @returns 文件内容
91
+ */
92
+ read(remotePath: string, options?: {
93
+ encoding?: 'utf8' | 'base64' | 'binary';
94
+ }): Promise<Buffer | string>;
95
+ /**
96
+ * 上传本地文件到沙箱
97
+ * @param localPath - 本地文件路径
98
+ * @param remotePath - 沙箱中的目标路径
99
+ */
100
+ upload(localPath: string, remotePath: string): Promise<void>;
101
+ /**
102
+ * 从沙箱下载文件到本地
103
+ * @param remotePath - 沙箱中的文件路径
104
+ * @param localPath - 本地目标路径
105
+ */
106
+ download(remotePath: string, localPath: string): Promise<void>;
107
+ /**
108
+ * 同步 sandbox 中的 downloads 目录到本地(递归同步所有子目录)
109
+ * @param dist - 本地目标目录路径,默认为 '/tmp/grasp/downloads'
110
+ * @param src - 远程源目录路径,默认为 './downloads'
111
+ * @returns 本地同步目录路径
112
+ * @throws {Error} 当路径不安全时抛出错误
113
+ */
114
+ syncDownloadsDirectory(dist?: string, src?: string): Promise<string>;
115
+ }
116
+ //# sourceMappingURL=file-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/core/file-system.ts"],"names":[],"mappings":"AAEA,OAAO,OAA0B,MAAM,KAAK,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAU,MAAM,QAAQ,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,UAAW,SAAQ,SAAS;IACvC;;;;OAIG;gBAED,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;KAC1D;IAMH;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAmCpB;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IAgClC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkChD;;;;;OAKG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvD;;;;;;OAMG;YACW,sBAAsB;IA6DpC;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvE;;;;;OAKG;IACG,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;KAAO,GACxD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAyB3B;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlE;;;;OAIG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE;;;;;;OAMG;IACU,sBAAsB,CACjC,IAAI,GAAE,MAA+B,EACrC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC;CAwDnB"}
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.FileSystem = void 0;
16
+ const promises_1 = __importDefault(require("node:fs/promises"));
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ const e2b_1 = __importDefault(require("e2b"));
19
+ const base_1 = require("./base");
20
+ /**
21
+ * FileSystem 类 - 提供沙箱环境中的文件系统操作功能
22
+ *
23
+ * 主要功能:
24
+ * - 文件和目录的读写操作
25
+ * - 安全的文件同步(本地 ↔ 沙箱)
26
+ * - 递归目录同步
27
+ * - 二进制文件检测和处理
28
+ * - 路径安全验证
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const fileSystem = new FileSystem(sandbox);
33
+ *
34
+ * // 读取文件
35
+ * const content = await fileSystem.read('/path/to/file.txt');
36
+ *
37
+ * // 写入文件
38
+ * await fileSystem.write('/path/to/file.txt', 'Hello World');
39
+ *
40
+ * // 同步目录
41
+ * const localPath = await fileSystem.syncDownloadsDirectory();
42
+ * ```
43
+ */
44
+ let FileSystem = class FileSystem extends base_1.BaseClass {
45
+ /**
46
+ * 创建 FileSystem 实例
47
+ * @param sandbox - E2B 沙箱实例
48
+ * @param options - 可选配置参数
49
+ */
50
+ constructor(sandbox, options) {
51
+ super(sandbox, options?.logLevel);
52
+ this.logger.debug('FileSystem 类初始化完成');
53
+ }
54
+ /**
55
+ * 检查文件是否为二进制文件(基于文件扩展名)
56
+ * @param filePath - 要检查的文件路径
57
+ * @returns 如果是二进制文件返回 true,否则返回 false
58
+ * @private
59
+ */
60
+ isBinaryFile(filePath) {
61
+ const binaryExtensions = [
62
+ '.png',
63
+ '.jpg',
64
+ '.jpeg',
65
+ '.gif',
66
+ '.bmp',
67
+ '.webp',
68
+ '.ico',
69
+ '.pdf',
70
+ '.zip',
71
+ '.tar',
72
+ '.gz',
73
+ '.rar',
74
+ '.7z',
75
+ '.mp3',
76
+ '.mp4',
77
+ '.avi',
78
+ '.mov',
79
+ '.wmv',
80
+ '.flv',
81
+ '.exe',
82
+ '.dll',
83
+ '.so',
84
+ '.dylib',
85
+ '.bin',
86
+ '.dat',
87
+ '.db',
88
+ '.sqlite',
89
+ ];
90
+ const ext = filePath.toLowerCase().substring(filePath.lastIndexOf('.'));
91
+ return binaryExtensions.includes(ext);
92
+ }
93
+ /**
94
+ * 验证路径是否安全,只允许同步 /home/user 目录下的子目录
95
+ * @param path - 要验证的路径
96
+ * @returns 是否为安全路径
97
+ * @private
98
+ */
99
+ validateSafePathToDownload(path) {
100
+ // 规范化路径
101
+ const normalizedPath = path.replace(/\/+/g, '/').replace(/\/$/, '');
102
+ // 检查是否为绝对路径且在 /home/user 下
103
+ if (normalizedPath.startsWith('/')) {
104
+ // 绝对路径必须在 /home/user 目录下,且不能是 /home/user 本身
105
+ return (normalizedPath.startsWith('/home/user/') &&
106
+ normalizedPath !== '/home/user');
107
+ }
108
+ // 相对路径检查
109
+ // 不允许包含 .. 来访问上级目录
110
+ if (normalizedPath.includes('..')) {
111
+ return false;
112
+ }
113
+ // 不允许同步当前目录本身(. 或空字符串)
114
+ if (normalizedPath === '.' ||
115
+ normalizedPath === '' ||
116
+ normalizedPath === './') {
117
+ return false;
118
+ }
119
+ // 相对路径必须是子目录(以 ./ 开头或直接是目录名)
120
+ return normalizedPath.startsWith('./') || !normalizedPath.startsWith('/');
121
+ }
122
+ /**
123
+ * 根据指定编码格式转换数据
124
+ * @param data - 要转换的数据(Buffer 或 Uint8Array)
125
+ * @param encoding - 目标编码格式
126
+ * @returns 转换后的数据
127
+ * @private
128
+ */
129
+ encodeContent(data, encoding) {
130
+ if (encoding === 'utf8') {
131
+ return Buffer.from(data).toString('utf-8');
132
+ }
133
+ else if (encoding === 'base64') {
134
+ return Buffer.from(data).toString('base64');
135
+ }
136
+ return Buffer.from(data);
137
+ }
138
+ /**
139
+ * 列出沙箱目录中的文件
140
+ * @param path - 沙箱中的目录路径
141
+ * @returns 文件名列表的 Promise
142
+ * @throws {Error} 当沙箱未运行或列表操作失败时抛出错误
143
+ */
144
+ async listFiles(path) {
145
+ try {
146
+ this.logger.debug('开始列出目录文件', { path });
147
+ const result = (await this.sandbox.commands.run(`ls -la "${path}"`));
148
+ if (result.exitCode) {
149
+ this.logger.error('列出文件失败', {
150
+ path,
151
+ exitCode: result.exitCode,
152
+ stderr: result.stderr,
153
+ });
154
+ throw new Error(`Failed to list files: ${result.stderr}`);
155
+ }
156
+ // 解析 ls 输出以提取文件名
157
+ const files = result.stdout
158
+ ?.split('\n')
159
+ .slice(1) // 跳过第一行(总计)
160
+ .filter(line => line.trim())
161
+ .map(line => line.split(/\s+/).pop())
162
+ .filter(name => name && name !== '.' && name !== '..') || [];
163
+ this.logger.debug('成功列出文件', { path, fileCount: files.length });
164
+ return files;
165
+ }
166
+ catch (error) {
167
+ this.logger.error('列出文件时发生错误', { path, error });
168
+ throw new Error(`Failed to list files: ${error}`);
169
+ }
170
+ }
171
+ /**
172
+ * 检查远程路径是否为目录
173
+ * @param remotePath - 远程路径
174
+ * @returns 是否为目录
175
+ * @private
176
+ */
177
+ async isDirectory(remotePath) {
178
+ try {
179
+ const result = (await this.sandbox.commands.run(`test -d "${remotePath}" && echo "true" || echo "false"`));
180
+ return result.stdout?.trim() === 'true';
181
+ }
182
+ catch (error) {
183
+ this.logger.debug('Error checking if path is directory', {
184
+ remotePath,
185
+ error,
186
+ });
187
+ return false;
188
+ }
189
+ }
190
+ /**
191
+ * 递归同步目录
192
+ * @param remotePath - 远程目录路径
193
+ * @param localPath - 本地目录路径
194
+ * @returns 同步的文件数量
195
+ * @private
196
+ */
197
+ async syncDirectoryRecursive(remotePath, localPath) {
198
+ let syncedCount = 0;
199
+ try {
200
+ // 获取目录中的所有文件和子目录
201
+ const items = await this.listFiles(remotePath);
202
+ if (items.length === 0) {
203
+ this.logger.debug('No items found in directory', { remotePath });
204
+ return 0;
205
+ }
206
+ // 确保本地目录存在
207
+ await promises_1.default.mkdir(localPath, { recursive: true });
208
+ // 处理每个项目
209
+ for (const item of items) {
210
+ const remoteItemPath = `${remotePath}/${item}`;
211
+ const localItemPath = node_path_1.default.join(localPath, item);
212
+ // 检查是否为目录
213
+ const isDir = await this.isDirectory(remoteItemPath);
214
+ if (isDir) {
215
+ this.logger.debug('Syncing subdirectory', {
216
+ from: remoteItemPath,
217
+ to: localItemPath,
218
+ });
219
+ // 递归同步子目录
220
+ const subSyncedCount = await this.syncDirectoryRecursive(remoteItemPath, localItemPath);
221
+ syncedCount += subSyncedCount;
222
+ }
223
+ else {
224
+ this.logger.debug('Syncing file', {
225
+ from: remoteItemPath,
226
+ to: localItemPath,
227
+ });
228
+ // 同步文件
229
+ await this.download(remoteItemPath, localItemPath);
230
+ syncedCount++;
231
+ }
232
+ }
233
+ return syncedCount;
234
+ }
235
+ catch (error) {
236
+ this.logger.error('Error in recursive directory sync', {
237
+ remotePath,
238
+ localPath,
239
+ error,
240
+ });
241
+ throw error;
242
+ }
243
+ }
244
+ /**
245
+ * 向沙箱中写入文件
246
+ * @param path - 沙箱中的文件路径
247
+ * @param content - 要写入的内容
248
+ */
249
+ async write(path, content) {
250
+ try {
251
+ this.logger.debug('开始写入文件', { path, contentType: typeof content });
252
+ await this.sandbox.files.write(path, content);
253
+ this.logger.debug('文件写入成功', { path });
254
+ }
255
+ catch (error) {
256
+ this.logger.error('文件写入失败', { path, error });
257
+ throw error;
258
+ }
259
+ }
260
+ /**
261
+ * 从沙箱中读取文件
262
+ * @param remotePath - 沙箱中的文件路径
263
+ * @param options - 读取选项,包含编码格式
264
+ * @returns 文件内容
265
+ */
266
+ async read(remotePath, options = {}) {
267
+ try {
268
+ if (!options.encoding) {
269
+ options.encoding = this.isBinaryFile(remotePath) ? 'binary' : 'utf8';
270
+ }
271
+ this.logger.debug('开始读取文件', {
272
+ remotePath,
273
+ encoding: options.encoding,
274
+ });
275
+ const buffer = await this.sandbox.files.read(remotePath, {
276
+ format: 'bytes',
277
+ });
278
+ const result = this.encodeContent(buffer, options.encoding);
279
+ this.logger.debug('文件读取成功', { remotePath, size: buffer.length });
280
+ return result;
281
+ }
282
+ catch (error) {
283
+ this.logger.error('文件读取失败', { remotePath, error });
284
+ throw error;
285
+ }
286
+ }
287
+ /**
288
+ * 上传本地文件到沙箱
289
+ * @param localPath - 本地文件路径
290
+ * @param remotePath - 沙箱中的目标路径
291
+ */
292
+ async upload(localPath, remotePath) {
293
+ try {
294
+ this.logger.debug('开始上传文件', { localPath, remotePath });
295
+ const content = await promises_1.default.readFile(localPath);
296
+ if (typeof content === 'string') {
297
+ await this.sandbox.files.write(remotePath, content);
298
+ }
299
+ else {
300
+ // 将 Buffer 转换为 ArrayBuffer
301
+ const arrayBuffer = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength);
302
+ await this.sandbox.files.write(remotePath, arrayBuffer);
303
+ }
304
+ this.logger.debug('文件上传成功', { localPath, remotePath });
305
+ }
306
+ catch (error) {
307
+ this.logger.error('文件上传失败', { localPath, remotePath, error });
308
+ throw error;
309
+ }
310
+ }
311
+ /**
312
+ * 从沙箱下载文件到本地
313
+ * @param remotePath - 沙箱中的文件路径
314
+ * @param localPath - 本地目标路径
315
+ */
316
+ async download(remotePath, localPath) {
317
+ try {
318
+ this.logger.debug('开始下载文件', { remotePath, localPath });
319
+ const content = await this.read(remotePath);
320
+ await promises_1.default.writeFile(localPath, content);
321
+ this.logger.debug('文件下载成功', { remotePath, localPath });
322
+ }
323
+ catch (error) {
324
+ this.logger.error('文件下载失败', { remotePath, localPath, error });
325
+ throw error;
326
+ }
327
+ }
328
+ /**
329
+ * 同步 sandbox 中的 downloads 目录到本地(递归同步所有子目录)
330
+ * @param dist - 本地目标目录路径,默认为 '/tmp/grasp/downloads'
331
+ * @param src - 远程源目录路径,默认为 './downloads'
332
+ * @returns 本地同步目录路径
333
+ * @throws {Error} 当路径不安全时抛出错误
334
+ */
335
+ async syncDownloadsDirectory(dist = '/tmp/grasp/downloads', src = './downloads') {
336
+ // 验证路径安全性
337
+ if (!this.validateSafePathToDownload(src)) {
338
+ const error = new Error(`Unsafe path detected: ${src}. Only subdirectories under /home/user are allowed.`);
339
+ this.logger.error('Path validation failed', {
340
+ path: src,
341
+ error: error.message,
342
+ });
343
+ throw error;
344
+ }
345
+ const remotePath = src;
346
+ const localPath = dist;
347
+ try {
348
+ this.logger.debug('🗂️ Starting recursive directory sync', {
349
+ remotePath,
350
+ localPath,
351
+ });
352
+ // 检查远程目录是否存在
353
+ const dirExists = await this.isDirectory(remotePath);
354
+ if (!dirExists) {
355
+ // 尝试作为文件处理
356
+ const files = await this.listFiles(node_path_1.default.dirname(remotePath));
357
+ const fileName = node_path_1.default.basename(remotePath);
358
+ if (!files.includes(fileName)) {
359
+ this.logger.debug('Remote path does not exist', { remotePath });
360
+ return '';
361
+ }
362
+ }
363
+ // 递归同步目录
364
+ const syncedCount = await this.syncDirectoryRecursive(remotePath, localPath);
365
+ if (syncedCount === 0) {
366
+ this.logger.debug('No files found to sync');
367
+ return '';
368
+ }
369
+ this.logger.debug(`🎉 Successfully synced ${syncedCount} files recursively from ${remotePath}`);
370
+ return localPath;
371
+ }
372
+ catch (error) {
373
+ this.logger.error('Error syncing downloads directory:', error);
374
+ throw error;
375
+ }
376
+ }
377
+ };
378
+ exports.FileSystem = FileSystem;
379
+ exports.FileSystem = FileSystem = __decorate([
380
+ (0, base_1.Logger)({ version: '0.1.0' }),
381
+ __metadata("design:paramtypes", [e2b_1.default, Object])
382
+ ], FileSystem);
383
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/core/file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import Sandbox from 'e2b';
2
+ import { BaseClass } from './base';
3
+ import { StreamableCommandResponse, Terminal } from './terminal';
4
+ import { CodeRunner } from './code-runner';
5
+ import { FileSystem } from './file-system';
6
+ import { Browser } from './browser';
7
+ export declare const sessions: Record<string, Session>;
8
+ export declare class Session extends BaseClass {
9
+ readonly terminal: Terminal;
10
+ readonly codeRunner: CodeRunner;
11
+ readonly files: FileSystem;
12
+ process: StreamableCommandResponse | null;
13
+ private connectionMetaData;
14
+ private ws;
15
+ private isClosed;
16
+ private keepAliveTimer;
17
+ private _browser;
18
+ constructor(sandbox: Sandbox, options?: {
19
+ envs?: Record<string, string>;
20
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
21
+ });
22
+ private keepAlive;
23
+ get browser(): Browser;
24
+ _setConnectionMetaData(metaData: Record<string, string>): void;
25
+ isRunning(): Promise<boolean>;
26
+ get id(): string;
27
+ getLogger(): import("pino").Logger;
28
+ getHost(port?: number): string;
29
+ setTimeout(ms: number): Promise<void>;
30
+ close(forceToKill?: boolean): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAU,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AAEpD,qBACa,OAAQ,SAAQ,SAAS;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IACxD,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAwB;gBAGtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;KACrD;IAWR,OAAO,CAAC,SAAS;IAYjB,IAAI,OAAO,YAEV;IAED,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAqBjD,SAAS;IAIf,IAAI,EAAE,WAEL;IAED,SAAS;IAIT,OAAO,CAAC,IAAI,GAAE,MAAa;IAMrB,UAAU,CAAC,EAAE,EAAE,MAAM;IAIrB,KAAK,CAAC,WAAW,UAAQ;CAiBhC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Session = exports.sessions = void 0;
16
+ const e2b_1 = __importDefault(require("e2b"));
17
+ const base_1 = require("./base");
18
+ const terminal_1 = require("./terminal");
19
+ const code_runner_1 = require("./code-runner");
20
+ const file_system_1 = require("./file-system");
21
+ const ws_1 = __importDefault(require("ws"));
22
+ const browser_1 = require("./browser");
23
+ exports.sessions = {};
24
+ let Session = class Session extends base_1.BaseClass {
25
+ constructor(sandbox, options = {}) {
26
+ super(sandbox, options.logLevel);
27
+ this.process = null;
28
+ this.connectionMetaData = {};
29
+ this.ws = null;
30
+ this.isClosed = false;
31
+ this.keepAliveTimer = null;
32
+ this._browser = null;
33
+ this.terminal = new terminal_1.Terminal(sandbox, options);
34
+ this.codeRunner = new code_runner_1.CodeRunner(sandbox, options);
35
+ this.files = new file_system_1.FileSystem(sandbox, {
36
+ logLevel: options.logLevel,
37
+ });
38
+ exports.sessions[sandbox.sandboxId] = this;
39
+ }
40
+ keepAlive() {
41
+ const ws = this.ws;
42
+ if (ws.readyState === ws_1.default.OPEN) {
43
+ ws.ping();
44
+ }
45
+ ws.once('pong', () => {
46
+ this.keepAliveTimer = setTimeout(() => {
47
+ this.keepAlive();
48
+ }, 10000);
49
+ });
50
+ }
51
+ get browser() {
52
+ return this._browser;
53
+ }
54
+ _setConnectionMetaData(metaData) {
55
+ this.connectionMetaData = metaData;
56
+ this._browser = new browser_1.Browser(this.sandbox, metaData);
57
+ this.ws = new ws_1.default(this.connectionMetaData.wsUrl);
58
+ this.ws.on('open', () => {
59
+ if (!this.isClosed) {
60
+ this.keepAliveTimer = setTimeout(() => {
61
+ this.keepAlive();
62
+ }, 10000);
63
+ }
64
+ else {
65
+ this.ws.close();
66
+ }
67
+ });
68
+ this.ws.on('close', () => {
69
+ this.logger.debug('WebSocket disconnected');
70
+ clearInterval(this.keepAliveTimer);
71
+ this.process?.kill();
72
+ });
73
+ }
74
+ async isRunning() {
75
+ return this.sandbox.isRunning();
76
+ }
77
+ get id() {
78
+ return this.sandbox.sandboxId;
79
+ }
80
+ getLogger() {
81
+ return this.logger;
82
+ }
83
+ getHost(port = 9223) {
84
+ return this.sandbox
85
+ .getHost(port)
86
+ .replace('sandbox.novita.ai', 'cerevox.io');
87
+ }
88
+ async setTimeout(ms) {
89
+ await this.sandbox.setTimeout(ms);
90
+ }
91
+ async close(forceToKill = false) {
92
+ if (this.ws?.readyState === ws_1.default.OPEN) {
93
+ this.ws?.close();
94
+ }
95
+ this.isClosed = true;
96
+ if (forceToKill) {
97
+ // 主进程
98
+ // await this.process?.kill();
99
+ const isRunning = await this.sandbox.isRunning();
100
+ if (isRunning) {
101
+ await this.sandbox.kill();
102
+ }
103
+ }
104
+ delete exports.sessions[this.id];
105
+ this.logger.debug(`Session ${this.id} closed`);
106
+ }
107
+ };
108
+ exports.Session = Session;
109
+ exports.Session = Session = __decorate([
110
+ (0, base_1.Logger)({ version: '0.1.0' }),
111
+ __metadata("design:paramtypes", [e2b_1.default, Object])
112
+ ], Session);
113
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}