@enfyra/mcp-server 0.1.69 → 0.1.71
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 +1 -1
- package/dist/lib/config-local-adapters.d.ts +18 -0
- package/dist/lib/config-local-adapters.js +271 -0
- package/dist/lib/config-local-adapters.js.map +1 -0
- package/dist/lib/config-local-contracts.d.ts +28 -0
- package/dist/lib/config-local-contracts.js +200 -0
- package/dist/lib/config-local-contracts.js.map +1 -0
- package/dist/lib/config-local-prompts.d.ts +10 -0
- package/dist/lib/config-local-prompts.js +185 -0
- package/dist/lib/config-local-prompts.js.map +1 -0
- package/dist/lib/config-local-types.d.ts +23 -0
- package/dist/lib/config-local-types.js +2 -0
- package/dist/lib/config-local-types.js.map +1 -0
- package/dist/lib/config-local.js +3 -649
- package/dist/lib/config-local.js.map +1 -1
- package/dist/lib/discovery-tools.d.ts +4 -0
- package/dist/lib/discovery-tools.js +546 -0
- package/dist/lib/discovery-tools.js.map +1 -0
- package/dist/lib/dynamic-repository-builder.d.ts +1 -1
- package/dist/lib/dynamic-script-context-contract.d.ts +100 -0
- package/dist/lib/dynamic-script-context-contract.js +163 -0
- package/dist/lib/dynamic-script-context-contract.js.map +1 -0
- package/dist/lib/enfyra-mcp-server.d.ts +3 -0
- package/dist/lib/enfyra-mcp-server.js +79 -0
- package/dist/lib/enfyra-mcp-server.js.map +1 -0
- package/dist/lib/enfyra-tool-logic.d.ts +7 -0
- package/dist/lib/enfyra-tool-logic.js +8 -0
- package/dist/lib/enfyra-tool-logic.js.map +1 -0
- package/dist/lib/enfyra-tool-types.d.ts +27 -0
- package/dist/lib/enfyra-tool-types.js +2 -0
- package/dist/lib/enfyra-tool-types.js.map +1 -0
- package/dist/lib/extension-api-builders.d.ts +17 -0
- package/dist/lib/extension-api-builders.js +235 -0
- package/dist/lib/extension-api-builders.js.map +1 -0
- package/dist/lib/extension-component-builders.d.ts +87 -0
- package/dist/lib/extension-component-builders.js +623 -0
- package/dist/lib/extension-component-builders.js.map +1 -0
- package/dist/lib/extension-contract-review.d.ts +26 -0
- package/dist/lib/extension-contract-review.js +187 -0
- package/dist/lib/extension-contract-review.js.map +1 -0
- package/dist/lib/extension-theme-contract.d.ts +63 -0
- package/dist/lib/extension-theme-contract.js +417 -0
- package/dist/lib/extension-theme-contract.js.map +1 -0
- package/dist/lib/identity-tools.d.ts +4 -0
- package/dist/lib/identity-tools.js +46 -0
- package/dist/lib/identity-tools.js.map +1 -0
- package/dist/lib/log-tools.d.ts +4 -0
- package/dist/lib/log-tools.js +65 -0
- package/dist/lib/log-tools.js.map +1 -0
- package/dist/lib/mcp-example-connect.d.ts +9 -0
- package/dist/lib/mcp-example-connect.js +442 -0
- package/dist/lib/mcp-example-connect.js.map +1 -0
- package/dist/lib/mcp-example-extensions.d.ts +9 -0
- package/dist/lib/mcp-example-extensions.js +729 -0
- package/dist/lib/mcp-example-extensions.js.map +1 -0
- package/dist/lib/mcp-example-files.d.ts +9 -0
- package/dist/lib/mcp-example-files.js +51 -0
- package/dist/lib/mcp-example-files.js.map +1 -0
- package/dist/lib/mcp-example-flows.d.ts +9 -0
- package/dist/lib/mcp-example-flows.js +76 -0
- package/dist/lib/mcp-example-flows.js.map +1 -0
- package/dist/lib/mcp-example-graphql.d.ts +9 -0
- package/dist/lib/mcp-example-graphql.js +57 -0
- package/dist/lib/mcp-example-graphql.js.map +1 -0
- package/dist/lib/mcp-example-handlers-hooks.d.ts +9 -0
- package/dist/lib/mcp-example-handlers-hooks.js +328 -0
- package/dist/lib/mcp-example-handlers-hooks.js.map +1 -0
- package/dist/lib/mcp-example-oauth-setup.d.ts +9 -0
- package/dist/lib/mcp-example-oauth-setup.js +41 -0
- package/dist/lib/mcp-example-oauth-setup.js.map +1 -0
- package/dist/lib/mcp-example-permissions-rls.d.ts +9 -0
- package/dist/lib/mcp-example-permissions-rls.js +210 -0
- package/dist/lib/mcp-example-permissions-rls.js.map +1 -0
- package/dist/lib/mcp-example-queries-deep.d.ts +9 -0
- package/dist/lib/mcp-example-queries-deep.js +220 -0
- package/dist/lib/mcp-example-queries-deep.js.map +1 -0
- package/dist/lib/mcp-example-schema-relations.d.ts +9 -0
- package/dist/lib/mcp-example-schema-relations.js +148 -0
- package/dist/lib/mcp-example-schema-relations.js.map +1 -0
- package/dist/lib/mcp-example-websocket.d.ts +9 -0
- package/dist/lib/mcp-example-websocket.js +103 -0
- package/dist/lib/mcp-example-websocket.js.map +1 -0
- package/dist/lib/mcp-examples.d.ts +5 -5
- package/dist/lib/mcp-examples.js +22 -2394
- package/dist/lib/mcp-examples.js.map +1 -1
- package/dist/lib/method-tools.d.ts +4 -0
- package/dist/lib/method-tools.js +217 -0
- package/dist/lib/method-tools.js.map +1 -0
- package/dist/lib/package-tools.d.ts +4 -0
- package/dist/lib/package-tools.js +98 -0
- package/dist/lib/package-tools.js.map +1 -0
- package/dist/lib/platform-data-operations.d.ts +24 -0
- package/dist/lib/platform-data-operations.js +71 -0
- package/dist/lib/platform-data-operations.js.map +1 -0
- package/dist/lib/platform-endpoint-workflow.d.ts +42 -0
- package/dist/lib/platform-endpoint-workflow.js +382 -0
- package/dist/lib/platform-endpoint-workflow.js.map +1 -0
- package/dist/lib/platform-extension-source.d.ts +487 -0
- package/dist/lib/platform-extension-source.js +524 -0
- package/dist/lib/platform-extension-source.js.map +1 -0
- package/dist/lib/platform-extension-tools.d.ts +1 -0
- package/dist/lib/platform-extension-tools.js +416 -0
- package/dist/lib/platform-extension-tools.js.map +1 -0
- package/dist/lib/platform-extension-ui.d.ts +4 -0
- package/dist/lib/platform-extension-ui.js +5 -0
- package/dist/lib/platform-extension-ui.js.map +1 -0
- package/dist/lib/platform-extension-workflow.d.ts +54 -0
- package/dist/lib/platform-extension-workflow.js +194 -0
- package/dist/lib/platform-extension-workflow.js.map +1 -0
- package/dist/lib/platform-flow-operations.d.ts +554 -0
- package/dist/lib/platform-flow-operations.js +317 -0
- package/dist/lib/platform-flow-operations.js.map +1 -0
- package/dist/lib/platform-flow-tools.d.ts +1 -0
- package/dist/lib/platform-flow-tools.js +248 -0
- package/dist/lib/platform-flow-tools.js.map +1 -0
- package/dist/lib/platform-operation-logic.d.ts +10 -0
- package/dist/lib/platform-operation-logic.js +11 -0
- package/dist/lib/platform-operation-logic.js.map +1 -0
- package/dist/lib/platform-operation-tools.d.ts +1 -324
- package/dist/lib/platform-operation-tools.js +13 -4620
- package/dist/lib/platform-operation-tools.js.map +1 -1
- package/dist/lib/platform-operation-types.d.ts +46 -0
- package/dist/lib/platform-operation-types.js +2 -0
- package/dist/lib/platform-operation-types.js.map +1 -0
- package/dist/lib/platform-policy-tools.d.ts +1 -0
- package/dist/lib/platform-policy-tools.js +248 -0
- package/dist/lib/platform-policy-tools.js.map +1 -0
- package/dist/lib/platform-resource-operations.d.ts +124 -0
- package/dist/lib/platform-resource-operations.js +109 -0
- package/dist/lib/platform-resource-operations.js.map +1 -0
- package/dist/lib/platform-resource-tools.d.ts +1 -0
- package/dist/lib/platform-resource-tools.js +70 -0
- package/dist/lib/platform-resource-tools.js.map +1 -0
- package/dist/lib/platform-route-operations.d.ts +222 -0
- package/dist/lib/platform-route-operations.js +290 -0
- package/dist/lib/platform-route-operations.js.map +1 -0
- package/dist/lib/platform-route-tools.d.ts +1 -0
- package/dist/lib/platform-route-tools.js +307 -0
- package/dist/lib/platform-route-tools.js.map +1 -0
- package/dist/lib/platform-shared-operations.d.ts +7 -0
- package/dist/lib/platform-shared-operations.js +4 -0
- package/dist/lib/platform-shared-operations.js.map +1 -0
- package/dist/lib/platform-websocket-tools.d.ts +1 -0
- package/dist/lib/platform-websocket-tools.js +70 -0
- package/dist/lib/platform-websocket-tools.js.map +1 -0
- package/dist/lib/record-tools.d.ts +4 -0
- package/dist/lib/record-tools.js +418 -0
- package/dist/lib/record-tools.js.map +1 -0
- package/dist/lib/required-knowledge.d.ts +1 -1
- package/dist/lib/required-knowledge.js +3 -2
- package/dist/lib/required-knowledge.js.map +1 -1
- package/dist/lib/route-access-tools.d.ts +4 -0
- package/dist/lib/route-access-tools.js +172 -0
- package/dist/lib/route-access-tools.js.map +1 -0
- package/dist/lib/route-definition-tools.d.ts +4 -0
- package/dist/lib/route-definition-tools.js +285 -0
- package/dist/lib/route-definition-tools.js.map +1 -0
- package/dist/lib/route-inspection-tools.d.ts +4 -0
- package/dist/lib/route-inspection-tools.js +319 -0
- package/dist/lib/route-inspection-tools.js.map +1 -0
- package/dist/lib/route-tools.d.ts +1 -0
- package/dist/lib/route-tools.js +9 -0
- package/dist/lib/route-tools.js.map +1 -0
- package/dist/lib/runtime-zone-registry.d.ts +27 -0
- package/dist/lib/runtime-zone-registry.js +81 -0
- package/dist/lib/runtime-zone-registry.js.map +1 -0
- package/dist/lib/runtime-zone-search.d.ts +303 -0
- package/dist/lib/runtime-zone-search.js +596 -0
- package/dist/lib/runtime-zone-search.js.map +1 -0
- package/dist/lib/runtime-zone-tools.d.ts +2 -307
- package/dist/lib/runtime-zone-tools.js +2 -674
- package/dist/lib/runtime-zone-tools.js.map +1 -1
- package/dist/lib/schema-column-tools.d.ts +3 -0
- package/dist/lib/schema-column-tools.js +80 -0
- package/dist/lib/schema-column-tools.js.map +1 -0
- package/dist/lib/schema-mutation-coordinator.d.ts +28 -0
- package/dist/lib/schema-mutation-coordinator.js +154 -0
- package/dist/lib/schema-mutation-coordinator.js.map +1 -0
- package/dist/lib/schema-relation-contracts.d.ts +39 -0
- package/dist/lib/schema-relation-contracts.js +160 -0
- package/dist/lib/schema-relation-contracts.js.map +1 -0
- package/dist/lib/schema-relation-tools.d.ts +3 -0
- package/dist/lib/schema-relation-tools.js +61 -0
- package/dist/lib/schema-relation-tools.js.map +1 -0
- package/dist/lib/schema-table-contracts.d.ts +28 -0
- package/dist/lib/schema-table-contracts.js +263 -0
- package/dist/lib/schema-table-contracts.js.map +1 -0
- package/dist/lib/schema-table-tools.d.ts +3 -0
- package/dist/lib/schema-table-tools.js +297 -0
- package/dist/lib/schema-table-tools.js.map +1 -0
- package/dist/lib/schema-tool-operations.d.ts +150 -0
- package/dist/lib/schema-tool-operations.js +468 -0
- package/dist/lib/schema-tool-operations.js.map +1 -0
- package/dist/lib/schema-tool-types.d.ts +38 -0
- package/dist/lib/schema-tool-types.js +2 -0
- package/dist/lib/schema-tool-types.js.map +1 -0
- package/dist/lib/schema-verification.d.ts +14 -0
- package/dist/lib/schema-verification.js +105 -0
- package/dist/lib/schema-verification.js.map +1 -0
- package/dist/lib/script-tools.d.ts +4 -0
- package/dist/lib/script-tools.js +127 -0
- package/dist/lib/script-tools.js.map +1 -0
- package/dist/lib/system-tools.d.ts +4 -0
- package/dist/lib/system-tools.js +41 -0
- package/dist/lib/system-tools.js.map +1 -0
- package/dist/lib/table-tool-logic.d.ts +5 -0
- package/dist/lib/table-tool-logic.js +6 -0
- package/dist/lib/table-tool-logic.js.map +1 -0
- package/dist/lib/table-tools.d.ts +1 -84
- package/dist/lib/table-tools.js +7 -1522
- package/dist/lib/table-tools.js.map +1 -1
- package/dist/lib/tool-catalog.d.ts +2 -1
- package/dist/lib/tool-catalog.js +23 -2
- package/dist/lib/tool-catalog.js.map +1 -1
- package/dist/lib/tool-metadata-operations.d.ts +27 -0
- package/dist/lib/tool-metadata-operations.js +93 -0
- package/dist/lib/tool-metadata-operations.js.map +1 -0
- package/dist/lib/tool-permission-profile.d.ts +37 -0
- package/dist/lib/tool-permission-profile.js +106 -0
- package/dist/lib/tool-permission-profile.js.map +1 -0
- package/dist/lib/tool-record-operations.d.ts +102 -0
- package/dist/lib/tool-record-operations.js +260 -0
- package/dist/lib/tool-record-operations.js.map +1 -0
- package/dist/lib/tool-route-inspection.d.ts +47 -0
- package/dist/lib/tool-route-inspection.js +168 -0
- package/dist/lib/tool-route-inspection.js.map +1 -0
- package/dist/lib/tool-routing.d.ts +3 -417
- package/dist/lib/tool-routing.js +3 -1038
- package/dist/lib/tool-routing.js.map +1 -1
- package/dist/lib/tool-runtime-config.d.ts +33 -0
- package/dist/lib/tool-runtime-config.js +237 -0
- package/dist/lib/tool-runtime-config.js.map +1 -0
- package/dist/lib/tool-script-operations.d.ts +34 -0
- package/dist/lib/tool-script-operations.js +153 -0
- package/dist/lib/tool-script-operations.js.map +1 -0
- package/dist/lib/workflow-definitions.d.ts +366 -0
- package/dist/lib/workflow-definitions.js +703 -0
- package/dist/lib/workflow-definitions.js.map +1 -0
- package/dist/lib/workflow-planner.d.ts +45 -0
- package/dist/lib/workflow-planner.js +338 -0
- package/dist/lib/workflow-planner.js.map +1 -0
- package/dist/lib/workflow-types.d.ts +39 -0
- package/dist/lib/workflow-types.js +2 -0
- package/dist/lib/workflow-types.js.map +1 -0
- package/dist/mcp-server-entry.d.ts +0 -3
- package/dist/mcp-server-entry.js +2 -3249
- package/dist/mcp-server-entry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enfyra MCP — stdio server (loaded by index.ts / dist/index.js).
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { fetchAPI } from './fetch.js';
|
|
6
|
+
import { assertGlobalRulesAck, globalRulesAckParam, } from './required-knowledge.js';
|
|
7
|
+
import { findRoutePermission, mergeMethodNames, normalizeMethodNames, resolveRoleByNameOrId, routeAvailableMethodNames, routePublicMethodNames, summarizeRouteAccess, summarizeRoutePermission, validateMethodsForRoute, } from './route-permission-tools.js';
|
|
8
|
+
import { fetchAll, firstDataRecord, getId, getMethodIdNameMap, getMethodMap, normalizeRestPath, reloadRoutesResult, resolveMethodIds, sameId, } from './enfyra-tool-logic.js';
|
|
9
|
+
export function registerRouteAccessTools(server, ENFYRA_API_URL) {
|
|
10
|
+
server.tool('audit_route_access', [
|
|
11
|
+
'Audit route access for one or more routes.',
|
|
12
|
+
'Use this before granting access or debugging 403s. It reports available methods, public methods, skipRoleGuard methods, route permissions, and optional missing methods for one role/user scope.',
|
|
13
|
+
].join(' '), {
|
|
14
|
+
path: z.string().optional().describe('Exact route path, e.g. /orders'),
|
|
15
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Exact route id'),
|
|
16
|
+
search: z.string().optional().describe('Optional route path search when path/routeId is not provided'),
|
|
17
|
+
roleId: z.union([z.string(), z.number()]).optional().describe('Expected role id to check'),
|
|
18
|
+
roleName: z.string().optional().describe('Expected role name to resolve, e.g. user'),
|
|
19
|
+
allowedUserIds: z.array(z.union([z.string(), z.number()])).optional().describe('Expected direct/specific user ids to check'),
|
|
20
|
+
methods: z.array(z.string()).optional().describe('Methods expected to be allowed for this scope'),
|
|
21
|
+
limit: z.number().int().positive().max(100).optional().default(25).describe('Maximum routes returned for search mode'),
|
|
22
|
+
}, async ({ path, routeId, search, roleId, roleName, allowedUserIds, methods, limit }) => {
|
|
23
|
+
if ([path, routeId, search].filter((value) => value !== undefined && value !== null && value !== '').length > 1) {
|
|
24
|
+
throw new Error('Use only one of path, routeId, or search.');
|
|
25
|
+
}
|
|
26
|
+
if (roleId && roleName)
|
|
27
|
+
throw new Error('Provide roleId or roleName, not both.');
|
|
28
|
+
const [routes, routePermissions, roles, methodIdNameMap] = await Promise.all([
|
|
29
|
+
fetchAll('/enfyra_route?limit=1000'),
|
|
30
|
+
fetchAll('/enfyra_route_permission?limit=1000'),
|
|
31
|
+
fetchAll('/enfyra_role?limit=1000'),
|
|
32
|
+
getMethodIdNameMap(),
|
|
33
|
+
]);
|
|
34
|
+
const role = resolveRoleByNameOrId(roles, { roleId, roleName });
|
|
35
|
+
const normalizedPath = path ? normalizeRestPath(path) : null;
|
|
36
|
+
const query = search ? String(search).toLowerCase() : null;
|
|
37
|
+
const matchedRoutes = routes.filter((route) => {
|
|
38
|
+
if (routeId)
|
|
39
|
+
return sameId(getId(route), routeId);
|
|
40
|
+
if (normalizedPath)
|
|
41
|
+
return route.path === normalizedPath;
|
|
42
|
+
if (query)
|
|
43
|
+
return String(route.path || '').toLowerCase().includes(query);
|
|
44
|
+
return true;
|
|
45
|
+
}).slice(0, limit);
|
|
46
|
+
const expectedMethods = normalizeMethodNames(methods || []);
|
|
47
|
+
const payload = {
|
|
48
|
+
guidance: {
|
|
49
|
+
publicAccess: 'publicMethods bypass RoleGuard and do not require enfyra_route_permission.',
|
|
50
|
+
authenticatedAccess: 'For non-public methods, Enfyra admin UI PermissionGate and backend RoleGuard both expect enabled enfyra_route_permission rows with matching route + HTTP method.',
|
|
51
|
+
directUserAccess: 'allowedRoutePermissions on /me represent direct user-scoped route permissions; role.routePermissions represent role-scoped permissions.',
|
|
52
|
+
},
|
|
53
|
+
expectedScope: {
|
|
54
|
+
role: role ? { id: getId(role), name: role.name } : null,
|
|
55
|
+
allowedUserIds: allowedUserIds || [],
|
|
56
|
+
methods: expectedMethods,
|
|
57
|
+
},
|
|
58
|
+
returnedRouteCount: matchedRoutes.length,
|
|
59
|
+
routes: matchedRoutes.map((route) => summarizeRouteAccess(route, routePermissions, methodIdNameMap, {
|
|
60
|
+
roleId: role ? getId(role) : roleId,
|
|
61
|
+
roleRequired: !!(role || roleId || roleName),
|
|
62
|
+
allowedUserIds,
|
|
63
|
+
methods: expectedMethods,
|
|
64
|
+
})),
|
|
65
|
+
};
|
|
66
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }] };
|
|
67
|
+
});
|
|
68
|
+
server.tool('ensure_route_access', [
|
|
69
|
+
'Create or update authenticated route access for one role/user scope.',
|
|
70
|
+
'Use this instead of raw enfyra_route_permission CRUD when fixing 403s. It resolves roleName/route/method ids, validates route.availableMethods, merges existing permission methods by default, and reloads routes.',
|
|
71
|
+
].join(' '), {
|
|
72
|
+
path: z.string().optional().describe('Route path, e.g. /orders'),
|
|
73
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
74
|
+
methods: z.array(z.string()).describe('HTTP method names to allow, e.g. ["GET", "POST"].'),
|
|
75
|
+
roleId: z.union([z.string(), z.number()]).optional().describe('Role id scope'),
|
|
76
|
+
roleName: z.string().optional().describe('Role name scope, e.g. user. Prefer this when an LLM does not know role ids.'),
|
|
77
|
+
allowedUserIds: z.array(z.union([z.string(), z.number()])).optional().describe('Specific user ids scope. Omit for role-wide access.'),
|
|
78
|
+
mode: z.enum(['merge', 'replace']).optional().default('merge').describe('merge adds methods to an existing permission; replace overwrites methods on the matched permission.'),
|
|
79
|
+
description: z.string().optional().describe('Admin note'),
|
|
80
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable the permission'),
|
|
81
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
82
|
+
}, async ({ path, routeId, methods, roleId, roleName, allowedUserIds, mode, description, isEnabled, globalRulesAckKey }) => {
|
|
83
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
84
|
+
if (!path && !routeId)
|
|
85
|
+
throw new Error('Provide path or routeId.');
|
|
86
|
+
if (path && routeId)
|
|
87
|
+
throw new Error('Provide path or routeId, not both.');
|
|
88
|
+
if (roleId && roleName)
|
|
89
|
+
throw new Error('Provide roleId or roleName, not both.');
|
|
90
|
+
if (!roleId && !roleName && (!allowedUserIds || allowedUserIds.length === 0)) {
|
|
91
|
+
throw new Error('Provide roleId, roleName, or allowedUserIds.');
|
|
92
|
+
}
|
|
93
|
+
const [routes, routePermissions, roles, methodMap, methodIdNameMap] = await Promise.all([
|
|
94
|
+
fetchAll('/enfyra_route?limit=1000'),
|
|
95
|
+
fetchAll('/enfyra_route_permission?limit=1000'),
|
|
96
|
+
fetchAll('/enfyra_role?limit=1000'),
|
|
97
|
+
getMethodMap(),
|
|
98
|
+
getMethodIdNameMap(),
|
|
99
|
+
]);
|
|
100
|
+
const route = routes.find((item) => (routeId ? sameId(getId(item), routeId) : item.path === normalizeRestPath(path)));
|
|
101
|
+
if (!route)
|
|
102
|
+
throw new Error(`Route not found: ${routeId || path}`);
|
|
103
|
+
const role = resolveRoleByNameOrId(roles, { roleId, roleName });
|
|
104
|
+
const scope = {
|
|
105
|
+
roleId: role ? getId(role) : roleId,
|
|
106
|
+
allowedUserIds: allowedUserIds || [],
|
|
107
|
+
};
|
|
108
|
+
const requestedMethods = validateMethodsForRoute(route, methods, methodMap, methodIdNameMap);
|
|
109
|
+
const existing = findRoutePermission(routePermissions, getId(route), scope);
|
|
110
|
+
const existingMethods = existing ? summarizeRoutePermission(existing, methodIdNameMap).methods : [];
|
|
111
|
+
const finalMethods = mergeMethodNames(existingMethods, requestedMethods, mode);
|
|
112
|
+
const methodRefs = resolveMethodIds(methodMap, finalMethods);
|
|
113
|
+
const publicMethods = routePublicMethodNames(route, methodIdNameMap);
|
|
114
|
+
const alreadyPublic = requestedMethods.filter((method) => publicMethods.includes(method));
|
|
115
|
+
let result;
|
|
116
|
+
let action;
|
|
117
|
+
if (existing) {
|
|
118
|
+
action = 'updated';
|
|
119
|
+
const patchBody = {
|
|
120
|
+
isEnabled,
|
|
121
|
+
methods: methodRefs,
|
|
122
|
+
...(description !== undefined ? { description } : {}),
|
|
123
|
+
};
|
|
124
|
+
result = await fetchAPI(ENFYRA_API_URL, `/enfyra_route_permission/${encodeURIComponent(String(getId(existing)))}`, {
|
|
125
|
+
method: 'PATCH',
|
|
126
|
+
body: JSON.stringify(patchBody),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
action = 'created';
|
|
131
|
+
const createBody = {
|
|
132
|
+
isEnabled,
|
|
133
|
+
description,
|
|
134
|
+
route: { id: getId(route) },
|
|
135
|
+
methods: methodRefs,
|
|
136
|
+
...(scope.roleId ? { role: { id: scope.roleId } } : {}),
|
|
137
|
+
...(scope.allowedUserIds.length ? { allowedUsers: scope.allowedUserIds.map((id) => ({ id })) } : {}),
|
|
138
|
+
};
|
|
139
|
+
result = await fetchAPI(ENFYRA_API_URL, '/enfyra_route_permission', {
|
|
140
|
+
method: 'POST',
|
|
141
|
+
body: JSON.stringify(createBody),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const routeReload = await reloadRoutesResult();
|
|
145
|
+
const saved = firstDataRecord(result);
|
|
146
|
+
const payload = {
|
|
147
|
+
action,
|
|
148
|
+
kind: 'route_access',
|
|
149
|
+
route: {
|
|
150
|
+
id: getId(route),
|
|
151
|
+
path: route.path,
|
|
152
|
+
availableMethods: routeAvailableMethodNames(route, methodIdNameMap),
|
|
153
|
+
publicMethods,
|
|
154
|
+
},
|
|
155
|
+
scope: {
|
|
156
|
+
role: role ? { id: getId(role), name: role.name } : null,
|
|
157
|
+
allowedUserIds: scope.allowedUserIds,
|
|
158
|
+
},
|
|
159
|
+
permission: {
|
|
160
|
+
id: getId(saved) || getId(existing),
|
|
161
|
+
methods: finalMethods,
|
|
162
|
+
alreadyPublic,
|
|
163
|
+
isEnabled,
|
|
164
|
+
},
|
|
165
|
+
result,
|
|
166
|
+
routeReload,
|
|
167
|
+
auditHint: `Call audit_route_access({ path: "${route.path}", ${role ? `roleName: "${role.name}", ` : ''}methods: ${JSON.stringify(requestedMethods)} }) to verify.`,
|
|
168
|
+
};
|
|
169
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }] };
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=route-access-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-access-tools.js","sourceRoot":"","sources":["../../src/lib/route-access-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enfyra MCP — stdio server (loaded by index.ts / dist/index.js).
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { fetchAPI } from './fetch.js';
|
|
6
|
+
import { assertCreateHandlerRouteBoundary } from './dynamic-endpoint-contract.js';
|
|
7
|
+
import { validateScriptSourceIfPresent } from './mutation-guards.js';
|
|
8
|
+
import { assertDynamicCodeKnowledgeAck, assertGlobalRulesAck, dynamicCodeKnowledgeAckParam, globalRulesAckParam, } from './required-knowledge.js';
|
|
9
|
+
import { validateMainTableRoutePath } from './route-guards.js';
|
|
10
|
+
import { firstDataRecord, getId, getMetadataTables, getMethodMap, normalizeRestPath, reloadRoutesResult, resolveMethodIds, summarizeRoutes, unwrapData, } from './enfyra-tool-logic.js';
|
|
11
|
+
export function registerRouteDefinitionTools(server, ENFYRA_API_URL) {
|
|
12
|
+
server.tool('get_all_routes', 'List route definitions with minimal fields. Complete route lists must pass either limit or all=true. If search is provided without limit, the tool returns a bounded lookup window of 10 matches. Call inspect_route for handlers/hooks/permissions detail.', {
|
|
13
|
+
includeDisabled: z.boolean().optional().default(false).describe('Include disabled routes'),
|
|
14
|
+
search: z.string().optional().describe('Optional path or table substring filter. Use this before creating a route to check duplicates.'),
|
|
15
|
+
limit: z.number().int().positive().optional().describe('Maximum routes returned after search. Required unless all=true or search is provided. Do not invent arbitrary limits for "all"; use all=true instead.'),
|
|
16
|
+
all: z.boolean().optional().default(false).describe('Return all matched routes. Use this when the user asks for all routes or a complete route list.'),
|
|
17
|
+
}, async ({ includeDisabled, search, limit, all }) => {
|
|
18
|
+
if (!all && limit === undefined && !search?.trim()) {
|
|
19
|
+
throw new Error('get_all_routes requires either limit or all=true. Do not rely on implicit default page sizes.');
|
|
20
|
+
}
|
|
21
|
+
if (all && limit !== undefined) {
|
|
22
|
+
throw new Error('get_all_routes accepts either all=true or limit, not both.');
|
|
23
|
+
}
|
|
24
|
+
const filter = includeDisabled ? {} : { isEnabled: { _eq: true } };
|
|
25
|
+
const queryParams = new URLSearchParams({
|
|
26
|
+
filter: JSON.stringify(filter),
|
|
27
|
+
fields: 'id,path,mainTable.name,availableMethods.*,publicMethods.*,isEnabled',
|
|
28
|
+
limit: all ? '0' : '1000',
|
|
29
|
+
});
|
|
30
|
+
const result = await fetchAPI(ENFYRA_API_URL, `/enfyra_route?${queryParams.toString()}`);
|
|
31
|
+
const q = search ? search.toLowerCase() : null;
|
|
32
|
+
const allRoutes = summarizeRoutes(result);
|
|
33
|
+
const matchedRoutes = q
|
|
34
|
+
? allRoutes.filter((route) => JSON.stringify({
|
|
35
|
+
path: route.path,
|
|
36
|
+
mainTable: route.mainTable,
|
|
37
|
+
}).toLowerCase().includes(q))
|
|
38
|
+
: allRoutes;
|
|
39
|
+
const routeLimit = all ? matchedRoutes.length : (limit ?? 10);
|
|
40
|
+
const payload = {
|
|
41
|
+
statusCode: result?.statusCode,
|
|
42
|
+
success: result?.success,
|
|
43
|
+
totalRouteCount: allRoutes.length,
|
|
44
|
+
matchedRouteCount: matchedRoutes.length,
|
|
45
|
+
returnedRouteCount: Math.min(matchedRoutes.length, routeLimit),
|
|
46
|
+
all: !!all,
|
|
47
|
+
implicitSearchLimit: Boolean(!all && limit === undefined && search?.trim()),
|
|
48
|
+
complete: all || routeLimit >= matchedRoutes.length,
|
|
49
|
+
hardCap: all ? null : routeLimit,
|
|
50
|
+
search: search || null,
|
|
51
|
+
routes: matchedRoutes.slice(0, routeLimit),
|
|
52
|
+
detailHint: matchedRoutes.length > routeLimit
|
|
53
|
+
? `Response truncated to ${routeLimit} routes. Re-run with search or a higher limit, then inspect_route({ path }) for details.`
|
|
54
|
+
: 'Use inspect_route({ path }) or inspect_route({ routeId }) for handlers, hooks, permissions, and guards.',
|
|
55
|
+
};
|
|
56
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }] };
|
|
57
|
+
});
|
|
58
|
+
server.tool('create_route', [
|
|
59
|
+
'**Use this when the user wants a new REST API route or path** — not `create_tables`. Custom routes must omit `mainTableId`.',
|
|
60
|
+
'`mainTableId` is only a marker for canonical table routes such as `/orders`; do not set it for `/orders/stats`, `/reports/summary`, `/auth/login`, or any custom path.',
|
|
61
|
+
'Do NOT create a new enfyra_table only to expose an endpoint; create a route without `mainTableId`, then have the handler/hook query user-facing tables through secure explicit repos such as `#secure.orders` or `$ctx.$repos.secure.orders`.',
|
|
62
|
+
'availableMethods = which REST verbs the route responds to. publicMethods = which REST verbs are public (no auth). GraphQL is enabled separately through enfyra_graphql/update_tables graphqlEnabled.',
|
|
63
|
+
'After creation the tool auto-reloads routes. Then create handlers for specific methods via create_handler on this route id.',
|
|
64
|
+
'Flow: create_route → create_handler (per method) → optionally create_pre_hook / create_post_hook → test via HTTP or admin test APIs (see server instructions).',
|
|
65
|
+
].join(' '), {
|
|
66
|
+
path: z.string().describe('URL path, must start with / (e.g., "/my-endpoint")'),
|
|
67
|
+
mainTableId: z.union([z.string(), z.number()]).optional().describe('Only set for the canonical table route `/<table_name>`. Omit for every custom route.'),
|
|
68
|
+
methods: z.array(z.string())
|
|
69
|
+
.describe('HTTP method names this route supports (availableMethods). Each value must exist in enfyra_method.name. Common: ["GET","POST","PATCH","DELETE"].'),
|
|
70
|
+
publicMethods: z.array(z.string()).optional()
|
|
71
|
+
.describe('Methods accessible WITHOUT auth token. Omit = all methods require auth.'),
|
|
72
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable route immediately'),
|
|
73
|
+
description: z.string().optional().describe('Route description'),
|
|
74
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
75
|
+
}, async ({ path: routePath, mainTableId, methods, publicMethods, isEnabled, description, globalRulesAckKey }) => {
|
|
76
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
77
|
+
const methodMap = await getMethodMap();
|
|
78
|
+
const normalizedPath = normalizeRestPath(routePath);
|
|
79
|
+
const body = {
|
|
80
|
+
path: normalizedPath,
|
|
81
|
+
isEnabled,
|
|
82
|
+
description,
|
|
83
|
+
availableMethods: resolveMethodIds(methodMap, methods),
|
|
84
|
+
};
|
|
85
|
+
if (mainTableId !== undefined && mainTableId !== null) {
|
|
86
|
+
const { tables } = await getMetadataTables(mainTableId);
|
|
87
|
+
validateMainTableRoutePath(tables, mainTableId, normalizedPath);
|
|
88
|
+
body.mainTable = { id: mainTableId };
|
|
89
|
+
}
|
|
90
|
+
if (publicMethods && publicMethods.length > 0) {
|
|
91
|
+
body.publicMethods = resolveMethodIds(methodMap, publicMethods);
|
|
92
|
+
}
|
|
93
|
+
const result = await fetchAPI(ENFYRA_API_URL, '/enfyra_route', {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
body: JSON.stringify(body),
|
|
96
|
+
});
|
|
97
|
+
const routeReload = await reloadRoutesResult();
|
|
98
|
+
const created = firstDataRecord(result);
|
|
99
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
100
|
+
action: 'created',
|
|
101
|
+
route: {
|
|
102
|
+
id: getId(created),
|
|
103
|
+
path: created?.path,
|
|
104
|
+
mainTableId: mainTableId ?? null,
|
|
105
|
+
availableMethods: methods,
|
|
106
|
+
publicMethods: publicMethods || [],
|
|
107
|
+
},
|
|
108
|
+
routeReload,
|
|
109
|
+
next: `Use create_handler({ routeId: ${JSON.stringify(getId(created))}, method: "GET", sourceCode }) for custom code. Create extra enfyra_method.name rows first for custom methods such as PUT.`,
|
|
110
|
+
}, null, 2) }] };
|
|
111
|
+
});
|
|
112
|
+
server.tool('create_handler', [
|
|
113
|
+
'Create a handler for a route+method. One handler per (route, method) pair.',
|
|
114
|
+
'Attach to a custom route from `create_route` for endpoint-specific or third-party behavior. Do not use this low-level tool to bypass api_endpoint_workflow canonical-collision checks.',
|
|
115
|
+
'Canonical table routes are shared with eApp/admin CRUD. Adding a new canonical handler requires allowCanonicalRoute=true and main-table repository access; otherwise create a separate custom path.',
|
|
116
|
+
'Use sourceCode, not logic/name. Enfyra compiles sourceCode into compiledCode; do not send compiledCode.',
|
|
117
|
+
'Handler code runs inside a sandbox with $ctx. Use macros: @BODY, @QUERY, @PARAMS, @USER, @REPOS, @HELPERS, @THROW400..@THROW503, @SOCKET, @PKGS, @LOGS, @SHARE.',
|
|
118
|
+
'Call discover_script_contexts first. For explicit user-facing table repos use #secure.table_name or @REPOS.secure.table_name; use #table_name/@REPOS.table_name only for intentional trusted internal access.',
|
|
119
|
+
'Or use $ctx directly: $ctx.$body, $ctx.$repos.main.find(), $ctx.$helpers.$bcrypt.hash(), etc.',
|
|
120
|
+
'require("pkg") works for installed Server packages. console.log() writes to $share.$logs.',
|
|
121
|
+
].join(' '), {
|
|
122
|
+
routeId: z.union([z.string(), z.number()]).describe('Route definition ID'),
|
|
123
|
+
method: z.string().optional()
|
|
124
|
+
.describe('Single enfyra_method.name to create. Prefer this for one handler.'),
|
|
125
|
+
methods: z.array(z.string()).optional()
|
|
126
|
+
.describe('Batch create multiple handlers. Use only when the same sourceCode applies to every method.'),
|
|
127
|
+
sourceCode: z.string().describe('Handler JavaScript sourceCode. Do not use logic; backend CRUD rejects logic. Use @REPOS.main for the route main table or #secure.table_name/@REPOS.secure.table_name for explicit user-facing access; trusted repos require intentional bypass and explicit authorization.'),
|
|
128
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language for compiler. Default javascript.'),
|
|
129
|
+
timeout: z.number().optional().describe('Timeout in ms (default: system DEFAULT_HANDLER_TIMEOUT, usually 30000)'),
|
|
130
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
131
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z),
|
|
132
|
+
allowCanonicalRoute: z.boolean().optional().default(false).describe('Explicit acknowledgement for adding a new handler to a canonical main-table route. Use only when the new method intentionally belongs to the shared eApp/admin CRUD surface; third-party endpoint-specific behavior must use a separate custom route.'),
|
|
133
|
+
}, async ({ routeId, method, methods, sourceCode, scriptLanguage, timeout, globalRulesAckKey, knowledgeAckKey, allowCanonicalRoute }) => {
|
|
134
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
135
|
+
assertDynamicCodeKnowledgeAck(knowledgeAckKey);
|
|
136
|
+
const routeQuery = new URLSearchParams({
|
|
137
|
+
filter: JSON.stringify({ id: { _eq: routeId } }),
|
|
138
|
+
fields: 'id,path,mainTable.id,mainTable.name',
|
|
139
|
+
limit: '1',
|
|
140
|
+
});
|
|
141
|
+
const routeResult = await fetchAPI(ENFYRA_API_URL, `/enfyra_route?${routeQuery.toString()}`);
|
|
142
|
+
const targetRoute = unwrapData(routeResult)[0];
|
|
143
|
+
if (!targetRoute)
|
|
144
|
+
throw new Error(`Route not found: ${String(routeId)}`);
|
|
145
|
+
assertCreateHandlerRouteBoundary(targetRoute, sourceCode, allowCanonicalRoute);
|
|
146
|
+
const methodNames = methods && methods.length > 0 ? methods : method ? [method] : [];
|
|
147
|
+
if (methodNames.length === 0)
|
|
148
|
+
throw new Error('Provide method or methods');
|
|
149
|
+
const methodMap = await getMethodMap();
|
|
150
|
+
const results = [];
|
|
151
|
+
const scriptValidation = await validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_route_handler', {
|
|
152
|
+
sourceCode,
|
|
153
|
+
scriptLanguage,
|
|
154
|
+
});
|
|
155
|
+
for (const methodName of methodNames) {
|
|
156
|
+
const methodId = methodMap[methodName.toUpperCase()];
|
|
157
|
+
if (!methodId)
|
|
158
|
+
throw new Error(`Unknown method: ${methodName}. Valid: ${Object.keys(methodMap).join(', ')}`);
|
|
159
|
+
const body = { route: { id: routeId }, method: { id: methodId }, sourceCode, scriptLanguage };
|
|
160
|
+
if (timeout)
|
|
161
|
+
body.timeout = timeout;
|
|
162
|
+
const result = await fetchAPI(ENFYRA_API_URL, '/enfyra_route_handler', {
|
|
163
|
+
method: 'POST',
|
|
164
|
+
body: JSON.stringify(body),
|
|
165
|
+
});
|
|
166
|
+
const created = firstDataRecord(result);
|
|
167
|
+
results.push({
|
|
168
|
+
id: getId(created),
|
|
169
|
+
routeId,
|
|
170
|
+
method: methodName,
|
|
171
|
+
scriptLanguage,
|
|
172
|
+
timeout: created?.timeout ?? timeout ?? null,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const routeReload = await reloadRoutesResult();
|
|
176
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
177
|
+
action: 'created',
|
|
178
|
+
handlers: results,
|
|
179
|
+
canonicalRouteAcknowledged: Boolean(targetRoute?.mainTable && allowCanonicalRoute),
|
|
180
|
+
scriptValidation,
|
|
181
|
+
routeReload,
|
|
182
|
+
detailHint: 'Use inspect_route with the same routeId/path to inspect saved handlers.',
|
|
183
|
+
}, null, 2) }] };
|
|
184
|
+
});
|
|
185
|
+
server.tool('create_pre_hook', [
|
|
186
|
+
'Create a pre-hook that runs BEFORE the handler. Use to validate, transform, inject data, or enforce owner/tenant row filters (RLS).',
|
|
187
|
+
'Use `routeId` from `create_route` or `get_all_routes` — do not create a new table just to get a route id.',
|
|
188
|
+
'Macros: @BODY, @QUERY, @PARAMS, @USER, @REPOS, @HELPERS, @THROW400..@THROW503.',
|
|
189
|
+
'For canonical table reads, merge security filters into @QUERY.filter and preserve @QUERY.fields/deep/sort/limit/page/meta/aggregate.',
|
|
190
|
+
'If the hook returns a value, that value becomes the response (handler is skipped).',
|
|
191
|
+
].join(' '), {
|
|
192
|
+
routeId: z.union([z.string(), z.number()]).describe('Route definition ID'),
|
|
193
|
+
name: z.string().describe('Hook name (unique per route)'),
|
|
194
|
+
code: z.string().describe('Hook JavaScript sourceCode. MCP stores it as sourceCode and lets Enfyra compile compiledCode.'),
|
|
195
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language for compiler. Default javascript.'),
|
|
196
|
+
methods: z.array(z.string()).optional()
|
|
197
|
+
.describe('Method names this hook applies to. Default: built-in REST methods GET, POST, PATCH, DELETE.'),
|
|
198
|
+
priority: z.number().optional().default(0).describe('Execution order (lower = first)'),
|
|
199
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable hook immediately'),
|
|
200
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
201
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z),
|
|
202
|
+
}, async ({ routeId, name, code, scriptLanguage, methods, priority, isEnabled, globalRulesAckKey, knowledgeAckKey }) => {
|
|
203
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
204
|
+
assertDynamicCodeKnowledgeAck(knowledgeAckKey);
|
|
205
|
+
const methodMap = await getMethodMap();
|
|
206
|
+
const methodNames = methods || ['GET', 'POST', 'PATCH', 'DELETE'];
|
|
207
|
+
const scriptValidation = await validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_pre_hook', {
|
|
208
|
+
sourceCode: code,
|
|
209
|
+
scriptLanguage,
|
|
210
|
+
});
|
|
211
|
+
const result = await fetchAPI(ENFYRA_API_URL, '/enfyra_pre_hook', {
|
|
212
|
+
method: 'POST',
|
|
213
|
+
body: JSON.stringify({
|
|
214
|
+
route: { id: routeId },
|
|
215
|
+
name,
|
|
216
|
+
sourceCode: code,
|
|
217
|
+
scriptLanguage,
|
|
218
|
+
methods: resolveMethodIds(methodMap, methodNames),
|
|
219
|
+
priority,
|
|
220
|
+
isEnabled,
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
const routeReload = await reloadRoutesResult();
|
|
224
|
+
const created = firstDataRecord(result);
|
|
225
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
226
|
+
action: 'created',
|
|
227
|
+
kind: 'pre_hook',
|
|
228
|
+
id: getId(created),
|
|
229
|
+
name,
|
|
230
|
+
routeId,
|
|
231
|
+
scriptValidation,
|
|
232
|
+
routeReload,
|
|
233
|
+
}, null, 2) }] };
|
|
234
|
+
});
|
|
235
|
+
server.tool('create_post_hook', [
|
|
236
|
+
'Create a post-hook that runs AFTER the handler. Use to transform responses or add metadata.',
|
|
237
|
+
'Use `routeId` from `create_route` or `get_all_routes` — do not create a new table just to get a route id.',
|
|
238
|
+
'Macros: @DATA, @STATUS, @ERROR, @BODY, @QUERY, @USER, @SHARE, @API (post-hooks always run; on error path @ERROR is set, @DATA is null).',
|
|
239
|
+
'Mutate @DATA / $ctx.$data in place, or return a value: if the hook returns anything other than undefined, that value replaces $ctx.$data as the response payload.',
|
|
240
|
+
].join(' '), {
|
|
241
|
+
routeId: z.union([z.string(), z.number()]).describe('Route definition ID'),
|
|
242
|
+
name: z.string().describe('Hook name (unique per route)'),
|
|
243
|
+
code: z.string().describe('Hook JavaScript sourceCode. MCP stores it as sourceCode and lets Enfyra compile compiledCode.'),
|
|
244
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language for compiler. Default javascript.'),
|
|
245
|
+
methods: z.array(z.string()).optional()
|
|
246
|
+
.describe('Method names this hook applies to. Default: built-in REST methods GET, POST, PATCH, DELETE.'),
|
|
247
|
+
priority: z.number().optional().default(0).describe('Execution order (lower = first)'),
|
|
248
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable hook immediately'),
|
|
249
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
250
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z),
|
|
251
|
+
}, async ({ routeId, name, code, scriptLanguage, methods, priority, isEnabled, globalRulesAckKey, knowledgeAckKey }) => {
|
|
252
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
253
|
+
assertDynamicCodeKnowledgeAck(knowledgeAckKey);
|
|
254
|
+
const methodMap = await getMethodMap();
|
|
255
|
+
const methodNames = methods || ['GET', 'POST', 'PATCH', 'DELETE'];
|
|
256
|
+
const scriptValidation = await validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_post_hook', {
|
|
257
|
+
sourceCode: code,
|
|
258
|
+
scriptLanguage,
|
|
259
|
+
});
|
|
260
|
+
const result = await fetchAPI(ENFYRA_API_URL, '/enfyra_post_hook', {
|
|
261
|
+
method: 'POST',
|
|
262
|
+
body: JSON.stringify({
|
|
263
|
+
route: { id: routeId },
|
|
264
|
+
name,
|
|
265
|
+
sourceCode: code,
|
|
266
|
+
scriptLanguage,
|
|
267
|
+
methods: resolveMethodIds(methodMap, methodNames),
|
|
268
|
+
priority,
|
|
269
|
+
isEnabled,
|
|
270
|
+
}),
|
|
271
|
+
});
|
|
272
|
+
const routeReload = await reloadRoutesResult();
|
|
273
|
+
const created = firstDataRecord(result);
|
|
274
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
275
|
+
action: 'created',
|
|
276
|
+
kind: 'post_hook',
|
|
277
|
+
id: getId(created),
|
|
278
|
+
name,
|
|
279
|
+
routeId,
|
|
280
|
+
scriptValidation,
|
|
281
|
+
routeReload,
|
|
282
|
+
}, null, 2) }] };
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=route-definition-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-definition-tools.js","sourceRoot":"","sources":["../../src/lib/route-definition-tools.ts"],"names":[],"mappings":"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"}
|