@intella/sdk 0.0.7 → 0.0.9

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 (163) hide show
  1. package/README.md +70 -6
  2. package/dist/agent-manager.d.ts +4 -4
  3. package/dist/agent-manager.d.ts.map +1 -1
  4. package/dist/agent-manager.js +12 -7
  5. package/dist/agent-manager.js.map +1 -1
  6. package/dist/agents/base-agent.d.ts +35 -2
  7. package/dist/agents/base-agent.d.ts.map +1 -1
  8. package/dist/agents/base-agent.js +280 -24
  9. package/dist/agents/base-agent.js.map +1 -1
  10. package/dist/agents/claude-agent.d.ts +1 -1
  11. package/dist/agents/claude-agent.d.ts.map +1 -1
  12. package/dist/agents/claude-agent.js +2 -1
  13. package/dist/agents/claude-agent.js.map +1 -1
  14. package/dist/agents/codex-agent.d.ts +1 -1
  15. package/dist/agents/codex-agent.d.ts.map +1 -1
  16. package/dist/agents/codex-agent.js +2 -1
  17. package/dist/agents/codex-agent.js.map +1 -1
  18. package/dist/agents/intella-lite-agent.d.ts +1 -1
  19. package/dist/agents/intella-lite-agent.d.ts.map +1 -1
  20. package/dist/agents/intella-lite-agent.js +2 -1
  21. package/dist/agents/intella-lite-agent.js.map +1 -1
  22. package/dist/agents/opencode-agent.d.ts +1 -1
  23. package/dist/agents/opencode-agent.d.ts.map +1 -1
  24. package/dist/agents/opencode-agent.js +2 -3
  25. package/dist/agents/opencode-agent.js.map +1 -1
  26. package/dist/index.d.ts +22 -12
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +31 -11
  29. package/dist/index.js.map +1 -1
  30. package/dist/sandbox/{agent-installers.d.ts → agents/agent-installers.d.ts} +1 -1
  31. package/dist/sandbox/agents/agent-installers.d.ts.map +1 -0
  32. package/dist/sandbox/{agent-installers.js → agents/agent-installers.js} +5 -4
  33. package/dist/sandbox/agents/agent-installers.js.map +1 -0
  34. package/dist/sandbox/{agent-setup.d.ts → agents/agent-setup.d.ts} +1 -1
  35. package/dist/sandbox/agents/agent-setup.d.ts.map +1 -0
  36. package/dist/sandbox/{agent-setup.js → agents/agent-setup.js} +3 -2
  37. package/dist/sandbox/agents/agent-setup.js.map +1 -0
  38. package/dist/sandbox/agents/agents.d.ts +49 -0
  39. package/dist/sandbox/agents/agents.d.ts.map +1 -0
  40. package/dist/sandbox/agents/agents.js +71 -0
  41. package/dist/sandbox/agents/agents.js.map +1 -0
  42. package/dist/sandbox/config.d.ts +1 -1
  43. package/dist/sandbox/config.d.ts.map +1 -1
  44. package/dist/sandbox/config.js +26 -18
  45. package/dist/sandbox/config.js.map +1 -1
  46. package/dist/sandbox/file-utils.d.ts +20 -0
  47. package/dist/sandbox/file-utils.d.ts.map +1 -0
  48. package/dist/sandbox/file-utils.js +101 -0
  49. package/dist/sandbox/file-utils.js.map +1 -0
  50. package/dist/sandbox/operations/code-operations.d.ts +68 -0
  51. package/dist/sandbox/operations/code-operations.d.ts.map +1 -0
  52. package/dist/sandbox/operations/code-operations.js +208 -0
  53. package/dist/sandbox/operations/code-operations.js.map +1 -0
  54. package/dist/sandbox/operations/git-operations.d.ts +27 -0
  55. package/dist/sandbox/operations/git-operations.d.ts.map +1 -0
  56. package/dist/sandbox/operations/git-operations.js +235 -0
  57. package/dist/sandbox/operations/git-operations.js.map +1 -0
  58. package/dist/sandbox/providers/base-provider.d.ts +283 -0
  59. package/dist/sandbox/providers/base-provider.d.ts.map +1 -0
  60. package/dist/sandbox/providers/base-provider.js +816 -0
  61. package/dist/sandbox/providers/base-provider.js.map +1 -0
  62. package/dist/sandbox/{daytona-provider.d.ts → providers/daytona-provider.d.ts} +19 -16
  63. package/dist/sandbox/providers/daytona-provider.d.ts.map +1 -0
  64. package/dist/sandbox/{daytona-provider.js → providers/daytona-provider.js} +96 -27
  65. package/dist/sandbox/providers/daytona-provider.js.map +1 -0
  66. package/dist/sandbox/{e2b-provider.d.ts → providers/e2b-provider.d.ts} +16 -10
  67. package/dist/sandbox/providers/e2b-provider.d.ts.map +1 -0
  68. package/dist/sandbox/{e2b-provider.js → providers/e2b-provider.js} +51 -29
  69. package/dist/sandbox/providers/e2b-provider.js.map +1 -0
  70. package/dist/sandbox/{local-provider.d.ts → providers/local-provider.d.ts} +12 -6
  71. package/dist/sandbox/providers/local-provider.d.ts.map +1 -0
  72. package/dist/sandbox/{local-provider.js → providers/local-provider.js} +24 -21
  73. package/dist/sandbox/providers/local-provider.js.map +1 -0
  74. package/dist/sandbox/{modal-provider.d.ts → providers/modal-provider.d.ts} +18 -12
  75. package/dist/sandbox/providers/modal-provider.d.ts.map +1 -0
  76. package/dist/sandbox/{modal-provider.js → providers/modal-provider.js} +49 -29
  77. package/dist/sandbox/providers/modal-provider.js.map +1 -0
  78. package/dist/sandbox/{vercel-provider.d.ts → providers/vercel-provider.d.ts} +19 -14
  79. package/dist/sandbox/providers/vercel-provider.d.ts.map +1 -0
  80. package/dist/sandbox/{vercel-provider.js → providers/vercel-provider.js} +41 -42
  81. package/dist/sandbox/providers/vercel-provider.js.map +1 -0
  82. package/dist/sandbox/utils/detector.d.ts +28 -0
  83. package/dist/sandbox/utils/detector.d.ts.map +1 -0
  84. package/dist/sandbox/utils/detector.js +243 -0
  85. package/dist/sandbox/utils/detector.js.map +1 -0
  86. package/dist/sandbox-manager.js +5 -5
  87. package/dist/sandbox-manager.js.map +1 -1
  88. package/dist/sdk.d.ts +4 -3
  89. package/dist/sdk.d.ts.map +1 -1
  90. package/dist/sdk.js +7 -3
  91. package/dist/sdk.js.map +1 -1
  92. package/dist/session/execution-store.d.ts +71 -0
  93. package/dist/session/execution-store.d.ts.map +1 -0
  94. package/dist/session/execution-store.js +156 -0
  95. package/dist/session/execution-store.js.map +1 -0
  96. package/dist/session/index.d.ts +14 -0
  97. package/dist/session/index.d.ts.map +1 -0
  98. package/dist/session/index.js +20 -0
  99. package/dist/session/index.js.map +1 -0
  100. package/dist/session/manager.d.ts +164 -0
  101. package/dist/session/manager.d.ts.map +1 -0
  102. package/dist/session/manager.js +493 -0
  103. package/dist/session/manager.js.map +1 -0
  104. package/dist/session/store.d.ts +20 -0
  105. package/dist/session/store.d.ts.map +1 -0
  106. package/dist/session/store.js +69 -0
  107. package/dist/session/store.js.map +1 -0
  108. package/dist/session/types.d.ts +57 -0
  109. package/dist/session/types.d.ts.map +1 -0
  110. package/dist/session/types.js +2 -0
  111. package/dist/session/types.js.map +1 -0
  112. package/dist/types.d.ts +622 -19
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/types.js +35 -0
  115. package/dist/types.js.map +1 -1
  116. package/dist/utils/cli-daemon.d.ts.map +1 -1
  117. package/dist/utils/cli-daemon.js +1 -3
  118. package/dist/utils/cli-daemon.js.map +1 -1
  119. package/dist/utils/machine-id.d.ts +8 -0
  120. package/dist/utils/machine-id.d.ts.map +1 -0
  121. package/dist/utils/machine-id.js +19 -0
  122. package/dist/utils/machine-id.js.map +1 -0
  123. package/dist/utils/redis/client.d.ts +18 -0
  124. package/dist/utils/redis/client.d.ts.map +1 -0
  125. package/dist/utils/redis/client.js +52 -0
  126. package/dist/utils/redis/client.js.map +1 -0
  127. package/dist/utils/redis/index.d.ts +2 -0
  128. package/dist/utils/redis/index.d.ts.map +1 -0
  129. package/dist/utils/redis/index.js +2 -0
  130. package/dist/utils/redis/index.js.map +1 -0
  131. package/dist/utils/{redis-stream.d.ts → redis/stream.d.ts} +41 -74
  132. package/dist/utils/redis/stream.d.ts.map +1 -0
  133. package/dist/utils/{redis-stream.js → redis/stream.js} +133 -69
  134. package/dist/utils/redis/stream.js.map +1 -0
  135. package/dist/utils/repo-context.d.ts +16 -0
  136. package/dist/utils/repo-context.d.ts.map +1 -0
  137. package/dist/utils/repo-context.js +65 -0
  138. package/dist/utils/repo-context.js.map +1 -0
  139. package/dist/utils/tool-response.d.ts +20 -0
  140. package/dist/utils/tool-response.d.ts.map +1 -0
  141. package/dist/utils/tool-response.js +68 -0
  142. package/dist/utils/tool-response.js.map +1 -0
  143. package/package.json +23 -8
  144. package/dist/sandbox/agent-installers.d.ts.map +0 -1
  145. package/dist/sandbox/agent-installers.js.map +0 -1
  146. package/dist/sandbox/agent-setup.d.ts.map +0 -1
  147. package/dist/sandbox/agent-setup.js.map +0 -1
  148. package/dist/sandbox/base-provider.d.ts +0 -106
  149. package/dist/sandbox/base-provider.d.ts.map +0 -1
  150. package/dist/sandbox/base-provider.js +0 -74
  151. package/dist/sandbox/base-provider.js.map +0 -1
  152. package/dist/sandbox/daytona-provider.d.ts.map +0 -1
  153. package/dist/sandbox/daytona-provider.js.map +0 -1
  154. package/dist/sandbox/e2b-provider.d.ts.map +0 -1
  155. package/dist/sandbox/e2b-provider.js.map +0 -1
  156. package/dist/sandbox/local-provider.d.ts.map +0 -1
  157. package/dist/sandbox/local-provider.js.map +0 -1
  158. package/dist/sandbox/modal-provider.d.ts.map +0 -1
  159. package/dist/sandbox/modal-provider.js.map +0 -1
  160. package/dist/sandbox/vercel-provider.d.ts.map +0 -1
  161. package/dist/sandbox/vercel-provider.js.map +0 -1
  162. package/dist/utils/redis-stream.d.ts.map +0 -1
  163. package/dist/utils/redis-stream.js.map +0 -1
