tensorlake 0.5.139 → 0.5.141

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.
@@ -46,7 +46,7 @@ var init_defaults = __esm({
46
46
  "src/defaults.ts"() {
47
47
  "use strict";
48
48
  init_esm_shims();
49
- SDK_VERSION = "0.5.139";
49
+ SDK_VERSION = "0.5.141";
50
50
  API_URL = process.env.TENSORLAKE_API_URL ?? "https://api.tensorlake.ai";
51
51
  API_KEY = process.env.TENSORLAKE_API_KEY ?? void 0;
52
52
  NAMESPACE = process.env.INDEXIFY_NAMESPACE ?? "default";
@@ -57,6 +57,56 @@ var init_defaults = __esm({
57
57
  }
58
58
  });
59
59
 
60
+ // src/models.ts
61
+ function snakeToCamel(str) {
62
+ return str.replace(/_([a-z])/g, (_, ch) => ch.toUpperCase());
63
+ }
64
+ function parseTimestamp(v) {
65
+ if (v == null) return void 0;
66
+ if (v instanceof Date) return v;
67
+ if (typeof v === "string") {
68
+ const parsed = Date.parse(v);
69
+ return Number.isNaN(parsed) ? void 0 : new Date(parsed);
70
+ }
71
+ const ts = Number(v);
72
+ if (isNaN(ts)) return void 0;
73
+ if (ts > 1e15) return new Date(ts / 1e3);
74
+ if (ts > 1e12) return new Date(ts);
75
+ return new Date(ts * 1e3);
76
+ }
77
+ function fromSnakeKeys(obj, idField) {
78
+ if (Array.isArray(obj))
79
+ return obj.map((item) => fromSnakeKeys(item, idField));
80
+ if (obj !== null && typeof obj === "object" && !(obj instanceof Date)) {
81
+ const result = {};
82
+ for (const [k, v] of Object.entries(obj)) {
83
+ let key;
84
+ if (k === "id" && idField) {
85
+ key = idField;
86
+ } else {
87
+ key = snakeToCamel(k);
88
+ }
89
+ if (key.endsWith("At") || key === "timestamp" || key === "startedAt" || key === "endedAt") {
90
+ result[key] = parseTimestamp(v);
91
+ } else if (typeof v === "object" && v !== null && !Array.isArray(v)) {
92
+ result[key] = fromSnakeKeys(v);
93
+ } else if (Array.isArray(v)) {
94
+ result[key] = v.map((item) => fromSnakeKeys(item));
95
+ } else {
96
+ result[key] = v === null ? void 0 : v;
97
+ }
98
+ }
99
+ return result;
100
+ }
101
+ return obj;
102
+ }
103
+ var init_models = __esm({
104
+ "src/models.ts"() {
105
+ "use strict";
106
+ init_esm_shims();
107
+ }
108
+ });
109
+
60
110
  // src/errors.ts
61
111
  function formatErrorDetails(errorDetails) {
62
112
  if (errorDetails == null) return void 0;
@@ -79,7 +129,7 @@ function formatErrorDetails(errorDetails) {
79
129
  }
80
130
  return String(errorDetails);
81
131
  }
82
- var SandboxException, SandboxError, SandboxConnectionError, SandboxNotFoundError, PoolNotFoundError, PoolInUseError, RemoteAPIError, RequestNotFinishedError, RequestFailedError, RequestExecutionError;
132
+ var SandboxException, SandboxError, SandboxResizeError, SandboxConnectionError, SandboxNotFoundError, PoolNotFoundError, PoolInUseError, RemoteAPIError, RequestNotFinishedError, RequestFailedError, RequestExecutionError;
83
133
  var init_errors = __esm({
84
134
  "src/errors.ts"() {
85
135
  "use strict";
@@ -100,6 +150,25 @@ var init_errors = __esm({
100
150
  if (options?.sandboxId !== void 0) this.sandboxId = options.sandboxId;
101
151
  }
102
152
  };
153
+ SandboxResizeError = class extends SandboxError {
154
+ generation;
155
+ info;
156
+ constructor(payload) {
157
+ const resources = payload.info?.resources;
158
+ const allocation = resources ? `${resources.cpus} CPUs, ${resources.memoryMb} MiB memory, ${resources.diskMb} MiB disk` : "unavailable";
159
+ super(
160
+ `Sandbox ${payload.sandboxId} resize generation ${payload.generation}: ${payload.message}; last confirmed allocation: ${allocation}`,
161
+ { reason: payload.reason, sandboxId: payload.sandboxId }
162
+ );
163
+ this.name = "SandboxResizeError";
164
+ this.generation = payload.generation;
165
+ this.info = payload.info ?? void 0;
166
+ }
167
+ /** Last confirmed allocation, if an observation was available. */
168
+ get confirmedResources() {
169
+ return this.info?.resources;
170
+ }
171
+ };
103
172
  SandboxConnectionError = class extends SandboxError {
104
173
  constructor(message, options) {
105
174
  super(`Connection error: ${message}`);
@@ -445,7 +514,7 @@ var init_native_worker_client = __esm({
445
514
  }
446
515
  };
447
516
  runtimeKey = /* @__PURE__ */ Symbol.for(
448
- `tensorlake.native.worker.${false ? "source" : "0.5.139"}.v1`
517
+ `tensorlake.native.worker.${false ? "source" : "0.5.141"}.v1`
449
518
  );
450
519
  runtimes = globalThis;
451
520
  }
@@ -478,6 +547,11 @@ function translateNativeError(error, context) {
478
547
  return new SandboxError(String(error));
479
548
  }
480
549
  const { category, status, message } = payload;
550
+ if (category === "resize") {
551
+ return new SandboxResizeError(
552
+ fromSnakeKeys(JSON.parse(message), "sandboxId")
553
+ );
554
+ }
481
555
  if (category === "connection") {
482
556
  return new SandboxConnectionError(message, { cause: error });
483
557
  }
@@ -568,6 +642,7 @@ var init_native_sandbox = __esm({
568
642
  "src/native-sandbox.ts"() {
569
643
  "use strict";
570
644
  init_esm_shims();
645
+ init_models();
571
646
  init_errors();
572
647
  init_native_worker_client();
573
648
  init_native_worker_protocol();
@@ -658,56 +733,6 @@ var init_native_cloud = __esm({
658
733
  }
659
734
  });
660
735
 
661
- // src/models.ts
662
- function snakeToCamel(str) {
663
- return str.replace(/_([a-z])/g, (_, ch) => ch.toUpperCase());
664
- }
665
- function parseTimestamp(v) {
666
- if (v == null) return void 0;
667
- if (v instanceof Date) return v;
668
- if (typeof v === "string") {
669
- const parsed = Date.parse(v);
670
- return Number.isNaN(parsed) ? void 0 : new Date(parsed);
671
- }
672
- const ts = Number(v);
673
- if (isNaN(ts)) return void 0;
674
- if (ts > 1e15) return new Date(ts / 1e3);
675
- if (ts > 1e12) return new Date(ts);
676
- return new Date(ts * 1e3);
677
- }
678
- function fromSnakeKeys(obj, idField) {
679
- if (Array.isArray(obj))
680
- return obj.map((item) => fromSnakeKeys(item, idField));
681
- if (obj !== null && typeof obj === "object" && !(obj instanceof Date)) {
682
- const result = {};
683
- for (const [k, v] of Object.entries(obj)) {
684
- let key;
685
- if (k === "id" && idField) {
686
- key = idField;
687
- } else {
688
- key = snakeToCamel(k);
689
- }
690
- if (key.endsWith("At") || key === "timestamp" || key === "startedAt" || key === "endedAt") {
691
- result[key] = parseTimestamp(v);
692
- } else if (typeof v === "object" && v !== null && !Array.isArray(v)) {
693
- result[key] = fromSnakeKeys(v);
694
- } else if (Array.isArray(v)) {
695
- result[key] = v.map((item) => fromSnakeKeys(item));
696
- } else {
697
- result[key] = v === null ? void 0 : v;
698
- }
699
- }
700
- return result;
701
- }
702
- return obj;
703
- }
704
- var init_models = __esm({
705
- "src/models.ts"() {
706
- "use strict";
707
- init_esm_shims();
708
- }
709
- });
710
-
711
736
  // src/cloud-client.ts
712
737
  import { nanoid } from "nanoid";
713
738
  function secretFromMetadata(metadata) {
@@ -1749,7 +1774,7 @@ async function runCreateSandboxImageCli(argv = process.argv.slice(2)) {
1749
1774
  const dockerfilePath = parsed.positionals[0];
1750
1775
  if (!dockerfilePath) {
1751
1776
  throw new Error(
1752
- "Usage: tensorlake-create-sandbox-image <dockerfile_path> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]"
1777
+ "Usage: tensorlake-create-sandbox-image <dockerfile_path> [--name NAME] [--cpus N] [--memory MiB] [--disk_mb MiB] [--builder_disk_mb MiB] [--docker_compat] [--public]"
1753
1778
  );
1754
1779
  }
1755
1780
  const cpus = parsed.values.cpus != null ? Number(parsed.values.cpus) : void 0;
@@ -1801,7 +1826,7 @@ async function runImportSandboxImageCli(argv = process.argv.slice(2)) {
1801
1826
  const imageReference = parsed.positionals[0];
1802
1827
  if (!imageReference) {
1803
1828
  throw new Error(
1804
- "Usage: tensorlake-import-sandbox-image <image_reference> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]"
1829
+ "Usage: tensorlake-import-sandbox-image <image_reference> [--name NAME] [--cpus N] [--memory MiB] [--disk_mb MiB] [--builder_disk_mb MiB] [--docker_compat] [--public]"
1805
1830
  );
1806
1831
  }
1807
1832
  const cpus = parsed.values.cpus != null ? Number(parsed.values.cpus) : void 0;