@tencent-ai/cloud-agent-sdk 0.2.13 → 0.2.14-next.fd56252.20260319

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.
@@ -0,0 +1,168 @@
1
+ const require_index = require('./index.cjs');
2
+ let e2b = require("e2b");
3
+
4
+ //#region ../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts
5
+ /**
6
+ * E2B Filesystem Implementation
7
+ *
8
+ * Provides FilesResource implementation using E2B Sandbox SDK.
9
+ * Supports optional auto-reconnect on auth failure (401/403).
10
+ *
11
+ * @see https://e2b.dev/docs/filesystem/read-write
12
+ * @see https://e2b.dev/docs/filesystem/watch
13
+ */
14
+ /**
15
+ * E2B Filesystem
16
+ *
17
+ * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.
18
+ * When `reconnectFn` is provided, automatically reconnects on auth errors.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Basic usage (no auto-reconnect)
23
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
24
+ *
25
+ * // With auto-reconnect on token expiry
26
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
27
+ * fs.setReconnectFn(async () => fetchFreshConnectionInfo());
28
+ * ```
29
+ */
30
+ var E2BFilesystem = class E2BFilesystem {
31
+ static {
32
+ this.MIN_RECONNECT_INTERVAL_MS = 10 * 1e3;
33
+ }
34
+ constructor(sandbox) {
35
+ this.isReconnecting = false;
36
+ this.reconnectSubscribers = [];
37
+ this.lastReconnectAt = 0;
38
+ this.sandbox = sandbox;
39
+ }
40
+ /**
41
+ * Connect to an E2B Sandbox and create filesystem instance
42
+ */
43
+ static async connect(info) {
44
+ return new E2BFilesystem(await e2b.Sandbox.connect(info.sandboxId, {
45
+ domain: info.domain,
46
+ apiUrl: info.apiUrl,
47
+ requestTimeoutMs: info.requestTimeoutMs,
48
+ debug: info.debug,
49
+ headers: info.headers
50
+ }));
51
+ }
52
+ /**
53
+ * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.
54
+ */
55
+ setReconnectFn(fn) {
56
+ this.reconnectFn = fn;
57
+ }
58
+ /**
59
+ * Get the underlying E2B Sandbox instance
60
+ */
61
+ getSandbox() {
62
+ return this.sandbox;
63
+ }
64
+ isAuthError(error) {
65
+ if (!error || typeof error !== "object") return false;
66
+ const err = error;
67
+ if (err.status === 401 || err.status === 403) return true;
68
+ if (err.statusCode === 401 || err.statusCode === 403) return true;
69
+ if (err.response && typeof err.response === "object") {
70
+ const resp = err.response;
71
+ if (resp.status === 401 || resp.status === 403) return true;
72
+ }
73
+ if (typeof err.message === "string") {
74
+ const msg = err.message.toLowerCase();
75
+ if (msg.includes("unauthorized") || msg.includes("token expired") || msg.includes("authentication")) return true;
76
+ }
77
+ return false;
78
+ }
79
+ canAttemptReconnect() {
80
+ return Date.now() - this.lastReconnectAt >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;
81
+ }
82
+ /**
83
+ * Reconnect with fresh credentials.
84
+ * Only one reconnect in-flight at a time; concurrent callers share the result.
85
+ */
86
+ async reconnect() {
87
+ if (this.isReconnecting) return new Promise((resolve, reject) => {
88
+ this.reconnectSubscribers.push((success) => {
89
+ if (success) resolve();
90
+ else reject(/* @__PURE__ */ new Error("E2B sandbox reconnect failed"));
91
+ });
92
+ });
93
+ this.isReconnecting = true;
94
+ this.lastReconnectAt = Date.now();
95
+ try {
96
+ const info = await this.reconnectFn();
97
+ this.sandbox = await e2b.Sandbox.connect(info.sandboxId, {
98
+ domain: info.domain,
99
+ apiUrl: info.apiUrl,
100
+ requestTimeoutMs: info.requestTimeoutMs,
101
+ debug: info.debug,
102
+ headers: info.headers
103
+ });
104
+ this.reconnectSubscribers.forEach((cb) => cb(true));
105
+ this.reconnectSubscribers = [];
106
+ } catch (error) {
107
+ this.reconnectSubscribers.forEach((cb) => cb(false));
108
+ this.reconnectSubscribers = [];
109
+ throw error;
110
+ } finally {
111
+ this.isReconnecting = false;
112
+ }
113
+ }
114
+ /**
115
+ * Execute an operation. If reconnectFn is set and an auth error occurs,
116
+ * reconnect and retry once.
117
+ */
118
+ async exec(operation) {
119
+ try {
120
+ return await operation(this.sandbox.files);
121
+ } catch (error) {
122
+ if (this.reconnectFn && this.isAuthError(error) && this.canAttemptReconnect()) {
123
+ await this.reconnect();
124
+ return operation(this.sandbox.files);
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ read(path, opts) {
130
+ return this.exec((f) => f.read(path, opts));
131
+ }
132
+ write(pathOrFiles, dataOrOpts, opts) {
133
+ return this.exec((f) => {
134
+ if (Array.isArray(pathOrFiles)) return f.write(pathOrFiles, dataOrOpts);
135
+ return f.write(pathOrFiles, dataOrOpts, opts);
136
+ });
137
+ }
138
+ async list(path, opts) {
139
+ return this.exec((f) => f.list(path, opts));
140
+ }
141
+ async exists(path, opts) {
142
+ return this.exec((f) => f.exists(path, opts));
143
+ }
144
+ async makeDir(path, opts) {
145
+ return this.exec((f) => f.makeDir(path, opts));
146
+ }
147
+ async remove(path, opts) {
148
+ return this.exec((f) => f.remove(path, opts));
149
+ }
150
+ async rename(oldPath, newPath, opts) {
151
+ return this.exec((f) => f.rename(oldPath, newPath, opts));
152
+ }
153
+ async getInfo(path, opts) {
154
+ return this.exec((f) => f.getInfo(path, opts));
155
+ }
156
+ async watchDir(path, onEvent, opts) {
157
+ return this.exec((f) => f.watchDir(path, onEvent, opts));
158
+ }
159
+ };
160
+
161
+ //#endregion
162
+ Object.defineProperty(exports, 'E2BFilesystem', {
163
+ enumerable: true,
164
+ get: function () {
165
+ return E2BFilesystem;
166
+ }
167
+ });
168
+ //# sourceMappingURL=e2b-filesystem-4-LU6-jg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2b-filesystem-4-LU6-jg.cjs","names":["Sandbox"],"sources":["../../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts"],"sourcesContent":["/**\n * E2B Filesystem Implementation\n *\n * Provides FilesResource implementation using E2B Sandbox SDK.\n * Supports optional auto-reconnect on auth failure (401/403).\n *\n * @see https://e2b.dev/docs/filesystem/read-write\n * @see https://e2b.dev/docs/filesystem/watch\n */\n\nimport { Sandbox } from 'e2b';\n\nimport type {\n E2BSandboxConnectionInfo,\n EntryInfo,\n FilesResource,\n FilesystemEvent,\n FilesystemListOpts,\n FilesystemRequestOpts,\n WatchHandle,\n WatchOpts,\n WriteEntry,\n WriteInfo\n} from '../../types.js';\n\n/**\n * Callback to fetch fresh sandbox connection info from backend.\n * Called when an operation fails with 401/403.\n */\nexport type ReconnectFn = () => Promise<E2BSandboxConnectionInfo>;\n\n/**\n * E2B Filesystem\n *\n * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.\n * When `reconnectFn` is provided, automatically reconnects on auth errors.\n *\n * @example\n * ```typescript\n * // Basic usage (no auto-reconnect)\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n *\n * // With auto-reconnect on token expiry\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n * fs.setReconnectFn(async () => fetchFreshConnectionInfo());\n * ```\n */\nexport class E2BFilesystem implements FilesResource {\n private sandbox: Sandbox;\n private reconnectFn?: ReconnectFn;\n\n /** Whether a reconnect is currently in-flight */\n private isReconnecting = false;\n /** Callers waiting for the in-flight reconnect to complete */\n private reconnectSubscribers: Array<(success: boolean) => void> = [];\n /** Timestamp of last reconnect attempt (anti-loop: min 10s between attempts) */\n private lastReconnectAt = 0;\n\n private static readonly MIN_RECONNECT_INTERVAL_MS = 10 * 1000;\n\n constructor(sandbox: Sandbox) {\n this.sandbox = sandbox;\n }\n\n /**\n * Connect to an E2B Sandbox and create filesystem instance\n */\n static async connect(info: E2BSandboxConnectionInfo): Promise<E2BFilesystem> {\n const sandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n return new E2BFilesystem(sandbox);\n }\n\n /**\n * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.\n */\n setReconnectFn(fn: ReconnectFn): void {\n this.reconnectFn = fn;\n }\n\n /**\n * Get the underlying E2B Sandbox instance\n */\n getSandbox(): Sandbox {\n return this.sandbox;\n }\n\n // ============================================\n // Auto-Reconnect\n // ============================================\n\n private isAuthError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const err = error as Record<string, unknown>;\n\n if (err.status === 401 || err.status === 403) {\n return true;\n }\n if (err.statusCode === 401 || err.statusCode === 403) {\n return true;\n }\n\n if (err.response && typeof err.response === 'object') {\n const resp = err.response as Record<string, unknown>;\n if (resp.status === 401 || resp.status === 403) {\n return true;\n }\n }\n\n // e2b SDK throws AuthenticationError with \"Unauthorized\" message\n if (typeof err.message === 'string') {\n const msg = err.message.toLowerCase();\n if (msg.includes('unauthorized') || msg.includes('token expired') || msg.includes('authentication')) {\n return true;\n }\n }\n\n return false;\n }\n\n private canAttemptReconnect(): boolean {\n return (Date.now() - this.lastReconnectAt) >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;\n }\n\n /**\n * Reconnect with fresh credentials.\n * Only one reconnect in-flight at a time; concurrent callers share the result.\n */\n private async reconnect(): Promise<void> {\n if (this.isReconnecting) {\n return new Promise<void>((resolve, reject) => {\n this.reconnectSubscribers.push((success: boolean) => {\n if (success) {\n resolve();\n } else {\n reject(new Error('E2B sandbox reconnect failed'));\n }\n });\n });\n }\n\n this.isReconnecting = true;\n this.lastReconnectAt = Date.now();\n\n try {\n const info = await this.reconnectFn!();\n const newSandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n this.sandbox = newSandbox;\n\n this.reconnectSubscribers.forEach(cb => cb(true));\n this.reconnectSubscribers = [];\n } catch (error) {\n this.reconnectSubscribers.forEach(cb => cb(false));\n this.reconnectSubscribers = [];\n throw error;\n } finally {\n this.isReconnecting = false;\n }\n }\n\n /**\n * Execute an operation. If reconnectFn is set and an auth error occurs,\n * reconnect and retry once.\n */\n private async exec<T>(operation: (files: Sandbox['files']) => Promise<T>): Promise<T> {\n try {\n return await operation(this.sandbox.files);\n } catch (error) {\n if (this.reconnectFn && this.isAuthError(error) && this.canAttemptReconnect()) {\n await this.reconnect();\n return operation(this.sandbox.files);\n }\n throw error;\n }\n }\n\n // ============================================\n // FilesResource Implementation\n // ============================================\n\n read(path: string, opts?: FilesystemRequestOpts & { format?: 'text' }): Promise<string>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'bytes' }): Promise<Uint8Array>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'blob' }): Promise<Blob>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'stream' }): Promise<ReadableStream<Uint8Array>>;\n read(path: string, opts?: FilesystemRequestOpts & { format?: string }): Promise<string | Uint8Array | Blob | ReadableStream<Uint8Array>> {\n return this.exec(f => f.read(path, opts as any));\n }\n\n write(path: string, data: string | ArrayBuffer | Blob | ReadableStream, opts?: FilesystemRequestOpts): Promise<WriteInfo>;\n write(files: WriteEntry[], opts?: FilesystemRequestOpts): Promise<WriteInfo[]>;\n write(\n pathOrFiles: string | WriteEntry[],\n dataOrOpts?: string | ArrayBuffer | Blob | ReadableStream | FilesystemRequestOpts,\n opts?: FilesystemRequestOpts,\n ): Promise<WriteInfo | WriteInfo[]> {\n // Cast needed: e2b SDK's WriteInfo.type is optional (`FileType | undefined`)\n // but our re-exported WriteInfo from types.ts may resolve to a different .d.ts copy.\n return this.exec<WriteInfo | WriteInfo[]>(f => {\n if (Array.isArray(pathOrFiles)) {\n return f.write(pathOrFiles, dataOrOpts as FilesystemRequestOpts) as Promise<WriteInfo[]>;\n }\n return f.write(pathOrFiles, dataOrOpts as string | ArrayBuffer | Blob | ReadableStream, opts) as Promise<WriteInfo>;\n });\n }\n\n async list(path: string, opts?: FilesystemListOpts): Promise<EntryInfo[]> {\n return this.exec(f => f.list(path, opts) as Promise<EntryInfo[]>);\n }\n\n async exists(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.exists(path, opts));\n }\n\n async makeDir(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.makeDir(path, opts));\n }\n\n async remove(path: string, opts?: FilesystemRequestOpts): Promise<void> {\n return this.exec(f => f.remove(path, opts));\n }\n\n async rename(oldPath: string, newPath: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.rename(oldPath, newPath, opts) as Promise<EntryInfo>);\n }\n\n async getInfo(path: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.getInfo(path, opts) as Promise<EntryInfo>);\n }\n\n async watchDir(\n path: string,\n onEvent: (event: FilesystemEvent) => void | Promise<void>,\n opts?: WatchOpts & { onExit?: (err?: Error) => void | Promise<void> }\n ): Promise<WatchHandle> {\n return this.exec(f => f.watchDir(path, onEvent as any, opts) as Promise<WatchHandle>);\n }\n}\n\nexport default E2BFilesystem;\n"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { Sandbox } from "e2b";
2
+
3
+ //#region ../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts
4
+ /**
5
+ * E2B Filesystem Implementation
6
+ *
7
+ * Provides FilesResource implementation using E2B Sandbox SDK.
8
+ * Supports optional auto-reconnect on auth failure (401/403).
9
+ *
10
+ * @see https://e2b.dev/docs/filesystem/read-write
11
+ * @see https://e2b.dev/docs/filesystem/watch
12
+ */
13
+ /**
14
+ * E2B Filesystem
15
+ *
16
+ * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.
17
+ * When `reconnectFn` is provided, automatically reconnects on auth errors.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Basic usage (no auto-reconnect)
22
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
23
+ *
24
+ * // With auto-reconnect on token expiry
25
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
26
+ * fs.setReconnectFn(async () => fetchFreshConnectionInfo());
27
+ * ```
28
+ */
29
+ var E2BFilesystem = class E2BFilesystem {
30
+ static {
31
+ this.MIN_RECONNECT_INTERVAL_MS = 10 * 1e3;
32
+ }
33
+ constructor(sandbox) {
34
+ this.isReconnecting = false;
35
+ this.reconnectSubscribers = [];
36
+ this.lastReconnectAt = 0;
37
+ this.sandbox = sandbox;
38
+ }
39
+ /**
40
+ * Connect to an E2B Sandbox and create filesystem instance
41
+ */
42
+ static async connect(info) {
43
+ return new E2BFilesystem(await Sandbox.connect(info.sandboxId, {
44
+ domain: info.domain,
45
+ apiUrl: info.apiUrl,
46
+ requestTimeoutMs: info.requestTimeoutMs,
47
+ debug: info.debug,
48
+ headers: info.headers
49
+ }));
50
+ }
51
+ /**
52
+ * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.
53
+ */
54
+ setReconnectFn(fn) {
55
+ this.reconnectFn = fn;
56
+ }
57
+ /**
58
+ * Get the underlying E2B Sandbox instance
59
+ */
60
+ getSandbox() {
61
+ return this.sandbox;
62
+ }
63
+ isAuthError(error) {
64
+ if (!error || typeof error !== "object") return false;
65
+ const err = error;
66
+ if (err.status === 401 || err.status === 403) return true;
67
+ if (err.statusCode === 401 || err.statusCode === 403) return true;
68
+ if (err.response && typeof err.response === "object") {
69
+ const resp = err.response;
70
+ if (resp.status === 401 || resp.status === 403) return true;
71
+ }
72
+ if (typeof err.message === "string") {
73
+ const msg = err.message.toLowerCase();
74
+ if (msg.includes("unauthorized") || msg.includes("token expired") || msg.includes("authentication")) return true;
75
+ }
76
+ return false;
77
+ }
78
+ canAttemptReconnect() {
79
+ return Date.now() - this.lastReconnectAt >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;
80
+ }
81
+ /**
82
+ * Reconnect with fresh credentials.
83
+ * Only one reconnect in-flight at a time; concurrent callers share the result.
84
+ */
85
+ async reconnect() {
86
+ if (this.isReconnecting) return new Promise((resolve, reject) => {
87
+ this.reconnectSubscribers.push((success) => {
88
+ if (success) resolve();
89
+ else reject(/* @__PURE__ */ new Error("E2B sandbox reconnect failed"));
90
+ });
91
+ });
92
+ this.isReconnecting = true;
93
+ this.lastReconnectAt = Date.now();
94
+ try {
95
+ const info = await this.reconnectFn();
96
+ this.sandbox = await Sandbox.connect(info.sandboxId, {
97
+ domain: info.domain,
98
+ apiUrl: info.apiUrl,
99
+ requestTimeoutMs: info.requestTimeoutMs,
100
+ debug: info.debug,
101
+ headers: info.headers
102
+ });
103
+ this.reconnectSubscribers.forEach((cb) => cb(true));
104
+ this.reconnectSubscribers = [];
105
+ } catch (error) {
106
+ this.reconnectSubscribers.forEach((cb) => cb(false));
107
+ this.reconnectSubscribers = [];
108
+ throw error;
109
+ } finally {
110
+ this.isReconnecting = false;
111
+ }
112
+ }
113
+ /**
114
+ * Execute an operation. If reconnectFn is set and an auth error occurs,
115
+ * reconnect and retry once.
116
+ */
117
+ async exec(operation) {
118
+ try {
119
+ return await operation(this.sandbox.files);
120
+ } catch (error) {
121
+ if (this.reconnectFn && this.isAuthError(error) && this.canAttemptReconnect()) {
122
+ await this.reconnect();
123
+ return operation(this.sandbox.files);
124
+ }
125
+ throw error;
126
+ }
127
+ }
128
+ read(path, opts) {
129
+ return this.exec((f) => f.read(path, opts));
130
+ }
131
+ write(pathOrFiles, dataOrOpts, opts) {
132
+ return this.exec((f) => {
133
+ if (Array.isArray(pathOrFiles)) return f.write(pathOrFiles, dataOrOpts);
134
+ return f.write(pathOrFiles, dataOrOpts, opts);
135
+ });
136
+ }
137
+ async list(path, opts) {
138
+ return this.exec((f) => f.list(path, opts));
139
+ }
140
+ async exists(path, opts) {
141
+ return this.exec((f) => f.exists(path, opts));
142
+ }
143
+ async makeDir(path, opts) {
144
+ return this.exec((f) => f.makeDir(path, opts));
145
+ }
146
+ async remove(path, opts) {
147
+ return this.exec((f) => f.remove(path, opts));
148
+ }
149
+ async rename(oldPath, newPath, opts) {
150
+ return this.exec((f) => f.rename(oldPath, newPath, opts));
151
+ }
152
+ async getInfo(path, opts) {
153
+ return this.exec((f) => f.getInfo(path, opts));
154
+ }
155
+ async watchDir(path, onEvent, opts) {
156
+ return this.exec((f) => f.watchDir(path, onEvent, opts));
157
+ }
158
+ };
159
+
160
+ //#endregion
161
+ export { E2BFilesystem as t };
162
+ //# sourceMappingURL=e2b-filesystem-BNmEfpoW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2b-filesystem-BNmEfpoW.mjs","names":[],"sources":["../../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts"],"sourcesContent":["/**\n * E2B Filesystem Implementation\n *\n * Provides FilesResource implementation using E2B Sandbox SDK.\n * Supports optional auto-reconnect on auth failure (401/403).\n *\n * @see https://e2b.dev/docs/filesystem/read-write\n * @see https://e2b.dev/docs/filesystem/watch\n */\n\nimport { Sandbox } from 'e2b';\n\nimport type {\n E2BSandboxConnectionInfo,\n EntryInfo,\n FilesResource,\n FilesystemEvent,\n FilesystemListOpts,\n FilesystemRequestOpts,\n WatchHandle,\n WatchOpts,\n WriteEntry,\n WriteInfo\n} from '../../types.js';\n\n/**\n * Callback to fetch fresh sandbox connection info from backend.\n * Called when an operation fails with 401/403.\n */\nexport type ReconnectFn = () => Promise<E2BSandboxConnectionInfo>;\n\n/**\n * E2B Filesystem\n *\n * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.\n * When `reconnectFn` is provided, automatically reconnects on auth errors.\n *\n * @example\n * ```typescript\n * // Basic usage (no auto-reconnect)\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n *\n * // With auto-reconnect on token expiry\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n * fs.setReconnectFn(async () => fetchFreshConnectionInfo());\n * ```\n */\nexport class E2BFilesystem implements FilesResource {\n private sandbox: Sandbox;\n private reconnectFn?: ReconnectFn;\n\n /** Whether a reconnect is currently in-flight */\n private isReconnecting = false;\n /** Callers waiting for the in-flight reconnect to complete */\n private reconnectSubscribers: Array<(success: boolean) => void> = [];\n /** Timestamp of last reconnect attempt (anti-loop: min 10s between attempts) */\n private lastReconnectAt = 0;\n\n private static readonly MIN_RECONNECT_INTERVAL_MS = 10 * 1000;\n\n constructor(sandbox: Sandbox) {\n this.sandbox = sandbox;\n }\n\n /**\n * Connect to an E2B Sandbox and create filesystem instance\n */\n static async connect(info: E2BSandboxConnectionInfo): Promise<E2BFilesystem> {\n const sandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n return new E2BFilesystem(sandbox);\n }\n\n /**\n * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.\n */\n setReconnectFn(fn: ReconnectFn): void {\n this.reconnectFn = fn;\n }\n\n /**\n * Get the underlying E2B Sandbox instance\n */\n getSandbox(): Sandbox {\n return this.sandbox;\n }\n\n // ============================================\n // Auto-Reconnect\n // ============================================\n\n private isAuthError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const err = error as Record<string, unknown>;\n\n if (err.status === 401 || err.status === 403) {\n return true;\n }\n if (err.statusCode === 401 || err.statusCode === 403) {\n return true;\n }\n\n if (err.response && typeof err.response === 'object') {\n const resp = err.response as Record<string, unknown>;\n if (resp.status === 401 || resp.status === 403) {\n return true;\n }\n }\n\n // e2b SDK throws AuthenticationError with \"Unauthorized\" message\n if (typeof err.message === 'string') {\n const msg = err.message.toLowerCase();\n if (msg.includes('unauthorized') || msg.includes('token expired') || msg.includes('authentication')) {\n return true;\n }\n }\n\n return false;\n }\n\n private canAttemptReconnect(): boolean {\n return (Date.now() - this.lastReconnectAt) >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;\n }\n\n /**\n * Reconnect with fresh credentials.\n * Only one reconnect in-flight at a time; concurrent callers share the result.\n */\n private async reconnect(): Promise<void> {\n if (this.isReconnecting) {\n return new Promise<void>((resolve, reject) => {\n this.reconnectSubscribers.push((success: boolean) => {\n if (success) {\n resolve();\n } else {\n reject(new Error('E2B sandbox reconnect failed'));\n }\n });\n });\n }\n\n this.isReconnecting = true;\n this.lastReconnectAt = Date.now();\n\n try {\n const info = await this.reconnectFn!();\n const newSandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n this.sandbox = newSandbox;\n\n this.reconnectSubscribers.forEach(cb => cb(true));\n this.reconnectSubscribers = [];\n } catch (error) {\n this.reconnectSubscribers.forEach(cb => cb(false));\n this.reconnectSubscribers = [];\n throw error;\n } finally {\n this.isReconnecting = false;\n }\n }\n\n /**\n * Execute an operation. If reconnectFn is set and an auth error occurs,\n * reconnect and retry once.\n */\n private async exec<T>(operation: (files: Sandbox['files']) => Promise<T>): Promise<T> {\n try {\n return await operation(this.sandbox.files);\n } catch (error) {\n if (this.reconnectFn && this.isAuthError(error) && this.canAttemptReconnect()) {\n await this.reconnect();\n return operation(this.sandbox.files);\n }\n throw error;\n }\n }\n\n // ============================================\n // FilesResource Implementation\n // ============================================\n\n read(path: string, opts?: FilesystemRequestOpts & { format?: 'text' }): Promise<string>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'bytes' }): Promise<Uint8Array>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'blob' }): Promise<Blob>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'stream' }): Promise<ReadableStream<Uint8Array>>;\n read(path: string, opts?: FilesystemRequestOpts & { format?: string }): Promise<string | Uint8Array | Blob | ReadableStream<Uint8Array>> {\n return this.exec(f => f.read(path, opts as any));\n }\n\n write(path: string, data: string | ArrayBuffer | Blob | ReadableStream, opts?: FilesystemRequestOpts): Promise<WriteInfo>;\n write(files: WriteEntry[], opts?: FilesystemRequestOpts): Promise<WriteInfo[]>;\n write(\n pathOrFiles: string | WriteEntry[],\n dataOrOpts?: string | ArrayBuffer | Blob | ReadableStream | FilesystemRequestOpts,\n opts?: FilesystemRequestOpts,\n ): Promise<WriteInfo | WriteInfo[]> {\n // Cast needed: e2b SDK's WriteInfo.type is optional (`FileType | undefined`)\n // but our re-exported WriteInfo from types.ts may resolve to a different .d.ts copy.\n return this.exec<WriteInfo | WriteInfo[]>(f => {\n if (Array.isArray(pathOrFiles)) {\n return f.write(pathOrFiles, dataOrOpts as FilesystemRequestOpts) as Promise<WriteInfo[]>;\n }\n return f.write(pathOrFiles, dataOrOpts as string | ArrayBuffer | Blob | ReadableStream, opts) as Promise<WriteInfo>;\n });\n }\n\n async list(path: string, opts?: FilesystemListOpts): Promise<EntryInfo[]> {\n return this.exec(f => f.list(path, opts) as Promise<EntryInfo[]>);\n }\n\n async exists(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.exists(path, opts));\n }\n\n async makeDir(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.makeDir(path, opts));\n }\n\n async remove(path: string, opts?: FilesystemRequestOpts): Promise<void> {\n return this.exec(f => f.remove(path, opts));\n }\n\n async rename(oldPath: string, newPath: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.rename(oldPath, newPath, opts) as Promise<EntryInfo>);\n }\n\n async getInfo(path: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.getInfo(path, opts) as Promise<EntryInfo>);\n }\n\n async watchDir(\n path: string,\n onEvent: (event: FilesystemEvent) => void | Promise<void>,\n opts?: WatchOpts & { onExit?: (err?: Error) => void | Promise<void> }\n ): Promise<WatchHandle> {\n return this.exec(f => f.watchDir(path, onEvent as any, opts) as Promise<WatchHandle>);\n }\n}\n\nexport default E2BFilesystem;\n"],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+
2
+ //#region \0@oxc-project+runtime@0.110.0/helpers/asyncToGenerator.js
3
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
4
+ try {
5
+ var i = n[a](c), u = i.value;
6
+ } catch (n) {
7
+ e(n);
8
+ return;
9
+ }
10
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
11
+ }
12
+ function _asyncToGenerator(n) {
13
+ return function() {
14
+ var t = this, e = arguments;
15
+ return new Promise(function(r, o) {
16
+ var a = n.apply(t, e);
17
+ function _next(n) {
18
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
19
+ }
20
+ function _throw(n) {
21
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
22
+ }
23
+ _next(void 0);
24
+ });
25
+ };
26
+ }
27
+
28
+ //#endregion
29
+ //#region src/legacy/e2b-shim.ts
30
+ /**
31
+ * E2B Shim for Legacy Build
32
+ *
33
+ * 空壳模块,用于替代 legacy 构建中的 e2b npm 包。
34
+ * 防止 bundler 在打包时因为 resolve 不到 'e2b' 模块而失败,
35
+ * 同时确保运行时不会真正依赖 e2b 包。
36
+ *
37
+ * 如果代码执行到 Sandbox.connect(),会抛出明确的错误信息。
38
+ */
39
+ var Sandbox = class {
40
+ static connect(_opts) {
41
+ return _asyncToGenerator(function* () {
42
+ throw new Error("[cloud-agent-sdk/legacy] Sandbox.connect() is not available in miniprogram environment. Use createLegacyCloudAgentProvider() which automatically uses MiniProgramE2BFilesystem, or pass filesystemFactory option to CloudAgentProvider.");
43
+ })();
44
+ }
45
+ };
46
+
47
+ //#endregion
48
+ //#region ../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts
49
+ /**
50
+ * E2B Filesystem Implementation
51
+ *
52
+ * Provides FilesResource implementation using E2B Sandbox SDK.
53
+ * Supports optional auto-reconnect on auth failure (401/403).
54
+ *
55
+ * @see https://e2b.dev/docs/filesystem/read-write
56
+ * @see https://e2b.dev/docs/filesystem/watch
57
+ */
58
+ /**
59
+ * E2B Filesystem
60
+ *
61
+ * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.
62
+ * When `reconnectFn` is provided, automatically reconnects on auth errors.
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * // Basic usage (no auto-reconnect)
67
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
68
+ *
69
+ * // With auto-reconnect on token expiry
70
+ * const fs = await E2BFilesystem.connect({ sandboxId: '...' });
71
+ * fs.setReconnectFn(async () => fetchFreshConnectionInfo());
72
+ * ```
73
+ */
74
+ var E2BFilesystem = class E2BFilesystem {
75
+ constructor(sandbox) {
76
+ this.isReconnecting = false;
77
+ this.reconnectSubscribers = [];
78
+ this.lastReconnectAt = 0;
79
+ this.sandbox = sandbox;
80
+ }
81
+ /**
82
+ * Connect to an E2B Sandbox and create filesystem instance
83
+ */
84
+ static connect(info) {
85
+ return _asyncToGenerator(function* () {
86
+ return new E2BFilesystem(yield Sandbox.connect(info.sandboxId, {
87
+ domain: info.domain,
88
+ apiUrl: info.apiUrl,
89
+ requestTimeoutMs: info.requestTimeoutMs,
90
+ debug: info.debug,
91
+ headers: info.headers
92
+ }));
93
+ })();
94
+ }
95
+ /**
96
+ * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.
97
+ */
98
+ setReconnectFn(fn) {
99
+ this.reconnectFn = fn;
100
+ }
101
+ /**
102
+ * Get the underlying E2B Sandbox instance
103
+ */
104
+ getSandbox() {
105
+ return this.sandbox;
106
+ }
107
+ isAuthError(error) {
108
+ if (!error || typeof error !== "object") return false;
109
+ const err = error;
110
+ if (err.status === 401 || err.status === 403) return true;
111
+ if (err.statusCode === 401 || err.statusCode === 403) return true;
112
+ if (err.response && typeof err.response === "object") {
113
+ const resp = err.response;
114
+ if (resp.status === 401 || resp.status === 403) return true;
115
+ }
116
+ if (typeof err.message === "string") {
117
+ const msg = err.message.toLowerCase();
118
+ if (msg.includes("unauthorized") || msg.includes("token expired") || msg.includes("authentication")) return true;
119
+ }
120
+ return false;
121
+ }
122
+ canAttemptReconnect() {
123
+ return Date.now() - this.lastReconnectAt >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;
124
+ }
125
+ /**
126
+ * Reconnect with fresh credentials.
127
+ * Only one reconnect in-flight at a time; concurrent callers share the result.
128
+ */
129
+ reconnect() {
130
+ var _this = this;
131
+ return _asyncToGenerator(function* () {
132
+ if (_this.isReconnecting) return new Promise((resolve, reject) => {
133
+ _this.reconnectSubscribers.push((success) => {
134
+ if (success) resolve();
135
+ else reject(/* @__PURE__ */ new Error("E2B sandbox reconnect failed"));
136
+ });
137
+ });
138
+ _this.isReconnecting = true;
139
+ _this.lastReconnectAt = Date.now();
140
+ try {
141
+ const info = yield _this.reconnectFn();
142
+ _this.sandbox = yield Sandbox.connect(info.sandboxId, {
143
+ domain: info.domain,
144
+ apiUrl: info.apiUrl,
145
+ requestTimeoutMs: info.requestTimeoutMs,
146
+ debug: info.debug,
147
+ headers: info.headers
148
+ });
149
+ _this.reconnectSubscribers.forEach((cb) => cb(true));
150
+ _this.reconnectSubscribers = [];
151
+ } catch (error) {
152
+ _this.reconnectSubscribers.forEach((cb) => cb(false));
153
+ _this.reconnectSubscribers = [];
154
+ throw error;
155
+ } finally {
156
+ _this.isReconnecting = false;
157
+ }
158
+ })();
159
+ }
160
+ /**
161
+ * Execute an operation. If reconnectFn is set and an auth error occurs,
162
+ * reconnect and retry once.
163
+ */
164
+ exec(operation) {
165
+ var _this2 = this;
166
+ return _asyncToGenerator(function* () {
167
+ try {
168
+ return yield operation(_this2.sandbox.files);
169
+ } catch (error) {
170
+ if (_this2.reconnectFn && _this2.isAuthError(error) && _this2.canAttemptReconnect()) {
171
+ yield _this2.reconnect();
172
+ return operation(_this2.sandbox.files);
173
+ }
174
+ throw error;
175
+ }
176
+ })();
177
+ }
178
+ read(path, opts) {
179
+ return this.exec((f) => f.read(path, opts));
180
+ }
181
+ write(pathOrFiles, dataOrOpts, opts) {
182
+ return this.exec((f) => {
183
+ if (Array.isArray(pathOrFiles)) return f.write(pathOrFiles, dataOrOpts);
184
+ return f.write(pathOrFiles, dataOrOpts, opts);
185
+ });
186
+ }
187
+ list(path, opts) {
188
+ var _this3 = this;
189
+ return _asyncToGenerator(function* () {
190
+ return _this3.exec((f) => f.list(path, opts));
191
+ })();
192
+ }
193
+ exists(path, opts) {
194
+ var _this4 = this;
195
+ return _asyncToGenerator(function* () {
196
+ return _this4.exec((f) => f.exists(path, opts));
197
+ })();
198
+ }
199
+ makeDir(path, opts) {
200
+ var _this5 = this;
201
+ return _asyncToGenerator(function* () {
202
+ return _this5.exec((f) => f.makeDir(path, opts));
203
+ })();
204
+ }
205
+ remove(path, opts) {
206
+ var _this6 = this;
207
+ return _asyncToGenerator(function* () {
208
+ return _this6.exec((f) => f.remove(path, opts));
209
+ })();
210
+ }
211
+ rename(oldPath, newPath, opts) {
212
+ var _this7 = this;
213
+ return _asyncToGenerator(function* () {
214
+ return _this7.exec((f) => f.rename(oldPath, newPath, opts));
215
+ })();
216
+ }
217
+ getInfo(path, opts) {
218
+ var _this8 = this;
219
+ return _asyncToGenerator(function* () {
220
+ return _this8.exec((f) => f.getInfo(path, opts));
221
+ })();
222
+ }
223
+ watchDir(path, onEvent, opts) {
224
+ var _this9 = this;
225
+ return _asyncToGenerator(function* () {
226
+ return _this9.exec((f) => f.watchDir(path, onEvent, opts));
227
+ })();
228
+ }
229
+ };
230
+ E2BFilesystem.MIN_RECONNECT_INTERVAL_MS = 10 * 1e3;
231
+ var e2b_filesystem_default = E2BFilesystem;
232
+
233
+ //#endregion
234
+ Object.defineProperty(exports, 'E2BFilesystem', {
235
+ enumerable: true,
236
+ get: function () {
237
+ return E2BFilesystem;
238
+ }
239
+ });
240
+ Object.defineProperty(exports, '_asyncToGenerator', {
241
+ enumerable: true,
242
+ get: function () {
243
+ return _asyncToGenerator;
244
+ }
245
+ });
246
+ Object.defineProperty(exports, 'e2b_filesystem_default', {
247
+ enumerable: true,
248
+ get: function () {
249
+ return e2b_filesystem_default;
250
+ }
251
+ });
252
+ //# sourceMappingURL=e2b-filesystem-B_WoA22S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2b-filesystem-B_WoA22S.cjs","names":["this"],"sources":["../src/legacy/e2b-shim.ts","../../agent-provider/src/common/providers/cloud-agent-provider/e2b-filesystem.ts"],"sourcesContent":["/**\n * E2B Shim for Legacy Build\n *\n * 空壳模块,用于替代 legacy 构建中的 e2b npm 包。\n * 防止 bundler 在打包时因为 resolve 不到 'e2b' 模块而失败,\n * 同时确保运行时不会真正依赖 e2b 包。\n *\n * 如果代码执行到 Sandbox.connect(),会抛出明确的错误信息。\n */\n\nexport class Sandbox {\n static async connect(_opts: unknown): Promise<never> {\n throw new Error(\n '[cloud-agent-sdk/legacy] Sandbox.connect() is not available in miniprogram environment. ' +\n 'Use createLegacyCloudAgentProvider() which automatically uses MiniProgramE2BFilesystem, ' +\n 'or pass filesystemFactory option to CloudAgentProvider.'\n );\n }\n}\n","/**\n * E2B Filesystem Implementation\n *\n * Provides FilesResource implementation using E2B Sandbox SDK.\n * Supports optional auto-reconnect on auth failure (401/403).\n *\n * @see https://e2b.dev/docs/filesystem/read-write\n * @see https://e2b.dev/docs/filesystem/watch\n */\n\nimport { Sandbox } from 'e2b';\n\nimport type {\n E2BSandboxConnectionInfo,\n EntryInfo,\n FilesResource,\n FilesystemEvent,\n FilesystemListOpts,\n FilesystemRequestOpts,\n WatchHandle,\n WatchOpts,\n WriteEntry,\n WriteInfo\n} from '../../types.js';\n\n/**\n * Callback to fetch fresh sandbox connection info from backend.\n * Called when an operation fails with 401/403.\n */\nexport type ReconnectFn = () => Promise<E2BSandboxConnectionInfo>;\n\n/**\n * E2B Filesystem\n *\n * Wraps E2B Sandbox SDK's filesystem operations to implement FilesResource.\n * When `reconnectFn` is provided, automatically reconnects on auth errors.\n *\n * @example\n * ```typescript\n * // Basic usage (no auto-reconnect)\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n *\n * // With auto-reconnect on token expiry\n * const fs = await E2BFilesystem.connect({ sandboxId: '...' });\n * fs.setReconnectFn(async () => fetchFreshConnectionInfo());\n * ```\n */\nexport class E2BFilesystem implements FilesResource {\n private sandbox: Sandbox;\n private reconnectFn?: ReconnectFn;\n\n /** Whether a reconnect is currently in-flight */\n private isReconnecting = false;\n /** Callers waiting for the in-flight reconnect to complete */\n private reconnectSubscribers: Array<(success: boolean) => void> = [];\n /** Timestamp of last reconnect attempt (anti-loop: min 10s between attempts) */\n private lastReconnectAt = 0;\n\n private static readonly MIN_RECONNECT_INTERVAL_MS = 10 * 1000;\n\n constructor(sandbox: Sandbox) {\n this.sandbox = sandbox;\n }\n\n /**\n * Connect to an E2B Sandbox and create filesystem instance\n */\n static async connect(info: E2BSandboxConnectionInfo): Promise<E2BFilesystem> {\n const sandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n return new E2BFilesystem(sandbox);\n }\n\n /**\n * Set reconnect callback. When set, auth errors trigger automatic reconnect + retry.\n */\n setReconnectFn(fn: ReconnectFn): void {\n this.reconnectFn = fn;\n }\n\n /**\n * Get the underlying E2B Sandbox instance\n */\n getSandbox(): Sandbox {\n return this.sandbox;\n }\n\n // ============================================\n // Auto-Reconnect\n // ============================================\n\n private isAuthError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const err = error as Record<string, unknown>;\n\n if (err.status === 401 || err.status === 403) {\n return true;\n }\n if (err.statusCode === 401 || err.statusCode === 403) {\n return true;\n }\n\n if (err.response && typeof err.response === 'object') {\n const resp = err.response as Record<string, unknown>;\n if (resp.status === 401 || resp.status === 403) {\n return true;\n }\n }\n\n // e2b SDK throws AuthenticationError with \"Unauthorized\" message\n if (typeof err.message === 'string') {\n const msg = err.message.toLowerCase();\n if (msg.includes('unauthorized') || msg.includes('token expired') || msg.includes('authentication')) {\n return true;\n }\n }\n\n return false;\n }\n\n private canAttemptReconnect(): boolean {\n return (Date.now() - this.lastReconnectAt) >= E2BFilesystem.MIN_RECONNECT_INTERVAL_MS;\n }\n\n /**\n * Reconnect with fresh credentials.\n * Only one reconnect in-flight at a time; concurrent callers share the result.\n */\n private async reconnect(): Promise<void> {\n if (this.isReconnecting) {\n return new Promise<void>((resolve, reject) => {\n this.reconnectSubscribers.push((success: boolean) => {\n if (success) {\n resolve();\n } else {\n reject(new Error('E2B sandbox reconnect failed'));\n }\n });\n });\n }\n\n this.isReconnecting = true;\n this.lastReconnectAt = Date.now();\n\n try {\n const info = await this.reconnectFn!();\n const newSandbox = await Sandbox.connect(info.sandboxId, {\n domain: info.domain,\n apiUrl: info.apiUrl,\n requestTimeoutMs: info.requestTimeoutMs,\n debug: info.debug,\n headers: info.headers\n });\n this.sandbox = newSandbox;\n\n this.reconnectSubscribers.forEach(cb => cb(true));\n this.reconnectSubscribers = [];\n } catch (error) {\n this.reconnectSubscribers.forEach(cb => cb(false));\n this.reconnectSubscribers = [];\n throw error;\n } finally {\n this.isReconnecting = false;\n }\n }\n\n /**\n * Execute an operation. If reconnectFn is set and an auth error occurs,\n * reconnect and retry once.\n */\n private async exec<T>(operation: (files: Sandbox['files']) => Promise<T>): Promise<T> {\n try {\n return await operation(this.sandbox.files);\n } catch (error) {\n if (this.reconnectFn && this.isAuthError(error) && this.canAttemptReconnect()) {\n await this.reconnect();\n return operation(this.sandbox.files);\n }\n throw error;\n }\n }\n\n // ============================================\n // FilesResource Implementation\n // ============================================\n\n read(path: string, opts?: FilesystemRequestOpts & { format?: 'text' }): Promise<string>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'bytes' }): Promise<Uint8Array>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'blob' }): Promise<Blob>;\n read(path: string, opts: FilesystemRequestOpts & { format: 'stream' }): Promise<ReadableStream<Uint8Array>>;\n read(path: string, opts?: FilesystemRequestOpts & { format?: string }): Promise<string | Uint8Array | Blob | ReadableStream<Uint8Array>> {\n return this.exec(f => f.read(path, opts as any));\n }\n\n write(path: string, data: string | ArrayBuffer | Blob | ReadableStream, opts?: FilesystemRequestOpts): Promise<WriteInfo>;\n write(files: WriteEntry[], opts?: FilesystemRequestOpts): Promise<WriteInfo[]>;\n write(\n pathOrFiles: string | WriteEntry[],\n dataOrOpts?: string | ArrayBuffer | Blob | ReadableStream | FilesystemRequestOpts,\n opts?: FilesystemRequestOpts,\n ): Promise<WriteInfo | WriteInfo[]> {\n // Cast needed: e2b SDK's WriteInfo.type is optional (`FileType | undefined`)\n // but our re-exported WriteInfo from types.ts may resolve to a different .d.ts copy.\n return this.exec<WriteInfo | WriteInfo[]>(f => {\n if (Array.isArray(pathOrFiles)) {\n return f.write(pathOrFiles, dataOrOpts as FilesystemRequestOpts) as Promise<WriteInfo[]>;\n }\n return f.write(pathOrFiles, dataOrOpts as string | ArrayBuffer | Blob | ReadableStream, opts) as Promise<WriteInfo>;\n });\n }\n\n async list(path: string, opts?: FilesystemListOpts): Promise<EntryInfo[]> {\n return this.exec(f => f.list(path, opts) as Promise<EntryInfo[]>);\n }\n\n async exists(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.exists(path, opts));\n }\n\n async makeDir(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n return this.exec(f => f.makeDir(path, opts));\n }\n\n async remove(path: string, opts?: FilesystemRequestOpts): Promise<void> {\n return this.exec(f => f.remove(path, opts));\n }\n\n async rename(oldPath: string, newPath: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.rename(oldPath, newPath, opts) as Promise<EntryInfo>);\n }\n\n async getInfo(path: string, opts?: FilesystemRequestOpts): Promise<EntryInfo> {\n return this.exec(f => f.getInfo(path, opts) as Promise<EntryInfo>);\n }\n\n async watchDir(\n path: string,\n onEvent: (event: FilesystemEvent) => void | Promise<void>,\n opts?: WatchOpts & { onExit?: (err?: Error) => void | Promise<void> }\n ): Promise<WatchHandle> {\n return this.exec(f => f.watchDir(path, onEvent as any, opts) as Promise<WatchHandle>);\n }\n}\n\nexport default E2BFilesystem;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const require_e2b_filesystem = require('./e2b-filesystem-4-LU6-jg.cjs');
2
+
3
+ exports.E2BFilesystem = require_e2b_filesystem.E2BFilesystem;