@an5/orm 1.0.4 → 1.0.6
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/README.md +123 -123
- package/dist/an5Orm.js +14 -14
- package/dist/cleanup.js +10 -7
- package/dist/cli.js +0 -0
- package/dist/generator/src/code-generator.js +39 -39
- package/dist/generator/src/dotnet-generator.js +436 -436
- package/dist/generator/src/index.js +5 -2
- package/dist/generator/src/metadata-generator.js +20 -2
- package/dist/generator/src/python-generator.js +15 -3
- package/dist/migrate.js +25 -22
- package/dist/pull.js +44 -41
- package/dist/push.js +4 -1
- package/dist/seed.js +123 -123
- package/generator/src/code-generator.ts +234 -234
- package/generator/src/dotnet-generator.ts +544 -544
- package/generator/src/index.ts +94 -91
- package/generator/src/metadata-generator.ts +99 -79
- package/generator/src/parser.ts +202 -202
- package/generator/src/python-generator.ts +94 -80
- package/generator/src/types.ts +29 -29
- package/package.json +38 -38
|
@@ -29,13 +29,16 @@ async function main() {
|
|
|
29
29
|
const rootDir = process.cwd();
|
|
30
30
|
let config = {};
|
|
31
31
|
try {
|
|
32
|
-
|
|
32
|
+
let configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
|
|
33
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
34
|
+
configPath = path_1.default.join(rootDir, 'an5Orm.config.cjs');
|
|
35
|
+
}
|
|
33
36
|
if (fs_1.default.existsSync(configPath)) {
|
|
34
37
|
config = require(configPath);
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
catch (err) {
|
|
38
|
-
console.warn('⚠️ Could not load an5Orm.config.js, using defaults.', err);
|
|
41
|
+
console.warn('⚠️ Could not load an5Orm.config.js/.cjs, using defaults.', err);
|
|
39
42
|
}
|
|
40
43
|
const schemaDir = path_1.default.resolve(rootDir, config.schemaDir || 'an5Schema');
|
|
41
44
|
const outputTypesDir = path_1.default.resolve(rootDir, config.outputs?.typescript?.outputDir || 'an5Client/typescript');
|
|
@@ -20,10 +20,18 @@ class MetadataGenerator {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
metaContent += '};\n\n';
|
|
23
|
-
metaContent += 'export const
|
|
23
|
+
metaContent += 'export const modelDescriptions: Record<string, string | undefined> = {\n';
|
|
24
24
|
for (const model of models) {
|
|
25
25
|
const props = this.getAllPropertyVariations(model.name);
|
|
26
|
-
|
|
26
|
+
for (const prop of props) {
|
|
27
|
+
metaContent += ` ${prop}: ${model.description ? JSON.stringify(model.description) : 'undefined'},\n`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
metaContent += '};\n\n';
|
|
31
|
+
metaContent += 'export const modelFields: Record<string, Record<string, { ts: string; sql: string; description?: string }>> = {\n';
|
|
32
|
+
for (const model of models) {
|
|
33
|
+
const props = this.getAllPropertyVariations(model.name);
|
|
34
|
+
const fieldsStr = `{ ${model.fields.map(f => `${f.name}: ${this.formatFieldMetadata(f)}`).join(', ')} }`;
|
|
27
35
|
for (const prop of props) {
|
|
28
36
|
metaContent += ` ${prop}: ${fieldsStr},\n`;
|
|
29
37
|
}
|
|
@@ -63,6 +71,16 @@ class MetadataGenerator {
|
|
|
63
71
|
}
|
|
64
72
|
return Array.from(variations);
|
|
65
73
|
}
|
|
74
|
+
formatFieldMetadata(field) {
|
|
75
|
+
const entries = [
|
|
76
|
+
`ts: ${JSON.stringify(`${field.type}${field.isOptional ? '?' : ''}`)}`,
|
|
77
|
+
`sql: ${JSON.stringify(field.sqlType)}`,
|
|
78
|
+
];
|
|
79
|
+
if (field.description) {
|
|
80
|
+
entries.push(`description: ${JSON.stringify(field.description)}`);
|
|
81
|
+
}
|
|
82
|
+
return `{ ${entries.join(', ')} }`;
|
|
83
|
+
}
|
|
66
84
|
toCamelCase(str) {
|
|
67
85
|
if (!str)
|
|
68
86
|
return '';
|
|
@@ -21,7 +21,16 @@ class PythonGenerator {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
pyContent += '}\n\n';
|
|
24
|
-
// 2.
|
|
24
|
+
// 2. MODEL_DESCRIPTIONS
|
|
25
|
+
pyContent += 'MODEL_DESCRIPTIONS = {\n';
|
|
26
|
+
for (const model of models) {
|
|
27
|
+
const props = this.getAllPropertyVariations(model.name);
|
|
28
|
+
for (const prop of props) {
|
|
29
|
+
pyContent += ` "${prop}": ${this.pyString(model.description)},\n`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
pyContent += '}\n\n';
|
|
33
|
+
// 3. MODEL_FIELDS
|
|
25
34
|
pyContent += 'MODEL_FIELDS = {\n';
|
|
26
35
|
for (const model of models) {
|
|
27
36
|
const props = this.getAllPropertyVariations(model.name);
|
|
@@ -31,7 +40,7 @@ class PythonGenerator {
|
|
|
31
40
|
}
|
|
32
41
|
}
|
|
33
42
|
pyContent += '}\n\n';
|
|
34
|
-
//
|
|
43
|
+
// 4. RELATION_MAP
|
|
35
44
|
pyContent += 'RELATION_MAP = {\n';
|
|
36
45
|
for (const model of models) {
|
|
37
46
|
const props = this.getAllPropertyVariations(model.name);
|
|
@@ -72,10 +81,13 @@ class PythonGenerator {
|
|
|
72
81
|
if (model.fields.length === 0)
|
|
73
82
|
return '[]';
|
|
74
83
|
const fields = model.fields.map(f => {
|
|
75
|
-
return ` { "name": "${f.name}", "type": "${f.type}${f.isOptional ? '?' : ''}", "sql": "${f.sqlType}", "isOptional": ${f.isOptional ? 'True' : 'False'}, "hasDefault": ${f.hasDefault ? 'True' : 'False'}, "isId": ${f.isId ? 'True' : 'False'} }`;
|
|
84
|
+
return ` { "name": "${f.name}", "type": "${f.type}${f.isOptional ? '?' : ''}", "sql": "${f.sqlType}", "isOptional": ${f.isOptional ? 'True' : 'False'}, "hasDefault": ${f.hasDefault ? 'True' : 'False'}, "isId": ${f.isId ? 'True' : 'False'}, "description": ${this.pyString(f.description)} }`;
|
|
76
85
|
});
|
|
77
86
|
return `[\n${fields.join(',\n')}\n ]`;
|
|
78
87
|
}
|
|
88
|
+
pyString(value) {
|
|
89
|
+
return value ? JSON.stringify(value) : 'None';
|
|
90
|
+
}
|
|
79
91
|
toCamelCase(str) {
|
|
80
92
|
if (!str)
|
|
81
93
|
return '';
|
package/dist/migrate.js
CHANGED
|
@@ -19,7 +19,10 @@ const an5_adapters_1 = require("@an5/adapters");
|
|
|
19
19
|
const rootDir = process.cwd();
|
|
20
20
|
let config = {};
|
|
21
21
|
try {
|
|
22
|
-
|
|
22
|
+
let configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
|
|
23
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
24
|
+
configPath = path_1.default.join(rootDir, 'an5Orm.config.cjs');
|
|
25
|
+
}
|
|
23
26
|
if (fs_1.default.existsSync(configPath)) {
|
|
24
27
|
config = require(configPath);
|
|
25
28
|
}
|
|
@@ -125,30 +128,30 @@ function parseSchema() {
|
|
|
125
128
|
return models;
|
|
126
129
|
}
|
|
127
130
|
async function introspectTable(tableName) {
|
|
128
|
-
return (await getDb()).$queryRawUnsafe(`
|
|
129
|
-
SELECT
|
|
130
|
-
c.name AS columnName,
|
|
131
|
-
ty.name AS dataType,
|
|
132
|
-
c.is_nullable AS isNullable,
|
|
133
|
-
pk.is_primary_key AS isPrimaryKey,
|
|
134
|
-
c.is_identity AS isIdentity,
|
|
135
|
-
d.definition AS defaultValue
|
|
136
|
-
FROM sys.columns c
|
|
137
|
-
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
|
|
138
|
-
LEFT JOIN (
|
|
139
|
-
SELECT ic.object_id, ic.column_id, i.is_primary_key
|
|
140
|
-
FROM sys.index_columns ic
|
|
141
|
-
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
142
|
-
WHERE i.is_primary_key = 1
|
|
143
|
-
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
|
|
144
|
-
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
|
|
145
|
-
WHERE c.object_id = OBJECT_ID(@p_0)
|
|
146
|
-
ORDER BY c.column_id
|
|
131
|
+
return (await getDb()).$queryRawUnsafe(`
|
|
132
|
+
SELECT
|
|
133
|
+
c.name AS columnName,
|
|
134
|
+
ty.name AS dataType,
|
|
135
|
+
c.is_nullable AS isNullable,
|
|
136
|
+
pk.is_primary_key AS isPrimaryKey,
|
|
137
|
+
c.is_identity AS isIdentity,
|
|
138
|
+
d.definition AS defaultValue
|
|
139
|
+
FROM sys.columns c
|
|
140
|
+
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
|
|
141
|
+
LEFT JOIN (
|
|
142
|
+
SELECT ic.object_id, ic.column_id, i.is_primary_key
|
|
143
|
+
FROM sys.index_columns ic
|
|
144
|
+
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
145
|
+
WHERE i.is_primary_key = 1
|
|
146
|
+
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
|
|
147
|
+
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
|
|
148
|
+
WHERE c.object_id = OBJECT_ID(@p_0)
|
|
149
|
+
ORDER BY c.column_id
|
|
147
150
|
`, tableName);
|
|
148
151
|
}
|
|
149
152
|
async function getExistingTables() {
|
|
150
|
-
const rows = await (await getDb()).$queryRawUnsafe(`
|
|
151
|
-
SELECT name FROM sys.tables WHERE is_ms_shipped = 0 ORDER BY name
|
|
153
|
+
const rows = await (await getDb()).$queryRawUnsafe(`
|
|
154
|
+
SELECT name FROM sys.tables WHERE is_ms_shipped = 0 ORDER BY name
|
|
152
155
|
`);
|
|
153
156
|
return rows.map(r => r.name);
|
|
154
157
|
}
|
package/dist/pull.js
CHANGED
|
@@ -10,7 +10,10 @@ const an5_adapters_1 = require("@an5/adapters");
|
|
|
10
10
|
const rootDir = process.cwd();
|
|
11
11
|
let config = {};
|
|
12
12
|
try {
|
|
13
|
-
|
|
13
|
+
let configPath = path_1.default.join(rootDir, "an5Orm.config.js");
|
|
14
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
15
|
+
configPath = path_1.default.join(rootDir, "an5Orm.config.cjs");
|
|
16
|
+
}
|
|
14
17
|
if (fs_1.default.existsSync(configPath)) {
|
|
15
18
|
config = require(configPath);
|
|
16
19
|
}
|
|
@@ -32,12 +35,12 @@ function capitalize(str) {
|
|
|
32
35
|
}
|
|
33
36
|
async function pull() {
|
|
34
37
|
console.log("🔍 Pulling schema from database...");
|
|
35
|
-
const tables = await (await getDb()).$queryRawUnsafe(`
|
|
36
|
-
SELECT s.name AS schemaName, t.name AS tableName
|
|
37
|
-
FROM sys.tables t
|
|
38
|
-
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
39
|
-
WHERE t.is_ms_shipped = 0
|
|
40
|
-
ORDER BY t.name
|
|
38
|
+
const tables = await (await getDb()).$queryRawUnsafe(`
|
|
39
|
+
SELECT s.name AS schemaName, t.name AS tableName
|
|
40
|
+
FROM sys.tables t
|
|
41
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
42
|
+
WHERE t.is_ms_shipped = 0
|
|
43
|
+
ORDER BY t.name
|
|
41
44
|
`);
|
|
42
45
|
// Load existing schema files
|
|
43
46
|
const fileContents = {};
|
|
@@ -84,42 +87,42 @@ async function pull() {
|
|
|
84
87
|
const { tableName } = table;
|
|
85
88
|
console.log(`Introspecting table [${tableName}]...`);
|
|
86
89
|
// Get columns
|
|
87
|
-
const columns = await (await getDb()).$queryRawUnsafe(`
|
|
88
|
-
SELECT
|
|
89
|
-
c.name AS columnName,
|
|
90
|
-
ty.name AS dataType,
|
|
91
|
-
c.max_length AS maxLength,
|
|
92
|
-
c.precision AS precision,
|
|
93
|
-
c.scale AS scale,
|
|
94
|
-
c.is_nullable AS isNullable,
|
|
95
|
-
c.is_identity AS isIdentity,
|
|
96
|
-
pk.is_primary_key AS isPrimaryKey,
|
|
97
|
-
d.definition AS defaultValue
|
|
98
|
-
FROM sys.columns c
|
|
99
|
-
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
|
|
100
|
-
LEFT JOIN (
|
|
101
|
-
SELECT ic.object_id, ic.column_id, i.is_primary_key
|
|
102
|
-
FROM sys.index_columns ic
|
|
103
|
-
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
104
|
-
WHERE i.is_primary_key = 1
|
|
105
|
-
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
|
|
106
|
-
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
|
|
107
|
-
WHERE c.object_id = OBJECT_ID(@p_0)
|
|
108
|
-
ORDER BY c.column_id
|
|
90
|
+
const columns = await (await getDb()).$queryRawUnsafe(`
|
|
91
|
+
SELECT
|
|
92
|
+
c.name AS columnName,
|
|
93
|
+
ty.name AS dataType,
|
|
94
|
+
c.max_length AS maxLength,
|
|
95
|
+
c.precision AS precision,
|
|
96
|
+
c.scale AS scale,
|
|
97
|
+
c.is_nullable AS isNullable,
|
|
98
|
+
c.is_identity AS isIdentity,
|
|
99
|
+
pk.is_primary_key AS isPrimaryKey,
|
|
100
|
+
d.definition AS defaultValue
|
|
101
|
+
FROM sys.columns c
|
|
102
|
+
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
|
|
103
|
+
LEFT JOIN (
|
|
104
|
+
SELECT ic.object_id, ic.column_id, i.is_primary_key
|
|
105
|
+
FROM sys.index_columns ic
|
|
106
|
+
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
107
|
+
WHERE i.is_primary_key = 1
|
|
108
|
+
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
|
|
109
|
+
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
|
|
110
|
+
WHERE c.object_id = OBJECT_ID(@p_0)
|
|
111
|
+
ORDER BY c.column_id
|
|
109
112
|
`, tableName);
|
|
110
113
|
// Get indexes
|
|
111
|
-
const indexes = await (await getDb()).$queryRawUnsafe(`
|
|
112
|
-
SELECT
|
|
113
|
-
i.name AS indexName,
|
|
114
|
-
i.is_unique AS isUnique,
|
|
115
|
-
i.is_primary_key AS isPrimaryKey,
|
|
116
|
-
c.name AS columnName,
|
|
117
|
-
ic.key_ordinal AS keyOrdinal
|
|
118
|
-
FROM sys.indexes i
|
|
119
|
-
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
120
|
-
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
121
|
-
WHERE i.object_id = OBJECT_ID(@p_0) AND i.is_hypothetical = 0 AND i.name IS NOT NULL
|
|
122
|
-
ORDER BY i.name, ic.key_ordinal
|
|
114
|
+
const indexes = await (await getDb()).$queryRawUnsafe(`
|
|
115
|
+
SELECT
|
|
116
|
+
i.name AS indexName,
|
|
117
|
+
i.is_unique AS isUnique,
|
|
118
|
+
i.is_primary_key AS isPrimaryKey,
|
|
119
|
+
c.name AS columnName,
|
|
120
|
+
ic.key_ordinal AS keyOrdinal
|
|
121
|
+
FROM sys.indexes i
|
|
122
|
+
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
123
|
+
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
124
|
+
WHERE i.object_id = OBJECT_ID(@p_0) AND i.is_hypothetical = 0 AND i.name IS NOT NULL
|
|
125
|
+
ORDER BY i.name, ic.key_ordinal
|
|
123
126
|
`, tableName);
|
|
124
127
|
const indexGroups = {};
|
|
125
128
|
for (const idx of indexes) {
|
package/dist/push.js
CHANGED
|
@@ -10,7 +10,10 @@ const adapters_1 = require("@an5/adapters");
|
|
|
10
10
|
const rootDir = process.cwd();
|
|
11
11
|
let config = {};
|
|
12
12
|
try {
|
|
13
|
-
|
|
13
|
+
let configPath = path_1.default.join(rootDir, "an5Orm.config.js");
|
|
14
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
15
|
+
configPath = path_1.default.join(rootDir, "an5Orm.config.cjs");
|
|
16
|
+
}
|
|
14
17
|
if (fs_1.default.existsSync(configPath)) {
|
|
15
18
|
config = require(configPath);
|
|
16
19
|
}
|
package/dist/seed.js
CHANGED
|
@@ -31,60 +31,60 @@ async function main() {
|
|
|
31
31
|
if (db) {
|
|
32
32
|
await db.lLMProvider.findMany({ take: 1 });
|
|
33
33
|
// Ensure mcp_servers table exists
|
|
34
|
-
await db.$executeRawUnsafe(`
|
|
35
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
|
|
36
|
-
BEGIN
|
|
37
|
-
CREATE TABLE [mcp_servers] (
|
|
38
|
-
[id] NVARCHAR(255) NOT NULL PRIMARY KEY,
|
|
39
|
-
[name] NVARCHAR(255) NOT NULL,
|
|
40
|
-
[command] NVARCHAR(255) NOT NULL,
|
|
41
|
-
[args] NVARCHAR(MAX) NOT NULL,
|
|
42
|
-
[env] NVARCHAR(MAX) NULL,
|
|
43
|
-
[isActive] BIT NOT NULL DEFAULT 1,
|
|
44
|
-
[createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
45
|
-
[updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
46
|
-
);
|
|
47
|
-
END
|
|
34
|
+
await db.$executeRawUnsafe(`
|
|
35
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
|
|
36
|
+
BEGIN
|
|
37
|
+
CREATE TABLE [mcp_servers] (
|
|
38
|
+
[id] NVARCHAR(255) NOT NULL PRIMARY KEY,
|
|
39
|
+
[name] NVARCHAR(255) NOT NULL,
|
|
40
|
+
[command] NVARCHAR(255) NOT NULL,
|
|
41
|
+
[args] NVARCHAR(MAX) NOT NULL,
|
|
42
|
+
[env] NVARCHAR(MAX) NULL,
|
|
43
|
+
[isActive] BIT NOT NULL DEFAULT 1,
|
|
44
|
+
[createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
45
|
+
[updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
46
|
+
);
|
|
47
|
+
END
|
|
48
48
|
`);
|
|
49
49
|
console.log("✅ Verified mcp_servers table exists or created.");
|
|
50
50
|
// Ensure pipeline_packages table exists
|
|
51
|
-
await db.$executeRawUnsafe(`
|
|
52
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
|
|
53
|
-
BEGIN
|
|
54
|
-
CREATE TABLE [pipeline_packages] (
|
|
55
|
-
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
56
|
-
[name] NVARCHAR(255) NOT NULL UNIQUE,
|
|
57
|
-
[description] NVARCHAR(MAX) NULL,
|
|
58
|
-
[definition] NVARCHAR(MAX) NOT NULL,
|
|
59
|
-
[generatedSql] NVARCHAR(MAX) NULL,
|
|
60
|
-
[lastRunAt] DATETIME2 NULL,
|
|
61
|
-
[lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
|
|
62
|
-
[createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
63
|
-
[updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
|
|
64
|
-
);
|
|
65
|
-
END
|
|
51
|
+
await db.$executeRawUnsafe(`
|
|
52
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
|
|
53
|
+
BEGIN
|
|
54
|
+
CREATE TABLE [pipeline_packages] (
|
|
55
|
+
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
56
|
+
[name] NVARCHAR(255) NOT NULL UNIQUE,
|
|
57
|
+
[description] NVARCHAR(MAX) NULL,
|
|
58
|
+
[definition] NVARCHAR(MAX) NOT NULL,
|
|
59
|
+
[generatedSql] NVARCHAR(MAX) NULL,
|
|
60
|
+
[lastRunAt] DATETIME2 NULL,
|
|
61
|
+
[lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
|
|
62
|
+
[createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
63
|
+
[updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
|
|
64
|
+
);
|
|
65
|
+
END
|
|
66
66
|
`);
|
|
67
67
|
console.log("✅ Verified pipeline_packages table exists or created.");
|
|
68
68
|
// Ensure pipeline_execution_logs table exists
|
|
69
|
-
await db.$executeRawUnsafe(`
|
|
70
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
|
|
71
|
-
BEGIN
|
|
72
|
-
CREATE TABLE [pipeline_execution_logs] (
|
|
73
|
-
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
74
|
-
[packageId] UNIQUEIDENTIFIER NOT NULL,
|
|
75
|
-
[packageName] NVARCHAR(255) NOT NULL,
|
|
76
|
-
[status] NVARCHAR(50) NOT NULL DEFAULT 'running',
|
|
77
|
-
[rowsAffected] INT NULL,
|
|
78
|
-
[durationMs] INT NULL,
|
|
79
|
-
[errorMessage] NVARCHAR(MAX) NULL,
|
|
80
|
-
[executedSql] NVARCHAR(MAX) NULL,
|
|
81
|
-
[connectionId] NVARCHAR(255) NULL,
|
|
82
|
-
[startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
83
|
-
[finishedAt] DATETIME2 NULL
|
|
84
|
-
);
|
|
85
|
-
CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
|
|
86
|
-
CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
|
|
87
|
-
END
|
|
69
|
+
await db.$executeRawUnsafe(`
|
|
70
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
|
|
71
|
+
BEGIN
|
|
72
|
+
CREATE TABLE [pipeline_execution_logs] (
|
|
73
|
+
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
74
|
+
[packageId] UNIQUEIDENTIFIER NOT NULL,
|
|
75
|
+
[packageName] NVARCHAR(255) NOT NULL,
|
|
76
|
+
[status] NVARCHAR(50) NOT NULL DEFAULT 'running',
|
|
77
|
+
[rowsAffected] INT NULL,
|
|
78
|
+
[durationMs] INT NULL,
|
|
79
|
+
[errorMessage] NVARCHAR(MAX) NULL,
|
|
80
|
+
[executedSql] NVARCHAR(MAX) NULL,
|
|
81
|
+
[connectionId] NVARCHAR(255) NULL,
|
|
82
|
+
[startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
83
|
+
[finishedAt] DATETIME2 NULL
|
|
84
|
+
);
|
|
85
|
+
CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
|
|
86
|
+
CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
|
|
87
|
+
END
|
|
88
88
|
`);
|
|
89
89
|
console.log("✅ Verified pipeline_execution_logs table exists or created.");
|
|
90
90
|
}
|
|
@@ -253,60 +253,60 @@ async function runFallbackAn5Seed(config) {
|
|
|
253
253
|
try {
|
|
254
254
|
await pool.connect();
|
|
255
255
|
// Ensure mcp_servers table exists in fallback seeder
|
|
256
|
-
await pool.request().query(`
|
|
257
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
|
|
258
|
-
BEGIN
|
|
259
|
-
CREATE TABLE [mcp_servers] (
|
|
260
|
-
[id] NVARCHAR(255) NOT NULL PRIMARY KEY,
|
|
261
|
-
[name] NVARCHAR(255) NOT NULL,
|
|
262
|
-
[command] NVARCHAR(255) NOT NULL,
|
|
263
|
-
[args] NVARCHAR(MAX) NOT NULL,
|
|
264
|
-
[env] NVARCHAR(MAX) NULL,
|
|
265
|
-
[isActive] BIT NOT NULL DEFAULT 1,
|
|
266
|
-
[createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
267
|
-
[updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
268
|
-
);
|
|
269
|
-
END
|
|
256
|
+
await pool.request().query(`
|
|
257
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
|
|
258
|
+
BEGIN
|
|
259
|
+
CREATE TABLE [mcp_servers] (
|
|
260
|
+
[id] NVARCHAR(255) NOT NULL PRIMARY KEY,
|
|
261
|
+
[name] NVARCHAR(255) NOT NULL,
|
|
262
|
+
[command] NVARCHAR(255) NOT NULL,
|
|
263
|
+
[args] NVARCHAR(MAX) NOT NULL,
|
|
264
|
+
[env] NVARCHAR(MAX) NULL,
|
|
265
|
+
[isActive] BIT NOT NULL DEFAULT 1,
|
|
266
|
+
[createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
267
|
+
[updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
268
|
+
);
|
|
269
|
+
END
|
|
270
270
|
`);
|
|
271
271
|
console.log("✅ Fallback: Verified mcp_servers table exists or created.");
|
|
272
272
|
// Ensure pipeline_packages table exists in fallback seeder
|
|
273
|
-
await pool.request().query(`
|
|
274
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
|
|
275
|
-
BEGIN
|
|
276
|
-
CREATE TABLE [pipeline_packages] (
|
|
277
|
-
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
278
|
-
[name] NVARCHAR(255) NOT NULL UNIQUE,
|
|
279
|
-
[description] NVARCHAR(MAX) NULL,
|
|
280
|
-
[definition] NVARCHAR(MAX) NOT NULL,
|
|
281
|
-
[generatedSql] NVARCHAR(MAX) NULL,
|
|
282
|
-
[lastRunAt] DATETIME2 NULL,
|
|
283
|
-
[lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
|
|
284
|
-
[createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
285
|
-
[updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
|
|
286
|
-
);
|
|
287
|
-
END
|
|
273
|
+
await pool.request().query(`
|
|
274
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
|
|
275
|
+
BEGIN
|
|
276
|
+
CREATE TABLE [pipeline_packages] (
|
|
277
|
+
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
278
|
+
[name] NVARCHAR(255) NOT NULL UNIQUE,
|
|
279
|
+
[description] NVARCHAR(MAX) NULL,
|
|
280
|
+
[definition] NVARCHAR(MAX) NOT NULL,
|
|
281
|
+
[generatedSql] NVARCHAR(MAX) NULL,
|
|
282
|
+
[lastRunAt] DATETIME2 NULL,
|
|
283
|
+
[lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
|
|
284
|
+
[createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
285
|
+
[updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
|
|
286
|
+
);
|
|
287
|
+
END
|
|
288
288
|
`);
|
|
289
289
|
console.log("✅ Fallback: Verified pipeline_packages table exists or created.");
|
|
290
290
|
// Ensure pipeline_execution_logs table exists in fallback seeder
|
|
291
|
-
await pool.request().query(`
|
|
292
|
-
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
|
|
293
|
-
BEGIN
|
|
294
|
-
CREATE TABLE [pipeline_execution_logs] (
|
|
295
|
-
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
296
|
-
[packageId] UNIQUEIDENTIFIER NOT NULL,
|
|
297
|
-
[packageName] NVARCHAR(255) NOT NULL,
|
|
298
|
-
[status] NVARCHAR(50) NOT NULL DEFAULT 'running',
|
|
299
|
-
[rowsAffected] INT NULL,
|
|
300
|
-
[durationMs] INT NULL,
|
|
301
|
-
[errorMessage] NVARCHAR(MAX) NULL,
|
|
302
|
-
[executedSql] NVARCHAR(MAX) NULL,
|
|
303
|
-
[connectionId] NVARCHAR(255) NULL,
|
|
304
|
-
[startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
305
|
-
[finishedAt] DATETIME2 NULL
|
|
306
|
-
);
|
|
307
|
-
CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
|
|
308
|
-
CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
|
|
309
|
-
END
|
|
291
|
+
await pool.request().query(`
|
|
292
|
+
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
|
|
293
|
+
BEGIN
|
|
294
|
+
CREATE TABLE [pipeline_execution_logs] (
|
|
295
|
+
[id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
|
|
296
|
+
[packageId] UNIQUEIDENTIFIER NOT NULL,
|
|
297
|
+
[packageName] NVARCHAR(255) NOT NULL,
|
|
298
|
+
[status] NVARCHAR(50) NOT NULL DEFAULT 'running',
|
|
299
|
+
[rowsAffected] INT NULL,
|
|
300
|
+
[durationMs] INT NULL,
|
|
301
|
+
[errorMessage] NVARCHAR(MAX) NULL,
|
|
302
|
+
[executedSql] NVARCHAR(MAX) NULL,
|
|
303
|
+
[connectionId] NVARCHAR(255) NULL,
|
|
304
|
+
[startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
|
|
305
|
+
[finishedAt] DATETIME2 NULL
|
|
306
|
+
);
|
|
307
|
+
CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
|
|
308
|
+
CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
|
|
309
|
+
END
|
|
310
310
|
`);
|
|
311
311
|
console.log("✅ Fallback: Verified pipeline_execution_logs table exists or created.");
|
|
312
312
|
// Seed providers
|
|
@@ -323,15 +323,15 @@ async function runFallbackAn5Seed(config) {
|
|
|
323
323
|
req.input('isDefault', sql.Bit, provider.isDefault ? 1 : 0);
|
|
324
324
|
req.input('description', sql.NVarChar(sql.MAX), provider.description ?? null);
|
|
325
325
|
req.input('dimensions', sql.Int, provider.dimensions ?? null);
|
|
326
|
-
const upsertSql = `
|
|
327
|
-
IF EXISTS (SELECT 1 FROM llm_providers WHERE name = @name)
|
|
328
|
-
BEGIN
|
|
329
|
-
UPDATE llm_providers SET provider=@provider, model=@model, modelType=@modelType, apiKey=@apiKey, apiEndpoint=@apiEndpoint, supportsVision=@supportsVision, isActive=@isActive, isDefault=@isDefault, description=@description, dimensions=@dimensions WHERE name=@name;
|
|
330
|
-
END
|
|
331
|
-
ELSE
|
|
332
|
-
BEGIN
|
|
333
|
-
INSERT INTO llm_providers (name, provider, model, modelType, apiKey, apiEndpoint, supportsVision, isActive, isDefault, description, dimensions)
|
|
334
|
-
VALUES (@name,@provider,@model,@modelType,@apiKey,@apiEndpoint,@supportsVision,@isActive,@isDefault,@description,@dimensions);
|
|
326
|
+
const upsertSql = `
|
|
327
|
+
IF EXISTS (SELECT 1 FROM llm_providers WHERE name = @name)
|
|
328
|
+
BEGIN
|
|
329
|
+
UPDATE llm_providers SET provider=@provider, model=@model, modelType=@modelType, apiKey=@apiKey, apiEndpoint=@apiEndpoint, supportsVision=@supportsVision, isActive=@isActive, isDefault=@isDefault, description=@description, dimensions=@dimensions WHERE name=@name;
|
|
330
|
+
END
|
|
331
|
+
ELSE
|
|
332
|
+
BEGIN
|
|
333
|
+
INSERT INTO llm_providers (name, provider, model, modelType, apiKey, apiEndpoint, supportsVision, isActive, isDefault, description, dimensions)
|
|
334
|
+
VALUES (@name,@provider,@model,@modelType,@apiKey,@apiEndpoint,@supportsVision,@isActive,@isDefault,@description,@dimensions);
|
|
335
335
|
END`;
|
|
336
336
|
await req.query(upsertSql);
|
|
337
337
|
console.log(`✅ Fallback Created/Updated provider: ${provider.name}`);
|
|
@@ -342,15 +342,15 @@ END`;
|
|
|
342
342
|
const reqUser = pool.request();
|
|
343
343
|
reqUser.input('email', sql.NVarChar(sql.MAX), adminEmail);
|
|
344
344
|
reqUser.input('password', sql.NVarChar(sql.MAX), hashedPassword);
|
|
345
|
-
const userSql = `
|
|
346
|
-
IF EXISTS (SELECT 1 FROM users WHERE email = @email)
|
|
347
|
-
BEGIN
|
|
348
|
-
UPDATE users SET password=@password, type='admin', name='Admin', isActive=1, updatedAt=SYSDATETIME() WHERE email=@email;
|
|
349
|
-
END
|
|
350
|
-
ELSE
|
|
351
|
-
BEGIN
|
|
352
|
-
INSERT INTO users (id, email, password, type, name, isActive, createdAt, updatedAt)
|
|
353
|
-
VALUES (NEWID(), @email, @password, 'admin', 'Admin', 1, SYSDATETIME(), SYSDATETIME());
|
|
345
|
+
const userSql = `
|
|
346
|
+
IF EXISTS (SELECT 1 FROM users WHERE email = @email)
|
|
347
|
+
BEGIN
|
|
348
|
+
UPDATE users SET password=@password, type='admin', name='Admin', isActive=1, updatedAt=SYSDATETIME() WHERE email=@email;
|
|
349
|
+
END
|
|
350
|
+
ELSE
|
|
351
|
+
BEGIN
|
|
352
|
+
INSERT INTO users (id, email, password, type, name, isActive, createdAt, updatedAt)
|
|
353
|
+
VALUES (NEWID(), @email, @password, 'admin', 'Admin', 1, SYSDATETIME(), SYSDATETIME());
|
|
354
354
|
END`;
|
|
355
355
|
await reqUser.query(userSql);
|
|
356
356
|
// Get admin id
|
|
@@ -373,15 +373,15 @@ END`;
|
|
|
373
373
|
r.input('username', sql.NVarChar(sql.MAX), conn.username);
|
|
374
374
|
r.input('password', sql.NVarChar(sql.MAX), conn.password);
|
|
375
375
|
r.input('type', sql.NVarChar(sql.MAX), conn.type);
|
|
376
|
-
const upsertConn = `
|
|
377
|
-
IF EXISTS (SELECT 1 FROM database_connections WHERE name = @name)
|
|
378
|
-
BEGIN
|
|
379
|
-
UPDATE database_connections SET host=@host, database=@database, username=@username, password=@password, type=@type, isActive=1 WHERE name=@name;
|
|
380
|
-
END
|
|
381
|
-
ELSE
|
|
382
|
-
BEGIN
|
|
383
|
-
INSERT INTO database_connections (id, name, host, port, database, username, password, type, isActive, createdAt, updatedAt)
|
|
384
|
-
VALUES (NEWID(), @name, @host, 1433, @database, @username, @password, @type, 1, SYSDATETIME(), SYSDATETIME());
|
|
376
|
+
const upsertConn = `
|
|
377
|
+
IF EXISTS (SELECT 1 FROM database_connections WHERE name = @name)
|
|
378
|
+
BEGIN
|
|
379
|
+
UPDATE database_connections SET host=@host, database=@database, username=@username, password=@password, type=@type, isActive=1 WHERE name=@name;
|
|
380
|
+
END
|
|
381
|
+
ELSE
|
|
382
|
+
BEGIN
|
|
383
|
+
INSERT INTO database_connections (id, name, host, port, database, username, password, type, isActive, createdAt, updatedAt)
|
|
384
|
+
VALUES (NEWID(), @name, @host, 1433, @database, @username, @password, @type, 1, SYSDATETIME(), SYSDATETIME());
|
|
385
385
|
END`;
|
|
386
386
|
await r.query(upsertConn);
|
|
387
387
|
console.log(`✅ Fallback Created/Updated connection: ${conn.name}`);
|