@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,307 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { fetchAPI } from './fetch.js';
|
|
3
|
+
import { fetchTableCatalog, resolveTableCatalogEntry } from './metadata-client.js';
|
|
4
|
+
import { assertCustomEndpointRoute, assertDynamicEndpointContract, reviewDynamicEndpointContract, } from './dynamic-endpoint-contract.js';
|
|
5
|
+
import { validateScriptSourceIfPresent } from './mutation-guards.js';
|
|
6
|
+
import { normalizeStrictBoolean, } from './tool-input-normalization.js';
|
|
7
|
+
import { assertDynamicCodeKnowledgeAck, assertGlobalRulesAck, dynamicCodeKnowledgeAckParam, globalRulesAckParam, } from './required-knowledge.js';
|
|
8
|
+
import { createOrPatch, deleteRoute, fetchAll, findHandler, findRecord, firstDataRecord, getId, getMethodContext, jsonText, methodNamesFromRecords, normalizeMethodName, normalizeRestPath, reloadBestEffort, reloadRoutes, resolveMethodRefs, reviewCustomEndpointSource, runApiEndpointWorkflow, setRouteEnabled, uniqueMethodNames, updateRouteMethods, updateRoutePublicMethods, } from './platform-operation-logic.js';
|
|
9
|
+
export function registerPlatformRouteTools(server, ENFYRA_API_URL) {
|
|
10
|
+
server.tool('set_table_graphql', 'Business operation: enable or disable GraphQL for one table through enfyra_graphql, then reload GraphQL. REST route methods do not control GraphQL.', {
|
|
11
|
+
tableName: z.string().describe('Table name, alias, or id.'),
|
|
12
|
+
isEnabled: z.boolean().describe('Desired GraphQL enabled state for the table.'),
|
|
13
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
14
|
+
}, async ({ tableName, isEnabled, globalRulesAckKey }) => {
|
|
15
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
16
|
+
const catalog = await fetchTableCatalog(ENFYRA_API_URL);
|
|
17
|
+
const table = resolveTableCatalogEntry(catalog, tableName);
|
|
18
|
+
if (!table)
|
|
19
|
+
throw new Error(`Table not found: ${tableName}`);
|
|
20
|
+
const existing = await findRecord(ENFYRA_API_URL, 'enfyra_graphql', { table: { id: { _eq: getId(table) } } }, 'id,_id,table.id,isEnabled');
|
|
21
|
+
const operation = await createOrPatch(ENFYRA_API_URL, 'enfyra_graphql', existing, {
|
|
22
|
+
table: { id: getId(table) },
|
|
23
|
+
isEnabled,
|
|
24
|
+
});
|
|
25
|
+
const graphqlReload = await reloadBestEffort(ENFYRA_API_URL, '/admin/reload/graphql');
|
|
26
|
+
return jsonText({
|
|
27
|
+
action: 'table_graphql_set',
|
|
28
|
+
table: { id: getId(table), name: table.name },
|
|
29
|
+
graphql: { id: operation.id, isEnabled },
|
|
30
|
+
operation,
|
|
31
|
+
graphqlReload,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
server.tool('add_route_methods', 'Business operation: add HTTP methods to an existing route.', {
|
|
35
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
36
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
37
|
+
methods: z.array(z.string()).min(1).describe('HTTP method names to add.'),
|
|
38
|
+
isEnabled: z.boolean().optional().describe('Optionally enable/disable the route in the same safe patch.'),
|
|
39
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
40
|
+
}, async ({ path, routeId, methods, isEnabled, globalRulesAckKey }) => jsonText(await updateRouteMethods(ENFYRA_API_URL, {
|
|
41
|
+
path,
|
|
42
|
+
routeId,
|
|
43
|
+
methods,
|
|
44
|
+
mode: 'merge',
|
|
45
|
+
isEnabled,
|
|
46
|
+
globalRulesAckKey,
|
|
47
|
+
})));
|
|
48
|
+
server.tool('replace_route_methods', 'Business operation: replace an existing route availableMethods list exactly.', {
|
|
49
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
50
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
51
|
+
methods: z.array(z.string()).min(1).describe('Exact HTTP method names for availableMethods.'),
|
|
52
|
+
isEnabled: z.boolean().optional().describe('Optionally enable/disable the route in the same safe patch.'),
|
|
53
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
54
|
+
}, async ({ path, routeId, methods, isEnabled, globalRulesAckKey }) => jsonText(await updateRouteMethods(ENFYRA_API_URL, {
|
|
55
|
+
path,
|
|
56
|
+
routeId,
|
|
57
|
+
methods,
|
|
58
|
+
mode: 'replace',
|
|
59
|
+
isEnabled,
|
|
60
|
+
globalRulesAckKey,
|
|
61
|
+
})));
|
|
62
|
+
server.tool('remove_route_methods', 'Business operation: remove HTTP methods from an existing route.', {
|
|
63
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
64
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
65
|
+
methods: z.array(z.string()).min(1).describe('HTTP method names to remove.'),
|
|
66
|
+
isEnabled: z.boolean().optional().describe('Optionally enable/disable the route in the same safe patch.'),
|
|
67
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
68
|
+
}, async ({ path, routeId, methods, isEnabled, globalRulesAckKey }) => jsonText(await updateRouteMethods(ENFYRA_API_URL, {
|
|
69
|
+
path,
|
|
70
|
+
routeId,
|
|
71
|
+
methods,
|
|
72
|
+
mode: 'remove',
|
|
73
|
+
isEnabled,
|
|
74
|
+
globalRulesAckKey,
|
|
75
|
+
})));
|
|
76
|
+
server.tool('enable_route', 'Business operation: enable an existing route. Enabled routes are registered at runtime; disabled routes return 404.', {
|
|
77
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
78
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
79
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
80
|
+
}, async ({ path, routeId, globalRulesAckKey }) => jsonText(await setRouteEnabled(ENFYRA_API_URL, {
|
|
81
|
+
path,
|
|
82
|
+
routeId,
|
|
83
|
+
isEnabled: true,
|
|
84
|
+
globalRulesAckKey,
|
|
85
|
+
})));
|
|
86
|
+
server.tool('disable_route', 'Business operation: disable an existing route without deleting metadata. Disabled routes are not registered at runtime and return 404.', {
|
|
87
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
88
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
89
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
90
|
+
}, async ({ path, routeId, globalRulesAckKey }) => jsonText(await setRouteEnabled(ENFYRA_API_URL, {
|
|
91
|
+
path,
|
|
92
|
+
routeId,
|
|
93
|
+
isEnabled: false,
|
|
94
|
+
globalRulesAckKey,
|
|
95
|
+
})));
|
|
96
|
+
server.tool('delete_route', 'Business operation: preview-first delete for a route and its route-owned handlers, hooks, guards, and permissions. Use only when a route contract is retired.', {
|
|
97
|
+
path: z.string().optional().describe('Route path, e.g. /old-endpoint. Use either path or routeId.'),
|
|
98
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
99
|
+
expectedPath: z.string().optional().describe('Optional safety check. When confirm=true, pass the path returned by the preview.'),
|
|
100
|
+
confirm: z.boolean().optional().default(false).describe('false returns a dependency preview only; true deletes the route and related route-owned records.'),
|
|
101
|
+
globalRulesAckKey: globalRulesAckParam(z).optional().describe('Required when confirm=true. Use globalRulesAckKey from get_enfyra_required_knowledge.'),
|
|
102
|
+
}, async (input) => jsonText(await deleteRoute(ENFYRA_API_URL, input)));
|
|
103
|
+
server.tool('public_route_methods', 'Business operation: make existing route methods public/anonymous.', {
|
|
104
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
105
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
106
|
+
methods: z.array(z.string()).min(1).describe('HTTP method names to make public. They must already be available on the route.'),
|
|
107
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
108
|
+
}, async ({ path, routeId, methods, globalRulesAckKey }) => jsonText(await updateRoutePublicMethods(ENFYRA_API_URL, {
|
|
109
|
+
path,
|
|
110
|
+
routeId,
|
|
111
|
+
methods,
|
|
112
|
+
mode: 'merge',
|
|
113
|
+
globalRulesAckKey,
|
|
114
|
+
})));
|
|
115
|
+
server.tool('private_route_methods', 'Business operation: make specific public route methods private again.', {
|
|
116
|
+
path: z.string().optional().describe('Route path, e.g. /sum. Use either path or routeId.'),
|
|
117
|
+
routeId: z.union([z.string(), z.number()]).optional().describe('Route id. Use either path or routeId.'),
|
|
118
|
+
methods: z.array(z.string()).min(1).describe('HTTP method names to remove from publicMethods.'),
|
|
119
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
120
|
+
}, async ({ path, routeId, methods, globalRulesAckKey }) => jsonText(await updateRoutePublicMethods(ENFYRA_API_URL, {
|
|
121
|
+
path,
|
|
122
|
+
routeId,
|
|
123
|
+
methods,
|
|
124
|
+
mode: 'remove',
|
|
125
|
+
globalRulesAckKey,
|
|
126
|
+
})));
|
|
127
|
+
server.tool('api_endpoint_workflow', [
|
|
128
|
+
'Step-by-step workflow for creating or updating a custom REST endpoint.',
|
|
129
|
+
'Use this when an LLM is building or changing endpoint behavior and should follow live nextSteps instead of guessing raw metadata mutations.',
|
|
130
|
+
'With apply=false it validates sourceCode, blocks canonical-route collisions, reviews explicit repository metadata/security boundaries, reads live route/handler/access state, and returns pending steps.',
|
|
131
|
+
'With apply=true it applies only the next pending step, then returns a fresh plan. With applyAll=true it advances all currently safe pending steps.',
|
|
132
|
+
].join(' '), {
|
|
133
|
+
path: z.string().describe('Custom route path, e.g. /sum. Must not be a full URL.'),
|
|
134
|
+
method: z.string().describe('HTTP method for the handler, e.g. GET or POST.'),
|
|
135
|
+
sourceCode: z.string().describe('Handler body sourceCode for a custom route, which has no main table. Do not wrap it in export default/module.exports. Use #secure.table_name or @REPOS.secure.table_name for user-facing explicit-table access. Repository calls are async and reads return result.data. Passing @BODY as create/update data is valid TypeORM-style usage; enforce endpoint-specific owner/tenant/business rules in code. Reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
|
|
136
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language.'),
|
|
137
|
+
anonymousAccess: z.enum(['public', 'private']).optional().default('private').describe('public adds the method to publicMethods; private removes this method from publicMethods.'),
|
|
138
|
+
public: z.preprocess(normalizeStrictBoolean, z.boolean()).optional().describe('Compatibility alias for anonymousAccess. Accepts boolean true/false and exact string "true"/"false"; false means private.'),
|
|
139
|
+
roleId: z.union([z.string(), z.number()]).optional().describe('Optional role id for authenticated route permission.'),
|
|
140
|
+
roleName: z.string().optional().describe('Optional role name for authenticated route permission, e.g. user.'),
|
|
141
|
+
allowedUserIds: z.array(z.union([z.string(), z.number()])).optional().describe('Optional user id scope for authenticated route permission.'),
|
|
142
|
+
routePermissionDescription: z.string().optional().describe('Optional admin note for created/updated route permission.'),
|
|
143
|
+
description: z.string().optional().describe('Route description.'),
|
|
144
|
+
timeout: z.number().int().positive().optional().describe('Optional handler timeout in ms.'),
|
|
145
|
+
overwrite: z.boolean().optional().default(false).describe('Required to update an existing handler whose sourceCode/scriptLanguage/timeout differs.'),
|
|
146
|
+
smokeTestQuery: z.string().optional().describe('Optional query JSON object for a smoke test, e.g. {"a":"1","b":"2"}.'),
|
|
147
|
+
smokeTestBody: z.string().optional().describe('Optional body JSON object for a smoke test.'),
|
|
148
|
+
apply: z.boolean().optional().default(false).describe('false returns plan only; true applies exactly the next pending step.'),
|
|
149
|
+
applyAll: z.boolean().optional().default(false).describe('true applies all safe pending steps in order. Prefer apply=true for production changes.'),
|
|
150
|
+
stepId: z.string().optional().describe('Optional pending step id to apply. Omit to apply the next pending step.'),
|
|
151
|
+
globalRulesAckKey: globalRulesAckParam(z).optional().describe('Required when apply/applyAll mutates metadata. Use globalRulesAckKey from get_enfyra_required_knowledge.'),
|
|
152
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z).optional().describe('Required when apply/applyAll reaches the save_handler step. Use dynamicCodeAckKey from get_enfyra_required_knowledge.'),
|
|
153
|
+
}, async (input) => jsonText(await runApiEndpointWorkflow(ENFYRA_API_URL, input)));
|
|
154
|
+
server.tool('create_api_endpoint', [
|
|
155
|
+
'Business operation: create or update a custom REST endpoint with a handler in one safe operation.',
|
|
156
|
+
'Prefer api_endpoint_workflow when route access, role/user permissions, overwrite decisions, or multi-step planning matter.',
|
|
157
|
+
'Use this one-shot helper only when the endpoint contract is already clear and no authenticated route-permission step is needed in the same operation, such as a simple public webhook or private admin-only utility that will be granted separately.',
|
|
158
|
+
'It creates the route without mainTableId, ensures the method is available, validates sourceCode, creates or overwrites the route handler, optionally makes the method public, reloads routes, and can smoke-test the endpoint.',
|
|
159
|
+
'For sourceCode, call discover_script_contexts first. Use #secure.table_name or @REPOS.secure.table_name for explicit user-facing table access; reserve #table_name/@REPOS.table_name for intentional trusted internal access.',
|
|
160
|
+
'Use table/schema tools separately when the user needs persisted data. This tool is for custom behavior endpoints.',
|
|
161
|
+
].join(' '), {
|
|
162
|
+
path: z.string().describe('Custom route path, e.g. /sum. Must not be a full URL.'),
|
|
163
|
+
method: z.string().describe('HTTP method for the handler, e.g. GET or POST.'),
|
|
164
|
+
sourceCode: z.string().describe('Handler body sourceCode for a custom route, which has no main table. Do not wrap it in export default/module.exports. Use #secure.table_name or @REPOS.secure.table_name for user-facing explicit-table access. Repository calls are async and reads return result.data. Passing @BODY as create/update data is valid TypeORM-style usage; enforce endpoint-specific owner/tenant/business rules in code. Reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
|
|
165
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language.'),
|
|
166
|
+
public: z.preprocess(normalizeStrictBoolean, z.boolean()).optional().default(false).describe('When true, the method is added to publicMethods for anonymous access. Exact string "true"/"false" is normalized for weak clients.'),
|
|
167
|
+
description: z.string().optional().describe('Route description.'),
|
|
168
|
+
timeout: z.number().int().positive().optional().describe('Optional handler timeout in ms.'),
|
|
169
|
+
overwrite: z.boolean().optional().default(false).describe('If a handler already exists for route+method, false fails; true updates its sourceCode.'),
|
|
170
|
+
smokeTestQuery: z.string().optional().describe('Optional query JSON object for a smoke test after save, e.g. {"a":"1","b":"2"}.'),
|
|
171
|
+
smokeTestBody: z.string().optional().describe('Optional body JSON object for a smoke test after save.'),
|
|
172
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
173
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z),
|
|
174
|
+
}, async ({ path, method, sourceCode, scriptLanguage, public: makePublic, description, timeout, overwrite, smokeTestQuery, smokeTestBody, globalRulesAckKey, knowledgeAckKey }) => {
|
|
175
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
176
|
+
assertDynamicCodeKnowledgeAck(knowledgeAckKey);
|
|
177
|
+
const normalizedPath = normalizeRestPath(path);
|
|
178
|
+
const methodName = normalizeMethodName(method);
|
|
179
|
+
assertDynamicEndpointContract(reviewDynamicEndpointContract({
|
|
180
|
+
routeKind: 'custom',
|
|
181
|
+
method: methodName,
|
|
182
|
+
sourceCode,
|
|
183
|
+
}));
|
|
184
|
+
const [{ methodMap, methodIdNameMap }, routes, scriptValidation, contractReview] = await Promise.all([
|
|
185
|
+
getMethodContext(ENFYRA_API_URL),
|
|
186
|
+
fetchAll(ENFYRA_API_URL, '/enfyra_route?limit=1000&fields=id,_id,path,isEnabled,availableMethods.*,publicMethods.*,mainTable.name'),
|
|
187
|
+
validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_route_handler', {
|
|
188
|
+
sourceCode,
|
|
189
|
+
scriptLanguage,
|
|
190
|
+
}),
|
|
191
|
+
reviewCustomEndpointSource(ENFYRA_API_URL, methodName, sourceCode),
|
|
192
|
+
]);
|
|
193
|
+
const methodId = methodMap[methodName];
|
|
194
|
+
if (!methodId)
|
|
195
|
+
throw new Error(`Unknown method "${methodName}". Valid methods: ${Object.keys(methodMap).sort().join(', ')}`);
|
|
196
|
+
let route = routes.find((item) => item.path === normalizedPath);
|
|
197
|
+
assertCustomEndpointRoute(route);
|
|
198
|
+
let routeAction = 'existing';
|
|
199
|
+
if (!route) {
|
|
200
|
+
const createRouteResult = await fetchAPI(ENFYRA_API_URL, '/enfyra_route', {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
body: JSON.stringify({
|
|
203
|
+
path: normalizedPath,
|
|
204
|
+
description,
|
|
205
|
+
isEnabled: true,
|
|
206
|
+
availableMethods: [{ id: methodId }],
|
|
207
|
+
publicMethods: makePublic ? [{ id: methodId }] : [],
|
|
208
|
+
}),
|
|
209
|
+
});
|
|
210
|
+
route = firstDataRecord(createRouteResult);
|
|
211
|
+
routeAction = 'created';
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const availableMethods = methodNamesFromRecords(route.availableMethods, methodIdNameMap);
|
|
215
|
+
const publicMethods = methodNamesFromRecords(route.publicMethods, methodIdNameMap);
|
|
216
|
+
const finalAvailable = uniqueMethodNames([...availableMethods, methodName]);
|
|
217
|
+
const finalPublic = makePublic ? uniqueMethodNames([...publicMethods, methodName]) : publicMethods;
|
|
218
|
+
const patchRouteResult = await fetchAPI(ENFYRA_API_URL, `/enfyra_route/${encodeURIComponent(String(getId(route)))}`, {
|
|
219
|
+
method: 'PATCH',
|
|
220
|
+
body: JSON.stringify({
|
|
221
|
+
availableMethods: resolveMethodRefs(methodMap, finalAvailable),
|
|
222
|
+
publicMethods: resolveMethodRefs(methodMap, finalPublic.filter((item) => finalAvailable.includes(item))),
|
|
223
|
+
...(description !== undefined ? { description } : {}),
|
|
224
|
+
}),
|
|
225
|
+
});
|
|
226
|
+
route = firstDataRecord(patchRouteResult) || route;
|
|
227
|
+
routeAction = 'updated';
|
|
228
|
+
}
|
|
229
|
+
const routeId = getId(route);
|
|
230
|
+
const existingHandler = await findHandler(ENFYRA_API_URL, routeId, methodId);
|
|
231
|
+
let handlerResult;
|
|
232
|
+
let handlerAction;
|
|
233
|
+
if (existingHandler) {
|
|
234
|
+
if (!overwrite) {
|
|
235
|
+
throw new Error(`Handler already exists for ${methodName} ${normalizedPath} with id ${getId(existingHandler)}. Re-run with overwrite=true to update it.`);
|
|
236
|
+
}
|
|
237
|
+
handlerAction = 'updated';
|
|
238
|
+
const body = { sourceCode, scriptLanguage };
|
|
239
|
+
if (timeout !== undefined)
|
|
240
|
+
body.timeout = timeout;
|
|
241
|
+
handlerResult = await fetchAPI(ENFYRA_API_URL, `/enfyra_route_handler/${encodeURIComponent(String(getId(existingHandler)))}`, {
|
|
242
|
+
method: 'PATCH',
|
|
243
|
+
body: JSON.stringify(body),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
handlerAction = 'created';
|
|
248
|
+
const body = {
|
|
249
|
+
route: { id: routeId },
|
|
250
|
+
method: { id: methodId },
|
|
251
|
+
sourceCode,
|
|
252
|
+
scriptLanguage,
|
|
253
|
+
};
|
|
254
|
+
if (timeout !== undefined)
|
|
255
|
+
body.timeout = timeout;
|
|
256
|
+
handlerResult = await fetchAPI(ENFYRA_API_URL, '/enfyra_route_handler', {
|
|
257
|
+
method: 'POST',
|
|
258
|
+
body: JSON.stringify(body),
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
const routeReload = await reloadRoutes(ENFYRA_API_URL);
|
|
262
|
+
let smokeTest = null;
|
|
263
|
+
if (smokeTestQuery !== undefined || smokeTestBody !== undefined) {
|
|
264
|
+
const query = smokeTestQuery ? JSON.parse(smokeTestQuery) : {};
|
|
265
|
+
if (!query || typeof query !== 'object' || Array.isArray(query))
|
|
266
|
+
throw new Error('smokeTestQuery must be a JSON object.');
|
|
267
|
+
const queryParams = new URLSearchParams();
|
|
268
|
+
for (const [key, value] of Object.entries(query)) {
|
|
269
|
+
if (value !== undefined && value !== null)
|
|
270
|
+
queryParams.set(key, String(value));
|
|
271
|
+
}
|
|
272
|
+
const body = smokeTestBody ? JSON.parse(smokeTestBody) : undefined;
|
|
273
|
+
const smokePath = `${normalizedPath}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;
|
|
274
|
+
smokeTest = await fetchAPI(ENFYRA_API_URL, smokePath, {
|
|
275
|
+
method: methodName,
|
|
276
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
const savedHandler = firstDataRecord(handlerResult);
|
|
280
|
+
return {
|
|
281
|
+
content: [{
|
|
282
|
+
type: 'text',
|
|
283
|
+
text: JSON.stringify({
|
|
284
|
+
action: 'api_endpoint_ready',
|
|
285
|
+
endpoint: {
|
|
286
|
+
path: normalizedPath,
|
|
287
|
+
method: methodName,
|
|
288
|
+
public: makePublic,
|
|
289
|
+
routeId,
|
|
290
|
+
handlerId: getId(savedHandler) || getId(existingHandler),
|
|
291
|
+
},
|
|
292
|
+
routeAction,
|
|
293
|
+
handlerAction,
|
|
294
|
+
scriptValidation,
|
|
295
|
+
contractReview,
|
|
296
|
+
routeReload,
|
|
297
|
+
smokeTest,
|
|
298
|
+
usage: {
|
|
299
|
+
restPath: `${ENFYRA_API_URL.replace(/\/$/, '')}${normalizedPath}`,
|
|
300
|
+
auth: makePublic ? 'anonymous allowed for this method' : 'Bearer auth and route access are required unless another guard bypass applies',
|
|
301
|
+
},
|
|
302
|
+
}, null, 2),
|
|
303
|
+
}],
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=platform-route-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-route-tools.js","sourceRoot":"","sources":["../../src/lib/platform-route-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { AnyRecord, FlowStepBody, HandlerBody, MethodIdNameMap, MethodMap, RouteHandlerBody, RouteMethodBody, WorkflowNextStep } from './platform-operation-types.js';
|
|
2
|
+
export declare function jsonText(payload: any): {
|
|
3
|
+
content: {
|
|
4
|
+
type: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-shared-operations.js","sourceRoot":"","sources":["../../src/lib/platform-shared-operations.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,QAAQ,CAAC,OAAO;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerPlatformWebsocketTools(server: any, ENFYRA_API_URL: any): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { assertDynamicCodeKnowledgeAck, assertDynamicCodeKnowledgeAckIf, assertGlobalRulesAck, dynamicCodeKnowledgeAckParam, globalRulesAckParam, } from './required-knowledge.js';
|
|
3
|
+
import { createOrPatch, findRecord, getId, jsonText, naturalPartialReload, normalizeRestPath, validateDynamicScript, } from './platform-operation-logic.js';
|
|
4
|
+
export function registerPlatformWebsocketTools(server, ENFYRA_API_URL) {
|
|
5
|
+
server.tool('ensure_websocket_gateway', 'Business operation: create or update an Enfyra Socket.IO gateway. Connection handler sourceCode is validated before save.', {
|
|
6
|
+
path: z.string().describe('Gateway namespace/path, e.g. /chat.'),
|
|
7
|
+
sourceCode: z.string().optional().describe('Optional connection handler dynamic script sourceCode.'),
|
|
8
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language for connection handler.'),
|
|
9
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable gateway.'),
|
|
10
|
+
description: z.string().optional().describe('Admin note.'),
|
|
11
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
12
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z).optional().describe('Required when sourceCode is provided. Use dynamicCodeAckKey from get_enfyra_required_knowledge.'),
|
|
13
|
+
}, async ({ path, sourceCode, scriptLanguage, isEnabled, description, globalRulesAckKey, knowledgeAckKey }) => {
|
|
14
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
15
|
+
assertDynamicCodeKnowledgeAckIf(sourceCode !== undefined, knowledgeAckKey);
|
|
16
|
+
const normalizedPath = normalizeRestPath(path);
|
|
17
|
+
const validation = sourceCode === undefined
|
|
18
|
+
? { validated: false, reason: 'no sourceCode' }
|
|
19
|
+
: await validateDynamicScript(ENFYRA_API_URL, sourceCode, scriptLanguage);
|
|
20
|
+
const existing = await findRecord(ENFYRA_API_URL, 'enfyra_websocket', { path: { _eq: normalizedPath } }, 'id,_id,path');
|
|
21
|
+
const body = {
|
|
22
|
+
path: normalizedPath,
|
|
23
|
+
isEnabled,
|
|
24
|
+
description,
|
|
25
|
+
...(sourceCode !== undefined ? { sourceCode, scriptLanguage } : {}),
|
|
26
|
+
};
|
|
27
|
+
const operation = await createOrPatch(ENFYRA_API_URL, 'enfyra_websocket', existing, body);
|
|
28
|
+
const reload = naturalPartialReload('Websocket metadata writes trigger the server partial reload contract; there is no dedicated websocket reload endpoint.');
|
|
29
|
+
return jsonText({ action: 'websocket_gateway_ensured', gateway: { id: operation.id, path: normalizedPath }, validation, operation, reload });
|
|
30
|
+
});
|
|
31
|
+
server.tool('ensure_websocket_event', 'Business operation: create or update one websocket event handler. It resolves gateway path/id and validates sourceCode before save.', {
|
|
32
|
+
gatewayPath: z.string().optional().describe('Gateway path, e.g. /chat. Use gatewayPath or gatewayId.'),
|
|
33
|
+
gatewayId: z.union([z.string(), z.number()]).optional().describe('Gateway id. Use gatewayPath or gatewayId.'),
|
|
34
|
+
eventName: z.string().describe('Socket event name.'),
|
|
35
|
+
sourceCode: z.string().describe('Event handler dynamic script sourceCode.'),
|
|
36
|
+
scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language.'),
|
|
37
|
+
isEnabled: z.boolean().optional().default(true).describe('Enable event.'),
|
|
38
|
+
description: z.string().optional().describe('Admin note.'),
|
|
39
|
+
globalRulesAckKey: globalRulesAckParam(z),
|
|
40
|
+
knowledgeAckKey: dynamicCodeKnowledgeAckParam(z),
|
|
41
|
+
}, async ({ gatewayPath, gatewayId, eventName, sourceCode, scriptLanguage, isEnabled, description, globalRulesAckKey, knowledgeAckKey }) => {
|
|
42
|
+
assertGlobalRulesAck(globalRulesAckKey);
|
|
43
|
+
assertDynamicCodeKnowledgeAck(knowledgeAckKey);
|
|
44
|
+
if (!gatewayPath && !gatewayId)
|
|
45
|
+
throw new Error('Provide gatewayPath or gatewayId.');
|
|
46
|
+
if (gatewayPath && gatewayId)
|
|
47
|
+
throw new Error('Provide gatewayPath or gatewayId, not both.');
|
|
48
|
+
const gateway = gatewayId
|
|
49
|
+
? await findRecord(ENFYRA_API_URL, 'enfyra_websocket', { id: { _eq: gatewayId } }, 'id,_id,path')
|
|
50
|
+
: await findRecord(ENFYRA_API_URL, 'enfyra_websocket', { path: { _eq: normalizeRestPath(gatewayPath) } }, 'id,_id,path');
|
|
51
|
+
if (!gateway)
|
|
52
|
+
throw new Error(`Websocket gateway not found: ${gatewayId || gatewayPath}`);
|
|
53
|
+
const validation = await validateDynamicScript(ENFYRA_API_URL, sourceCode, scriptLanguage);
|
|
54
|
+
const existing = await findRecord(ENFYRA_API_URL, 'enfyra_websocket_event', {
|
|
55
|
+
gateway: { id: { _eq: getId(gateway) } },
|
|
56
|
+
eventName: { _eq: eventName },
|
|
57
|
+
}, 'id,_id,eventName,gateway.id');
|
|
58
|
+
const operation = await createOrPatch(ENFYRA_API_URL, 'enfyra_websocket_event', existing, {
|
|
59
|
+
gateway: { id: getId(gateway) },
|
|
60
|
+
eventName,
|
|
61
|
+
sourceCode,
|
|
62
|
+
scriptLanguage,
|
|
63
|
+
isEnabled,
|
|
64
|
+
description,
|
|
65
|
+
});
|
|
66
|
+
const reload = naturalPartialReload('Websocket event writes trigger the server partial reload contract; there is no dedicated websocket reload endpoint.');
|
|
67
|
+
return jsonText({ action: 'websocket_event_ensured', gateway: { id: getId(gateway), path: gateway.path }, eventName, validation, operation, reload });
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=platform-websocket-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-websocket-tools.js","sourceRoot":"","sources":["../../src/lib/platform-websocket-tools.ts"],"names":[],"mappings":"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"}
|