@guardiojs/guardio 0.0.3 → 0.0.6
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/bin/guardio.mjs +3 -0
- package/dist/cli.js +44 -57
- package/dist/cli.js.map +1 -1
- package/dist/config/PluginManager.d.ts +4 -0
- package/dist/config/PluginManager.d.ts.map +1 -1
- package/dist/config/PluginManager.js +17 -1
- package/dist/config/PluginManager.js.map +1 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +27 -7
- package/dist/config/types.d.ts.map +1 -1
- package/dist/core/GuardioActions.d.ts +12 -0
- package/dist/core/GuardioActions.d.ts.map +1 -0
- package/dist/core/GuardioActions.js +12 -0
- package/dist/core/GuardioActions.js.map +1 -0
- package/dist/core/GuardioCore.d.ts +22 -9
- package/dist/core/GuardioCore.d.ts.map +1 -1
- package/dist/core/GuardioCore.js +175 -74
- package/dist/core/GuardioCore.js.map +1 -1
- package/dist/core/GuardioErrorCodes.d.ts +42 -0
- package/dist/core/GuardioErrorCodes.d.ts.map +1 -0
- package/dist/core/GuardioErrorCodes.js +71 -0
- package/dist/core/GuardioErrorCodes.js.map +1 -0
- package/dist/core/transports/create-client-transport.d.ts +14 -0
- package/dist/core/transports/create-client-transport.d.ts.map +1 -0
- package/dist/core/transports/create-client-transport.js +19 -0
- package/dist/core/transports/create-client-transport.js.map +1 -0
- package/dist/core/transports/http-client.d.ts +27 -0
- package/dist/core/transports/http-client.d.ts.map +1 -0
- package/dist/core/transports/http-client.js +86 -0
- package/dist/core/transports/http-client.js.map +1 -0
- package/dist/core/transports/index.d.ts +13 -0
- package/dist/core/transports/index.d.ts.map +1 -0
- package/dist/core/transports/index.js +11 -0
- package/dist/core/transports/index.js.map +1 -0
- package/dist/core/transports/sse-url-transport.d.ts +26 -0
- package/dist/core/transports/sse-url-transport.d.ts.map +1 -0
- package/dist/core/transports/sse-url-transport.js +111 -0
- package/dist/core/transports/sse-url-transport.js.map +1 -0
- package/dist/core/transports/stdio-client.d.ts +12 -0
- package/dist/core/transports/stdio-client.d.ts.map +1 -0
- package/dist/core/transports/stdio-client.js +25 -0
- package/dist/core/transports/stdio-client.js.map +1 -0
- package/dist/core/transports/types.d.ts +21 -0
- package/dist/core/transports/types.d.ts.map +1 -0
- package/dist/core/transports/types.js +2 -0
- package/dist/core/transports/types.js.map +1 -0
- package/dist/core/types.d.ts +40 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +11 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +16 -0
- package/dist/logger.js.map +1 -0
- package/dist/plugins/intervention/HttpInterventionPlugin.d.ts.map +1 -1
- package/dist/plugins/intervention/HttpInterventionPlugin.js +4 -7
- package/dist/plugins/intervention/HttpInterventionPlugin.js.map +1 -1
- package/dist/plugins/notification/DefaultNotificationPlugin.d.ts +1 -1
- package/dist/plugins/notification/DefaultNotificationPlugin.d.ts.map +1 -1
- package/dist/plugins/notification/DefaultNotificationPlugin.js +3 -2
- package/dist/plugins/notification/DefaultNotificationPlugin.js.map +1 -1
- package/dist/plugins/policy/DefaultPolicyPlugin.d.ts.map +1 -1
- package/dist/plugins/policy/DefaultPolicyPlugin.js +4 -1
- package/dist/plugins/policy/DefaultPolicyPlugin.js.map +1 -1
- package/dist/plugins/policy/RegexPolicyPlugin.d.ts.map +1 -1
- package/dist/plugins/policy/RegexPolicyPlugin.js +2 -1
- package/dist/plugins/policy/RegexPolicyPlugin.js.map +1 -1
- package/dist/server/index.d.ts +20 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +27 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +4 -3
- package/README.md +0 -224
package/dist/core/GuardioCore.js
CHANGED
|
@@ -1,115 +1,216 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { GuardioAction } from "./types.js";
|
|
3
3
|
import { PluginManager } from "../config/PluginManager.js";
|
|
4
|
+
import { createTransport, createClientTransport, } from "./transports/index.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
4
6
|
export class GuardioCore {
|
|
5
7
|
config;
|
|
6
8
|
policyPlugins = [];
|
|
7
9
|
interventionPlugins = [];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
toolInterface = null;
|
|
11
|
-
pendingResponseId = null;
|
|
12
|
-
appQueue = [];
|
|
10
|
+
transport = null;
|
|
11
|
+
clientTransport = null;
|
|
13
12
|
constructor(config) {
|
|
14
13
|
this.config = config;
|
|
15
14
|
}
|
|
16
15
|
async run() {
|
|
16
|
+
logger.info("Starting Guardio core");
|
|
17
17
|
const pluginManager = new PluginManager();
|
|
18
18
|
const cwd = this.config.cwd ?? process.cwd();
|
|
19
19
|
this.policyPlugins = await pluginManager.getPolicyPlugins(cwd, this.config.configPath);
|
|
20
|
-
|
|
21
|
-
throw new Error("No policy plugins in config. Add at least one plugin with type 'policy'.");
|
|
22
|
-
}
|
|
20
|
+
logger.debug({ count: this.policyPlugins.length, names: this.policyPlugins.map((p) => p.name) }, "Policy plugins loaded");
|
|
23
21
|
this.interventionPlugins = await pluginManager.getInterventionPlugins(cwd, this.config.configPath);
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
logger.debug({ count: this.interventionPlugins.length, names: this.interventionPlugins.map((p) => p.name) }, "Intervention plugins loaded");
|
|
23
|
+
this.clientTransport = createClientTransport(this.config.client, {
|
|
24
|
+
handlePost: this.config.client?.mode === "http"
|
|
25
|
+
? (body) => this.handlePostMessage(body)
|
|
26
|
+
: undefined,
|
|
27
|
+
});
|
|
28
|
+
this.transport = createTransport(this.config.server, {
|
|
29
|
+
onEndpoint: () => this.clientTransport
|
|
30
|
+
?.setRemoteReady?.(),
|
|
26
31
|
});
|
|
27
|
-
this.
|
|
28
|
-
|
|
29
|
-
terminal: false,
|
|
32
|
+
this.transport.setResponseHandler((line) => {
|
|
33
|
+
this.sendToClient(line);
|
|
30
34
|
});
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
await this.transport.start();
|
|
36
|
+
logger.info("Transport started, listening for client messages");
|
|
37
|
+
this.clientTransport.listen(async (line) => {
|
|
38
|
+
await this.processAppLine(line);
|
|
34
39
|
});
|
|
35
|
-
this.attachAppHandler();
|
|
36
|
-
this.attachToolHandler();
|
|
37
40
|
}
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
sendToClient(message) {
|
|
42
|
+
this.clientTransport?.send(message);
|
|
43
|
+
}
|
|
44
|
+
/** Resolve Guardio package version from package.json when available. */
|
|
45
|
+
getGuardioVersion() {
|
|
46
|
+
try {
|
|
47
|
+
const require = createRequire(import.meta.url);
|
|
48
|
+
const pkg = require("../../package.json");
|
|
49
|
+
return pkg.version ?? "0.0.0";
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return "0.0.0";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build a successful JSON-RPC response for blocked/rejected tool calls.
|
|
57
|
+
* Returns a result (not error) so AI Agent frameworks don't treat it as a fatal error;
|
|
58
|
+
* the agent can read the content and _guardio metadata.
|
|
59
|
+
*/
|
|
60
|
+
buildGuardioBlockedResponse(id, options) {
|
|
61
|
+
if (id === undefined || id === null) {
|
|
62
|
+
return "";
|
|
63
|
+
}
|
|
64
|
+
const action = options.reason === "blocked"
|
|
65
|
+
? GuardioAction.TOOL_BLOCKED
|
|
66
|
+
: GuardioAction.POLICY_VIOLATION;
|
|
67
|
+
const policyId = options.policy ?? options.plugin ?? "Guardio";
|
|
68
|
+
const text = options.reason === "blocked"
|
|
69
|
+
? `🚫 [Guardio Security] Access Denied. The tool '${options.toolName}' was blocked by '${policyId}'. Reason: Policy denied the request.`
|
|
70
|
+
: `🚫 [Guardio Security] Access Denied. The tool '${options.toolName}' was rejected by '${policyId}'. Reason: Intervention plugin denied the request.`;
|
|
71
|
+
const result = {
|
|
72
|
+
content: [{ type: "text", text }],
|
|
73
|
+
isError: true,
|
|
74
|
+
_guardio: {
|
|
75
|
+
version: this.getGuardioVersion(),
|
|
76
|
+
requestId: id,
|
|
77
|
+
timestamp: new Date().toISOString(),
|
|
78
|
+
policyId,
|
|
79
|
+
action,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return JSON.stringify({
|
|
40
83
|
jsonrpc: "2.0",
|
|
41
84
|
id,
|
|
42
|
-
|
|
43
|
-
})
|
|
85
|
+
result,
|
|
86
|
+
});
|
|
44
87
|
}
|
|
45
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Handle POST /messages (HTTP client): run policy/intervention, then forward to remote.
|
|
90
|
+
*/
|
|
91
|
+
async handlePostMessage(body) {
|
|
92
|
+
const url = this.transport?.getRemotePostUrl?.();
|
|
93
|
+
logger.debug({
|
|
94
|
+
guardioDebug: "incoming",
|
|
95
|
+
bodyLength: body.length,
|
|
96
|
+
bodyRaw: body,
|
|
97
|
+
upstreamUrl: url ?? null,
|
|
98
|
+
}, "POST /messages: incoming request");
|
|
99
|
+
if (!url) {
|
|
100
|
+
logger.warn("POST /messages: remote MCP not ready");
|
|
101
|
+
return { status: 503, body: "Remote MCP not ready" };
|
|
102
|
+
}
|
|
46
103
|
try {
|
|
47
|
-
const request = JSON.parse(
|
|
104
|
+
const request = JSON.parse(body);
|
|
48
105
|
if (request.method === "tools/call") {
|
|
49
106
|
const toolName = request.params?.name ?? "(unknown)";
|
|
50
107
|
const args = request.params?.arguments;
|
|
51
|
-
|
|
108
|
+
logger.debug({ toolName, requestId: request.id, args }, "Evaluating tools/call (HTTP)");
|
|
52
109
|
for (const policy of this.policyPlugins) {
|
|
53
|
-
|
|
110
|
+
logger.debug({ toolName, policy: policy.name, args }, "Evaluating tools/call (HTTP)");
|
|
111
|
+
const result = policy.evaluate({ toolName, args });
|
|
54
112
|
if (result === "blocked") {
|
|
55
|
-
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
|
|
113
|
+
logger.warn({ toolName, policy: policy.name }, "Call blocked by policy");
|
|
114
|
+
const body = this.buildGuardioBlockedResponse(request.id, {
|
|
115
|
+
toolName,
|
|
116
|
+
reason: "blocked",
|
|
117
|
+
policy: policy.name,
|
|
118
|
+
});
|
|
119
|
+
if (body)
|
|
120
|
+
this.sendToClient(body);
|
|
121
|
+
return { status: 200, body };
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
logger.debug({ toolName, policy: policy.name, result }, "Call allowed by policy");
|
|
59
125
|
}
|
|
60
126
|
}
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
127
|
+
for (const plugin of this.interventionPlugins) {
|
|
128
|
+
const actResult = await Promise.resolve(plugin.act({ toolName, args }));
|
|
129
|
+
if (actResult === false) {
|
|
130
|
+
logger.warn({ toolName, plugin: plugin.name }, "Call rejected by intervention plugin");
|
|
131
|
+
const body = this.buildGuardioBlockedResponse(request.id, {
|
|
132
|
+
toolName,
|
|
133
|
+
reason: "rejected",
|
|
134
|
+
plugin: plugin.name,
|
|
135
|
+
});
|
|
136
|
+
if (body)
|
|
137
|
+
this.sendToClient(body);
|
|
138
|
+
return { status: 200, body };
|
|
70
139
|
}
|
|
71
140
|
}
|
|
72
|
-
this.pendingResponseId = request.id ?? null;
|
|
73
|
-
this.child.stdin?.write(line + "\n");
|
|
74
|
-
return;
|
|
75
141
|
}
|
|
76
|
-
|
|
142
|
+
logger.debug({
|
|
143
|
+
guardioDebug: "upstream_request",
|
|
144
|
+
url: String(url),
|
|
145
|
+
headers: { "Content-Type": "application/json" },
|
|
146
|
+
bodyForwarded: body,
|
|
147
|
+
}, "Forwarding POST to remote MCP");
|
|
148
|
+
const response = await fetch(url, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: { "Content-Type": "application/json" },
|
|
151
|
+
body,
|
|
152
|
+
});
|
|
153
|
+
const text = await response.text();
|
|
154
|
+
logger.debug({
|
|
155
|
+
guardioDebug: "upstream_response",
|
|
156
|
+
status: response.status,
|
|
157
|
+
responseBody: text,
|
|
158
|
+
requestId: request.id,
|
|
159
|
+
}, "Remote MCP response");
|
|
160
|
+
return { status: response.status, body: text };
|
|
77
161
|
}
|
|
78
|
-
catch {
|
|
79
|
-
|
|
162
|
+
catch (err) {
|
|
163
|
+
logger.error({ err }, "Forward POST failed");
|
|
164
|
+
return { status: 500, body: "Proxy Error" };
|
|
80
165
|
}
|
|
81
166
|
}
|
|
82
|
-
|
|
83
|
-
this.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if (line !== undefined)
|
|
87
|
-
this.processAppLine(line);
|
|
88
|
-
}
|
|
167
|
+
sendBlockedResponse(id, options) {
|
|
168
|
+
const body = this.buildGuardioBlockedResponse(id, options);
|
|
169
|
+
if (body)
|
|
170
|
+
this.sendToClient(body);
|
|
89
171
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Process one line from client (stdio or from queue): run plugins, then forward to MCP.
|
|
174
|
+
*/
|
|
175
|
+
async processAppLine(line) {
|
|
176
|
+
try {
|
|
177
|
+
const request = JSON.parse(line);
|
|
178
|
+
if (request.method === "tools/call") {
|
|
179
|
+
logger.debug({ guardioDebug: "stdio_tools_call", lineLength: line.length, lineRaw: line }, "Stdio: incoming tools/call");
|
|
180
|
+
const toolName = request.params?.name ?? "(unknown)";
|
|
181
|
+
const args = request.params?.arguments;
|
|
182
|
+
logger.debug({ toolName, requestId: request.id }, "Evaluating tools/call (stdio)");
|
|
183
|
+
for (const policy of this.policyPlugins) {
|
|
184
|
+
const result = policy.evaluate({ toolName, args });
|
|
185
|
+
if (result === "blocked") {
|
|
186
|
+
logger.warn({ toolName, policy: policy.name }, "Call blocked by policy");
|
|
187
|
+
this.sendBlockedResponse(request.id, {
|
|
188
|
+
toolName,
|
|
189
|
+
reason: "blocked",
|
|
190
|
+
policy: policy.name,
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
107
194
|
}
|
|
108
|
-
|
|
109
|
-
|
|
195
|
+
for (const plugin of this.interventionPlugins) {
|
|
196
|
+
const actResult = await Promise.resolve(plugin.act({ toolName, args }));
|
|
197
|
+
if (actResult === false) {
|
|
198
|
+
logger.warn({ toolName, plugin: plugin.name }, "Call rejected by intervention plugin");
|
|
199
|
+
this.sendBlockedResponse(request.id, {
|
|
200
|
+
toolName,
|
|
201
|
+
reason: "rejected",
|
|
202
|
+
plugin: plugin.name,
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
110
206
|
}
|
|
111
207
|
}
|
|
112
|
-
|
|
208
|
+
await this.transport.send(line);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
logger.debug({ err }, "Failed to parse line as JSON-RPC, forwarding as-is");
|
|
212
|
+
await this.transport.send(line);
|
|
213
|
+
}
|
|
113
214
|
}
|
|
114
215
|
}
|
|
115
216
|
//# sourceMappingURL=GuardioCore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuardioCore.js","sourceRoot":"","sources":["../../src/core/GuardioCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"GuardioCore.js","sourceRoot":"","sources":["../../src/core/GuardioCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardio error code ranges (JSON-RPC error.code):
|
|
3
|
+
* -32100 to -32199: Guardio Core Errors (gateway-level issues)
|
|
4
|
+
* -32200 to -32299: Guardio Policy Errors (policy enforcement)
|
|
5
|
+
* -32300 to -32399: Guardio Auth/RBAC Errors (authentication & authorization)
|
|
6
|
+
* -32400 to -32499: Guardio Validation Errors (input/parameter validation)
|
|
7
|
+
* -32500 to -32599: Guardio Rate Limiting & Quota Errors
|
|
8
|
+
* -32600 to -32699: Guardio Audit & Compliance Errors
|
|
9
|
+
* -32700 to -32799: Reserved for future Guardio features
|
|
10
|
+
*/
|
|
11
|
+
/** Guardio Core Errors (-32100 to -32199) */
|
|
12
|
+
export declare const GuardioCoreError: {
|
|
13
|
+
readonly GUARDIO_INTERNAL_ERROR: -32100;
|
|
14
|
+
readonly GUARDIO_CONFIGURATION_ERROR: -32101;
|
|
15
|
+
readonly GUARDIO_TIMEOUT: -32102;
|
|
16
|
+
readonly GUARDIO_CIRCUIT_BREAKER_OPEN: -32103;
|
|
17
|
+
readonly GUARDIO_UPSTREAM_UNAVAILABLE: -32104;
|
|
18
|
+
readonly GUARDIO_UNKNOWN_ERROR: -32110;
|
|
19
|
+
};
|
|
20
|
+
/** Guardio Policy Errors (-32200 to -32299) */
|
|
21
|
+
export declare const GuardioPolicyError: {
|
|
22
|
+
readonly POLICY_VIOLATION: -32200;
|
|
23
|
+
readonly POLICY_NOT_FOUND: -32201;
|
|
24
|
+
readonly POLICY_EVALUATION_FAILED: -32202;
|
|
25
|
+
readonly TOOL_BLOCKED: -32210;
|
|
26
|
+
readonly TOOL_NOT_FOUND: -32211;
|
|
27
|
+
readonly TOOL_DEPRECATED: -32212;
|
|
28
|
+
readonly TOOL_MAINTENANCE: -32213;
|
|
29
|
+
readonly PARAMETER_BLOCKED: -32220;
|
|
30
|
+
readonly PARAMETER_PATTERN_VIOLATION: -32221;
|
|
31
|
+
readonly PARAMETER_VALUE_RESTRICTED: -32222;
|
|
32
|
+
readonly SENSITIVE_DATA_DETECTED: -32223;
|
|
33
|
+
readonly CONTEXT_VIOLATION: -32230;
|
|
34
|
+
readonly TIME_WINDOW_VIOLATION: -32231;
|
|
35
|
+
readonly GEOGRAPHIC_RESTRICTION: -32232;
|
|
36
|
+
readonly ENVIRONMENT_MISMATCH: -32233;
|
|
37
|
+
readonly TOOL_COMBINATION_BLOCKED: -32240;
|
|
38
|
+
readonly PARAMETER_COMBINATION_BLOCKED: -32241;
|
|
39
|
+
};
|
|
40
|
+
/** Human-readable error type names for error.data.error.type */
|
|
41
|
+
export declare const GuardioErrorTypeName: Record<number, string>;
|
|
42
|
+
//# sourceMappingURL=GuardioErrorCodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuardioErrorCodes.d.ts","sourceRoot":"","sources":["../../src/core/GuardioErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;CA2BrB,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyBvD,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardio error code ranges (JSON-RPC error.code):
|
|
3
|
+
* -32100 to -32199: Guardio Core Errors (gateway-level issues)
|
|
4
|
+
* -32200 to -32299: Guardio Policy Errors (policy enforcement)
|
|
5
|
+
* -32300 to -32399: Guardio Auth/RBAC Errors (authentication & authorization)
|
|
6
|
+
* -32400 to -32499: Guardio Validation Errors (input/parameter validation)
|
|
7
|
+
* -32500 to -32599: Guardio Rate Limiting & Quota Errors
|
|
8
|
+
* -32600 to -32699: Guardio Audit & Compliance Errors
|
|
9
|
+
* -32700 to -32799: Reserved for future Guardio features
|
|
10
|
+
*/
|
|
11
|
+
/** Guardio Core Errors (-32100 to -32199) */
|
|
12
|
+
export const GuardioCoreError = {
|
|
13
|
+
GUARDIO_INTERNAL_ERROR: -32100,
|
|
14
|
+
GUARDIO_CONFIGURATION_ERROR: -32101,
|
|
15
|
+
GUARDIO_TIMEOUT: -32102,
|
|
16
|
+
GUARDIO_CIRCUIT_BREAKER_OPEN: -32103,
|
|
17
|
+
GUARDIO_UPSTREAM_UNAVAILABLE: -32104,
|
|
18
|
+
GUARDIO_UNKNOWN_ERROR: -32110,
|
|
19
|
+
};
|
|
20
|
+
/** Guardio Policy Errors (-32200 to -32299) */
|
|
21
|
+
export const GuardioPolicyError = {
|
|
22
|
+
// Generic policy errors
|
|
23
|
+
POLICY_VIOLATION: -32200,
|
|
24
|
+
POLICY_NOT_FOUND: -32201,
|
|
25
|
+
POLICY_EVALUATION_FAILED: -32202,
|
|
26
|
+
// Tool-level policies
|
|
27
|
+
TOOL_BLOCKED: -32210,
|
|
28
|
+
TOOL_NOT_FOUND: -32211,
|
|
29
|
+
TOOL_DEPRECATED: -32212,
|
|
30
|
+
TOOL_MAINTENANCE: -32213,
|
|
31
|
+
// Parameter-level policies
|
|
32
|
+
PARAMETER_BLOCKED: -32220,
|
|
33
|
+
PARAMETER_PATTERN_VIOLATION: -32221,
|
|
34
|
+
PARAMETER_VALUE_RESTRICTED: -32222,
|
|
35
|
+
SENSITIVE_DATA_DETECTED: -32223,
|
|
36
|
+
// Contextual policies
|
|
37
|
+
CONTEXT_VIOLATION: -32230,
|
|
38
|
+
TIME_WINDOW_VIOLATION: -32231,
|
|
39
|
+
GEOGRAPHIC_RESTRICTION: -32232,
|
|
40
|
+
ENVIRONMENT_MISMATCH: -32233,
|
|
41
|
+
// Combination policies
|
|
42
|
+
TOOL_COMBINATION_BLOCKED: -32240,
|
|
43
|
+
PARAMETER_COMBINATION_BLOCKED: -32241,
|
|
44
|
+
};
|
|
45
|
+
/** Human-readable error type names for error.data.error.type */
|
|
46
|
+
export const GuardioErrorTypeName = {
|
|
47
|
+
[GuardioCoreError.GUARDIO_INTERNAL_ERROR]: "GUARDIO_INTERNAL_ERROR",
|
|
48
|
+
[GuardioCoreError.GUARDIO_CONFIGURATION_ERROR]: "GUARDIO_CONFIGURATION_ERROR",
|
|
49
|
+
[GuardioCoreError.GUARDIO_TIMEOUT]: "GUARDIO_TIMEOUT",
|
|
50
|
+
[GuardioCoreError.GUARDIO_CIRCUIT_BREAKER_OPEN]: "GUARDIO_CIRCUIT_BREAKER_OPEN",
|
|
51
|
+
[GuardioCoreError.GUARDIO_UPSTREAM_UNAVAILABLE]: "GUARDIO_UPSTREAM_UNAVAILABLE",
|
|
52
|
+
[GuardioCoreError.GUARDIO_UNKNOWN_ERROR]: "GUARDIO_UNKNOWN_ERROR",
|
|
53
|
+
[GuardioPolicyError.POLICY_VIOLATION]: "POLICY_VIOLATION",
|
|
54
|
+
[GuardioPolicyError.POLICY_NOT_FOUND]: "POLICY_NOT_FOUND",
|
|
55
|
+
[GuardioPolicyError.POLICY_EVALUATION_FAILED]: "POLICY_EVALUATION_FAILED",
|
|
56
|
+
[GuardioPolicyError.TOOL_BLOCKED]: "TOOL_BLOCKED",
|
|
57
|
+
[GuardioPolicyError.TOOL_NOT_FOUND]: "TOOL_NOT_FOUND",
|
|
58
|
+
[GuardioPolicyError.TOOL_DEPRECATED]: "TOOL_DEPRECATED",
|
|
59
|
+
[GuardioPolicyError.TOOL_MAINTENANCE]: "TOOL_MAINTENANCE",
|
|
60
|
+
[GuardioPolicyError.PARAMETER_BLOCKED]: "PARAMETER_BLOCKED",
|
|
61
|
+
[GuardioPolicyError.PARAMETER_PATTERN_VIOLATION]: "PARAMETER_PATTERN_VIOLATION",
|
|
62
|
+
[GuardioPolicyError.PARAMETER_VALUE_RESTRICTED]: "PARAMETER_VALUE_RESTRICTED",
|
|
63
|
+
[GuardioPolicyError.SENSITIVE_DATA_DETECTED]: "SENSITIVE_DATA_DETECTED",
|
|
64
|
+
[GuardioPolicyError.CONTEXT_VIOLATION]: "CONTEXT_VIOLATION",
|
|
65
|
+
[GuardioPolicyError.TIME_WINDOW_VIOLATION]: "TIME_WINDOW_VIOLATION",
|
|
66
|
+
[GuardioPolicyError.GEOGRAPHIC_RESTRICTION]: "GEOGRAPHIC_RESTRICTION",
|
|
67
|
+
[GuardioPolicyError.ENVIRONMENT_MISMATCH]: "ENVIRONMENT_MISMATCH",
|
|
68
|
+
[GuardioPolicyError.TOOL_COMBINATION_BLOCKED]: "TOOL_COMBINATION_BLOCKED",
|
|
69
|
+
[GuardioPolicyError.PARAMETER_COMBINATION_BLOCKED]: "PARAMETER_COMBINATION_BLOCKED",
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=GuardioErrorCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuardioErrorCodes.js","sourceRoot":"","sources":["../../src/core/GuardioErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sBAAsB,EAAE,CAAC,KAAK;IAC9B,2BAA2B,EAAE,CAAC,KAAK;IACnC,eAAe,EAAE,CAAC,KAAK;IACvB,4BAA4B,EAAE,CAAC,KAAK;IACpC,4BAA4B,EAAE,CAAC,KAAK;IACpC,qBAAqB,EAAE,CAAC,KAAK;CACrB,CAAC;AAEX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,wBAAwB;IACxB,gBAAgB,EAAE,CAAC,KAAK;IACxB,gBAAgB,EAAE,CAAC,KAAK;IACxB,wBAAwB,EAAE,CAAC,KAAK;IAEhC,sBAAsB;IACtB,YAAY,EAAE,CAAC,KAAK;IACpB,cAAc,EAAE,CAAC,KAAK;IACtB,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IAExB,2BAA2B;IAC3B,iBAAiB,EAAE,CAAC,KAAK;IACzB,2BAA2B,EAAE,CAAC,KAAK;IACnC,0BAA0B,EAAE,CAAC,KAAK;IAClC,uBAAuB,EAAE,CAAC,KAAK;IAE/B,sBAAsB;IACtB,iBAAiB,EAAE,CAAC,KAAK;IACzB,qBAAqB,EAAE,CAAC,KAAK;IAC7B,sBAAsB,EAAE,CAAC,KAAK;IAC9B,oBAAoB,EAAE,CAAC,KAAK;IAE5B,uBAAuB;IACvB,wBAAwB,EAAE,CAAC,KAAK;IAChC,6BAA6B,EAAE,CAAC,KAAK;CAC7B,CAAC;AAEX,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,wBAAwB;IACnE,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,EAAE,6BAA6B;IAC7E,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,iBAAiB;IACrD,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,EAAE,8BAA8B;IAC/E,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,EAAE,8BAA8B;IAC/E,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,uBAAuB;IAEjE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACzD,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACzD,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,EAAE,0BAA0B;IACzE,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,cAAc;IACjD,CAAC,kBAAkB,CAAC,cAAc,CAAC,EAAE,gBAAgB;IACrD,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,iBAAiB;IACvD,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACzD,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,mBAAmB;IAC3D,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,EAAE,6BAA6B;IAC/E,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,EAAE,4BAA4B;IAC7E,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,EAAE,yBAAyB;IACvE,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,mBAAmB;IAC3D,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,EAAE,uBAAuB;IACnE,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,EAAE,wBAAwB;IACrE,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,EAAE,sBAAsB;IACjE,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,EAAE,0BAA0B;IACzE,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,EAAE,+BAA+B;CACpF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GuardioClientConfig } from "../../config/types.js";
|
|
2
|
+
import type { ClientTransport } from "./types.js";
|
|
3
|
+
export interface CreateClientTransportOptions {
|
|
4
|
+
/** For url server: handle POST /messages (run policy + fetch to remote, return status + body). */
|
|
5
|
+
handlePost?: (body: string) => Promise<{
|
|
6
|
+
status: number;
|
|
7
|
+
body: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a ClientTransport from config. Default is stdio when client is omitted.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createClientTransport(clientConfig?: GuardioClientConfig | null, options?: CreateClientTransportOptions): ClientTransport;
|
|
14
|
+
//# sourceMappingURL=create-client-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-client-transport.d.ts","sourceRoot":"","sources":["../../../src/core/transports/create-client-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,MAAM,WAAW,4BAA4B;IAC3C,kGAAkG;IAClG,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,CAAC,EAAE,mBAAmB,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,4BAA4B,GACrC,eAAe,CAUjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { StdioClientTransport } from "./stdio-client.js";
|
|
2
|
+
import { HttpClientTransport } from "./http-client.js";
|
|
3
|
+
import { logger } from "../../logger.js";
|
|
4
|
+
const DEFAULT_CLIENT = { mode: "http" };
|
|
5
|
+
/**
|
|
6
|
+
* Creates a ClientTransport from config. Default is stdio when client is omitted.
|
|
7
|
+
*/
|
|
8
|
+
export function createClientTransport(clientConfig, options) {
|
|
9
|
+
const client = clientConfig ?? DEFAULT_CLIENT;
|
|
10
|
+
if (client.mode === "http") {
|
|
11
|
+
const port = client.port ?? 8080;
|
|
12
|
+
const host = client.host;
|
|
13
|
+
logger.debug({ port, host }, "Creating HTTP client transport");
|
|
14
|
+
return new HttpClientTransport({ port, host, handlePost: options?.handlePost });
|
|
15
|
+
}
|
|
16
|
+
logger.debug("Creating stdio client transport");
|
|
17
|
+
return new StdioClientTransport();
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=create-client-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-client-transport.js","sourceRoot":"","sources":["../../../src/core/transports/create-client-transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,cAAc,GAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAS7D;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAyC,EACzC,OAAsC;IAEtC,MAAM,MAAM,GAAG,YAAY,IAAI,cAAc,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAC/D,OAAO,IAAI,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAChD,OAAO,IAAI,oBAAoB,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ClientTransport } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Client transport matching guardio-simple: GET /sse (SSE stream), POST /messages (forward to remote).
|
|
4
|
+
* GET /health for liveness/readiness. Supports multiple Cursor clients; broadcasts endpoint and messages to all.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpClientTransport implements ClientTransport {
|
|
7
|
+
private fastify;
|
|
8
|
+
private onMessageHandler;
|
|
9
|
+
private readonly port;
|
|
10
|
+
private readonly host;
|
|
11
|
+
private readonly activeClients;
|
|
12
|
+
private remoteReady;
|
|
13
|
+
private readonly handlePost?;
|
|
14
|
+
constructor(options: {
|
|
15
|
+
port: number;
|
|
16
|
+
host?: string;
|
|
17
|
+
handlePost?: (body: string) => Promise<{
|
|
18
|
+
status: number;
|
|
19
|
+
body: string;
|
|
20
|
+
}>;
|
|
21
|
+
});
|
|
22
|
+
setRemoteReady(): void;
|
|
23
|
+
private broadcast;
|
|
24
|
+
listen(onMessage: (line: string) => Promise<void>): void;
|
|
25
|
+
send(message: string): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/core/transports/http-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,gBAAgB,CAAkD;IAC1E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAEmB;gBAEnC,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD;IAMD,cAAc,IAAI,IAAI;IAKtB,OAAO,CAAC,SAAS;IAMjB,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IA6DxD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG5B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import { logger } from "../../logger.js";
|
|
3
|
+
const SSE_PATH = "/sse";
|
|
4
|
+
const MESSAGES_PATH = "/messages";
|
|
5
|
+
const HEALTH_PATH = "/health";
|
|
6
|
+
/**
|
|
7
|
+
* Client transport matching guardio-simple: GET /sse (SSE stream), POST /messages (forward to remote).
|
|
8
|
+
* GET /health for liveness/readiness. Supports multiple Cursor clients; broadcasts endpoint and messages to all.
|
|
9
|
+
*/
|
|
10
|
+
export class HttpClientTransport {
|
|
11
|
+
fastify = null;
|
|
12
|
+
onMessageHandler = null;
|
|
13
|
+
port;
|
|
14
|
+
host;
|
|
15
|
+
activeClients = new Set();
|
|
16
|
+
remoteReady = false;
|
|
17
|
+
handlePost;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.port = options.port;
|
|
20
|
+
this.host = options.host ?? "127.0.0.1";
|
|
21
|
+
this.handlePost = options.handlePost;
|
|
22
|
+
}
|
|
23
|
+
setRemoteReady() {
|
|
24
|
+
this.remoteReady = true;
|
|
25
|
+
this.broadcast("event: endpoint\ndata: /messages\n\n");
|
|
26
|
+
}
|
|
27
|
+
broadcast(data) {
|
|
28
|
+
for (const client of this.activeClients) {
|
|
29
|
+
if (!client.writableEnded)
|
|
30
|
+
client.write(data);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
listen(onMessage) {
|
|
34
|
+
this.onMessageHandler = onMessage;
|
|
35
|
+
const app = Fastify({ logger: false });
|
|
36
|
+
// Keep raw body for POST /messages so we can forward the exact JSON-RPC string
|
|
37
|
+
app.addContentTypeParser("application/json", { parseAs: "string" }, (_req, body, done) => done(null, body));
|
|
38
|
+
app.get(HEALTH_PATH, async (_request, reply) => {
|
|
39
|
+
return reply.status(200).send({ status: "ok" });
|
|
40
|
+
});
|
|
41
|
+
app.get(SSE_PATH, async (request, reply) => {
|
|
42
|
+
reply.hijack();
|
|
43
|
+
const res = reply.raw;
|
|
44
|
+
res.writeHead(200, {
|
|
45
|
+
"Content-Type": "text/event-stream",
|
|
46
|
+
"Cache-Control": "no-cache",
|
|
47
|
+
Connection: "keep-alive",
|
|
48
|
+
});
|
|
49
|
+
this.activeClients.add(res);
|
|
50
|
+
logger.debug({ activeClients: this.activeClients.size }, "SSE client connected");
|
|
51
|
+
if (this.remoteReady) {
|
|
52
|
+
res.write("event: endpoint\ndata: /messages\n\n");
|
|
53
|
+
}
|
|
54
|
+
request.raw.on("close", () => {
|
|
55
|
+
this.activeClients.delete(res);
|
|
56
|
+
logger.debug({ activeClients: this.activeClients.size }, "SSE client disconnected");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
app.post(MESSAGES_PATH, async (request, reply) => {
|
|
60
|
+
const body = typeof request.body === "string" ? request.body : "";
|
|
61
|
+
if (this.handlePost) {
|
|
62
|
+
try {
|
|
63
|
+
const result = await this.handlePost(body);
|
|
64
|
+
return reply.status(result.status).type("application/json").send(result.body);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
logger.error({ err }, "POST /messages failed");
|
|
68
|
+
return reply.status(500).type("text/plain").send("Proxy Error");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return reply.status(503).type("text/plain").send("Remote MCP not ready");
|
|
72
|
+
});
|
|
73
|
+
this.fastify = app;
|
|
74
|
+
app.listen({ port: this.port, host: this.host }, (err) => {
|
|
75
|
+
if (err) {
|
|
76
|
+
logger.error({ err }, "HTTP server listen failed");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
logger.info({ url: `http://${this.host}:${this.port}`, ssePath: SSE_PATH, healthPath: HEALTH_PATH }, "Proxy running; add SSE URL to Cursor");
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
send(message) {
|
|
83
|
+
this.broadcast(`data: ${message}\n\n`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/core/transports/http-client.ts"],"names":[],"mappings":"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"}
|