@enfyra/mcp-server 0.1.13 → 0.1.14

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.
Files changed (68) hide show
  1. package/README.md +14 -1
  2. package/dist/index.d.ts +5 -0
  3. package/{src/index.mjs → dist/index.js} +8 -10
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/auth.d.ts +34 -0
  6. package/dist/lib/auth.js +161 -0
  7. package/dist/lib/auth.js.map +1 -0
  8. package/dist/lib/config-local.d.ts +1 -0
  9. package/dist/lib/config-local.js +719 -0
  10. package/dist/lib/config-local.js.map +1 -0
  11. package/dist/lib/fetch.d.ts +28 -0
  12. package/dist/lib/fetch.js +106 -0
  13. package/dist/lib/fetch.js.map +1 -0
  14. package/dist/lib/mcp-examples.d.ts +99 -0
  15. package/dist/lib/mcp-examples.js +2285 -0
  16. package/dist/lib/mcp-examples.js.map +1 -0
  17. package/dist/lib/mcp-instructions.d.ts +11 -0
  18. package/dist/lib/mcp-instructions.js +78 -0
  19. package/dist/lib/mcp-instructions.js.map +1 -0
  20. package/dist/lib/mutation-guards.d.ts +33 -0
  21. package/dist/lib/mutation-guards.js +106 -0
  22. package/dist/lib/mutation-guards.js.map +1 -0
  23. package/dist/lib/platform-operation-tools.d.ts +12 -0
  24. package/dist/lib/platform-operation-tools.js +2304 -0
  25. package/dist/lib/platform-operation-tools.js.map +1 -0
  26. package/dist/lib/required-knowledge.d.ts +32 -0
  27. package/dist/lib/required-knowledge.js +181 -0
  28. package/dist/lib/required-knowledge.js.map +1 -0
  29. package/dist/lib/response-format.d.ts +7 -0
  30. package/dist/lib/response-format.js +179 -0
  31. package/dist/lib/response-format.js.map +1 -0
  32. package/dist/lib/route-guards.d.ts +1 -0
  33. package/dist/lib/route-guards.js +19 -0
  34. package/dist/lib/route-guards.js.map +1 -0
  35. package/dist/lib/route-permission-tools.d.ts +91 -0
  36. package/dist/lib/route-permission-tools.js +151 -0
  37. package/dist/lib/route-permission-tools.js.map +1 -0
  38. package/dist/lib/source-artifacts.d.ts +27 -0
  39. package/dist/lib/source-artifacts.js +82 -0
  40. package/dist/lib/source-artifacts.js.map +1 -0
  41. package/dist/lib/table-tools.d.ts +62 -0
  42. package/dist/lib/table-tools.js +774 -0
  43. package/dist/lib/table-tools.js.map +1 -0
  44. package/dist/lib/tool-routing.d.ts +297 -0
  45. package/dist/lib/tool-routing.js +585 -0
  46. package/dist/lib/tool-routing.js.map +1 -0
  47. package/dist/lib/types.d.ts +17 -0
  48. package/dist/lib/types.js +2 -0
  49. package/dist/lib/types.js.map +1 -0
  50. package/dist/mcp-server-entry.d.ts +4 -0
  51. package/dist/mcp-server-entry.js +2785 -0
  52. package/dist/mcp-server-entry.js.map +1 -0
  53. package/package.json +16 -9
  54. package/src/lib/auth.js +0 -179
  55. package/src/lib/config-local.mjs +0 -718
  56. package/src/lib/fetch.js +0 -111
  57. package/src/lib/mcp-examples.js +0 -2289
  58. package/src/lib/mcp-instructions.js +0 -80
  59. package/src/lib/mutation-guards.js +0 -118
  60. package/src/lib/platform-operation-tools.js +0 -2616
  61. package/src/lib/required-knowledge.js +0 -188
  62. package/src/lib/response-format.js +0 -187
  63. package/src/lib/route-guards.js +0 -24
  64. package/src/lib/route-permission-tools.js +0 -160
  65. package/src/lib/source-artifacts.js +0 -82
  66. package/src/lib/table-tools.js +0 -907
  67. package/src/lib/tool-routing.js +0 -589
  68. package/src/mcp-server-entry.mjs +0 -3177
