@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.
Files changed (80) hide show
  1. package/bin/guardio.mjs +3 -0
  2. package/dist/cli.js +44 -57
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/PluginManager.d.ts +4 -0
  5. package/dist/config/PluginManager.d.ts.map +1 -1
  6. package/dist/config/PluginManager.js +17 -1
  7. package/dist/config/PluginManager.js.map +1 -1
  8. package/dist/config/index.d.ts +2 -2
  9. package/dist/config/index.d.ts.map +1 -1
  10. package/dist/config/index.js +1 -1
  11. package/dist/config/index.js.map +1 -1
  12. package/dist/config/types.d.ts +27 -7
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/core/GuardioActions.d.ts +12 -0
  15. package/dist/core/GuardioActions.d.ts.map +1 -0
  16. package/dist/core/GuardioActions.js +12 -0
  17. package/dist/core/GuardioActions.js.map +1 -0
  18. package/dist/core/GuardioCore.d.ts +22 -9
  19. package/dist/core/GuardioCore.d.ts.map +1 -1
  20. package/dist/core/GuardioCore.js +175 -74
  21. package/dist/core/GuardioCore.js.map +1 -1
  22. package/dist/core/GuardioErrorCodes.d.ts +42 -0
  23. package/dist/core/GuardioErrorCodes.d.ts.map +1 -0
  24. package/dist/core/GuardioErrorCodes.js +71 -0
  25. package/dist/core/GuardioErrorCodes.js.map +1 -0
  26. package/dist/core/transports/create-client-transport.d.ts +14 -0
  27. package/dist/core/transports/create-client-transport.d.ts.map +1 -0
  28. package/dist/core/transports/create-client-transport.js +19 -0
  29. package/dist/core/transports/create-client-transport.js.map +1 -0
  30. package/dist/core/transports/http-client.d.ts +27 -0
  31. package/dist/core/transports/http-client.d.ts.map +1 -0
  32. package/dist/core/transports/http-client.js +86 -0
  33. package/dist/core/transports/http-client.js.map +1 -0
  34. package/dist/core/transports/index.d.ts +13 -0
  35. package/dist/core/transports/index.d.ts.map +1 -0
  36. package/dist/core/transports/index.js +11 -0
  37. package/dist/core/transports/index.js.map +1 -0
  38. package/dist/core/transports/sse-url-transport.d.ts +26 -0
  39. package/dist/core/transports/sse-url-transport.d.ts.map +1 -0
  40. package/dist/core/transports/sse-url-transport.js +111 -0
  41. package/dist/core/transports/sse-url-transport.js.map +1 -0
  42. package/dist/core/transports/stdio-client.d.ts +12 -0
  43. package/dist/core/transports/stdio-client.d.ts.map +1 -0
  44. package/dist/core/transports/stdio-client.js +25 -0
  45. package/dist/core/transports/stdio-client.js.map +1 -0
  46. package/dist/core/transports/types.d.ts +21 -0
  47. package/dist/core/transports/types.d.ts.map +1 -0
  48. package/dist/core/transports/types.js +2 -0
  49. package/dist/core/transports/types.js.map +1 -0
  50. package/dist/core/types.d.ts +40 -4
  51. package/dist/core/types.d.ts.map +1 -1
  52. package/dist/core/types.js +11 -1
  53. package/dist/core/types.js.map +1 -1
  54. package/dist/index.d.ts +6 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +4 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/logger.d.ts +4 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +16 -0
  61. package/dist/logger.js.map +1 -0
  62. package/dist/plugins/intervention/HttpInterventionPlugin.d.ts.map +1 -1
  63. package/dist/plugins/intervention/HttpInterventionPlugin.js +4 -7
  64. package/dist/plugins/intervention/HttpInterventionPlugin.js.map +1 -1
  65. package/dist/plugins/notification/DefaultNotificationPlugin.d.ts +1 -1
  66. package/dist/plugins/notification/DefaultNotificationPlugin.d.ts.map +1 -1
  67. package/dist/plugins/notification/DefaultNotificationPlugin.js +3 -2
  68. package/dist/plugins/notification/DefaultNotificationPlugin.js.map +1 -1
  69. package/dist/plugins/policy/DefaultPolicyPlugin.d.ts.map +1 -1
  70. package/dist/plugins/policy/DefaultPolicyPlugin.js +4 -1
  71. package/dist/plugins/policy/DefaultPolicyPlugin.js.map +1 -1
  72. package/dist/plugins/policy/RegexPolicyPlugin.d.ts.map +1 -1
  73. package/dist/plugins/policy/RegexPolicyPlugin.js +2 -1
  74. package/dist/plugins/policy/RegexPolicyPlugin.js.map +1 -1
  75. package/dist/server/index.d.ts +20 -0
  76. package/dist/server/index.d.ts.map +1 -0
  77. package/dist/server/index.js +27 -0
  78. package/dist/server/index.js.map +1 -0
  79. package/package.json +4 -3
  80. package/README.md +0 -224
