@blaxel/core 0.2.43-dev.196 → 0.2.43-dev.199

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 (194) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/authentication/index.js +4 -30
  3. package/dist/cjs/cache/index.js +3 -16
  4. package/dist/cjs/common/browser.js +22 -0
  5. package/dist/cjs/common/env.js +12 -24
  6. package/dist/cjs/common/node.js +13 -25
  7. package/dist/cjs/common/settings.js +2 -2
  8. package/dist/cjs/sandbox/filesystem/filesystem.js +12 -13
  9. package/dist/cjs/sandbox/sandbox.js +2 -2
  10. package/dist/cjs/types/common/browser.d.ts +5 -0
  11. package/dist/cjs/types/common/node.d.ts +1 -2
  12. package/dist/cjs/types/sandbox/filesystem/filesystem.d.ts +6 -2
  13. package/dist/cjs-browser/.tsbuildinfo +1 -0
  14. package/dist/cjs-browser/agents/index.js +109 -0
  15. package/dist/cjs-browser/authentication/apikey.js +24 -0
  16. package/dist/cjs-browser/authentication/clientcredentials.js +85 -0
  17. package/dist/cjs-browser/authentication/credentials.js +17 -0
  18. package/dist/cjs-browser/authentication/deviceMode.js +70 -0
  19. package/dist/cjs-browser/authentication/index.js +62 -0
  20. package/dist/cjs-browser/authentication/types.js +2 -0
  21. package/dist/cjs-browser/cache/index.js +26 -0
  22. package/dist/cjs-browser/client/authentication.js +15 -0
  23. package/dist/cjs-browser/client/client.gen.js +8 -0
  24. package/dist/cjs-browser/client/client.js +17 -0
  25. package/dist/cjs-browser/client/index.js +19 -0
  26. package/dist/cjs-browser/client/interceptors.js +17 -0
  27. package/dist/cjs-browser/client/sdk.gen.js +1824 -0
  28. package/dist/cjs-browser/client/types.gen.js +4 -0
  29. package/dist/cjs-browser/common/autoload.js +27 -0
  30. package/dist/cjs-browser/common/env.js +57 -0
  31. package/dist/cjs-browser/common/errors.js +17 -0
  32. package/dist/cjs-browser/common/internal.js +228 -0
  33. package/dist/cjs-browser/common/internal.test.js +39 -0
  34. package/dist/cjs-browser/common/logger.js +69 -0
  35. package/dist/cjs-browser/common/node.js +22 -0
  36. package/dist/cjs-browser/common/settings.js +181 -0
  37. package/dist/cjs-browser/index.browser.test.js +45 -0
  38. package/dist/cjs-browser/index.js +34 -0
  39. package/dist/cjs-browser/jobs/index.js +19 -0
  40. package/dist/cjs-browser/jobs/jobs.js +90 -0
  41. package/dist/cjs-browser/jobs/start.js +66 -0
  42. package/dist/cjs-browser/jobs/types.js +2 -0
  43. package/dist/cjs-browser/mcp/client.js +235 -0
  44. package/dist/cjs-browser/mcp/index.js +18 -0
  45. package/dist/cjs-browser/mcp/server.js +213 -0
  46. package/dist/cjs-browser/models/index.js +31 -0
  47. package/dist/cjs-browser/sandbox/action.js +83 -0
  48. package/dist/cjs-browser/sandbox/client/client.gen.js +6 -0
  49. package/dist/cjs-browser/sandbox/client/index.js +19 -0
  50. package/dist/cjs-browser/sandbox/client/sdk.gen.js +289 -0
  51. package/dist/cjs-browser/sandbox/client/types.gen.js +3 -0
  52. package/dist/cjs-browser/sandbox/filesystem/filesystem.js +240 -0
  53. package/dist/cjs-browser/sandbox/filesystem/index.js +18 -0
  54. package/dist/cjs-browser/sandbox/filesystem/types.js +2 -0
  55. package/dist/cjs-browser/sandbox/index.js +36 -0
  56. package/dist/cjs-browser/sandbox/network/index.js +17 -0
  57. package/dist/cjs-browser/sandbox/network/network.js +10 -0
  58. package/dist/cjs-browser/sandbox/preview.js +148 -0
  59. package/dist/cjs-browser/sandbox/process/index.js +17 -0
  60. package/dist/cjs-browser/sandbox/process/process.js +189 -0
  61. package/dist/cjs-browser/sandbox/sandbox.js +180 -0
  62. package/dist/cjs-browser/sandbox/session.js +123 -0
  63. package/dist/cjs-browser/sandbox/types.js +81 -0
  64. package/dist/cjs-browser/telemetry/telemetry.js +80 -0
  65. package/dist/cjs-browser/tools/index.js +52 -0
  66. package/dist/cjs-browser/tools/mcpTool.js +254 -0
  67. package/dist/cjs-browser/tools/types.js +2 -0
  68. package/dist/cjs-browser/tools/zodSchema.js +50 -0
  69. package/dist/cjs-browser/types/agents/index.d.ts +15 -0
  70. package/dist/cjs-browser/types/authentication/apikey.d.ts +10 -0
  71. package/dist/cjs-browser/types/authentication/clientcredentials.d.ts +17 -0
  72. package/dist/cjs-browser/types/authentication/credentials.d.ts +6 -0
  73. package/dist/cjs-browser/types/authentication/deviceMode.d.ts +15 -0
  74. package/dist/cjs-browser/types/authentication/index.d.ts +3 -0
  75. package/dist/cjs-browser/types/authentication/types.d.ts +9 -0
  76. package/dist/cjs-browser/types/cache/index.d.ts +1 -0
  77. package/dist/cjs-browser/types/client/authentication.d.ts +25 -0
  78. package/dist/cjs-browser/types/client/client.d.ts +2 -0
  79. package/dist/cjs-browser/types/client/client.gen.d.ts +12 -0
  80. package/dist/cjs-browser/types/client/index.d.ts +2 -0
  81. package/dist/cjs-browser/types/client/interceptors.d.ts +3 -0
  82. package/dist/cjs-browser/types/client/sdk.gen.d.ts +519 -0
  83. package/dist/cjs-browser/types/client/types.gen.d.ts +4950 -0
  84. package/dist/cjs-browser/types/common/autoload.d.ts +3 -0
  85. package/dist/cjs-browser/types/common/browser.d.ts +5 -0
  86. package/dist/cjs-browser/types/common/env.d.ts +5 -0
  87. package/dist/cjs-browser/types/common/errors.d.ts +1 -0
  88. package/dist/cjs-browser/types/common/internal.d.ts +6 -0
  89. package/dist/cjs-browser/types/common/internal.test.d.ts +1 -0
  90. package/dist/cjs-browser/types/common/logger.d.ts +25 -0
  91. package/dist/cjs-browser/types/common/node.d.ts +6 -0
  92. package/dist/cjs-browser/types/common/settings.d.ts +32 -0
  93. package/dist/cjs-browser/types/index.browser.test.d.ts +1 -0
  94. package/dist/cjs-browser/types/index.d.ts +18 -0
  95. package/dist/cjs-browser/types/jobs/index.d.ts +3 -0
  96. package/dist/cjs-browser/types/jobs/jobs.d.ts +13 -0
  97. package/dist/cjs-browser/types/jobs/start.d.ts +1 -0
  98. package/dist/cjs-browser/types/jobs/types.d.ts +3 -0
  99. package/dist/cjs-browser/types/mcp/client.d.ts +28 -0
  100. package/dist/cjs-browser/types/mcp/index.d.ts +2 -0
  101. package/dist/cjs-browser/types/mcp/server.d.ts +24 -0
  102. package/dist/cjs-browser/types/models/index.d.ts +8 -0
  103. package/dist/cjs-browser/types/sandbox/action.d.ts +19 -0
  104. package/dist/cjs-browser/types/sandbox/client/client.gen.d.ts +12 -0
  105. package/dist/cjs-browser/types/sandbox/client/index.d.ts +2 -0
  106. package/dist/cjs-browser/types/sandbox/client/sdk.gen.d.ts +101 -0
  107. package/dist/cjs-browser/types/sandbox/client/types.gen.d.ts +578 -0
  108. package/dist/cjs-browser/types/sandbox/filesystem/filesystem.d.ts +27 -0
  109. package/dist/cjs-browser/types/sandbox/filesystem/index.d.ts +2 -0
  110. package/dist/cjs-browser/types/sandbox/filesystem/types.d.ts +15 -0
  111. package/dist/cjs-browser/types/sandbox/index.d.ts +4 -0
  112. package/dist/cjs-browser/types/sandbox/network/index.d.ts +1 -0
  113. package/dist/cjs-browser/types/sandbox/network/network.d.ts +5 -0
  114. package/dist/cjs-browser/types/sandbox/preview.d.ts +37 -0
  115. package/dist/cjs-browser/types/sandbox/process/index.d.ts +1 -0
  116. package/dist/cjs-browser/types/sandbox/process/process.d.ts +24 -0
  117. package/dist/cjs-browser/types/sandbox/sandbox.d.ts +33 -0
  118. package/dist/cjs-browser/types/sandbox/session.d.ts +27 -0
  119. package/dist/cjs-browser/types/sandbox/types.d.ts +52 -0
  120. package/dist/cjs-browser/types/telemetry/telemetry.d.ts +62 -0
  121. package/dist/cjs-browser/types/tools/index.d.ts +12 -0
  122. package/dist/cjs-browser/types/tools/mcpTool.d.ts +33 -0
  123. package/dist/cjs-browser/types/tools/types.d.ts +8 -0
  124. package/dist/cjs-browser/types/tools/zodSchema.d.ts +82 -0
  125. package/dist/cjs-browser/types/volume/index.d.ts +23 -0
  126. package/dist/cjs-browser/volume/index.js +113 -0
  127. package/dist/esm/.tsbuildinfo +1 -1
  128. package/dist/esm/authentication/index.js +1 -27
  129. package/dist/esm/cache/index.js +2 -15
  130. package/dist/esm/common/browser.js +18 -0
  131. package/dist/esm/common/env.js +7 -19
  132. package/dist/esm/common/node.js +10 -21
  133. package/dist/esm/common/settings.js +2 -2
  134. package/dist/esm/sandbox/filesystem/filesystem.js +13 -14
  135. package/dist/esm/sandbox/sandbox.js +2 -2
  136. package/dist/esm-browser/.tsbuildinfo +1 -0
  137. package/dist/esm-browser/agents/index.js +104 -0
  138. package/dist/esm-browser/authentication/apikey.js +20 -0
  139. package/dist/esm-browser/authentication/clientcredentials.js +81 -0
  140. package/dist/esm-browser/authentication/credentials.js +13 -0
  141. package/dist/esm-browser/authentication/deviceMode.js +66 -0
  142. package/dist/esm-browser/authentication/index.js +56 -0
  143. package/dist/esm-browser/authentication/types.js +1 -0
  144. package/dist/esm-browser/cache/index.js +20 -0
  145. package/dist/esm-browser/client/authentication.js +11 -0
  146. package/dist/esm-browser/client/client.gen.js +5 -0
  147. package/dist/esm-browser/client/client.js +1 -0
  148. package/dist/esm-browser/client/index.js +3 -0
  149. package/dist/esm-browser/client/interceptors.js +14 -0
  150. package/dist/esm-browser/client/sdk.gen.js +1717 -0
  151. package/dist/esm-browser/client/types.gen.js +3 -0
  152. package/dist/esm-browser/common/autoload.js +23 -0
  153. package/dist/esm-browser/common/env.js +51 -0
  154. package/dist/esm-browser/common/errors.js +14 -0
  155. package/dist/esm-browser/common/internal.js +220 -0
  156. package/dist/esm-browser/common/internal.test.js +37 -0
  157. package/dist/esm-browser/common/logger.js +65 -0
  158. package/dist/esm-browser/common/node.js +18 -0
  159. package/dist/esm-browser/common/settings.js +178 -0
  160. package/dist/esm-browser/index.browser.test.js +10 -0
  161. package/dist/esm-browser/index.js +18 -0
  162. package/dist/esm-browser/jobs/index.js +3 -0
  163. package/dist/esm-browser/jobs/jobs.js +86 -0
  164. package/dist/esm-browser/jobs/start.js +62 -0
  165. package/dist/esm-browser/jobs/types.js +1 -0
  166. package/dist/esm-browser/mcp/client.js +231 -0
  167. package/dist/esm-browser/mcp/index.js +2 -0
  168. package/dist/esm-browser/mcp/server.js +176 -0
  169. package/dist/esm-browser/models/index.js +25 -0
  170. package/dist/esm-browser/package.json +1 -0
  171. package/dist/esm-browser/sandbox/action.js +78 -0
  172. package/dist/esm-browser/sandbox/client/client.gen.js +3 -0
  173. package/dist/esm-browser/sandbox/client/index.js +3 -0
  174. package/dist/esm-browser/sandbox/client/sdk.gen.js +270 -0
  175. package/dist/esm-browser/sandbox/client/types.gen.js +2 -0
  176. package/dist/esm-browser/sandbox/filesystem/filesystem.js +236 -0
  177. package/dist/esm-browser/sandbox/filesystem/index.js +2 -0
  178. package/dist/esm-browser/sandbox/filesystem/types.js +1 -0
  179. package/dist/esm-browser/sandbox/index.js +7 -0
  180. package/dist/esm-browser/sandbox/network/index.js +1 -0
  181. package/dist/esm-browser/sandbox/network/network.js +6 -0
  182. package/dist/esm-browser/sandbox/preview.js +141 -0
  183. package/dist/esm-browser/sandbox/process/index.js +1 -0
  184. package/dist/esm-browser/sandbox/process/process.js +185 -0
  185. package/dist/esm-browser/sandbox/sandbox.js +176 -0
  186. package/dist/esm-browser/sandbox/session.js +119 -0
  187. package/dist/esm-browser/sandbox/types.js +76 -0
  188. package/dist/esm-browser/telemetry/telemetry.js +74 -0
  189. package/dist/esm-browser/tools/index.js +44 -0
  190. package/dist/esm-browser/tools/mcpTool.js +249 -0
  191. package/dist/esm-browser/tools/types.js +1 -0
  192. package/dist/esm-browser/tools/zodSchema.js +43 -0
  193. package/dist/esm-browser/volume/index.js +109 -0
  194. package/package.json +16 -4
