@solidstarters/solid-core 1.2.180 → 1.2.183
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/dev-grooming-docs/ozzy-prompts.txt +28 -3
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +2 -1
- package/dist/config/iam.config.js.map +1 -1
- package/dist/controllers/service.controller.d.ts.map +1 -1
- package/dist/controllers/service.controller.js +0 -1
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/decorators/active-user.decorator.d.ts +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
- package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
- package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +45 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/interfaces.d.ts +20 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +70 -9
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/repository/view-metadata.repository.d.ts +1 -0
- package/dist/repository/view-metadata.repository.d.ts.map +1 -1
- package/dist/repository/view-metadata.repository.js +14 -0
- package/dist/repository/view-metadata.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +259 -202
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +0 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
- package/dist/services/ai-interaction.service.d.ts +3 -3
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +5 -5
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +46 -35
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts → genai/mcp-handlers/mcp-handler-factory.service.d.ts} +3 -3
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js} +19 -20
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts} +9 -9
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js} +13 -13
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js} +8 -8
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts} +4 -4
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js} +8 -8
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js} +8 -8
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js} +14 -16
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts} +4 -4
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-module-mcp-handler.service.js} +13 -10
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts} +3 -3
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-update-layout-mcp-handler.service.js} +12 -10
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
- package/dist/services/import-transaction.service.js +2 -2
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +0 -2
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +1 -7
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +28 -0
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
- package/dist/services/solid-ts-morph.service.js +222 -0
- package/dist/services/solid-ts-morph.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -18
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -4
- package/solid_seed_fixes.ts.txt +93 -0
- package/src/config/iam.config.ts +2 -1
- package/src/controllers/service.controller.ts +4 -1
- package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
- package/src/dtos/create-role-metadata.dto.ts +60 -1
- package/src/interfaces.ts +29 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +74 -8
- package/src/repository/view-metadata.repository.ts +15 -0
- package/src/seeders/module-metadata-seeder.service.ts +355 -282
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +3 -5
- package/src/services/ai-interaction.service.ts +3 -5
- package/src/services/genai/ingest-metadata.service.ts +115 -39
- package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
- package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
- package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
- package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.ts} +8 -8
- package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.ts} +3 -3
- package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.ts} +3 -3
- package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.ts} +3 -3
- package/src/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.ts} +8 -10
- package/src/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.ts} +8 -5
- package/src/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.ts} +11 -5
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/menu-item-metadata.service.ts +3 -7
- package/src/services/model-metadata.service.ts +0 -3
- package/src/services/module-metadata.service.ts +2 -3
- package/src/services/role-metadata.service.ts +22 -8
- package/src/services/solid-ts-morph.service.ts +263 -0
- package/src/solid-core.module.ts +25 -19
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
- package/src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts +0 -56
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidstarters/solid-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.183",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -70,9 +70,9 @@
|
|
|
70
70
|
"pluralize": "^8.0.0",
|
|
71
71
|
"puppeteer": "^23.2.0",
|
|
72
72
|
"r2r-js": "^0.4.43",
|
|
73
|
-
"reflect-metadata": "^0.2.2",
|
|
74
73
|
"rxjs": "^7.8.1",
|
|
75
74
|
"swagger-ui-express": "^5.0.0",
|
|
75
|
+
"ts-morph": "^27.0.2",
|
|
76
76
|
"twilio": "^5.8.0",
|
|
77
77
|
"uuid": "^9.0.1",
|
|
78
78
|
"xlsx": "^0.18.5"
|
|
@@ -97,7 +97,8 @@
|
|
|
97
97
|
"nestjs-cls": "^5.4.3",
|
|
98
98
|
"typeorm": "^0.3.20",
|
|
99
99
|
"typeorm-naming-strategies": "^4.1.0",
|
|
100
|
-
"winston": "^3.17.0"
|
|
100
|
+
"winston": "^3.17.0",
|
|
101
|
+
"reflect-metadata": "^0.2.2"
|
|
101
102
|
},
|
|
102
103
|
"devDependencies": {
|
|
103
104
|
"@angular-devkit/schematics": "^19.2.6",
|
|
@@ -152,7 +153,8 @@
|
|
|
152
153
|
"typeorm": "^0.3.20",
|
|
153
154
|
"typeorm-naming-strategies": "^4.1.0",
|
|
154
155
|
"typescript": "^5.1.3",
|
|
155
|
-
"winston": "^3.17.0"
|
|
156
|
+
"winston": "^3.17.0",
|
|
157
|
+
"reflect-metadata": "^0.2.2"
|
|
156
158
|
},
|
|
157
159
|
"jest": {
|
|
158
160
|
"moduleFileExtensions": [
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { In } from "typeorm";
|
|
2
|
+
import { MenuItemMetadata } from "src/entities/menu-item-metadata.entity";
|
|
3
|
+
import { RoleMetadata } from "src/entities/role-metadata.entity";
|
|
4
|
+
import { ActionMetadata } from "src/entities/action-metadata.entity";
|
|
5
|
+
import { ModuleMetadata } from "src/entities/module-metadata.entity";
|
|
6
|
+
|
|
7
|
+
const JOIN_TABLE = "ss_menu_item_metadata_roles_role_metadata"; // <-- your actual join table
|
|
8
|
+
const MENU_COL = "menuItemId"; // <-- actual column name in the join table
|
|
9
|
+
const ROLE_COL = "roleId"; // <-- actual column name in the join table
|
|
10
|
+
|
|
11
|
+
await this.dataSource.transaction(async (trx) => {
|
|
12
|
+
const menuRepo = trx.getRepository(MenuItemMetadata);
|
|
13
|
+
const roleRepo = trx.getRepository(RoleMetadata);
|
|
14
|
+
const actionRepo = trx.getRepository(ActionMetadata);
|
|
15
|
+
const moduleRepo = trx.getRepository(ModuleMetadata);
|
|
16
|
+
|
|
17
|
+
// 1) Upsert menus WITHOUT roles
|
|
18
|
+
for (const m of menus) {
|
|
19
|
+
const entity = menuRepo.create({
|
|
20
|
+
name: m.name,
|
|
21
|
+
displayName: m.displayName,
|
|
22
|
+
action: m.actionUserKey
|
|
23
|
+
? await actionRepo.findOne({ where: { userKey: m.actionUserKey }, select: ["id"] })
|
|
24
|
+
: null,
|
|
25
|
+
module: m.moduleUserKey
|
|
26
|
+
? await moduleRepo.findOne({ where: { userKey: m.moduleUserKey }, select: ["id"] })
|
|
27
|
+
: null,
|
|
28
|
+
parentMenuItem: m.parentMenuItemUserKey
|
|
29
|
+
? await menuRepo.findOne({ where: { userKey: m.parentMenuItemUserKey }, select: ["id"] })
|
|
30
|
+
: null,
|
|
31
|
+
});
|
|
32
|
+
await menuRepo.upsert(entity, ["name"]); // or ["userKey"]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 2) Fetch ids for batching
|
|
36
|
+
const seeded = await menuRepo.find({
|
|
37
|
+
where: { name: In(menus.map(m => m.name)) },
|
|
38
|
+
select: ["id", "name"],
|
|
39
|
+
});
|
|
40
|
+
const idByName = new Map(seeded.map(s => [s.name, s.id]));
|
|
41
|
+
|
|
42
|
+
// 3) Build desired join rows once
|
|
43
|
+
const admin = await roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: ["id","name"] });
|
|
44
|
+
const allRoleNames = new Set<string>();
|
|
45
|
+
for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));
|
|
46
|
+
if (admin) allRoleNames.add(admin.name);
|
|
47
|
+
|
|
48
|
+
const roles = await roleRepo.find({
|
|
49
|
+
where: { name: In([...allRoleNames]) },
|
|
50
|
+
select: ["id","name"],
|
|
51
|
+
});
|
|
52
|
+
const roleByName = new Map(roles.map(r => [r.name, r]));
|
|
53
|
+
|
|
54
|
+
const joinRows: Array<{ menuId: number; roleId: number }> = [];
|
|
55
|
+
for (const m of menus) {
|
|
56
|
+
const menuId = idByName.get(m.name)!;
|
|
57
|
+
const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);
|
|
58
|
+
for (const rn of roleNames) {
|
|
59
|
+
const role = roleByName.get(rn);
|
|
60
|
+
if (role) joinRows.push({ menuId, roleId: role.id });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 4) Replace in bulk — QueryBuilder version
|
|
65
|
+
|
|
66
|
+
// 4a) delete existing for affected menus
|
|
67
|
+
const menuIds = [...new Set(joinRows.map(r => r.menuId))];
|
|
68
|
+
if (menuIds.length) {
|
|
69
|
+
await trx
|
|
70
|
+
.createQueryBuilder()
|
|
71
|
+
.delete()
|
|
72
|
+
.from(JOIN_TABLE) // string table name is fine
|
|
73
|
+
.where(`${MENU_COL} IN (:...ids)`, { ids: menuIds })
|
|
74
|
+
.execute();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 4b) bulk insert all pairs
|
|
78
|
+
if (joinRows.length) {
|
|
79
|
+
// Build objects with the exact column names used by the join table
|
|
80
|
+
const values = joinRows.map(r => ({
|
|
81
|
+
[MENU_COL]: r.menuId,
|
|
82
|
+
[ROLE_COL]: r.roleId,
|
|
83
|
+
}));
|
|
84
|
+
|
|
85
|
+
await trx
|
|
86
|
+
.createQueryBuilder()
|
|
87
|
+
.insert()
|
|
88
|
+
.into(JOIN_TABLE) // string table name
|
|
89
|
+
.values(values)
|
|
90
|
+
.orIgnore() // optional if you have a UNIQUE(menuItemId, roleId) and want to skip dups
|
|
91
|
+
.execute();
|
|
92
|
+
}
|
|
93
|
+
});
|
package/src/config/iam.config.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerAs } from '@nestjs/config';
|
|
2
|
+
import { Environment } from 'src';
|
|
2
3
|
|
|
3
4
|
export const iamConfig = registerAs('iam', () => {
|
|
4
5
|
return {
|
|
@@ -32,7 +33,7 @@ export const jwtConfig = registerAs('jwt', () => {
|
|
|
32
33
|
secret: process.env.IAM_JWT_SECRET,
|
|
33
34
|
audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
|
|
34
35
|
issuer: process.env.IAM_JWT_TOKEN_ISSUER,
|
|
35
|
-
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? '1200', 10), // 20 minutes
|
|
36
|
+
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? (process.env.ENV as Environment) === Environment.Production ? '1200' : '86400', 10), // 20 minutes in prod, 1 day otherwise
|
|
36
37
|
refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
|
|
37
38
|
};
|
|
38
39
|
});
|
|
@@ -136,7 +136,10 @@ export class ServiceController {
|
|
|
136
136
|
// Run the Solid ingestion command
|
|
137
137
|
if (config.runSolidIngestion) {
|
|
138
138
|
this.logger.debug(`Running the Solid ingestion command as part of post-process code generation`);
|
|
139
|
-
|
|
139
|
+
|
|
140
|
+
// TODO: disabled this till we figure out a way to make this stable...
|
|
141
|
+
// This keeps failing for a variety of reasons...
|
|
142
|
+
// await this.ingestMetadataService.ingest();
|
|
140
143
|
}
|
|
141
144
|
}
|
|
142
145
|
|
|
@@ -65,4 +65,8 @@ export class CreateMenuItemMetadataDto {
|
|
|
65
65
|
@ApiProperty()
|
|
66
66
|
iconName: string;
|
|
67
67
|
|
|
68
|
-
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const MENU_ROLE_JOIN_TABLE_NAME = "ss_menu_item_metadata_roles_ss_role_metadata"; // <-- your actual join table
|
|
71
|
+
export const MENU_ROLE_JOIN_TABLE_NAME_MENU_COL = "ss_menu_item_metadata_id"; // <-- actual column name in the join table
|
|
72
|
+
export const MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL = "ss_role_metadata_id"; // <-- actual column name in the join table
|
|
@@ -53,4 +53,63 @@ export class CreateRoleMetadataDto {
|
|
|
53
53
|
@IsOptional()
|
|
54
54
|
@ApiProperty()
|
|
55
55
|
menuItemsCommand: string;
|
|
56
|
-
}
|
|
56
|
+
}
|
|
57
|
+
export const ADMIN_ROLE_NAME = 'Admin';
|
|
58
|
+
export const INTERNAL_ROLE_NAME = 'Internal User';
|
|
59
|
+
export const PUBLIC_ROLE_NAME = 'Public';
|
|
60
|
+
export const INTERNAL_ROLE_PERMISSIONS = [
|
|
61
|
+
// User permissions
|
|
62
|
+
'UserController.findMany', //Why do we need this?
|
|
63
|
+
'UserController.checkIfPermissionExists',
|
|
64
|
+
'UserController.findOne',
|
|
65
|
+
// Menu permissions
|
|
66
|
+
'MenuItemMetadataController.findMany',
|
|
67
|
+
'MenuItemMetadataController.findUserMenus',
|
|
68
|
+
'MenuItemMetadataController.findOne',
|
|
69
|
+
// View metadata permissions
|
|
70
|
+
'ViewMetadataController.getLayout',
|
|
71
|
+
'ViewMetadataController.findMany',
|
|
72
|
+
'ViewMetadataController.findOne',
|
|
73
|
+
// User View metadata permissions
|
|
74
|
+
'UserViewMetadataController.upsert',
|
|
75
|
+
'UserViewMetadataController.findMany',
|
|
76
|
+
'UserViewMetadataController.findOne',
|
|
77
|
+
// IAM permissions
|
|
78
|
+
'AuthenticationController.changePassword',
|
|
79
|
+
// Field Metadata permissions
|
|
80
|
+
'FieldMetadataController.getSelectionDynamicValues',
|
|
81
|
+
'FieldMetadataController.getSelectionDynamicValue',
|
|
82
|
+
'FieldMetadataController.findFieldDefaultMetaData',
|
|
83
|
+
// Saved Filters permissions
|
|
84
|
+
'SavedFiltersController.delete',
|
|
85
|
+
'SavedFiltersController.deleteMany',
|
|
86
|
+
'SavedFiltersController.findOne',
|
|
87
|
+
'SavedFiltersController.findMany',
|
|
88
|
+
'SavedFiltersController.recover',
|
|
89
|
+
'SavedFiltersController.recoverMany',
|
|
90
|
+
'SavedFiltersController.partialUpdate',
|
|
91
|
+
'SavedFiltersController.update',
|
|
92
|
+
'SavedFiltersController.insertMany',
|
|
93
|
+
'SavedFiltersController.create',
|
|
94
|
+
// Logout permissions
|
|
95
|
+
'AuthenticationController.logout',
|
|
96
|
+
// Other permissions can be added here as required.
|
|
97
|
+
// Chatter permissions
|
|
98
|
+
'ChatterMessageController.create',
|
|
99
|
+
'ChatterMessageController.getChatterMessages',
|
|
100
|
+
// 'ChatterMessageController.postMessage', // Does not seem to be used from ui
|
|
101
|
+
// Import
|
|
102
|
+
'ImportTransactionController.getImportTemplate',
|
|
103
|
+
'ImportTransactionController.getImportInstructions',
|
|
104
|
+
'ImportTransactionController.getImportMappingInfo',
|
|
105
|
+
'ImportTransactionController.startImportSync',
|
|
106
|
+
'ImportTransactionController.startImportAsync',
|
|
107
|
+
'ImportTransactionController.exportFailedImportedImports',
|
|
108
|
+
// Export permissions
|
|
109
|
+
'ExportTemplateController.startExportSync',
|
|
110
|
+
'ExportTemplateController.startExportAsync',
|
|
111
|
+
// List of values
|
|
112
|
+
'ListOfValuesController.findMany',
|
|
113
|
+
'ListOfValuesController.findOne',
|
|
114
|
+
// Media // [Not required], since media is always populated as part of a model
|
|
115
|
+
]
|
package/src/interfaces.ts
CHANGED
|
@@ -66,7 +66,7 @@ export interface CodeGenerationOptions {
|
|
|
66
66
|
|
|
67
67
|
export interface TriggerMcpClientOptions {
|
|
68
68
|
aiInteractionId: number;
|
|
69
|
-
moduleName:string;
|
|
69
|
+
moduleName: string;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export interface McpResponse {
|
|
@@ -274,4 +274,31 @@ export interface IErrorCodeProvider {
|
|
|
274
274
|
* If omitted, the ErrorMapperService will rely on the rule.meta of the first matching rule.
|
|
275
275
|
*/
|
|
276
276
|
resolve?(code: ErrorCode): ErrorMeta | undefined;
|
|
277
|
-
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// MCP Tool Related
|
|
280
|
+
|
|
281
|
+
export type PlanStep = CreateNewFileStep | RegisterNestProviderStep;
|
|
282
|
+
|
|
283
|
+
export interface CreateNewFileStep {
|
|
284
|
+
type: "createNewFile";
|
|
285
|
+
path: string; // repo-relative e.g. solid-api/api/src/computed-providers/foo.provider.ts
|
|
286
|
+
content: string; // full file content
|
|
287
|
+
overwrite?: boolean; // default=false
|
|
288
|
+
rationale?: string; // optional, ignored by executor
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export interface RegisterNestProviderStep {
|
|
292
|
+
type: "registerNestProvider";
|
|
293
|
+
modulePath: string; // e.g. apps/api/src/address-master/address-master.module.ts
|
|
294
|
+
providerClassName: string; // e.g. StateTotalCitiesComputedFieldProvider
|
|
295
|
+
importFrom: string; // e.g. "@/computed-providers/state-total-cities.provider"
|
|
296
|
+
registerIn: Array<"providers" | "exports">; // which arrays to add to
|
|
297
|
+
uniqueGuard?: boolean; // default=true
|
|
298
|
+
rationale?: string; // optional, ignored by executor
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export interface McpComputedProviderResponse {
|
|
302
|
+
plan: PlanStep[];
|
|
303
|
+
// provider?: any; // (intentionally ignored per your note)
|
|
304
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
|
|
3
2
|
import { QueueMessage } from 'src/interfaces/mq';
|
|
4
3
|
import { MqMessageService } from '../../services/mq-message.service';
|
|
5
4
|
import { MqMessageQueueService } from '../../services/mq-message-queue.service';
|
|
@@ -8,6 +7,9 @@ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.serv
|
|
|
8
7
|
import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
|
|
9
8
|
import { AiInteractionService } from 'src/services/ai-interaction.service';
|
|
10
9
|
import { PollerService } from 'src/services/poller.service';
|
|
10
|
+
import { SolidRegistry } from 'src/helpers/solid-registry';
|
|
11
|
+
import { ModuleMetadataService } from 'src/services/module-metadata.service';
|
|
12
|
+
import { ModelMetadataService } from 'src';
|
|
11
13
|
|
|
12
14
|
@Injectable()
|
|
13
15
|
export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {
|
|
@@ -18,6 +20,10 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
18
20
|
readonly mqMessageQueueService: MqMessageQueueService,
|
|
19
21
|
readonly poller: PollerService,
|
|
20
22
|
readonly aiInteractionService: AiInteractionService,
|
|
23
|
+
readonly moduleMetadataService: ModuleMetadataService,
|
|
24
|
+
readonly modelMetadataService: ModelMetadataService,
|
|
25
|
+
private readonly solidRegistry: SolidRegistry,
|
|
26
|
+
|
|
21
27
|
) {
|
|
22
28
|
super(mqMessageService, mqMessageQueueService, poller);
|
|
23
29
|
}
|
|
@@ -95,23 +101,81 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
95
101
|
status: 'pending' // Updated after we receive the response
|
|
96
102
|
});
|
|
97
103
|
|
|
104
|
+
const existingComputationProviders = this.solidRegistry.getComputedFieldProviders();
|
|
105
|
+
|
|
106
|
+
const { records: existingModules } = await this.moduleMetadataService.findMany({
|
|
107
|
+
filters: {
|
|
108
|
+
name: { $ne: 'solid-core' }
|
|
109
|
+
},
|
|
110
|
+
fields: ['id', 'name', 'displayName', 'description'],
|
|
111
|
+
limit: 1000
|
|
112
|
+
});
|
|
113
|
+
const { records: existingModels } = await this.modelMetadataService.findMany({
|
|
114
|
+
filters: {
|
|
115
|
+
module: {
|
|
116
|
+
name: {
|
|
117
|
+
$ne: 'solid-core',
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
limit: 1000,
|
|
122
|
+
populate: ['module']
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Build markdown sections using template interpolation
|
|
126
|
+
const modulesSection = (existingModules ?? [])
|
|
127
|
+
.map(m => [
|
|
128
|
+
`### ${m.displayName}`,
|
|
129
|
+
`- name: ${m.name}`,
|
|
130
|
+
`- description: ${m.description ?? ""}`,
|
|
131
|
+
].join('\n'))
|
|
132
|
+
.join('\n\n');
|
|
133
|
+
|
|
134
|
+
const modelsSection = (existingModels ?? [])
|
|
135
|
+
.map(m => [
|
|
136
|
+
`### ${m.displayName}`,
|
|
137
|
+
`- singularName: ${m.singularName}`,
|
|
138
|
+
`- description: ${m.description ?? ""}`,
|
|
139
|
+
`- moduleName: ${m.module.name}`,
|
|
140
|
+
].join('\n'))
|
|
141
|
+
.join('\n\n');
|
|
142
|
+
|
|
143
|
+
const computationProvidersSection = (existingComputationProviders ?? [])
|
|
144
|
+
.map(m => [
|
|
145
|
+
`### ${m.instance.name()}`,
|
|
146
|
+
`- name: ${m.instance.name()}`,
|
|
147
|
+
`- description: ${m.instance.help() ?? ""}`,
|
|
148
|
+
].join('\n'))
|
|
149
|
+
.join('\n\n');
|
|
150
|
+
|
|
98
151
|
const finalPrompt = `
|
|
99
152
|
# User Prompt:
|
|
100
153
|
${prompt}
|
|
101
154
|
|
|
102
155
|
# System Instructions:
|
|
103
156
|
- aiInteractionId: ${genAiInteraction.id}
|
|
104
|
-
-
|
|
105
|
-
- You will be invoking tools if needed.
|
|
157
|
+
- You will be invoking tools if needed, hence you will have to choose the applicable tools based on the tool context given to you.
|
|
106
158
|
- If a tool is invoked, you must return **exactly** the raw output from the tool, without any json envelopes, additional formatting, commentary, or text.
|
|
107
159
|
- Do not wrap the result in quotes, JSON, or markdown fences.
|
|
108
160
|
- Do not explain what the result means.
|
|
109
161
|
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
|
|
162
|
+
# LISTS FOR REFERENCE AND VALIDATIONS
|
|
163
|
+
|
|
164
|
+
## LIST OF EXISTING MODULES
|
|
165
|
+
Use the below list of models with module names to infer which module & models the user is referring to, you can try to pull out the singularName incase of models.
|
|
166
|
+
|
|
167
|
+
${modulesSection}
|
|
113
168
|
|
|
114
|
-
|
|
169
|
+
## LIST OF EXISTING MODELS
|
|
170
|
+
Use the below list of modules to infer which module the user is referring to.
|
|
171
|
+
|
|
172
|
+
${modelsSection}
|
|
173
|
+
|
|
174
|
+
## LIST OF EXISTING COMPUTED FIELD PROVIDERS
|
|
175
|
+
Use the below list of computed field providers to infer which provider the user is referring to.
|
|
176
|
+
|
|
177
|
+
${computationProvidersSection}
|
|
178
|
+
`.trim();
|
|
115
179
|
|
|
116
180
|
const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
|
|
117
181
|
this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
|
|
@@ -170,7 +234,9 @@ Use these interactions to further identify concerns based on the current User Pr
|
|
|
170
234
|
// });
|
|
171
235
|
|
|
172
236
|
// TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB
|
|
173
|
-
const errorsStr = nestedResponse
|
|
237
|
+
const errorsStr = nestedResponse?.status == "error" && nestedResponse?.errors.join('\n ');
|
|
238
|
+
// const errorTrace = nestedResponse?.status == "error" && nestedResponse?.error_trace?.join('\n');
|
|
239
|
+
|
|
174
240
|
|
|
175
241
|
await this.aiInteractionService.update(genAiInteraction.id, {
|
|
176
242
|
errorMessage: nestedResponse.status == "error" ? `${errorsStr}` : "",
|
|
@@ -28,4 +28,19 @@ export class ViewMetadataRepository extends Repository<ViewMetadata> {
|
|
|
28
28
|
});
|
|
29
29
|
return viewMetadata;
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
async findByTypeModelNameAndModuleName(type: string, modelUserKey: string, moduleUserKey: string): Promise<ViewMetadata | null> {
|
|
33
|
+
const viewMetadata = await this.findOne({
|
|
34
|
+
where: {
|
|
35
|
+
type: type,
|
|
36
|
+
model: {
|
|
37
|
+
singularName: modelUserKey,
|
|
38
|
+
module: {
|
|
39
|
+
name: moduleUserKey
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return viewMetadata;
|
|
45
|
+
}
|
|
31
46
|
}
|