buildfunctions 0.0.3 → 0.0.5

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 (70) hide show
  1. package/README.md +87 -1
  2. package/dist/client.d.ts +34 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +198 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/function/cpu-function.d.ts +19 -0
  7. package/dist/function/cpu-function.d.ts.map +1 -0
  8. package/dist/function/cpu-function.js +103 -0
  9. package/dist/function/cpu-function.js.map +1 -0
  10. package/dist/function/gpu-function.d.ts +13 -0
  11. package/dist/function/gpu-function.d.ts.map +1 -0
  12. package/dist/function/gpu-function.js +202 -0
  13. package/dist/function/gpu-function.js.map +1 -0
  14. package/dist/function/index.d.ts +8 -0
  15. package/dist/function/index.d.ts.map +1 -0
  16. package/dist/function/index.js +6 -0
  17. package/dist/function/index.js.map +1 -0
  18. package/dist/index.d.ts +45 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +55 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/sandbox/cpu-sandbox.d.ts +18 -0
  23. package/dist/sandbox/cpu-sandbox.d.ts.map +1 -0
  24. package/dist/sandbox/cpu-sandbox.js +293 -0
  25. package/dist/sandbox/cpu-sandbox.js.map +1 -0
  26. package/dist/sandbox/gpu-sandbox.d.ts +15 -0
  27. package/dist/sandbox/gpu-sandbox.d.ts.map +1 -0
  28. package/dist/sandbox/gpu-sandbox.js +359 -0
  29. package/dist/sandbox/gpu-sandbox.js.map +1 -0
  30. package/dist/sandbox/index.d.ts +6 -0
  31. package/dist/sandbox/index.d.ts.map +1 -0
  32. package/dist/sandbox/index.js +6 -0
  33. package/dist/sandbox/index.js.map +1 -0
  34. package/dist/types/index.d.ts +153 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +5 -0
  37. package/dist/types/index.js.map +1 -0
  38. package/dist/utils/errors.d.ts +27 -0
  39. package/dist/utils/errors.d.ts.map +1 -0
  40. package/dist/utils/errors.js +79 -0
  41. package/dist/utils/errors.js.map +1 -0
  42. package/dist/utils/framework.d.ts +6 -0
  43. package/dist/utils/framework.d.ts.map +1 -0
  44. package/dist/utils/framework.js +17 -0
  45. package/dist/utils/framework.js.map +1 -0
  46. package/dist/utils/http.d.ts +24 -0
  47. package/dist/utils/http.d.ts.map +1 -0
  48. package/dist/utils/http.js +75 -0
  49. package/dist/utils/http.js.map +1 -0
  50. package/dist/utils/index.d.ts +8 -0
  51. package/dist/utils/index.d.ts.map +1 -0
  52. package/dist/utils/index.js +8 -0
  53. package/dist/utils/index.js.map +1 -0
  54. package/dist/utils/memory.d.ts +6 -0
  55. package/dist/utils/memory.d.ts.map +1 -0
  56. package/dist/utils/memory.js +21 -0
  57. package/dist/utils/memory.js.map +1 -0
  58. package/dist/utils/uploader.d.ts +41 -0
  59. package/dist/utils/uploader.d.ts.map +1 -0
  60. package/dist/utils/uploader.js +157 -0
  61. package/dist/utils/uploader.js.map +1 -0
  62. package/package.json +27 -17
  63. package/dist/cli.d.ts +0 -3
  64. package/dist/cli.d.ts.map +0 -1
  65. package/dist/cli.js +0 -18
  66. package/dist/cli.js.map +0 -1
  67. package/dist/test.d.ts +0 -10
  68. package/dist/test.d.ts.map +0 -1
  69. package/dist/test.js +0 -7
  70. package/dist/test.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Buildfunctions SDK Error Classes