@@ -0,0 +1,179 @@
1
+ const RESPONSE_FORMAT = 'json+columnar-v1';
2
+ const COLUMNAR_FORMAT = 'columnar-v1';
3
+ const COMPRESSION_STATS_FIELD = 'compressionStats';
4
+ function isPlainObject(value) {
5
+ if (!value || typeof value !== 'object')
6
+ return false;
7
+ const proto = Object.getPrototypeOf(value);
8
+ return proto === Object.prototype || proto === null;
9
+ }
10
+ function valueForColumn(record, column) {
11
+ return Object.prototype.hasOwnProperty.call(record, column) ? record[column] : null;
12
+ }
13
+ function collectColumns(records) {
14
+ const columns = [];
15
+ const seen = new Set();
16
+ for (const record of records) {
17
+ for (const key of Object.keys(record)) {
18
+ if (seen.has(key))
19
+ continue;
20
+ seen.add(key);
21
+ columns.push(key);
22
+ }
23
+ }
24
+ return columns;
25
+ }
26
+ function toColumnar(value, seen = new WeakSet()) {
27
+ if (Array.isArray(value)) {
28
+ if (value.length > 0 && value.every(isPlainObject)) {
29
+ const columns = collectColumns(value);
30
+ return {
31
+ format: COLUMNAR_FORMAT,
32
+ columns,
33
+ rows: value.map((record) => columns.map((column) => toColumnar(valueForColumn(record, column), seen))),
34
+ rowCount: value.length,
35
+ };
36
+ }
37
+ return value.map((item) => toColumnar(item, seen));
38
+ }
39
+ if (!isPlainObject(value))
40
+ return value;
41
+ if (seen.has(value))
42
+ return '[Circular]';
43
+ seen.add(value);
44
+ const output = {};
45
+ for (const [key, entry] of Object.entries(value)) {
46
+ output[key] = toColumnar(entry, seen);
47
+ }
48
+ seen.delete(value);
49
+ return output;
50
+ }
51
+ function safeJsonStringify(value) {
52
+ const seen = new WeakSet();
53
+ return JSON.stringify(value, (_key, entry) => {
54
+ if (!entry || typeof entry !== 'object')
55
+ return entry;
56
+ if (seen.has(entry))
57
+ return '[Circular]';
58
+ seen.add(entry);
59
+ return entry;
60
+ });
61
+ }
62
+ function estimateTokens(jsonText) {
63
+ if (!jsonText)
64
+ return 0;
65
+ return Math.ceil(jsonText.length / 4);
66
+ }
67
+ function buildCompressionStats(originalPayload, candidatePayload, selectedPayload, applied) {
68
+ const originalTokens = estimateTokens(safeJsonStringify(originalPayload));
69
+ const candidateTokens = estimateTokens(safeJsonStringify(candidatePayload));
70
+ const responseTokens = estimateTokens(safeJsonStringify(selectedPayload));
71
+ const candidateSavedTokens = originalTokens - candidateTokens;
72
+ const candidateSavedPercent = originalTokens > 0
73
+ ? Number(((candidateSavedTokens / originalTokens) * 100).toFixed(2))
74
+ : 0;
75
+ const savedTokens = originalTokens - responseTokens;
76
+ const savedPercent = originalTokens > 0
77
+ ? Number(((savedTokens / originalTokens) * 100).toFixed(2))
78
+ : 0;
79
+ return {
80
+ originalTokens,
81
+ compactTokens: responseTokens,
82
+ savedTokens,
83
+ savedPercent,
84
+ applied,
85
+ candidateCompactTokens: candidateTokens,
86
+ candidateSavedTokens,
87
+ candidateSavedPercent,
88
+ };
89
+ }
90
+ function attachCompressionStats(originalPayload, candidatePayload, selectedPayload, applied) {
91
+ if (isPlainObject(selectedPayload)
92
+ && selectedPayload.responseFormat === RESPONSE_FORMAT
93
+ && selectedPayload[COMPRESSION_STATS_FIELD]) {
94
+ return selectedPayload;
95
+ }
96
+ return {
97
+ ...selectedPayload,
98
+ [COMPRESSION_STATS_FIELD]: buildCompressionStats(originalPayload, candidatePayload, selectedPayload, applied),
99
+ };
100
+ }
101
+ function wrapPayload(payload) {
102
+ if (!isPlainObject(payload)) {
103
+ return {
104
+ responseFormat: RESPONSE_FORMAT,
105
+ value: payload,
106
+ };
107
+ }
108
+ return {
109
+ responseFormat: RESPONSE_FORMAT,
110
+ ...payload,
111
+ };
112
+ }
113
+ export function formatJsonPayload(payload) {
114
+ if (isPlainObject(payload)
115
+ && payload.responseFormat === RESPONSE_FORMAT
116
+ && payload[COMPRESSION_STATS_FIELD]) {
117
+ return payload;
118
+ }
119
+ const originalPayload = wrapPayload(payload);
120
+ const columnarPayload = wrapPayload(toColumnar(payload));
121
+ const originalTokens = estimateTokens(safeJsonStringify(originalPayload));
122
+ const candidateTokens = estimateTokens(safeJsonStringify(columnarPayload));
123
+ const shouldApplyColumnar = candidateTokens < originalTokens;
124
+ const selectedPayload = shouldApplyColumnar ? columnarPayload : originalPayload;
125
+ return attachCompressionStats(originalPayload, columnarPayload, selectedPayload, shouldApplyColumnar);
126
+ }
127
+ export function jsonContent(payload, { pretty = false } = {}) {
128
+ return {
129
+ content: [{
130
+ type: 'text',
131
+ text: JSON.stringify(formatJsonPayload(payload), null, pretty ? 2 : 0),
132
+ }],
133
+ };
134
+ }
135
+ function tryParseJson(text) {
136
+ if (typeof text !== 'string')
137
+ return null;
138
+ const trimmed = text.trim();
139
+ if (!trimmed || !/^[\[{]/.test(trimmed))
140
+ return null;
141
+ try {
142
+ return JSON.parse(trimmed);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function formatContentItem(item) {
149
+ if (!item || item.type !== 'text')
150
+ return item;
151
+ const parsed = tryParseJson(item.text);
152
+ if (!parsed)
153
+ return item;
154
+ return {
155
+ ...item,
156
+ text: JSON.stringify(formatJsonPayload(parsed)),
157
+ };
158
+ }
159
+ export function formatToolResult(result) {
160
+ if (!result || !Array.isArray(result.content))
161
+ return result;
162
+ return {
163
+ ...result,
164
+ content: result.content.map(formatContentItem),
165
+ };
166
+ }
167
+ export function installColumnarToolFormatter(server) {
168
+ const registerTool = server.tool.bind(server);
169
+ server.tool = (name, description, schema, handler) => {
170
+ if (typeof handler !== 'function') {
171
+ return registerTool(name, description, schema, handler);
172
+ }
173
+ return registerTool(name, description, schema, async (...args) => {
174
+ const result = await handler(...args);
175
+ return formatToolResult(result);
176
+ });
177
+ };
178
+ }
179
+ //# sourceMappingURL=response-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-format.js","sourceRoot":"","sources":["../../src/lib/response-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function validateMainTableRoutePath(tables: any, mainTableId: any, routePath: any): any;
@@ -0,0 +1,19 @@
1
+ function getId(item) {
2
+ return item?.id ?? item?._id ?? null;
3
+ }
4
+ function sameId(a, b) {
5
+ return String(a) === String(b);
6
+ }
7
+ export function validateMainTableRoutePath(tables, mainTableId, routePath) {
8
+ const table = tables.find((item) => sameId(getId(item), mainTableId));
9
+ if (!table) {
10
+ throw new Error(`Unknown table id "${mainTableId}"`);
11
+ }
12
+ const canonicalPath = `/${table.name}`;
13
+ if (routePath !== canonicalPath) {
14
+ throw new Error(`mainTableId is only allowed for canonical table route "${canonicalPath}". ` +
15
+ `Omit mainTableId for custom route "${routePath}" and query explicit repos in handlers/hooks.`);
16
+ }
17
+ return table;
18
+ }
19
+ //# sourceMappingURL=route-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-guards.js","sourceRoot":"","sources":["../../src/lib/route-guards.ts"],"names":[],"mappings":"AAAA,SAAS,KAAK,CAAC,IAAI;IACjB,OAAO,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC;IAClB,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,0DAA0D,aAAa,KAAK;YAC5E,sCAAsC,SAAS,+CAA+C,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,91 @@
1
+ type IdLike = string | number | boolean | null | undefined;
2
+ type RefRecord = {
3
+ id?: IdLike;
4
+ _id?: IdLike;
5
+ name?: unknown;
6
+ email?: unknown;
7
+ path?: unknown;
8
+ [key: string]: unknown;
9
+ };
10
+ type MethodIdNameMap = Record<string, string>;
11
+ type RouteRecord = RefRecord & {
12
+ availableMethods?: unknown[];
13
+ publicMethods?: unknown[];
14
+ skipRoleGuardMethods?: unknown[];
15
+ isEnabled?: unknown;
16
+ };
17
+ type RoutePermissionRecord = RefRecord & {
18
+ isEnabled?: unknown;
19
+ description?: unknown;
20
+ route?: unknown;
21
+ role?: RefRecord | IdLike;
22
+ allowedUsers?: unknown[];
23
+ methods?: unknown[];
24
+ };
25
+ type RouteAccessExpected = {
26
+ methods?: unknown[];
27
+ roleId?: IdLike;
28
+ roleName?: string;
29
+ roleRequired?: boolean;
30
+ allowedUserIds?: unknown[];
31
+ };
32
+ export declare function normalizeMethodName(method: unknown): string;
33
+ export declare function normalizeMethodNames(methods?: unknown[]): string[];
34
+ export declare function getRecordId(record: unknown): IdLike;
35
+ export declare function getReferenceId(value: unknown): IdLike;
36
+ export declare function sameRecordId(a: unknown, b: unknown): boolean;
37
+ export declare function resolveRoleByNameOrId(roles: RefRecord[], { roleId, roleName }?: RouteAccessExpected): RefRecord;
38
+ export declare function methodNamesFromRecords(methods?: unknown[], methodIdNameMap?: MethodIdNameMap): string[];
39
+ export declare function routeAvailableMethodNames(route: RouteRecord | null | undefined, methodIdNameMap?: MethodIdNameMap): string[];
40
+ export declare function routePublicMethodNames(route: RouteRecord | null | undefined, methodIdNameMap?: MethodIdNameMap): string[];
41
+ export declare function permissionMethodNames(permission: RoutePermissionRecord | null | undefined, methodIdNameMap?: MethodIdNameMap): string[];
42
+ export declare function validateMethodsForRoute(route: RouteRecord | null | undefined, methods?: unknown[], methodMap?: MethodIdNameMap, methodIdNameMap?: MethodIdNameMap): string[];
43
+ export declare function sortedIdStrings(values?: unknown[]): string[];
44
+ export declare function sameIdSet(a?: unknown[], b?: unknown[]): boolean;
45
+ export declare function routePermissionMatchesScope(permission: RoutePermissionRecord, { roleId, allowedUserIds }?: RouteAccessExpected): boolean;
46
+ export declare function findRoutePermission(routePermissions: RoutePermissionRecord[], routeId: IdLike, scope: RouteAccessExpected): RoutePermissionRecord;
47
+ export declare function mergeMethodNames(existingMethods?: unknown[], requestedMethods?: unknown[], mode?: string): string[];
48
+ export declare function summarizeRoutePermission(permission: RoutePermissionRecord, methodIdNameMap?: MethodIdNameMap): {
49
+ id: IdLike;
50
+ isEnabled: boolean;
51
+ description: unknown;
52
+ route: unknown;
53
+ role: {
54
+ id: IdLike;
55
+ name: unknown;
56
+ };
57
+ allowedUsers: {
58
+ id: IdLike;
59
+ email: unknown;
60
+ }[];
61
+ methods: string[];
62
+ };
63
+ export declare function summarizeRouteAccess(route: RouteRecord, routePermissions?: RoutePermissionRecord[], methodIdNameMap?: MethodIdNameMap, expected?: RouteAccessExpected): {
64
+ id: IdLike;
65
+ path: unknown;
66
+ isEnabled: boolean;
67
+ availableMethods: string[];
68
+ publicMethods: string[];
69
+ skipRoleGuardMethods: string[];
70
+ permissions: {
71
+ id: IdLike;
72
+ isEnabled: boolean;
73
+ description: unknown;
74
+ route: unknown;
75
+ role: {
76
+ id: IdLike;
77
+ name: unknown;
78
+ };
79
+ allowedUsers: {
80
+ id: IdLike;
81
+ email: unknown;
82
+ }[];
83
+ methods: string[];
84
+ }[];
85
+ expected: {
86
+ methods: string[];
87
+ grantedMethods: string[];
88
+ missingMethods: string[];
89
+ };
90
+ };
91
+ export {};
@@ -0,0 +1,151 @@
1
+ export function normalizeMethodName(method) {
2
+ return String(method || '').trim().toUpperCase();
3
+ }
4
+ export function normalizeMethodNames(methods = []) {
5
+ return [...new Set((methods || []).map(normalizeMethodName).filter(Boolean))];
6
+ }
7
+ export function getRecordId(record) {
8
+ if (!record || typeof record !== 'object')
9
+ return null;
10
+ const item = record;
11
+ return item.id ?? item._id ?? null;
12
+ }
13
+ export function getReferenceId(value) {
14
+ if (typeof value === 'object' && value !== null)
15
+ return getRecordId(value);
16
+ if (['string', 'number', 'boolean'].includes(typeof value))
17
+ return value;
18
+ return null;
19
+ }
20
+ export function sameRecordId(a, b) {
21
+ if (a === null || a === undefined || b === null || b === undefined)
22
+ return false;
23
+ return String(a) === String(b);
24
+ }
25
+ export function resolveRoleByNameOrId(roles, { roleId, roleName } = {}) {
26
+ if (roleId && roleName) {
27
+ throw new Error('Provide roleId or roleName, not both.');
28
+ }
29
+ if (!roleId && !roleName)
30
+ return null;
31
+ const normalizedRoleName = roleName ? String(roleName).trim().toLowerCase() : null;
32
+ const role = roles.find((item) => (roleId
33
+ ? sameRecordId(getRecordId(item), roleId)
34
+ : String(item?.name || '').trim().toLowerCase() === normalizedRoleName));
35
+ if (!role)
36
+ throw new Error(`Role not found: ${roleId || roleName}`);
37
+ return role;
38
+ }
39
+ export function methodNamesFromRecords(methods = [], methodIdNameMap = {}) {
40
+ return normalizeMethodNames((methods || []).map((method) => ((typeof method === 'object' && method !== null ? method.name : null)
41
+ || methodIdNameMap[String(getRecordId(method))]
42
+ || method)));
43
+ }
44
+ export function routeAvailableMethodNames(route, methodIdNameMap = {}) {
45
+ return methodNamesFromRecords(route?.availableMethods || [], methodIdNameMap);
46
+ }
47
+ export function routePublicMethodNames(route, methodIdNameMap = {}) {
48
+ return methodNamesFromRecords(route?.publicMethods || [], methodIdNameMap);
49
+ }
50
+ export function permissionMethodNames(permission, methodIdNameMap = {}) {
51
+ return methodNamesFromRecords(permission?.methods || [], methodIdNameMap);
52
+ }
53
+ export function validateMethodsForRoute(route, methods = [], methodMap = {}, methodIdNameMap = {}) {
54
+ const normalizedMethods = normalizeMethodNames(methods);
55
+ const knownMethods = new Set(Object.keys(methodMap || {}).map(normalizeMethodName));
56
+ const unknown = normalizedMethods.filter((method) => !knownMethods.has(method));
57
+ if (unknown.length) {
58
+ throw new Error(`Unknown enfyra_method.name values: ${unknown.join(', ')}`);
59
+ }
60
+ const availableMethods = routeAvailableMethodNames(route, methodIdNameMap);
61
+ if (availableMethods.length) {
62
+ const unavailable = normalizedMethods.filter((method) => !availableMethods.includes(method));
63
+ if (unavailable.length) {
64
+ throw new Error(`Route ${route?.path} does not list methods as available: ${unavailable.join(', ')}. Available: ${availableMethods.join(', ')}`);
65
+ }
66
+ }
67
+ return normalizedMethods;
68
+ }
69
+ export function sortedIdStrings(values = []) {
70
+ return [...new Set((values || []).map((value) => String(getReferenceId(value))).filter(Boolean))].sort();
71
+ }
72
+ export function sameIdSet(a = [], b = []) {
73
+ const left = sortedIdStrings(a);
74
+ const right = sortedIdStrings(b);
75
+ return left.length === right.length && left.every((value, index) => value === right[index]);
76
+ }
77
+ export function routePermissionMatchesScope(permission, { roleId, allowedUserIds } = {}) {
78
+ const expectedUsers = sortedIdStrings(allowedUserIds);
79
+ const permissionUsers = sortedIdStrings(permission?.allowedUsers || []);
80
+ const permissionRoleId = getReferenceId(permission?.role);
81
+ if (roleId && !sameRecordId(permissionRoleId, roleId))
82
+ return false;
83
+ if (!roleId && permissionRoleId !== null && permissionRoleId !== undefined)
84
+ return false;
85
+ return sameIdSet(permissionUsers, expectedUsers);
86
+ }
87
+ export function findRoutePermission(routePermissions = [], routeId, scope) {
88
+ return (routePermissions || []).find((permission) => (sameRecordId(getReferenceId(permission?.route), routeId)
89
+ && routePermissionMatchesScope(permission, scope))) || null;
90
+ }
91
+ export function mergeMethodNames(existingMethods = [], requestedMethods = [], mode = 'merge') {
92
+ const requested = normalizeMethodNames(requestedMethods);
93
+ if (mode === 'replace')
94
+ return requested;
95
+ return normalizeMethodNames([...normalizeMethodNames(existingMethods), ...requested]);
96
+ }
97
+ export function summarizeRoutePermission(permission, methodIdNameMap = {}) {
98
+ const role = permission?.role && typeof permission.role === 'object' ? permission.role : null;
99
+ return {
100
+ id: getRecordId(permission),
101
+ isEnabled: permission?.isEnabled !== false,
102
+ description: permission?.description || null,
103
+ route: typeof permission?.route === 'object' && permission.route !== null ? permission.route.path || permission.route : permission?.route || null,
104
+ role: permission?.role ? {
105
+ id: getReferenceId(permission.role),
106
+ name: role?.name || null,
107
+ } : null,
108
+ allowedUsers: (permission?.allowedUsers || []).map((user) => ({
109
+ id: getReferenceId(user),
110
+ email: typeof user === 'object' && user !== null ? user.email || null : null,
111
+ })),
112
+ methods: permissionMethodNames(permission, methodIdNameMap),
113
+ };
114
+ }
115
+ export function summarizeRouteAccess(route, routePermissions = [], methodIdNameMap = {}, expected = {}) {
116
+ const routeId = getRecordId(route);
117
+ const permissions = (routePermissions || [])
118
+ .filter((permission) => sameRecordId(getReferenceId(permission?.route), routeId))
119
+ .map((permission) => summarizeRoutePermission(permission, methodIdNameMap));
120
+ const expectedMethods = normalizeMethodNames(expected.methods || []);
121
+ const expectedRoleId = expected.roleId ? String(expected.roleId) : null;
122
+ const expectedAllowedUsers = sortedIdStrings(expected.allowedUserIds || []);
123
+ const hasExpectedScope = !!(expectedRoleId || expected.roleRequired || expected.allowedUserIds !== undefined);
124
+ const matchingPermissions = permissions.filter((permission) => {
125
+ if (!hasExpectedScope)
126
+ return true;
127
+ if (expectedRoleId && String(permission.role?.id) !== expectedRoleId)
128
+ return false;
129
+ if (!expectedRoleId && expected.roleRequired && permission.role)
130
+ return false;
131
+ if (!sameIdSet(permission.allowedUsers.map((user) => user.id), expectedAllowedUsers))
132
+ return false;
133
+ return true;
134
+ });
135
+ const grantedMethods = normalizeMethodNames(matchingPermissions.flatMap((permission) => (permission.isEnabled ? permission.methods : [])));
136
+ return {
137
+ id: routeId,
138
+ path: route?.path,
139
+ isEnabled: route?.isEnabled !== false,
140
+ availableMethods: routeAvailableMethodNames(route, methodIdNameMap),
141
+ publicMethods: routePublicMethodNames(route, methodIdNameMap),
142
+ skipRoleGuardMethods: methodNamesFromRecords(route?.skipRoleGuardMethods || [], methodIdNameMap),
143
+ permissions,
144
+ expected: expectedMethods.length ? {
145
+ methods: expectedMethods,
146
+ grantedMethods,
147
+ missingMethods: expectedMethods.filter((method) => !grantedMethods.includes(method)),
148
+ } : null,
149
+ };
150
+ }
151
+ //# sourceMappingURL=route-permission-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-permission-tools.js","sourceRoot":"","sources":["../../src/lib/route-permission-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ type SourceArtifactInput = {
2
+ tableName?: string;
3
+ id: string | number;
4
+ fieldName: string;
5
+ source: string;
6
+ };
7
+ type CompactSourceFieldsOptions = {
8
+ tableName?: string;
9
+ idField?: string;
10
+ alwaysWrite?: boolean;
11
+ };
12
+ export declare function writeSourceArtifact({ tableName, id, fieldName, source }: SourceArtifactInput): {
13
+ tmpFile: string;
14
+ length: number;
15
+ sha256: string;
16
+ preview: string;
17
+ };
18
+ export declare function compactSourceField({ tableName, id, fieldName, source, alwaysWrite }: SourceArtifactInput & {
19
+ alwaysWrite?: boolean;
20
+ }): string | {
21
+ tmpFile: string;
22
+ length: number;
23
+ sha256: string;
24
+ preview: string;
25
+ };
26
+ export declare function compactSourceFields(value: unknown, { tableName, idField, alwaysWrite }?: CompactSourceFieldsOptions): unknown;
27
+ export {};
@@ -0,0 +1,82 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ const DEFAULT_PREVIEW_CHARS = 1200;
6
+ const DEFAULT_INLINE_LIMIT = 1400;
7
+ const SOURCE_FIELD_NAMES = new Set([
8
+ 'sourceCode',
9
+ 'code',
10
+ 'compiledCode',
11
+ 'handlerScript',
12
+ 'connectionHandlerScript',
13
+ ]);
14
+ function sha256(value) {
15
+ return createHash('sha256').update(String(value), 'utf8').digest('hex');
16
+ }
17
+ function safePart(value) {
18
+ const source = String(value || 'source').trim();
19
+ return source.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 80) || 'source';
20
+ }
21
+ function extensionForField(fieldName) {
22
+ if (fieldName === 'code')
23
+ return '.vue';
24
+ return '.js';
25
+ }
26
+ export function writeSourceArtifact({ tableName, id, fieldName, source }) {
27
+ const hash = sha256(source);
28
+ const dir = join(tmpdir(), 'enfyra-mcp-sources');
29
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
30
+ const fileName = [
31
+ safePart(tableName),
32
+ safePart(id),
33
+ safePart(fieldName),
34
+ hash.slice(0, 12),
35
+ ].join('-') + extensionForField(fieldName);
36
+ const path = join(dir, fileName);
37
+ writeFileSync(path, source, { mode: 0o600 });
38
+ return {
39
+ tmpFile: path,
40
+ length: source.length,
41
+ sha256: hash,
42
+ preview: source.length > DEFAULT_PREVIEW_CHARS
43
+ ? `${source.slice(0, DEFAULT_PREVIEW_CHARS)}...`
44
+ : source,
45
+ };
46
+ }
47
+ export function compactSourceField({ tableName, id, fieldName, source, alwaysWrite = false }) {
48
+ if (typeof source !== 'string')
49
+ return source;
50
+ if (!alwaysWrite && source.length <= DEFAULT_INLINE_LIMIT)
51
+ return source;
52
+ return writeSourceArtifact({ tableName, id, fieldName, source });
53
+ }
54
+ export function compactSourceFields(value, { tableName, idField = 'id', alwaysWrite = false } = {}) {
55
+ if (Array.isArray(value)) {
56
+ return value.map((item) => compactSourceFields(item, { tableName, idField, alwaysWrite }));
57
+ }
58
+ if (!value || typeof value !== 'object')
59
+ return value;
60
+ const record = value;
61
+ const recordId = String(record[idField] ?? record._id ?? record.id ?? 'record');
62
+ const out = {};
63
+ for (const [key, fieldValue] of Object.entries(record)) {
64
+ if (SOURCE_FIELD_NAMES.has(key) && typeof fieldValue === 'string') {
65
+ out[key] = compactSourceField({
66
+ tableName,
67
+ id: recordId,
68
+ fieldName: key,
69
+ source: fieldValue,
70
+ alwaysWrite,
71
+ });
72
+ }
73
+ else if (fieldValue && typeof fieldValue === 'object') {
74
+ out[key] = compactSourceFields(fieldValue, { tableName, idField, alwaysWrite });
75
+ }
76
+ else {
77
+ out[key] = fieldValue;
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ //# sourceMappingURL=source-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-artifacts.js","sourceRoot":"","sources":["../../src/lib/source-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,YAAY;IACZ,MAAM;IACN,cAAc;IACd,eAAe;IACf,yBAAyB;CAC1B,CAAC,CAAC;AAeH,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAuB;IAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG;QACf,QAAQ,CAAC,SAAS,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC;QACZ,QAAQ,CAAC,SAAS,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAClB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,qBAAqB;YAC5C,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,KAAK;YAChD,CAAC,CAAC,MAAM;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,EAAmD;IAC3I,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,IAAI,oBAAoB;QAAE,OAAO,MAAM,CAAC;IACzE,OAAO,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,EAAE,WAAW,GAAG,KAAK,KAAiC,EAAE;IACrI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;IAChF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClE,GAAG,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC;gBAC5B,SAAS;gBACT,EAAE,EAAE,QAAQ;gBACZ,SAAS,EAAE,GAAG;gBACd,MAAM,EAAE,UAAU;gBAClB,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACxD,GAAG,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,62 @@
1
+ type AnyRecord = Record<string, any>;
2
+ type ConstraintGroup = string[];
3
+ type ColumnPatch = AnyRecord & {
4
+ id?: unknown;
5
+ _id?: unknown;
6
+ name?: string;
7
+ type?: string;
8
+ isNullable?: boolean;
9
+ isPrimary?: boolean;
10
+ isGenerated?: boolean;
11
+ isSystem?: boolean;
12
+ isPublished?: boolean;
13
+ isUpdatable?: boolean;
14
+ isEncrypted?: boolean;
15
+ isUnique?: boolean;
16
+ defaultValue?: unknown;
17
+ description?: string;
18
+ options?: unknown;
19
+ };
20
+ type RelationPatch = AnyRecord & {
21
+ id?: unknown;
22
+ _id?: unknown;
23
+ targetTable?: unknown;
24
+ type?: string;
25
+ propertyName?: string;
26
+ inversePropertyName?: string | null;
27
+ mappedBy?: unknown;
28
+ isNullable?: boolean;
29
+ onDelete?: string;
30
+ description?: string;
31
+ };
32
+ export declare function normalizeTablesFromMetadata(metadata: any): any[];
33
+ export declare function resolveTableFromMetadata(metadata: any, tableId: any): any;
34
+ export declare function resolveTableFromMetadataByName(metadata: any, tableName: any): any;
35
+ export declare function resolveTableIdentifierFromMetadata(metadata: any, tableRef: any, label?: string): any;
36
+ /**
37
+ * Helper: fetch table with full columns and relations.
38
+ * Dynamic enfyra_table relation fields can be paginated/truncated, so schema
39
+ * cascade tools must use /metadata as the complete source of columns/relations.
40
+ */
41
+ export declare function fetchTableWithDetails(ENFYRA_API_URL: any, tableId: any): Promise<any>;
42
+ export declare function assertIndexesDoNotReferenceUniqueFields(indexes: ConstraintGroup[], uniques: ConstraintGroup[]): void;
43
+ export declare function normalizeRelationForTablePatch(relation: AnyRecord): RelationPatch;
44
+ export declare function sanitizeExistingRelationForTablePatch(relation: AnyRecord): RelationPatch;
45
+ export declare function resolveRelationTargetsFromMetadata(metadata: any, relations: RelationPatch[]): (RelationPatch | {
46
+ targetTable: any;
47
+ id?: unknown;
48
+ _id?: unknown;
49
+ type?: string;
50
+ propertyName?: string;
51
+ inversePropertyName?: string | null;
52
+ mappedBy?: unknown;
53
+ isNullable?: boolean;
54
+ onDelete?: string;
55
+ description?: string;
56
+ })[];
57
+ export declare function buildColumnDefinition({ name, type, isNullable, isUnique, isPublished, isUpdatable, isEncrypted, isPrimary, isGenerated, isSystem, defaultValue, description, options, }: AnyRecord): ColumnPatch;
58
+ /**
59
+ * Register table tools with MCP server
60
+ */
61
+ export declare function registerTableTools(server: any, ENFYRA_API_URL: any): void;
62
+ export {};