@guardbee/guard-core 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,7 @@ It exists so the same rule runs everywhere: a static scanner flagging a pattern
15
15
  | `isValidTcKimlik`, `isValidVkn`, `isValidIban`, `isValidLuhn`, `isValidTrPhone` | security-proxy, prompt-leak-scanner | Validation after a regex match |
16
16
  | `INJECTION_RULES`, `findInjections` | prompt-injection-scanner, security-proxy | 27 injection rules in English and Turkish, with base64-decoding; the scanner uses the 17 precise ones |
17
17
  | `scanForPromptInjection`, `scanToolResult` | security-proxy | Block on a precise high/critical rule, warn on anything else |
18
+ | `gatewayPolicySchema`, `validatePolicy`, `policyShape` | security-proxy, app.guardbee.ai | The gateway policy document (labels, rules, taint, approval, defaults, interceptors). The dashboard validates an edit with it before saving, so a policy that saves is one the proxy accepts |
18
19
  | `classifyTool`, `CAPABILITY_RULES` | toxic-flow-auditor, security-proxy | Label a tool as untrusted-content / sensitive-data / exfiltration / destructive (lethal trifecta) |
19
20
 
20
21
  ## Checksum-validated masking
package/TR.md CHANGED
@@ -15,6 +15,7 @@ Amacı, aynı kuralın her yerde çalışması: bir kalıbı raporlayan statik t
15
15
  | `isValidTcKimlik`, `isValidVkn`, `isValidIban`, `isValidLuhn`, `isValidTrPhone` | security-proxy, prompt-leak-scanner | Regex eşleşmesinden sonra doğrulama |
16
16
  | `INJECTION_RULES`, `findInjections` | prompt-injection-scanner, security-proxy | İngilizce ve Türkçe 27 injection kuralı, base64 çözme dahil; tarayıcı 17 kesin kuralı kullanır |
17
17
  | `scanForPromptInjection`, `scanToolResult` | security-proxy | Kesin bir high/critical kuralda engeller, geri kalan her şeyde uyarır |