@@ -1,21 +1,22 @@
1
+ import { AgentType } from '../types.js';
1
2
  /**
2
3
  * Validate that an agent type requires a binary
3
4
  */
4
5
  export function agentRequiresBinary(agentType) {
5
- return agentType === 'claude' || agentType === 'codex' || agentType === 'opencode';
6
+ return agentType === AgentType.CLAUDE || agentType === AgentType.CODEX || agentType === AgentType.OPENCODE;
6
7
  }
7
8
  /**
8
9
  * Get the npm package name for an agent binary
9
10
  */
10
11
  export function getAgentBinaryPackage(agentType) {
11
12
  switch (agentType) {
12
- case 'claude':
13
+ case AgentType.CLAUDE:
13
14
  return '@anthropic-ai/claude-code';
14
- case 'codex':
15
+ case AgentType.CODEX:
15
16
  return '@openai/codex';
16
- case 'opencode':
17
+ case AgentType.OPENCODE:
17
18
  return 'opencode-ai';
18
- case 'intella-lite':
19
+ case AgentType.INTELLA_LITE:
19
20
  return null;
20
21
  default:
21
22
  return null;
@@ -26,13 +27,13 @@ export function getAgentBinaryPackage(agentType) {
26
27
  */
27
28
  export function getAgentBinaryCommand(agentType) {
28
29
  switch (agentType) {
29
- case 'claude':
30
+ case AgentType.CLAUDE:
30
31
  return 'claude';
31
- case 'codex':
32
+ case AgentType.CODEX:
32
33
  return 'codex';
33
- case 'opencode':
34
+ case AgentType.OPENCODE:
34
35
  return 'opencode';
35
- case 'intella-lite':
36
+ case AgentType.INTELLA_LITE:
36
37
  return null;
37
38
  default:
38
39
  return null;
@@ -43,13 +44,13 @@ export function getAgentBinaryCommand(agentType) {
43
44
  */
44
45
  export function getRequiredApiKeys(agentType) {
45
46
  switch (agentType) {
46
- case 'claude':
47
+ case AgentType.CLAUDE:
47
48
  return ['ANTHROPIC_API_KEY'];
48
- case 'codex':
49
+ case AgentType.CODEX:
49
50
  return ['OPENAI_API_KEY', 'AI_GATEWAY_API_KEY']; // Either one works
50
- case 'opencode':
51
- return ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY']; // At least one
52
- case 'intella-lite':
51
+ case AgentType.OPENCODE:
52
+ return ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'AI_GATEWAY_API_KEY']; // At least one
53
+ case AgentType.INTELLA_LITE:
53
54
  return ['OPENAI_API_KEY'];
54
55
  default:
55
56
  return [];
@@ -69,19 +70,26 @@ export function validateApiKeys(agentType, apiKeys) {
69
70
  missing.push(key);
70
71
  }
71
72
  }
73
+ // Special handling for claude (ANTHROPIC_API_KEY)
74
+ if (agentType === AgentType.CLAUDE) {
75
+ if (apiKeys.ANTHROPIC_API_KEY) {
76
+ return { valid: true, missing: [] };
77
+ }
78
+ return { valid: false, missing: ['ANTHROPIC_API_KEY'] };
79
+ }
72
80
  // Special handling for codex (either OPENAI_API_KEY or AI_GATEWAY_API_KEY)
73
- if (agentType === 'codex') {
81
+ if (agentType === AgentType.CODEX) {
74
82
  if (apiKeys.OPENAI_API_KEY || apiKeys.AI_GATEWAY_API_KEY) {
75
83
  return { valid: true, missing: [] };
76
84
  }
77
85
  return { valid: false, missing: ['OPENAI_API_KEY or AI_GATEWAY_API_KEY'] };
78
86
  }
79
87
  // Special handling for opencode (at least one API key)
80
- if (agentType === 'opencode') {
81
- if (apiKeys.OPENAI_API_KEY || apiKeys.ANTHROPIC_API_KEY) {
88
+ if (agentType === AgentType.OPENCODE) {
89
+ if (apiKeys.OPENAI_API_KEY || apiKeys.ANTHROPIC_API_KEY || apiKeys.GEMINI_API_KEY || apiKeys.AI_GATEWAY_API_KEY) {
82
90
  return { valid: true, missing: [] };
83
91
  }
84
- return { valid: false, missing: ['OPENAI_API_KEY or ANTHROPIC_API_KEY'] };
92
+ return { valid: false, missing: ['OPENAI_API_KEY or ANTHROPIC_API_KEY or GEMINI_API_KEY'] };
85
93
  }
86
94
  return {
87
95
  valid: missing.length === 0,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/sandbox/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/sandbox/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { WriteFileContent, ReadFileFormat } from '../types.js';
2
+ /**
3
+ * Normalize WriteFileContent to Uint8Array for use in sandbox file operations.
4
+ */
5
+ export declare function contentToBytes(content: WriteFileContent): Promise<Uint8Array>;
6
+ /**
7
+ * Detect if source string is a URL (http, https, or file).
8
+ */
9
+ export declare function isUrlSource(source: string): boolean;
10
+ /**
11
+ * Resolve a source (local path or http(s)/file URL) to bytes.
12
+ * Used by base uploadFileSingle so providers only implement writeFileSingle.
13
+ */
14
+ export declare function sourceToBytes(source: string): Promise<Uint8Array>;
15
+ /**
16
+ * Convert raw bytes (base format) to the requested readFile format.
17
+ * Used by base readFile so providers only implement readFileRaw.
18
+ */
19
+ export declare function bytesToReadResult(bytes: Uint8Array, format: ReadFileFormat): string | Uint8Array | Blob | ReadableStream<Uint8Array>;
20
+ //# sourceMappingURL=file-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/sandbox/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAwCnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,cAAc,GACrB,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAkBzD"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Normalize WriteFileContent to Uint8Array for use in sandbox file operations.
3
+ */
4
+ export async function contentToBytes(content) {
5
+ if (typeof content === 'string') {
6
+ return new TextEncoder().encode(content);
7
+ }
8
+ if (content instanceof ArrayBuffer) {
9
+ return new Uint8Array(content);
10
+ }
11
+ if (content instanceof Uint8Array) {
12
+ return content;
13
+ }
14
+ if (typeof Buffer !== 'undefined' && Buffer.isBuffer(content)) {
15
+ return new Uint8Array(content);
16
+ }
17
+ if (content instanceof Blob) {
18
+ const ab = await content.arrayBuffer();
19
+ return new Uint8Array(ab);
20
+ }
21
+ if (typeof content.getReader === 'function') {
22
+ const stream = content;
23
+ const reader = stream.getReader();
24
+ const chunks = [];
25
+ try {
26
+ while (true) {
27
+ const { done, value } = await reader.read();
28
+ if (done)
29
+ break;
30
+ if (value)
31
+ chunks.push(value);
32
+ }
33
+ }
34
+ finally {
35
+ reader.releaseLock();
36
+ }
37
+ const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
38
+ const out = new Uint8Array(totalLength);
39
+ let offset = 0;
40
+ for (const chunk of chunks) {
41
+ out.set(chunk, offset);
42
+ offset += chunk.length;
43
+ }
44
+ return out;
45
+ }
46
+ throw new Error('Unsupported content type for writeFile');
47
+ }
48
+ /**
49
+ * Detect if source string is a URL (http, https, or file).
50
+ */
51
+ export function isUrlSource(source) {
52
+ return (source.startsWith('http://') ||
53
+ source.startsWith('https://') ||
54
+ source.startsWith('file://'));
55
+ }
56
+ /**
57
+ * Resolve a source (local path or http(s)/file URL) to bytes.
58
+ * Used by base uploadFileSingle so providers only implement writeFileSingle.
59
+ */
60
+ export async function sourceToBytes(source) {
61
+ if (source.startsWith('http://') || source.startsWith('https://')) {
62
+ const res = await fetch(source);
63
+ if (!res.ok)
64
+ throw new Error(`Failed to fetch ${source}: ${res.status}`);
65
+ return new Uint8Array(await res.arrayBuffer());
66
+ }
67
+ if (source.startsWith('file://')) {
68
+ const { fileURLToPath } = await import('url');
69
+ const fs = await import('fs/promises');
70
+ const localPath = fileURLToPath(source);
71
+ const buf = await fs.readFile(localPath);
72
+ return new Uint8Array(buf);
73
+ }
74
+ const fs = await import('fs/promises');
75
+ const buf = await fs.readFile(source);
76
+ return new Uint8Array(buf);
77
+ }
78
+ /**
79
+ * Convert raw bytes (base format) to the requested readFile format.
80
+ * Used by base readFile so providers only implement readFileRaw.
81
+ */
82
+ export function bytesToReadResult(bytes, format) {
83
+ switch (format) {
84
+ case 'text':
85
+ return new TextDecoder().decode(bytes);
86
+ case 'bytes':
87
+ return bytes;
88
+ case 'blob':
89
+ return new Blob([new Uint8Array(bytes)]);
90
+ case 'stream':
91
+ return new ReadableStream({
92
+ start(controller) {
93
+ controller.enqueue(bytes);
94
+ controller.close();
95
+ },
96
+ });
97
+ default:
98
+ return new TextDecoder().decode(bytes);
99
+ }
100
+ }
101
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/sandbox/file-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { CommandResult, ISandboxProvider } from '../../types.js';
2
+ /**
3
+ * Detected package manager type
4
+ */
5
+ export type PackageManagerType = 'npm' | 'yarn' | 'pnpm' | 'bun' | 'pip' | 'pipenv' | 'poetry' | 'none';
6
+ /**
7
+ * Detection result for a codebase
8
+ */
9
+ export interface CodebaseDetectionResult {
10
+ /** Detected package managers */
11
+ packageManagers: PackageManagerType[];
12
+ /** Has package.json */
13
+ hasPackageJson: boolean;
14
+ /** Has requirements.txt */
15
+ hasRequirementsTxt: boolean;
16
+ /** Has Pipfile */
17
+ hasPipfile: boolean;
18
+ /** Has pyproject.toml (poetry) */
19
+ hasPyprojectToml: boolean;
20
+ /** Lockfile detected */
21
+ lockfile?: 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml' | 'bun.lockb' | 'Pipfile.lock' | 'poetry.lock';
22
+ /** Primary package manager (best guess based on lockfile) */
23
+ primary: PackageManagerType;
24
+ }
25
+ /**
26
+ * Auto-install result
27
+ */
28
+ export interface AutoInstallResult {
29
+ /** Whether install was successful */
30
+ success: boolean;
31
+ /** Package manager used */
32
+ packageManager: PackageManagerType;
33
+ /** Command result */
34
+ result?: CommandResult;
35
+ /** Error message if failed */
36
+ error?: string;
37
+ }
38
+ /**
39
+ * Detect the package manager(s) used in a codebase
40
+ */
41
+ export declare function detectCodebase(provider: ISandboxProvider, path: string): Promise<CodebaseDetectionResult>;
42
+ /**
43
+ * Get the install command for a package manager
44
+ */
45
+ export declare function getInstallCommand(packageManager: PackageManagerType): string;
46
+ /**
47
+ * Auto-install a codebase by detecting and running the appropriate package manager
48
+ */
49
+ export declare function autoInstallCodebase(provider: ISandboxProvider, path: string, options?: {
50
+ /** Prefer a specific package manager if multiple are detected */
51
+ prefer?: PackageManagerType;
52
+ /** Timeout for install command */
53
+ timeout?: number;
54
+ /** Use venv for Python projects */
55
+ useVenv?: boolean;
56
+ }): Promise<AutoInstallResult>;
57
+ /**
58
+ * Ensure a Python virtual environment exists
59
+ */
60
+ export declare function ensureVenv(provider: ISandboxProvider, path: string): Promise<{
61
+ created: boolean;
62
+ venvPath: string;
63
+ }>;
64
+ /**
65
+ * Ensure a .gitignore entry exists
66
+ */
67
+ export declare function ensureGitignoreEntry(provider: ISandboxProvider, path: string, entry: string): Promise<void>;
68
+ //# sourceMappingURL=code-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-operations.d.ts","sourceRoot":"","sources":["../../../src/sandbox/operations/code-operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExG;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,uBAAuB;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,2BAA2B;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,mBAAmB,GAAG,WAAW,GAAG,gBAAgB,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC;IAC/G,6DAA6D;IAC7D,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,cAAc,EAAE,kBAAkB,CAAC;IACnC,qBAAqB;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC,CAkFlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,CAmB5E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,iEAAiE;IACjE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,OAAO,CAAC,iBAAiB,CAAC,CA2D5B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBjD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Detect the package manager(s) used in a codebase
3
+ */
4
+ export async function detectCodebase(provider, path) {
5
+ const result = {
6
+ packageManagers: [],
7
+ hasPackageJson: false,
8
+ hasRequirementsTxt: false,
9
+ hasPipfile: false,
10
+ hasPyprojectToml: false,
11
+ primary: 'none',
12
+ };
13
+ // Check for files in parallel
14
+ const [hasPackageJson, hasRequirementsTxt, hasPipfile, hasPyprojectToml, hasPackageLock, hasYarnLock, hasPnpmLock, hasBunLock, hasPipfileLock, hasPoetryLock,] = await Promise.all([
15
+ provider.fileExists(`${path}/package.json`),
16
+ provider.fileExists(`${path}/requirements.txt`),
17
+ provider.fileExists(`${path}/Pipfile`),
18
+ provider.fileExists(`${path}/pyproject.toml`),
19
+ provider.fileExists(`${path}/package-lock.json`),
20
+ provider.fileExists(`${path}/yarn.lock`),
21
+ provider.fileExists(`${path}/pnpm-lock.yaml`),
22
+ provider.fileExists(`${path}/bun.lockb`),
23
+ provider.fileExists(`${path}/Pipfile.lock`),
24
+ provider.fileExists(`${path}/poetry.lock`),
25
+ ]);
26
+ result.hasPackageJson = hasPackageJson;
27
+ result.hasRequirementsTxt = hasRequirementsTxt;
28
+ result.hasPipfile = hasPipfile;
29
+ result.hasPyprojectToml = hasPyprojectToml;
30
+ // Detect lockfile and infer package manager
31
+ if (hasBunLock) {
32
+ result.lockfile = 'bun.lockb';
33
+ result.packageManagers.push('bun');
34
+ result.primary = 'bun';
35
+ }
36
+ else if (hasPnpmLock) {
37
+ result.lockfile = 'pnpm-lock.yaml';
38
+ result.packageManagers.push('pnpm');
39
+ result.primary = 'pnpm';
40
+ }
41
+ else if (hasYarnLock) {
42
+ result.lockfile = 'yarn.lock';
43
+ result.packageManagers.push('yarn');
44
+ result.primary = 'yarn';
45
+ }
46
+ else if (hasPackageLock) {
47
+ result.lockfile = 'package-lock.json';
48
+ result.packageManagers.push('npm');
49
+ result.primary = 'npm';
50
+ }
51
+ else if (hasPackageJson) {
52
+ // No lockfile but has package.json - default to npm
53
+ result.packageManagers.push('npm');
54
+ result.primary = 'npm';
55
+ }
56
+ // Python package managers
57
+ if (hasPoetryLock) {
58
+ result.lockfile = 'poetry.lock';
59
+ result.packageManagers.push('poetry');
60
+ if (result.primary === 'none')
61
+ result.primary = 'poetry';
62
+ }
63
+ else if (hasPipfileLock || hasPipfile) {
64
+ if (hasPipfileLock)
65
+ result.lockfile = 'Pipfile.lock';
66
+ result.packageManagers.push('pipenv');
67
+ if (result.primary === 'none')
68
+ result.primary = 'pipenv';
69
+ }
70
+ else if (hasRequirementsTxt) {
71
+ result.packageManagers.push('pip');
72
+ if (result.primary === 'none')
73
+ result.primary = 'pip';
74
+ }
75
+ else if (hasPyprojectToml) {
76
+ // pyproject.toml without poetry.lock - could be pip or poetry
77
+ result.packageManagers.push('pip');
78
+ if (result.primary === 'none')
79
+ result.primary = 'pip';
80
+ }
81
+ return result;
82
+ }
83
+ /**
84
+ * Get the install command for a package manager
85
+ */
86
+ export function getInstallCommand(packageManager) {
87
+ switch (packageManager) {
88
+ case 'npm':
89
+ return 'npm install';
90
+ case 'yarn':
91
+ return 'yarn install';
92
+ case 'pnpm':
93
+ return 'pnpm install';
94
+ case 'bun':
95
+ return 'bun install';
96
+ case 'pip':
97
+ return 'pip3 install -r requirements.txt';
98
+ case 'pipenv':
99
+ return 'pipenv install';
100
+ case 'poetry':
101
+ return 'poetry install';
102
+ default:
103
+ return '';
104
+ }
105
+ }
106
+ /**
107
+ * Auto-install a codebase by detecting and running the appropriate package manager
108
+ */
109
+ export async function autoInstallCodebase(provider, path, options) {
110
+ const detection = await detectCodebase(provider, path);
111
+ console.log(`Auto-install detected package manager: ${detection.primary}`);
112
+ if (detection.primary === 'none') {
113
+ return {
114
+ success: false,
115
+ packageManager: 'none',
116
+ error: 'No package manager detected in codebase',
117
+ };
118
+ }
119
+ // Determine which package manager to use
120
+ let packageManager = detection.primary;
121
+ if (options?.prefer && options.prefer !== 'none' && detection.packageManagers.includes(options.prefer)) {
122
+ packageManager = options.prefer;
123
+ }
124
+ // Handle Python venv if requested
125
+ if (options?.useVenv && ['pip', 'pipenv', 'poetry'].includes(packageManager)) {
126
+ await ensureVenv(provider, path);
127
+ }
128
+ const installCmd = getInstallCommand(packageManager);
129
+ if (!installCmd) {
130
+ return {
131
+ success: false,
132
+ packageManager,
133
+ error: `No install command for package manager: ${packageManager}`,
134
+ };
135
+ }
136
+ try {
137
+ // For Python with venv, activate venv first
138
+ let cmd = installCmd;
139
+ if (options?.useVenv && ['pip', 'pipenv', 'poetry'].includes(packageManager)) {
140
+ // Use venv's pip directly
141
+ if (packageManager === 'pip') {
142
+ cmd = '.venv/bin/pip3 install -r requirements.txt';
143
+ }
144
+ }
145
+ const result = await provider.executeCommand(cmd, {
146
+ cwd: path,
147
+ timeout: options?.timeout,
148
+ });
149
+ return {
150
+ success: result.exitCode === 0,
151
+ packageManager,
152
+ result,
153
+ error: result.exitCode !== 0 ? String(result.stderr) : undefined,
154
+ };
155
+ }
156
+ catch (err) {
157
+ return {
158
+ success: false,
159
+ packageManager,
160
+ error: err instanceof Error ? err.message : String(err),
161
+ };
162
+ }
163
+ }
164
+ /**
165
+ * Ensure a Python virtual environment exists
166
+ */
167
+ export async function ensureVenv(provider, path) {
168
+ // Check for existing venv
169
+ const hasVenv = await provider.fileExists(`${path}/.venv`);
170
+ const hasVenvAlt = await provider.fileExists(`${path}/venv`);
171
+ if (hasVenv) {
172
+ return { created: false, venvPath: `${path}/.venv` };
173
+ }
174
+ if (hasVenvAlt) {
175
+ return { created: false, venvPath: `${path}/venv` };
176
+ }
177
+ // Create venv
178
+ await provider.executeCommand('python3 -m venv .venv', { cwd: path });
179
+ // Update .gitignore to include .venv
180
+ await ensureGitignoreEntry(provider, path, '.venv');
181
+ return { created: true, venvPath: `${path}/.venv` };
182
+ }
183
+ /**
184
+ * Ensure a .gitignore entry exists
185
+ */
186
+ export async function ensureGitignoreEntry(provider, path, entry) {
187
+ const gitignorePath = `${path}/.gitignore`;
188
+ const hasGitignore = await provider.fileExists(gitignorePath);
189
+ if (hasGitignore) {
190
+ // Read existing .gitignore
191
+ const content = await provider.readFile(gitignorePath);
192
+ const lines = content.split('\n').map((l) => l.trim());
193
+ // Check if entry already exists
194
+ if (lines.includes(entry) || lines.includes(`${entry}/`)) {
195
+ return; // Already present
196
+ }
197
+ // Append entry
198
+ const newContent = content.endsWith('\n')
199
+ ? `${content}${entry}\n`
200
+ : `${content}\n${entry}\n`;
201
+ await provider.writeFile(gitignorePath, newContent);
202
+ }
203
+ else {
204
+ // Create new .gitignore
205
+ await provider.writeFile(gitignorePath, `${entry}\n`);
206
+ }
207
+ }
208
+ //# sourceMappingURL=code-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-operations.js","sourceRoot":"","sources":["../../../src/sandbox/operations/code-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { IGitOperations, CommandResult } from '../../types.js';
2
+ /** Minimal provider surface for default git impl (executeCommand + createDirectory). */
3
+ export interface GitOperationsProvider {
4
+ executeCommand(command: string, options?: {
5
+ cwd?: string;
6
+ env?: Record<string, string>;
7
+ timeout?: number;
8
+ }): Promise<CommandResult>;
9
+ createDirectory(path: string, options?: {
10
+ recursive?: boolean;
11
+ }): Promise<void>;
12
+ }
13
+ export declare function buildGitAuthUrl(url: string, username?: string, password?: string): string;
14
+ /**
15
+ * Extract repository name from a git URL.
16
+ * Handles HTTPS and SSH URLs like:
17
+ * - https://github.com/user/repo.git
18
+ * - https://github.com/user/repo
19
+ * - git@github.com:user/repo.git
20
+ */
21
+ export declare function extractRepoName(url: string): string;
22
+ /**
23
+ * Creates the default git implementation that uses executeCommand and createDirectory.
24
+ * Used by E2B, Modal, Vercel, and Local providers.
25
+ */
26
+ export declare function createDefaultGitOperations(provider: GitOperationsProvider): IGitOperations;
27
+ //# sourceMappingURL=git-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-operations.d.ts","sourceRoot":"","sources":["../../../src/sandbox/operations/git-operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAMd,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,wFAAwF;AACxF,MAAM,WAAW,qBAAqB;IACpC,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACzE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAkBD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUzF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,cAAc,CA4N1F"}