3
+ */
4
+ export class BuildfunctionsError extends Error {
5
+ code;
6
+ statusCode;
7
+ details;
8
+ constructor(message, code = 'UNKNOWN_ERROR', statusCode, details) {
9
+ super(message);
10
+ this.name = 'BuildfunctionsError';
11
+ this.code = code;
12
+ this.statusCode = statusCode;
13
+ this.details = details;
14
+ Object.setPrototypeOf(this, BuildfunctionsError.prototype);
15
+ }
16
+ static fromResponse(statusCode, body) {
17
+ const message = body.error ?? 'An unknown error occurred';
18
+ const code = mapErrorCode(body.code, statusCode);
19
+ return new BuildfunctionsError(message, code, statusCode);
20
+ }
21
+ }
22
+ export class AuthenticationError extends BuildfunctionsError {
23
+ constructor(message = 'Invalid or missing API key') {
24
+ super(message, 'UNAUTHORIZED', 401);
25
+ this.name = 'AuthenticationError';
26
+ Object.setPrototypeOf(this, AuthenticationError.prototype);
27
+ }
28
+ }
29
+ export class NotFoundError extends BuildfunctionsError {
30
+ constructor(resource = 'Resource') {
31
+ super(`${resource} not found`, 'NOT_FOUND', 404);
32
+ this.name = 'NotFoundError';
33
+ Object.setPrototypeOf(this, NotFoundError.prototype);
34
+ }
35
+ }
36
+ export class ValidationError extends BuildfunctionsError {
37
+ constructor(message, details) {
38
+ super(message, 'VALIDATION_ERROR', 400, details);
39
+ this.name = 'ValidationError';
40
+ Object.setPrototypeOf(this, ValidationError.prototype);
41
+ }
42
+ }
43
+ export class CapacityError extends BuildfunctionsError {
44
+ constructor(message = 'Service at maximum capacity. Please try again later.') {
45
+ super(message, 'MAX_CAPACITY', 503);
46
+ this.name = 'CapacityError';
47
+ Object.setPrototypeOf(this, CapacityError.prototype);
48
+ }
49
+ }
50
+ function mapErrorCode(code, statusCode) {
51
+ if (code) {
52
+ const validCodes = [
53
+ 'UNAUTHORIZED',
54
+ 'NOT_FOUND',
55
+ 'INVALID_REQUEST',
56
+ 'MAX_CAPACITY',
57
+ 'SIZE_LIMIT_EXCEEDED',
58
+ 'VALIDATION_ERROR',
59
+ ];
60
+ if (validCodes.includes(code)) {
61
+ return code;
62
+ }
63
+ }
64
+ switch (statusCode) {
65
+ case 401:
66
+ return 'UNAUTHORIZED';
67
+ case 404:
68
+ return 'NOT_FOUND';
69
+ case 400:
70
+ return 'INVALID_REQUEST';
71
+ case 503:
72
+ return 'MAX_CAPACITY';
73
+ case 409:
74
+ return 'SIZE_LIMIT_EXCEEDED';
75
+ default:
76
+ return 'UNKNOWN_ERROR';
77
+ }
78
+ }
79
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Detect framework from requirements string
3
+ * Parses requirements.txt style content to find torch/pytorch
4
+ */
5
+ export declare function detectFramework(requirements: string | undefined): 'pytorch' | undefined;
6
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/utils/framework.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAcvF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Detect framework from requirements string
3
+ * Parses requirements.txt style content to find torch/pytorch
4
+ */
5
+ export function detectFramework(requirements) {
6
+ if (!requirements) {
7
+ return 'pytorch'; // default (todo: remove from being the default)
8
+ }
9
+ const lower = requirements.toLowerCase();
10
+ // Look for torch or pytorch in requirements
11
+ // Common patterns: "torch", "torch==2.0", "pytorch", "torch>=1.0"
12
+ if (lower.includes('torch')) {
13
+ return 'pytorch';
14
+ }
15
+ return undefined;
16
+ }
17
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/utils/framework.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,YAAgC;IAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC,CAAC,sDAAsD;IAC1E,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAEzC,4CAA4C;IAC5C,kEAAkE;IAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * HTTP Client for Buildfunctions API
3
+ */
4
+ export interface HttpClientConfig {
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ timeout?: number;
8
+ }
9
+ export interface RequestOptions {
10
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
11
+ path: string;
12
+ body?: Record<string, unknown>;
13
+ params?: Record<string, string | number>;
14
+ }
15
+ export interface HttpClient {
16
+ request: <T>(options: RequestOptions) => Promise<T>;
17
+ get: <T>(path: string, params?: Record<string, string | number>) => Promise<T>;
18
+ post: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
19
+ put: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
20
+ delete: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
21
+ setToken: (token: string) => void;
22
+ }
23
+ export declare function createHttpClient(config: HttpClientConfig): HttpClient;
24
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA0FrE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * HTTP Client for Buildfunctions API
3
+ */
4
+ import { BuildfunctionsError, AuthenticationError } from './errors.js';
5
+ export function createHttpClient(config) {
6
+ if (!config.apiKey) {
7
+ throw new AuthenticationError('API key is required');
8
+ }
9
+ const baseUrl = config.baseUrl.replace(/\/$/, '');
10
+ let currentToken = config.apiKey;
11
+ const timeout = config.timeout ?? 600000; // 10 minutes default for long-running builds
12
+ const buildUrl = (path, params) => {
13
+ const url = new URL(path, baseUrl);
14
+ if (params) {
15
+ for (const [key, value] of Object.entries(params)) {
16
+ url.searchParams.set(key, String(value));
17
+ }
18
+ }
19
+ return url.toString();
20
+ };
21
+ const parseResponse = async (response) => {
22
+ const contentType = response.headers.get('content-type');
23
+ if (contentType?.includes('application/json')) {
24
+ return response.json();
25
+ }
26
+ const text = await response.text();
27
+ return { message: text };
28
+ };
29
+ const request = async (options) => {
30
+ const url = buildUrl(options.path, options.params);
31
+ const controller = new AbortController();
32
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
33
+ try {
34
+ const response = await fetch(url, {
35
+ method: options.method,
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ Authorization: `Bearer ${currentToken}`,
39
+ },
40
+ body: options.body ? JSON.stringify(options.body) : undefined,
41
+ signal: controller.signal,
42
+ });
43
+ clearTimeout(timeoutId);
44
+ const data = await parseResponse(response);
45
+ if (!response.ok) {
46
+ throw BuildfunctionsError.fromResponse(response.status, data);
47
+ }
48
+ return data;
49
+ }
50
+ catch (error) {
51
+ clearTimeout(timeoutId);
52
+ if (error instanceof BuildfunctionsError) {
53
+ throw error;
54
+ }
55
+ if (error instanceof Error) {
56
+ if (error.name === 'AbortError') {
57
+ throw new BuildfunctionsError('Request timed out', 'NETWORK_ERROR');
58
+ }
59
+ throw new BuildfunctionsError('Unable to connect to server', 'NETWORK_ERROR');
60
+ }
61
+ throw new BuildfunctionsError('Request failed', 'UNKNOWN_ERROR');
62
+ }
63
+ };
64
+ return {
65
+ request,
66
+ get: (path, params) => request({ method: 'GET', path, params }),
67
+ post: (path, body) => request({ method: 'POST', path, body }),
68
+ put: (path, body) => request({ method: 'PUT', path, body }),
69
+ delete: (path, body) => request({ method: 'DELETE', path, body }),
70
+ setToken: (token) => {
71
+ currentToken = token;
72
+ },
73
+ };
74
+ }
75
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export * from './errors.js';
5
+ export * from './http.js';
6
+ export * from './memory.js';
7
+ export * from './framework.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export * from './errors.js';
5
+ export * from './http.js';
6
+ export * from './memory.js';
7
+ export * from './framework.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse memory string to megabytes
3
+ * Accepts: "2GB", "1024MB", or raw number (treated as MB)
4
+ */
5
+ export declare function parseMemory(memory: string | number): number;
6
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAmB3D"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Parse memory string to megabytes
3
+ * Accepts: "2GB", "1024MB", or raw number (treated as MB)
4
+ */
5
+ export function parseMemory(memory) {
6
+ if (typeof memory === 'number') {
7
+ return memory;
8
+ }
9
+ const str = memory.trim().toUpperCase();
10
+ const match = str.match(/^(\d+)\s*(GB|MB)$/);
11
+ if (!match) {
12
+ throw new Error(`Invalid memory format: "${memory}". Use "2GB" or "1024MB".`);
13
+ }
14
+ const value = parseInt(match[1], 10);
15
+ const unit = match[2];
16
+ if (unit === 'GB') {
17
+ return value * 1024;
18
+ }
19
+ return value; // MB
20
+ }
21
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,2BAA2B,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAEvB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,KAAK;AACrB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * File upload utilities for GPU Sandbox
3
+ */
4
+ export interface FileMetadata {
5
+ name: string;
6
+ size: number;
7
+ type: string;
8
+ webkitRelativePath: string;
9
+ localPath: string;
10
+ }
11
+ export interface PresignedUrlInfo {
12
+ signedUrl: string[];
13
+ uploadId: string | null;
14
+ numberOfParts?: number;
15
+ s3FilePath?: string;
16
+ }
17
+ interface TransferDetailsResponse {
18
+ transferDetails: Array<{
19
+ fileName: string;
20
+ [key: string]: unknown;
21
+ }>;
22
+ storageApiUrl: string;
23
+ storageApiPath: string;
24
+ }
25
+ interface PresignedUrlsResponse {
26
+ modelAndFunctionPresignedUrls: {
27
+ modelPresignedUrls: Record<string, PresignedUrlInfo>;
28
+ };
29
+ bucketName: string;
30
+ modelRecord?: {
31
+ modelName: string;
32
+ modelFolderContainingFilesPath: string;
33
+ };
34
+ }
35
+ export declare function uploadFile(content: Buffer, presignedUrl: string): Promise<void>;
36
+ export declare function uploadMultipartFile(content: Buffer, signedUrls: string[], uploadId: string, numberOfParts: number, bucketName: string, s3FilePath: string, baseUrl: string): Promise<void>;
37
+ export declare function getFilesInDirectory(dirPath: string): FileMetadata[];
38
+ export declare function uploadModelFiles(files: FileMetadata[], presignedUrls: Record<string, PresignedUrlInfo>, bucketName: string, baseUrl: string): Promise<void>;
39
+ export declare function transferFilesToEFS(files: FileMetadata[], sanitizedModelName: string, baseUrl: string, sessionToken: string): Promise<void>;
40
+ export type { PresignedUrlsResponse, TransferDetailsResponse };
41
+ //# sourceMappingURL=uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/utils/uploader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,uBAAuB;IAC/B,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,qBAAqB;IAC7B,6BAA6B,EAAE;QAC7B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KACtD,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,8BAA8B,EAAE,MAAM,CAAC;KACxC,CAAC;CACH;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrF;AA4BD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CA6BnE;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EAAE,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC/C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EAAE,EACrB,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * File upload utilities for GPU Sandbox
3
+ */
4
+ import { statSync, readdirSync } from 'fs';
5
+ import { readFile } from 'fs/promises';
6
+ import { basename, join, relative } from 'path';
7
+ const CHUNK_SIZE = 9 * 1024 * 1024;
8
+ export async function uploadFile(content, presignedUrl) {
9
+ const response = await fetch(presignedUrl, {
10
+ method: 'PUT',
11
+ body: content,
12
+ headers: {
13
+ 'Content-Type': 'application/octet-stream',
14
+ },
15
+ });
16
+ if (!response.ok) {
17
+ throw new Error(`Failed to upload file: ${response.statusText}`);
18
+ }
19
+ }
20
+ async function uploadPart(content, presignedUrl, partNumber) {
21
+ const response = await fetch(presignedUrl, {
22
+ method: 'PUT',
23
+ body: content,
24
+ headers: {
25
+ 'Content-Type': 'application/octet-stream',
26
+ },
27
+ });
28
+ if (!response.ok) {
29
+ throw new Error(`Failed to upload part ${partNumber}: ${response.statusText}`);
30
+ }
31
+ const etag = response.headers.get('ETag');
32
+ if (!etag) {
33
+ throw new Error(`Failed to retrieve ETag for part ${partNumber}`);
34
+ }
35
+ const cleanEtag = etag.replace(/^"|"$/g, '');
36
+ return { PartNumber: partNumber, ETag: cleanEtag };
37
+ }
38
+ export async function uploadMultipartFile(content, signedUrls, uploadId, numberOfParts, bucketName, s3FilePath, baseUrl) {
39
+ const parts = [];
40
+ const maxParallelUploads = 5;
41
+ for (let i = 0; i < numberOfParts; i += maxParallelUploads) {
42
+ const batch = [];
43
+ for (let j = i; j < Math.min(i + maxParallelUploads, numberOfParts); j++) {
44
+ const partNumber = j + 1;
45
+ const start = j * CHUNK_SIZE;
46
+ const end = Math.min(start + CHUNK_SIZE, content.length);
47
+ const chunk = content.slice(start, end);
48
+ const signedUrl = signedUrls[j];
49
+ if (!signedUrl) {
50
+ throw new Error(`Missing upload URL for part ${partNumber}`);
51
+ }
52
+ batch.push(uploadPart(chunk, signedUrl, partNumber).then((part) => {
53
+ parts.push(part);
54
+ }));
55
+ }
56
+ await Promise.all(batch);
57
+ }
58
+ const sortedParts = parts.sort((a, b) => a.PartNumber - b.PartNumber);
59
+ const response = await fetch(`${baseUrl}/api/functions/gpu/transfer-and-mount/complete-multipart-upload`, {
60
+ method: 'POST',
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ body: JSON.stringify({
65
+ bucketName,
66
+ uploadId,
67
+ parts: sortedParts,
68
+ s3FilePath,
69
+ fileName: s3FilePath.split('/').pop(),
70
+ }),
71
+ });
72
+ if (!response.ok) {
73
+ const errorText = await response.text();
74
+ throw new Error(`Failed to complete upload: ${response.statusText} - ${errorText}`);
75
+ }
76
+ }
77
+ export function getFilesInDirectory(dirPath) {
78
+ const files = [];
79
+ const rootDirName = basename(dirPath);
80
+ function walkDir(currentPath) {
81
+ const entries = readdirSync(currentPath, { withFileTypes: true });
82
+ for (const entry of entries) {
83
+ const fullPath = join(currentPath, entry.name);
84
+ if (entry.isDirectory()) {
85
+ walkDir(fullPath);
86
+ }
87
+ else if (entry.isFile()) {
88
+ const stats = statSync(fullPath);
89
+ const relativePath = relative(dirPath, fullPath);
90
+ files.push({
91
+ name: entry.name,
92
+ size: stats.size,
93
+ type: 'application/octet-stream',
94
+ webkitRelativePath: `${rootDirName}/${relativePath}`,
95
+ localPath: fullPath,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ walkDir(dirPath);
101
+ return files;
102
+ }
103
+ export async function uploadModelFiles(files, presignedUrls, bucketName, baseUrl) {
104
+ const uploadPromises = [];
105
+ for (const file of files) {
106
+ const urlInfo = presignedUrls[file.webkitRelativePath];
107
+ if (!urlInfo) {
108
+ console.error(`No upload URL found for ${file.webkitRelativePath}`);
109
+ continue;
110
+ }
111
+ const content = await readFile(file.localPath);
112
+ const signedUrls = urlInfo.signedUrl;
113
+ if (signedUrls.length > 1 && urlInfo.uploadId) {
114
+ uploadPromises.push(uploadMultipartFile(content, signedUrls, urlInfo.uploadId, urlInfo.numberOfParts || signedUrls.length, bucketName, urlInfo.s3FilePath || '', baseUrl));
115
+ }
116
+ else if (signedUrls.length === 1 && signedUrls[0]) {
117
+ uploadPromises.push(uploadFile(content, signedUrls[0]));
118
+ }
119
+ }
120
+ await Promise.all(uploadPromises);
121
+ }
122
+ export async function transferFilesToEFS(files, sanitizedModelName, baseUrl, sessionToken) {
123
+ const detailsResponse = await fetch(`${baseUrl}/api/sdk/sandbox/gpu/get-transfer-details`, {
124
+ method: 'POST',
125
+ headers: {
126
+ 'Content-Type': 'application/json',
127
+ 'Authorization': `Bearer ${sessionToken}`,
128
+ },
129
+ body: JSON.stringify({
130
+ shouldVerifyContents: false,
131
+ filesToTransfer: files.map(f => f.webkitRelativePath),
132
+ sanitizedModelName,
133
+ fileNamesWithinModelFolder: files.map(f => f.name),
134
+ }),
135
+ });
136
+ if (!detailsResponse.ok) {
137
+ const errorData = await detailsResponse.json();
138
+ throw new Error(errorData.error || 'Failed to prepare file transfer');
139
+ }
140
+ const transferData = await detailsResponse.json();
141
+ const { transferDetails, storageApiUrl, storageApiPath } = transferData;
142
+ const validTransferDetails = transferDetails.filter(d => d.fileName && d.fileName.length > 0);
143
+ for (const fileDetail of validTransferDetails) {
144
+ const transferResponse = await fetch(`${storageApiUrl}${storageApiPath}`, {
145
+ method: 'POST',
146
+ headers: {
147
+ 'Content-Type': 'application/json',
148
+ },
149
+ body: JSON.stringify(fileDetail),
150
+ });
151
+ if (!transferResponse.ok) {
152
+ const errorText = await transferResponse.text();
153
+ throw new Error(`Failed to transfer ${fileDetail.fileName}: ${errorText}`);
154
+ }
155
+ }
156
+ }
157
+ //# sourceMappingURL=uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/utils/uploader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAkCnC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,YAAoB;IACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP,cAAc,EAAE,0BAA0B;SAC3C;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,YAAoB,EACpB,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP,cAAc,EAAE,0BAA0B;SAC3C;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,UAAoB,EACpB,QAAgB,EAChB,aAAqB,EACrB,UAAkB,EAClB,UAAkB,EAClB,OAAe;IAEf,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,MAAM,kBAAkB,GAAG,CAAC,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,kBAAkB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzE,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,KAAK,CAAC,IAAI,CACR,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACrD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iEAAiE,EAAE;QACxG,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU;YACV,QAAQ;YACR,KAAK,EAAE,WAAW;YAClB,UAAU;YACV,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;SACtC,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEtC,SAAS,OAAO,CAAC,WAAmB;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAEjD,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,0BAA0B;oBAChC,kBAAkB,EAAE,GAAG,WAAW,IAAI,YAAY,EAAE;oBACpD,SAAS,EAAE,QAAQ;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAqB,EACrB,aAA+C,EAC/C,UAAkB,EAClB,OAAe;IAEf,MAAM,cAAc,GAAoB,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAErC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9C,cAAc,CAAC,IAAI,CACjB,mBAAmB,CACjB,OAAO,EACP,UAAU,EACV,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,aAAa,IAAI,UAAU,CAAC,MAAM,EAC1C,UAAU,EACV,OAAO,CAAC,UAAU,IAAI,EAAE,EACxB,OAAO,CACR,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAqB,EACrB,kBAA0B,EAC1B,OAAe,EACf,YAAoB;IAEpB,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,2CAA2C,EAAE;QACzF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,YAAY,EAAE;SAC1C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,oBAAoB,EAAE,KAAK;YAC3B,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACrD,kBAAkB;YAClB,0BAA0B,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACnD,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,EAAwB,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,iCAAiC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,IAAI,EAA6B,CAAC;IAC7E,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC;IAExE,MAAM,oBAAoB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9F,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,GAAG,cAAc,EAAE,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,43 +1,53 @@
1
1
  {
2
2
  "name": "buildfunctions",
3
- "version": "0.0.3",
4
- "description": "The Buildfunctions SDK (JavaScript and TypeScript)",
3
+ "version": "0.0.5",
4
+ "description": "The Buildfunctions SDK for Agents: Hardware-isolated CPU and GPU Sandboxes for untrusted AI actions",
5
5
  "type": "module",
6
- "main": "./dist/test.js",
7
- "types": "./dist/test.d.ts",
8
- "bin": {
9
- "buildfunctions": "./dist/cli.js"
10
- },
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
11
8
  "exports": {
12
9
  ".": {
13
- "types": "./dist/test.d.ts",
14
- "import": "./dist/test.js"
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
15
12
  }
16
13
  },
17
14
  "files": [
18
- "dist"
15
+ "dist",
16
+ "README.md"
19
17
  ],
20
18
  "scripts": {
21
19
  "build": "tsc",
22
20
  "dev": "tsc --watch",
23
- "start": "node dist/cli.js",
24
- "prepublishOnly": "npm run build",
25
- "test": "echo \"Error: no test specified\" && exit 1"
21
+ "clean": "rm -rf dist",
22
+ "prepublishOnly": "npm run clean && npm run build",
23
+ "typecheck": "tsc --noEmit"
26
24
  },
27
25
  "repository": {
28
26
  "type": "git",
29
27
  "url": "git+https://github.com/buildfunctions/sdk.git"
30
28
  },
31
29
  "keywords": [
32
- "buildfunctions",
33
- "sdk"
30
+ "AIAgents",
31
+ "AIInfrastructure",
32
+ "AIApps",
33
+ "Serverless",
34
+ "GPUs",
35
+ "Sandboxes",
36
+ "DeveloperExperience"
34
37
  ],
35
38
  "author": "Buildfunctions",
36
39
  "bugs": {
37
40
  "url": "https://github.com/buildfunctions/sdk/issues"
38
41
  },
39
- "homepage": "https://github.com/buildfunctions/sdk#readme",
42
+ "homepage": "https://www.buildfunctions.com",
43
+ "engines": {
44
+ "node": ">=18.0.0"
45
+ },
40
46
  "devDependencies": {
41
- "typescript": "5.9.2"
47
+ "@types/node": "25.0.10",
48
+ "typescript": "5.9.3"
49
+ },
50
+ "dependencies": {
51
+ "dotenv": "17.2.3"
42
52
  }
43
53
  }
package/dist/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Buildfunctions CLI
4
- */
5
- import test from './test.js';
6
- // Available commands
7
- const commands = {
8
- test,
9
- };
10
- // Get command from arguments
11
- const command = process.argv[2];
12
- if (command && commands[command]) {
13
- console.log(commands[command]());
14
- }
15
- else {
16
- console.log('Available commands: test');
17
- }
18
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,qBAAqB;AACrB,MAAM,QAAQ,GAAiC;IAC7C,IAAI;CACL,CAAC;AAEF,6BAA6B;AAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;IAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC;CACnC;KAAM;IACL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;CACzC"}
package/dist/test.d.ts DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * The Buildfunctions SDK - test function
3
- */
4
- declare type Message = string;
5
- /**
6
- * Test function that returns a message
7
- */
8
- export default function test(): Message;
9
- export {};
10
- //# sourceMappingURL=test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,aAAK,OAAO,GAAG,MAAM,CAAC;AAEtB;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,IAAI,OAAO,CAEtC"}
package/dist/test.js DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Test function that returns a message
3
- */
4
- export default function test() {
5
- return "Hello, world from the Buildfunctions JavaScript and TypeScript SDK";
6
- }
7
- //# sourceMappingURL=test.js.map
package/dist/test.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI;IAC1B,OAAO,oEAAoE,CAAC;AAC9E,CAAC"}