@mastra/mssql 1.2.2-alpha.0 → 1.3.0-alpha.2
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/CHANGELOG.md +43 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +614 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +615 -8
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/agents/index.d.ts +42 -0
- package/dist/storage/domains/agents/index.d.ts.map +1 -0
- package/dist/storage/domains/memory/index.d.ts +2 -1
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
var error = require('@mastra/core/error');
|
|
4
4
|
var storage = require('@mastra/core/storage');
|
|
5
5
|
var sql = require('mssql');
|
|
6
|
-
var
|
|
6
|
+
var crypto = require('crypto');
|
|
7
7
|
var utils = require('@mastra/core/utils');
|
|
8
|
+
var base = require('@mastra/core/base');
|
|
8
9
|
var agent = require('@mastra/core/agent');
|
|
9
|
-
var crypto = require('crypto');
|
|
10
10
|
var evals = require('@mastra/core/evals');
|
|
11
11
|
|
|
12
12
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -1356,7 +1356,609 @@ function transformFromSqlRow({
|
|
|
1356
1356
|
return result;
|
|
1357
1357
|
}
|
|
1358
1358
|
|
|
1359
|
-
// src/storage/domains/
|
|
1359
|
+
// src/storage/domains/agents/index.ts
|
|
1360
|
+
var AgentsMSSQL = class _AgentsMSSQL extends storage.AgentsStorage {
|
|
1361
|
+
pool;
|
|
1362
|
+
schema;
|
|
1363
|
+
db;
|
|
1364
|
+
needsConnect;
|
|
1365
|
+
skipDefaultIndexes;
|
|
1366
|
+
indexes;
|
|
1367
|
+
/** Tables managed by this domain. */
|
|
1368
|
+
static MANAGED_TABLES = [storage.TABLE_AGENTS, storage.TABLE_AGENT_VERSIONS];
|
|
1369
|
+
constructor(config) {
|
|
1370
|
+
super();
|
|
1371
|
+
const { pool, schemaName, skipDefaultIndexes, indexes, needsConnect } = resolveMssqlConfig(config);
|
|
1372
|
+
this.pool = pool;
|
|
1373
|
+
this.schema = schemaName;
|
|
1374
|
+
this.db = new MssqlDB({ pool, schemaName, skipDefaultIndexes });
|
|
1375
|
+
this.needsConnect = needsConnect;
|
|
1376
|
+
this.skipDefaultIndexes = skipDefaultIndexes;
|
|
1377
|
+
this.indexes = indexes?.filter((idx) => _AgentsMSSQL.MANAGED_TABLES.includes(idx.table));
|
|
1378
|
+
}
|
|
1379
|
+
async init() {
|
|
1380
|
+
if (this.needsConnect) {
|
|
1381
|
+
await this.pool.connect();
|
|
1382
|
+
this.needsConnect = false;
|
|
1383
|
+
}
|
|
1384
|
+
await this.db.createTable({ tableName: storage.TABLE_AGENTS, schema: storage.AGENTS_SCHEMA });
|
|
1385
|
+
await this.db.createTable({ tableName: storage.TABLE_AGENT_VERSIONS, schema: storage.AGENT_VERSIONS_SCHEMA });
|
|
1386
|
+
await this.createDefaultIndexes();
|
|
1387
|
+
await this.createCustomIndexes();
|
|
1388
|
+
}
|
|
1389
|
+
/** Default index definitions for the agents domain tables. */
|
|
1390
|
+
getDefaultIndexDefinitions() {
|
|
1391
|
+
const schemaPrefix = this.schema && this.schema !== "dbo" ? `${this.schema}_` : "";
|
|
1392
|
+
return [
|
|
1393
|
+
{
|
|
1394
|
+
name: `${schemaPrefix}mastra_agents_createdat_idx`,
|
|
1395
|
+
table: storage.TABLE_AGENTS,
|
|
1396
|
+
columns: ["createdAt DESC"]
|
|
1397
|
+
},
|
|
1398
|
+
{
|
|
1399
|
+
name: `${schemaPrefix}mastra_agent_versions_agentid_versionnumber_uniq`,
|
|
1400
|
+
table: storage.TABLE_AGENT_VERSIONS,
|
|
1401
|
+
columns: ["agentId", "versionNumber DESC"],
|
|
1402
|
+
unique: true
|
|
1403
|
+
},
|
|
1404
|
+
{
|
|
1405
|
+
name: `${schemaPrefix}mastra_agent_versions_agentid_createdat_idx`,
|
|
1406
|
+
table: storage.TABLE_AGENT_VERSIONS,
|
|
1407
|
+
columns: ["agentId", "createdAt DESC"]
|
|
1408
|
+
}
|
|
1409
|
+
];
|
|
1410
|
+
}
|
|
1411
|
+
async createDefaultIndexes() {
|
|
1412
|
+
if (this.skipDefaultIndexes) return;
|
|
1413
|
+
for (const indexDef of this.getDefaultIndexDefinitions()) {
|
|
1414
|
+
try {
|
|
1415
|
+
await this.db.createIndex(indexDef);
|
|
1416
|
+
} catch (error) {
|
|
1417
|
+
this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
async createCustomIndexes() {
|
|
1422
|
+
if (!this.indexes || this.indexes.length === 0) return;
|
|
1423
|
+
for (const indexDef of this.indexes) {
|
|
1424
|
+
try {
|
|
1425
|
+
await this.db.createIndex(indexDef);
|
|
1426
|
+
} catch (error) {
|
|
1427
|
+
this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
async dangerouslyClearAll() {
|
|
1432
|
+
await this.db.clearTable({ tableName: storage.TABLE_AGENT_VERSIONS });
|
|
1433
|
+
await this.db.clearTable({ tableName: storage.TABLE_AGENTS });
|
|
1434
|
+
}
|
|
1435
|
+
parseJson(value, fieldName) {
|
|
1436
|
+
if (value === null || value === void 0) return void 0;
|
|
1437
|
+
if (typeof value !== "string") return value;
|
|
1438
|
+
try {
|
|
1439
|
+
return JSON.parse(value);
|
|
1440
|
+
} catch (error$1) {
|
|
1441
|
+
throw new error.MastraError(
|
|
1442
|
+
{
|
|
1443
|
+
id: storage.createStorageErrorId("MSSQL", "PARSE_JSON", "INVALID_JSON"),
|
|
1444
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1445
|
+
category: error.ErrorCategory.SYSTEM,
|
|
1446
|
+
text: `Failed to parse JSON${fieldName ? ` for field "${fieldName}"` : ""}: ${error$1 instanceof Error ? error$1.message : "Unknown error"}`,
|
|
1447
|
+
details: { field: fieldName ?? "", valueLen: value.length }
|
|
1448
|
+
},
|
|
1449
|
+
error$1
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
serializeInstructions(instructions) {
|
|
1454
|
+
if (instructions === void 0) return void 0;
|
|
1455
|
+
return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;
|
|
1456
|
+
}
|
|
1457
|
+
deserializeInstructions(raw) {
|
|
1458
|
+
if (!raw) return raw ?? void 0;
|
|
1459
|
+
try {
|
|
1460
|
+
const parsed = JSON.parse(raw);
|
|
1461
|
+
if (Array.isArray(parsed)) return parsed;
|
|
1462
|
+
} catch {
|
|
1463
|
+
}
|
|
1464
|
+
return raw;
|
|
1465
|
+
}
|
|
1466
|
+
parseRow(row) {
|
|
1467
|
+
return {
|
|
1468
|
+
id: row.id,
|
|
1469
|
+
status: row.status,
|
|
1470
|
+
activeVersionId: row.activeVersionId ?? void 0,
|
|
1471
|
+
authorId: row.authorId ?? void 0,
|
|
1472
|
+
metadata: this.parseJson(row.metadata, "metadata"),
|
|
1473
|
+
createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt),
|
|
1474
|
+
updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt)
|
|
1475
|
+
};
|
|
1476
|
+
}
|
|
1477
|
+
parseVersionRow(row) {
|
|
1478
|
+
return {
|
|
1479
|
+
id: row.id,
|
|
1480
|
+
agentId: row.agentId,
|
|
1481
|
+
versionNumber: row.versionNumber,
|
|
1482
|
+
name: row.name,
|
|
1483
|
+
description: row.description ?? void 0,
|
|
1484
|
+
instructions: this.deserializeInstructions(
|
|
1485
|
+
row.instructions
|
|
1486
|
+
),
|
|
1487
|
+
model: this.parseJson(row.model, "model"),
|
|
1488
|
+
tools: this.parseJson(row.tools, "tools"),
|
|
1489
|
+
defaultOptions: this.parseJson(row.defaultOptions, "defaultOptions"),
|
|
1490
|
+
workflows: this.parseJson(row.workflows, "workflows"),
|
|
1491
|
+
agents: this.parseJson(row.agents, "agents"),
|
|
1492
|
+
integrationTools: this.parseJson(row.integrationTools, "integrationTools"),
|
|
1493
|
+
inputProcessors: this.parseJson(row.inputProcessors, "inputProcessors"),
|
|
1494
|
+
outputProcessors: this.parseJson(row.outputProcessors, "outputProcessors"),
|
|
1495
|
+
memory: this.parseJson(row.memory, "memory"),
|
|
1496
|
+
scorers: this.parseJson(row.scorers, "scorers"),
|
|
1497
|
+
mcpClients: this.parseJson(row.mcpClients, "mcpClients"),
|
|
1498
|
+
requestContextSchema: this.parseJson(
|
|
1499
|
+
row.requestContextSchema,
|
|
1500
|
+
"requestContextSchema"
|
|
1501
|
+
),
|
|
1502
|
+
workspace: this.parseJson(row.workspace, "workspace"),
|
|
1503
|
+
skills: this.parseJson(row.skills, "skills"),
|
|
1504
|
+
skillsFormat: row.skillsFormat ?? void 0,
|
|
1505
|
+
changedFields: this.parseJson(row.changedFields, "changedFields"),
|
|
1506
|
+
changeMessage: row.changeMessage ?? void 0,
|
|
1507
|
+
createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt)
|
|
1508
|
+
};
|
|
1509
|
+
}
|
|
1510
|
+
async getById(id) {
|
|
1511
|
+
try {
|
|
1512
|
+
const result = await this.db.load({ tableName: storage.TABLE_AGENTS, keys: { id } });
|
|
1513
|
+
return result ? this.parseRow(result) : null;
|
|
1514
|
+
} catch (error$1) {
|
|
1515
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1516
|
+
throw new error.MastraError(
|
|
1517
|
+
{
|
|
1518
|
+
id: storage.createStorageErrorId("MSSQL", "GET_AGENT_BY_ID", "FAILED"),
|
|
1519
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1520
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1521
|
+
details: { agentId: id }
|
|
1522
|
+
},
|
|
1523
|
+
error$1
|
|
1524
|
+
);
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
async create(input) {
|
|
1528
|
+
const { agent } = input;
|
|
1529
|
+
try {
|
|
1530
|
+
const now = /* @__PURE__ */ new Date();
|
|
1531
|
+
await this.db.insert({
|
|
1532
|
+
tableName: storage.TABLE_AGENTS,
|
|
1533
|
+
record: {
|
|
1534
|
+
id: agent.id,
|
|
1535
|
+
status: "draft",
|
|
1536
|
+
activeVersionId: null,
|
|
1537
|
+
authorId: agent.authorId ?? null,
|
|
1538
|
+
metadata: agent.metadata ?? null,
|
|
1539
|
+
createdAt: now,
|
|
1540
|
+
updatedAt: now
|
|
1541
|
+
}
|
|
1542
|
+
});
|
|
1543
|
+
const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;
|
|
1544
|
+
const versionId = crypto.randomUUID();
|
|
1545
|
+
await this.createVersion({
|
|
1546
|
+
id: versionId,
|
|
1547
|
+
agentId: agent.id,
|
|
1548
|
+
versionNumber: 1,
|
|
1549
|
+
...snapshotConfig,
|
|
1550
|
+
changedFields: Object.keys(snapshotConfig),
|
|
1551
|
+
changeMessage: "Initial version"
|
|
1552
|
+
});
|
|
1553
|
+
const created = await this.getById(agent.id);
|
|
1554
|
+
if (!created) {
|
|
1555
|
+
throw new error.MastraError({
|
|
1556
|
+
id: storage.createStorageErrorId("MSSQL", "CREATE_AGENT", "NOT_FOUND_AFTER_CREATE"),
|
|
1557
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1558
|
+
category: error.ErrorCategory.SYSTEM,
|
|
1559
|
+
text: `Agent ${agent.id} not found after creation`,
|
|
1560
|
+
details: { agentId: agent.id }
|
|
1561
|
+
});
|
|
1562
|
+
}
|
|
1563
|
+
return created;
|
|
1564
|
+
} catch (error$1) {
|
|
1565
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1566
|
+
throw new error.MastraError(
|
|
1567
|
+
{
|
|
1568
|
+
id: storage.createStorageErrorId("MSSQL", "CREATE_AGENT", "FAILED"),
|
|
1569
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1570
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1571
|
+
details: { agentId: agent.id }
|
|
1572
|
+
},
|
|
1573
|
+
error$1
|
|
1574
|
+
);
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
async update(input) {
|
|
1578
|
+
const { id, ...updates } = input;
|
|
1579
|
+
try {
|
|
1580
|
+
const existing = await this.getById(id);
|
|
1581
|
+
if (!existing) {
|
|
1582
|
+
throw new error.MastraError({
|
|
1583
|
+
id: storage.createStorageErrorId("MSSQL", "UPDATE_AGENT", "NOT_FOUND"),
|
|
1584
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1585
|
+
category: error.ErrorCategory.USER,
|
|
1586
|
+
text: `Agent ${id} not found`,
|
|
1587
|
+
details: { agentId: id }
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
const { authorId, activeVersionId, metadata, status } = updates;
|
|
1591
|
+
const data = { updatedAt: /* @__PURE__ */ new Date() };
|
|
1592
|
+
if (authorId !== void 0) data.authorId = authorId;
|
|
1593
|
+
if (activeVersionId !== void 0) data.activeVersionId = activeVersionId;
|
|
1594
|
+
if (status !== void 0) data.status = status;
|
|
1595
|
+
if (metadata !== void 0) data.metadata = { ...existing.metadata, ...metadata };
|
|
1596
|
+
await this.db.update({ tableName: storage.TABLE_AGENTS, keys: { id }, data });
|
|
1597
|
+
const updated = await this.getById(id);
|
|
1598
|
+
if (!updated) {
|
|
1599
|
+
throw new error.MastraError({
|
|
1600
|
+
id: storage.createStorageErrorId("MSSQL", "UPDATE_AGENT", "NOT_FOUND_AFTER_UPDATE"),
|
|
1601
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1602
|
+
category: error.ErrorCategory.SYSTEM,
|
|
1603
|
+
text: `Agent ${id} not found after update`,
|
|
1604
|
+
details: { agentId: id }
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
return updated;
|
|
1608
|
+
} catch (error$1) {
|
|
1609
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1610
|
+
throw new error.MastraError(
|
|
1611
|
+
{
|
|
1612
|
+
id: storage.createStorageErrorId("MSSQL", "UPDATE_AGENT", "FAILED"),
|
|
1613
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1614
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1615
|
+
details: { agentId: id }
|
|
1616
|
+
},
|
|
1617
|
+
error$1
|
|
1618
|
+
);
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
async delete(id) {
|
|
1622
|
+
try {
|
|
1623
|
+
await this.deleteVersionsByParentId(id);
|
|
1624
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENTS, schemaName: getSchemaName2(this.schema) });
|
|
1625
|
+
const request = this.pool.request();
|
|
1626
|
+
request.input("id", id);
|
|
1627
|
+
await request.query(`DELETE FROM ${fullName} WHERE [id] = @id`);
|
|
1628
|
+
} catch (error$1) {
|
|
1629
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1630
|
+
throw new error.MastraError(
|
|
1631
|
+
{
|
|
1632
|
+
id: storage.createStorageErrorId("MSSQL", "DELETE_AGENT", "FAILED"),
|
|
1633
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1634
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1635
|
+
details: { agentId: id }
|
|
1636
|
+
},
|
|
1637
|
+
error$1
|
|
1638
|
+
);
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
async list(args) {
|
|
1642
|
+
const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};
|
|
1643
|
+
const { field, direction } = this.parseOrderBy(orderBy);
|
|
1644
|
+
if (page < 0) {
|
|
1645
|
+
throw new error.MastraError(
|
|
1646
|
+
{
|
|
1647
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_AGENTS", "INVALID_PAGE"),
|
|
1648
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1649
|
+
category: error.ErrorCategory.USER,
|
|
1650
|
+
details: { page }
|
|
1651
|
+
},
|
|
1652
|
+
new Error("page must be >= 0")
|
|
1653
|
+
);
|
|
1654
|
+
}
|
|
1655
|
+
const perPage = storage.normalizePerPage(perPageInput, 100);
|
|
1656
|
+
const { offset, perPage: perPageForResponse } = storage.calculatePagination(page, perPageInput, perPage);
|
|
1657
|
+
try {
|
|
1658
|
+
const conditions = [];
|
|
1659
|
+
const inputs = [];
|
|
1660
|
+
if (status !== void 0) {
|
|
1661
|
+
conditions.push("[status] = @status");
|
|
1662
|
+
inputs.push(["status", status]);
|
|
1663
|
+
}
|
|
1664
|
+
if (authorId !== void 0) {
|
|
1665
|
+
conditions.push("[authorId] = @authorId");
|
|
1666
|
+
inputs.push(["authorId", authorId]);
|
|
1667
|
+
}
|
|
1668
|
+
if (metadata && Object.keys(metadata).length > 0) {
|
|
1669
|
+
let metaIdx = 0;
|
|
1670
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
1671
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {
|
|
1672
|
+
throw new error.MastraError({
|
|
1673
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_AGENTS", "INVALID_METADATA_KEY"),
|
|
1674
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1675
|
+
category: error.ErrorCategory.USER,
|
|
1676
|
+
text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,
|
|
1677
|
+
details: { key }
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
if (value !== null && typeof value === "object") {
|
|
1681
|
+
throw new error.MastraError({
|
|
1682
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_AGENTS", "NON_PRIMITIVE_METADATA"),
|
|
1683
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1684
|
+
category: error.ErrorCategory.USER,
|
|
1685
|
+
text: `Metadata filter for key "${key}" must be a primitive (string/number/boolean/null); received ${Array.isArray(value) ? "array" : "object"}.`,
|
|
1686
|
+
details: { key }
|
|
1687
|
+
});
|
|
1688
|
+
}
|
|
1689
|
+
if (value === null) {
|
|
1690
|
+
conditions.push(`JSON_VALUE([metadata], '$.${key}') IS NULL`);
|
|
1691
|
+
continue;
|
|
1692
|
+
}
|
|
1693
|
+
const paramName = `meta_${metaIdx++}`;
|
|
1694
|
+
conditions.push(`JSON_VALUE([metadata], '$.${key}') = @${paramName}`);
|
|
1695
|
+
inputs.push([paramName, typeof value === "string" ? value : String(value)]);
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
1699
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENTS, schemaName: getSchemaName2(this.schema) });
|
|
1700
|
+
const countRequest = this.pool.request();
|
|
1701
|
+
for (const [k, v] of inputs) countRequest.input(k, v);
|
|
1702
|
+
const countResult = await countRequest.query(`SELECT COUNT(*) AS [count] FROM ${fullName} ${whereClause}`);
|
|
1703
|
+
const total = Number(countResult.recordset?.[0]?.count ?? 0);
|
|
1704
|
+
if (total === 0) {
|
|
1705
|
+
return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
|
|
1706
|
+
}
|
|
1707
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1708
|
+
const fieldSafe = utils.parseSqlIdentifier(field, "order column");
|
|
1709
|
+
const dirSafe = direction === "ASC" ? "ASC" : "DESC";
|
|
1710
|
+
const listRequest = this.pool.request();
|
|
1711
|
+
for (const [k, v] of inputs) listRequest.input(k, v);
|
|
1712
|
+
listRequest.input("offset", offset);
|
|
1713
|
+
listRequest.input("limit", limitValue);
|
|
1714
|
+
const listSql = `SELECT * FROM ${fullName} ${whereClause} ORDER BY [${fieldSafe}] ${dirSafe} OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY`;
|
|
1715
|
+
const listResult = await listRequest.query(listSql);
|
|
1716
|
+
const agents = (listResult.recordset || []).map((row) => this.parseRow(row));
|
|
1717
|
+
return {
|
|
1718
|
+
agents,
|
|
1719
|
+
total,
|
|
1720
|
+
page,
|
|
1721
|
+
perPage: perPageForResponse,
|
|
1722
|
+
hasMore: perPageInput === false ? false : offset + perPage < total
|
|
1723
|
+
};
|
|
1724
|
+
} catch (error$1) {
|
|
1725
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1726
|
+
throw new error.MastraError(
|
|
1727
|
+
{
|
|
1728
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_AGENTS", "FAILED"),
|
|
1729
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1730
|
+
category: error.ErrorCategory.THIRD_PARTY
|
|
1731
|
+
},
|
|
1732
|
+
error$1
|
|
1733
|
+
);
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
async createVersion(input) {
|
|
1737
|
+
try {
|
|
1738
|
+
const now = /* @__PURE__ */ new Date();
|
|
1739
|
+
await this.db.insert({
|
|
1740
|
+
tableName: storage.TABLE_AGENT_VERSIONS,
|
|
1741
|
+
record: {
|
|
1742
|
+
id: input.id,
|
|
1743
|
+
agentId: input.agentId,
|
|
1744
|
+
versionNumber: input.versionNumber,
|
|
1745
|
+
name: input.name ?? null,
|
|
1746
|
+
description: input.description ?? null,
|
|
1747
|
+
instructions: this.serializeInstructions(input.instructions) ?? null,
|
|
1748
|
+
model: input.model,
|
|
1749
|
+
tools: input.tools ?? null,
|
|
1750
|
+
defaultOptions: input.defaultOptions ?? null,
|
|
1751
|
+
workflows: input.workflows ?? null,
|
|
1752
|
+
agents: input.agents ?? null,
|
|
1753
|
+
integrationTools: input.integrationTools ?? null,
|
|
1754
|
+
inputProcessors: input.inputProcessors ?? null,
|
|
1755
|
+
outputProcessors: input.outputProcessors ?? null,
|
|
1756
|
+
memory: input.memory ?? null,
|
|
1757
|
+
scorers: input.scorers ?? null,
|
|
1758
|
+
mcpClients: input.mcpClients ?? null,
|
|
1759
|
+
requestContextSchema: input.requestContextSchema ?? null,
|
|
1760
|
+
workspace: input.workspace ?? null,
|
|
1761
|
+
skills: input.skills ?? null,
|
|
1762
|
+
skillsFormat: input.skillsFormat ?? null,
|
|
1763
|
+
changedFields: input.changedFields ?? null,
|
|
1764
|
+
changeMessage: input.changeMessage ?? null,
|
|
1765
|
+
createdAt: now
|
|
1766
|
+
}
|
|
1767
|
+
});
|
|
1768
|
+
return { ...input, createdAt: now };
|
|
1769
|
+
} catch (error$1) {
|
|
1770
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1771
|
+
throw new error.MastraError(
|
|
1772
|
+
{
|
|
1773
|
+
id: storage.createStorageErrorId("MSSQL", "CREATE_VERSION", "FAILED"),
|
|
1774
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1775
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1776
|
+
details: { versionId: input.id, agentId: input.agentId }
|
|
1777
|
+
},
|
|
1778
|
+
error$1
|
|
1779
|
+
);
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
async getVersion(id) {
|
|
1783
|
+
try {
|
|
1784
|
+
const result = await this.db.load({ tableName: storage.TABLE_AGENT_VERSIONS, keys: { id } });
|
|
1785
|
+
return result ? this.parseVersionRow(result) : null;
|
|
1786
|
+
} catch (error$1) {
|
|
1787
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1788
|
+
throw new error.MastraError(
|
|
1789
|
+
{
|
|
1790
|
+
id: storage.createStorageErrorId("MSSQL", "GET_VERSION", "FAILED"),
|
|
1791
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1792
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1793
|
+
details: { versionId: id }
|
|
1794
|
+
},
|
|
1795
|
+
error$1
|
|
1796
|
+
);
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
async getVersionByNumber(agentId, versionNumber) {
|
|
1800
|
+
try {
|
|
1801
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1802
|
+
const request = this.pool.request();
|
|
1803
|
+
request.input("agentId", agentId);
|
|
1804
|
+
request.input("versionNumber", versionNumber);
|
|
1805
|
+
const result = await request.query(
|
|
1806
|
+
`SELECT TOP 1 * FROM ${fullName} WHERE [agentId] = @agentId AND [versionNumber] = @versionNumber`
|
|
1807
|
+
);
|
|
1808
|
+
const row = result.recordset?.[0];
|
|
1809
|
+
return row ? this.parseVersionRow(row) : null;
|
|
1810
|
+
} catch (error$1) {
|
|
1811
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1812
|
+
throw new error.MastraError(
|
|
1813
|
+
{
|
|
1814
|
+
id: storage.createStorageErrorId("MSSQL", "GET_VERSION_BY_NUMBER", "FAILED"),
|
|
1815
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1816
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1817
|
+
details: { agentId, versionNumber }
|
|
1818
|
+
},
|
|
1819
|
+
error$1
|
|
1820
|
+
);
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
async getLatestVersion(agentId) {
|
|
1824
|
+
try {
|
|
1825
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1826
|
+
const request = this.pool.request();
|
|
1827
|
+
request.input("agentId", agentId);
|
|
1828
|
+
const result = await request.query(
|
|
1829
|
+
`SELECT TOP 1 * FROM ${fullName} WHERE [agentId] = @agentId ORDER BY [versionNumber] DESC`
|
|
1830
|
+
);
|
|
1831
|
+
const row = result.recordset?.[0];
|
|
1832
|
+
return row ? this.parseVersionRow(row) : null;
|
|
1833
|
+
} catch (error$1) {
|
|
1834
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1835
|
+
throw new error.MastraError(
|
|
1836
|
+
{
|
|
1837
|
+
id: storage.createStorageErrorId("MSSQL", "GET_LATEST_VERSION", "FAILED"),
|
|
1838
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1839
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1840
|
+
details: { agentId }
|
|
1841
|
+
},
|
|
1842
|
+
error$1
|
|
1843
|
+
);
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
async listVersions(input) {
|
|
1847
|
+
const { agentId, page = 0, perPage: perPageInput, orderBy } = input;
|
|
1848
|
+
if (page < 0) {
|
|
1849
|
+
throw new error.MastraError(
|
|
1850
|
+
{
|
|
1851
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_VERSIONS", "INVALID_PAGE"),
|
|
1852
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1853
|
+
category: error.ErrorCategory.USER,
|
|
1854
|
+
details: { page }
|
|
1855
|
+
},
|
|
1856
|
+
new Error("page must be >= 0")
|
|
1857
|
+
);
|
|
1858
|
+
}
|
|
1859
|
+
const perPage = storage.normalizePerPage(perPageInput, 20);
|
|
1860
|
+
const { offset, perPage: perPageForResponse } = storage.calculatePagination(page, perPageInput, perPage);
|
|
1861
|
+
try {
|
|
1862
|
+
const { field, direction } = this.parseVersionOrderBy(orderBy);
|
|
1863
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1864
|
+
const countRequest = this.pool.request();
|
|
1865
|
+
countRequest.input("agentId", agentId);
|
|
1866
|
+
const countResult = await countRequest.query(
|
|
1867
|
+
`SELECT COUNT(*) AS [count] FROM ${fullName} WHERE [agentId] = @agentId`
|
|
1868
|
+
);
|
|
1869
|
+
const total = Number(countResult.recordset?.[0]?.count ?? 0);
|
|
1870
|
+
if (total === 0) {
|
|
1871
|
+
return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
|
|
1872
|
+
}
|
|
1873
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1874
|
+
const fieldSafe = utils.parseSqlIdentifier(field, "order column");
|
|
1875
|
+
const dirSafe = direction === "ASC" ? "ASC" : "DESC";
|
|
1876
|
+
const listRequest = this.pool.request();
|
|
1877
|
+
listRequest.input("agentId", agentId);
|
|
1878
|
+
listRequest.input("offset", offset);
|
|
1879
|
+
listRequest.input("limit", limitValue);
|
|
1880
|
+
const listSql = `SELECT * FROM ${fullName} WHERE [agentId] = @agentId ORDER BY [${fieldSafe}] ${dirSafe} OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY`;
|
|
1881
|
+
const listResult = await listRequest.query(listSql);
|
|
1882
|
+
const versions = (listResult.recordset || []).map((row) => this.parseVersionRow(row));
|
|
1883
|
+
return {
|
|
1884
|
+
versions,
|
|
1885
|
+
total,
|
|
1886
|
+
page,
|
|
1887
|
+
perPage: perPageForResponse,
|
|
1888
|
+
hasMore: perPageInput === false ? false : offset + perPage < total
|
|
1889
|
+
};
|
|
1890
|
+
} catch (error$1) {
|
|
1891
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1892
|
+
throw new error.MastraError(
|
|
1893
|
+
{
|
|
1894
|
+
id: storage.createStorageErrorId("MSSQL", "LIST_VERSIONS", "FAILED"),
|
|
1895
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1896
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1897
|
+
details: { agentId }
|
|
1898
|
+
},
|
|
1899
|
+
error$1
|
|
1900
|
+
);
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
async deleteVersion(id) {
|
|
1904
|
+
try {
|
|
1905
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1906
|
+
const request = this.pool.request();
|
|
1907
|
+
request.input("id", id);
|
|
1908
|
+
await request.query(`DELETE FROM ${fullName} WHERE [id] = @id`);
|
|
1909
|
+
} catch (error$1) {
|
|
1910
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1911
|
+
throw new error.MastraError(
|
|
1912
|
+
{
|
|
1913
|
+
id: storage.createStorageErrorId("MSSQL", "DELETE_VERSION", "FAILED"),
|
|
1914
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1915
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1916
|
+
details: { versionId: id }
|
|
1917
|
+
},
|
|
1918
|
+
error$1
|
|
1919
|
+
);
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
async deleteVersionsByParentId(entityId) {
|
|
1923
|
+
try {
|
|
1924
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1925
|
+
const request = this.pool.request();
|
|
1926
|
+
request.input("agentId", entityId);
|
|
1927
|
+
await request.query(`DELETE FROM ${fullName} WHERE [agentId] = @agentId`);
|
|
1928
|
+
} catch (error$1) {
|
|
1929
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1930
|
+
throw new error.MastraError(
|
|
1931
|
+
{
|
|
1932
|
+
id: storage.createStorageErrorId("MSSQL", "DELETE_VERSIONS_BY_AGENT_ID", "FAILED"),
|
|
1933
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1934
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1935
|
+
details: { agentId: entityId }
|
|
1936
|
+
},
|
|
1937
|
+
error$1
|
|
1938
|
+
);
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
async countVersions(agentId) {
|
|
1942
|
+
try {
|
|
1943
|
+
const fullName = getTableName2({ indexName: storage.TABLE_AGENT_VERSIONS, schemaName: getSchemaName2(this.schema) });
|
|
1944
|
+
const request = this.pool.request();
|
|
1945
|
+
request.input("agentId", agentId);
|
|
1946
|
+
const result = await request.query(`SELECT COUNT(*) AS [count] FROM ${fullName} WHERE [agentId] = @agentId`);
|
|
1947
|
+
return Number(result.recordset?.[0]?.count ?? 0);
|
|
1948
|
+
} catch (error$1) {
|
|
1949
|
+
if (error$1 instanceof error.MastraError) throw error$1;
|
|
1950
|
+
throw new error.MastraError(
|
|
1951
|
+
{
|
|
1952
|
+
id: storage.createStorageErrorId("MSSQL", "COUNT_VERSIONS", "FAILED"),
|
|
1953
|
+
domain: error.ErrorDomain.STORAGE,
|
|
1954
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
1955
|
+
details: { agentId }
|
|
1956
|
+
},
|
|
1957
|
+
error$1
|
|
1958
|
+
);
|
|
1959
|
+
}
|
|
1960
|
+
}
|
|
1961
|
+
};
|
|
1360
1962
|
function serializeJson(v) {
|
|
1361
1963
|
if (typeof v === "object" && v != null) return JSON.stringify(v);
|
|
1362
1964
|
return v ?? null;
|
|
@@ -1789,7 +2391,10 @@ var MemoryMSSQL = class _MemoryMSSQL extends storage.MemoryStorage {
|
|
|
1789
2391
|
await this.db.clearTable({ tableName: storage.TABLE_THREADS });
|
|
1790
2392
|
await this.db.clearTable({ tableName: storage.TABLE_RESOURCES });
|
|
1791
2393
|
}
|
|
1792
|
-
async getThreadById({
|
|
2394
|
+
async getThreadById({
|
|
2395
|
+
threadId,
|
|
2396
|
+
resourceId
|
|
2397
|
+
}) {
|
|
1793
2398
|
try {
|
|
1794
2399
|
const sql5 = `SELECT
|
|
1795
2400
|
id,
|
|
@@ -1804,7 +2409,7 @@ var MemoryMSSQL = class _MemoryMSSQL extends storage.MemoryStorage {
|
|
|
1804
2409
|
request.input("threadId", threadId);
|
|
1805
2410
|
const resultSet = await request.query(sql5);
|
|
1806
2411
|
const thread = resultSet.recordset[0] || null;
|
|
1807
|
-
if (!thread) {
|
|
2412
|
+
if (!thread || resourceId !== void 0 && thread.resourceId !== resourceId) {
|
|
1808
2413
|
return null;
|
|
1809
2414
|
}
|
|
1810
2415
|
return {
|
|
@@ -4373,12 +4978,14 @@ var MSSQLStore = class extends storage.MastraCompositeStore {
|
|
|
4373
4978
|
const memory = new MemoryMSSQL(domainConfig);
|
|
4374
4979
|
const observability = new ObservabilityMSSQL(domainConfig);
|
|
4375
4980
|
const backgroundTasks = new BackgroundTasksMSSQL(domainConfig);
|
|
4981
|
+
const agents = new AgentsMSSQL(domainConfig);
|
|
4376
4982
|
this.stores = {
|
|
4377
4983
|
scores,
|
|
4378
4984
|
workflows,
|
|
4379
4985
|
memory,
|
|
4380
4986
|
observability,
|
|
4381
|
-
backgroundTasks
|
|
4987
|
+
backgroundTasks,
|
|
4988
|
+
agents
|
|
4382
4989
|
};
|
|
4383
4990
|
} catch (e) {
|
|
4384
4991
|
throw new error.MastraError(
|
|
@@ -4431,6 +5038,7 @@ var MSSQLStore = class extends storage.MastraCompositeStore {
|
|
|
4431
5038
|
}
|
|
4432
5039
|
};
|
|
4433
5040
|
|
|
5041
|
+
exports.AgentsMSSQL = AgentsMSSQL;
|
|
4434
5042
|
exports.BackgroundTasksMSSQL = BackgroundTasksMSSQL;
|
|
4435
5043
|
exports.MSSQLStore = MSSQLStore;
|
|
4436
5044
|
exports.MemoryMSSQL = MemoryMSSQL;
|