diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 9340b11..97ea4bf 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -51,6 +51,7 @@ jobs: - runloop - namespace - cloudflare + - freestyle steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -78,6 +79,7 @@ jobs: RUNLOOP_API_KEY: ${{ secrets.RUNLOOP_API_KEY }} CLOUDFLARE_SANDBOX_URL: ${{ secrets.CLOUDFLARE_SANDBOX_URL }} CLOUDFLARE_SANDBOX_SECRET: ${{ secrets.CLOUDFLARE_SANDBOX_SECRET }} + FREESTYLE_API_KEY: ${{ secrets.FREESTYLE_API_KEY }} run: | MODE_FLAG="" if [ -n "${{ github.event.inputs.mode }}" ]; then diff --git a/env.example b/env.example index a0ed5b4..2202de0 100644 --- a/env.example +++ b/env.example @@ -38,6 +38,8 @@ RENDER_OWNER_ID=your_render_owner_id ######### SPRITES ######## SPRITES_TOKEN=your_sprites_token +######### FREESTYLE ######## +FREESTYLE_API_KEY=your_freestyle_api_key ######### STORAGE PROVIDERS ######## diff --git a/package-lock.json b/package-lock.json index bf565c6..012ad7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@computesdk/codesandbox": "^1.5.40", "@computesdk/daytona": "^1.7.14", "@computesdk/e2b": "^1.7.34", + "@computesdk/freestyle": "^0.1.0", "@computesdk/hopx": "^0.2.10", "@computesdk/just-bash": "^0.3.0", "@computesdk/modal": "^1.8.29", @@ -1273,6 +1274,38 @@ "e2b": "^2.12.1" } }, + "node_modules/@computesdk/freestyle": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@computesdk/freestyle/-/freestyle-0.1.0.tgz", + "integrity": "sha512-5D7OEtXxgTDutsJXR1jcwhLA2C2wMykE9wsS02Py2WeppruZ8IpVqoCPBfeuuqcXl6GQBoFfZScQQ7Y8NybpIA==", + "license": "MIT", + "dependencies": { + "@computesdk/provider": "1.0.32", + "@freestyle-sh/with-nodejs": "^0.2.8", + "@freestyle-sh/with-python": "^0.2.8", + "computesdk": "2.5.2", + "freestyle-sandboxes": "^0.1.33" + } + }, + "node_modules/@computesdk/freestyle/node_modules/@computesdk/provider": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@computesdk/provider/-/provider-1.0.32.tgz", + "integrity": "sha512-MTXaXeZtukMchL6iFPbxdZUSauD8vJB79rzF9bEsJymrWBwX3/Cej0T8GCX6/yxVTuazEWQlsoXeedUfRGlGxg==", + "license": "MIT", + "dependencies": { + "@computesdk/cmd": "0.4.1", + "computesdk": "2.5.2" + } + }, + "node_modules/@computesdk/freestyle/node_modules/computesdk": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/computesdk/-/computesdk-2.5.2.tgz", + "integrity": "sha512-RO7oIeWWUSM6ZJMoz4ncVRPvjkLZJqAM6enel/s5WW/SnnqXG5dfl5PjZy33jZ0rD+qYDKj4fT7S8af92KJngg==", + "license": "MIT", + "dependencies": { + "@computesdk/cmd": "0.4.1" + } + }, "node_modules/@computesdk/hopx": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@computesdk/hopx/-/hopx-0.2.12.tgz", @@ -1980,6 +2013,50 @@ "node": ">=18" } }, + "node_modules/@freestyle-sh/with-nodejs": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@freestyle-sh/with-nodejs/-/with-nodejs-0.2.8.tgz", + "integrity": "sha512-5jSkWP2vIndW/zn8p+xT9tPXY2rGwHAEL+J30bkd1mNF0aJdoYOPJ1nLL9Zd6bpV3sL+OzkZHMEPYwYfexiOjw==", + "dependencies": { + "@freestyle-sh/with-type-js": "^0.2.8", + "freestyle-sandboxes": "^0.1.28" + } + }, + "node_modules/@freestyle-sh/with-python": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@freestyle-sh/with-python/-/with-python-0.2.8.tgz", + "integrity": "sha512-S3nnP2q2xLIlqcEZUxXavvyG7F9hBD+X8IDhiKog9EXn3jcBYwGd8+4xbAD+EqMO6uE0+xYiy0LiDZ88xsWThA==", + "dependencies": { + "@freestyle-sh/with-type-run-code": "^0.2.8", + "freestyle-sandboxes": "^0.1.28" + } + }, + "node_modules/@freestyle-sh/with-type-js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@freestyle-sh/with-type-js/-/with-type-js-0.2.8.tgz", + "integrity": "sha512-RcRpFWXGg7aJZSKUoOJ9to5ANBh91mZsbmstN2mVnbPR5riHQ9GoxbNe7qTl5Dab5TNStZeVVCpLvI+gOx8o5g==", + "dependencies": { + "@freestyle-sh/with-type-js-deps": "^0.2.8", + "@freestyle-sh/with-type-run-code": "^0.2.8", + "freestyle-sandboxes": "^0.1.28" + } + }, + "node_modules/@freestyle-sh/with-type-js-deps": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@freestyle-sh/with-type-js-deps/-/with-type-js-deps-0.2.8.tgz", + "integrity": "sha512-YXflkMlwcqUHaQcue02hqb9WLAL4O4yjY5vxSJqYn/YBdwiEApthZayeiEvSQz2tBEGuPreAj0T6Mc4I0O62Ew==", + "dependencies": { + "freestyle-sandboxes": "^0.1.28" + } + }, + "node_modules/@freestyle-sh/with-type-run-code": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@freestyle-sh/with-type-run-code/-/with-type-run-code-0.2.8.tgz", + "integrity": "sha512-xvtZRlWJWS5a+q6iLEY1T1dy8z2PIT3y1q81fm+jxR9rj4V+a71QvueYyOmfZgrq1oigvbDQx1F6R04DMnxTPA==", + "dependencies": { + "freestyle-sandboxes": "^0.1.28" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", @@ -8953,6 +9030,178 @@ "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", "license": "MIT" }, + "node_modules/freestyle-sandboxes": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/freestyle-sandboxes/-/freestyle-sandboxes-0.1.34.tgz", + "integrity": "sha512-RUCiWoFWLDfe3rETet7DmC5S7022L2kbmYWdHNJMUX/nBIKmKUpCT28szabCYH0Hsl5LyF3Zmanl3itB+m4m2A==", + "bin": { + "freestyle": "cli.mjs", + "freestyle-sandboxes": "cli.mjs" + }, + "optionalDependencies": { + "dotenv": "^17.3.1", + "glob": "^13.0.0", + "yargs": "^18.0.0" + } + }, + "node_modules/freestyle-sandboxes/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/freestyle-sandboxes/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/freestyle-sandboxes/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "optional": true + }, + "node_modules/freestyle-sandboxes/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/freestyle-sandboxes/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/freestyle-sandboxes/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/freestyle-sandboxes/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/freestyle-sandboxes/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/freestyle-sandboxes/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/freestyle-sandboxes/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "optional": true, + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/freestyle-sandboxes/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "optional": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", diff --git a/package.json b/package.json index 222c790..0f095da 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "bench:vercel": "tsx src/run.ts --provider vercel", "bench:just-bash": "tsx src/run.ts --provider just-bash", "bench:sprites": "tsx src/run.ts --provider sprites", + "bench:freestyle": "tsx src/run.ts --provider freestyle", "bench:storage": "tsx src/run.ts --mode storage", "bench:storage:s3": "tsx src/run.ts --mode storage --provider aws-s3", "bench:storage:r2": "tsx src/run.ts --mode storage --provider cloudflare-r2", @@ -42,6 +43,7 @@ "@computesdk/codesandbox": "^1.5.40", "@computesdk/daytona": "^1.7.14", "@computesdk/e2b": "^1.7.34", + "@computesdk/freestyle": "^0.1.0", "@computesdk/hopx": "^0.2.10", "@computesdk/just-bash": "^0.3.0", "@computesdk/modal": "^1.8.29", diff --git a/src/providers.ts b/src/providers.ts index 21bb47b..75120e1 100644 --- a/src/providers.ts +++ b/src/providers.ts @@ -10,6 +10,7 @@ import { runloop } from '@computesdk/runloop'; import { namespace } from '@computesdk/namespace'; import { cloudflare } from '@computesdk/cloudflare'; import { sprites } from '@computesdk/sprites'; +import { freestyle } from '@computesdk/freestyle'; import { compute } from 'computesdk'; import type { ProviderConfig } from './types.js'; @@ -83,6 +84,11 @@ export const providers: ProviderConfig[] = [ requiredEnvVars: ['SPRITES_TOKEN'], createCompute: () => sprites({ apiKey: process.env.SPRITES_TOKEN! }), }, + { + name: 'freestyle', + requiredEnvVars: ['FREESTYLE_API_KEY'], + createCompute: () => freestyle({ apiKey: process.env.FREESTYLE_API_KEY! }), + }, // --- Automatic mode (via ComputeSDK gateway) --- // { // name: 'railway',