xibecode 1.3.3 → 1.3.7

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 (56) hide show
  1. package/README.md +15 -0
  2. package/dist/commands/chat.d.ts.map +1 -1
  3. package/dist/commands/chat.js +40 -1
  4. package/dist/commands/chat.js.map +1 -1
  5. package/dist/commands/cloud-pull.d.ts +10 -0
  6. package/dist/commands/cloud-pull.d.ts.map +1 -0
  7. package/dist/commands/cloud-pull.js +79 -0
  8. package/dist/commands/cloud-pull.js.map +1 -0
  9. package/dist/commands/config.d.ts +7 -0
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +68 -0
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/run-pr.d.ts.map +1 -1
  14. package/dist/commands/run-pr.js +41 -0
  15. package/dist/commands/run-pr.js.map +1 -1
  16. package/dist/commands/run.d.ts.map +1 -1
  17. package/dist/commands/run.js +39 -0
  18. package/dist/commands/run.js.map +1 -1
  19. package/dist/commands/whats-new.d.ts +2 -0
  20. package/dist/commands/whats-new.d.ts.map +1 -0
  21. package/dist/commands/whats-new.js +33 -0
  22. package/dist/commands/whats-new.js.map +1 -0
  23. package/dist/index.js +72 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/ui/claude-style-chat.d.ts.map +1 -1
  26. package/dist/ui/claude-style-chat.js +202 -6
  27. package/dist/ui/claude-style-chat.js.map +1 -1
  28. package/dist/utils/cloud-gateway.d.ts +10 -0
  29. package/dist/utils/cloud-gateway.d.ts.map +1 -0
  30. package/dist/utils/cloud-gateway.js +99 -0
  31. package/dist/utils/cloud-gateway.js.map +1 -0
  32. package/dist/utils/cloud-runtime-hints.d.ts +8 -0
  33. package/dist/utils/cloud-runtime-hints.d.ts.map +1 -0
  34. package/dist/utils/cloud-runtime-hints.js +17 -0
  35. package/dist/utils/cloud-runtime-hints.js.map +1 -0
  36. package/dist/utils/cloud-sync-feedback.d.ts +6 -0
  37. package/dist/utils/cloud-sync-feedback.d.ts.map +1 -0
  38. package/dist/utils/cloud-sync-feedback.js +77 -0
  39. package/dist/utils/cloud-sync-feedback.js.map +1 -0
  40. package/dist/utils/config.d.ts +28 -0
  41. package/dist/utils/config.d.ts.map +1 -1
  42. package/dist/utils/config.js +79 -0
  43. package/dist/utils/config.js.map +1 -1
  44. package/dist/utils/npm-update-notice.d.ts +36 -0
  45. package/dist/utils/npm-update-notice.d.ts.map +1 -0
  46. package/dist/utils/npm-update-notice.js +132 -0
  47. package/dist/utils/npm-update-notice.js.map +1 -0
  48. package/dist/utils/remote-execution.d.ts +20 -0
  49. package/dist/utils/remote-execution.d.ts.map +1 -0
  50. package/dist/utils/remote-execution.js +339 -0
  51. package/dist/utils/remote-execution.js.map +1 -0
  52. package/dist/utils/sandbox-sync.d.ts +14 -0
  53. package/dist/utils/sandbox-sync.d.ts.map +1 -0
  54. package/dist/utils/sandbox-sync.js +206 -0
  55. package/dist/utils/sandbox-sync.js.map +1 -0
  56. package/package.json +2 -2
