@blaxel/core 0.3.27 → 0.3.28

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.
@@ -30,8 +30,8 @@ function missingCredentialsMessage() {
30
30
  return "No Blaxel credentials found. Set the BL_API_KEY and BL_WORKSPACE environment variables, or run `bl login`.";
31
31
  }
32
32
  // Build info - these placeholders are replaced at build time by build:replace-imports
33
- const BUILD_VERSION = "0.3.27";
34
- const BUILD_COMMIT = "b818d0f5560b92040baeb620b8d89bf148cba56d";
33
+ const BUILD_VERSION = "0.3.28";
34
+ const BUILD_COMMIT = "643251a25f011082e6849e55e91f3b06e3a1efb3";
35
35
  const BUILD_SENTRY_DSN = "https://fd5e60e1c9820e1eef5ccebb84a07127@o4508714045276160.ingest.us.sentry.io/4510465864564736";
36
36
  const BLAXEL_API_VERSION = "2026-09-22";
37
37
  // Bun < 1.3.11 never sends connection-level WINDOW_UPDATE: the pooled h2
@@ -29,14 +29,19 @@ const BUILD_UPLOAD_LABELS = [
29
29
  "x-blaxel-build-cache",
30
30
  ];
31
31
  const MAX_BUILD_UPLOAD_LABEL_VALUE = 64;
