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,57 @@
1
+ import 'reflect-metadata';
2
+ import type { Logger as PinoLogger } from 'pino';
3
+ import Sandbox from 'e2b';
4
+ /**
5
+ * Logger配置接口
6
+ */
7
+ interface LoggerConfig {
8
+ key?: string;
9
+ additionalBindings?: Record<string, any>;
10
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
11
+ }
12
+ /**
13
+ * Logger装饰器 - 用于自动配置类的logger
14
+ * 支持新旧装饰器模式
15
+ */
16
+ export declare function WithLogger(config?: LoggerConfig): (target: any, context?: ClassDecoratorContext) => void;
17
+ /**
18
+ * Logger装饰器 - 自动使用类名作为key
19
+ * 支持新旧装饰器模式
20
+ */
21
+ export declare function Logger(additionalBindings?: Record<string, any>): (target: any, context?: ClassDecoratorContext) => void;
22
+ /**
23
+ * 基类,为所有core模块提供统一的logger初始化功能
24
+ */
25
+ export declare abstract class BaseClass {
26
+ protected sandbox: Sandbox;
27
+ /**
28
+ * 类专用的logger实例
29
+ */
30
+ protected readonly logger: PinoLogger;
31
+ /**
32
+ * 类名标识
33
+ */
34
+ protected readonly className: string;
35
+ /**
36
+ * 构造函数
37
+ * 自动从装饰器元数据中获取logger配置
38
+ */
39
+ constructor(sandbox: Sandbox, logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal');
40
+ /**
41
+ * 获取类名
42
+ */
43
+ getClassName(): string;
44
+ /**
45
+ * 获取logger实例
46
+ */
47
+ getLogger(): PinoLogger;
48
+ /**
49
+ * 创建子logger
50
+ */
51
+ protected createChildLogger(bindings: Record<string, any>): PinoLogger;
52
+ }
53
+ /**
54
+ * 导出类型
55
+ */
56
+ export type { LoggerConfig };
57
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/core/base.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,OAAO,MAAM,KAAK,CAAC;AAE1B;;GAEG;AACH,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;CAC1D;AAcD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,GAAE,YAAiB,IACjC,QAAQ,GAAG,EAAE,UAAU,qBAAqB,UAG9D;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAC5C,QAAQ,GAAG,EAAE,UAAU,qBAAqB,UAK9D;AAED;;GAEG;AACH,8BAAsB,SAAS;IAgB3B,SAAS,CAAC,OAAO,EAAE,OAAO;IAf5B;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAEtC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC;;;OAGG;gBAES,OAAO,EAAE,OAAO,EAC1B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO;IAoB1D;;OAEG;IACI,YAAY,IAAI,MAAM;IAI7B;;OAEG;IACI,SAAS,IAAI,UAAU;IAI9B;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU;CAGvE;AAED;;GAEG;AACH,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseClass = void 0;
4
+ exports.WithLogger = WithLogger;
5
+ exports.Logger = Logger;
6
+ require("reflect-metadata");
7
+ const logger_1 = require("../utils/logger");
8
+ /**
9
+ * Logger装饰器配置的Symbol键
10
+ */
11
+ const LOGGER_CONFIG_KEY = Symbol('loggerConfig');
12
+ /**
13
+ * 封装设置元数据的逻辑
14
+ */
15
+ function defineLoggerMetadata(target, config) {
16
+ Reflect.defineMetadata(LOGGER_CONFIG_KEY, config, target);
17
+ }
18
+ /**
19
+ * Logger装饰器 - 用于自动配置类的logger
20
+ * 支持新旧装饰器模式
21
+ */
22
+ function WithLogger(config = {}) {
23
+ return function (target, context) {
24
+ defineLoggerMetadata(target, config);
25
+ };
26
+ }
27
+ /**
28
+ * Logger装饰器 - 自动使用类名作为key
29
+ * 支持新旧装饰器模式
30
+ */
31
+ function Logger(additionalBindings) {
32
+ return function (target, context) {
33
+ const key = target.name;
34
+ const config = { key, additionalBindings };
35
+ defineLoggerMetadata(target, config);
36
+ };
37
+ }
38
+ /**
39
+ * 基类,为所有core模块提供统一的logger初始化功能
40
+ */
41
+ class BaseClass {
42
+ /**
43
+ * 构造函数
44
+ * 自动从装饰器元数据中获取logger配置
45
+ */
46
+ constructor(sandbox, logLevel) {
47
+ this.sandbox = sandbox;
48
+ const constructor = this.constructor;
49
+ const config = Reflect.getMetadata(LOGGER_CONFIG_KEY, constructor) || {};
50
+ // 如果没有配置key,使用类名
51
+ const key = config.key || constructor.name;
52
+ this.className = key;
53
+ this.logger = (0, logger_1.createClassLogger)(key, config.additionalBindings, logLevel || config.logLevel);
54
+ // 记录类初始化
55
+ // this.logger.debug(`${key} 类初始化完成`);
56
+ }
57
+ /**
58
+ * 获取类名
59
+ */
60
+ getClassName() {
61
+ return this.className;
62
+ }
63
+ /**
64
+ * 获取logger实例
65
+ */
66
+ getLogger() {
67
+ return this.logger;
68
+ }
69
+ /**
70
+ * 创建子logger
71
+ */
72
+ createChildLogger(bindings) {
73
+ return this.logger.child(bindings);
74
+ }
75
+ }
76
+ exports.BaseClass = BaseClass;
77
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/core/base.ts"],"names":[],"mappings":";;;AA8BA,gCAIC;AAMD,wBAMC;AA9CD,4BAA0B;AAC1B,4CAAoD;AAapD;;GAEG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAEjD;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAW,EAAE,MAAoB;IAC7D,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,SAAuB,EAAE;IAClD,OAAO,UAAU,MAAW,EAAE,OAA+B;QAC3D,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,MAAM,CAAC,kBAAwC;IAC7D,OAAO,UAAU,MAAW,EAAE,OAA+B;QAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,MAAM,MAAM,GAAiB,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;QACzD,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAsB,SAAS;IAW7B;;;OAGG;IACH,YACY,OAAgB,EAC1B,QAAwD;QAD9C,YAAO,GAAP,OAAO,CAAS;QAG1B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAkB,CAAC;QAC5C,MAAM,MAAM,GACV,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAE5D,iBAAiB;QACjB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC;QAE3C,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAA,0BAAiB,EAC7B,GAAG,EACH,MAAM,CAAC,kBAAkB,EACzB,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAC5B,CAAC;QAEF,SAAS;QACT,sCAAsC;IACxC,CAAC;IAED;;OAEG;IACI,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,QAA6B;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;CACF;AAzDD,8BAyDC"}
@@ -0,0 +1,30 @@
1
+ import Sandbox from 'e2b';
2
+ import { BaseClass } from './base';
3
+ export declare class Browser extends BaseClass {
4
+ private connectionMetaData;
5
+ constructor(sandbox: Sandbox, connectionMetaData: Record<string, string>);
6
+ get sessionId(): string;
7
+ get host(): string;
8
+ get endpoint(): string;
9
+ /**
10
+ * @experimental This method is experimental and may change or be removed in future versions.
11
+ * Use with caution in production environments.
12
+ */
13
+ getCurrentPageTargetInfo(): Promise<any>;
14
+ /**
15
+ * @experimental This method is experimental and may change or be removed in future versions.
16
+ * Use with caution in production environments.
17
+ */
18
+ getLiveviewStreamingUrl(): Promise<string | null>;
19
+ /**
20
+ * @experimental This method is experimental and may change or be removed in future versions.
21
+ * Use with caution in production environments.
22
+ */
23
+ getLiveviewPageUrl(): Promise<string | null>;
24
+ /**
25
+ * @experimental This method is experimental and may change or be removed in future versions.
26
+ * Use with caution in production environments.
27
+ */
28
+ openLiveviewPage(): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/core/browser.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAU,MAAM,QAAQ,CAAC;AAG3C,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAO,CAAC,kBAAkB,CAA8B;gBAE5C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKxE,IAAI,SAAS,WAEZ;IAED,IAAI,IAAI,WAEP;IAED,IAAI,QAAQ,WAEX;IAED;;;OAGG;IACG,wBAAwB;IA2B9B;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWvD;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWlD;;;OAGG;IACG,gBAAgB;CAMvB"}
@@ -0,0 +1,107 @@
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.Browser = void 0;
16
+ const e2b_1 = __importDefault(require("e2b"));
17
+ const base_1 = require("./base");
18
+ const open_1 = __importDefault(require("open"));
19
+ let Browser = class Browser extends base_1.BaseClass {
20
+ constructor(sandbox, connectionMetaData) {
21
+ super(sandbox);
22
+ this.connectionMetaData = {};
23
+ this.connectionMetaData = connectionMetaData;
24
+ }
25
+ get sessionId() {
26
+ return this.connectionMetaData.id;
27
+ }
28
+ get host() {
29
+ return new URL(this.connectionMetaData.httpUrl).host;
30
+ }
31
+ get endpoint() {
32
+ return this.connectionMetaData.wsUrl;
33
+ }
34
+ /**
35
+ * @experimental This method is experimental and may change or be removed in future versions.
36
+ * Use with caution in production environments.
37
+ */
38
+ async getCurrentPageTargetInfo() {
39
+ const url = this.connectionMetaData.httpUrl;
40
+ const api = `${url}/api/page/info`;
41
+ const response = await fetch(api);
42
+ if (!response.ok) {
43
+ return await response.json();
44
+ }
45
+ const data = await response.json();
46
+ const { lastScreenshot, sessionId, targets, targetId, pageLoaded } = data.pageInfo;
47
+ let currentTarget = {};
48
+ for (const target of Object.values(targets)) {
49
+ if (target.targetId === targetId) {
50
+ currentTarget = target;
51
+ }
52
+ }
53
+ return {
54
+ // pageInfo: data.pageInfo,
55
+ targetId,
56
+ sessionId,
57
+ pageLoaded,
58
+ ...currentTarget,
59
+ lastScreenshot,
60
+ targets,
61
+ };
62
+ }
63
+ /**
64
+ * @experimental This method is experimental and may change or be removed in future versions.
65
+ * Use with caution in production environments.
66
+ */
67
+ async getLiveviewStreamingUrl() {
68
+ const url = this.connectionMetaData.httpUrl;
69
+ const api = `${url}/api/session/liveview/stream`;
70
+ const response = await fetch(api);
71
+ if (!response.ok || !response.body) {
72
+ this.logger.warn('liveview stream not ready', response);
73
+ return null;
74
+ }
75
+ return api;
76
+ }
77
+ /**
78
+ * @experimental This method is experimental and may change or be removed in future versions.
79
+ * Use with caution in production environments.
80
+ */
81
+ async getLiveviewPageUrl() {
82
+ const url = this.connectionMetaData.httpUrl;
83
+ const api = `${url}/api/session/liveview/preview`;
84
+ const response = await fetch(api);
85
+ if (!response.ok || !response.body) {
86
+ this.logger.warn('liveview page not ready', response);
87
+ return null;
88
+ }
89
+ return api;
90
+ }
91
+ /**
92
+ * @experimental This method is experimental and may change or be removed in future versions.
93
+ * Use with caution in production environments.
94
+ */
95
+ async openLiveviewPage() {
96
+ const url = await this.getLiveviewPageUrl();
97
+ if (url) {
98
+ (0, open_1.default)(url);
99
+ }
100
+ }
101
+ };
102
+ exports.Browser = Browser;
103
+ exports.Browser = Browser = __decorate([
104
+ (0, base_1.Logger)({ version: '0.1.0' }),
105
+ __metadata("design:paramtypes", [e2b_1.default, Object])
106
+ ], Browser);
107
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/core/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Session } from './session';
2
+ import 'dotenv/config';
3
+ export interface IBrowserConfig {
4
+ type?: 'chromium' | 'chrome-stable';
5
+ args?: string[];
6
+ headless?: boolean;
7
+ liveview?: boolean;
8
+ adblock?: boolean;
9
+ webgl?: boolean;
10
+ }
11
+ export interface ILaunchConfig {
12
+ browser?: IBrowserConfig;
13
+ timeoutMS?: number;
14
+ keepAliveMS?: number;
15
+ metadata?: Record<string, string>;
16
+ }
17
+ export declare class Cerevox {
18
+ private apiKey;
19
+ private token;
20
+ private domain;
21
+ private debug;
22
+ private logLevel;
23
+ constructor(options?: {
24
+ apiKey?: string;
25
+ debug?: boolean;
26
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
27
+ });
28
+ private getToken;
29
+ private createSession;
30
+ private waitForReady;
31
+ connect(sandboxId: string): Promise<Session>;
32
+ launch(config?: ILaunchConfig): Promise<Session>;
33
+ }
34
+ //# sourceMappingURL=cerevox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerevox.d.ts","sourceRoot":"","sources":["../../src/core/cerevox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,eAAe,CAAC;AAGvB,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAgD;gBAG9D,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;KACrD;YAQM,QAAQ;YAYR,aAAa;YAwBb,YAAY;IA8BpB,OAAO,CAAC,SAAS,EAAE,MAAM;IAkBzB,MAAM,CAAC,MAAM,GAAE,aAAkB;CAqDxC"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Cerevox = void 0;
7
+ const e2b_1 = __importDefault(require("e2b"));
8
+ const session_1 = require("./session");
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const promises_1 = require("node:timers/promises");
12
+ const session_2 = require("./session");
13
+ require("dotenv/config");
14
+ const auth_1 = require("../utils/auth");
15
+ class Cerevox {
16
+ constructor(options = {}) {
17
+ this.token = '';
18
+ this.domain = 'sandbox.novita.ai';
19
+ this.debug = false;
20
+ this.apiKey = options.apiKey || process.env.CEREVOX_API_KEY || '';
21
+ this.debug = !!options.debug;
22
+ // 当 debug 为 true 时默认值为 debug,否则默认值为 error
23
+ this.logLevel = options.logLevel || (this.debug ? 'debug' : 'error');
24
+ }
25
+ async getToken() {
26
+ if (this.token) {
27
+ return this.token;
28
+ }
29
+ const res = await (0, auth_1.verify)({ key: this.apiKey });
30
+ if (!res.success) {
31
+ throw new Error('Invalid Cerevox key');
32
+ }
33
+ this.token = res.data.token;
34
+ return this.token;
35
+ }
36
+ async createSession(session) {
37
+ let remoteScript = '/home/user/http-proxy.js';
38
+ const localPath = node_path_1.default.resolve(__dirname, `../../sandbox/http-proxy.js`);
39
+ const logger = session.getLogger();
40
+ if ((0, node_fs_1.existsSync)(localPath)) {
41
+ remoteScript = '/home/user/http-proxy.local.js';
42
+ logger.debug(`🗂️ Load local file: ${localPath}`);
43
+ await session.files.upload(localPath, remoteScript);
44
+ }
45
+ session.process = await session.terminal.run(`xvfb-run -a node ${remoteScript}`);
46
+ if (this.debug) {
47
+ const serverLogger = logger.child({ class: 'Server' });
48
+ session.process.stdout.on('data', msg => {
49
+ serverLogger.debug(msg.toString('utf-8').trim());
50
+ });
51
+ session.process.stderr.on('data', msg => {
52
+ serverLogger.warn(msg.toString('utf-8').trim());
53
+ });
54
+ }
55
+ }
56
+ async waitForReady(sandbox, session) {
57
+ const host = session.getHost();
58
+ const interval = 50;
59
+ const maxTries = 1000;
60
+ let tries = 0;
61
+ const logger = session.getLogger();
62
+ while (tries++ < maxTries) {
63
+ try {
64
+ const response = await fetch(`https://${host}/json/version`);
65
+ if (response.ok) {
66
+ const responseText = await response.text();
67
+ if (responseText.includes('Browser')) {
68
+ const metaData = JSON.parse(responseText);
69
+ metaData.wsUrl = metaData.webSocketDebuggerUrl;
70
+ metaData.httpUrl = `https://${host}`;
71
+ delete metaData.webSocketDebuggerUrl;
72
+ logger.debug('CDP server is ready', metaData);
73
+ session._setConnectionMetaData(metaData);
74
+ return metaData;
75
+ }
76
+ }
77
+ }
78
+ catch (error) {
79
+ logger.debug(`CDP check failed (attempt ${tries}):`, error);
80
+ }
81
+ await (0, promises_1.setTimeout)(interval);
82
+ }
83
+ throw new Error('CDP server failed to become ready within timeout');
84
+ }
85
+ async connect(sandboxId) {
86
+ if (session_2.sessions[sandboxId]) {
87
+ return session_2.sessions[sandboxId];
88
+ }
89
+ const token = await this.getToken();
90
+ const sandbox = await e2b_1.default.connect(sandboxId, {
91
+ apiKey: token,
92
+ });
93
+ const session = new session_1.Session(sandbox, {
94
+ envs: {
95
+ SANDBOX_ID: sandbox.sandboxId,
96
+ },
97
+ logLevel: this.logLevel,
98
+ });
99
+ await this.waitForReady(sandbox, session);
100
+ return session;
101
+ }
102
+ async launch(config = {}) {
103
+ const { browser, ...options } = config;
104
+ const browserConfig = {
105
+ type: 'chromium',
106
+ args: [],
107
+ headless: true,
108
+ liveview: false,
109
+ adblock: false,
110
+ webgl: false,
111
+ ...browser,
112
+ };
113
+ const launchConfig = {
114
+ timeoutMS: config.timeoutMS || 300000,
115
+ keepAliveMS: config.keepAliveMS || 5000,
116
+ ...options,
117
+ };
118
+ const token = await this.getToken();
119
+ const sandbox = await e2b_1.default.create(`cerevox-${browserConfig.type}`, {
120
+ timeoutMs: launchConfig.timeoutMS,
121
+ apiKey: token,
122
+ domain: this.domain,
123
+ metadata: launchConfig.metadata,
124
+ envs: {
125
+ NODE_ENV: this.debug ? 'development' : 'production',
126
+ PLAYWRIGHT_BROWSERS_PATH: '0',
127
+ CDP_PORT: '9222',
128
+ HEADLESS: browserConfig.headless.toString(),
129
+ ADBLOCK: browserConfig.adblock.toString(),
130
+ SANDBOX_TIMEOUT: launchConfig.timeoutMS.toString(),
131
+ ENABLE_LIVEVIEW: browserConfig.liveview.toString(),
132
+ KEEP_ALIVE_MS: launchConfig.keepAliveMS.toString(),
133
+ APIKEY: this.apiKey,
134
+ SANDBOX_DOMAIN: this.domain,
135
+ BROWSER_TYPE: browserConfig.type,
136
+ ENABLE_WEBGL: browserConfig.webgl.toString(),
137
+ BROWSER_ARGS: JSON.stringify(browserConfig.args),
138
+ CEREVOX_DOMAIN: 'cerevox.io',
139
+ },
140
+ });
141
+ const session = new session_1.Session(sandbox, {
142
+ envs: {
143
+ SANDBOX_ID: sandbox.sandboxId,
144
+ },
145
+ logLevel: this.logLevel,
146
+ });
147
+ await this.createSession(session);
148
+ await this.waitForReady(sandbox, session);
149
+ return session;
150
+ }
151
+ }
152
+ exports.Cerevox = Cerevox;
153
+ //# sourceMappingURL=cerevox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerevox.js","sourceRoot":"","sources":["../../src/core/cerevox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import Sandbox from 'e2b';
2
+ import { BaseClass } from './base';
3
+ import { StreamableCommandResponse } from './terminal';
4
+ export declare class CodeRunner extends BaseClass {
5
+ protected sandbox: Sandbox;
6
+ private terminal;
7
+ private fileSystem;
8
+ /**
9
+ * 创建 CodeRunner 实例
10
+ * @param sandbox - E2B 沙箱实例
11
+ * @param envs - 环境变量配置
12
+ * @param logLevel - 日志级别
13
+ */
14
+ constructor(sandbox: Sandbox, options?: {
15
+ envs?: Record<string, string>;
16
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
17
+ });
18
+ run(code: string, options?: {
19
+ timeout?: number;
20
+ }): Promise<StreamableCommandResponse>;
21
+ }
22
+ //# sourceMappingURL=code-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-runner.d.ts","sourceRoot":"","sources":["../../src/core/code-runner.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAU,MAAM,QAAQ,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAY,MAAM,YAAY,CAAC;AAIjE,qBACa,UAAW,SAAQ,SAAS;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;;OAKG;gBAED,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;IAcF,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACjC,OAAO,CAAC,yBAAyB,CAAC;CAWtC"}
@@ -0,0 +1,56 @@
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.CodeRunner = void 0;
16
+ const e2b_1 = __importDefault(require("e2b"));
17
+ const base_1 = require("./base");
18
+ const uuid_1 = require("uuid");
19
+ const terminal_1 = require("./terminal");
20
+ const detect_code_1 = require("../utils/detect-code");
21
+ const file_system_1 = require("./file-system");
22
+ let CodeRunner = class CodeRunner extends base_1.BaseClass {
23
+ /**
24
+ * 创建 CodeRunner 实例
25
+ * @param sandbox - E2B 沙箱实例
26
+ * @param envs - 环境变量配置
27
+ * @param logLevel - 日志级别
28
+ */
29
+ constructor(sandbox, options = {}) {
30
+ super(sandbox, options.logLevel);
31
+ this.sandbox = sandbox;
32
+ this.terminal = new terminal_1.Terminal(sandbox, {
33
+ envs: options.envs,
34
+ id: (0, uuid_1.v4)(),
35
+ logLevel: options.logLevel,
36
+ });
37
+ this.fileSystem = new file_system_1.FileSystem(sandbox, {
38
+ logLevel: options.logLevel,
39
+ });
40
+ }
41
+ async run(code, options = {}) {
42
+ const type = (0, detect_code_1.detectCodeType)(code);
43
+ const scriptFile = `/home/user/scripts/${(0, uuid_1.v4)()}-script.${type === 'esm' ? 'mjs' : type}`;
44
+ await this.fileSystem.write(scriptFile, code);
45
+ const terminal = this.terminal;
46
+ const timeout = options.timeout || 300000;
47
+ const cmd = `${type === 'py' ? 'python3' : 'node'} ${scriptFile}`;
48
+ return terminal.run(cmd, { timeoutMs: timeout });
49
+ }
50
+ };
51
+ exports.CodeRunner = CodeRunner;
52
+ exports.CodeRunner = CodeRunner = __decorate([
53
+ (0, base_1.Logger)({ version: '0.1.0' }),
54
+ __metadata("design:paramtypes", [e2b_1.default, Object])
55
+ ], CodeRunner);
56
+ //# sourceMappingURL=code-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-runner.js","sourceRoot":"","sources":["../../src/core/code-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,8CAA0B;AAC1B,iCAA2C;AAC3C,+BAAoC;AACpC,yCAAiE;AACjE,sDAAsD;AACtD,+CAA2C;AAGpC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,gBAAS;IAKvC;;;;;OAKG;IACH,YACE,OAAgB,EAChB,UAGI,EAAE;QAEN,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,IAAA,SAAM,GAAE;YACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,wBAAU,CAAC,OAAO,EAAE;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,UAAgC,EAAE;QAElC,MAAM,IAAI,GAAG,IAAA,4BAAc,EAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,sBAAsB,IAAA,SAAM,GAAE,WAAW,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5F,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;QAE1C,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QAClE,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AA5CY,gCAAU;qBAAV,UAAU;IADtB,IAAA,aAAM,EAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;qCAahB,aAAO;GAZP,UAAU,CA4CtB"}