18
+ | `gatewayPolicySchema`, `validatePolicy`, `policyShape` | security-proxy, app.guardbee.ai | Gateway politika belgesi (etiketler, kurallar, taint, onay, varsayılanlar, interceptor'lar). Dashboard bir düzenlemeyi kaydetmeden önce bununla doğrular; kaydedilen politika proxy'nin kabul ettiği politikadır |
18
19
  | `classifyTool`, `CAPABILITY_RULES` | toxic-flow-auditor, security-proxy | Bir tool'u untrusted-content / sensitive-data / exfiltration / destructive olarak etiketler (lethal trifecta) |
19
20
 
20
21
  ## Checksum doğrulamalı maskeleme
package/ZH.md CHANGED
@@ -15,6 +15,7 @@
15
15
  | `isValidTcKimlik`、`isValidVkn`、`isValidIban`、`isValidLuhn`、`isValidTrPhone` | security-proxy、prompt-leak-scanner | 正则匹配之后的校验 |
16
16
  | `INJECTION_RULES`、`findInjections` | prompt-injection-scanner、security-proxy | 27 条英文和土耳其语注入规则,包含 base64 解码;扫描器使用其中 17 条精确规则 |
17
17
  | `scanForPromptInjection`、`scanToolResult` | security-proxy | 命中精确的 high/critical 规则时拦截,其余情况只警告 |
18
+ | `gatewayPolicySchema`、`validatePolicy`、`policyShape` | security-proxy、app.guardbee.ai | 网关策略文档(标签、规则、污点、审批、默认值、拦截器)。仪表盘在保存编辑前用它校验,因此能保存的策略就是代理会接受的策略 |
18
19
  | `classifyTool`、`CAPABILITY_RULES` | toxic-flow-auditor、security-proxy | 把工具标记为 untrusted-content / sensitive-data / exfiltration / destructive(lethal trifecta) |
19
20
 
20
21
  ## 经校验和验证的脱敏
@@ -7,4 +7,6 @@ export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjec
7
7
  export type { ScanResult, InjectionRule, InjectionCategory, InjectionFinding } from "./injection.js";
8
8
  export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
9
9
  export type { Capability, FlowCategory, ToolRecord } from "./classify.js";
10
+ export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
11
+ export type { GatewayPolicy, PolicyValidation } from "./policy.js";
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.textOf = exports.classifyTool = exports.CAPABILITY_RULES = exports.scanToolResult = exports.scanForPromptInjection = exports.findInjections = exports.INJECTION_PATTERNS = exports.INJECTION_RULES = exports.SECRET_RULES = exports.maskPiiInValue = exports.maskPiiInText = exports.PII_PATTERNS = exports.isValidTrPhone = exports.isValidVkn = exports.isValidIban = exports.isValidLuhn = exports.isValidTcKimlik = void 0;
3
+ exports.validatePolicy = exports.gatewayPolicySchema = exports.policyShape = exports.policyRuleSchema = exports.POLICY_ACTIONS = exports.POLICY_LABELS = exports.textOf = exports.classifyTool = exports.CAPABILITY_RULES = exports.scanToolResult = exports.scanForPromptInjection = exports.findInjections = exports.INJECTION_PATTERNS = exports.INJECTION_RULES = exports.SECRET_RULES = exports.maskPiiInValue = exports.maskPiiInText = exports.PII_PATTERNS = exports.isValidTrPhone = exports.isValidVkn = exports.isValidIban = exports.isValidLuhn = exports.isValidTcKimlik = void 0;
4
4
  var validators_js_1 = require("./validators.js");
5
5
  Object.defineProperty(exports, "isValidTcKimlik", { enumerable: true, get: function () { return validators_js_1.isValidTcKimlik; } });
6
6
  Object.defineProperty(exports, "isValidLuhn", { enumerable: true, get: function () { return validators_js_1.isValidLuhn; } });
@@ -23,4 +23,11 @@ var classify_js_1 = require("./classify.js");
23
23
  Object.defineProperty(exports, "CAPABILITY_RULES", { enumerable: true, get: function () { return classify_js_1.CAPABILITY_RULES; } });
24
24
  Object.defineProperty(exports, "classifyTool", { enumerable: true, get: function () { return classify_js_1.classifyTool; } });
25
25
  Object.defineProperty(exports, "textOf", { enumerable: true, get: function () { return classify_js_1.textOf; } });
26
+ var policy_js_1 = require("./policy.js");
27
+ Object.defineProperty(exports, "POLICY_LABELS", { enumerable: true, get: function () { return policy_js_1.POLICY_LABELS; } });
28
+ Object.defineProperty(exports, "POLICY_ACTIONS", { enumerable: true, get: function () { return policy_js_1.POLICY_ACTIONS; } });
29
+ Object.defineProperty(exports, "policyRuleSchema", { enumerable: true, get: function () { return policy_js_1.policyRuleSchema; } });
30
+ Object.defineProperty(exports, "policyShape", { enumerable: true, get: function () { return policy_js_1.policyShape; } });
31
+ Object.defineProperty(exports, "gatewayPolicySchema", { enumerable: true, get: function () { return policy_js_1.gatewayPolicySchema; } });
32
+ Object.defineProperty(exports, "validatePolicy", { enumerable: true, get: function () { return policy_js_1.validatePolicy; } });
26
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAwG;AAA/F,gHAAA,eAAe,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,2GAAA,UAAU,OAAA;AAAE,+GAAA,cAAc,OAAA;AAC9E,mCAAuE;AAA9D,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEpD,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAErB,+CAMwB;AALtB,+GAAA,eAAe,OAAA;AACf,kHAAA,kBAAkB,OAAA;AAClB,8GAAA,cAAc,OAAA;AACd,sHAAA,sBAAsB,OAAA;AACtB,8GAAA,cAAc,OAAA;AAGhB,6CAAuE;AAA9D,+GAAA,gBAAgB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,qGAAA,MAAM,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAwG;AAA/F,gHAAA,eAAe,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,2GAAA,UAAU,OAAA;AAAE,+GAAA,cAAc,OAAA;AAC9E,mCAAuE;AAA9D,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEpD,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAErB,+CAMwB;AALtB,+GAAA,eAAe,OAAA;AACf,kHAAA,kBAAkB,OAAA;AAClB,8GAAA,cAAc,OAAA;AACd,sHAAA,sBAAsB,OAAA;AACtB,8GAAA,cAAc,OAAA;AAGhB,6CAAuE;AAA9D,+GAAA,gBAAgB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,qGAAA,MAAM,OAAA;AAE/C,yCAAgI;AAAvH,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,250 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The policy part of a GuardBee MCP gateway config: what may run and how.
4
+ * security-proxy reads it from guardbee-proxy.yaml or from the dashboard; the
5
+ * dashboard validates an edit with the same schema before it saves it, so a
6
+ * policy that saves is a policy the proxy accepts. Deployment settings
7
+ * (upstreams, listen, audit) stay out: they hold commands and secrets.
8
+ */
9
+ export declare const POLICY_LABELS: readonly ["untrusted", "sensitive", "egress", "destructive"];
10
+ export declare const POLICY_ACTIONS: readonly ["allow", "deny", "mask", "warn", "approve"];
11
+ export declare const policyRuleSchema: z.ZodObject<{
12
+ id: z.ZodOptional<z.ZodString>;
13
+ match: z.ZodObject<{
14
+ tool: z.ZodOptional<z.ZodString>;
15
+ upstream: z.ZodOptional<z.ZodString>;
16
+ label: z.ZodOptional<z.ZodEnum<{
17
+ destructive: "destructive";
18
+ untrusted: "untrusted";
19
+ sensitive: "sensitive";
20
+ egress: "egress";
21
+ }>>;
22
+ session: z.ZodOptional<z.ZodEnum<{
23
+ clean: "clean";
24
+ tainted: "tainted";
25
+ }>>;
26
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
27
+ }, z.core.$strict>;
28
+ action: z.ZodEnum<{
29
+ allow: "allow";
30
+ warn: "warn";
31
+ deny: "deny";
32
+ mask: "mask";
33
+ approve: "approve";
34
+ }>;
35
+ mask: z.ZodOptional<z.ZodObject<{
36
+ fields: z.ZodArray<z.ZodString>;
37
+ }, z.core.$strict>>;
38
+ }, z.core.$strict>;
39
+ /** Every field has a default, so `{}` is a valid (allow-all, strict-taint) policy. */
40
+ export declare const policyShape: {
41
+ labels: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodEnum<{
42
+ destructive: "destructive";
43
+ untrusted: "untrusted";
44
+ sensitive: "sensitive";
45
+ egress: "egress";
46
+ }>>>>;
47
+ rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
48
+ id: z.ZodOptional<z.ZodString>;
49
+ match: z.ZodObject<{
50
+ tool: z.ZodOptional<z.ZodString>;
51
+ upstream: z.ZodOptional<z.ZodString>;
52
+ label: z.ZodOptional<z.ZodEnum<{
53
+ destructive: "destructive";
54
+ untrusted: "untrusted";
55
+ sensitive: "sensitive";
56
+ egress: "egress";
57
+ }>>;
58
+ session: z.ZodOptional<z.ZodEnum<{
59
+ clean: "clean";
60
+ tainted: "tainted";
61
+ }>>;
62
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
63
+ }, z.core.$strict>;
64
+ action: z.ZodEnum<{
65
+ allow: "allow";
66
+ warn: "warn";
67
+ deny: "deny";
68
+ mask: "mask";
69
+ approve: "approve";
70
+ }>;
71
+ mask: z.ZodOptional<z.ZodObject<{
72
+ fields: z.ZodArray<z.ZodString>;
73
+ }, z.core.$strict>>;
74
+ }, z.core.$strict>>>;
75
+ taint: z.ZodDefault<z.ZodObject<{
76
+ mode: z.ZodDefault<z.ZodEnum<{
77
+ warn: "warn";
78
+ approve: "approve";
79
+ strict: "strict";
80
+ off: "off";
81
+ }>>;
82
+ basis: z.ZodDefault<z.ZodEnum<{
83
+ capability: "capability";
84
+ data: "data";
85
+ }>>;
86
+ }, z.core.$strict>>;
87
+ approval: z.ZodDefault<z.ZodObject<{
88
+ timeoutSeconds: z.ZodDefault<z.ZodNumber>;
89
+ channels: z.ZodDefault<z.ZodArray<z.ZodEnum<{
90
+ elicitation: "elicitation";
91
+ dashboard: "dashboard";
92
+ }>>>;
93
+ }, z.core.$strict>>;
94
+ defaults: z.ZodDefault<z.ZodObject<{
95
+ action: z.ZodDefault<z.ZodEnum<{
96
+ allow: "allow";
97
+ warn: "warn";
98
+ deny: "deny";
99
+ mask: "mask";
100
+ approve: "approve";
101
+ }>>;
102
+ }, z.core.$strict>>;
103
+ interceptors: z.ZodDefault<z.ZodObject<{
104
+ promptInjection: z.ZodOptional<z.ZodObject<{
105
+ enabled: z.ZodBoolean;
106
+ action: z.ZodEnum<{
107
+ block: "block";
108
+ warn: "warn";
109
+ }>;
110
+ }, z.core.$strict>>;
111
+ toolResultInjection: z.ZodOptional<z.ZodObject<{
112
+ enabled: z.ZodBoolean;
113
+ action: z.ZodEnum<{
114
+ block: "block";
115
+ warn: "warn";
116
+ }>;
117
+ }, z.core.$strict>>;
118
+ definitionDrift: z.ZodOptional<z.ZodObject<{
119
+ enabled: z.ZodBoolean;
120
+ action: z.ZodEnum<{
121
+ block: "block";
122
+ warn: "warn";
123
+ }>;
124
+ recheck: z.ZodOptional<z.ZodEnum<{
125
+ "every-call": "every-call";
126
+ "on-change": "on-change";
127
+ }>>;
128
+ }, z.core.$strict>>;
129
+ piiMasking: z.ZodOptional<z.ZodObject<{
130
+ enabled: z.ZodBoolean;
131
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
132
+ mode: z.ZodOptional<z.ZodEnum<{
133
+ redact: "redact";
134
+ tokenize: "tokenize";
135
+ }>>;
136
+ detokenizeForEgress: z.ZodOptional<z.ZodBoolean>;
137
+ }, z.core.$strict>>;
138
+ }, z.core.$strict>>;
139
+ };
140
+ export declare const gatewayPolicySchema: z.ZodObject<{
141
+ labels: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodEnum<{
142
+ destructive: "destructive";
143
+ untrusted: "untrusted";
144
+ sensitive: "sensitive";
145
+ egress: "egress";
146
+ }>>>>;
147
+ rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
148
+ id: z.ZodOptional<z.ZodString>;
149
+ match: z.ZodObject<{
150
+ tool: z.ZodOptional<z.ZodString>;
151
+ upstream: z.ZodOptional<z.ZodString>;
152
+ label: z.ZodOptional<z.ZodEnum<{
153
+ destructive: "destructive";
154
+ untrusted: "untrusted";
155
+ sensitive: "sensitive";
156
+ egress: "egress";
157
+ }>>;
158
+ session: z.ZodOptional<z.ZodEnum<{
159
+ clean: "clean";
160
+ tainted: "tainted";
161
+ }>>;
162
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
163
+ }, z.core.$strict>;
164
+ action: z.ZodEnum<{
165
+ allow: "allow";
166
+ warn: "warn";
167
+ deny: "deny";
168
+ mask: "mask";
169
+ approve: "approve";
170
+ }>;
171
+ mask: z.ZodOptional<z.ZodObject<{
172
+ fields: z.ZodArray<z.ZodString>;
173
+ }, z.core.$strict>>;
174
+ }, z.core.$strict>>>;
175
+ taint: z.ZodDefault<z.ZodObject<{
176
+ mode: z.ZodDefault<z.ZodEnum<{
177
+ warn: "warn";
178
+ approve: "approve";
179
+ strict: "strict";
180
+ off: "off";
181
+ }>>;
182
+ basis: z.ZodDefault<z.ZodEnum<{
183
+ capability: "capability";
184
+ data: "data";
185
+ }>>;
186
+ }, z.core.$strict>>;
187
+ approval: z.ZodDefault<z.ZodObject<{
188
+ timeoutSeconds: z.ZodDefault<z.ZodNumber>;
189
+ channels: z.ZodDefault<z.ZodArray<z.ZodEnum<{
190
+ elicitation: "elicitation";
191
+ dashboard: "dashboard";
192
+ }>>>;
193
+ }, z.core.$strict>>;
194
+ defaults: z.ZodDefault<z.ZodObject<{
195
+ action: z.ZodDefault<z.ZodEnum<{
196
+ allow: "allow";
197
+ warn: "warn";
198
+ deny: "deny";
199
+ mask: "mask";
200
+ approve: "approve";
201
+ }>>;
202
+ }, z.core.$strict>>;
203
+ interceptors: z.ZodDefault<z.ZodObject<{
204
+ promptInjection: z.ZodOptional<z.ZodObject<{
205
+ enabled: z.ZodBoolean;
206
+ action: z.ZodEnum<{
207
+ block: "block";
208
+ warn: "warn";
209
+ }>;
210
+ }, z.core.$strict>>;
211
+ toolResultInjection: z.ZodOptional<z.ZodObject<{
212
+ enabled: z.ZodBoolean;
213
+ action: z.ZodEnum<{
214
+ block: "block";
215
+ warn: "warn";
216
+ }>;
217
+ }, z.core.$strict>>;
218
+ definitionDrift: z.ZodOptional<z.ZodObject<{
219
+ enabled: z.ZodBoolean;
220
+ action: z.ZodEnum<{
221
+ block: "block";
222
+ warn: "warn";
223
+ }>;
224
+ recheck: z.ZodOptional<z.ZodEnum<{
225
+ "every-call": "every-call";
226
+ "on-change": "on-change";
227
+ }>>;
228
+ }, z.core.$strict>>;
229
+ piiMasking: z.ZodOptional<z.ZodObject<{
230
+ enabled: z.ZodBoolean;
231
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
232
+ mode: z.ZodOptional<z.ZodEnum<{
233
+ redact: "redact";
234
+ tokenize: "tokenize";
235
+ }>>;
236
+ detokenizeForEgress: z.ZodOptional<z.ZodBoolean>;
237
+ }, z.core.$strict>>;
238
+ }, z.core.$strict>>;
239
+ }, z.core.$strict>;
240
+ export type GatewayPolicy = z.infer<typeof gatewayPolicySchema>;
241
+ export type PolicyValidation = {
242
+ ok: true;
243
+ policy: GatewayPolicy;
244
+ } | {
245
+ ok: false;
246
+ issues: string[];
247
+ };
248
+ /** Validate an already-parsed policy document; issues read `path: message`. */
249
+ export declare function validatePolicy(value: unknown): PolicyValidation;
250
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAMpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCvB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gatewayPolicySchema = exports.policyShape = exports.policyRuleSchema = exports.POLICY_ACTIONS = exports.POLICY_LABELS = void 0;
4
+ exports.validatePolicy = validatePolicy;
5
+ const zod_1 = require("zod");
6
+ /**
7
+ * The policy part of a GuardBee MCP gateway config: what may run and how.
8
+ * security-proxy reads it from guardbee-proxy.yaml or from the dashboard; the
9
+ * dashboard validates an edit with the same schema before it saves it, so a
10
+ * policy that saves is a policy the proxy accepts. Deployment settings
11
+ * (upstreams, listen, audit) stay out: they hold commands and secrets.
12
+ */
13
+ exports.POLICY_LABELS = ["untrusted", "sensitive", "egress", "destructive"];
14
+ exports.POLICY_ACTIONS = ["allow", "deny", "mask", "warn", "approve"];
15
+ const labelSchema = zod_1.z.enum(exports.POLICY_LABELS);
16
+ const actionSchema = zod_1.z.enum(exports.POLICY_ACTIONS);
17
+ const interceptorSchema = zod_1.z.object({ enabled: zod_1.z.boolean(), action: zod_1.z.enum(["block", "warn"]) }).strict();
18
+ exports.policyRuleSchema = zod_1.z
19
+ .object({
20
+ id: zod_1.z.string().optional(),
21
+ match: zod_1.z
22
+ .object({
23
+ tool: zod_1.z.string().optional(),
24
+ upstream: zod_1.z.string().optional(),
25
+ label: labelSchema.optional(),
26
+ session: zod_1.z.enum(["clean", "tainted"]).optional(),
27
+ args: zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean()])).optional(),
28
+ })
29
+ .strict(),
30
+ action: actionSchema,
31
+ mask: zod_1.z.object({ fields: zod_1.z.array(zod_1.z.string()).min(1) }).strict().optional(),
32
+ })
33
+ .strict()
34
+ .refine((rule) => rule.mask === undefined || rule.action === "mask", {
35
+ message: "mask.fields only applies to action: mask",
36
+ path: ["mask"],
37
+ });
38
+ /** Every field has a default, so `{}` is a valid (allow-all, strict-taint) policy. */
39
+ exports.policyShape = {
40
+ labels: zod_1.z.record(zod_1.z.string(), zod_1.z.array(labelSchema)).default({}),
41
+ rules: zod_1.z.array(exports.policyRuleSchema).default([]),
42
+ taint: zod_1.z
43
+ .object({
44
+ mode: zod_1.z.enum(["strict", "approve", "warn", "off"]).default("strict"),
45
+ /**
46
+ * capability: any egress call after untrusted + sensitive content is a toxic flow.
47
+ * data: only an egress call whose arguments carry sensitive data the session saw.
48
+ */
49
+ basis: zod_1.z.enum(["capability", "data"]).default("capability"),
50
+ })
51
+ .strict()
52
+ .default({ mode: "strict", basis: "capability" }),
53
+ approval: zod_1.z
54
+ .object({
55
+ timeoutSeconds: zod_1.z.number().int().positive().default(120),
56
+ channels: zod_1.z.array(zod_1.z.enum(["elicitation", "dashboard"])).min(1).default(["elicitation"]),
57
+ })
58
+ .strict()
59
+ .default({ timeoutSeconds: 120, channels: ["elicitation"] }),
60
+ defaults: zod_1.z.object({ action: actionSchema.default("allow") }).strict().default({ action: "allow" }),
61
+ interceptors: zod_1.z
62
+ .object({
63
+ promptInjection: interceptorSchema.optional(),
64
+ toolResultInjection: interceptorSchema.optional(),
65
+ definitionDrift: interceptorSchema.extend({ recheck: zod_1.z.enum(["every-call", "on-change"]).optional() }).optional(),
66
+ piiMasking: zod_1.z
67
+ .object({
68
+ enabled: zod_1.z.boolean(),
69
+ patterns: zod_1.z.array(zod_1.z.string()).optional(),
70
+ mode: zod_1.z.enum(["redact", "tokenize"]).optional(),
71
+ detokenizeForEgress: zod_1.z.boolean().optional(),
72
+ })
73
+ .strict()
74
+ .optional(),
75
+ })
76
+ .strict()
77
+ .default({}),
78
+ };
79
+ exports.gatewayPolicySchema = zod_1.z.object(exports.policyShape).strict();
80
+ /** Validate an already-parsed policy document; issues read `path: message`. */
81
+ function validatePolicy(value) {
82
+ const parsed = exports.gatewayPolicySchema.safeParse(value ?? {});
83
+ if (parsed.success)
84
+ return { ok: true, policy: parsed.data };
85
+ return {
86
+ ok: false,
87
+ issues: parsed.error.issues.map((issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`),
88
+ };
89
+ }
90
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,6 @@ export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjec
7
7
  export type { ScanResult, InjectionRule, InjectionCategory, InjectionFinding } from "./injection.js";
8
8
  export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
9
9
  export type { Capability, FlowCategory, ToolRecord } from "./classify.js";
10
+ export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
11
+ export type { GatewayPolicy, PolicyValidation } from "./policy.js";
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -3,4 +3,5 @@ export { PII_PATTERNS, maskPiiInText, maskPiiInValue } from "./pii.js";
3
3
  export { SECRET_RULES } from "./secrets.js";
4
4
  export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjection, scanToolResult, } from "./injection.js";
5
5
  export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
6
+ export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,250 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The policy part of a GuardBee MCP gateway config: what may run and how.
4
+ * security-proxy reads it from guardbee-proxy.yaml or from the dashboard; the
5
+ * dashboard validates an edit with the same schema before it saves it, so a
6
+ * policy that saves is a policy the proxy accepts. Deployment settings
7
+ * (upstreams, listen, audit) stay out: they hold commands and secrets.
8
+ */
9
+ export declare const POLICY_LABELS: readonly ["untrusted", "sensitive", "egress", "destructive"];
10
+ export declare const POLICY_ACTIONS: readonly ["allow", "deny", "mask", "warn", "approve"];
11
+ export declare const policyRuleSchema: z.ZodObject<{
12
+ id: z.ZodOptional<z.ZodString>;
13
+ match: z.ZodObject<{
14
+ tool: z.ZodOptional<z.ZodString>;
15
+ upstream: z.ZodOptional<z.ZodString>;
16
+ label: z.ZodOptional<z.ZodEnum<{
17
+ destructive: "destructive";
18
+ untrusted: "untrusted";
19
+ sensitive: "sensitive";
20
+ egress: "egress";
21
+ }>>;
22
+ session: z.ZodOptional<z.ZodEnum<{
23
+ clean: "clean";
24
+ tainted: "tainted";
25
+ }>>;
26
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
27
+ }, z.core.$strict>;
28
+ action: z.ZodEnum<{
29
+ allow: "allow";
30
+ warn: "warn";
31
+ deny: "deny";
32
+ mask: "mask";
33
+ approve: "approve";
34
+ }>;
35
+ mask: z.ZodOptional<z.ZodObject<{
36
+ fields: z.ZodArray<z.ZodString>;
37
+ }, z.core.$strict>>;
38
+ }, z.core.$strict>;
39
+ /** Every field has a default, so `{}` is a valid (allow-all, strict-taint) policy. */
40
+ export declare const policyShape: {
41
+ labels: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodEnum<{
42
+ destructive: "destructive";
43
+ untrusted: "untrusted";
44
+ sensitive: "sensitive";
45
+ egress: "egress";
46
+ }>>>>;
47
+ rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
48
+ id: z.ZodOptional<z.ZodString>;
49
+ match: z.ZodObject<{
50
+ tool: z.ZodOptional<z.ZodString>;
51
+ upstream: z.ZodOptional<z.ZodString>;
52
+ label: z.ZodOptional<z.ZodEnum<{
53
+ destructive: "destructive";
54
+ untrusted: "untrusted";
55
+ sensitive: "sensitive";
56
+ egress: "egress";
57
+ }>>;
58
+ session: z.ZodOptional<z.ZodEnum<{
59
+ clean: "clean";
60
+ tainted: "tainted";
61
+ }>>;
62
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
63
+ }, z.core.$strict>;
64
+ action: z.ZodEnum<{
65
+ allow: "allow";
66
+ warn: "warn";
67
+ deny: "deny";
68
+ mask: "mask";
69
+ approve: "approve";
70
+ }>;
71
+ mask: z.ZodOptional<z.ZodObject<{
72
+ fields: z.ZodArray<z.ZodString>;
73
+ }, z.core.$strict>>;
74
+ }, z.core.$strict>>>;
75
+ taint: z.ZodDefault<z.ZodObject<{
76
+ mode: z.ZodDefault<z.ZodEnum<{
77
+ warn: "warn";
78
+ approve: "approve";
79
+ strict: "strict";
80
+ off: "off";
81
+ }>>;
82
+ basis: z.ZodDefault<z.ZodEnum<{
83
+ capability: "capability";
84
+ data: "data";
85
+ }>>;
86
+ }, z.core.$strict>>;
87
+ approval: z.ZodDefault<z.ZodObject<{
88
+ timeoutSeconds: z.ZodDefault<z.ZodNumber>;
89
+ channels: z.ZodDefault<z.ZodArray<z.ZodEnum<{
90
+ elicitation: "elicitation";
91
+ dashboard: "dashboard";
92
+ }>>>;
93
+ }, z.core.$strict>>;
94
+ defaults: z.ZodDefault<z.ZodObject<{
95
+ action: z.ZodDefault<z.ZodEnum<{
96
+ allow: "allow";
97
+ warn: "warn";
98
+ deny: "deny";
99
+ mask: "mask";
100
+ approve: "approve";
101
+ }>>;
102
+ }, z.core.$strict>>;
103
+ interceptors: z.ZodDefault<z.ZodObject<{
104
+ promptInjection: z.ZodOptional<z.ZodObject<{
105
+ enabled: z.ZodBoolean;
106
+ action: z.ZodEnum<{
107
+ block: "block";
108
+ warn: "warn";
109
+ }>;
110
+ }, z.core.$strict>>;
111
+ toolResultInjection: z.ZodOptional<z.ZodObject<{
112
+ enabled: z.ZodBoolean;
113
+ action: z.ZodEnum<{
114
+ block: "block";
115
+ warn: "warn";
116
+ }>;
117
+ }, z.core.$strict>>;
118
+ definitionDrift: z.ZodOptional<z.ZodObject<{
119
+ enabled: z.ZodBoolean;
120
+ action: z.ZodEnum<{
121
+ block: "block";
122
+ warn: "warn";
123
+ }>;
124
+ recheck: z.ZodOptional<z.ZodEnum<{
125
+ "every-call": "every-call";
126
+ "on-change": "on-change";
127
+ }>>;
128
+ }, z.core.$strict>>;
129
+ piiMasking: z.ZodOptional<z.ZodObject<{
130
+ enabled: z.ZodBoolean;
131
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
132
+ mode: z.ZodOptional<z.ZodEnum<{
133
+ redact: "redact";
134
+ tokenize: "tokenize";
135
+ }>>;
136
+ detokenizeForEgress: z.ZodOptional<z.ZodBoolean>;
137
+ }, z.core.$strict>>;
138
+ }, z.core.$strict>>;
139
+ };
140
+ export declare const gatewayPolicySchema: z.ZodObject<{
141
+ labels: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodEnum<{
142
+ destructive: "destructive";
143
+ untrusted: "untrusted";
144
+ sensitive: "sensitive";
145
+ egress: "egress";
146
+ }>>>>;
147
+ rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
148
+ id: z.ZodOptional<z.ZodString>;
149
+ match: z.ZodObject<{
150
+ tool: z.ZodOptional<z.ZodString>;
151
+ upstream: z.ZodOptional<z.ZodString>;
152
+ label: z.ZodOptional<z.ZodEnum<{
153
+ destructive: "destructive";
154
+ untrusted: "untrusted";
155
+ sensitive: "sensitive";
156
+ egress: "egress";
157
+ }>>;
158
+ session: z.ZodOptional<z.ZodEnum<{
159
+ clean: "clean";
160
+ tainted: "tainted";
161
+ }>>;
162
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
163
+ }, z.core.$strict>;
164
+ action: z.ZodEnum<{
165
+ allow: "allow";
166
+ warn: "warn";
167
+ deny: "deny";
168
+ mask: "mask";
169
+ approve: "approve";
170
+ }>;
171
+ mask: z.ZodOptional<z.ZodObject<{
172
+ fields: z.ZodArray<z.ZodString>;
173
+ }, z.core.$strict>>;
174
+ }, z.core.$strict>>>;
175
+ taint: z.ZodDefault<z.ZodObject<{
176
+ mode: z.ZodDefault<z.ZodEnum<{
177
+ warn: "warn";
178
+ approve: "approve";
179
+ strict: "strict";
180
+ off: "off";
181
+ }>>;
182
+ basis: z.ZodDefault<z.ZodEnum<{
183
+ capability: "capability";
184
+ data: "data";
185
+ }>>;
186
+ }, z.core.$strict>>;
187
+ approval: z.ZodDefault<z.ZodObject<{
188
+ timeoutSeconds: z.ZodDefault<z.ZodNumber>;
189
+ channels: z.ZodDefault<z.ZodArray<z.ZodEnum<{
190
+ elicitation: "elicitation";
191
+ dashboard: "dashboard";
192
+ }>>>;
193
+ }, z.core.$strict>>;
194
+ defaults: z.ZodDefault<z.ZodObject<{
195
+ action: z.ZodDefault<z.ZodEnum<{
196
+ allow: "allow";
197
+ warn: "warn";
198
+ deny: "deny";
199
+ mask: "mask";
200
+ approve: "approve";
201
+ }>>;
202
+ }, z.core.$strict>>;
203
+ interceptors: z.ZodDefault<z.ZodObject<{
204
+ promptInjection: z.ZodOptional<z.ZodObject<{
205
+ enabled: z.ZodBoolean;
206
+ action: z.ZodEnum<{
207
+ block: "block";
208
+ warn: "warn";
209
+ }>;
210
+ }, z.core.$strict>>;
211
+ toolResultInjection: z.ZodOptional<z.ZodObject<{
212
+ enabled: z.ZodBoolean;
213
+ action: z.ZodEnum<{
214
+ block: "block";
215
+ warn: "warn";
216
+ }>;
217
+ }, z.core.$strict>>;
218
+ definitionDrift: z.ZodOptional<z.ZodObject<{
219
+ enabled: z.ZodBoolean;
220
+ action: z.ZodEnum<{
221
+ block: "block";
222
+ warn: "warn";
223
+ }>;
224
+ recheck: z.ZodOptional<z.ZodEnum<{
225
+ "every-call": "every-call";
226
+ "on-change": "on-change";
227
+ }>>;
228
+ }, z.core.$strict>>;
229
+ piiMasking: z.ZodOptional<z.ZodObject<{
230
+ enabled: z.ZodBoolean;
231
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
232
+ mode: z.ZodOptional<z.ZodEnum<{
233
+ redact: "redact";
234
+ tokenize: "tokenize";
235
+ }>>;
236
+ detokenizeForEgress: z.ZodOptional<z.ZodBoolean>;
237
+ }, z.core.$strict>>;
238
+ }, z.core.$strict>>;
239
+ }, z.core.$strict>;
240
+ export type GatewayPolicy = z.infer<typeof gatewayPolicySchema>;
241
+ export type PolicyValidation = {
242
+ ok: true;
243
+ policy: GatewayPolicy;
244
+ } | {
245
+ ok: false;
246
+ issues: string[];
247
+ };
248
+ /** Validate an already-parsed policy document; issues read `path: message`. */
249
+ export declare function validatePolicy(value: unknown): PolicyValidation;
250
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAMpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCvB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
package/dist/policy.js ADDED
@@ -0,0 +1,86 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The policy part of a GuardBee MCP gateway config: what may run and how.
4
+ * security-proxy reads it from guardbee-proxy.yaml or from the dashboard; the
5
+ * dashboard validates an edit with the same schema before it saves it, so a
6
+ * policy that saves is a policy the proxy accepts. Deployment settings
7
+ * (upstreams, listen, audit) stay out: they hold commands and secrets.
8
+ */
9
+ export const POLICY_LABELS = ["untrusted", "sensitive", "egress", "destructive"];
10
+ export const POLICY_ACTIONS = ["allow", "deny", "mask", "warn", "approve"];
11
+ const labelSchema = z.enum(POLICY_LABELS);
12
+ const actionSchema = z.enum(POLICY_ACTIONS);
13
+ const interceptorSchema = z.object({ enabled: z.boolean(), action: z.enum(["block", "warn"]) }).strict();
14
+ export const policyRuleSchema = z
15
+ .object({
16
+ id: z.string().optional(),
17
+ match: z
18
+ .object({
19
+ tool: z.string().optional(),
20
+ upstream: z.string().optional(),
21
+ label: labelSchema.optional(),
22
+ session: z.enum(["clean", "tainted"]).optional(),
23
+ args: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
24
+ })
25
+ .strict(),
26
+ action: actionSchema,
27
+ mask: z.object({ fields: z.array(z.string()).min(1) }).strict().optional(),
28
+ })
29
+ .strict()
30
+ .refine((rule) => rule.mask === undefined || rule.action === "mask", {
31
+ message: "mask.fields only applies to action: mask",
32
+ path: ["mask"],
33
+ });
34
+ /** Every field has a default, so `{}` is a valid (allow-all, strict-taint) policy. */
35
+ export const policyShape = {
36
+ labels: z.record(z.string(), z.array(labelSchema)).default({}),
37
+ rules: z.array(policyRuleSchema).default([]),
38
+ taint: z
39
+ .object({
40
+ mode: z.enum(["strict", "approve", "warn", "off"]).default("strict"),
41
+ /**
42
+ * capability: any egress call after untrusted + sensitive content is a toxic flow.
43
+ * data: only an egress call whose arguments carry sensitive data the session saw.
44
+ */
45
+ basis: z.enum(["capability", "data"]).default("capability"),
46
+ })
47
+ .strict()
48
+ .default({ mode: "strict", basis: "capability" }),
49
+ approval: z
50
+ .object({
51
+ timeoutSeconds: z.number().int().positive().default(120),
52
+ channels: z.array(z.enum(["elicitation", "dashboard"])).min(1).default(["elicitation"]),
53
+ })
54
+ .strict()
55
+ .default({ timeoutSeconds: 120, channels: ["elicitation"] }),
56
+ defaults: z.object({ action: actionSchema.default("allow") }).strict().default({ action: "allow" }),
57
+ interceptors: z
58
+ .object({
59
+ promptInjection: interceptorSchema.optional(),
60
+ toolResultInjection: interceptorSchema.optional(),
61
+ definitionDrift: interceptorSchema.extend({ recheck: z.enum(["every-call", "on-change"]).optional() }).optional(),
62
+ piiMasking: z
63
+ .object({
64
+ enabled: z.boolean(),
65
+ patterns: z.array(z.string()).optional(),
66
+ mode: z.enum(["redact", "tokenize"]).optional(),
67
+ detokenizeForEgress: z.boolean().optional(),
68
+ })
69
+ .strict()
70
+ .optional(),
71
+ })
72
+ .strict()
73
+ .default({}),
74
+ };
75
+ export const gatewayPolicySchema = z.object(policyShape).strict();
76
+ /** Validate an already-parsed policy document; issues read `path: message`. */
77
+ export function validatePolicy(value) {
78
+ const parsed = gatewayPolicySchema.safeParse(value ?? {});
79
+ if (parsed.success)
80
+ return { ok: true, policy: parsed.data };
81
+ return {
82
+ ok: false,
83
+ issues: parsed.error.issues.map((issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`),
84
+ };
85
+ }
86
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guardbee/guard-core",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "Shared detectors for GuardBee MCP packages — checksum-validated PII masking, prompt injection patterns, and lethal-trifecta tool classification",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -45,6 +45,9 @@
45
45
  "bugs": {
46
46
  "url": "https://github.com/GuardBee/guardbee-mcp/issues"
47
47
  },
48
+ "dependencies": {
49
+ "zod": "^4.5.4"
50
+ },
48
51
  "scripts": {
49
52
  "build": "tsc && tsc -p tsconfig.cjs.json && node -e \"require('fs').mkdirSync('dist/cjs',{recursive:true});require('fs').writeFileSync('dist/cjs/package.json','{\\\"type\\\":\\\"commonjs\\\"}\\n')\"",
50
53
  "dev": "tsc --watch",