beddel 0.1.0
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 +297 -0
- package/dist/agents/agentRegistry.d.ts +68 -0
- package/dist/agents/agentRegistry.d.ts.map +1 -0
- package/dist/agents/agentRegistry.js +222 -0
- package/dist/agents/agentRegistry.js.map +1 -0
- package/dist/agents/formatter-agent.d.ts +10 -0
- package/dist/agents/formatter-agent.d.ts.map +1 -0
- package/dist/agents/formatter-agent.js +49 -0
- package/dist/agents/formatter-agent.js.map +1 -0
- package/dist/agents/genkit-agent.d.ts +12 -0
- package/dist/agents/genkit-agent.d.ts.map +1 -0
- package/dist/agents/genkit-agent.js +119 -0
- package/dist/agents/genkit-agent.js.map +1 -0
- package/dist/agents/i18n-messages.d.ts +17 -0
- package/dist/agents/i18n-messages.d.ts.map +1 -0
- package/dist/agents/i18n-messages.js +92 -0
- package/dist/agents/i18n-messages.js.map +1 -0
- package/dist/agents/index.d.ts +10 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +26 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/pipeline.d.ts +15 -0
- package/dist/agents/pipeline.d.ts.map +1 -0
- package/dist/agents/pipeline.js +45 -0
- package/dist/agents/pipeline.js.map +1 -0
- package/dist/agents/schema-factory.d.ts +40 -0
- package/dist/agents/schema-factory.d.ts.map +1 -0
- package/dist/agents/schema-factory.js +121 -0
- package/dist/agents/schema-factory.js.map +1 -0
- package/dist/agents/translation-validators.d.ts +26 -0
- package/dist/agents/translation-validators.d.ts.map +1 -0
- package/dist/agents/translation-validators.js +77 -0
- package/dist/agents/translation-validators.js.map +1 -0
- package/dist/agents/translator-agents.d.ts +184 -0
- package/dist/agents/translator-agents.d.ts.map +1 -0
- package/dist/agents/translator-agents.js +613 -0
- package/dist/agents/translator-agents.js.map +1 -0
- package/dist/agents/types/translation.types.d.ts +100 -0
- package/dist/agents/types/translation.types.d.ts.map +1 -0
- package/dist/agents/types/translation.types.js +3 -0
- package/dist/agents/types/translation.types.js.map +1 -0
- package/dist/agents/validator-agent.d.ts +42 -0
- package/dist/agents/validator-agent.d.ts.map +1 -0
- package/dist/agents/validator-agent.js +122 -0
- package/dist/agents/validator-agent.js.map +1 -0
- package/dist/audit/auditTrail.d.ts +55 -0
- package/dist/audit/auditTrail.d.ts.map +1 -0
- package/dist/audit/auditTrail.js +93 -0
- package/dist/audit/auditTrail.js.map +1 -0
- package/dist/compliance/gdprEngine.d.ts +44 -0
- package/dist/compliance/gdprEngine.d.ts.map +1 -0
- package/dist/compliance/gdprEngine.js +178 -0
- package/dist/compliance/gdprEngine.js.map +1 -0
- package/dist/compliance/lgpdEngine.d.ts +51 -0
- package/dist/compliance/lgpdEngine.d.ts.map +1 -0
- package/dist/compliance/lgpdEngine.js +221 -0
- package/dist/compliance/lgpdEngine.js.map +1 -0
- package/dist/config.d.ts +78 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/firebase/tenantManager.d.ts +84 -0
- package/dist/firebase/tenantManager.d.ts.map +1 -0
- package/dist/firebase/tenantManager.js +378 -0
- package/dist/firebase/tenantManager.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/secure-yaml-runtime.d.ts +68 -0
- package/dist/integration/secure-yaml-runtime.d.ts.map +1 -0
- package/dist/integration/secure-yaml-runtime.js +245 -0
- package/dist/integration/secure-yaml-runtime.js.map +1 -0
- package/dist/parser/secure-yaml-parser.d.ts +62 -0
- package/dist/parser/secure-yaml-parser.d.ts.map +1 -0
- package/dist/parser/secure-yaml-parser.js +234 -0
- package/dist/parser/secure-yaml-parser.js.map +1 -0
- package/dist/performance/autoscaling.d.ts +100 -0
- package/dist/performance/autoscaling.d.ts.map +1 -0
- package/dist/performance/autoscaling.js +339 -0
- package/dist/performance/autoscaling.js.map +1 -0
- package/dist/performance/benchmark.d.ts +104 -0
- package/dist/performance/benchmark.d.ts.map +1 -0
- package/dist/performance/benchmark.js +514 -0
- package/dist/performance/benchmark.js.map +1 -0
- package/dist/performance/index.d.ts +14 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +35 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/monitor.d.ts +126 -0
- package/dist/performance/monitor.d.ts.map +1 -0
- package/dist/performance/monitor.js +324 -0
- package/dist/performance/monitor.js.map +1 -0
- package/dist/performance/streaming.d.ts +82 -0
- package/dist/performance/streaming.d.ts.map +1 -0
- package/dist/performance/streaming.js +287 -0
- package/dist/performance/streaming.js.map +1 -0
- package/dist/runtime/audit.d.ts +240 -0
- package/dist/runtime/audit.d.ts.map +1 -0
- package/dist/runtime/audit.js +641 -0
- package/dist/runtime/audit.js.map +1 -0
- package/dist/runtime/declarativeAgentRuntime.d.ts +123 -0
- package/dist/runtime/declarativeAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/declarativeAgentRuntime.js +576 -0
- package/dist/runtime/declarativeAgentRuntime.js.map +1 -0
- package/dist/runtime/isolatedRuntime.d.ts +119 -0
- package/dist/runtime/isolatedRuntime.d.ts.map +1 -0
- package/dist/runtime/isolatedRuntime.js +425 -0
- package/dist/runtime/isolatedRuntime.js.map +1 -0
- package/dist/runtime/schemaCompiler.d.ts +35 -0
- package/dist/runtime/schemaCompiler.d.ts.map +1 -0
- package/dist/runtime/schemaCompiler.js +151 -0
- package/dist/runtime/schemaCompiler.js.map +1 -0
- package/dist/runtime/simpleRuntime.d.ts +57 -0
- package/dist/runtime/simpleRuntime.d.ts.map +1 -0
- package/dist/runtime/simpleRuntime.js +187 -0
- package/dist/runtime/simpleRuntime.js.map +1 -0
- package/dist/security/dashboard.d.ts +89 -0
- package/dist/security/dashboard.d.ts.map +1 -0
- package/dist/security/dashboard.js +300 -0
- package/dist/security/dashboard.js.map +1 -0
- package/dist/security/hardening.d.ts +130 -0
- package/dist/security/hardening.d.ts.map +1 -0
- package/dist/security/hardening.js +414 -0
- package/dist/security/hardening.js.map +1 -0
- package/dist/security/index.d.ts +128 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +353 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/monitor.d.ts +88 -0
- package/dist/security/monitor.d.ts.map +1 -0
- package/dist/security/monitor.js +356 -0
- package/dist/security/monitor.js.map +1 -0
- package/dist/security/scanner.d.ts +104 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +298 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/security/score.d.ts +150 -0
- package/dist/security/score.d.ts.map +1 -0
- package/dist/security/score.js +983 -0
- package/dist/security/score.js.map +1 -0
- package/dist/security/test-security.d.ts +22 -0
- package/dist/security/test-security.d.ts.map +1 -0
- package/dist/security/test-security.js +154 -0
- package/dist/security/test-security.js.map +1 -0
- package/dist/security/threatDetector.d.ts +39 -0
- package/dist/security/threatDetector.d.ts.map +1 -0
- package/dist/security/threatDetector.js +354 -0
- package/dist/security/threatDetector.js.map +1 -0
- package/dist/security/validation.d.ts +69 -0
- package/dist/security/validation.d.ts.map +1 -0
- package/dist/security/validation.js +286 -0
- package/dist/security/validation.js.map +1 -0
- package/dist/server/api/clientsRoute.d.ts +9 -0
- package/dist/server/api/clientsRoute.d.ts.map +1 -0
- package/dist/server/api/clientsRoute.js +71 -0
- package/dist/server/api/clientsRoute.js.map +1 -0
- package/dist/server/api/endpointsRoute.d.ts +8 -0
- package/dist/server/api/endpointsRoute.d.ts.map +1 -0
- package/dist/server/api/endpointsRoute.js +76 -0
- package/dist/server/api/endpointsRoute.js.map +1 -0
- package/dist/server/api/graphql.d.ts +9 -0
- package/dist/server/api/graphql.d.ts.map +1 -0
- package/dist/server/api/graphql.js +180 -0
- package/dist/server/api/graphql.js.map +1 -0
- package/dist/server/errors.d.ts +19 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +42 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +24 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/kvStore.d.ts +27 -0
- package/dist/server/kvStore.d.ts.map +1 -0
- package/dist/server/kvStore.js +128 -0
- package/dist/server/kvStore.js.map +1 -0
- package/dist/server/runtimeSecurity.d.ts +28 -0
- package/dist/server/runtimeSecurity.d.ts.map +1 -0
- package/dist/server/runtimeSecurity.js +85 -0
- package/dist/server/runtimeSecurity.js.map +1 -0
- package/dist/server/types.d.ts +53 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +8 -0
- package/dist/server/types.js.map +1 -0
- package/dist/types/executionContext.d.ts +16 -0
- package/dist/types/executionContext.d.ts.map +1 -0
- package/dist/types/executionContext.js +3 -0
- package/dist/types/executionContext.js.map +1 -0
- package/package.json +77 -0
- package/src/agents/agentRegistry.ts +272 -0
- package/src/agents/image-agent.yaml +86 -0
- package/src/agents/joker-agent.yaml +47 -0
- package/src/agents/translator-agent.yaml +80 -0
- package/src/audit/auditTrail.ts +134 -0
- package/src/compliance/gdprEngine.ts +209 -0
- package/src/compliance/lgpdEngine.ts +268 -0
- package/src/config.ts +179 -0
- package/src/errors.ts +35 -0
- package/src/firebase/tenantManager.ts +443 -0
- package/src/index.ts +125 -0
- package/src/integration/secure-yaml-runtime.ts +341 -0
- package/src/parser/secure-yaml-parser.ts +273 -0
- package/src/performance/autoscaling.ts +495 -0
- package/src/performance/benchmark.ts +644 -0
- package/src/performance/index.ts +34 -0
- package/src/performance/monitor.ts +469 -0
- package/src/performance/streaming.ts +317 -0
- package/src/runtime/audit.ts +907 -0
- package/src/runtime/declarativeAgentRuntime.ts +836 -0
- package/src/runtime/isolatedRuntime.ts +572 -0
- package/src/runtime/schemaCompiler.ts +228 -0
- package/src/runtime/simpleRuntime.ts +201 -0
- package/src/security/dashboard.ts +462 -0
- package/src/security/hardening.ts +560 -0
- package/src/security/index.ts +439 -0
- package/src/security/monitor.ts +490 -0
- package/src/security/scanner.ts +368 -0
- package/src/security/score.ts +1138 -0
- package/src/security/threatDetector.ts +481 -0
- package/src/security/validation.ts +365 -0
- package/src/server/api/clientsRoute.ts +92 -0
- package/src/server/api/endpointsRoute.ts +97 -0
- package/src/server/api/graphql.ts +249 -0
- package/src/server/errors.ts +38 -0
- package/src/server/index.ts +6 -0
- package/src/server/kvStore.ts +152 -0
- package/src/server/runtimeSecurity.ts +102 -0
- package/src/server/types.ts +60 -0
- package/src/types/executionContext.ts +16 -0
- package/tools/seed.ts +365 -0
- package/tools/test-endpoints.ts +174 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GraphQL helpers used by the /api/graphql route.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getGraphQLSchema = getGraphQLSchema;
|
|
7
|
+
exports.executeRegisteredMethod = executeRegisteredMethod;
|
|
8
|
+
exports.handleGraphQLPost = handleGraphQLPost;
|
|
9
|
+
exports.handleGraphQLGet = handleGraphQLGet;
|
|
10
|
+
const agentRegistry_1 = require("../../agents/agentRegistry");
|
|
11
|
+
const kvStore_1 = require("../kvStore");
|
|
12
|
+
const runtimeSecurity_1 = require("../runtimeSecurity");
|
|
13
|
+
const errors_1 = require("../errors");
|
|
14
|
+
const schema = `
|
|
15
|
+
type Query { ping: String! }
|
|
16
|
+
type Mutation { executeMethod(methodName: String!, params: JSON!, props: JSON!): ExecutionResult! }
|
|
17
|
+
type ExecutionResult { success: Boolean!, data: JSON, error: String, executionTime: Int! }
|
|
18
|
+
scalar JSON
|
|
19
|
+
`;
|
|
20
|
+
function getGraphQLSchema() {
|
|
21
|
+
return schema;
|
|
22
|
+
}
|
|
23
|
+
async function executeRegisteredMethod(input, clientId) {
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
const context = {
|
|
26
|
+
logs: [],
|
|
27
|
+
status: "running",
|
|
28
|
+
output: undefined,
|
|
29
|
+
error: undefined,
|
|
30
|
+
log: (message) => context.logs.push(`[${new Date().toISOString()}] ${message}`),
|
|
31
|
+
setOutput: (output) => {
|
|
32
|
+
context.output = output;
|
|
33
|
+
context.status = "success";
|
|
34
|
+
},
|
|
35
|
+
setError: (error) => {
|
|
36
|
+
context.error = error;
|
|
37
|
+
context.status = "error";
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
context.log("Method execution initiated.");
|
|
42
|
+
if (!(0, runtimeSecurity_1.isValidMethodName)(input.methodName)) {
|
|
43
|
+
throw new errors_1.ValidationError("Invalid method name format");
|
|
44
|
+
}
|
|
45
|
+
const declarativeAgent = agentRegistry_1.agentRegistry.getAgent(input.methodName);
|
|
46
|
+
if (declarativeAgent) {
|
|
47
|
+
context.log(`Found declarative agent: ${input.methodName}`);
|
|
48
|
+
const result = await agentRegistry_1.agentRegistry.executeAgent(input.methodName, (0, runtimeSecurity_1.sanitizeInput)(input.params), (0, runtimeSecurity_1.sanitizeInput)(input.props), context);
|
|
49
|
+
const executionTime = Date.now() - startTime;
|
|
50
|
+
await (0, kvStore_1.logExecution)({
|
|
51
|
+
id: `log_${Date.now()}`,
|
|
52
|
+
clientId,
|
|
53
|
+
endpointName: input.methodName,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
duration: executionTime,
|
|
56
|
+
success: true,
|
|
57
|
+
input: input.params,
|
|
58
|
+
output: result,
|
|
59
|
+
logs: context.logs,
|
|
60
|
+
});
|
|
61
|
+
return { success: true, data: result, executionTime };
|
|
62
|
+
}
|
|
63
|
+
const endpoint = await (0, kvStore_1.getEndpointByName)(input.methodName);
|
|
64
|
+
if (!endpoint) {
|
|
65
|
+
throw new errors_1.NotFoundError(`Method '${input.methodName}' not found`);
|
|
66
|
+
}
|
|
67
|
+
context.log(`Found endpoint: ${endpoint.name}`);
|
|
68
|
+
const sanitizedParams = (0, runtimeSecurity_1.sanitizeInput)(input.params);
|
|
69
|
+
const sanitizedProps = (0, runtimeSecurity_1.sanitizeInput)(input.props);
|
|
70
|
+
const { valid, missing } = (0, runtimeSecurity_1.validateRequiredProps)(endpoint.requiredProps, sanitizedProps);
|
|
71
|
+
if (!valid) {
|
|
72
|
+
throw new errors_1.ValidationError(`Missing required props: ${missing.join(", ")}`);
|
|
73
|
+
}
|
|
74
|
+
context.log("Props validated. Executing sandbox.");
|
|
75
|
+
await (0, runtimeSecurity_1.executeInSandbox)(endpoint.code, sanitizedParams, sanitizedProps, context);
|
|
76
|
+
context.log("Sandbox execution finished.");
|
|
77
|
+
if (context.status === "error") {
|
|
78
|
+
throw new Error(context.error || "Sandbox execution failed.");
|
|
79
|
+
}
|
|
80
|
+
if (context.status !== "success") {
|
|
81
|
+
throw new Error("Sandbox finished in an indeterminate state.");
|
|
82
|
+
}
|
|
83
|
+
const executionTime = Date.now() - startTime;
|
|
84
|
+
await (0, kvStore_1.logExecution)({
|
|
85
|
+
id: `log_${Date.now()}`,
|
|
86
|
+
clientId,
|
|
87
|
+
endpointName: input.methodName,
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
duration: executionTime,
|
|
90
|
+
success: true,
|
|
91
|
+
input: sanitizedParams,
|
|
92
|
+
output: context.output,
|
|
93
|
+
logs: context.logs,
|
|
94
|
+
});
|
|
95
|
+
return { success: true, data: context.output, executionTime };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const executionTime = Date.now() - startTime;
|
|
99
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
100
|
+
if (!context.error)
|
|
101
|
+
context.setError(errorMessage);
|
|
102
|
+
await (0, kvStore_1.logExecution)({
|
|
103
|
+
id: `log_${Date.now()}`,
|
|
104
|
+
clientId,
|
|
105
|
+
endpointName: input.methodName,
|
|
106
|
+
timestamp: new Date().toISOString(),
|
|
107
|
+
duration: executionTime,
|
|
108
|
+
success: false,
|
|
109
|
+
error: errorMessage,
|
|
110
|
+
input: input.params,
|
|
111
|
+
logs: context.logs,
|
|
112
|
+
});
|
|
113
|
+
return { success: false, error: errorMessage, executionTime };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function handleGraphQLPost(request) {
|
|
117
|
+
try {
|
|
118
|
+
let clientId;
|
|
119
|
+
const authHeader = request.headers.get("authorization");
|
|
120
|
+
if (authHeader && authHeader.startsWith("Bearer ")) {
|
|
121
|
+
const apiKey = authHeader.substring(7);
|
|
122
|
+
if (!(0, runtimeSecurity_1.isValidApiKey)(apiKey)) {
|
|
123
|
+
throw new errors_1.AuthenticationError("Invalid API key format");
|
|
124
|
+
}
|
|
125
|
+
const client = await (0, kvStore_1.getClientByApiKey)(apiKey);
|
|
126
|
+
if (!client)
|
|
127
|
+
throw new errors_1.AuthenticationError("Invalid API key");
|
|
128
|
+
const rateLimitOk = await (0, kvStore_1.checkRateLimit)(client.id, client.rateLimit);
|
|
129
|
+
if (!rateLimitOk)
|
|
130
|
+
throw new errors_1.RateLimitError("Rate limit exceeded.");
|
|
131
|
+
clientId = client.id;
|
|
132
|
+
}
|
|
133
|
+
else if (request.headers.get("x-admin-tenant") === "true") {
|
|
134
|
+
clientId = "admin_tenant";
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw new errors_1.AuthenticationError("Missing or invalid authorization header");
|
|
138
|
+
}
|
|
139
|
+
const body = await request.json();
|
|
140
|
+
if (!body.query) {
|
|
141
|
+
throw new errors_1.ValidationError("Missing query in request body");
|
|
142
|
+
}
|
|
143
|
+
if (body.query && body.query.includes("executeMethod")) {
|
|
144
|
+
if (!body.variables || !body.variables.methodName) {
|
|
145
|
+
throw new errors_1.ValidationError("Missing 'variables' or 'methodName' in request body");
|
|
146
|
+
}
|
|
147
|
+
const result = await executeRegisteredMethod({
|
|
148
|
+
methodName: body.variables.methodName,
|
|
149
|
+
params: body.variables.params || {},
|
|
150
|
+
props: body.variables.props || {},
|
|
151
|
+
}, clientId);
|
|
152
|
+
return Response.json({ data: { executeMethod: result } });
|
|
153
|
+
}
|
|
154
|
+
return Response.json({ errors: [{ message: "Unsupported operation" }] }, { status: 400 });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const status = error instanceof errors_1.AuthenticationError
|
|
158
|
+
? 401
|
|
159
|
+
: error instanceof errors_1.RateLimitError
|
|
160
|
+
? 429
|
|
161
|
+
: error instanceof errors_1.ValidationError
|
|
162
|
+
? 400
|
|
163
|
+
: error instanceof errors_1.NotFoundError
|
|
164
|
+
? 404
|
|
165
|
+
: 500;
|
|
166
|
+
return Response.json({
|
|
167
|
+
errors: [
|
|
168
|
+
{
|
|
169
|
+
message: error instanceof Error ? error.message : "Internal server error",
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
}, { status });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function handleGraphQLGet() {
|
|
176
|
+
return new Response(`<!DOCTYPE html>
|
|
177
|
+
<html><head><title>Opal Support API - GraphQL</title><style>body{font-family:sans-serif;max-width:800px;margin:50px auto;padding:20px}code,pre{background:#f4f4f4;padding:4px 8px;border-radius:4px}</style></head>
|
|
178
|
+
<body><h1>Opal Support API</h1><p>GraphQL endpoint for executing registered methods.</p><h2>Endpoint</h2><code>POST /api/graphql</code><h2>Authentication</h2><p>Use Bearer token in Authorization header.</p><h2>Schema</h2><pre>${schema}</pre></body></html>`, { headers: { "Content-Type": "text/html" } });
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../../src/server/api/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes shared across server runtimes.
|
|
3
|
+
*/
|
|
4
|
+
export declare class AuthenticationError extends Error {
|
|
5
|
+
constructor(message?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class RateLimitError extends Error {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class ValidationError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class ExecutionError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class NotFoundError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAA0B;CAI9C;AAED,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,SAAwB;CAI5C;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom error classes shared across server runtimes.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NotFoundError = exports.ExecutionError = exports.ValidationError = exports.RateLimitError = exports.AuthenticationError = void 0;
|
|
7
|
+
class AuthenticationError extends Error {
|
|
8
|
+
constructor(message = "Authentication failed") {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "AuthenticationError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.AuthenticationError = AuthenticationError;
|
|
14
|
+
class RateLimitError extends Error {
|
|
15
|
+
constructor(message = "Rate limit exceeded") {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "RateLimitError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.RateLimitError = RateLimitError;
|
|
21
|
+
class ValidationError extends Error {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = "ValidationError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ValidationError = ValidationError;
|
|
28
|
+
class ExecutionError extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = "ExecutionError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.ExecutionError = ExecutionError;
|
|
35
|
+
class NotFoundError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = "NotFoundError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.NotFoundError = NotFoundError;
|
|
42
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,uBAAuB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./errors";
|
|
3
|
+
export * from "./kvStore";
|
|
4
|
+
export * from "./runtimeSecurity";
|
|
5
|
+
export { agentRegistry } from "../agents/agentRegistry";
|
|
6
|
+
export type { AgentRegistration } from "../agents/agentRegistry";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.agentRegistry = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
__exportStar(require("./errors"), exports);
|
|
20
|
+
__exportStar(require("./kvStore"), exports);
|
|
21
|
+
__exportStar(require("./runtimeSecurity"), exports);
|
|
22
|
+
var agentRegistry_1 = require("../agents/agentRegistry");
|
|
23
|
+
Object.defineProperty(exports, "agentRegistry", { enumerable: true, get: function () { return agentRegistry_1.agentRegistry; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,2CAAyB;AACzB,4CAA0B;AAC1B,oDAAkC;AAClC,yDAAwD;AAA/C,8GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstash KV helpers shared between the Next.js runtime and npm package.
|
|
3
|
+
*/
|
|
4
|
+
import type { Client, Endpoint, ExecutionLog } from "./types";
|
|
5
|
+
export declare const KV_PREFIXES: {
|
|
6
|
+
readonly CLIENT: "client:";
|
|
7
|
+
readonly API_KEY: "apikey:";
|
|
8
|
+
readonly ENDPOINT: "endpoint:";
|
|
9
|
+
readonly ENDPOINT_NAME: "endpoint:name:";
|
|
10
|
+
readonly EXECUTION_LOG: "log:";
|
|
11
|
+
readonly RATE_LIMIT: "ratelimit:";
|
|
12
|
+
readonly CLIENTS_LIST: "clients:list";
|
|
13
|
+
readonly ENDPOINTS_LIST: "endpoints:list";
|
|
14
|
+
};
|
|
15
|
+
export declare function getClient(clientId: string): Promise<Client | null>;
|
|
16
|
+
export declare function getClientByApiKey(apiKey: string): Promise<Client | null>;
|
|
17
|
+
export declare function getAllClients(): Promise<Client[]>;
|
|
18
|
+
export declare function saveClient(client: Client): Promise<void>;
|
|
19
|
+
export declare function deleteClient(clientId: string): Promise<void>;
|
|
20
|
+
export declare function getEndpoint(endpointId: string): Promise<Endpoint | null>;
|
|
21
|
+
export declare function getEndpointByName(name: string): Promise<Endpoint | null>;
|
|
22
|
+
export declare function getAllEndpoints(): Promise<Endpoint[]>;
|
|
23
|
+
export declare function saveEndpoint(endpoint: Endpoint): Promise<void>;
|
|
24
|
+
export declare function deleteEndpoint(endpointId: string): Promise<void>;
|
|
25
|
+
export declare function logExecution(log: ExecutionLog): Promise<void>;
|
|
26
|
+
export declare function checkRateLimit(clientId: string, limit: number): Promise<boolean>;
|
|
27
|
+
//# sourceMappingURL=kvStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvStore.d.ts","sourceRoot":"","sources":["../../src/server/kvStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW9D,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExE;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI9E;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMvD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAclE;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE9E;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAM1B;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAM3D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAclB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Upstash KV helpers shared between the Next.js runtime and npm package.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KV_PREFIXES = void 0;
|
|
7
|
+
exports.getClient = getClient;
|
|
8
|
+
exports.getClientByApiKey = getClientByApiKey;
|
|
9
|
+
exports.getAllClients = getAllClients;
|
|
10
|
+
exports.saveClient = saveClient;
|
|
11
|
+
exports.deleteClient = deleteClient;
|
|
12
|
+
exports.getEndpoint = getEndpoint;
|
|
13
|
+
exports.getEndpointByName = getEndpointByName;
|
|
14
|
+
exports.getAllEndpoints = getAllEndpoints;
|
|
15
|
+
exports.saveEndpoint = saveEndpoint;
|
|
16
|
+
exports.deleteEndpoint = deleteEndpoint;
|
|
17
|
+
exports.logExecution = logExecution;
|
|
18
|
+
exports.checkRateLimit = checkRateLimit;
|
|
19
|
+
const redis_1 = require("@upstash/redis");
|
|
20
|
+
if (!process.env.KV_REST_API_URL || !process.env.KV_REST_API_TOKEN) {
|
|
21
|
+
throw new Error("Missing Upstash Redis credentials in environment variables");
|
|
22
|
+
}
|
|
23
|
+
const redis = new redis_1.Redis({
|
|
24
|
+
url: process.env.KV_REST_API_URL,
|
|
25
|
+
token: process.env.KV_REST_API_TOKEN,
|
|
26
|
+
});
|
|
27
|
+
exports.KV_PREFIXES = {
|
|
28
|
+
CLIENT: "client:",
|
|
29
|
+
API_KEY: "apikey:",
|
|
30
|
+
ENDPOINT: "endpoint:",
|
|
31
|
+
ENDPOINT_NAME: "endpoint:name:",
|
|
32
|
+
EXECUTION_LOG: "log:",
|
|
33
|
+
RATE_LIMIT: "ratelimit:",
|
|
34
|
+
CLIENTS_LIST: "clients:list",
|
|
35
|
+
ENDPOINTS_LIST: "endpoints:list",
|
|
36
|
+
};
|
|
37
|
+
async function getClient(clientId) {
|
|
38
|
+
return await redis.get(`${exports.KV_PREFIXES.CLIENT}${clientId}`);
|
|
39
|
+
}
|
|
40
|
+
async function getClientByApiKey(apiKey) {
|
|
41
|
+
const clientId = await redis.get(`${exports.KV_PREFIXES.API_KEY}${apiKey}`);
|
|
42
|
+
if (!clientId)
|
|
43
|
+
return null;
|
|
44
|
+
return await getClient(clientId);
|
|
45
|
+
}
|
|
46
|
+
async function getAllClients() {
|
|
47
|
+
const clientIds = (await redis.get(exports.KV_PREFIXES.CLIENTS_LIST)) || [];
|
|
48
|
+
if (clientIds.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const clients = await Promise.all(clientIds.map((id) => getClient(id)));
|
|
51
|
+
return clients.filter((c) => c !== null);
|
|
52
|
+
}
|
|
53
|
+
async function saveClient(client) {
|
|
54
|
+
await redis.set(`${exports.KV_PREFIXES.CLIENT}${client.id}`, JSON.stringify(client));
|
|
55
|
+
for (const apiKey of client.apiKeys) {
|
|
56
|
+
await redis.set(`${exports.KV_PREFIXES.API_KEY}${apiKey}`, client.id);
|
|
57
|
+
}
|
|
58
|
+
const clientIds = (await redis.get(exports.KV_PREFIXES.CLIENTS_LIST)) || [];
|
|
59
|
+
if (!clientIds.includes(client.id)) {
|
|
60
|
+
clientIds.push(client.id);
|
|
61
|
+
await redis.set(exports.KV_PREFIXES.CLIENTS_LIST, clientIds);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function deleteClient(clientId) {
|
|
65
|
+
const client = await getClient(clientId);
|
|
66
|
+
if (!client)
|
|
67
|
+
return;
|
|
68
|
+
for (const apiKey of client.apiKeys) {
|
|
69
|
+
await redis.del(`${exports.KV_PREFIXES.API_KEY}${apiKey}`);
|
|
70
|
+
}
|
|
71
|
+
let clientIds = (await redis.get(exports.KV_PREFIXES.CLIENTS_LIST)) || [];
|
|
72
|
+
clientIds = clientIds.filter((id) => id !== clientId);
|
|
73
|
+
await redis.set(exports.KV_PREFIXES.CLIENTS_LIST, clientIds);
|
|
74
|
+
await redis.del(`${exports.KV_PREFIXES.CLIENT}${clientId}`);
|
|
75
|
+
}
|
|
76
|
+
async function getEndpoint(endpointId) {
|
|
77
|
+
return await redis.get(`${exports.KV_PREFIXES.ENDPOINT}${endpointId}`);
|
|
78
|
+
}
|
|
79
|
+
async function getEndpointByName(name) {
|
|
80
|
+
const endpointId = await redis.get(`${exports.KV_PREFIXES.ENDPOINT_NAME}${name}`);
|
|
81
|
+
if (!endpointId)
|
|
82
|
+
return null;
|
|
83
|
+
return await getEndpoint(endpointId);
|
|
84
|
+
}
|
|
85
|
+
async function getAllEndpoints() {
|
|
86
|
+
const endpointIds = (await redis.get(exports.KV_PREFIXES.ENDPOINTS_LIST)) || [];
|
|
87
|
+
if (endpointIds.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const endpoints = await Promise.all(endpointIds.map((id) => getEndpoint(id)));
|
|
90
|
+
return endpoints.filter((e) => e !== null);
|
|
91
|
+
}
|
|
92
|
+
async function saveEndpoint(endpoint) {
|
|
93
|
+
await redis.set(`${exports.KV_PREFIXES.ENDPOINT}${endpoint.id}`, JSON.stringify(endpoint));
|
|
94
|
+
await redis.set(`${exports.KV_PREFIXES.ENDPOINT_NAME}${endpoint.name}`, endpoint.id);
|
|
95
|
+
const endpointIds = (await redis.get(exports.KV_PREFIXES.ENDPOINTS_LIST)) || [];
|
|
96
|
+
if (!endpointIds.includes(endpoint.id)) {
|
|
97
|
+
endpointIds.push(endpoint.id);
|
|
98
|
+
await redis.set(exports.KV_PREFIXES.ENDPOINTS_LIST, endpointIds);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function deleteEndpoint(endpointId) {
|
|
102
|
+
const endpoint = await getEndpoint(endpointId);
|
|
103
|
+
if (!endpoint)
|
|
104
|
+
return;
|
|
105
|
+
await redis.del(`${exports.KV_PREFIXES.ENDPOINT_NAME}${endpoint.name}`);
|
|
106
|
+
let endpointIds = (await redis.get(exports.KV_PREFIXES.ENDPOINTS_LIST)) || [];
|
|
107
|
+
endpointIds = endpointIds.filter((id) => id !== endpointId);
|
|
108
|
+
await redis.set(exports.KV_PREFIXES.ENDPOINTS_LIST, endpointIds);
|
|
109
|
+
await redis.del(`${exports.KV_PREFIXES.ENDPOINT}${endpointId}`);
|
|
110
|
+
}
|
|
111
|
+
async function logExecution(log) {
|
|
112
|
+
const key = `${exports.KV_PREFIXES.EXECUTION_LOG}${log.id}`;
|
|
113
|
+
await redis.set(key, JSON.stringify(log), {
|
|
114
|
+
ex: 60 * 60 * 24 * 30,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async function checkRateLimit(clientId, limit) {
|
|
118
|
+
const key = `${exports.KV_PREFIXES.RATE_LIMIT}${clientId}`;
|
|
119
|
+
const pipeline = redis.pipeline();
|
|
120
|
+
pipeline.incr(key);
|
|
121
|
+
pipeline.ttl(key);
|
|
122
|
+
const [current, ttl] = await pipeline.exec();
|
|
123
|
+
if (ttl === -1) {
|
|
124
|
+
await redis.expire(key, 60);
|
|
125
|
+
}
|
|
126
|
+
return current <= limit;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=kvStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvStore.js","sourceRoot":"","sources":["../../src/server/kvStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security helpers used by the Next.js runtime and exported as part of the package.
|
|
3
|
+
*/
|
|
4
|
+
import type { ExecutionContext } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize user input to prevent code injection
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitizeInput(input: unknown): unknown;
|
|
9
|
+
/**
|
|
10
|
+
* Validate method name (alphanumeric, underscores, and hyphens)
|
|
11
|
+
*/
|
|
12
|
+
export declare function isValidMethodName(name: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Validate API key format
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidApiKey(apiKey: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Execute stored code in a sandbox scope with a time limit.
|
|
19
|
+
*/
|
|
20
|
+
export declare function executeInSandbox(code: string, params: Record<string, unknown>, props: Record<string, string>, context: ExecutionContext): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate required props are provided
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateRequiredProps(requiredProps: string[], providedProps: Record<string, string>): {
|
|
25
|
+
valid: boolean;
|
|
26
|
+
missing: string[];
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=runtimeSecurity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeSecurity.d.ts","sourceRoot":"","sources":["../../src/server/runtimeSecurity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAsBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAMvC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security helpers used by the Next.js runtime and exported as part of the package.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sanitizeInput = sanitizeInput;
|
|
7
|
+
exports.isValidMethodName = isValidMethodName;
|
|
8
|
+
exports.isValidApiKey = isValidApiKey;
|
|
9
|
+
exports.executeInSandbox = executeInSandbox;
|
|
10
|
+
exports.validateRequiredProps = validateRequiredProps;
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize user input to prevent code injection
|
|
13
|
+
*/
|
|
14
|
+
function sanitizeInput(input) {
|
|
15
|
+
if (typeof input === "string") {
|
|
16
|
+
return input
|
|
17
|
+
.replace(/[<>]/g, "")
|
|
18
|
+
.replace(/javascript:/gi, "")
|
|
19
|
+
.replace(/on\w+=/gi, "")
|
|
20
|
+
.trim();
|
|
21
|
+
}
|
|
22
|
+
if (Array.isArray(input)) {
|
|
23
|
+
return input.map(sanitizeInput);
|
|
24
|
+
}
|
|
25
|
+
if (typeof input === "object" && input !== null) {
|
|
26
|
+
const sanitized = {};
|
|
27
|
+
for (const [key, value] of Object.entries(input)) {
|
|
28
|
+
sanitized[key] = sanitizeInput(value);
|
|
29
|
+
}
|
|
30
|
+
return sanitized;
|
|
31
|
+
}
|
|
32
|
+
return input;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate method name (alphanumeric, underscores, and hyphens)
|
|
36
|
+
*/
|
|
37
|
+
function isValidMethodName(name) {
|
|
38
|
+
return /^[a-zA-Z_-][a-zA-Z0-9_.-]*$/.test(name);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate API key format
|
|
42
|
+
*/
|
|
43
|
+
function isValidApiKey(apiKey) {
|
|
44
|
+
return /^opal_[a-z0-9_-]+_key_[a-zA-Z0-9]{12,}$/.test(apiKey);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Execute stored code in a sandbox scope with a time limit.
|
|
48
|
+
*/
|
|
49
|
+
async function executeInSandbox(code, params, props, context) {
|
|
50
|
+
const executionPromise = (async () => {
|
|
51
|
+
try {
|
|
52
|
+
const executeFunction = new Function(`return ${code}`)();
|
|
53
|
+
await executeFunction(params, props, context);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error("[Sandbox Execution Error]:", error);
|
|
57
|
+
const errorMessage = error instanceof Error ? error.message : "Internal sandbox error";
|
|
58
|
+
if (context.status !== "error") {
|
|
59
|
+
context.setError(errorMessage);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Execution timed out after 3000ms")), 3000));
|
|
64
|
+
try {
|
|
65
|
+
await Promise.race([executionPromise, timeoutPromise]);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown sandbox error";
|
|
69
|
+
if (context.status !== "error") {
|
|
70
|
+
context.setError(errorMessage);
|
|
71
|
+
}
|
|
72
|
+
context.log(`Sandbox execution failed: ${errorMessage}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validate required props are provided
|
|
77
|
+
*/
|
|
78
|
+
function validateRequiredProps(requiredProps, providedProps) {
|
|
79
|
+
const missing = requiredProps.filter((prop) => !providedProps[prop]);
|
|
80
|
+
return {
|
|
81
|
+
valid: missing.length === 0,
|
|
82
|
+
missing,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=runtimeSecurity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeSecurity.js","sourceRoot":"","sources":["../../src/server/runtimeSecurity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared server-side types for the Opal Support App runtime.
|
|
3
|
+
* These live inside the Beddel package so both the Next.js app and
|
|
4
|
+
* the npm distribution reference exactly the same contracts.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExecutionContext as DeclarativeExecutionContext } from "../types/executionContext";
|
|
7
|
+
export interface Client {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
email: string;
|
|
11
|
+
apiKeys: string[];
|
|
12
|
+
createdAt: string;
|
|
13
|
+
rateLimit: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Endpoint {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
code: string;
|
|
20
|
+
visibility: "public" | "private";
|
|
21
|
+
requiredProps: string[];
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ExecutionLog {
|
|
26
|
+
id: string;
|
|
27
|
+
clientId: string;
|
|
28
|
+
endpointName: string;
|
|
29
|
+
timestamp: string;
|
|
30
|
+
duration: number;
|
|
31
|
+
success: boolean;
|
|
32
|
+
error?: string;
|
|
33
|
+
input?: unknown;
|
|
34
|
+
output?: unknown;
|
|
35
|
+
logs?: string[];
|
|
36
|
+
}
|
|
37
|
+
export type ExecutionContext = DeclarativeExecutionContext;
|
|
38
|
+
export interface ExecuteMethodInput {
|
|
39
|
+
methodName: string;
|
|
40
|
+
params: Record<string, unknown>;
|
|
41
|
+
props: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
export interface ExecuteMethodResult {
|
|
44
|
+
success: boolean;
|
|
45
|
+
data?: unknown;
|
|
46
|
+
error?: string;
|
|
47
|
+
executionTime: number;
|
|
48
|
+
}
|
|
49
|
+
export interface GraphQLContext {
|
|
50
|
+
clientId: string;
|
|
51
|
+
client: Client;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|