@mindstudio-ai/agent 0.1.70 → 0.1.72

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.
package/dist/cli.js CHANGED
@@ -1375,6 +1375,131 @@ var init_context = __esm({
1375
1375
  }
1376
1376
  });
1377
1377
 
1378
+ // src/db-ws.ts
1379
+ function getOrOpen(url) {
1380
+ if (socket && socket.readyState === WS_OPEN) {
1381
+ return Promise.resolve(socket);
1382
+ }
1383
+ if (opening) {
1384
+ return opening;
1385
+ }
1386
+ const WebSocketCtor = globalThis.WebSocket;
1387
+ if (!WebSocketCtor) {
1388
+ return Promise.reject(
1389
+ new DbWsTransportError("global WebSocket unavailable")
1390
+ );
1391
+ }
1392
+ opening = new Promise((resolve, reject) => {
1393
+ let ws;
1394
+ const fail = (err) => {
1395
+ clearTimeout(openTimer);
1396
+ if (socket === ws) {
1397
+ socket = null;
1398
+ }
1399
+ opening = null;
1400
+ for (const [, p] of pending) {
1401
+ clearTimeout(p.timer);
1402
+ p.reject(err);
1403
+ }
1404
+ pending.clear();
1405
+ reject(err);
1406
+ };
1407
+ const openTimer = setTimeout(() => {
1408
+ try {
1409
+ ws?.close();
1410
+ } catch {
1411
+ }
1412
+ fail(new DbWsTransportError("ws open timed out"));
1413
+ }, WS_OPEN_TIMEOUT_MS);
1414
+ try {
1415
+ ws = new WebSocketCtor(url);
1416
+ } catch (err) {
1417
+ fail(new DbWsTransportError(err?.message || "ws construct failed"));
1418
+ return;
1419
+ }
1420
+ ws.onopen = () => {
1421
+ clearTimeout(openTimer);
1422
+ socket = ws;
1423
+ opening = null;
1424
+ resolve(ws);
1425
+ };
1426
+ ws.onmessage = (ev) => {
1427
+ let msg;
1428
+ try {
1429
+ msg = JSON.parse(
1430
+ typeof ev.data === "string" ? ev.data : String(ev.data)
1431
+ );
1432
+ } catch {
1433
+ return;
1434
+ }
1435
+ if (!msg || msg.t !== "db-result" || msg.id == null) {
1436
+ return;
1437
+ }
1438
+ const p = pending.get(msg.id);
1439
+ if (!p) {
1440
+ return;
1441
+ }
1442
+ clearTimeout(p.timer);
1443
+ pending.delete(msg.id);
1444
+ if (msg.error) {
1445
+ p.reject(
1446
+ new MindStudioError(
1447
+ `[db] ${msg.error.message || "Database query failed"}`,
1448
+ msg.error.code || "db_query_error",
1449
+ 400,
1450
+ msg.error
1451
+ )
1452
+ );
1453
+ } else {
1454
+ p.resolve(msg.results);
1455
+ }
1456
+ };
1457
+ ws.onerror = () => fail(new DbWsTransportError("ws error"));
1458
+ ws.onclose = () => fail(new DbWsTransportError("ws closed"));
1459
+ });
1460
+ return opening;
1461
+ }
1462
+ async function executeDbBatchOverWs(url, token, databaseId, queries) {
1463
+ const id = ++idCounter;
1464
+ const frame = JSON.stringify({ t: "db", id, token, databaseId, queries });
1465
+ if (frame.length > WS_MAX_FRAME_CHARS) {
1466
+ throw new DbWsTransportError("payload too large for ws");
1467
+ }
1468
+ const ws = await getOrOpen(url);
1469
+ return await new Promise((resolve, reject) => {
1470
+ const timer = setTimeout(() => {
1471
+ pending.delete(id);
1472
+ reject(new DbWsTransportError("ws execute timed out"));
1473
+ }, WS_REQUEST_TIMEOUT_MS);
1474
+ pending.set(id, { resolve, reject, timer });
1475
+ try {
1476
+ ws.send(frame);
1477
+ } catch (err) {
1478
+ clearTimeout(timer);
1479
+ pending.delete(id);
1480
+ reject(new DbWsTransportError(err?.message || "ws send failed"));
1481
+ }
1482
+ });
1483
+ }
1484
+ var WS_REQUEST_TIMEOUT_MS, WS_OPEN_TIMEOUT_MS, WS_OPEN, WS_MAX_FRAME_CHARS, DbWsTransportError, socket, opening, idCounter, pending;
1485
+ var init_db_ws = __esm({
1486
+ "src/db-ws.ts"() {
1487
+ "use strict";
1488
+ init_errors();
1489
+ WS_REQUEST_TIMEOUT_MS = 3e5;
1490
+ WS_OPEN_TIMEOUT_MS = 5e3;
1491
+ WS_OPEN = 1;
1492
+ WS_MAX_FRAME_CHARS = 9e5;
1493
+ DbWsTransportError = class extends Error {
1494
+ name = "DbWsTransportError";
1495
+ };
1496
+ socket = null;
1497
+ opening = null;
1498
+ idCounter = 0;
1499
+ pending = /* @__PURE__ */ new Map();
1500
+ }
1501
+ });
1502
+
1378
1503
  // src/rate-limit.ts
