@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
@@ -0,0 +1,13 @@
1
+ import type { GuardioServerConfigUrl } from "../../config/types.js";
2
+ import type { McpTransport } from "./types.js";
3
+ export type { ClientTransport, McpTransport } from "./types.js";
4
+ export { StdioClientTransport } from "./stdio-client.js";
5
+ export { HttpClientTransport } from "./http-client.js";
6
+ export { createClientTransport, type CreateClientTransportOptions, } from "./create-client-transport.js";
7
+ export interface CreateTransportOptions {
8
+ /** Called when remote sends "endpoint" event; used to tell client transport to send endpoint to Cursor. */
9
+ onEndpoint?: () => void;
10
+ }
11
+ /** Creates the only supported server transport: HTTP/SSE (url). */
12
+ export declare function createTransport(serverConfig: GuardioServerConfigUrl, options?: CreateTransportOptions): McpTransport;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/transports/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,sBAAsB;IACrC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAC7B,YAAY,EAAE,sBAAsB,EACpC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,YAAY,CAId"}
@@ -0,0 +1,11 @@
1
+ import { SseUrlTransport } from "./sse-url-transport.js";
2
+ export { StdioClientTransport } from "./stdio-client.js";
3
+ export { HttpClientTransport } from "./http-client.js";
4
+ export { createClientTransport, } from "./create-client-transport.js";
5
+ /** Creates the only supported server transport: HTTP/SSE (url). */
6
+ export function createTransport(serverConfig, options) {
7
+ return new SseUrlTransport(serverConfig, {
8
+ onEndpoint: options?.onEndpoint,
9
+ });
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/transports/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,qBAAqB,GAEtB,MAAM,8BAA8B,CAAC;AAOtC,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAC7B,YAAoC,EACpC,OAAgC;IAEhC,OAAO,IAAI,eAAe,CAAC,YAAY,EAAE;QACvC,UAAU,EAAE,OAAO,EAAE,UAAU;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { McpTransport } from "./types.js";
2
+ import type { GuardioServerConfigUrl } from "../../config/types.js";
3
+ /**
4
+ * Transport for remote MCP over legacy HTTP+SSE: connect to remote /sse in background,
5
+ * on "endpoint" store POST URL and notify; on "message" forward to response handler.
6
+ * Does not block start(); retries on connection error like guardio-simple.
7
+ */
8
+ export declare class SseUrlTransport implements McpTransport {
9
+ private readonly config;
10
+ private responseHandler;
11
+ private remotePostUrl;
12
+ private remoteEs;
13
+ private readonly onEndpoint;
14
+ private readonly url;
15
+ constructor(config: GuardioServerConfigUrl, options?: {
16
+ onEndpoint?: () => void;
17
+ });
18
+ setResponseHandler(handler: (line: string) => void): void;
19
+ /** Used by GuardioCore when handling POST /messages to forward to remote. */
20
+ getRemotePostUrl(): string | null;
21
+ start(): Promise<void>;
22
+ private connectToRemote;
23
+ /** Used when client is stdio: POST to remote; response usually comes via SSE (onmessage), or inline in POST body. */
24
+ send(line: string): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=sse-url-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-url-transport.d.ts","sourceRoot":"","sources":["../../../src/core/transports/sse-url-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAepE;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE;IAOvC,kBAAkB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIzD,6EAA6E;IAC7E,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAI3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,eAAe;IAwBvB,qHAAqH;IAC/G,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoDxC"}
@@ -0,0 +1,111 @@
1
+ import { EventSource } from "eventsource";
2
+ import { logger } from "../../logger.js";
3
+ const RETRY_MS = 3000;
4
+ const DEFAULT_TIMEOUT_MS = 30_000;
5
+ /**
6
+ * SSE URL: if config.url already ends with /sse, use it; else append /sse.
7
+ */
8
+ function sseUrl(config) {
9
+ const url = config.url.trim();
10
+ if (url.endsWith("/sse"))
11
+ return url;
12
+ return url.replace(/\/?$/, "/") + "sse";
13
+ }
14
+ /**
15
+ * Transport for remote MCP over legacy HTTP+SSE: connect to remote /sse in background,
16
+ * on "endpoint" store POST URL and notify; on "message" forward to response handler.
17
+ * Does not block start(); retries on connection error like guardio-simple.
18
+ */
19
+ export class SseUrlTransport {
20
+ config;
21
+ responseHandler = null;
22
+ remotePostUrl = null;
23
+ remoteEs = null;
24
+ onEndpoint;
25
+ url;
26
+ constructor(config, options) {
27
+ this.config = config;
28
+ this.onEndpoint = options?.onEndpoint;
29
+ this.url = sseUrl(config);
30
+ }
31
+ setResponseHandler(handler) {
32
+ this.responseHandler = handler;
33
+ }
34
+ /** Used by GuardioCore when handling POST /messages to forward to remote. */
35
+ getRemotePostUrl() {
36
+ return this.remotePostUrl;
37
+ }
38
+ async start() {
39
+ this.connectToRemote();
40
+ }
41
+ connectToRemote() {
42
+ logger.info({ url: this.url }, "Connecting to remote MCP");
43
+ this.remoteEs = new EventSource(this.url);
44
+ this.remoteEs.addEventListener("endpoint", (event) => {
45
+ const data = typeof event.data === "string" ? event.data : String(event.data);
46
+ this.remotePostUrl = new URL(data, this.url).href;
47
+ logger.info({ remotePostUrl: this.remotePostUrl }, "Remote endpoint discovered");
48
+ this.onEndpoint?.();
49
+ });
50
+ this.remoteEs.onmessage = (event) => {
51
+ const data = typeof event.data === "string" ? event.data : String(event.data);
52
+ if (this.responseHandler)
53
+ this.responseHandler(data);
54
+ };
55
+ this.remoteEs.onerror = () => {
56
+ logger.warn({ retryMs: RETRY_MS }, "Remote connection lost, retrying");
57
+ setTimeout(() => this.connectToRemote(), RETRY_MS);
58
+ };
59
+ }
60
+ /** Used when client is stdio: POST to remote; response usually comes via SSE (onmessage), or inline in POST body. */
61
+ async send(line) {
62
+ const endpoint = this.remotePostUrl;
63
+ if (!endpoint) {
64
+ logger.debug("Send called before endpoint discovered, returning error to client");
65
+ if (this.responseHandler) {
66
+ this.responseHandler(JSON.stringify({
67
+ jsonrpc: "2.0",
68
+ id: null,
69
+ error: {
70
+ code: -32603,
71
+ message: "Remote endpoint not yet discovered (no endpoint event)",
72
+ },
73
+ }));
74
+ }
75
+ return;
76
+ }
77
+ const timeoutMs = this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
78
+ const headers = {
79
+ "Content-Type": "application/json",
80
+ ...this.config.headers,
81
+ };
82
+ const controller = new AbortController();
83
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
84
+ try {
85
+ const res = await fetch(endpoint, {
86
+ method: "POST",
87
+ headers,
88
+ body: line,
89
+ signal: controller.signal,
90
+ });
91
+ clearTimeout(timeoutId);
92
+ const text = await res.text();
93
+ if (res.ok && text && this.responseHandler) {
94
+ this.responseHandler(text);
95
+ }
96
+ }
97
+ catch (err) {
98
+ clearTimeout(timeoutId);
99
+ const message = err instanceof Error ? err.message : String(err);
100
+ logger.warn({ err, message }, "Transport send failed");
101
+ if (this.responseHandler) {
102
+ this.responseHandler(JSON.stringify({
103
+ jsonrpc: "2.0",
104
+ id: null,
105
+ error: { code: -32603, message: `Transport error: ${message}` },
106
+ }));
107
+ }
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=sse-url-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-url-transport.js","sourceRoot":"","sources":["../../../src/core/transports/sse-url-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ClientTransport } from "./types.js";
2
+ /**
3
+ * Client transport over stdio: reads newline-delimited lines from stdin,
4
+ * sends response lines to stdout.
5
+ */
6
+ export declare class StdioClientTransport implements ClientTransport {
7
+ private rl;
8
+ private onMessageHandler;
9
+ listen(onMessage: (line: string) => Promise<void>): void;
10
+ send(message: string): void;
11
+ }
12
+ //# sourceMappingURL=stdio-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-client.d.ts","sourceRoot":"","sources":["../../../src/core/transports/stdio-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAaxD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG5B"}
@@ -0,0 +1,25 @@
1
+ import * as readline from "node:readline";
2
+ /**
3
+ * Client transport over stdio: reads newline-delimited lines from stdin,
4
+ * sends response lines to stdout.
5
+ */
6
+ export class StdioClientTransport {
7
+ rl = null;
8
+ onMessageHandler = null;
9
+ listen(onMessage) {
10
+ this.onMessageHandler = onMessage;
11
+ this.rl = readline.createInterface({
12
+ input: process.stdin,
13
+ terminal: false,
14
+ });
15
+ this.rl.on("line", (line) => {
16
+ if (this.onMessageHandler) {
17
+ void this.onMessageHandler(line);
18
+ }
19
+ });
20
+ }
21
+ send(message) {
22
+ process.stdout.write(message + "\n");
23
+ }
24
+ }
25
+ //# sourceMappingURL=stdio-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-client.js","sourceRoot":"","sources":["../../../src/core/transports/stdio-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,EAAE,GAA8B,IAAI,CAAC;IACrC,gBAAgB,GAA6C,IAAI,CAAC;IAE1E,MAAM,CAAC,SAA0C;QAC/C,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Transport to the real MCP server. Abstracts stdio (subprocess) vs HTTP.
3
+ */
4
+ export interface McpTransport {
5
+ /** Send a JSON-RPC message (newline-delimited) to the server. Resolves when the message is sent (stdio) or when the response has been delivered to the response handler (HTTP). */
6
+ send(line: string): Promise<void>;
7
+ /** Register handler for responses from the server. Called for each response line. */
8
+ setResponseHandler(handler: (line: string) => void): void;
9
+ /** Start the transport (e.g. spawn process, ensure client is ready). Must be called before send. */
10
+ start(): Promise<void>;
11
+ }
12
+ /**
13
+ * Transport for incoming requests from the AI Agent (client). Abstracts stdio vs HTTP server.
14
+ */
15
+ export interface ClientTransport {
16
+ /** Starts listening for messages (stdin or HTTP server). Calls onMessage for each received line. */
17
+ listen(onMessage: (line: string) => Promise<void>): void;
18
+ /** Sends a response line back to the AI Agent. */
19
+ send(message: string): void;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/transports/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mLAAmL;IACnL,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,qFAAqF;IACrF,kBAAkB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,oGAAoG;IACpG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oGAAoG;IACpG,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD,kDAAkD;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/transports/types.ts"],"names":[],"mappings":""}
@@ -7,6 +7,29 @@ export interface JsonRpcRequest {
7
7
  arguments?: unknown;
8
8
  };
9
9
  }
10
+ /**
11
+ * Successful JSON-RPC result returned when Guardio blocks or rejects a tool call.
12
+ * Returned as result (not error) so AI Agent frameworks don't treat it as a fatal error.
13
+ */
14
+ export interface GuardioBlockedResult {
15
+ /** MCP-style content for the agent to display. */
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ /** Indicates this is a blocked/rejected outcome, not a normal tool result. */
21
+ isError: true;
22
+ /** Guardio metadata; prefixed to avoid clashing with MCP result fields. */
23
+ _guardio: {
24
+ version: string;
25
+ requestId: string | number;
26
+ timestamp: string;
27
+ /** Policy or intervention plugin name that blocked/rejected. */
28
+ policyId: string;
29
+ /** Action type e.g. TOOL_BLOCKED, POLICY_VIOLATION. */
30
+ action: string;
31
+ };
32
+ }
10
33
  export interface JsonRpcResponse {
11
34
  jsonrpc?: string;
12
35
  id?: string | number;
@@ -14,16 +37,29 @@ export interface JsonRpcResponse {
14
37
  error?: {
15
38
  code: number;
16
39
  message: string;
40
+ data?: unknown;
17
41
  };
18
42
  }
43
+ import type { GuardioServerConfigUrl, GuardioClientConfig } from "../config/types.js";
19
44
  export interface GuardioCoreConfig {
20
- /** Command to run the real MCP server (e.g. "node") */
21
- command: string;
22
- /** Arguments for the command (e.g. ["/path/to/server.js"]) */
23
- args: string[];
45
+ /** MCP server to proxy to (HTTP/SSE URL only). */
46
+ server: GuardioServerConfigUrl;
47
+ /** How the AI client connects to Guardio. Default: { mode: "stdio" }. */
48
+ client?: GuardioClientConfig;
24
49
  /** Cwd for resolving guardio.config (default: process.cwd()) */
25
50
  cwd?: string;
26
51
  /** Explicit path to guardio config file (optional) */
27
52
  configPath?: string;
28
53
  }
54
+ /**
55
+ * Action names for result._guardio.action when Guardio blocks or rejects a tool call.
56
+ * We return a successful JSON-RPC result (not an error), so numeric error codes are not used.
57
+ * These strings identify the kind of denial for the AI Agent / client.
58
+ */
59
+ export declare const GuardioAction: {
60
+ /** Tool was blocked by a policy plugin. */
61
+ readonly TOOL_BLOCKED: "TOOL_BLOCKED";
62
+ /** Tool call was rejected by an intervention plugin. */
63
+ readonly POLICY_VIOLATION: "POLICY_VIOLATION";
64
+ };
29
65
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,8EAA8E;IAC9E,OAAO,EAAE,IAAI,CAAC;IACd,2EAA2E;IAC3E,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,gEAAgE;QAChE,QAAQ,EAAE,MAAM,CAAC;QACjB,uDAAuD;QACvD,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,yEAAyE;IACzE,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;IACxB,2CAA2C;;IAE3C,wDAAwD;;CAEhD,CAAC"}
@@ -1,2 +1,12 @@
1
- export {};
1
+ /**
2
+ * Action names for result._guardio.action when Guardio blocks or rejects a tool call.
3
+ * We return a successful JSON-RPC result (not an error), so numeric error codes are not used.
4
+ * These strings identify the kind of denial for the AI Agent / client.
5
+ */
6
+ export const GuardioAction = {
7
+ /** Tool was blocked by a policy plugin. */
8
+ TOOL_BLOCKED: "TOOL_BLOCKED",
9
+ /** Tool call was rejected by an intervention plugin. */
10
+ POLICY_VIOLATION: "POLICY_VIOLATION",
11
+ };
2
12
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAmDA;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,2CAA2C;IAC3C,YAAY,EAAE,cAAc;IAC5B,wDAAwD;IACxD,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
+ export { logger } from "./logger.js";
2
+ export type { Logger } from "./logger.js";
1
3
  export { GuardioCore } from "./core/index.js";
2
4
  export type { GuardioCoreConfig, JsonRpcRequest, JsonRpcResponse, } from "./core/index.js";
3
- export { PluginManager, loadConfigFromPath } from "./config/index.js";
4
- export type { PolicyPluginFactory, InterventionPluginFactory, GuardioConfig, GuardioServerConfig, PolicyPluginConfigEntry, InterventionPluginConfigEntry, PluginConfigEntry, } from "./config/index.js";
5
+ export { GuardioHttpServer } from "./server/index.js";
6
+ export type { GuardioHttpServerConfig } from "./server/index.js";
7
+ export { PluginManager, loadConfigFromPath, getConfigPath, } from "./config/index.js";
8
+ export type { PolicyPluginFactory, InterventionPluginFactory, GuardioConfig, GuardioServerConfig, GuardioServerConfigUrl, GuardioClientConfig, PolicyPluginConfigEntry, InterventionPluginConfigEntry, PluginConfigEntry, } from "./config/index.js";
5
9
  export type { PolicyPluginInterface, NotificationPluginInterface, InterventionPluginInterface, InterventionResult, PolicyRequestContext, PolicyResult, InterventionRequestContext, } from "./interfaces/index.js";
6
10
  export { DefaultPolicyPlugin, RegexPolicyPlugin, type DefaultPolicyPluginConfig, type RegexPolicyPluginConfig, type RegexPolicyRule, type RegexPolicyRuleResult, } from "./plugins/policy/index.js";
7
11
  export { DefaultNotificationPlugin } from "./plugins/notification/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,4BAA4B,GAClC,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,4BAA4B,GAClC,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
- // Programmatic API: core, interfaces, config, and default plugins
1
+ // Programmatic API: core, interfaces, config, server, and default plugins
2
+ export { logger } from "./logger.js";
2
3
  export { GuardioCore } from "./core/index.js";
3
- export { PluginManager, loadConfigFromPath } from "./config/index.js";
4
+ export { GuardioHttpServer } from "./server/index.js";
5
+ export { PluginManager, loadConfigFromPath, getConfigPath, } from "./config/index.js";
4
6
  export { DefaultPolicyPlugin, RegexPolicyPlugin, } from "./plugins/policy/index.js";
5
7
  export { DefaultNotificationPlugin } from "./plugins/notification/index.js";
6
8
  export { DefaultInterventionPlugin, HttpInterventionPlugin, } from "./plugins/intervention/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAmBtE,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAKlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAqB3B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAKlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import pino from "pino";
2
+ export declare const logger: pino.Logger<never, boolean>;
3
+ export type Logger = pino.Logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB,eAAO,MAAM,MAAM,6BAMlB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,16 @@
1
+ import pino from "pino";
2
+ import pinoPretty from "pino-pretty";
3
+ const level = process.env.LOG_LEVEL ||
4
+ (process.env.NODE_ENV === "development" ? "debug" : "info");
5
+ const usePretty = process.env.LOG_PRETTY === "1" || process.env.NODE_ENV === "development";
6
+ const prettyStream = usePretty
7
+ ? pinoPretty({
8
+ colorize: true,
9
+ translateTime: "SYS:standard",
10
+ })
11
+ : undefined;
12
+ export const logger = pino({
13
+ level,
14
+ base: { name: "guardio" },
15
+ }, prettyStream ?? process.stdout);
16
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,KAAK,GACR,OAAO,CAAC,GAAG,CAAC,SAAwB;IACrC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAE3E,MAAM,YAAY,GAAG,SAAS;IAC5B,CAAC,CAAC,UAAU,CAAC;QACT,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,cAAc;KAC9B,CAAC;IACJ,CAAC,CAAC,SAAS,CAAC;AAEd,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CACxB;IACE,KAAK;IACL,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CAC1B,EACD,YAAY,IAAI,OAAO,CAAC,MAAM,CAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HttpInterventionPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/intervention/HttpInterventionPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AACnG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAKxF,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,2BAA2B;IACxE,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAMhD,OAAO,CAAC,YAAY;IAsDpB,GAAG,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;CA+B3D"}
1
+ {"version":3,"file":"HttpInterventionPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/intervention/HttpInterventionPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AACnG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAMxF,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,2BAA2B;IACxE,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAMhD,OAAO,CAAC,YAAY;IAoDpB,GAAG,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;CA8B3D"}
@@ -1,5 +1,6 @@
1
1
  import { createServer } from "node:http";
2
2
  import { exec } from "node:child_process";
3
+ import { logger } from "../../logger.js";
3
4
  const DEFAULT_PORT = 3939;
4
5
  const DEFAULT_TIMEOUT_MS = 120_000;
5
6
  /**
@@ -66,7 +67,7 @@ export class HttpInterventionPlugin {
66
67
  }
67
68
  });
68
69
  this.server.listen(this.port, () => {
69
- console.error(`🔐 Guardio approval server running on http://localhost:${this.port}`);
70
+ logger.info({ port: this.port }, "Guardio approval server running");
70
71
  });
71
72
  }
72
73
  act(context) {
@@ -74,11 +75,7 @@ export class HttpInterventionPlugin {
74
75
  return new Promise((resolve) => {
75
76
  const id = `approval-${++this.approvalCounter}`;
76
77
  this.pendingApprovals.set(id, resolve);
77
- console.error("\n" + "=".repeat(60));
78
- console.error(`🔔 AI wants to call: ${context.toolName}`);
79
- console.error(`Arguments: ${JSON.stringify(context.args, null, 2)}`);
80
- console.error(`Approve at: http://localhost:${this.port}`);
81
- console.error("=".repeat(60));
78
+ logger.info({ toolName: context.toolName, args: context.args, approvalUrl: `http://localhost:${this.port}`, approvalId: id }, "Intervention: awaiting user approval for tool call");
82
79
  const url = `http://localhost:${this.port}`;
83
80
  const cmd = process.platform === "darwin"
84
81
  ? "open"
@@ -89,7 +86,7 @@ export class HttpInterventionPlugin {
89
86
  setTimeout(() => {
90
87
  if (this.pendingApprovals.has(id)) {
91
88
  this.pendingApprovals.delete(id);
92
- console.error("\n⏱️ Approval timed out - rejecting call");
89
+ logger.warn({ approvalId: id, toolName: context.toolName, timeoutMs: this.timeoutMs }, "Approval timed out, rejecting call");
93
90
  resolve(false);
94
91
  }
95
92
  }, this.timeoutMs);
@@ -1 +1 @@
1
- {"version":3,"file":"HttpInterventionPlugin.js","sourceRoot":"","sources":["../../../src/plugins/intervention/HttpInterventionPlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HttpInterventionPlugin.js","sourceRoot":"","sources":["../../../src/plugins/intervention/HttpInterventionPlugin.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@ import type { NotificationPluginInterface } from "../../interfaces/NotificationP
3
3
  * Default notification plugin: no-op. Replace with logging, metrics, or alerts.
4
4
  */
5
5
  export declare class DefaultNotificationPlugin implements NotificationPluginInterface {
6
- notify(_toolName: string, _args: unknown): void;
6
+ notify(toolName: string, args: unknown): void;
7
7
  }
8
8
  //# sourceMappingURL=DefaultNotificationPlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultNotificationPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/notification/DefaultNotificationPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAEnG;;GAEG;AACH,qBAAa,yBAA0B,YAAW,2BAA2B;IAC3E,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAGhD"}
1
+ {"version":3,"file":"DefaultNotificationPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/notification/DefaultNotificationPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAGnG;;GAEG;AACH,qBAAa,yBAA0B,YAAW,2BAA2B;IAC3E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;CAG9C"}
@@ -1,9 +1,10 @@
1
+ import { logger } from "../../logger.js";
1
2
  /**
2
3
  * Default notification plugin: no-op. Replace with logging, metrics, or alerts.
3
4
  */
4
5
  export class DefaultNotificationPlugin {
5
- notify(_toolName, _args) {
6
- // Empty for now
6
+ notify(toolName, args) {
7
+ logger.debug({ toolName, args }, "Notification (default no-op)");
7
8
  }
8
9
  }
9
10
  //# sourceMappingURL=DefaultNotificationPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultNotificationPlugin.js","sourceRoot":"","sources":["../../../src/plugins/notification/DefaultNotificationPlugin.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC,MAAM,CAAC,SAAiB,EAAE,KAAc;QACtC,gBAAgB;IAClB,CAAC;CACF"}
1
+ {"version":3,"file":"DefaultNotificationPlugin.js","sourceRoot":"","sources":["../../../src/plugins/notification/DefaultNotificationPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC,MAAM,CAAC,QAAgB,EAAE,IAAa;QACpC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,8BAA8B,CAAC,CAAC;IACnE,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,yBAAyB;IACxC,qFAAqF;IACrF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,qBAAqB;IAC/D,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;gBAE/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAY3C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAItD"}
1
+ {"version":3,"file":"DefaultPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,yBAAyB;IACxC,qFAAqF;IACrF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,qBAAqB;IAC/D,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;gBAE/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAY3C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAOtD"}
@@ -1,3 +1,4 @@
1
+ import { logger } from "../../logger.js";
1
2
  /**
2
3
  * Default policy plugin: block calls by tool name.
3
4
  * Config is required: { blockedTools: ["tool_a", "tool_b"] }. No default block list.
@@ -13,8 +14,10 @@ export class DefaultPolicyPlugin {
13
14
  this.blockedTools = new Set(blockedTools.filter((t) => typeof t === "string"));
14
15
  }
15
16
  evaluate(context) {
16
- if (this.blockedTools.has(context.toolName))
17
+ if (this.blockedTools.has(context.toolName)) {
18
+ logger.debug({ toolName: context.toolName, plugin: this.name }, "Tool blocked by default policy");
17
19
  return "blocked";
20
+ }
18
21
  return "allowed";
19
22
  }
20
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,SAAS,CAAC;IAET,YAAY,CAAc;IAE3C,YAAY,MAA+B;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,MAA8C,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CACzB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAA6B;QACpC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"DefaultPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/DefaultPolicyPlugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAOzC;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,SAAS,CAAC;IAET,YAAY,CAAc;IAE3C,YAAY,MAA+B;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,MAA8C,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CACzB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAA6B;QACpC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAC;YAClG,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"RegexPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAsBD;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,qBAAqB;IAC7D,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMnB;gBAES,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAiChD,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAYtD"}
1
+ {"version":3,"file":"RegexPolicyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAoBD;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,qBAAqB;IAC7D,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMnB;gBAES,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAiChD,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY;CAgBtD"}
@@ -1,3 +1,4 @@
1
+ import { logger } from "../../logger.js";
1
2
  function getStringToTest(context, parameterName) {
2
3
  if (parameterName == null || parameterName === "") {
3
4
  return context.toolName;
@@ -13,7 +14,6 @@ function getStringToTest(context, parameterName) {
13
14
  return String(value);
14
15
  return JSON.stringify(value);
15
16
  }
16
- const LOG_PREFIX = "[RegexPolicyPlugin]";
17
17
  /**
18
18
  * Policy plugin that blocks tool calls based on rules aligned to the tools/call schema.
19
19
  * Each rule targets a tool by name and optionally a parameter; the regex is run on
@@ -56,6 +56,7 @@ export class RegexPolicyPlugin {
56
56
  const str = getStringToTest(context, rule.parameterName);
57
57
  const matched = rule.regex.test(str);
58
58
  if (matched) {
59
+ logger.debug({ toolName: context.toolName, plugin: this.name, ruleIndex: i, result: rule.result, pattern: rule.pattern }, "Regex policy rule matched");
59
60
  return rule.result;
60
61
  }
61
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RegexPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RegexPolicyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/policy/RegexPolicyPlugin.ts"],"names":[],"mappings":"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"}