32
- function buildSizeLabel(option, value, min, max) {
33
- if (value === undefined) {
32
+ // Reads an option that also has a deprecated `...Mb` spelling.
33
+ function buildSizeLabel(option, value, deprecatedValue, min, max) {
34
+ if (value !== undefined && deprecatedValue !== undefined) {
35
+ throw new Error(`Set ${option} or ${option}Mb, not both`);
36
+ }
37
+ const size = value ?? deprecatedValue;
38
+ if (size === undefined) {
34
39
  return undefined;
35
40
  }
36
- if (!Number.isInteger(value) || value < min || value > max) {
37
- throw new Error(`${option} must be an integer between ${min} and ${max} MiB`);
41
+ if (!Number.isInteger(size) || size < min || size > max) {
42
+ throw new Error(`${value !== undefined ? option : `${option}Mb`} must be an integer between ${min} and ${max} MB`);
38
43
  }
39
- return String(value);
44
+ return String(size);
40
45
  }
41
46
  function buildUploadMetadata(labels) {
42
47
  const metadata = {};
@@ -812,12 +817,12 @@ class ImageInstance {
812
817
  async build(options) {
813
818
  const { name, memory = 4096, timeout = 900000, onStatusChange, sandboxVersion = "latest" } = options;
814
819
  const buildLabels = {};
815
- const buildMemory = buildSizeLabel("buildMemoryMb", options.buildMemoryMb, 1, 32768);
820
+ const buildMemory = buildSizeLabel("buildMemory", options.buildMemory, options.buildMemoryMb, 1, 32768);
816
821
  if (buildMemory !== undefined) {
817
822
  buildLabels["x-blaxel-build-memory"] = buildMemory;
818
823
  }
819
824
  // Keep an explicit 0: it asks for memory-backed scratch instead of the default.
820
- const buildVolume = buildSizeLabel("buildVolumeMb", options.buildVolumeMb, 0, 131072);
825
+ const buildVolume = buildSizeLabel("buildVolume", options.buildVolume, options.buildVolumeMb, 0, 131072);
821
826
  if (buildVolume !== undefined) {
822
827
  buildLabels["x-blaxel-build-volume"] = buildVolume;
823
828
  }
@@ -594,7 +594,7 @@ let tempSourceDir;
594
594
  vitest_1.vi.unstubAllGlobals();
595
595
  });
596
596
  (0, vitest_1.it)("sends build memory and volume as labels and signed upload headers", async () => {
597
- const { create, upload } = await buildWith({ buildMemoryMb: 16384, buildVolumeMb: 32768 });
597
+ const { create, upload } = await buildWith({ buildMemory: 16384, buildVolume: 32768 });
598
598
  const labels = create.body.metadata?.labels;
599
599
  (0, vitest_1.expect)(labels?.["x-blaxel-build-memory"]).toBe("16384");
600
600
  (0, vitest_1.expect)(labels?.["x-blaxel-build-volume"]).toBe("32768");
@@ -604,20 +604,25 @@ let tempSourceDir;
604
604
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-auto-generated"]).toBeUndefined();
605
605
  });
606
606
  (0, vitest_1.it)("asks again when creating a sandbox does not sign the settings", async () => {
607
- const { upload } = await buildWith({ buildMemoryMb: 2048 }, undefined, "update");
607
+ const { upload } = await buildWith({ buildMemory: 2048 }, undefined, "update");
608
608
  (0, vitest_1.expect)(calls.filter((call) => call.url.includes("upload=true")).map((call) => call.method)).toEqual(["PUT", "POST", "PUT"]);
609
609
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-memory"]).toBe("2048");
610
610
  });
611
611
  (0, vitest_1.it)("fails clearly when the settings are never signed", async () => {
612
- await (0, vitest_1.expect)(buildWith({ buildVolumeMb: 32768 }, undefined, "none")).rejects.toThrow("x-blaxel-build-volume");
612
+ await (0, vitest_1.expect)(buildWith({ buildVolume: 32768 }, undefined, "none")).rejects.toThrow("x-blaxel-build-volume");
613
613
  (0, vitest_1.expect)(calls.some((call) => call.url.startsWith("https://upload.test"))).toBe(false);
614
614
  });
615
615
  (0, vitest_1.it)("drops stored labels the upload URL was not signed for", async () => {
616
616
  const { upload } = await buildWith({}, { "x-blaxel-auto-generated": "true", "x-blaxel-build-memory": "8192" }, "none");
617
617
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-memory"]).toBeUndefined();
618
618
  });
619
+ (0, vitest_1.it)("still accepts the deprecated Mb spellings", async () => {
620
+ const { create, upload } = await buildWith({ buildMemoryMb: 8192, buildVolumeMb: 0 });
621
+ (0, vitest_1.expect)(create.body.metadata?.labels?.["x-blaxel-build-memory"]).toBe("8192");
622
+ (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-volume"]).toBe("0");
623
+ });
619
624
  (0, vitest_1.it)("keeps an explicit zero volume", async () => {
620
- const { upload } = await buildWith({ buildVolumeMb: 0 });
625
+ const { upload } = await buildWith({ buildVolume: 0 });
621
626
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-volume"]).toBe("0");
622
627
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-memory"]).toBeUndefined();
623
628
  });
@@ -630,11 +635,15 @@ let tempSourceDir;
630
635
  (0, vitest_1.expect)(upload.headers["x-amz-meta-x-blaxel-build-memory"]).toBe("8192");
631
636
  });
632
637
  vitest_1.it.each([
633
- [{ buildMemoryMb: 0 }, "buildMemoryMb"],
634
- [{ buildMemoryMb: 32769 }, "buildMemoryMb"],
635
- [{ buildMemoryMb: 1.5 }, "buildMemoryMb"],
636
- [{ buildVolumeMb: -1 }, "buildVolumeMb"],
637
- [{ buildVolumeMb: 131073 }, "buildVolumeMb"],
638
+ [{ buildMemory: 0 }, "buildMemory must"],
639
+ [{ buildMemory: 32769 }, "buildMemory must"],
640
+ [{ buildMemory: 1.5 }, "buildMemory must"],
641
+ [{ buildVolume: -1 }, "buildVolume must"],
642
+ [{ buildVolume: 131073 }, "buildVolume must"],
643
+ [{ buildMemoryMb: 0 }, "buildMemoryMb must"],
644
+ [{ buildVolumeMb: -1 }, "buildVolumeMb must"],
645
+ [{ buildMemory: 2048, buildMemoryMb: 2048 }, "not both"],
646
+ [{ buildVolume: 0, buildVolumeMb: 0 }, "not both"],
638
647
  ])("rejects out-of-range %o before any request", async (options, option) => {
639
648
  const fetchSpy = vitest_1.vi.fn();
640
649
  vitest_1.vi.stubGlobal("fetch", fetchSpy);
@@ -27,7 +27,11 @@ export interface ImageBuildOptions {
27
27
  timeout?: number;
28
28
  onStatusChange?: (status: string) => void;
29
29
  sandboxVersion?: string;
30
+ buildMemory?: number;
31
+ buildVolume?: number;
32
+ /** @deprecated Use `buildMemory`. */
30
33
  buildMemoryMb?: number;
34
+ /** @deprecated Use `buildVolume`. */
31
35
  buildVolumeMb?: number;
32
36
  }
33
37
  /**
@@ -29,14 +29,18 @@ export interface ImageBuildOptions {
29
29
  onStatusChange?: (status: string) => void;
30
30
  sandboxVersion?: string;
31
31
  /**
32
- * Memory for the temporary build worker in MiB (1-32768). Same as
33
- * `bl push --memory`. Does not change the deployed sandbox's memory.
32
+ * Memory of the environment the image is built in, in MB (1-32768). Same as
33
+ * `bl push --memory`. Does not change the deployed sandbox's `memory`.
34
34
  */
35
- buildMemoryMb?: number;
35
+ buildMemory?: number;
36
36
  /**
37
- * Scratch disk for the temporary build worker in MiB (0-131072). Same as
38
- * `bl push --volume`; 0 uses memory-backed scratch.
37
+ * Disk attached to the build for its intermediate layers, in MB (0-131072).
38
+ * Same as `bl push --volume`; 0 builds in memory.
39
39
  */
40
+ buildVolume?: number;
41
+ /** @deprecated Use `buildMemory`. */
42
+ buildMemoryMb?: number;
43
+ /** @deprecated Use `buildVolume`. */
40
44
  buildVolumeMb?: number;
41
45
  }
42
46
  export interface PipInstallOptions {