@@ -1,115 +1,216 @@
1
- import { spawn } from "node:child_process";
2
- import * as readline from "node:readline";
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
- child = null;
9
- appInterface = null;
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
- if (this.policyPlugins.length === 0) {
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
- this.child = spawn(this.config.command, this.config.args, {
25
- stdio: ["pipe", "pipe", "inherit"],
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.appInterface = readline.createInterface({
28
- input: process.stdin,
29
- terminal: false,
32
+ this.transport.setResponseHandler((line) => {
33
+ this.sendToClient(line);
30
34
  });
31
- this.toolInterface = readline.createInterface({
32
- input: this.child.stdout,
33
- terminal: false,
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
- sendErrorResponse(id, message) {
39
- process.stdout.write(JSON.stringify({
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
- error: { code: -32000, message },
43
- }) + "\n");
85
+ result,
86
+ });
44
87
  }
45
- async processAppLine(line) {
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(line);
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
- const context = { toolName, args };
108
+ logger.debug({ toolName, requestId: request.id, args }, "Evaluating tools/call (HTTP)");
52
109
  for (const policy of this.policyPlugins) {
53
- const result = policy.evaluate(context);
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
- console.error(`[SECURITY] Blocked attempt to call: ${toolName} (policy: ${policy.name})`);
56
- this.sendErrorResponse(request.id, "Security Layer: Call Rejected");
57
- this.drainAppQueue();
58
- return;
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
- if (this.interventionPlugins.length > 0) {
62
- const interventionContext = { toolName, args };
63
- for (const plugin of this.interventionPlugins) {
64
- const actResult = await Promise.resolve(plugin.act(interventionContext));
65
- if (actResult === false) {
66
- this.sendErrorResponse(request.id, `Call to ${toolName} was rejected by intervention plugin ${plugin.name}`);
67
- this.drainAppQueue();
68
- return;
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
- this.child.stdin?.write(line + "\n");
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
- this.child.stdin?.write(line + "\n");
162
+ catch (err) {
163
+ logger.error({ err }, "Forward POST failed");
164
+ return { status: 500, body: "Proxy Error" };
80
165
  }
81
166
  }
82
- drainAppQueue() {
83
- this.pendingResponseId = null;
84
- while (this.appQueue.length > 0) {
85
- const line = this.appQueue.shift();
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
- attachAppHandler() {
91
- this.appInterface.on("line", async (line) => {
92
- if (this.pendingResponseId !== null) {
93
- this.appQueue.push(line);
94
- return;
95
- }
96
- await this.processAppLine(line);
97
- });
98
- }
99
- attachToolHandler() {
100
- this.toolInterface.on("line", (line) => {
101
- process.stdout.write(line + "\n");
102
- if (this.pendingResponseId !== null) {
103
- try {
104
- const response = JSON.parse(line);
105
- if (response.id === this.pendingResponseId)
106
- this.drainAppQueue();
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
- catch {
109
- // not JSON or no id keep waiting
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":"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"}
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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"}