1379
1504
  var DEFAULTS, RateLimiter;
1380
1505
  var init_rate_limit = __esm({
@@ -3939,6 +4064,7 @@ var init_client = __esm({
3939
4064
  init_http();
3940
4065
  init_errors();
3941
4066
  await init_context();
4067
+ init_db_ws();
3942
4068
  init_rate_limit();
3943
4069
  init_config();
3944
4070
  init_auth();
@@ -4850,6 +4976,21 @@ var init_client = __esm({
4850
4976
  * enabling RETURNING clauses and multi-statement batches.
4851
4977
  */
4852
4978
  async _executeDbBatch(databaseId, queries) {
4979
+ const dbWsUrl = typeof process !== "undefined" ? process.env?.DB_WS_URL : void 0;
4980
+ if (dbWsUrl) {
4981
+ try {
4982
+ return await executeDbBatchOverWs(
4983
+ dbWsUrl,
4984
+ this._token,
4985
+ databaseId,
4986
+ queries
4987
+ );
4988
+ } catch (err) {
4989
+ if (!(err instanceof DbWsTransportError)) {
4990
+ throw err;
4991
+ }
4992
+ }
4993
+ }
4853
4994
  const url = `${this._currentHttpConfig.baseUrl}/_internal/v2/db/query`;
4854
4995
  const res = await fetch(url, {
4855
4996
  method: "POST",
@@ -5617,6 +5758,7 @@ var init_instructions = __esm({
5617
5758
  Google: \`gemini-3-flash\`, \`gemini-3-pro\`, \`gemini-3.1-pro\`
5618
5759
  OpenAI: \`gpt-4o-mini\`, \`gpt-4o\`, \`gpt-5-mini\`, \`gpt-5\`, \`gpt-5.1\`, \`gpt-5.2\`
5619
5760
  Grok: \`grok-build-0.1\`, \`grok-4.5\`
5761
+ Meta: \`muse-spark-1.1\`
5620
5762
 
5621
5763
  Default to \`claude-4-6-sonnet\` unless the user has a preference. Do NOT recommend o-series reasoning models (o3, o4) for tasks \u2014 they are optimized for reasoning, not tool-use loops. Do NOT recommend Gemini 2.x when 3.x is available.
5622
5764
  </model_guidance>
@@ -6067,7 +6209,7 @@ async function startMcpServer(options) {
6067
6209
  capabilities: { tools: {} },
6068
6210
  serverInfo: {
6069
6211
  name: "mindstudio-agent",
6070
- version: "0.1.70"
6212
+ version: "0.1.72"
6071
6213
  },
6072
6214
  instructions: 'Welcome to MindStudio \u2014 a platform with 200+ AI models, 850+ third-party integrations, and pre-built agents.\n\nGetting started:\n1. Call `ask` with any question about the SDK \u2014 it knows every action, model, and connector and returns working code with real model IDs and config options. Examples: ask("generate an image with FLUX"), ask("what models support vision?"), ask("how do I send a Slack message?").\n2. Call `changeName` to set your display name \u2014 use your name or whatever your user calls you. This is how you\'ll appear in MindStudio request logs.\n3. If you have a profile picture or icon, call `uploadFile` to upload it, then `changeProfilePicture` with the returned URL.\n4. For manual browsing, call `listActions` to discover all available actions.\n\nThen use the tools to generate text, images, video, audio, search the web, work with data sources, run agents, and more.\n\nImportant:\n- AI-powered actions (text generation, image generation, video, audio, etc.) cost money. Before running these, call `estimateActionCost` and confirm with the user before proceeding \u2014 unless they\'ve explicitly told you to go ahead.\n- Not all agents from `listAgents` are configured for API use. Do not try to run an agent just because it appears in the list \u2014 it will likely fail. Only run agents the user specifically asks you to run.'
6073
6215
  });
@@ -7040,7 +7182,7 @@ function isNewerVersion(current, latest) {
7040
7182
  return false;
7041
7183
  }
7042
7184
  async function checkForUpdate() {
7043
- const currentVersion = "0.1.70";
7185
+ const currentVersion = "0.1.72";
7044
7186
  if (!currentVersion) return null;
7045
7187
  try {
7046
7188
  const { loadConfig: loadConfig2, saveConfig: saveConfig2 } = await Promise.resolve().then(() => (init_config(), config_exports));
@@ -7069,7 +7211,7 @@ async function checkForUpdate() {
7069
7211
  }
7070
7212
  }
7071
7213
  function printUpdateNotice(latestVersion) {
7072
- const currentVersion = "0.1.70";
7214
+ const currentVersion = "0.1.72";
7073
7215
  process.stderr.write(
7074
7216
  `
7075
7217
  ${ansi2.cyanBright("Update available")} ${ansi2.gray(currentVersion + " \u2192")} ${ansi2.cyanBold(latestVersion)}
@@ -7082,7 +7224,7 @@ function isStandaloneBinary() {
7082
7224
  return !argv1.includes("node_modules");
7083
7225
  }
7084
7226
  async function cmdUpdate() {
7085
- const currentVersion = "0.1.70";
7227
+ const currentVersion = "0.1.72";
7086
7228
  process.stderr.write(
7087
7229
  ` ${ansi2.gray("Current version:")} ${currentVersion}
7088
7230
  `
@@ -7217,7 +7359,7 @@ async function cmdLogin(options) {
7217
7359
  process.stderr.write("\n");
7218
7360
  printLogo();
7219
7361
  process.stderr.write("\n");
7220
- const ver = "0.1.70";
7362
+ const ver = "0.1.72";
7221
7363
  process.stderr.write(
7222
7364
  ` ${ansi2.bold("MindStudio Agent")} ${ver ? " " + ansi2.gray("v" + ver) : ""}
7223
7365
  `
@@ -7544,7 +7686,7 @@ async function main() {
7544
7686
  try {
7545
7687
  if (command === "version" || command === "-v") {
7546
7688
  process.stdout.write(
7547
- "0.1.70\n"
7689
+ "0.1.72\n"
7548
7690
  );
7549
7691
  return;
7550
7692
  }
package/dist/index.js CHANGED
@@ -101,6 +101,124 @@ function runWithContext(ctx, fn) {
101
101
  return als.run(ctx, fn);
102
102
  }
103
103
 
104
+ // src/db-ws.ts
105
+ var WS_REQUEST_TIMEOUT_MS = 3e5;
106
+ var WS_OPEN_TIMEOUT_MS = 5e3;
107
+ var WS_OPEN = 1;
108
+ var WS_MAX_FRAME_CHARS = 9e5;
109
+ var DbWsTransportError = class extends Error {
110
+ name = "DbWsTransportError";
111
+ };
112
+ var socket = null;
113
+ var opening = null;
114
+ var idCounter = 0;
115
+ var pending = /* @__PURE__ */ new Map();
116
+ function getOrOpen(url) {
117
+ if (socket && socket.readyState === WS_OPEN) {
118
+ return Promise.resolve(socket);
119
+ }
120
+ if (opening) {
121
+ return opening;
122
+ }
123
+ const WebSocketCtor = globalThis.WebSocket;
124
+ if (!WebSocketCtor) {
125
+ return Promise.reject(
126
+ new DbWsTransportError("global WebSocket unavailable")
127
+ );
128
+ }
129
+ opening = new Promise((resolve, reject) => {
130
+ let ws;
131
+ const fail = (err) => {
132
+ clearTimeout(openTimer);
133
+ if (socket === ws) {
134
+ socket = null;
135
+ }
136
+ opening = null;
137
+ for (const [, p] of pending) {
138
+ clearTimeout(p.timer);
139
+ p.reject(err);
140
+ }
141
+ pending.clear();
142
+ reject(err);
143
+ };
144
+ const openTimer = setTimeout(() => {
145
+ try {
146
+ ws?.close();
147
+ } catch {
148
+ }
149
+ fail(new DbWsTransportError("ws open timed out"));
150
+ }, WS_OPEN_TIMEOUT_MS);
151
+ try {
152
+ ws = new WebSocketCtor(url);
153
+ } catch (err) {
154
+ fail(new DbWsTransportError(err?.message || "ws construct failed"));
155
+ return;
156
+ }
157
+ ws.onopen = () => {
158
+ clearTimeout(openTimer);
159
+ socket = ws;
160
+ opening = null;
161
+ resolve(ws);
162
+ };
163
+ ws.onmessage = (ev) => {
164
+ let msg;
165
+ try {
166
+ msg = JSON.parse(
167
+ typeof ev.data === "string" ? ev.data : String(ev.data)
168
+ );
169
+ } catch {
170
+ return;
171
+ }
172
+ if (!msg || msg.t !== "db-result" || msg.id == null) {
173
+ return;
174
+ }
175
+ const p = pending.get(msg.id);
176
+ if (!p) {
177
+ return;
178
+ }
179
+ clearTimeout(p.timer);
180
+ pending.delete(msg.id);
181
+ if (msg.error) {
182
+ p.reject(
183
+ new MindStudioError(
184
+ `[db] ${msg.error.message || "Database query failed"}`,
185
+ msg.error.code || "db_query_error",
186
+ 400,
187
+ msg.error
188
+ )
189
+ );
190
+ } else {
191
+ p.resolve(msg.results);
192
+ }
193
+ };
194
+ ws.onerror = () => fail(new DbWsTransportError("ws error"));
195
+ ws.onclose = () => fail(new DbWsTransportError("ws closed"));
196
+ });
197
+ return opening;
198
+ }
199
+ async function executeDbBatchOverWs(url, token, databaseId, queries) {
200
+ const id = ++idCounter;
201
+ const frame = JSON.stringify({ t: "db", id, token, databaseId, queries });
202
+ if (frame.length > WS_MAX_FRAME_CHARS) {
203
+ throw new DbWsTransportError("payload too large for ws");
204
+ }
205
+ const ws = await getOrOpen(url);
206
+ return await new Promise((resolve, reject) => {
207
+ const timer = setTimeout(() => {
208
+ pending.delete(id);
209
+ reject(new DbWsTransportError("ws execute timed out"));
210
+ }, WS_REQUEST_TIMEOUT_MS);
211
+ pending.set(id, { resolve, reject, timer });
212
+ try {
213
+ ws.send(frame);
214
+ } catch (err) {
215
+ clearTimeout(timer);
216
+ pending.delete(id);
217
+ reject(new DbWsTransportError(err?.message || "ws send failed"));
218
+ }
219
+ });
220
+ }
221
+
104
222
  // src/rate-limit.ts
105
223
  var DEFAULTS = {
106
224
  internal: { concurrency: 10, callCap: 500 },
@@ -4668,6 +4786,21 @@ var MindStudioAgent = class {
4668
4786
  * enabling RETURNING clauses and multi-statement batches.
4669
4787
  */
4670
4788
  async _executeDbBatch(databaseId, queries) {
4789
+ const dbWsUrl = typeof process !== "undefined" ? process.env?.DB_WS_URL : void 0;
4790
+ if (dbWsUrl) {
4791
+ try {
4792
+ return await executeDbBatchOverWs(
4793
+ dbWsUrl,
4794
+ this._token,
4795
+ databaseId,
4796
+ queries
4797
+ );
4798
+ } catch (err) {
4799
+ if (!(err instanceof DbWsTransportError)) {
4800
+ throw err;
4801
+ }
4802
+ }
4803
+ }
4671
4804
  const url = `${this._currentHttpConfig.baseUrl}/_internal/v2/db/query`;
4672
4805
  const res = await fetch(url, {
4673
4806
  method: "POST",