@mindstudio-ai/agent 0.1.71 → 0.1.73
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 +152 -6
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -1
- package/dist/postinstall.js +152 -6
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1375,6 +1375,133 @@ 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(
|
|
1481
|
+
new DbWsTransportError(`ws send failed: ${err?.message || "unknown"}`)
|
|
1482
|
+
);
|
|
1483
|
+
}
|
|
1484
|
+
});
|
|
1485
|
+
}
|
|
1486
|
+
var WS_REQUEST_TIMEOUT_MS, WS_OPEN_TIMEOUT_MS, WS_OPEN, WS_MAX_FRAME_CHARS, DbWsTransportError, socket, opening, idCounter, pending;
|
|
1487
|
+
var init_db_ws = __esm({
|
|
1488
|
+
"src/db-ws.ts"() {
|
|
1489
|
+
"use strict";
|
|
1490
|
+
init_errors();
|
|
1491
|
+
WS_REQUEST_TIMEOUT_MS = 3e5;
|
|
1492
|
+
WS_OPEN_TIMEOUT_MS = 5e3;
|
|
1493
|
+
WS_OPEN = 1;
|
|
1494
|
+
WS_MAX_FRAME_CHARS = 9e5;
|
|
1495
|
+
DbWsTransportError = class extends Error {
|
|
1496
|
+
name = "DbWsTransportError";
|
|
1497
|
+
};
|
|
1498
|
+
socket = null;
|
|
1499
|
+
opening = null;
|
|
1500
|
+
idCounter = 0;
|
|
1501
|
+
pending = /* @__PURE__ */ new Map();
|
|
1502
|
+
}
|
|
1503
|
+
});
|
|
1504
|
+
|
|
1378
1505
|
// src/rate-limit.ts
|
|
1379
1506
|
var DEFAULTS, RateLimiter;
|
|
1380
1507
|
var init_rate_limit = __esm({
|
|
@@ -3939,6 +4066,7 @@ var init_client = __esm({
|
|
|
3939
4066
|
init_http();
|
|
3940
4067
|
init_errors();
|
|
3941
4068
|
await init_context();
|
|
4069
|
+
init_db_ws();
|
|
3942
4070
|
init_rate_limit();
|
|
3943
4071
|
init_config();
|
|
3944
4072
|
init_auth();
|
|
@@ -4850,6 +4978,24 @@ var init_client = __esm({
|
|
|
4850
4978
|
* enabling RETURNING clauses and multi-statement batches.
|
|
4851
4979
|
*/
|
|
4852
4980
|
async _executeDbBatch(databaseId, queries) {
|
|
4981
|
+
const dbWsUrl = typeof process !== "undefined" ? process.env?.DB_WS_URL : void 0;
|
|
4982
|
+
if (dbWsUrl) {
|
|
4983
|
+
try {
|
|
4984
|
+
return await executeDbBatchOverWs(
|
|
4985
|
+
dbWsUrl,
|
|
4986
|
+
this._token,
|
|
4987
|
+
databaseId,
|
|
4988
|
+
queries
|
|
4989
|
+
);
|
|
4990
|
+
} catch (err) {
|
|
4991
|
+
if (!(err instanceof DbWsTransportError)) {
|
|
4992
|
+
throw err;
|
|
4993
|
+
}
|
|
4994
|
+
console.warn(
|
|
4995
|
+
`[mindstudio] db: WebSocket transport unavailable (${err.message}); using HTTP for this query.`
|
|
4996
|
+
);
|
|
4997
|
+
}
|
|
4998
|
+
}
|
|
4853
4999
|
const url = `${this._currentHttpConfig.baseUrl}/_internal/v2/db/query`;
|
|
4854
5000
|
const res = await fetch(url, {
|
|
4855
5001
|
method: "POST",
|
|
@@ -6068,7 +6214,7 @@ async function startMcpServer(options) {
|
|
|
6068
6214
|
capabilities: { tools: {} },
|
|
6069
6215
|
serverInfo: {
|
|
6070
6216
|
name: "mindstudio-agent",
|
|
6071
|
-
version: "0.1.
|
|
6217
|
+
version: "0.1.73"
|
|
6072
6218
|
},
|
|
6073
6219
|
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.'
|
|
6074
6220
|
});
|
|
@@ -7041,7 +7187,7 @@ function isNewerVersion(current, latest) {
|
|
|
7041
7187
|
return false;
|
|
7042
7188
|
}
|
|
7043
7189
|
async function checkForUpdate() {
|
|
7044
|
-
const currentVersion = "0.1.
|
|
7190
|
+
const currentVersion = "0.1.73";
|
|
7045
7191
|
if (!currentVersion) return null;
|
|
7046
7192
|
try {
|
|
7047
7193
|
const { loadConfig: loadConfig2, saveConfig: saveConfig2 } = await Promise.resolve().then(() => (init_config(), config_exports));
|
|
@@ -7070,7 +7216,7 @@ async function checkForUpdate() {
|
|
|
7070
7216
|
}
|
|
7071
7217
|
}
|
|
7072
7218
|
function printUpdateNotice(latestVersion) {
|
|
7073
|
-
const currentVersion = "0.1.
|
|
7219
|
+
const currentVersion = "0.1.73";
|
|
7074
7220
|
process.stderr.write(
|
|
7075
7221
|
`
|
|
7076
7222
|
${ansi2.cyanBright("Update available")} ${ansi2.gray(currentVersion + " \u2192")} ${ansi2.cyanBold(latestVersion)}
|
|
@@ -7083,7 +7229,7 @@ function isStandaloneBinary() {
|
|
|
7083
7229
|
return !argv1.includes("node_modules");
|
|
7084
7230
|
}
|
|
7085
7231
|
async function cmdUpdate() {
|
|
7086
|
-
const currentVersion = "0.1.
|
|
7232
|
+
const currentVersion = "0.1.73";
|
|
7087
7233
|
process.stderr.write(
|
|
7088
7234
|
` ${ansi2.gray("Current version:")} ${currentVersion}
|
|
7089
7235
|
`
|
|
@@ -7218,7 +7364,7 @@ async function cmdLogin(options) {
|
|
|
7218
7364
|
process.stderr.write("\n");
|
|
7219
7365
|
printLogo();
|
|
7220
7366
|
process.stderr.write("\n");
|
|
7221
|
-
const ver = "0.1.
|
|
7367
|
+
const ver = "0.1.73";
|
|
7222
7368
|
process.stderr.write(
|
|
7223
7369
|
` ${ansi2.bold("MindStudio Agent")} ${ver ? " " + ansi2.gray("v" + ver) : ""}
|
|
7224
7370
|
`
|
|
@@ -7545,7 +7691,7 @@ async function main() {
|
|
|
7545
7691
|
try {
|
|
7546
7692
|
if (command === "version" || command === "-v") {
|
|
7547
7693
|
process.stdout.write(
|
|
7548
|
-
"0.1.
|
|
7694
|
+
"0.1.73\n"
|
|
7549
7695
|
);
|
|
7550
7696
|
return;
|
|
7551
7697
|
}
|
package/dist/index.js
CHANGED
|
@@ -101,6 +101,126 @@ 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(
|
|
218
|
+
new DbWsTransportError(`ws send failed: ${err?.message || "unknown"}`)
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
104
224
|
// src/rate-limit.ts
|
|
105
225
|
var DEFAULTS = {
|
|
106
226
|
internal: { concurrency: 10, callCap: 500 },
|
|
@@ -4668,6 +4788,24 @@ var MindStudioAgent = class {
|
|
|
4668
4788
|
* enabling RETURNING clauses and multi-statement batches.
|
|
4669
4789
|
*/
|
|
4670
4790
|
async _executeDbBatch(databaseId, queries) {
|
|
4791
|
+
const dbWsUrl = typeof process !== "undefined" ? process.env?.DB_WS_URL : void 0;
|
|
4792
|
+
if (dbWsUrl) {
|
|
4793
|
+
try {
|
|
4794
|
+
return await executeDbBatchOverWs(
|
|
4795
|
+
dbWsUrl,
|
|
4796
|
+
this._token,
|
|
4797
|
+
databaseId,
|
|
4798
|
+
queries
|
|
4799
|
+
);
|
|
4800
|
+
} catch (err) {
|
|
4801
|
+
if (!(err instanceof DbWsTransportError)) {
|
|
4802
|
+
throw err;
|
|
4803
|
+
}
|
|
4804
|
+
console.warn(
|
|
4805
|
+
`[mindstudio] db: WebSocket transport unavailable (${err.message}); using HTTP for this query.`
|
|
4806
|
+
);
|
|
4807
|
+
}
|
|
4808
|
+
}
|
|
4671
4809
|
const url = `${this._currentHttpConfig.baseUrl}/_internal/v2/db/query`;
|
|
4672
4810
|
const res = await fetch(url, {
|
|
4673
4811
|
method: "POST",
|