@@ -0,0 +1,249 @@
1
+ import { Client as ModelContextProtocolClient } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { env } from "../common/env.js";
3
+ import { generateInternalUrl, getForcedUrl } from "../common/internal.js";
4
+ import { logger } from "../common/logger.js";
5
+ import { settings } from "../common/settings.js";
6
+ import { authenticate } from "../index.js";
7
+ import { BlaxelMcpClientTransport } from "../mcp/client.js";
8
+ import { startSpan } from "../telemetry/telemetry.js";
9
+ import { schemaToZodSchema } from "./zodSchema.js";
10
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
11
+ const McpToolCache = new Map();
12
+ export class McpTool {
13
+ name;
14
+ type;
15
+ pluralType;
16
+ client;
17
+ transport;
18
+ timer;
19
+ ms;
20
+ transportName;
21
+ meta;
22
+ startPromise;
23
+ constructor(name, options = { ms: 5000 }) {
24
+ this.name = name;
25
+ this.type = "function";
26
+ this.pluralType = "functions";
27
+ if (name.startsWith("sandbox/") || name.startsWith("sandboxes/")) {
28
+ this.name = name.split("/")[1];
29
+ this.type = "sandbox";
30
+ this.pluralType = "sandboxes";
31
+ }
32
+ if (env.BL_CLOUD) {
33
+ this.ms = 0;
34
+ }
35
+ else {
36
+ this.ms = typeof options === "number" ? options : options.ms || 5000;
37
+ }
38
+ this.meta = (typeof options === "object" && options.meta) || undefined;
39
+ this.client = new ModelContextProtocolClient({
40
+ name: this.name,
41
+ version: "1.0.0",
42
+ }, {
43
+ capabilities: {
44
+ tools: {},
45
+ },
46
+ });
47
+ }
48
+ get fallbackUrl() {
49
+ if (this.externalUrl != this.url) {
50
+ return this.externalUrl;
51
+ }
52
+ return null;
53
+ }
54
+ get externalUrl() {
55
+ return new URL(`${settings.runUrl}/${settings.workspace}/${this.pluralType}/${this.name}`);
56
+ }
57
+ get internalUrl() {
58
+ const url = generateInternalUrl(settings.workspace, this.type, this.name, settings.env, settings.runInternalProtocol, settings.runInternalHostname, settings.blCloud, settings.workspaceId);
59
+ return new URL(url);
60
+ }
61
+ get forcedUrl() {
62
+ return getForcedUrl(this.type, this.name);
63
+ }
64
+ get url() {
65
+ if (this.forcedUrl)
66
+ return this.forcedUrl;
67
+ if (settings.runInternalHostname)
68
+ return this.internalUrl;
69
+ return this.externalUrl;
70
+ }
71
+ async start() {
72
+ logger.debug(`MCP:${this.name}:start`);
73
+ this.stopCloseTimer();
74
+ this.startPromise = this.startPromise || (async () => {
75
+ await authenticate();
76
+ try {
77
+ logger.debug(`MCP:${this.name}:Connecting::${this.url.toString()}`);
78
+ this.transport = await this.getTransport();
79
+ await this.client.connect(this.transport);
80
+ logger.debug(`MCP:${this.name}:Connected`);
81
+ }
82
+ catch (err) {
83
+ if (err instanceof Error) {
84
+ logger.error(`MCP ${this.name} connection failed: ${err.message}`, {
85
+ error: err.message,
86
+ stack: err.stack,
87
+ mcpName: this.name,
88
+ url: this.url
89
+ });
90
+ }
91
+ if (!this.fallbackUrl) {
92
+ throw err;
93
+ }
94
+ logger.debug(`MCP:${this.name}:Connecting to fallback`);
95
+ this.transport = await this.getTransport(this.fallbackUrl);
96
+ await this.client.connect(this.transport);
97
+ logger.debug(`MCP:${this.name}:Connected to fallback`);
98
+ }
99
+ })();
100
+ return await this.startPromise;
101
+ }
102
+ async close(now = false) {
103
+ logger.debug(`MCP:${this.name}:Close in ${now ? 0 : this.ms}ms`);
104
+ if (now || !this.ms) {
105
+ if (this.timer) {
106
+ clearTimeout(this.timer);
107
+ }
108
+ delete this.startPromise;
109
+ return this.client.close();
110
+ }
111
+ this.timer = setTimeout(() => {
112
+ logger.debug(`MCP:${this.name}:CloseTimer`);
113
+ delete this.startPromise;
114
+ this.client.close().catch((err) => {
115
+ if (err instanceof Error) {
116
+ logger.error(`MCP ${this.name} close failed: ${err.message}`, {
117
+ error: err.message,
118
+ stack: err.stack,
119
+ mcpName: this.name
120
+ });
121
+ }
122
+ });
123
+ }, now ? 0 : this.ms);
124
+ }
125
+ stopCloseTimer() {
126
+ logger.debug(`MCP:${this.name}:StopCloseTimer`);
127
+ if (this.timer) {
128
+ clearTimeout(this.timer);
129
+ this.timer = undefined;
130
+ }
131
+ }
132
+ async listTools() {
133
+ const span = startSpan(this.name, {
134
+ attributes: {
135
+ "span.type": "tool.list",
136
+ },
137
+ });
138
+ try {
139
+ logger.debug(`MCP:${this.name}:Listing tools`);
140
+ await this.start();
141
+ const { tools } = (await this.client.listTools());
142
+ await this.close();
143
+ const result = tools.map((tool) => {
144
+ return {
145
+ name: tool.name,
146
+ description: tool.description,
147
+ inputSchema: schemaToZodSchema(tool.inputSchema),
148
+ originalSchema: tool.inputSchema,
149
+ call: (input) => {
150
+ return this.call(tool.name, input);
151
+ },
152
+ };
153
+ });
154
+ span.setAttribute("tool.list.result", JSON.stringify(result));
155
+ return result;
156
+ }
157
+ catch (err) {
158
+ span.setStatus("error");
159
+ span.recordException(err);
160
+ throw err;
161
+ }
162
+ finally {
163
+ span.end();
164
+ }
165
+ }
166
+ async call(toolName, args) {
167
+ const span = startSpan(this.name + "." + toolName, {
168
+ attributes: {
169
+ "span.type": "tool.call",
170
+ "tool.name": toolName,
171
+ "tool.args": JSON.stringify(args),
172
+ },
173
+ });
174
+ try {
175
+ logger.debug(`MCP:${this.name}:Tool calling`, toolName, JSON.stringify(args));
176
+ logger.debug(`MCP:${this.name}:Tool calling:start`);
177
+ await this.start();
178
+ logger.debug(`MCP:${this.name}:Tool calling:start2`);
179
+ const result = await this.client.callTool({
180
+ name: toolName,
181
+ arguments: args,
182
+ _meta: this.meta
183
+ });
184
+ logger.debug(`MCP:${this.name}:Tool calling:result`);
185
+ await this.close();
186
+ logger.debug(`MCP:${this.name}:Tool result`, toolName, JSON.stringify(args));
187
+ span.setAttribute("tool.call.result", JSON.stringify(result));
188
+ return result;
189
+ }
190
+ catch (err) {
191
+ if (err instanceof Error) {
192
+ logger.error(`MCP tool call failed: ${err.message}`, {
193
+ error: err.message,
194
+ stack: err.stack,
195
+ mcpName: this.name,
196
+ toolName,
197
+ args: JSON.stringify(args)
198
+ });
199
+ }
200
+ throw err;
201
+ }
202
+ finally {
203
+ span.end();
204
+ }
205
+ }
206
+ async getTransport(forcedUrl) {
207
+ if (!this.transportName) {
208
+ // Detect transport type dynamically by querying the function's endpoint
209
+ try {
210
+ const testUrl = (forcedUrl || this.url).toString();
211
+ const response = await fetch(testUrl + "/", {
212
+ method: "GET",
213
+ headers: settings.headers,
214
+ });
215
+ const responseText = await response.text();
216
+ if (responseText.toLowerCase().includes("websocket")) {
217
+ this.transportName = "websocket";
218
+ }
219
+ else {
220
+ this.transportName = "http-stream";
221
+ }
222
+ logger.debug(`Detected transport type for ${this.name}: ${this.transportName}`);
223
+ }
224
+ catch (error) {
225
+ // Default to websocket if we can't determine the transport type
226
+ const message = error instanceof Error ? error.message : String(error);
227
+ logger.warn(`Failed to detect transport type for ${this.name}: ${message}. Defaulting to websocket.`);
228
+ this.transportName = "websocket";
229
+ }
230
+ }
231
+ const url = forcedUrl || this.url;
232
+ if (this.transportName === "http-stream") {
233
+ url.pathname = url.pathname + "/mcp";
234
+ return new StreamableHTTPClientTransport(url, { requestInit: { headers: settings.headers } });
235
+ }
236
+ else {
237
+ return new BlaxelMcpClientTransport(url.toString(), settings.headers, { retry: { max: 0 } });
238
+ }
239
+ }
240
+ }
241
+ export const getMcpTool = async (name, options) => {
242
+ let tool = McpToolCache.get(name);
243
+ if (!tool) {
244
+ logger.debug(`MCP:${name}:Creating new tool`);
245
+ tool = new McpTool(name, options);
246
+ McpToolCache.set(name, tool);
247
+ }
248
+ return await tool.listTools();
249
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ import z from "zod";
2
+ /**
3
+ * Converts an array of `FunctionSchema` objects into a Zod schema for validation.
4
+ *
5
+ * @param {FunctionSchema} parameters - The parameters to convert.
6
+ * @returns {z.ZodObject<any>} A Zod object schema representing the parameters.
7
+ */
8
+ export const schemaToZodSchema = (schema) => {
9
+ const shape = {};
10
+ if (schema.properties) {
11
+ Object.entries(schema.properties).forEach(([key, param]) => {
12
+ let zodType;
13
+ switch (param.type) {
14
+ case "boolean":
15
+ zodType = z.boolean();
16
+ break;
17
+ case "number":
18
+ case "integer":
19
+ zodType = z.number();
20
+ break;
21
+ case "null":
22
+ zodType = z.null();
23
+ break;
24
+ case "array":
25
+ zodType = z.array(schemaToZodSchema(param.items || {}));
26
+ break;
27
+ case "object":
28
+ zodType = schemaToZodSchema(param);
29
+ break;
30
+ default:
31
+ zodType = z.string();
32
+ }
33
+ if (param.description) {
34
+ zodType = zodType.describe(param.description);
35
+ }
36
+ shape[key] =
37
+ param.required || schema.required?.includes(key)
38
+ ? zodType
39
+ : zodType.optional();
40
+ });
41
+ }
42
+ return z.object(shape);
43
+ };
@@ -0,0 +1,109 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import { createVolume, deleteVolume, getVolume, listVolumes } from "../client/index.js";
3
+ export class VolumeInstance {
4
+ volume;
5
+ constructor(volume) {
6
+ this.volume = volume;
7
+ }
8
+ get metadata() {
9
+ return this.volume.metadata;
10
+ }
11
+ get spec() {
12
+ return this.volume.spec;
13
+ }
14
+ get status() {
15
+ return this.volume.status;
16
+ }
17
+ get name() {
18
+ return this.volume.metadata?.name;
19
+ }
20
+ get displayName() {
21
+ return this.volume.metadata?.displayName;
22
+ }
23
+ get size() {
24
+ return this.volume.spec?.size;
25
+ }
26
+ get region() {
27
+ return this.volume.spec?.region;
28
+ }
29
+ static async create(config) {
30
+ const defaultName = `volume-${uuidv4().replace(/-/g, '').substring(0, 8)}`;
31
+ const defaultSize = 1024; // 1GB in MB
32
+ let volume;
33
+ // Handle VolumeCreateConfiguration or simple config object
34
+ if ('spec' in config && 'metadata' in config) {
35
+ // It's already a Volume object
36
+ volume = config;
37
+ }
38
+ else {
39
+ // It's a VolumeCreateConfiguration
40
+ const volumeConfig = config;
41
+ volume = {
42
+ metadata: {
43
+ name: volumeConfig.name || defaultName,
44
+ displayName: volumeConfig.displayName || volumeConfig.name || defaultName
45
+ },
46
+ spec: {
47
+ size: volumeConfig.size || defaultSize,
48
+ region: volumeConfig.region
49
+ }
50
+ };
51
+ }
52
+ // Ensure required fields have defaults
53
+ if (!volume.metadata) {
54
+ volume.metadata = { name: defaultName };
55
+ }
56
+ if (!volume.metadata.name) {
57
+ volume.metadata.name = defaultName;
58
+ }
59
+ if (!volume.spec) {
60
+ volume.spec = { size: defaultSize };
61
+ }
62
+ if (!volume.spec.size) {
63
+ volume.spec.size = defaultSize;
64
+ }
65
+ const { data } = await createVolume({
66
+ body: volume,
67
+ throwOnError: true,
68
+ });
69
+ return new VolumeInstance(data);
70
+ }
71
+ static async get(volumeName) {
72
+ const { data } = await getVolume({
73
+ path: {
74
+ volumeName,
75
+ },
76
+ throwOnError: true,
77
+ });
78
+ return new VolumeInstance(data);
79
+ }
80
+ static async list() {
81
+ const { data } = await listVolumes({ throwOnError: true });
82
+ return data.map((volume) => new VolumeInstance(volume));
83
+ }
84
+ static async delete(volumeName) {
85
+ const { data } = await deleteVolume({
86
+ path: {
87
+ volumeName,
88
+ },
89
+ throwOnError: true,
90
+ });
91
+ return data;
92
+ }
93
+ static async createIfNotExists(config) {
94
+ try {
95
+ return await VolumeInstance.create(config);
96
+ }
97
+ catch (e) {
98
+ if (typeof e === "object" && e !== null && "code" in e && (e.code === 409 || e.code === 'VOLUME_ALREADY_EXISTS')) {
99
+ const name = 'name' in config ? config.name : config.metadata?.name;
100
+ if (!name) {
101
+ throw new Error("Volume name is required");
102
+ }
103
+ const volumeInstance = await VolumeInstance.get(name);
104
+ return volumeInstance;
105
+ }
106
+ throw e;
107
+ }
108
+ }
109
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaxel/core",
3
- "version": "0.2.43-dev.196",
3
+ "version": "0.2.43-dev.199",
4
4
  "description": "Blaxel Core SDK for TypeScript",
5
5
  "license": "MIT",
6
6
  "author": "Blaxel, INC (https://blaxel.ai)",
@@ -19,10 +19,21 @@
19
19
  ],
20
20
  "main": "./dist/cjs/index.js",
21
21
  "module": "./dist/esm/index.js",
22
+ "browser": "./dist/esm-browser/index.js",
22
23
  "types": "./dist/cjs/types/index.d.ts",
23
24
  "exports": {
24
25
  ".": {
25
26
  "types": "./dist/cjs/types/index.d.ts",
27
+ "browser": {
28
+ "import": "./dist/esm-browser/index.js",
29
+ "require": "./dist/cjs-browser/index.js",
30
+ "default": "./dist/esm-browser/index.js"
31
+ },
32
+ "node": {
33
+ "import": "./dist/esm/index.js",
34
+ "require": "./dist/cjs/index.js",
35
+ "default": "./dist/cjs/index.js"
36
+ },
26
37
  "import": "./dist/esm/index.js",
27
38
  "require": "./dist/cjs/index.js",
28
39
  "default": "./dist/cjs/index.js"
@@ -63,17 +74,18 @@
63
74
  "vite": "^5.2.0",
64
75
  "vitest": "^1.5.0"
65
76
  },
66
- "commit": "06f9febf3efcdd8e281706bd186624c5f0c0a51b",
77
+ "commit": "f0e8fd40aacd9997e2a873e83577658212c0134f",
67
78
  "scripts": {
68
79
  "lint": "eslint src/",
69
80
  "dev": "tsc --watch",
70
- "build": "npm run build:inject-commit && npm run build:cjs && npm run build:esm && npm run build:fix-esm && npm run build:esm-package && npm run build:replace-imports",
81
+ "build": "npm run build:inject-commit && npm run build:cjs && npm run build:esm && npm run build:fix-esm && npm run build:esm-package && npm run build:replace-imports && npm run build:browser",
71
82
  "build:cjs": "NODE_OPTIONS='--max-old-space-size=8192' tsc -p tsconfig.cjs.json",
72
83
  "build:esm": "NODE_OPTIONS='--max-old-space-size=8192' tsc -p tsconfig.esm.json",
73
84
  "build:fix-esm": "node fix-esm-imports.js",
74
85
  "build:esm-package": "echo '{\"type\":\"module\"}' > dist/esm/package.json",
86
+ "build:browser": "node fix-browser-imports.js",
75
87
  "build:inject-commit": "node -e \"const fs=require('fs'),pkg=require('./package.json'),{execSync}=require('child_process');try{const commit=execSync('git rev-parse HEAD',{encoding:'utf8'}).trim();pkg.commit=commit;fs.writeFileSync('./package.json',JSON.stringify(pkg,null,'\\t')+'\\n');console.log('✅ Injected commit:',commit.substring(0,7))}catch(e){console.log('⚠️ Could not inject commit:',e.message)}\"",
76
- "build:replace-imports": "node -e \"const fs=require('fs'),path=require('path'),pkg=require('./package.json');const paths=['dist/cjs/common/settings.js','dist/esm/common/settings.js'];paths.forEach(settingsPath=>{if(fs.existsSync(settingsPath)){let content=fs.readFileSync(settingsPath,'utf8');content=content.replace(/require\\(\\\".*?\\/package\\.json\\\"\\)/g,JSON.stringify({version:pkg.version,commit:pkg.commit||'unknown'}));fs.writeFileSync(settingsPath,content);console.log('✅ Replaced imports in',settingsPath);}});\"",
88
+ "build:replace-imports": "node -e \"const fs=require('fs'),path=require('path'),pkg=require('./package.json');const paths=['dist/cjs/common/settings.js','dist/esm/common/settings.js','dist/cjs-browser/common/settings.js','dist/esm-browser/common/settings.js'];paths.forEach(settingsPath=>{if(fs.existsSync(settingsPath)){let content=fs.readFileSync(settingsPath,'utf8');content=content.replace(/require\\(\\\".*?\\/package\\.json\\\"\\)/g,JSON.stringify({version:pkg.version,commit:pkg.commit||'unknown'}));fs.writeFileSync(settingsPath,content);console.log('✅ Replaced imports in',settingsPath);}});\"",
77
89
  "test": "vitest --run",
78
90
  "test:watch": "vitest --watch"
79
91
  }