@@ -0,0 +1,339 @@
1
+ function createSessionId() {
2
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
3
+ }
4
+ export function resolveRemoteExecutionConfig(config, cwd) {
5
+ if (config.getSandboxMode() !== 'e2b')
6
+ return undefined;
7
+ const gatewayUrl = config.getSandboxGatewayUrl();
8
+ if (!gatewayUrl)
9
+ return undefined;
10
+ const strategy = config.getSandboxSessionStrategy();
11
+ const workspaceRoot = process.env.XIBECODE_SANDBOX_WORKSPACE_ROOT?.trim() ||
12
+ (strategy === 'sandbox_full' ? '/home/user/workspace' : undefined);
13
+ return {
14
+ gatewayUrl,
15
+ authToken: config.getSandboxAuthToken(),
16
+ strategy,
17
+ cwd,
18
+ workspaceRoot,
19
+ sessionId: process.env.XIBECODE_SANDBOX_SESSION_ID?.trim() || createSessionId(),
20
+ };
21
+ }
22
+ export function getRuntimeStatusLabel(config) {
23
+ return config.getSandboxMode() === 'e2b' ? 'cloud' : 'local';
24
+ }
25
+ /** Session + gateway wiring for core CodingToolExecutor (enables remote search_files / grep_code in sandbox_full). */
26
+ export function codingToolExecutorRemoteOptions(remote) {
27
+ if (!remote || remote.strategy !== 'sandbox_full')
28
+ return undefined;
29
+ return {
30
+ gatewayUrl: remote.gatewayUrl,
31
+ authToken: remote.authToken,
32
+ sessionId: remote.sessionId,
33
+ strategy: 'sandbox_full',
34
+ cwd: remote.cwd,
35
+ workspaceRoot: remote.workspaceRoot,
36
+ };
37
+ }
38
+ /** E2B workspace path for system-prompt guidance (host paths must not be passed as tool paths). */
39
+ export function remoteToolWorkspaceRootForAgent(remote) {
40
+ if (!remote || remote.strategy !== 'sandbox_full')
41
+ return undefined;
42
+ const w = remote.workspaceRoot?.trim();
43
+ if (w)
44
+ return w;
45
+ const env = process.env.XIBECODE_SANDBOX_WORKSPACE_ROOT?.trim();
46
+ return env || '/home/user/workspace';
47
+ }
48
+ export function remoteToolSandboxIdForAgent(remote) {
49
+ const sid = remote?.e2bSandboxId?.trim();
50
+ return sid || undefined;
51
+ }
52
+ class CliRemoteExecutionClient {
53
+ configRef;
54
+ gatewayUrl;
55
+ authToken;
56
+ cwd;
57
+ strategy;
58
+ workspaceRoot;
59
+ sessionId;
60
+ e2bSandboxId;
61
+ initialized = false;
62
+ constructor(config) {
63
+ this.configRef = config;
64
+ this.gatewayUrl = config.gatewayUrl.replace(/\/+$/, '');
65
+ this.authToken = config.authToken;
66
+ this.cwd = config.cwd;
67
+ this.strategy = config.strategy || 'host_only';
68
+ this.workspaceRoot = config.workspaceRoot;
69
+ this.sessionId = config.sessionId || `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
70
+ this.e2bSandboxId = config.e2bSandboxId;
71
+ }
72
+ getHeaders() {
73
+ const headers = { 'Content-Type': 'application/json' };
74
+ if (this.authToken) {
75
+ headers.Authorization = `Bearer ${this.authToken}`;
76
+ }
77
+ return headers;
78
+ }
79
+ async parseJson(response) {
80
+ const text = await response.text();
81
+ if (!text.trim())
82
+ return {};
83
+ try {
84
+ return JSON.parse(text);
85
+ }
86
+ catch {
87
+ return { message: text };
88
+ }
89
+ }
90
+ async ensureSession() {
91
+ if (this.initialized)
92
+ return;
93
+ const response = await fetch(`${this.gatewayUrl}/sessions`, {
94
+ method: 'POST',
95
+ headers: this.getHeaders(),
96
+ body: JSON.stringify({
97
+ sessionId: this.sessionId,
98
+ cwd: this.cwd,
99
+ strategy: this.strategy,
100
+ workspaceRoot: this.workspaceRoot,
101
+ }),
102
+ });
103
+ const payload = await this.parseJson(response);
104
+ if (!response.ok || payload?.success === false) {
105
+ throw new Error(payload?.message || `Gateway session setup failed (${response.status})`);
106
+ }
107
+ if (typeof payload?.sessionId === 'string' && payload.sessionId.trim()) {
108
+ this.sessionId = payload.sessionId.trim();
109
+ this.configRef.sessionId = this.sessionId;
110
+ }
111
+ if (typeof payload?.sandboxId === 'string' && payload.sandboxId.trim()) {
112
+ this.e2bSandboxId = payload.sandboxId.trim();
113
+ this.configRef.e2bSandboxId = this.e2bSandboxId;
114
+ }
115
+ this.initialized = true;
116
+ }
117
+ getSandboxId() {
118
+ return this.e2bSandboxId?.trim() || undefined;
119
+ }
120
+ async request(path, init) {
121
+ await this.ensureSession();
122
+ const response = await fetch(`${this.gatewayUrl}${path}`, {
123
+ ...init,
124
+ headers: {
125
+ ...this.getHeaders(),
126
+ ...(init.headers || {}),
127
+ },
128
+ });
129
+ const payload = await this.parseJson(response);
130
+ if (!response.ok || payload?.success === false) {
131
+ throw new Error(payload?.message || `Gateway request failed (${response.status})`);
132
+ }
133
+ return payload;
134
+ }
135
+ async runCommand(input) {
136
+ await this.ensureSession();
137
+ const timeoutSeconds = Math.max(1, Number(input.timeout || 120));
138
+ const response = await fetch(`${this.gatewayUrl}/sessions/${encodeURIComponent(this.sessionId)}/exec`, {
139
+ method: 'POST',
140
+ headers: this.getHeaders(),
141
+ body: JSON.stringify({
142
+ command: input.command,
143
+ cwd: input.cwd,
144
+ input: input.input,
145
+ timeout: timeoutSeconds,
146
+ maxOutputChars: input.max_output_chars,
147
+ }),
148
+ });
149
+ const payload = await this.parseJson(response);
150
+ if (!response.ok || payload?.success === false) {
151
+ return {
152
+ success: false,
153
+ error: true,
154
+ stdout: String(payload?.stdout ?? ''),
155
+ stderr: String(payload?.stderr ?? payload?.message ?? `Gateway command failed (${response.status})`),
156
+ exitCode: payload?.exitCode,
157
+ timedOut: false,
158
+ platform: 'e2b',
159
+ };
160
+ }
161
+ return {
162
+ success: payload?.success !== false,
163
+ stdout: String(payload?.stdout ?? ''),
164
+ stderr: String(payload?.stderr ?? ''),
165
+ exitCode: payload?.exitCode,
166
+ timedOut: Boolean(payload?.timedOut),
167
+ platform: String(payload?.platform ?? 'e2b'),
168
+ };
169
+ }
170
+ async readFile(path, startLine, endLine) {
171
+ const query = new URLSearchParams({ path });
172
+ if (typeof startLine === 'number')
173
+ query.set('start_line', String(startLine));
174
+ if (typeof endLine === 'number')
175
+ query.set('end_line', String(endLine));
176
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/file?${query.toString()}`, {
177
+ method: 'GET',
178
+ });
179
+ }
180
+ async writeFile(path, content) {
181
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/file`, {
182
+ method: 'PUT',
183
+ body: JSON.stringify({ path, content }),
184
+ });
185
+ }
186
+ async deleteFile(path) {
187
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/file`, {
188
+ method: 'DELETE',
189
+ body: JSON.stringify({ path }),
190
+ });
191
+ }
192
+ async listDirectory(path) {
193
+ const query = new URLSearchParams({ path });
194
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/list?${query.toString()}`, {
195
+ method: 'GET',
196
+ });
197
+ }
198
+ async createDirectory(path) {
199
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/directory`, {
200
+ method: 'POST',
201
+ body: JSON.stringify({ path }),
202
+ });
203
+ }
204
+ async moveFile(source, destination) {
205
+ return this.request(`/sessions/${encodeURIComponent(this.sessionId)}/move`, {
206
+ method: 'POST',
207
+ body: JSON.stringify({ source, destination }),
208
+ });
209
+ }
210
+ }
211
+ export function attachRemoteExecution(toolExecutor, remoteExecution) {
212
+ if (!remoteExecution)
213
+ return;
214
+ if (!toolExecutor || typeof toolExecutor.execute !== 'function')
215
+ return;
216
+ const remoteClient = new CliRemoteExecutionClient(remoteExecution);
217
+ const originalExecute = toolExecutor.execute.bind(toolExecutor);
218
+ toolExecutor.execute = async (toolName, input) => {
219
+ if (!remoteExecution.e2bSandboxId) {
220
+ await remoteClient.ensureSession().catch(() => undefined);
221
+ const sid = remoteClient.getSandboxId();
222
+ if (sid)
223
+ remoteExecution.e2bSandboxId = sid;
224
+ }
225
+ if (toolName === 'run_command' && input && typeof input.command === 'string') {
226
+ return remoteClient.runCommand(input);
227
+ }
228
+ if (remoteExecution.strategy === 'sandbox_full') {
229
+ if (toolName === 'read_file' && input?.path) {
230
+ return remoteClient.readFile(input.path, input.start_line, input.end_line);
231
+ }
232
+ if (toolName === 'read_multiple_files' && Array.isArray(input?.paths)) {
233
+ const files = await Promise.all(input.paths.map(async (targetPath) => {
234
+ try {
235
+ return await remoteClient.readFile(targetPath);
236
+ }
237
+ catch (error) {
238
+ return { error: true, success: false, path: targetPath, message: error?.message || String(error) };
239
+ }
240
+ }));
241
+ return { files, errors: files.filter((item) => item?.error) };
242
+ }
243
+ if (toolName === 'write_file' && input?.path && typeof input?.content === 'string') {
244
+ return remoteClient.writeFile(input.path, input.content);
245
+ }
246
+ if (toolName === 'list_directory') {
247
+ return remoteClient.listDirectory(input?.path || '.');
248
+ }
249
+ if (toolName === 'create_directory' && input?.path) {
250
+ return remoteClient.createDirectory(input.path);
251
+ }
252
+ if (toolName === 'delete_file' && input?.path) {
253
+ return remoteClient.deleteFile(input.path);
254
+ }
255
+ if (toolName === 'move_file' && input?.source && input?.destination) {
256
+ return remoteClient.moveFile(input.source, input.destination);
257
+ }
258
+ if (toolName === 'edit_file' && input?.path && typeof input?.search === 'string' && typeof input?.replace === 'string') {
259
+ const current = await remoteClient.readFile(input.path);
260
+ const content = String(current?.content ?? '');
261
+ const occurrences = (content.match(new RegExp(input.search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
262
+ if (occurrences === 0)
263
+ return { success: false, error: true, message: `Search string not found in ${input.path}` };
264
+ if (!input?.all && occurrences > 1) {
265
+ return { success: false, error: true, message: `Search string appears ${occurrences} times. Please be more specific or use all:true` };
266
+ }
267
+ const next = input?.all ? content.replaceAll(input.search, input.replace) : content.replace(input.search, input.replace);
268
+ return remoteClient.writeFile(input.path, next);
269
+ }
270
+ if (toolName === 'edit_lines' && input?.path && typeof input?.new_content === 'string') {
271
+ const current = await remoteClient.readFile(input.path);
272
+ const lines = String(current?.content ?? '').split('\n');
273
+ const startLine = Number(input?.start_line || 0);
274
+ const endLine = Number(input?.end_line || 0);
275
+ if (startLine < 1 || endLine > lines.length || startLine > endLine) {
276
+ return { success: false, error: true, message: `Invalid line range: ${startLine}-${endLine}` };
277
+ }
278
+ const next = [
279
+ ...lines.slice(0, startLine - 1),
280
+ ...String(input.new_content).split('\n'),
281
+ ...lines.slice(endLine),
282
+ ].join('\n');
283
+ return remoteClient.writeFile(input.path, next);
284
+ }
285
+ if (toolName === 'insert_at_line' && input?.path && typeof input?.line === 'number') {
286
+ const current = await remoteClient.readFile(input.path);
287
+ const lines = String(current?.content ?? '').split('\n');
288
+ const line = Number(input.line);
289
+ if (line < 1 || line > lines.length + 1) {
290
+ return { success: false, error: true, message: `Invalid line number: ${line}` };
291
+ }
292
+ const next = [
293
+ ...lines.slice(0, line - 1),
294
+ ...String(input?.content ?? '').split('\n'),
295
+ ...lines.slice(line - 1),
296
+ ].join('\n');
297
+ return remoteClient.writeFile(input.path, next);
298
+ }
299
+ if (toolName === 'verified_edit' && input?.path && typeof input?.new_content === 'string') {
300
+ const current = await remoteClient.readFile(input.path);
301
+ const lines = String(current?.content ?? '').split('\n');
302
+ const startLine = Number(input?.start_line || 0);
303
+ const endLine = Number(input?.end_line || 0);
304
+ const oldContent = String(input?.old_content ?? '');
305
+ if (startLine < 1 || endLine > lines.length || startLine > endLine) {
306
+ return { success: false, error: true, message: `Invalid line range: ${startLine}-${endLine}` };
307
+ }
308
+ const actual = lines.slice(startLine - 1, endLine).join('\n');
309
+ const normalize = (value) => value.split('\n').map((line) => line.trimEnd()).join('\n').trim();
310
+ if (normalize(actual) !== normalize(oldContent)) {
311
+ return { success: false, error: true, message: 'Content mismatch for verified_edit', actual_content: actual };
312
+ }
313
+ const next = [
314
+ ...lines.slice(0, startLine - 1),
315
+ ...String(input.new_content).split('\n'),
316
+ ...lines.slice(endLine),
317
+ ].join('\n');
318
+ return remoteClient.writeFile(input.path, next);
319
+ }
320
+ if (toolName === 'run_tests') {
321
+ const command = typeof input?.command === 'string' && input.command.trim() ? input.command : 'pnpm test';
322
+ return remoteClient.runCommand({ command, cwd: input?.cwd, timeout: 300 });
323
+ }
324
+ if (toolName === 'get_git_status') {
325
+ return remoteClient.runCommand({ command: 'git status --porcelain=v1 -b' });
326
+ }
327
+ if (toolName === 'get_git_diff_summary') {
328
+ const command = input?.target ? `git diff --stat ${input.target}` : 'git diff --stat';
329
+ return remoteClient.runCommand({ command });
330
+ }
331
+ if (toolName === 'get_git_changed_files') {
332
+ const command = input?.target ? `git diff --name-only ${input.target}` : 'git diff --name-only';
333
+ return remoteClient.runCommand({ command });
334
+ }
335
+ }
336
+ return originalExecute(toolName, input);
337
+ };
338
+ }
339
+ //# sourceMappingURL=remote-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-execution.js","sourceRoot":"","sources":["../../src/utils/remote-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CliRemoteExecutionConfig } from './remote-execution.js';
2
+ export declare function syncWorkspaceToSandbox(remoteExecution: CliRemoteExecutionConfig, cwd: string, options: {
3
+ maxMb: number;
4
+ excludeGlobs: string[];
5
+ workspaceRoot?: string;
6
+ /** When true (default), prefer git ls-files (tracked + untracked, honoring .gitignore). */
7
+ respectGitignore?: boolean;
8
+ }): Promise<{
9
+ sessionId: string;
10
+ sandboxId?: string;
11
+ workspaceRoot?: string;
12
+ bytes: number;
13
+ }>;
14
+ //# sourceMappingURL=sandbox-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-sync.d.ts","sourceRoot":"","sources":["../../src/utils/sandbox-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AA6MtE,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,wBAAwB,EACzC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACA,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB3F"}
@@ -0,0 +1,206 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ const DEFAULT_CHUNK_BYTES = 32 * 1024;
4
+ function spawnBuffer(cmd, args, cwd) {
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(cmd, args, { cwd });
7
+ const chunks = [];
8
+ let stderr = '';
9
+ child.stdout.on('data', (c) => chunks.push(c));
10
+ child.stderr.on('data', (c) => {
11
+ stderr += c.toString();
12
+ });
13
+ child.on('error', reject);
14
+ child.on('close', (code) => {
15
+ if (code !== 0) {
16
+ reject(new Error(`${cmd} ${args.join(' ')} failed (${code}): ${stderr.trim() || 'no stderr'}`));
17
+ return;
18
+ }
19
+ resolve(Buffer.concat(chunks));
20
+ });
21
+ });
22
+ }
23
+ function decodeNullSeparatedPaths(buf) {
24
+ if (!buf.length)
25
+ return [];
26
+ const raw = buf.toString('utf8');
27
+ const parts = raw.split('\0');
28
+ return parts.filter((p) => p.length > 0);
29
+ }
30
+ /** Repo root or null if cwd is not inside a git work tree. */
31
+ async function gitRepoRoot(cwd) {
32
+ try {
33
+ const inside = (await spawnBuffer('git', ['rev-parse', '--is-inside-work-tree'], cwd)).toString('utf8').trim();
34
+ if (inside !== 'true')
35
+ return null;
36
+ const root = (await spawnBuffer('git', ['rev-parse', '--show-toplevel'], cwd)).toString('utf8').trim();
37
+ return root || null;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ /**
44
+ * Tracked + untracked paths that are not ignored by repo/global gitignore rules.
45
+ * Paths are relative to `repoRoot` (POSIX separators as git emits).
46
+ */
47
+ async function gitWorkspacePaths(repoRoot) {
48
+ const tracked = decodeNullSeparatedPaths(await spawnBuffer('git', ['ls-files', '-z'], repoRoot));
49
+ const untracked = decodeNullSeparatedPaths(await spawnBuffer('git', ['ls-files', '-z', '-o', '--exclude-standard'], repoRoot));
50
+ return Array.from(new Set([...tracked, ...untracked])).sort((a, b) => a.localeCompare(b));
51
+ }
52
+ function getHeaders(authToken) {
53
+ const headers = { 'Content-Type': 'application/json' };
54
+ if (authToken) {
55
+ headers.Authorization = `Bearer ${authToken}`;
56
+ }
57
+ return headers;
58
+ }
59
+ async function parseJson(response) {
60
+ const text = await response.text();
61
+ if (!text.trim())
62
+ return {};
63
+ try {
64
+ return JSON.parse(text);
65
+ }
66
+ catch {
67
+ return { message: text };
68
+ }
69
+ }
70
+ async function ensureRemoteSession(config) {
71
+ const sessionId = config.sessionId || randomUUID();
72
+ const response = await fetch(`${config.gatewayUrl.replace(/\/+$/, '')}/sessions`, {
73
+ method: 'POST',
74
+ headers: getHeaders(config.authToken),
75
+ body: JSON.stringify({
76
+ sessionId,
77
+ cwd: config.cwd,
78
+ strategy: config.strategy || 'host_only',
79
+ workspaceRoot: config.workspaceRoot,
80
+ }),
81
+ });
82
+ const payload = await parseJson(response);
83
+ if (!response.ok || payload?.success === false) {
84
+ throw new Error(String(payload?.message || `Gateway session setup failed (${response.status})`));
85
+ }
86
+ const resolvedSessionId = (typeof payload?.sessionId === 'string' && payload.sessionId.trim()) ? payload.sessionId.trim() : sessionId;
87
+ const resolvedSandboxId = (typeof payload?.sandboxId === 'string' && payload.sandboxId.trim()) ? payload.sandboxId.trim() : undefined;
88
+ return {
89
+ sessionId: resolvedSessionId,
90
+ sandboxId: resolvedSandboxId,
91
+ };
92
+ }
93
+ /** Tar whole directory (legacy) with optional extra --exclude globs. */
94
+ async function createTarGzFromDirectory(cwd, excludeGlobs) {
95
+ const tarArgs = ['-czf', '-', '.'];
96
+ for (const glob of excludeGlobs) {
97
+ tarArgs.unshift(`--exclude=${glob}`);
98
+ }
99
+ return new Promise((resolve, reject) => {
100
+ const child = spawn('tar', tarArgs, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
101
+ const stdoutChunks = [];
102
+ let stderr = '';
103
+ child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
104
+ child.stderr.on('data', (chunk) => {
105
+ stderr += chunk.toString();
106
+ });
107
+ child.on('error', reject);
108
+ child.on('close', (code) => {
109
+ if (code !== 0) {
110
+ reject(new Error(`tar failed with exit code ${code}: ${stderr || 'unknown error'}`));
111
+ return;
112
+ }
113
+ resolve(Buffer.concat(stdoutChunks));
114
+ });
115
+ });
116
+ }
117
+ /**
118
+ * Tar exactly the given paths (relative to repoRoot) plus tar --exclude globs.
119
+ * Uses GNU tar semantics: paths must use / as separator; no leading ./.
120
+ */
121
+ async function createTarGzFromPathList(repoRoot, relativePaths, excludeGlobs) {
122
+ const stdin = Buffer.concat(relativePaths.map((p) => Buffer.from(`${p}\0`, 'utf8')));
123
+ const tarArgs = ['-czf', '-', '--null', '-T', '-'];
124
+ for (const glob of excludeGlobs) {
125
+ tarArgs.unshift(`--exclude=${glob}`);
126
+ }
127
+ return new Promise((resolve, reject) => {
128
+ const child = spawn('tar', tarArgs, { cwd: repoRoot, stdio: ['pipe', 'pipe', 'pipe'] });
129
+ const stdoutChunks = [];
130
+ let stderr = '';
131
+ child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
132
+ child.stderr.on('data', (chunk) => {
133
+ stderr += chunk.toString();
134
+ });
135
+ child.on('error', reject);
136
+ child.on('close', (code) => {
137
+ if (code !== 0) {
138
+ reject(new Error(`tar -T failed with exit code ${code}: ${stderr || 'unknown error'}`));
139
+ return;
140
+ }
141
+ resolve(Buffer.concat(stdoutChunks));
142
+ });
143
+ child.stdin.end(stdin);
144
+ });
145
+ }
146
+ async function createTarGzBuffer(cwd, excludeGlobs, respectGitignore) {
147
+ if (respectGitignore) {
148
+ const root = await gitRepoRoot(cwd);
149
+ if (root) {
150
+ try {
151
+ const paths = await gitWorkspacePaths(root);
152
+ if (paths.length > 0) {
153
+ return createTarGzFromPathList(root, paths, excludeGlobs);
154
+ }
155
+ }
156
+ catch {
157
+ /* fall through to directory tar */
158
+ }
159
+ }
160
+ }
161
+ return createTarGzFromDirectory(cwd, excludeGlobs);
162
+ }
163
+ async function uploadChunks(gatewayUrl, authToken, sessionId, archive, workspaceRoot) {
164
+ const baseUrl = gatewayUrl.replace(/\/+$/, '');
165
+ const totalChunks = Math.max(1, Math.ceil(archive.length / DEFAULT_CHUNK_BYTES));
166
+ for (let i = 0; i < totalChunks; i += 1) {
167
+ const start = i * DEFAULT_CHUNK_BYTES;
168
+ const end = Math.min(archive.length, start + DEFAULT_CHUNK_BYTES);
169
+ const chunk = archive.subarray(start, end);
170
+ const response = await fetch(`${baseUrl}/sessions/${encodeURIComponent(sessionId)}/sync`, {
171
+ method: 'POST',
172
+ headers: getHeaders(authToken),
173
+ body: JSON.stringify({
174
+ reset: i === 0,
175
+ final: i === totalChunks - 1,
176
+ chunkBase64: chunk.toString('base64'),
177
+ workspaceRoot,
178
+ }),
179
+ });
180
+ const payload = await parseJson(response);
181
+ if (!response.ok || payload?.success === false) {
182
+ throw new Error(String(payload?.message || `Workspace sync failed at chunk ${i + 1}/${totalChunks}`));
183
+ }
184
+ }
185
+ }
186
+ export async function syncWorkspaceToSandbox(remoteExecution, cwd, options) {
187
+ const session = await ensureRemoteSession(remoteExecution);
188
+ const sessionId = session.sessionId;
189
+ if (session.sandboxId) {
190
+ remoteExecution.e2bSandboxId = session.sandboxId;
191
+ }
192
+ const archive = await createTarGzBuffer(cwd, options.excludeGlobs, options.respectGitignore !== false);
193
+ const maxBytes = Math.max(1, options.maxMb) * 1024 * 1024;
194
+ if (archive.length > maxBytes) {
195
+ throw new Error(`Workspace archive is ${Math.ceil(archive.length / (1024 * 1024))}MB, above sandboxSyncMaxMb=${options.maxMb}. ` +
196
+ `Increase --set-sandbox-sync-max-mb or add more excludes.`);
197
+ }
198
+ await uploadChunks(remoteExecution.gatewayUrl, remoteExecution.authToken, sessionId, archive, options.workspaceRoot);
199
+ return {
200
+ sessionId,
201
+ sandboxId: session.sandboxId,
202
+ workspaceRoot: options.workspaceRoot,
203
+ bytes: archive.length,
204
+ };
205
+ }
206
+ //# sourceMappingURL=sandbox-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-sync.js","sourceRoot":"","sources":["../../src/utils/sandbox-sync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xibecode",
3
- "version": "1.3.3",
3
+ "version": "1.3.7",
4
4
  "description": "AI-powered autonomous coding assistant with AI test generation, multi-model support, and plugin system",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "xibecode-core": "^1.3.3",
35
+ "xibecode-core": "^1.3.6",
36
36
  "@anthropic-ai/sdk": "^0.78.0",
37
37
  "chalk": "^4.1.2",
38
38
  "commander": "^12.0.0",