zuplo 7.2.3 → 7.2.4

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 (157) hide show
  1. package/docs/ai-gateway/integrations/ai-sdk.mdx +3 -2
  2. package/docs/ai-gateway/integrations/claude-code.mdx +3 -2
  3. package/docs/ai-gateway/integrations/codex.mdx +7 -5
  4. package/docs/ai-gateway/integrations/goose.mdx +4 -3
  5. package/docs/ai-gateway/integrations/langchain.mdx +3 -3
  6. package/docs/ai-gateway/integrations/openai.mdx +3 -3
  7. package/docs/ai-gateway/policies/overview.mdx +3 -17
  8. package/docs/ai-gateway/universal-api.mdx +4 -3
  9. package/docs/caching/custom-caching-policy.mdx +1 -1
  10. package/docs/caching/gateway-caching.mdx +3 -3
  11. package/docs/caching/overview.mdx +10 -10
  12. package/docs/dedicated/akamai/ai-powered-applications.mdx +2 -2
  13. package/docs/dev-portal/zudoku/configuration/search.md +5 -0
  14. package/docs/dev-portal/zudoku/openapi-extensions/x-mcp-server.md +30 -0
  15. package/docs/policies/_index.md +12 -7
  16. package/docs/policies/ai-gateway-auth-v2-inbound/doc.md +168 -0
  17. package/docs/policies/ai-gateway-auth-v2-inbound/intro.md +10 -0
  18. package/docs/policies/ai-gateway-auth-v2-inbound/schema.json +74 -0
  19. package/docs/policies/ai-gateway-configuration-executor-v2-inbound/doc.md +442 -0
  20. package/docs/policies/ai-gateway-configuration-executor-v2-inbound/intro.md +14 -0
  21. package/docs/policies/ai-gateway-configuration-executor-v2-inbound/schema.json +60 -0
  22. package/docs/policies/ai-gateway-configuration-loader-v2-inbound/doc.md +105 -0
  23. package/docs/policies/ai-gateway-configuration-loader-v2-inbound/intro.md +6 -0
  24. package/docs/policies/ai-gateway-configuration-loader-v2-inbound/schema.json +60 -0
  25. package/docs/policies/ai-gateway-dlp-inbound/doc.md +127 -0
  26. package/docs/policies/ai-gateway-dlp-inbound/intro.md +5 -0
  27. package/docs/policies/ai-gateway-dlp-inbound/schema.json +4050 -0
  28. package/docs/policies/ai-gateway-fallback-model-v2-inbound/doc.md +10 -2
  29. package/docs/policies/ai-gateway-fallback-model-v2-inbound/intro.md +2 -2
  30. package/docs/policies/ai-gateway-fallback-model-v2-inbound/schema.json +22 -8
  31. package/docs/policies/ai-gateway-metering-v2-inbound/doc.md +19 -16
  32. package/docs/policies/ai-gateway-metering-v2-inbound/intro.md +9 -0
  33. package/docs/policies/ai-gateway-metering-v2-inbound/schema.json +20 -24
  34. package/docs/policies/ai-gateway-model-filtering-v2-inbound/doc.md +6 -5
  35. package/docs/policies/ai-gateway-model-filtering-v2-inbound/intro.md +2 -2
  36. package/docs/policies/ai-gateway-model-filtering-v2-inbound/schema.json +17 -3
  37. package/docs/policies/ai-gateway-semantic-cache-v2-inbound/doc.md +72 -0
  38. package/docs/policies/ai-gateway-semantic-cache-v2-inbound/intro.md +9 -0
  39. package/docs/policies/ai-gateway-semantic-cache-v2-inbound/schema.json +120 -0
  40. package/docs/policies/akamai-ai-firewall-v2-inbound/doc.md +87 -0
  41. package/docs/policies/akamai-ai-firewall-v2-inbound/intro.md +10 -0
  42. package/docs/policies/{akamai-ai-firewall → akamai-ai-firewall-v2-inbound}/schema.json +36 -9
  43. package/docs/policies/akamai-firewall-for-ai-inbound/schema.json +1 -0
  44. package/docs/policies/akamai-firewall-for-ai-outbound/schema.json +1 -0
  45. package/docs/policies/amberflo-metering-inbound/schema.json +1 -0
  46. package/docs/policies/api-key-inbound/schema.json +1 -0
  47. package/docs/policies/audit-log-inbound/schema.json +1 -0
  48. package/docs/policies/auth0-jwt-auth-inbound/schema.json +1 -0
  49. package/docs/policies/authzen-inbound/schema.json +1 -0
  50. package/docs/policies/axiomatics-authz-inbound/schema.json +1 -0
  51. package/docs/policies/basic-auth-inbound/schema.json +1 -0
  52. package/docs/policies/bot-detection-inbound/schema.json +1 -0
  53. package/docs/policies/brownout-inbound/schema.json +1 -0
  54. package/docs/policies/caching-inbound/schema.json +1 -0
  55. package/docs/policies/cdn-cache-control-outbound/schema.json +1 -0
  56. package/docs/policies/change-method-inbound/schema.json +1 -0
  57. package/docs/policies/clear-headers-inbound/schema.json +1 -0
  58. package/docs/policies/clear-headers-outbound/schema.json +1 -0
  59. package/docs/policies/clerk-jwt-auth-inbound/schema.json +1 -0
  60. package/docs/policies/cognito-jwt-auth-inbound/schema.json +1 -0
  61. package/docs/policies/comet-opik-tracing-v2-inbound/doc.md +78 -0
  62. package/docs/policies/comet-opik-tracing-v2-inbound/intro.md +10 -0
  63. package/docs/policies/{comet-opik-tracing-inbound → comet-opik-tracing-v2-inbound}/schema.json +40 -5
  64. package/docs/policies/complex-rate-limit-inbound/schema.json +1 -0
  65. package/docs/policies/composite-inbound/schema.json +1 -0
  66. package/docs/policies/composite-outbound/schema.json +1 -0
  67. package/docs/policies/curity-phantom-token-inbound/schema.json +1 -0
  68. package/docs/policies/data-loss-prevention-inbound/doc.md +22 -6
  69. package/docs/policies/data-loss-prevention-inbound/schema.json +10 -1
  70. package/docs/policies/data-loss-prevention-outbound/doc.md +23 -6
  71. package/docs/policies/data-loss-prevention-outbound/schema.json +10 -1
  72. package/docs/policies/firebase-jwt-inbound/schema.json +1 -0
  73. package/docs/policies/formdata-to-json-inbound/schema.json +1 -0
  74. package/docs/policies/galileo-tracing-v2-inbound/doc.md +72 -0
  75. package/docs/policies/galileo-tracing-v2-inbound/intro.md +8 -0
  76. package/docs/policies/{galileo-tracing-inbound → galileo-tracing-v2-inbound}/schema.json +40 -5
  77. package/docs/policies/geo-filter-inbound/schema.json +1 -0
  78. package/docs/policies/graphql-analytics-outbound/schema.json +1 -0
  79. package/docs/policies/graphql-cache-inbound/schema.json +1 -0
  80. package/docs/policies/graphql-complexity-limit-inbound/schema.json +1 -0
  81. package/docs/policies/graphql-disable-introspection-inbound/schema.json +1 -0
  82. package/docs/policies/graphql-introspection-filter-outbound/schema.json +1 -0
  83. package/docs/policies/http-deprecation-outbound/schema.json +1 -0
  84. package/docs/policies/ip-address-restriction-inbound/schema.json +1 -0
  85. package/docs/policies/jwt-scopes-inbound/schema.json +1 -0
  86. package/docs/policies/ldap-auth-inbound/schema.json +1 -0
  87. package/docs/policies/mcp-auth0-oauth-inbound/schema.json +1 -0
  88. package/docs/policies/mcp-capability-filter-inbound/schema.json +1 -0
  89. package/docs/policies/mcp-clerk-oauth-inbound/schema.json +1 -0
  90. package/docs/policies/mcp-cognito-oauth-inbound/schema.json +1 -0
  91. package/docs/policies/mcp-entra-oauth-inbound/schema.json +1 -0
  92. package/docs/policies/mcp-google-oauth-inbound/schema.json +1 -0
  93. package/docs/policies/mcp-keycloak-oauth-inbound/schema.json +1 -0
  94. package/docs/policies/mcp-logto-oauth-inbound/schema.json +1 -0
  95. package/docs/policies/mcp-oauth-inbound/schema.json +1 -0
  96. package/docs/policies/mcp-okta-oauth-inbound/schema.json +1 -0
  97. package/docs/policies/mcp-onelogin-oauth-inbound/schema.json +1 -0
  98. package/docs/policies/mcp-ping-oauth-inbound/schema.json +1 -0
  99. package/docs/policies/mcp-token-exchange-inbound/schema.json +1 -0
  100. package/docs/policies/mcp-workos-oauth-inbound/schema.json +1 -0
  101. package/docs/policies/mock-api-inbound/schema.json +1 -0
  102. package/docs/policies/moesif-inbound/schema.json +1 -0
  103. package/docs/policies/monetization-inbound/schema.json +1 -0
  104. package/docs/policies/mtls-auth-inbound/schema.json +1 -0
  105. package/docs/policies/okta-fga-authz-inbound/schema.json +1 -0
  106. package/docs/policies/okta-jwt-auth-inbound/schema.json +1 -0
  107. package/docs/policies/open-id-jwt-auth-inbound/schema.json +1 -0
  108. package/docs/policies/openfga-authz-inbound/schema.json +1 -0
  109. package/docs/policies/openmeter-inbound/schema.json +1 -0
  110. package/docs/policies/prompt-injection-outbound/schema.json +1 -0
  111. package/docs/policies/propel-auth-jwt-inbound/schema.json +1 -0
  112. package/docs/policies/query-param-to-header-inbound/schema.json +1 -0
  113. package/docs/policies/quota-inbound/schema.json +1 -0
  114. package/docs/policies/rate-limit-inbound/schema.json +1 -0
  115. package/docs/policies/readme-metrics-inbound/schema.json +1 -0
  116. package/docs/policies/remove-headers-inbound/schema.json +1 -0
  117. package/docs/policies/remove-headers-outbound/schema.json +1 -0
  118. package/docs/policies/remove-query-params-inbound/schema.json +1 -0
  119. package/docs/policies/replace-string-outbound/schema.json +1 -0
  120. package/docs/policies/request-size-limit-inbound/schema.json +1 -0
  121. package/docs/policies/request-validation-inbound/schema.json +1 -0
  122. package/docs/policies/require-origin-inbound/schema.json +1 -0
  123. package/docs/policies/require-user-claims-inbound/schema.json +1 -0
  124. package/docs/policies/secret-masking-outbound/schema.json +1 -0
  125. package/docs/policies/semantic-cache-inbound/schema.json +3 -2
  126. package/docs/policies/set-body-inbound/schema.json +1 -0
  127. package/docs/policies/set-headers-inbound/schema.json +1 -0
  128. package/docs/policies/set-headers-outbound/schema.json +1 -0
  129. package/docs/policies/set-query-params-inbound/schema.json +1 -0
  130. package/docs/policies/set-status-outbound/schema.json +1 -0
  131. package/docs/policies/set-upstream-api-key-inbound/schema.json +1 -0
  132. package/docs/policies/sleep-inbound/schema.json +1 -0
  133. package/docs/policies/stripe-webhook-verification-inbound/schema.json +1 -0
  134. package/docs/policies/supabase-jwt-auth-inbound/schema.json +1 -0
  135. package/docs/policies/traffic-splitting-inbound/schema.json +1 -0
  136. package/docs/policies/upstream-aws-federated-auth-inbound/schema.json +1 -0
  137. package/docs/policies/upstream-aws-service-auth-inbound/schema.json +1 -0
  138. package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +1 -0
  139. package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +1 -0
  140. package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +1 -0
  141. package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +1 -0
  142. package/docs/policies/upstream-gcp-jwt-inbound/schema.json +1 -0
  143. package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +1 -0
  144. package/docs/policies/upstream-oauth-client-credentials-inbound/schema.json +1 -0
  145. package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +1 -0
  146. package/docs/policies/validate-json-schema-inbound/schema.json +1 -0
  147. package/docs/policies/web-bot-auth-inbound/schema.json +1 -0
  148. package/docs/policies/xml-to-json-outbound/schema.json +1 -0
  149. package/package.json +5 -5
  150. package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +0 -122
  151. package/docs/ai-gateway/policies/authentication.mdx +0 -43
  152. package/docs/ai-gateway/policies/comet-opik-tracing.mdx +0 -177
  153. package/docs/ai-gateway/policies/fallback-model.mdx +0 -40
  154. package/docs/ai-gateway/policies/galileo-tracing.mdx +0 -161
  155. package/docs/ai-gateway/policies/metering.mdx +0 -47
  156. package/docs/ai-gateway/policies/model-filtering.mdx +0 -49
  157. package/docs/ai-gateway/policies/semantic-cache.mdx +0 -48
@@ -0,0 +1,4050 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft-07/schema",
3
+ "$id": "https://cdn.zuplo.com/policies/runtime/schemas/ai-gateway-dlp-inbound.json",
4
+ "type": "object",
5
+ "title": "Data Loss Prevention (DLP)",
6
+ "isDeprecated": false,
7
+ "isPaidAddOn": false,
8
+ "isEnterprise": false,
9
+ "isInternal": false,
10
+ "isBeta": false,
11
+ "isHidden": false,
12
+ "requiresAI": true,
13
+ "policyType": "ai-gateway-dlp",
14
+ "products": ["ai-gateway"],
15
+ "description": "Data Loss Prevention (DLP) Inbound Policy for the AI Gateway",
16
+ "deprecatedMessage": "",
17
+ "required": ["handler"],
18
+ "properties": {
19
+ "handler": {
20
+ "type": "object",
21
+ "default": {},
22
+ "required": ["export", "module", "options"],
23
+ "properties": {
24
+ "export": {
25
+ "const": "AIGatewayDlpInboundPolicy",
26
+ "description": "The name of the exported type"
27
+ },
28
+ "module": {
29
+ "const": "$import(@zuplo/runtime)",
30
+ "description": "The module containing the policy"
31
+ },
32
+ "options": {
33
+ "x-zuplo-policy-type": "ai-gateway-dlp",
34
+ "type": "object",
35
+ "title": "AIGatewayDlpInboundPolicyOptions",
36
+ "description": "The options for the Data Loss Prevention (DLP) policy. Scans the content of AI requests and responses — system prompts, messages, and tool-call arguments — for sensitive data such as credit cards, national identifiers, and API keys, applying a per-rule action (mask, block, or log). Detection runs entirely inside the gateway and streaming responses are scanned as they stream.",
37
+ "additionalProperties": false,
38
+ "required": ["rules"],
39
+ "examples": [
40
+ {
41
+ "rules": {
42
+ "pii": {
43
+ "inboundAction": "mask",
44
+ "outboundAction": "block"
45
+ },
46
+ "secret": {
47
+ "action": "block"
48
+ }
49
+ }
50
+ }
51
+ ],
52
+ "properties": {
53
+ "rules": {
54
+ "type": "object",
55
+ "title": "DlpRules",
56
+ "additionalProperties": false,
57
+ "description": "What to find and what to do about it. Each key is a built-in data type id (like `id-us-ssn`) or a group selector (like `pii` or `secret`, plus any dash-aligned id prefix such as `secret-aws`); each value is a rule object stating either one `action` for both directions or a directional pair (`inboundAction`/`outboundAction`) — for example mask PII inbound and block it outbound. Types you do not mention are not scanned. The most specific key wins — an exact id beats a prefix beats a group — and the winning entry decides everything for its type. When one stretch of text matches multiple rules, the severest action wins (block > mask > log). At least one rule must scan something.",
58
+ "properties": {
59
+ "contact": {
60
+ "type": "object",
61
+ "title": "DlpRule",
62
+ "additionalProperties": false,
63
+ "properties": {
64
+ "action": {
65
+ "type": "string",
66
+ "enum": ["mask", "block", "log", "off"],
67
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
68
+ },
69
+ "inboundAction": {
70
+ "type": "string",
71
+ "enum": ["mask", "block", "log", "off"],
72
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
73
+ },
74
+ "outboundAction": {
75
+ "type": "string",
76
+ "enum": ["mask", "block", "log", "off"],
77
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
78
+ },
79
+ "detection": {
80
+ "type": "string",
81
+ "enum": ["corroborated", "standard", "aggressive"],
82
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
83
+ },
84
+ "mask": {
85
+ "type": "string",
86
+ "default": "[{type}]",
87
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
88
+ },
89
+ "partialMask": {
90
+ "type": "object",
91
+ "title": "DlpPartialMask",
92
+ "additionalProperties": false,
93
+ "required": ["keepLast"],
94
+ "properties": {
95
+ "keepLast": {
96
+ "type": "integer",
97
+ "minimum": 1,
98
+ "maximum": 8,
99
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
100
+ }
101
+ }
102
+ }
103
+ }
104
+ },
105
+ "finance": {
106
+ "type": "object",
107
+ "title": "DlpRule",
108
+ "additionalProperties": false,
109
+ "properties": {
110
+ "action": {
111
+ "type": "string",
112
+ "enum": ["mask", "block", "log", "off"],
113
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
114
+ },
115
+ "inboundAction": {
116
+ "type": "string",
117
+ "enum": ["mask", "block", "log", "off"],
118
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
119
+ },
120
+ "outboundAction": {
121
+ "type": "string",
122
+ "enum": ["mask", "block", "log", "off"],
123
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
124
+ },
125
+ "detection": {
126
+ "type": "string",
127
+ "enum": ["corroborated", "standard", "aggressive"],
128
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
129
+ },
130
+ "mask": {
131
+ "type": "string",
132
+ "default": "[{type}]",
133
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
134
+ },
135
+ "partialMask": {
136
+ "type": "object",
137
+ "title": "DlpPartialMask",
138
+ "additionalProperties": false,
139
+ "required": ["keepLast"],
140
+ "properties": {
141
+ "keepLast": {
142
+ "type": "integer",
143
+ "minimum": 1,
144
+ "maximum": 8,
145
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
146
+ }
147
+ }
148
+ }
149
+ }
150
+ },
151
+ "finance-us": {
152
+ "type": "object",
153
+ "title": "DlpRule",
154
+ "additionalProperties": false,
155
+ "properties": {
156
+ "action": {
157
+ "type": "string",
158
+ "enum": ["mask", "block", "log", "off"],
159
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
160
+ },
161
+ "inboundAction": {
162
+ "type": "string",
163
+ "enum": ["mask", "block", "log", "off"],
164
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
165
+ },
166
+ "outboundAction": {
167
+ "type": "string",
168
+ "enum": ["mask", "block", "log", "off"],
169
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
170
+ },
171
+ "detection": {
172
+ "type": "string",
173
+ "enum": ["corroborated", "standard", "aggressive"],
174
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
175
+ },
176
+ "mask": {
177
+ "type": "string",
178
+ "default": "[{type}]",
179
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
180
+ },
181
+ "partialMask": {
182
+ "type": "object",
183
+ "title": "DlpPartialMask",
184
+ "additionalProperties": false,
185
+ "required": ["keepLast"],
186
+ "properties": {
187
+ "keepLast": {
188
+ "type": "integer",
189
+ "minimum": 1,
190
+ "maximum": 8,
191
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
192
+ }
193
+ }
194
+ }
195
+ }
196
+ },
197
+ "id": {
198
+ "type": "object",
199
+ "title": "DlpRule",
200
+ "additionalProperties": false,
201
+ "properties": {
202
+ "action": {
203
+ "type": "string",
204
+ "enum": ["mask", "block", "log", "off"],
205
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
206
+ },
207
+ "inboundAction": {
208
+ "type": "string",
209
+ "enum": ["mask", "block", "log", "off"],
210
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
211
+ },
212
+ "outboundAction": {
213
+ "type": "string",
214
+ "enum": ["mask", "block", "log", "off"],
215
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
216
+ },
217
+ "detection": {
218
+ "type": "string",
219
+ "enum": ["corroborated", "standard", "aggressive"],
220
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
221
+ },
222
+ "mask": {
223
+ "type": "string",
224
+ "default": "[{type}]",
225
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
226
+ },
227
+ "partialMask": {
228
+ "type": "object",
229
+ "title": "DlpPartialMask",
230
+ "additionalProperties": false,
231
+ "required": ["keepLast"],
232
+ "properties": {
233
+ "keepLast": {
234
+ "type": "integer",
235
+ "minimum": 1,
236
+ "maximum": 8,
237
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
238
+ }
239
+ }
240
+ }
241
+ }
242
+ },
243
+ "id-au": {
244
+ "type": "object",
245
+ "title": "DlpRule",
246
+ "additionalProperties": false,
247
+ "properties": {
248
+ "action": {
249
+ "type": "string",
250
+ "enum": ["mask", "block", "log", "off"],
251
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
252
+ },
253
+ "inboundAction": {
254
+ "type": "string",
255
+ "enum": ["mask", "block", "log", "off"],
256
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
257
+ },
258
+ "outboundAction": {
259
+ "type": "string",
260
+ "enum": ["mask", "block", "log", "off"],
261
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
262
+ },
263
+ "detection": {
264
+ "type": "string",
265
+ "enum": ["corroborated", "standard", "aggressive"],
266
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
267
+ },
268
+ "mask": {
269
+ "type": "string",
270
+ "default": "[{type}]",
271
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
272
+ },
273
+ "partialMask": {
274
+ "type": "object",
275
+ "title": "DlpPartialMask",
276
+ "additionalProperties": false,
277
+ "required": ["keepLast"],
278
+ "properties": {
279
+ "keepLast": {
280
+ "type": "integer",
281
+ "minimum": 1,
282
+ "maximum": 8,
283
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
284
+ }
285
+ }
286
+ }
287
+ }
288
+ },
289
+ "id-br": {
290
+ "type": "object",
291
+ "title": "DlpRule",
292
+ "additionalProperties": false,
293
+ "properties": {
294
+ "action": {
295
+ "type": "string",
296
+ "enum": ["mask", "block", "log", "off"],
297
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
298
+ },
299
+ "inboundAction": {
300
+ "type": "string",
301
+ "enum": ["mask", "block", "log", "off"],
302
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
303
+ },
304
+ "outboundAction": {
305
+ "type": "string",
306
+ "enum": ["mask", "block", "log", "off"],
307
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
308
+ },
309
+ "detection": {
310
+ "type": "string",
311
+ "enum": ["corroborated", "standard", "aggressive"],
312
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
313
+ },
314
+ "mask": {
315
+ "type": "string",
316
+ "default": "[{type}]",
317
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
318
+ },
319
+ "partialMask": {
320
+ "type": "object",
321
+ "title": "DlpPartialMask",
322
+ "additionalProperties": false,
323
+ "required": ["keepLast"],
324
+ "properties": {
325
+ "keepLast": {
326
+ "type": "integer",
327
+ "minimum": 1,
328
+ "maximum": 8,
329
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
330
+ }
331
+ }
332
+ }
333
+ }
334
+ },
335
+ "id-ca": {
336
+ "type": "object",
337
+ "title": "DlpRule",
338
+ "additionalProperties": false,
339
+ "properties": {
340
+ "action": {
341
+ "type": "string",
342
+ "enum": ["mask", "block", "log", "off"],
343
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
344
+ },
345
+ "inboundAction": {
346
+ "type": "string",
347
+ "enum": ["mask", "block", "log", "off"],
348
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
349
+ },
350
+ "outboundAction": {
351
+ "type": "string",
352
+ "enum": ["mask", "block", "log", "off"],
353
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
354
+ },
355
+ "detection": {
356
+ "type": "string",
357
+ "enum": ["corroborated", "standard", "aggressive"],
358
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
359
+ },
360
+ "mask": {
361
+ "type": "string",
362
+ "default": "[{type}]",
363
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
364
+ },
365
+ "partialMask": {
366
+ "type": "object",
367
+ "title": "DlpPartialMask",
368
+ "additionalProperties": false,
369
+ "required": ["keepLast"],
370
+ "properties": {
371
+ "keepLast": {
372
+ "type": "integer",
373
+ "minimum": 1,
374
+ "maximum": 8,
375
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
376
+ }
377
+ }
378
+ }
379
+ }
380
+ },
381
+ "id-es": {
382
+ "type": "object",
383
+ "title": "DlpRule",
384
+ "additionalProperties": false,
385
+ "properties": {
386
+ "action": {
387
+ "type": "string",
388
+ "enum": ["mask", "block", "log", "off"],
389
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
390
+ },
391
+ "inboundAction": {
392
+ "type": "string",
393
+ "enum": ["mask", "block", "log", "off"],
394
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
395
+ },
396
+ "outboundAction": {
397
+ "type": "string",
398
+ "enum": ["mask", "block", "log", "off"],
399
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
400
+ },
401
+ "detection": {
402
+ "type": "string",
403
+ "enum": ["corroborated", "standard", "aggressive"],
404
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
405
+ },
406
+ "mask": {
407
+ "type": "string",
408
+ "default": "[{type}]",
409
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
410
+ },
411
+ "partialMask": {
412
+ "type": "object",
413
+ "title": "DlpPartialMask",
414
+ "additionalProperties": false,
415
+ "required": ["keepLast"],
416
+ "properties": {
417
+ "keepLast": {
418
+ "type": "integer",
419
+ "minimum": 1,
420
+ "maximum": 8,
421
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
422
+ }
423
+ }
424
+ }
425
+ }
426
+ },
427
+ "id-fr": {
428
+ "type": "object",
429
+ "title": "DlpRule",
430
+ "additionalProperties": false,
431
+ "properties": {
432
+ "action": {
433
+ "type": "string",
434
+ "enum": ["mask", "block", "log", "off"],
435
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
436
+ },
437
+ "inboundAction": {
438
+ "type": "string",
439
+ "enum": ["mask", "block", "log", "off"],
440
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
441
+ },
442
+ "outboundAction": {
443
+ "type": "string",
444
+ "enum": ["mask", "block", "log", "off"],
445
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
446
+ },
447
+ "detection": {
448
+ "type": "string",
449
+ "enum": ["corroborated", "standard", "aggressive"],
450
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
451
+ },
452
+ "mask": {
453
+ "type": "string",
454
+ "default": "[{type}]",
455
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
456
+ },
457
+ "partialMask": {
458
+ "type": "object",
459
+ "title": "DlpPartialMask",
460
+ "additionalProperties": false,
461
+ "required": ["keepLast"],
462
+ "properties": {
463
+ "keepLast": {
464
+ "type": "integer",
465
+ "minimum": 1,
466
+ "maximum": 8,
467
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
468
+ }
469
+ }
470
+ }
471
+ }
472
+ },
473
+ "id-in": {
474
+ "type": "object",
475
+ "title": "DlpRule",
476
+ "additionalProperties": false,
477
+ "properties": {
478
+ "action": {
479
+ "type": "string",
480
+ "enum": ["mask", "block", "log", "off"],
481
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
482
+ },
483
+ "inboundAction": {
484
+ "type": "string",
485
+ "enum": ["mask", "block", "log", "off"],
486
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
487
+ },
488
+ "outboundAction": {
489
+ "type": "string",
490
+ "enum": ["mask", "block", "log", "off"],
491
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
492
+ },
493
+ "detection": {
494
+ "type": "string",
495
+ "enum": ["corroborated", "standard", "aggressive"],
496
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
497
+ },
498
+ "mask": {
499
+ "type": "string",
500
+ "default": "[{type}]",
501
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
502
+ },
503
+ "partialMask": {
504
+ "type": "object",
505
+ "title": "DlpPartialMask",
506
+ "additionalProperties": false,
507
+ "required": ["keepLast"],
508
+ "properties": {
509
+ "keepLast": {
510
+ "type": "integer",
511
+ "minimum": 1,
512
+ "maximum": 8,
513
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
514
+ }
515
+ }
516
+ }
517
+ }
518
+ },
519
+ "id-it": {
520
+ "type": "object",
521
+ "title": "DlpRule",
522
+ "additionalProperties": false,
523
+ "properties": {
524
+ "action": {
525
+ "type": "string",
526
+ "enum": ["mask", "block", "log", "off"],
527
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
528
+ },
529
+ "inboundAction": {
530
+ "type": "string",
531
+ "enum": ["mask", "block", "log", "off"],
532
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
533
+ },
534
+ "outboundAction": {
535
+ "type": "string",
536
+ "enum": ["mask", "block", "log", "off"],
537
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
538
+ },
539
+ "detection": {
540
+ "type": "string",
541
+ "enum": ["corroborated", "standard", "aggressive"],
542
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
543
+ },
544
+ "mask": {
545
+ "type": "string",
546
+ "default": "[{type}]",
547
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
548
+ },
549
+ "partialMask": {
550
+ "type": "object",
551
+ "title": "DlpPartialMask",
552
+ "additionalProperties": false,
553
+ "required": ["keepLast"],
554
+ "properties": {
555
+ "keepLast": {
556
+ "type": "integer",
557
+ "minimum": 1,
558
+ "maximum": 8,
559
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
560
+ }
561
+ }
562
+ }
563
+ }
564
+ },
565
+ "id-nl": {
566
+ "type": "object",
567
+ "title": "DlpRule",
568
+ "additionalProperties": false,
569
+ "properties": {
570
+ "action": {
571
+ "type": "string",
572
+ "enum": ["mask", "block", "log", "off"],
573
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
574
+ },
575
+ "inboundAction": {
576
+ "type": "string",
577
+ "enum": ["mask", "block", "log", "off"],
578
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
579
+ },
580
+ "outboundAction": {
581
+ "type": "string",
582
+ "enum": ["mask", "block", "log", "off"],
583
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
584
+ },
585
+ "detection": {
586
+ "type": "string",
587
+ "enum": ["corroborated", "standard", "aggressive"],
588
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
589
+ },
590
+ "mask": {
591
+ "type": "string",
592
+ "default": "[{type}]",
593
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
594
+ },
595
+ "partialMask": {
596
+ "type": "object",
597
+ "title": "DlpPartialMask",
598
+ "additionalProperties": false,
599
+ "required": ["keepLast"],
600
+ "properties": {
601
+ "keepLast": {
602
+ "type": "integer",
603
+ "minimum": 1,
604
+ "maximum": 8,
605
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
606
+ }
607
+ }
608
+ }
609
+ }
610
+ },
611
+ "id-pl": {
612
+ "type": "object",
613
+ "title": "DlpRule",
614
+ "additionalProperties": false,
615
+ "properties": {
616
+ "action": {
617
+ "type": "string",
618
+ "enum": ["mask", "block", "log", "off"],
619
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
620
+ },
621
+ "inboundAction": {
622
+ "type": "string",
623
+ "enum": ["mask", "block", "log", "off"],
624
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
625
+ },
626
+ "outboundAction": {
627
+ "type": "string",
628
+ "enum": ["mask", "block", "log", "off"],
629
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
630
+ },
631
+ "detection": {
632
+ "type": "string",
633
+ "enum": ["corroborated", "standard", "aggressive"],
634
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
635
+ },
636
+ "mask": {
637
+ "type": "string",
638
+ "default": "[{type}]",
639
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
640
+ },
641
+ "partialMask": {
642
+ "type": "object",
643
+ "title": "DlpPartialMask",
644
+ "additionalProperties": false,
645
+ "required": ["keepLast"],
646
+ "properties": {
647
+ "keepLast": {
648
+ "type": "integer",
649
+ "minimum": 1,
650
+ "maximum": 8,
651
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
652
+ }
653
+ }
654
+ }
655
+ }
656
+ },
657
+ "id-sg": {
658
+ "type": "object",
659
+ "title": "DlpRule",
660
+ "additionalProperties": false,
661
+ "properties": {
662
+ "action": {
663
+ "type": "string",
664
+ "enum": ["mask", "block", "log", "off"],
665
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
666
+ },
667
+ "inboundAction": {
668
+ "type": "string",
669
+ "enum": ["mask", "block", "log", "off"],
670
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
671
+ },
672
+ "outboundAction": {
673
+ "type": "string",
674
+ "enum": ["mask", "block", "log", "off"],
675
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
676
+ },
677
+ "detection": {
678
+ "type": "string",
679
+ "enum": ["corroborated", "standard", "aggressive"],
680
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
681
+ },
682
+ "mask": {
683
+ "type": "string",
684
+ "default": "[{type}]",
685
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
686
+ },
687
+ "partialMask": {
688
+ "type": "object",
689
+ "title": "DlpPartialMask",
690
+ "additionalProperties": false,
691
+ "required": ["keepLast"],
692
+ "properties": {
693
+ "keepLast": {
694
+ "type": "integer",
695
+ "minimum": 1,
696
+ "maximum": 8,
697
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
698
+ }
699
+ }
700
+ }
701
+ }
702
+ },
703
+ "id-uk": {
704
+ "type": "object",
705
+ "title": "DlpRule",
706
+ "additionalProperties": false,
707
+ "properties": {
708
+ "action": {
709
+ "type": "string",
710
+ "enum": ["mask", "block", "log", "off"],
711
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
712
+ },
713
+ "inboundAction": {
714
+ "type": "string",
715
+ "enum": ["mask", "block", "log", "off"],
716
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
717
+ },
718
+ "outboundAction": {
719
+ "type": "string",
720
+ "enum": ["mask", "block", "log", "off"],
721
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
722
+ },
723
+ "detection": {
724
+ "type": "string",
725
+ "enum": ["corroborated", "standard", "aggressive"],
726
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
727
+ },
728
+ "mask": {
729
+ "type": "string",
730
+ "default": "[{type}]",
731
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
732
+ },
733
+ "partialMask": {
734
+ "type": "object",
735
+ "title": "DlpPartialMask",
736
+ "additionalProperties": false,
737
+ "required": ["keepLast"],
738
+ "properties": {
739
+ "keepLast": {
740
+ "type": "integer",
741
+ "minimum": 1,
742
+ "maximum": 8,
743
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
744
+ }
745
+ }
746
+ }
747
+ }
748
+ },
749
+ "id-us": {
750
+ "type": "object",
751
+ "title": "DlpRule",
752
+ "additionalProperties": false,
753
+ "properties": {
754
+ "action": {
755
+ "type": "string",
756
+ "enum": ["mask", "block", "log", "off"],
757
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
758
+ },
759
+ "inboundAction": {
760
+ "type": "string",
761
+ "enum": ["mask", "block", "log", "off"],
762
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
763
+ },
764
+ "outboundAction": {
765
+ "type": "string",
766
+ "enum": ["mask", "block", "log", "off"],
767
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
768
+ },
769
+ "detection": {
770
+ "type": "string",
771
+ "enum": ["corroborated", "standard", "aggressive"],
772
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
773
+ },
774
+ "mask": {
775
+ "type": "string",
776
+ "default": "[{type}]",
777
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
778
+ },
779
+ "partialMask": {
780
+ "type": "object",
781
+ "title": "DlpPartialMask",
782
+ "additionalProperties": false,
783
+ "required": ["keepLast"],
784
+ "properties": {
785
+ "keepLast": {
786
+ "type": "integer",
787
+ "minimum": 1,
788
+ "maximum": 8,
789
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
790
+ }
791
+ }
792
+ }
793
+ }
794
+ },
795
+ "network": {
796
+ "type": "object",
797
+ "title": "DlpRule",
798
+ "additionalProperties": false,
799
+ "properties": {
800
+ "action": {
801
+ "type": "string",
802
+ "enum": ["mask", "block", "log", "off"],
803
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
804
+ },
805
+ "inboundAction": {
806
+ "type": "string",
807
+ "enum": ["mask", "block", "log", "off"],
808
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
809
+ },
810
+ "outboundAction": {
811
+ "type": "string",
812
+ "enum": ["mask", "block", "log", "off"],
813
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
814
+ },
815
+ "detection": {
816
+ "type": "string",
817
+ "enum": ["corroborated", "standard", "aggressive"],
818
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
819
+ },
820
+ "mask": {
821
+ "type": "string",
822
+ "default": "[{type}]",
823
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
824
+ },
825
+ "partialMask": {
826
+ "type": "object",
827
+ "title": "DlpPartialMask",
828
+ "additionalProperties": false,
829
+ "required": ["keepLast"],
830
+ "properties": {
831
+ "keepLast": {
832
+ "type": "integer",
833
+ "minimum": 1,
834
+ "maximum": 8,
835
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
836
+ }
837
+ }
838
+ }
839
+ }
840
+ },
841
+ "pii": {
842
+ "type": "object",
843
+ "title": "DlpRule",
844
+ "additionalProperties": false,
845
+ "properties": {
846
+ "action": {
847
+ "type": "string",
848
+ "enum": ["mask", "block", "log", "off"],
849
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
850
+ },
851
+ "inboundAction": {
852
+ "type": "string",
853
+ "enum": ["mask", "block", "log", "off"],
854
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
855
+ },
856
+ "outboundAction": {
857
+ "type": "string",
858
+ "enum": ["mask", "block", "log", "off"],
859
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
860
+ },
861
+ "detection": {
862
+ "type": "string",
863
+ "enum": ["corroborated", "standard", "aggressive"],
864
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
865
+ },
866
+ "mask": {
867
+ "type": "string",
868
+ "default": "[{type}]",
869
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
870
+ },
871
+ "partialMask": {
872
+ "type": "object",
873
+ "title": "DlpPartialMask",
874
+ "additionalProperties": false,
875
+ "required": ["keepLast"],
876
+ "properties": {
877
+ "keepLast": {
878
+ "type": "integer",
879
+ "minimum": 1,
880
+ "maximum": 8,
881
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
882
+ }
883
+ }
884
+ }
885
+ }
886
+ },
887
+ "region-eu": {
888
+ "type": "object",
889
+ "title": "DlpRule",
890
+ "additionalProperties": false,
891
+ "properties": {
892
+ "action": {
893
+ "type": "string",
894
+ "enum": ["mask", "block", "log", "off"],
895
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
896
+ },
897
+ "inboundAction": {
898
+ "type": "string",
899
+ "enum": ["mask", "block", "log", "off"],
900
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
901
+ },
902
+ "outboundAction": {
903
+ "type": "string",
904
+ "enum": ["mask", "block", "log", "off"],
905
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
906
+ },
907
+ "detection": {
908
+ "type": "string",
909
+ "enum": ["corroborated", "standard", "aggressive"],
910
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
911
+ },
912
+ "mask": {
913
+ "type": "string",
914
+ "default": "[{type}]",
915
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
916
+ },
917
+ "partialMask": {
918
+ "type": "object",
919
+ "title": "DlpPartialMask",
920
+ "additionalProperties": false,
921
+ "required": ["keepLast"],
922
+ "properties": {
923
+ "keepLast": {
924
+ "type": "integer",
925
+ "minimum": 1,
926
+ "maximum": 8,
927
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
928
+ }
929
+ }
930
+ }
931
+ }
932
+ },
933
+ "secret": {
934
+ "type": "object",
935
+ "title": "DlpRule",
936
+ "additionalProperties": false,
937
+ "properties": {
938
+ "action": {
939
+ "type": "string",
940
+ "enum": ["mask", "block", "log", "off"],
941
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
942
+ },
943
+ "inboundAction": {
944
+ "type": "string",
945
+ "enum": ["mask", "block", "log", "off"],
946
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
947
+ },
948
+ "outboundAction": {
949
+ "type": "string",
950
+ "enum": ["mask", "block", "log", "off"],
951
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
952
+ },
953
+ "detection": {
954
+ "type": "string",
955
+ "enum": ["corroborated", "standard", "aggressive"],
956
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
957
+ },
958
+ "mask": {
959
+ "type": "string",
960
+ "default": "[{type}]",
961
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
962
+ },
963
+ "partialMask": {
964
+ "type": "object",
965
+ "title": "DlpPartialMask",
966
+ "additionalProperties": false,
967
+ "required": ["keepLast"],
968
+ "properties": {
969
+ "keepLast": {
970
+ "type": "integer",
971
+ "minimum": 1,
972
+ "maximum": 8,
973
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
974
+ }
975
+ }
976
+ }
977
+ }
978
+ },
979
+ "secret-aws": {
980
+ "type": "object",
981
+ "title": "DlpRule",
982
+ "additionalProperties": false,
983
+ "properties": {
984
+ "action": {
985
+ "type": "string",
986
+ "enum": ["mask", "block", "log", "off"],
987
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
988
+ },
989
+ "inboundAction": {
990
+ "type": "string",
991
+ "enum": ["mask", "block", "log", "off"],
992
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
993
+ },
994
+ "outboundAction": {
995
+ "type": "string",
996
+ "enum": ["mask", "block", "log", "off"],
997
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
998
+ },
999
+ "detection": {
1000
+ "type": "string",
1001
+ "enum": ["corroborated", "standard", "aggressive"],
1002
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1003
+ },
1004
+ "mask": {
1005
+ "type": "string",
1006
+ "default": "[{type}]",
1007
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1008
+ },
1009
+ "partialMask": {
1010
+ "type": "object",
1011
+ "title": "DlpPartialMask",
1012
+ "additionalProperties": false,
1013
+ "required": ["keepLast"],
1014
+ "properties": {
1015
+ "keepLast": {
1016
+ "type": "integer",
1017
+ "minimum": 1,
1018
+ "maximum": 8,
1019
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1020
+ }
1021
+ }
1022
+ }
1023
+ }
1024
+ },
1025
+ "contact-email": {
1026
+ "type": "object",
1027
+ "title": "DlpRule",
1028
+ "additionalProperties": false,
1029
+ "properties": {
1030
+ "action": {
1031
+ "type": "string",
1032
+ "enum": ["mask", "block", "log", "off"],
1033
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1034
+ },
1035
+ "inboundAction": {
1036
+ "type": "string",
1037
+ "enum": ["mask", "block", "log", "off"],
1038
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1039
+ },
1040
+ "outboundAction": {
1041
+ "type": "string",
1042
+ "enum": ["mask", "block", "log", "off"],
1043
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1044
+ },
1045
+ "detection": {
1046
+ "type": "string",
1047
+ "enum": ["corroborated", "standard", "aggressive"],
1048
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1049
+ },
1050
+ "mask": {
1051
+ "type": "string",
1052
+ "default": "[{type}]",
1053
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1054
+ },
1055
+ "partialMask": {
1056
+ "type": "object",
1057
+ "title": "DlpPartialMask",
1058
+ "additionalProperties": false,
1059
+ "required": ["keepLast"],
1060
+ "properties": {
1061
+ "keepLast": {
1062
+ "type": "integer",
1063
+ "minimum": 1,
1064
+ "maximum": 8,
1065
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ },
1071
+ "contact-phone": {
1072
+ "type": "object",
1073
+ "title": "DlpRule",
1074
+ "additionalProperties": false,
1075
+ "properties": {
1076
+ "action": {
1077
+ "type": "string",
1078
+ "enum": ["mask", "block", "log", "off"],
1079
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1080
+ },
1081
+ "inboundAction": {
1082
+ "type": "string",
1083
+ "enum": ["mask", "block", "log", "off"],
1084
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1085
+ },
1086
+ "outboundAction": {
1087
+ "type": "string",
1088
+ "enum": ["mask", "block", "log", "off"],
1089
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1090
+ },
1091
+ "detection": {
1092
+ "type": "string",
1093
+ "enum": ["corroborated", "standard", "aggressive"],
1094
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1095
+ },
1096
+ "mask": {
1097
+ "type": "string",
1098
+ "default": "[{type}]",
1099
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1100
+ },
1101
+ "partialMask": {
1102
+ "type": "object",
1103
+ "title": "DlpPartialMask",
1104
+ "additionalProperties": false,
1105
+ "required": ["keepLast"],
1106
+ "properties": {
1107
+ "keepLast": {
1108
+ "type": "integer",
1109
+ "minimum": 1,
1110
+ "maximum": 8,
1111
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1112
+ }
1113
+ }
1114
+ }
1115
+ }
1116
+ },
1117
+ "finance-credit-card": {
1118
+ "type": "object",
1119
+ "title": "DlpRule",
1120
+ "additionalProperties": false,
1121
+ "properties": {
1122
+ "action": {
1123
+ "type": "string",
1124
+ "enum": ["mask", "block", "log", "off"],
1125
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1126
+ },
1127
+ "inboundAction": {
1128
+ "type": "string",
1129
+ "enum": ["mask", "block", "log", "off"],
1130
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1131
+ },
1132
+ "outboundAction": {
1133
+ "type": "string",
1134
+ "enum": ["mask", "block", "log", "off"],
1135
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1136
+ },
1137
+ "detection": {
1138
+ "type": "string",
1139
+ "enum": ["corroborated", "standard", "aggressive"],
1140
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1141
+ },
1142
+ "mask": {
1143
+ "type": "string",
1144
+ "default": "[{type}]",
1145
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1146
+ },
1147
+ "partialMask": {
1148
+ "type": "object",
1149
+ "title": "DlpPartialMask",
1150
+ "additionalProperties": false,
1151
+ "required": ["keepLast"],
1152
+ "properties": {
1153
+ "keepLast": {
1154
+ "type": "integer",
1155
+ "minimum": 1,
1156
+ "maximum": 8,
1157
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1158
+ }
1159
+ }
1160
+ }
1161
+ }
1162
+ },
1163
+ "finance-crypto-wallet": {
1164
+ "type": "object",
1165
+ "title": "DlpRule",
1166
+ "additionalProperties": false,
1167
+ "properties": {
1168
+ "action": {
1169
+ "type": "string",
1170
+ "enum": ["mask", "block", "log", "off"],
1171
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1172
+ },
1173
+ "inboundAction": {
1174
+ "type": "string",
1175
+ "enum": ["mask", "block", "log", "off"],
1176
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1177
+ },
1178
+ "outboundAction": {
1179
+ "type": "string",
1180
+ "enum": ["mask", "block", "log", "off"],
1181
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1182
+ },
1183
+ "detection": {
1184
+ "type": "string",
1185
+ "enum": ["corroborated", "standard", "aggressive"],
1186
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1187
+ },
1188
+ "mask": {
1189
+ "type": "string",
1190
+ "default": "[{type}]",
1191
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1192
+ },
1193
+ "partialMask": {
1194
+ "type": "object",
1195
+ "title": "DlpPartialMask",
1196
+ "additionalProperties": false,
1197
+ "required": ["keepLast"],
1198
+ "properties": {
1199
+ "keepLast": {
1200
+ "type": "integer",
1201
+ "minimum": 1,
1202
+ "maximum": 8,
1203
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1204
+ }
1205
+ }
1206
+ }
1207
+ }
1208
+ },
1209
+ "finance-cvv": {
1210
+ "type": "object",
1211
+ "title": "DlpRule",
1212
+ "additionalProperties": false,
1213
+ "properties": {
1214
+ "action": {
1215
+ "type": "string",
1216
+ "enum": ["mask", "block", "log", "off"],
1217
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1218
+ },
1219
+ "inboundAction": {
1220
+ "type": "string",
1221
+ "enum": ["mask", "block", "log", "off"],
1222
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1223
+ },
1224
+ "outboundAction": {
1225
+ "type": "string",
1226
+ "enum": ["mask", "block", "log", "off"],
1227
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1228
+ },
1229
+ "detection": {
1230
+ "type": "string",
1231
+ "enum": ["corroborated", "standard", "aggressive"],
1232
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1233
+ },
1234
+ "mask": {
1235
+ "type": "string",
1236
+ "default": "[{type}]",
1237
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1238
+ },
1239
+ "partialMask": {
1240
+ "type": "object",
1241
+ "title": "DlpPartialMask",
1242
+ "additionalProperties": false,
1243
+ "required": ["keepLast"],
1244
+ "properties": {
1245
+ "keepLast": {
1246
+ "type": "integer",
1247
+ "minimum": 1,
1248
+ "maximum": 8,
1249
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1250
+ }
1251
+ }
1252
+ }
1253
+ }
1254
+ },
1255
+ "finance-iban": {
1256
+ "type": "object",
1257
+ "title": "DlpRule",
1258
+ "additionalProperties": false,
1259
+ "properties": {
1260
+ "action": {
1261
+ "type": "string",
1262
+ "enum": ["mask", "block", "log", "off"],
1263
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1264
+ },
1265
+ "inboundAction": {
1266
+ "type": "string",
1267
+ "enum": ["mask", "block", "log", "off"],
1268
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1269
+ },
1270
+ "outboundAction": {
1271
+ "type": "string",
1272
+ "enum": ["mask", "block", "log", "off"],
1273
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1274
+ },
1275
+ "detection": {
1276
+ "type": "string",
1277
+ "enum": ["corroborated", "standard", "aggressive"],
1278
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1279
+ },
1280
+ "mask": {
1281
+ "type": "string",
1282
+ "default": "[{type}]",
1283
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1284
+ },
1285
+ "partialMask": {
1286
+ "type": "object",
1287
+ "title": "DlpPartialMask",
1288
+ "additionalProperties": false,
1289
+ "required": ["keepLast"],
1290
+ "properties": {
1291
+ "keepLast": {
1292
+ "type": "integer",
1293
+ "minimum": 1,
1294
+ "maximum": 8,
1295
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1296
+ }
1297
+ }
1298
+ }
1299
+ }
1300
+ },
1301
+ "finance-swift-bic": {
1302
+ "type": "object",
1303
+ "title": "DlpRule",
1304
+ "additionalProperties": false,
1305
+ "properties": {
1306
+ "action": {
1307
+ "type": "string",
1308
+ "enum": ["mask", "block", "log", "off"],
1309
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1310
+ },
1311
+ "inboundAction": {
1312
+ "type": "string",
1313
+ "enum": ["mask", "block", "log", "off"],
1314
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1315
+ },
1316
+ "outboundAction": {
1317
+ "type": "string",
1318
+ "enum": ["mask", "block", "log", "off"],
1319
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1320
+ },
1321
+ "detection": {
1322
+ "type": "string",
1323
+ "enum": ["corroborated", "standard", "aggressive"],
1324
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1325
+ },
1326
+ "mask": {
1327
+ "type": "string",
1328
+ "default": "[{type}]",
1329
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1330
+ },
1331
+ "partialMask": {
1332
+ "type": "object",
1333
+ "title": "DlpPartialMask",
1334
+ "additionalProperties": false,
1335
+ "required": ["keepLast"],
1336
+ "properties": {
1337
+ "keepLast": {
1338
+ "type": "integer",
1339
+ "minimum": 1,
1340
+ "maximum": 8,
1341
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1342
+ }
1343
+ }
1344
+ }
1345
+ }
1346
+ },
1347
+ "finance-us-aba-routing": {
1348
+ "type": "object",
1349
+ "title": "DlpRule",
1350
+ "additionalProperties": false,
1351
+ "properties": {
1352
+ "action": {
1353
+ "type": "string",
1354
+ "enum": ["mask", "block", "log", "off"],
1355
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1356
+ },
1357
+ "inboundAction": {
1358
+ "type": "string",
1359
+ "enum": ["mask", "block", "log", "off"],
1360
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1361
+ },
1362
+ "outboundAction": {
1363
+ "type": "string",
1364
+ "enum": ["mask", "block", "log", "off"],
1365
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1366
+ },
1367
+ "detection": {
1368
+ "type": "string",
1369
+ "enum": ["corroborated", "standard", "aggressive"],
1370
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1371
+ },
1372
+ "mask": {
1373
+ "type": "string",
1374
+ "default": "[{type}]",
1375
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1376
+ },
1377
+ "partialMask": {
1378
+ "type": "object",
1379
+ "title": "DlpPartialMask",
1380
+ "additionalProperties": false,
1381
+ "required": ["keepLast"],
1382
+ "properties": {
1383
+ "keepLast": {
1384
+ "type": "integer",
1385
+ "minimum": 1,
1386
+ "maximum": 8,
1387
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1388
+ }
1389
+ }
1390
+ }
1391
+ }
1392
+ },
1393
+ "finance-us-bank-account": {
1394
+ "type": "object",
1395
+ "title": "DlpRule",
1396
+ "additionalProperties": false,
1397
+ "properties": {
1398
+ "action": {
1399
+ "type": "string",
1400
+ "enum": ["mask", "block", "log", "off"],
1401
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1402
+ },
1403
+ "inboundAction": {
1404
+ "type": "string",
1405
+ "enum": ["mask", "block", "log", "off"],
1406
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1407
+ },
1408
+ "outboundAction": {
1409
+ "type": "string",
1410
+ "enum": ["mask", "block", "log", "off"],
1411
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1412
+ },
1413
+ "detection": {
1414
+ "type": "string",
1415
+ "enum": ["corroborated", "standard", "aggressive"],
1416
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1417
+ },
1418
+ "mask": {
1419
+ "type": "string",
1420
+ "default": "[{type}]",
1421
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1422
+ },
1423
+ "partialMask": {
1424
+ "type": "object",
1425
+ "title": "DlpPartialMask",
1426
+ "additionalProperties": false,
1427
+ "required": ["keepLast"],
1428
+ "properties": {
1429
+ "keepLast": {
1430
+ "type": "integer",
1431
+ "minimum": 1,
1432
+ "maximum": 8,
1433
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1434
+ }
1435
+ }
1436
+ }
1437
+ }
1438
+ },
1439
+ "id-au-abn": {
1440
+ "type": "object",
1441
+ "title": "DlpRule",
1442
+ "additionalProperties": false,
1443
+ "properties": {
1444
+ "action": {
1445
+ "type": "string",
1446
+ "enum": ["mask", "block", "log", "off"],
1447
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1448
+ },
1449
+ "inboundAction": {
1450
+ "type": "string",
1451
+ "enum": ["mask", "block", "log", "off"],
1452
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1453
+ },
1454
+ "outboundAction": {
1455
+ "type": "string",
1456
+ "enum": ["mask", "block", "log", "off"],
1457
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1458
+ },
1459
+ "detection": {
1460
+ "type": "string",
1461
+ "enum": ["corroborated", "standard", "aggressive"],
1462
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1463
+ },
1464
+ "mask": {
1465
+ "type": "string",
1466
+ "default": "[{type}]",
1467
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1468
+ },
1469
+ "partialMask": {
1470
+ "type": "object",
1471
+ "title": "DlpPartialMask",
1472
+ "additionalProperties": false,
1473
+ "required": ["keepLast"],
1474
+ "properties": {
1475
+ "keepLast": {
1476
+ "type": "integer",
1477
+ "minimum": 1,
1478
+ "maximum": 8,
1479
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1480
+ }
1481
+ }
1482
+ }
1483
+ }
1484
+ },
1485
+ "id-au-acn": {
1486
+ "type": "object",
1487
+ "title": "DlpRule",
1488
+ "additionalProperties": false,
1489
+ "properties": {
1490
+ "action": {
1491
+ "type": "string",
1492
+ "enum": ["mask", "block", "log", "off"],
1493
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1494
+ },
1495
+ "inboundAction": {
1496
+ "type": "string",
1497
+ "enum": ["mask", "block", "log", "off"],
1498
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1499
+ },
1500
+ "outboundAction": {
1501
+ "type": "string",
1502
+ "enum": ["mask", "block", "log", "off"],
1503
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1504
+ },
1505
+ "detection": {
1506
+ "type": "string",
1507
+ "enum": ["corroborated", "standard", "aggressive"],
1508
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1509
+ },
1510
+ "mask": {
1511
+ "type": "string",
1512
+ "default": "[{type}]",
1513
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1514
+ },
1515
+ "partialMask": {
1516
+ "type": "object",
1517
+ "title": "DlpPartialMask",
1518
+ "additionalProperties": false,
1519
+ "required": ["keepLast"],
1520
+ "properties": {
1521
+ "keepLast": {
1522
+ "type": "integer",
1523
+ "minimum": 1,
1524
+ "maximum": 8,
1525
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1526
+ }
1527
+ }
1528
+ }
1529
+ }
1530
+ },
1531
+ "id-au-medicare": {
1532
+ "type": "object",
1533
+ "title": "DlpRule",
1534
+ "additionalProperties": false,
1535
+ "properties": {
1536
+ "action": {
1537
+ "type": "string",
1538
+ "enum": ["mask", "block", "log", "off"],
1539
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1540
+ },
1541
+ "inboundAction": {
1542
+ "type": "string",
1543
+ "enum": ["mask", "block", "log", "off"],
1544
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1545
+ },
1546
+ "outboundAction": {
1547
+ "type": "string",
1548
+ "enum": ["mask", "block", "log", "off"],
1549
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1550
+ },
1551
+ "detection": {
1552
+ "type": "string",
1553
+ "enum": ["corroborated", "standard", "aggressive"],
1554
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1555
+ },
1556
+ "mask": {
1557
+ "type": "string",
1558
+ "default": "[{type}]",
1559
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1560
+ },
1561
+ "partialMask": {
1562
+ "type": "object",
1563
+ "title": "DlpPartialMask",
1564
+ "additionalProperties": false,
1565
+ "required": ["keepLast"],
1566
+ "properties": {
1567
+ "keepLast": {
1568
+ "type": "integer",
1569
+ "minimum": 1,
1570
+ "maximum": 8,
1571
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1572
+ }
1573
+ }
1574
+ }
1575
+ }
1576
+ },
1577
+ "id-au-tfn": {
1578
+ "type": "object",
1579
+ "title": "DlpRule",
1580
+ "additionalProperties": false,
1581
+ "properties": {
1582
+ "action": {
1583
+ "type": "string",
1584
+ "enum": ["mask", "block", "log", "off"],
1585
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1586
+ },
1587
+ "inboundAction": {
1588
+ "type": "string",
1589
+ "enum": ["mask", "block", "log", "off"],
1590
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1591
+ },
1592
+ "outboundAction": {
1593
+ "type": "string",
1594
+ "enum": ["mask", "block", "log", "off"],
1595
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1596
+ },
1597
+ "detection": {
1598
+ "type": "string",
1599
+ "enum": ["corroborated", "standard", "aggressive"],
1600
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1601
+ },
1602
+ "mask": {
1603
+ "type": "string",
1604
+ "default": "[{type}]",
1605
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1606
+ },
1607
+ "partialMask": {
1608
+ "type": "object",
1609
+ "title": "DlpPartialMask",
1610
+ "additionalProperties": false,
1611
+ "required": ["keepLast"],
1612
+ "properties": {
1613
+ "keepLast": {
1614
+ "type": "integer",
1615
+ "minimum": 1,
1616
+ "maximum": 8,
1617
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1618
+ }
1619
+ }
1620
+ }
1621
+ }
1622
+ },
1623
+ "id-br-cpf": {
1624
+ "type": "object",
1625
+ "title": "DlpRule",
1626
+ "additionalProperties": false,
1627
+ "properties": {
1628
+ "action": {
1629
+ "type": "string",
1630
+ "enum": ["mask", "block", "log", "off"],
1631
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1632
+ },
1633
+ "inboundAction": {
1634
+ "type": "string",
1635
+ "enum": ["mask", "block", "log", "off"],
1636
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1637
+ },
1638
+ "outboundAction": {
1639
+ "type": "string",
1640
+ "enum": ["mask", "block", "log", "off"],
1641
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1642
+ },
1643
+ "detection": {
1644
+ "type": "string",
1645
+ "enum": ["corroborated", "standard", "aggressive"],
1646
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1647
+ },
1648
+ "mask": {
1649
+ "type": "string",
1650
+ "default": "[{type}]",
1651
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1652
+ },
1653
+ "partialMask": {
1654
+ "type": "object",
1655
+ "title": "DlpPartialMask",
1656
+ "additionalProperties": false,
1657
+ "required": ["keepLast"],
1658
+ "properties": {
1659
+ "keepLast": {
1660
+ "type": "integer",
1661
+ "minimum": 1,
1662
+ "maximum": 8,
1663
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1664
+ }
1665
+ }
1666
+ }
1667
+ }
1668
+ },
1669
+ "id-ca-sin": {
1670
+ "type": "object",
1671
+ "title": "DlpRule",
1672
+ "additionalProperties": false,
1673
+ "properties": {
1674
+ "action": {
1675
+ "type": "string",
1676
+ "enum": ["mask", "block", "log", "off"],
1677
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1678
+ },
1679
+ "inboundAction": {
1680
+ "type": "string",
1681
+ "enum": ["mask", "block", "log", "off"],
1682
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1683
+ },
1684
+ "outboundAction": {
1685
+ "type": "string",
1686
+ "enum": ["mask", "block", "log", "off"],
1687
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1688
+ },
1689
+ "detection": {
1690
+ "type": "string",
1691
+ "enum": ["corroborated", "standard", "aggressive"],
1692
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1693
+ },
1694
+ "mask": {
1695
+ "type": "string",
1696
+ "default": "[{type}]",
1697
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1698
+ },
1699
+ "partialMask": {
1700
+ "type": "object",
1701
+ "title": "DlpPartialMask",
1702
+ "additionalProperties": false,
1703
+ "required": ["keepLast"],
1704
+ "properties": {
1705
+ "keepLast": {
1706
+ "type": "integer",
1707
+ "minimum": 1,
1708
+ "maximum": 8,
1709
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1710
+ }
1711
+ }
1712
+ }
1713
+ }
1714
+ },
1715
+ "id-es-nif": {
1716
+ "type": "object",
1717
+ "title": "DlpRule",
1718
+ "additionalProperties": false,
1719
+ "properties": {
1720
+ "action": {
1721
+ "type": "string",
1722
+ "enum": ["mask", "block", "log", "off"],
1723
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1724
+ },
1725
+ "inboundAction": {
1726
+ "type": "string",
1727
+ "enum": ["mask", "block", "log", "off"],
1728
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1729
+ },
1730
+ "outboundAction": {
1731
+ "type": "string",
1732
+ "enum": ["mask", "block", "log", "off"],
1733
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1734
+ },
1735
+ "detection": {
1736
+ "type": "string",
1737
+ "enum": ["corroborated", "standard", "aggressive"],
1738
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1739
+ },
1740
+ "mask": {
1741
+ "type": "string",
1742
+ "default": "[{type}]",
1743
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1744
+ },
1745
+ "partialMask": {
1746
+ "type": "object",
1747
+ "title": "DlpPartialMask",
1748
+ "additionalProperties": false,
1749
+ "required": ["keepLast"],
1750
+ "properties": {
1751
+ "keepLast": {
1752
+ "type": "integer",
1753
+ "minimum": 1,
1754
+ "maximum": 8,
1755
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1756
+ }
1757
+ }
1758
+ }
1759
+ }
1760
+ },
1761
+ "id-fr-nir": {
1762
+ "type": "object",
1763
+ "title": "DlpRule",
1764
+ "additionalProperties": false,
1765
+ "properties": {
1766
+ "action": {
1767
+ "type": "string",
1768
+ "enum": ["mask", "block", "log", "off"],
1769
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1770
+ },
1771
+ "inboundAction": {
1772
+ "type": "string",
1773
+ "enum": ["mask", "block", "log", "off"],
1774
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1775
+ },
1776
+ "outboundAction": {
1777
+ "type": "string",
1778
+ "enum": ["mask", "block", "log", "off"],
1779
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1780
+ },
1781
+ "detection": {
1782
+ "type": "string",
1783
+ "enum": ["corroborated", "standard", "aggressive"],
1784
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1785
+ },
1786
+ "mask": {
1787
+ "type": "string",
1788
+ "default": "[{type}]",
1789
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1790
+ },
1791
+ "partialMask": {
1792
+ "type": "object",
1793
+ "title": "DlpPartialMask",
1794
+ "additionalProperties": false,
1795
+ "required": ["keepLast"],
1796
+ "properties": {
1797
+ "keepLast": {
1798
+ "type": "integer",
1799
+ "minimum": 1,
1800
+ "maximum": 8,
1801
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1802
+ }
1803
+ }
1804
+ }
1805
+ }
1806
+ },
1807
+ "id-in-aadhaar": {
1808
+ "type": "object",
1809
+ "title": "DlpRule",
1810
+ "additionalProperties": false,
1811
+ "properties": {
1812
+ "action": {
1813
+ "type": "string",
1814
+ "enum": ["mask", "block", "log", "off"],
1815
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1816
+ },
1817
+ "inboundAction": {
1818
+ "type": "string",
1819
+ "enum": ["mask", "block", "log", "off"],
1820
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1821
+ },
1822
+ "outboundAction": {
1823
+ "type": "string",
1824
+ "enum": ["mask", "block", "log", "off"],
1825
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1826
+ },
1827
+ "detection": {
1828
+ "type": "string",
1829
+ "enum": ["corroborated", "standard", "aggressive"],
1830
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1831
+ },
1832
+ "mask": {
1833
+ "type": "string",
1834
+ "default": "[{type}]",
1835
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1836
+ },
1837
+ "partialMask": {
1838
+ "type": "object",
1839
+ "title": "DlpPartialMask",
1840
+ "additionalProperties": false,
1841
+ "required": ["keepLast"],
1842
+ "properties": {
1843
+ "keepLast": {
1844
+ "type": "integer",
1845
+ "minimum": 1,
1846
+ "maximum": 8,
1847
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1848
+ }
1849
+ }
1850
+ }
1851
+ }
1852
+ },
1853
+ "id-in-pan": {
1854
+ "type": "object",
1855
+ "title": "DlpRule",
1856
+ "additionalProperties": false,
1857
+ "properties": {
1858
+ "action": {
1859
+ "type": "string",
1860
+ "enum": ["mask", "block", "log", "off"],
1861
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1862
+ },
1863
+ "inboundAction": {
1864
+ "type": "string",
1865
+ "enum": ["mask", "block", "log", "off"],
1866
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1867
+ },
1868
+ "outboundAction": {
1869
+ "type": "string",
1870
+ "enum": ["mask", "block", "log", "off"],
1871
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1872
+ },
1873
+ "detection": {
1874
+ "type": "string",
1875
+ "enum": ["corroborated", "standard", "aggressive"],
1876
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1877
+ },
1878
+ "mask": {
1879
+ "type": "string",
1880
+ "default": "[{type}]",
1881
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1882
+ },
1883
+ "partialMask": {
1884
+ "type": "object",
1885
+ "title": "DlpPartialMask",
1886
+ "additionalProperties": false,
1887
+ "required": ["keepLast"],
1888
+ "properties": {
1889
+ "keepLast": {
1890
+ "type": "integer",
1891
+ "minimum": 1,
1892
+ "maximum": 8,
1893
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1894
+ }
1895
+ }
1896
+ }
1897
+ }
1898
+ },
1899
+ "id-it-fiscal-code": {
1900
+ "type": "object",
1901
+ "title": "DlpRule",
1902
+ "additionalProperties": false,
1903
+ "properties": {
1904
+ "action": {
1905
+ "type": "string",
1906
+ "enum": ["mask", "block", "log", "off"],
1907
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1908
+ },
1909
+ "inboundAction": {
1910
+ "type": "string",
1911
+ "enum": ["mask", "block", "log", "off"],
1912
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1913
+ },
1914
+ "outboundAction": {
1915
+ "type": "string",
1916
+ "enum": ["mask", "block", "log", "off"],
1917
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1918
+ },
1919
+ "detection": {
1920
+ "type": "string",
1921
+ "enum": ["corroborated", "standard", "aggressive"],
1922
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1923
+ },
1924
+ "mask": {
1925
+ "type": "string",
1926
+ "default": "[{type}]",
1927
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1928
+ },
1929
+ "partialMask": {
1930
+ "type": "object",
1931
+ "title": "DlpPartialMask",
1932
+ "additionalProperties": false,
1933
+ "required": ["keepLast"],
1934
+ "properties": {
1935
+ "keepLast": {
1936
+ "type": "integer",
1937
+ "minimum": 1,
1938
+ "maximum": 8,
1939
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1940
+ }
1941
+ }
1942
+ }
1943
+ }
1944
+ },
1945
+ "id-nl-bsn": {
1946
+ "type": "object",
1947
+ "title": "DlpRule",
1948
+ "additionalProperties": false,
1949
+ "properties": {
1950
+ "action": {
1951
+ "type": "string",
1952
+ "enum": ["mask", "block", "log", "off"],
1953
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
1954
+ },
1955
+ "inboundAction": {
1956
+ "type": "string",
1957
+ "enum": ["mask", "block", "log", "off"],
1958
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
1959
+ },
1960
+ "outboundAction": {
1961
+ "type": "string",
1962
+ "enum": ["mask", "block", "log", "off"],
1963
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
1964
+ },
1965
+ "detection": {
1966
+ "type": "string",
1967
+ "enum": ["corroborated", "standard", "aggressive"],
1968
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
1969
+ },
1970
+ "mask": {
1971
+ "type": "string",
1972
+ "default": "[{type}]",
1973
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
1974
+ },
1975
+ "partialMask": {
1976
+ "type": "object",
1977
+ "title": "DlpPartialMask",
1978
+ "additionalProperties": false,
1979
+ "required": ["keepLast"],
1980
+ "properties": {
1981
+ "keepLast": {
1982
+ "type": "integer",
1983
+ "minimum": 1,
1984
+ "maximum": 8,
1985
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
1986
+ }
1987
+ }
1988
+ }
1989
+ }
1990
+ },
1991
+ "id-pl-pesel": {
1992
+ "type": "object",
1993
+ "title": "DlpRule",
1994
+ "additionalProperties": false,
1995
+ "properties": {
1996
+ "action": {
1997
+ "type": "string",
1998
+ "enum": ["mask", "block", "log", "off"],
1999
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2000
+ },
2001
+ "inboundAction": {
2002
+ "type": "string",
2003
+ "enum": ["mask", "block", "log", "off"],
2004
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2005
+ },
2006
+ "outboundAction": {
2007
+ "type": "string",
2008
+ "enum": ["mask", "block", "log", "off"],
2009
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2010
+ },
2011
+ "detection": {
2012
+ "type": "string",
2013
+ "enum": ["corroborated", "standard", "aggressive"],
2014
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2015
+ },
2016
+ "mask": {
2017
+ "type": "string",
2018
+ "default": "[{type}]",
2019
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2020
+ },
2021
+ "partialMask": {
2022
+ "type": "object",
2023
+ "title": "DlpPartialMask",
2024
+ "additionalProperties": false,
2025
+ "required": ["keepLast"],
2026
+ "properties": {
2027
+ "keepLast": {
2028
+ "type": "integer",
2029
+ "minimum": 1,
2030
+ "maximum": 8,
2031
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2032
+ }
2033
+ }
2034
+ }
2035
+ }
2036
+ },
2037
+ "id-sg-nric": {
2038
+ "type": "object",
2039
+ "title": "DlpRule",
2040
+ "additionalProperties": false,
2041
+ "properties": {
2042
+ "action": {
2043
+ "type": "string",
2044
+ "enum": ["mask", "block", "log", "off"],
2045
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2046
+ },
2047
+ "inboundAction": {
2048
+ "type": "string",
2049
+ "enum": ["mask", "block", "log", "off"],
2050
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2051
+ },
2052
+ "outboundAction": {
2053
+ "type": "string",
2054
+ "enum": ["mask", "block", "log", "off"],
2055
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2056
+ },
2057
+ "detection": {
2058
+ "type": "string",
2059
+ "enum": ["corroborated", "standard", "aggressive"],
2060
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2061
+ },
2062
+ "mask": {
2063
+ "type": "string",
2064
+ "default": "[{type}]",
2065
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2066
+ },
2067
+ "partialMask": {
2068
+ "type": "object",
2069
+ "title": "DlpPartialMask",
2070
+ "additionalProperties": false,
2071
+ "required": ["keepLast"],
2072
+ "properties": {
2073
+ "keepLast": {
2074
+ "type": "integer",
2075
+ "minimum": 1,
2076
+ "maximum": 8,
2077
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2078
+ }
2079
+ }
2080
+ }
2081
+ }
2082
+ },
2083
+ "id-uk-nhs": {
2084
+ "type": "object",
2085
+ "title": "DlpRule",
2086
+ "additionalProperties": false,
2087
+ "properties": {
2088
+ "action": {
2089
+ "type": "string",
2090
+ "enum": ["mask", "block", "log", "off"],
2091
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2092
+ },
2093
+ "inboundAction": {
2094
+ "type": "string",
2095
+ "enum": ["mask", "block", "log", "off"],
2096
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2097
+ },
2098
+ "outboundAction": {
2099
+ "type": "string",
2100
+ "enum": ["mask", "block", "log", "off"],
2101
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2102
+ },
2103
+ "detection": {
2104
+ "type": "string",
2105
+ "enum": ["corroborated", "standard", "aggressive"],
2106
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2107
+ },
2108
+ "mask": {
2109
+ "type": "string",
2110
+ "default": "[{type}]",
2111
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2112
+ },
2113
+ "partialMask": {
2114
+ "type": "object",
2115
+ "title": "DlpPartialMask",
2116
+ "additionalProperties": false,
2117
+ "required": ["keepLast"],
2118
+ "properties": {
2119
+ "keepLast": {
2120
+ "type": "integer",
2121
+ "minimum": 1,
2122
+ "maximum": 8,
2123
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2124
+ }
2125
+ }
2126
+ }
2127
+ }
2128
+ },
2129
+ "id-uk-nino": {
2130
+ "type": "object",
2131
+ "title": "DlpRule",
2132
+ "additionalProperties": false,
2133
+ "properties": {
2134
+ "action": {
2135
+ "type": "string",
2136
+ "enum": ["mask", "block", "log", "off"],
2137
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2138
+ },
2139
+ "inboundAction": {
2140
+ "type": "string",
2141
+ "enum": ["mask", "block", "log", "off"],
2142
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2143
+ },
2144
+ "outboundAction": {
2145
+ "type": "string",
2146
+ "enum": ["mask", "block", "log", "off"],
2147
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2148
+ },
2149
+ "detection": {
2150
+ "type": "string",
2151
+ "enum": ["corroborated", "standard", "aggressive"],
2152
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2153
+ },
2154
+ "mask": {
2155
+ "type": "string",
2156
+ "default": "[{type}]",
2157
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2158
+ },
2159
+ "partialMask": {
2160
+ "type": "object",
2161
+ "title": "DlpPartialMask",
2162
+ "additionalProperties": false,
2163
+ "required": ["keepLast"],
2164
+ "properties": {
2165
+ "keepLast": {
2166
+ "type": "integer",
2167
+ "minimum": 1,
2168
+ "maximum": 8,
2169
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2170
+ }
2171
+ }
2172
+ }
2173
+ }
2174
+ },
2175
+ "id-us-itin": {
2176
+ "type": "object",
2177
+ "title": "DlpRule",
2178
+ "additionalProperties": false,
2179
+ "properties": {
2180
+ "action": {
2181
+ "type": "string",
2182
+ "enum": ["mask", "block", "log", "off"],
2183
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2184
+ },
2185
+ "inboundAction": {
2186
+ "type": "string",
2187
+ "enum": ["mask", "block", "log", "off"],
2188
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2189
+ },
2190
+ "outboundAction": {
2191
+ "type": "string",
2192
+ "enum": ["mask", "block", "log", "off"],
2193
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2194
+ },
2195
+ "detection": {
2196
+ "type": "string",
2197
+ "enum": ["corroborated", "standard", "aggressive"],
2198
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2199
+ },
2200
+ "mask": {
2201
+ "type": "string",
2202
+ "default": "[{type}]",
2203
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2204
+ },
2205
+ "partialMask": {
2206
+ "type": "object",
2207
+ "title": "DlpPartialMask",
2208
+ "additionalProperties": false,
2209
+ "required": ["keepLast"],
2210
+ "properties": {
2211
+ "keepLast": {
2212
+ "type": "integer",
2213
+ "minimum": 1,
2214
+ "maximum": 8,
2215
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2216
+ }
2217
+ }
2218
+ }
2219
+ }
2220
+ },
2221
+ "id-us-passport": {
2222
+ "type": "object",
2223
+ "title": "DlpRule",
2224
+ "additionalProperties": false,
2225
+ "properties": {
2226
+ "action": {
2227
+ "type": "string",
2228
+ "enum": ["mask", "block", "log", "off"],
2229
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2230
+ },
2231
+ "inboundAction": {
2232
+ "type": "string",
2233
+ "enum": ["mask", "block", "log", "off"],
2234
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2235
+ },
2236
+ "outboundAction": {
2237
+ "type": "string",
2238
+ "enum": ["mask", "block", "log", "off"],
2239
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2240
+ },
2241
+ "detection": {
2242
+ "type": "string",
2243
+ "enum": ["corroborated", "standard", "aggressive"],
2244
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2245
+ },
2246
+ "mask": {
2247
+ "type": "string",
2248
+ "default": "[{type}]",
2249
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2250
+ },
2251
+ "partialMask": {
2252
+ "type": "object",
2253
+ "title": "DlpPartialMask",
2254
+ "additionalProperties": false,
2255
+ "required": ["keepLast"],
2256
+ "properties": {
2257
+ "keepLast": {
2258
+ "type": "integer",
2259
+ "minimum": 1,
2260
+ "maximum": 8,
2261
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2262
+ }
2263
+ }
2264
+ }
2265
+ }
2266
+ },
2267
+ "id-us-ssn": {
2268
+ "type": "object",
2269
+ "title": "DlpRule",
2270
+ "additionalProperties": false,
2271
+ "properties": {
2272
+ "action": {
2273
+ "type": "string",
2274
+ "enum": ["mask", "block", "log", "off"],
2275
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2276
+ },
2277
+ "inboundAction": {
2278
+ "type": "string",
2279
+ "enum": ["mask", "block", "log", "off"],
2280
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2281
+ },
2282
+ "outboundAction": {
2283
+ "type": "string",
2284
+ "enum": ["mask", "block", "log", "off"],
2285
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2286
+ },
2287
+ "detection": {
2288
+ "type": "string",
2289
+ "enum": ["corroborated", "standard", "aggressive"],
2290
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2291
+ },
2292
+ "mask": {
2293
+ "type": "string",
2294
+ "default": "[{type}]",
2295
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2296
+ },
2297
+ "partialMask": {
2298
+ "type": "object",
2299
+ "title": "DlpPartialMask",
2300
+ "additionalProperties": false,
2301
+ "required": ["keepLast"],
2302
+ "properties": {
2303
+ "keepLast": {
2304
+ "type": "integer",
2305
+ "minimum": 1,
2306
+ "maximum": 8,
2307
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2308
+ }
2309
+ }
2310
+ }
2311
+ }
2312
+ },
2313
+ "network-ipv4": {
2314
+ "type": "object",
2315
+ "title": "DlpRule",
2316
+ "additionalProperties": false,
2317
+ "properties": {
2318
+ "action": {
2319
+ "type": "string",
2320
+ "enum": ["mask", "block", "log", "off"],
2321
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2322
+ },
2323
+ "inboundAction": {
2324
+ "type": "string",
2325
+ "enum": ["mask", "block", "log", "off"],
2326
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2327
+ },
2328
+ "outboundAction": {
2329
+ "type": "string",
2330
+ "enum": ["mask", "block", "log", "off"],
2331
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2332
+ },
2333
+ "detection": {
2334
+ "type": "string",
2335
+ "enum": ["corroborated", "standard", "aggressive"],
2336
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2337
+ },
2338
+ "mask": {
2339
+ "type": "string",
2340
+ "default": "[{type}]",
2341
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2342
+ },
2343
+ "partialMask": {
2344
+ "type": "object",
2345
+ "title": "DlpPartialMask",
2346
+ "additionalProperties": false,
2347
+ "required": ["keepLast"],
2348
+ "properties": {
2349
+ "keepLast": {
2350
+ "type": "integer",
2351
+ "minimum": 1,
2352
+ "maximum": 8,
2353
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2354
+ }
2355
+ }
2356
+ }
2357
+ }
2358
+ },
2359
+ "network-ipv6": {
2360
+ "type": "object",
2361
+ "title": "DlpRule",
2362
+ "additionalProperties": false,
2363
+ "properties": {
2364
+ "action": {
2365
+ "type": "string",
2366
+ "enum": ["mask", "block", "log", "off"],
2367
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2368
+ },
2369
+ "inboundAction": {
2370
+ "type": "string",
2371
+ "enum": ["mask", "block", "log", "off"],
2372
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2373
+ },
2374
+ "outboundAction": {
2375
+ "type": "string",
2376
+ "enum": ["mask", "block", "log", "off"],
2377
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2378
+ },
2379
+ "detection": {
2380
+ "type": "string",
2381
+ "enum": ["corroborated", "standard", "aggressive"],
2382
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2383
+ },
2384
+ "mask": {
2385
+ "type": "string",
2386
+ "default": "[{type}]",
2387
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2388
+ },
2389
+ "partialMask": {
2390
+ "type": "object",
2391
+ "title": "DlpPartialMask",
2392
+ "additionalProperties": false,
2393
+ "required": ["keepLast"],
2394
+ "properties": {
2395
+ "keepLast": {
2396
+ "type": "integer",
2397
+ "minimum": 1,
2398
+ "maximum": 8,
2399
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2400
+ }
2401
+ }
2402
+ }
2403
+ }
2404
+ },
2405
+ "network-mac": {
2406
+ "type": "object",
2407
+ "title": "DlpRule",
2408
+ "additionalProperties": false,
2409
+ "properties": {
2410
+ "action": {
2411
+ "type": "string",
2412
+ "enum": ["mask", "block", "log", "off"],
2413
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2414
+ },
2415
+ "inboundAction": {
2416
+ "type": "string",
2417
+ "enum": ["mask", "block", "log", "off"],
2418
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2419
+ },
2420
+ "outboundAction": {
2421
+ "type": "string",
2422
+ "enum": ["mask", "block", "log", "off"],
2423
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2424
+ },
2425
+ "detection": {
2426
+ "type": "string",
2427
+ "enum": ["corroborated", "standard", "aggressive"],
2428
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2429
+ },
2430
+ "mask": {
2431
+ "type": "string",
2432
+ "default": "[{type}]",
2433
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2434
+ },
2435
+ "partialMask": {
2436
+ "type": "object",
2437
+ "title": "DlpPartialMask",
2438
+ "additionalProperties": false,
2439
+ "required": ["keepLast"],
2440
+ "properties": {
2441
+ "keepLast": {
2442
+ "type": "integer",
2443
+ "minimum": 1,
2444
+ "maximum": 8,
2445
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2446
+ }
2447
+ }
2448
+ }
2449
+ }
2450
+ },
2451
+ "secret-anthropic": {
2452
+ "type": "object",
2453
+ "title": "DlpRule",
2454
+ "additionalProperties": false,
2455
+ "properties": {
2456
+ "action": {
2457
+ "type": "string",
2458
+ "enum": ["mask", "block", "log", "off"],
2459
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2460
+ },
2461
+ "inboundAction": {
2462
+ "type": "string",
2463
+ "enum": ["mask", "block", "log", "off"],
2464
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2465
+ },
2466
+ "outboundAction": {
2467
+ "type": "string",
2468
+ "enum": ["mask", "block", "log", "off"],
2469
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2470
+ },
2471
+ "detection": {
2472
+ "type": "string",
2473
+ "enum": ["corroborated", "standard", "aggressive"],
2474
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2475
+ },
2476
+ "mask": {
2477
+ "type": "string",
2478
+ "default": "[{type}]",
2479
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2480
+ },
2481
+ "partialMask": {
2482
+ "type": "object",
2483
+ "title": "DlpPartialMask",
2484
+ "additionalProperties": false,
2485
+ "required": ["keepLast"],
2486
+ "properties": {
2487
+ "keepLast": {
2488
+ "type": "integer",
2489
+ "minimum": 1,
2490
+ "maximum": 8,
2491
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2492
+ }
2493
+ }
2494
+ }
2495
+ }
2496
+ },
2497
+ "secret-aws-access-key": {
2498
+ "type": "object",
2499
+ "title": "DlpRule",
2500
+ "additionalProperties": false,
2501
+ "properties": {
2502
+ "action": {
2503
+ "type": "string",
2504
+ "enum": ["mask", "block", "log", "off"],
2505
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2506
+ },
2507
+ "inboundAction": {
2508
+ "type": "string",
2509
+ "enum": ["mask", "block", "log", "off"],
2510
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2511
+ },
2512
+ "outboundAction": {
2513
+ "type": "string",
2514
+ "enum": ["mask", "block", "log", "off"],
2515
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2516
+ },
2517
+ "detection": {
2518
+ "type": "string",
2519
+ "enum": ["corroborated", "standard", "aggressive"],
2520
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2521
+ },
2522
+ "mask": {
2523
+ "type": "string",
2524
+ "default": "[{type}]",
2525
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2526
+ },
2527
+ "partialMask": {
2528
+ "type": "object",
2529
+ "title": "DlpPartialMask",
2530
+ "additionalProperties": false,
2531
+ "required": ["keepLast"],
2532
+ "properties": {
2533
+ "keepLast": {
2534
+ "type": "integer",
2535
+ "minimum": 1,
2536
+ "maximum": 8,
2537
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2538
+ }
2539
+ }
2540
+ }
2541
+ }
2542
+ },
2543
+ "secret-aws-bedrock": {
2544
+ "type": "object",
2545
+ "title": "DlpRule",
2546
+ "additionalProperties": false,
2547
+ "properties": {
2548
+ "action": {
2549
+ "type": "string",
2550
+ "enum": ["mask", "block", "log", "off"],
2551
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2552
+ },
2553
+ "inboundAction": {
2554
+ "type": "string",
2555
+ "enum": ["mask", "block", "log", "off"],
2556
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2557
+ },
2558
+ "outboundAction": {
2559
+ "type": "string",
2560
+ "enum": ["mask", "block", "log", "off"],
2561
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2562
+ },
2563
+ "detection": {
2564
+ "type": "string",
2565
+ "enum": ["corroborated", "standard", "aggressive"],
2566
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2567
+ },
2568
+ "mask": {
2569
+ "type": "string",
2570
+ "default": "[{type}]",
2571
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2572
+ },
2573
+ "partialMask": {
2574
+ "type": "object",
2575
+ "title": "DlpPartialMask",
2576
+ "additionalProperties": false,
2577
+ "required": ["keepLast"],
2578
+ "properties": {
2579
+ "keepLast": {
2580
+ "type": "integer",
2581
+ "minimum": 1,
2582
+ "maximum": 8,
2583
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2584
+ }
2585
+ }
2586
+ }
2587
+ }
2588
+ },
2589
+ "secret-azure-client": {
2590
+ "type": "object",
2591
+ "title": "DlpRule",
2592
+ "additionalProperties": false,
2593
+ "properties": {
2594
+ "action": {
2595
+ "type": "string",
2596
+ "enum": ["mask", "block", "log", "off"],
2597
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2598
+ },
2599
+ "inboundAction": {
2600
+ "type": "string",
2601
+ "enum": ["mask", "block", "log", "off"],
2602
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2603
+ },
2604
+ "outboundAction": {
2605
+ "type": "string",
2606
+ "enum": ["mask", "block", "log", "off"],
2607
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2608
+ },
2609
+ "detection": {
2610
+ "type": "string",
2611
+ "enum": ["corroborated", "standard", "aggressive"],
2612
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2613
+ },
2614
+ "mask": {
2615
+ "type": "string",
2616
+ "default": "[{type}]",
2617
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2618
+ },
2619
+ "partialMask": {
2620
+ "type": "object",
2621
+ "title": "DlpPartialMask",
2622
+ "additionalProperties": false,
2623
+ "required": ["keepLast"],
2624
+ "properties": {
2625
+ "keepLast": {
2626
+ "type": "integer",
2627
+ "minimum": 1,
2628
+ "maximum": 8,
2629
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2630
+ }
2631
+ }
2632
+ }
2633
+ }
2634
+ },
2635
+ "secret-databricks": {
2636
+ "type": "object",
2637
+ "title": "DlpRule",
2638
+ "additionalProperties": false,
2639
+ "properties": {
2640
+ "action": {
2641
+ "type": "string",
2642
+ "enum": ["mask", "block", "log", "off"],
2643
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2644
+ },
2645
+ "inboundAction": {
2646
+ "type": "string",
2647
+ "enum": ["mask", "block", "log", "off"],
2648
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2649
+ },
2650
+ "outboundAction": {
2651
+ "type": "string",
2652
+ "enum": ["mask", "block", "log", "off"],
2653
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2654
+ },
2655
+ "detection": {
2656
+ "type": "string",
2657
+ "enum": ["corroborated", "standard", "aggressive"],
2658
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2659
+ },
2660
+ "mask": {
2661
+ "type": "string",
2662
+ "default": "[{type}]",
2663
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2664
+ },
2665
+ "partialMask": {
2666
+ "type": "object",
2667
+ "title": "DlpPartialMask",
2668
+ "additionalProperties": false,
2669
+ "required": ["keepLast"],
2670
+ "properties": {
2671
+ "keepLast": {
2672
+ "type": "integer",
2673
+ "minimum": 1,
2674
+ "maximum": 8,
2675
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2676
+ }
2677
+ }
2678
+ }
2679
+ }
2680
+ },
2681
+ "secret-digitalocean": {
2682
+ "type": "object",
2683
+ "title": "DlpRule",
2684
+ "additionalProperties": false,
2685
+ "properties": {
2686
+ "action": {
2687
+ "type": "string",
2688
+ "enum": ["mask", "block", "log", "off"],
2689
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2690
+ },
2691
+ "inboundAction": {
2692
+ "type": "string",
2693
+ "enum": ["mask", "block", "log", "off"],
2694
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2695
+ },
2696
+ "outboundAction": {
2697
+ "type": "string",
2698
+ "enum": ["mask", "block", "log", "off"],
2699
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2700
+ },
2701
+ "detection": {
2702
+ "type": "string",
2703
+ "enum": ["corroborated", "standard", "aggressive"],
2704
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2705
+ },
2706
+ "mask": {
2707
+ "type": "string",
2708
+ "default": "[{type}]",
2709
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2710
+ },
2711
+ "partialMask": {
2712
+ "type": "object",
2713
+ "title": "DlpPartialMask",
2714
+ "additionalProperties": false,
2715
+ "required": ["keepLast"],
2716
+ "properties": {
2717
+ "keepLast": {
2718
+ "type": "integer",
2719
+ "minimum": 1,
2720
+ "maximum": 8,
2721
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2722
+ }
2723
+ }
2724
+ }
2725
+ }
2726
+ },
2727
+ "secret-discord-webhook": {
2728
+ "type": "object",
2729
+ "title": "DlpRule",
2730
+ "additionalProperties": false,
2731
+ "properties": {
2732
+ "action": {
2733
+ "type": "string",
2734
+ "enum": ["mask", "block", "log", "off"],
2735
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2736
+ },
2737
+ "inboundAction": {
2738
+ "type": "string",
2739
+ "enum": ["mask", "block", "log", "off"],
2740
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2741
+ },
2742
+ "outboundAction": {
2743
+ "type": "string",
2744
+ "enum": ["mask", "block", "log", "off"],
2745
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2746
+ },
2747
+ "detection": {
2748
+ "type": "string",
2749
+ "enum": ["corroborated", "standard", "aggressive"],
2750
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2751
+ },
2752
+ "mask": {
2753
+ "type": "string",
2754
+ "default": "[{type}]",
2755
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2756
+ },
2757
+ "partialMask": {
2758
+ "type": "object",
2759
+ "title": "DlpPartialMask",
2760
+ "additionalProperties": false,
2761
+ "required": ["keepLast"],
2762
+ "properties": {
2763
+ "keepLast": {
2764
+ "type": "integer",
2765
+ "minimum": 1,
2766
+ "maximum": 8,
2767
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2768
+ }
2769
+ }
2770
+ }
2771
+ }
2772
+ },
2773
+ "secret-github": {
2774
+ "type": "object",
2775
+ "title": "DlpRule",
2776
+ "additionalProperties": false,
2777
+ "properties": {
2778
+ "action": {
2779
+ "type": "string",
2780
+ "enum": ["mask", "block", "log", "off"],
2781
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2782
+ },
2783
+ "inboundAction": {
2784
+ "type": "string",
2785
+ "enum": ["mask", "block", "log", "off"],
2786
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2787
+ },
2788
+ "outboundAction": {
2789
+ "type": "string",
2790
+ "enum": ["mask", "block", "log", "off"],
2791
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2792
+ },
2793
+ "detection": {
2794
+ "type": "string",
2795
+ "enum": ["corroborated", "standard", "aggressive"],
2796
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2797
+ },
2798
+ "mask": {
2799
+ "type": "string",
2800
+ "default": "[{type}]",
2801
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2802
+ },
2803
+ "partialMask": {
2804
+ "type": "object",
2805
+ "title": "DlpPartialMask",
2806
+ "additionalProperties": false,
2807
+ "required": ["keepLast"],
2808
+ "properties": {
2809
+ "keepLast": {
2810
+ "type": "integer",
2811
+ "minimum": 1,
2812
+ "maximum": 8,
2813
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2814
+ }
2815
+ }
2816
+ }
2817
+ }
2818
+ },
2819
+ "secret-gitlab": {
2820
+ "type": "object",
2821
+ "title": "DlpRule",
2822
+ "additionalProperties": false,
2823
+ "properties": {
2824
+ "action": {
2825
+ "type": "string",
2826
+ "enum": ["mask", "block", "log", "off"],
2827
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2828
+ },
2829
+ "inboundAction": {
2830
+ "type": "string",
2831
+ "enum": ["mask", "block", "log", "off"],
2832
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2833
+ },
2834
+ "outboundAction": {
2835
+ "type": "string",
2836
+ "enum": ["mask", "block", "log", "off"],
2837
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2838
+ },
2839
+ "detection": {
2840
+ "type": "string",
2841
+ "enum": ["corroborated", "standard", "aggressive"],
2842
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2843
+ },
2844
+ "mask": {
2845
+ "type": "string",
2846
+ "default": "[{type}]",
2847
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2848
+ },
2849
+ "partialMask": {
2850
+ "type": "object",
2851
+ "title": "DlpPartialMask",
2852
+ "additionalProperties": false,
2853
+ "required": ["keepLast"],
2854
+ "properties": {
2855
+ "keepLast": {
2856
+ "type": "integer",
2857
+ "minimum": 1,
2858
+ "maximum": 8,
2859
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2860
+ }
2861
+ }
2862
+ }
2863
+ }
2864
+ },
2865
+ "secret-google-api-key": {
2866
+ "type": "object",
2867
+ "title": "DlpRule",
2868
+ "additionalProperties": false,
2869
+ "properties": {
2870
+ "action": {
2871
+ "type": "string",
2872
+ "enum": ["mask", "block", "log", "off"],
2873
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2874
+ },
2875
+ "inboundAction": {
2876
+ "type": "string",
2877
+ "enum": ["mask", "block", "log", "off"],
2878
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2879
+ },
2880
+ "outboundAction": {
2881
+ "type": "string",
2882
+ "enum": ["mask", "block", "log", "off"],
2883
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2884
+ },
2885
+ "detection": {
2886
+ "type": "string",
2887
+ "enum": ["corroborated", "standard", "aggressive"],
2888
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2889
+ },
2890
+ "mask": {
2891
+ "type": "string",
2892
+ "default": "[{type}]",
2893
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2894
+ },
2895
+ "partialMask": {
2896
+ "type": "object",
2897
+ "title": "DlpPartialMask",
2898
+ "additionalProperties": false,
2899
+ "required": ["keepLast"],
2900
+ "properties": {
2901
+ "keepLast": {
2902
+ "type": "integer",
2903
+ "minimum": 1,
2904
+ "maximum": 8,
2905
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2906
+ }
2907
+ }
2908
+ }
2909
+ }
2910
+ },
2911
+ "secret-heroku": {
2912
+ "type": "object",
2913
+ "title": "DlpRule",
2914
+ "additionalProperties": false,
2915
+ "properties": {
2916
+ "action": {
2917
+ "type": "string",
2918
+ "enum": ["mask", "block", "log", "off"],
2919
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2920
+ },
2921
+ "inboundAction": {
2922
+ "type": "string",
2923
+ "enum": ["mask", "block", "log", "off"],
2924
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2925
+ },
2926
+ "outboundAction": {
2927
+ "type": "string",
2928
+ "enum": ["mask", "block", "log", "off"],
2929
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2930
+ },
2931
+ "detection": {
2932
+ "type": "string",
2933
+ "enum": ["corroborated", "standard", "aggressive"],
2934
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2935
+ },
2936
+ "mask": {
2937
+ "type": "string",
2938
+ "default": "[{type}]",
2939
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2940
+ },
2941
+ "partialMask": {
2942
+ "type": "object",
2943
+ "title": "DlpPartialMask",
2944
+ "additionalProperties": false,
2945
+ "required": ["keepLast"],
2946
+ "properties": {
2947
+ "keepLast": {
2948
+ "type": "integer",
2949
+ "minimum": 1,
2950
+ "maximum": 8,
2951
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2952
+ }
2953
+ }
2954
+ }
2955
+ }
2956
+ },
2957
+ "secret-hugging-face": {
2958
+ "type": "object",
2959
+ "title": "DlpRule",
2960
+ "additionalProperties": false,
2961
+ "properties": {
2962
+ "action": {
2963
+ "type": "string",
2964
+ "enum": ["mask", "block", "log", "off"],
2965
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
2966
+ },
2967
+ "inboundAction": {
2968
+ "type": "string",
2969
+ "enum": ["mask", "block", "log", "off"],
2970
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
2971
+ },
2972
+ "outboundAction": {
2973
+ "type": "string",
2974
+ "enum": ["mask", "block", "log", "off"],
2975
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
2976
+ },
2977
+ "detection": {
2978
+ "type": "string",
2979
+ "enum": ["corroborated", "standard", "aggressive"],
2980
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
2981
+ },
2982
+ "mask": {
2983
+ "type": "string",
2984
+ "default": "[{type}]",
2985
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
2986
+ },
2987
+ "partialMask": {
2988
+ "type": "object",
2989
+ "title": "DlpPartialMask",
2990
+ "additionalProperties": false,
2991
+ "required": ["keepLast"],
2992
+ "properties": {
2993
+ "keepLast": {
2994
+ "type": "integer",
2995
+ "minimum": 1,
2996
+ "maximum": 8,
2997
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
2998
+ }
2999
+ }
3000
+ }
3001
+ }
3002
+ },
3003
+ "secret-jwt": {
3004
+ "type": "object",
3005
+ "title": "DlpRule",
3006
+ "additionalProperties": false,
3007
+ "properties": {
3008
+ "action": {
3009
+ "type": "string",
3010
+ "enum": ["mask", "block", "log", "off"],
3011
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3012
+ },
3013
+ "inboundAction": {
3014
+ "type": "string",
3015
+ "enum": ["mask", "block", "log", "off"],
3016
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3017
+ },
3018
+ "outboundAction": {
3019
+ "type": "string",
3020
+ "enum": ["mask", "block", "log", "off"],
3021
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3022
+ },
3023
+ "detection": {
3024
+ "type": "string",
3025
+ "enum": ["corroborated", "standard", "aggressive"],
3026
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3027
+ },
3028
+ "mask": {
3029
+ "type": "string",
3030
+ "default": "[{type}]",
3031
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3032
+ },
3033
+ "partialMask": {
3034
+ "type": "object",
3035
+ "title": "DlpPartialMask",
3036
+ "additionalProperties": false,
3037
+ "required": ["keepLast"],
3038
+ "properties": {
3039
+ "keepLast": {
3040
+ "type": "integer",
3041
+ "minimum": 1,
3042
+ "maximum": 8,
3043
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3044
+ }
3045
+ }
3046
+ }
3047
+ }
3048
+ },
3049
+ "secret-mailchimp": {
3050
+ "type": "object",
3051
+ "title": "DlpRule",
3052
+ "additionalProperties": false,
3053
+ "properties": {
3054
+ "action": {
3055
+ "type": "string",
3056
+ "enum": ["mask", "block", "log", "off"],
3057
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3058
+ },
3059
+ "inboundAction": {
3060
+ "type": "string",
3061
+ "enum": ["mask", "block", "log", "off"],
3062
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3063
+ },
3064
+ "outboundAction": {
3065
+ "type": "string",
3066
+ "enum": ["mask", "block", "log", "off"],
3067
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3068
+ },
3069
+ "detection": {
3070
+ "type": "string",
3071
+ "enum": ["corroborated", "standard", "aggressive"],
3072
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3073
+ },
3074
+ "mask": {
3075
+ "type": "string",
3076
+ "default": "[{type}]",
3077
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3078
+ },
3079
+ "partialMask": {
3080
+ "type": "object",
3081
+ "title": "DlpPartialMask",
3082
+ "additionalProperties": false,
3083
+ "required": ["keepLast"],
3084
+ "properties": {
3085
+ "keepLast": {
3086
+ "type": "integer",
3087
+ "minimum": 1,
3088
+ "maximum": 8,
3089
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3090
+ }
3091
+ }
3092
+ }
3093
+ }
3094
+ },
3095
+ "secret-mailgun": {
3096
+ "type": "object",
3097
+ "title": "DlpRule",
3098
+ "additionalProperties": false,
3099
+ "properties": {
3100
+ "action": {
3101
+ "type": "string",
3102
+ "enum": ["mask", "block", "log", "off"],
3103
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3104
+ },
3105
+ "inboundAction": {
3106
+ "type": "string",
3107
+ "enum": ["mask", "block", "log", "off"],
3108
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3109
+ },
3110
+ "outboundAction": {
3111
+ "type": "string",
3112
+ "enum": ["mask", "block", "log", "off"],
3113
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3114
+ },
3115
+ "detection": {
3116
+ "type": "string",
3117
+ "enum": ["corroborated", "standard", "aggressive"],
3118
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3119
+ },
3120
+ "mask": {
3121
+ "type": "string",
3122
+ "default": "[{type}]",
3123
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3124
+ },
3125
+ "partialMask": {
3126
+ "type": "object",
3127
+ "title": "DlpPartialMask",
3128
+ "additionalProperties": false,
3129
+ "required": ["keepLast"],
3130
+ "properties": {
3131
+ "keepLast": {
3132
+ "type": "integer",
3133
+ "minimum": 1,
3134
+ "maximum": 8,
3135
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3136
+ }
3137
+ }
3138
+ }
3139
+ }
3140
+ },
3141
+ "secret-npm": {
3142
+ "type": "object",
3143
+ "title": "DlpRule",
3144
+ "additionalProperties": false,
3145
+ "properties": {
3146
+ "action": {
3147
+ "type": "string",
3148
+ "enum": ["mask", "block", "log", "off"],
3149
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3150
+ },
3151
+ "inboundAction": {
3152
+ "type": "string",
3153
+ "enum": ["mask", "block", "log", "off"],
3154
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3155
+ },
3156
+ "outboundAction": {
3157
+ "type": "string",
3158
+ "enum": ["mask", "block", "log", "off"],
3159
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3160
+ },
3161
+ "detection": {
3162
+ "type": "string",
3163
+ "enum": ["corroborated", "standard", "aggressive"],
3164
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3165
+ },
3166
+ "mask": {
3167
+ "type": "string",
3168
+ "default": "[{type}]",
3169
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3170
+ },
3171
+ "partialMask": {
3172
+ "type": "object",
3173
+ "title": "DlpPartialMask",
3174
+ "additionalProperties": false,
3175
+ "required": ["keepLast"],
3176
+ "properties": {
3177
+ "keepLast": {
3178
+ "type": "integer",
3179
+ "minimum": 1,
3180
+ "maximum": 8,
3181
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3182
+ }
3183
+ }
3184
+ }
3185
+ }
3186
+ },
3187
+ "secret-openai": {
3188
+ "type": "object",
3189
+ "title": "DlpRule",
3190
+ "additionalProperties": false,
3191
+ "properties": {
3192
+ "action": {
3193
+ "type": "string",
3194
+ "enum": ["mask", "block", "log", "off"],
3195
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3196
+ },
3197
+ "inboundAction": {
3198
+ "type": "string",
3199
+ "enum": ["mask", "block", "log", "off"],
3200
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3201
+ },
3202
+ "outboundAction": {
3203
+ "type": "string",
3204
+ "enum": ["mask", "block", "log", "off"],
3205
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3206
+ },
3207
+ "detection": {
3208
+ "type": "string",
3209
+ "enum": ["corroborated", "standard", "aggressive"],
3210
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3211
+ },
3212
+ "mask": {
3213
+ "type": "string",
3214
+ "default": "[{type}]",
3215
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3216
+ },
3217
+ "partialMask": {
3218
+ "type": "object",
3219
+ "title": "DlpPartialMask",
3220
+ "additionalProperties": false,
3221
+ "required": ["keepLast"],
3222
+ "properties": {
3223
+ "keepLast": {
3224
+ "type": "integer",
3225
+ "minimum": 1,
3226
+ "maximum": 8,
3227
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3228
+ }
3229
+ }
3230
+ }
3231
+ }
3232
+ },
3233
+ "secret-perplexity": {
3234
+ "type": "object",
3235
+ "title": "DlpRule",
3236
+ "additionalProperties": false,
3237
+ "properties": {
3238
+ "action": {
3239
+ "type": "string",
3240
+ "enum": ["mask", "block", "log", "off"],
3241
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3242
+ },
3243
+ "inboundAction": {
3244
+ "type": "string",
3245
+ "enum": ["mask", "block", "log", "off"],
3246
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3247
+ },
3248
+ "outboundAction": {
3249
+ "type": "string",
3250
+ "enum": ["mask", "block", "log", "off"],
3251
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3252
+ },
3253
+ "detection": {
3254
+ "type": "string",
3255
+ "enum": ["corroborated", "standard", "aggressive"],
3256
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3257
+ },
3258
+ "mask": {
3259
+ "type": "string",
3260
+ "default": "[{type}]",
3261
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3262
+ },
3263
+ "partialMask": {
3264
+ "type": "object",
3265
+ "title": "DlpPartialMask",
3266
+ "additionalProperties": false,
3267
+ "required": ["keepLast"],
3268
+ "properties": {
3269
+ "keepLast": {
3270
+ "type": "integer",
3271
+ "minimum": 1,
3272
+ "maximum": 8,
3273
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3274
+ }
3275
+ }
3276
+ }
3277
+ }
3278
+ },
3279
+ "secret-postman": {
3280
+ "type": "object",
3281
+ "title": "DlpRule",
3282
+ "additionalProperties": false,
3283
+ "properties": {
3284
+ "action": {
3285
+ "type": "string",
3286
+ "enum": ["mask", "block", "log", "off"],
3287
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3288
+ },
3289
+ "inboundAction": {
3290
+ "type": "string",
3291
+ "enum": ["mask", "block", "log", "off"],
3292
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3293
+ },
3294
+ "outboundAction": {
3295
+ "type": "string",
3296
+ "enum": ["mask", "block", "log", "off"],
3297
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3298
+ },
3299
+ "detection": {
3300
+ "type": "string",
3301
+ "enum": ["corroborated", "standard", "aggressive"],
3302
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3303
+ },
3304
+ "mask": {
3305
+ "type": "string",
3306
+ "default": "[{type}]",
3307
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3308
+ },
3309
+ "partialMask": {
3310
+ "type": "object",
3311
+ "title": "DlpPartialMask",
3312
+ "additionalProperties": false,
3313
+ "required": ["keepLast"],
3314
+ "properties": {
3315
+ "keepLast": {
3316
+ "type": "integer",
3317
+ "minimum": 1,
3318
+ "maximum": 8,
3319
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3320
+ }
3321
+ }
3322
+ }
3323
+ }
3324
+ },
3325
+ "secret-private-key": {
3326
+ "type": "object",
3327
+ "title": "DlpRule",
3328
+ "additionalProperties": false,
3329
+ "properties": {
3330
+ "action": {
3331
+ "type": "string",
3332
+ "enum": ["mask", "block", "log", "off"],
3333
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3334
+ },
3335
+ "inboundAction": {
3336
+ "type": "string",
3337
+ "enum": ["mask", "block", "log", "off"],
3338
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3339
+ },
3340
+ "outboundAction": {
3341
+ "type": "string",
3342
+ "enum": ["mask", "block", "log", "off"],
3343
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3344
+ },
3345
+ "detection": {
3346
+ "type": "string",
3347
+ "enum": ["corroborated", "standard", "aggressive"],
3348
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3349
+ },
3350
+ "mask": {
3351
+ "type": "string",
3352
+ "default": "[{type}]",
3353
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3354
+ },
3355
+ "partialMask": {
3356
+ "type": "object",
3357
+ "title": "DlpPartialMask",
3358
+ "additionalProperties": false,
3359
+ "required": ["keepLast"],
3360
+ "properties": {
3361
+ "keepLast": {
3362
+ "type": "integer",
3363
+ "minimum": 1,
3364
+ "maximum": 8,
3365
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3366
+ }
3367
+ }
3368
+ }
3369
+ }
3370
+ },
3371
+ "secret-pypi": {
3372
+ "type": "object",
3373
+ "title": "DlpRule",
3374
+ "additionalProperties": false,
3375
+ "properties": {
3376
+ "action": {
3377
+ "type": "string",
3378
+ "enum": ["mask", "block", "log", "off"],
3379
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3380
+ },
3381
+ "inboundAction": {
3382
+ "type": "string",
3383
+ "enum": ["mask", "block", "log", "off"],
3384
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3385
+ },
3386
+ "outboundAction": {
3387
+ "type": "string",
3388
+ "enum": ["mask", "block", "log", "off"],
3389
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3390
+ },
3391
+ "detection": {
3392
+ "type": "string",
3393
+ "enum": ["corroborated", "standard", "aggressive"],
3394
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3395
+ },
3396
+ "mask": {
3397
+ "type": "string",
3398
+ "default": "[{type}]",
3399
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3400
+ },
3401
+ "partialMask": {
3402
+ "type": "object",
3403
+ "title": "DlpPartialMask",
3404
+ "additionalProperties": false,
3405
+ "required": ["keepLast"],
3406
+ "properties": {
3407
+ "keepLast": {
3408
+ "type": "integer",
3409
+ "minimum": 1,
3410
+ "maximum": 8,
3411
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3412
+ }
3413
+ }
3414
+ }
3415
+ }
3416
+ },
3417
+ "secret-sendgrid": {
3418
+ "type": "object",
3419
+ "title": "DlpRule",
3420
+ "additionalProperties": false,
3421
+ "properties": {
3422
+ "action": {
3423
+ "type": "string",
3424
+ "enum": ["mask", "block", "log", "off"],
3425
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3426
+ },
3427
+ "inboundAction": {
3428
+ "type": "string",
3429
+ "enum": ["mask", "block", "log", "off"],
3430
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3431
+ },
3432
+ "outboundAction": {
3433
+ "type": "string",
3434
+ "enum": ["mask", "block", "log", "off"],
3435
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3436
+ },
3437
+ "detection": {
3438
+ "type": "string",
3439
+ "enum": ["corroborated", "standard", "aggressive"],
3440
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3441
+ },
3442
+ "mask": {
3443
+ "type": "string",
3444
+ "default": "[{type}]",
3445
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3446
+ },
3447
+ "partialMask": {
3448
+ "type": "object",
3449
+ "title": "DlpPartialMask",
3450
+ "additionalProperties": false,
3451
+ "required": ["keepLast"],
3452
+ "properties": {
3453
+ "keepLast": {
3454
+ "type": "integer",
3455
+ "minimum": 1,
3456
+ "maximum": 8,
3457
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3458
+ }
3459
+ }
3460
+ }
3461
+ }
3462
+ },
3463
+ "secret-sentry": {
3464
+ "type": "object",
3465
+ "title": "DlpRule",
3466
+ "additionalProperties": false,
3467
+ "properties": {
3468
+ "action": {
3469
+ "type": "string",
3470
+ "enum": ["mask", "block", "log", "off"],
3471
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3472
+ },
3473
+ "inboundAction": {
3474
+ "type": "string",
3475
+ "enum": ["mask", "block", "log", "off"],
3476
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3477
+ },
3478
+ "outboundAction": {
3479
+ "type": "string",
3480
+ "enum": ["mask", "block", "log", "off"],
3481
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3482
+ },
3483
+ "detection": {
3484
+ "type": "string",
3485
+ "enum": ["corroborated", "standard", "aggressive"],
3486
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3487
+ },
3488
+ "mask": {
3489
+ "type": "string",
3490
+ "default": "[{type}]",
3491
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3492
+ },
3493
+ "partialMask": {
3494
+ "type": "object",
3495
+ "title": "DlpPartialMask",
3496
+ "additionalProperties": false,
3497
+ "required": ["keepLast"],
3498
+ "properties": {
3499
+ "keepLast": {
3500
+ "type": "integer",
3501
+ "minimum": 1,
3502
+ "maximum": 8,
3503
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3504
+ }
3505
+ }
3506
+ }
3507
+ }
3508
+ },
3509
+ "secret-shopify": {
3510
+ "type": "object",
3511
+ "title": "DlpRule",
3512
+ "additionalProperties": false,
3513
+ "properties": {
3514
+ "action": {
3515
+ "type": "string",
3516
+ "enum": ["mask", "block", "log", "off"],
3517
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3518
+ },
3519
+ "inboundAction": {
3520
+ "type": "string",
3521
+ "enum": ["mask", "block", "log", "off"],
3522
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3523
+ },
3524
+ "outboundAction": {
3525
+ "type": "string",
3526
+ "enum": ["mask", "block", "log", "off"],
3527
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3528
+ },
3529
+ "detection": {
3530
+ "type": "string",
3531
+ "enum": ["corroborated", "standard", "aggressive"],
3532
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3533
+ },
3534
+ "mask": {
3535
+ "type": "string",
3536
+ "default": "[{type}]",
3537
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3538
+ },
3539
+ "partialMask": {
3540
+ "type": "object",
3541
+ "title": "DlpPartialMask",
3542
+ "additionalProperties": false,
3543
+ "required": ["keepLast"],
3544
+ "properties": {
3545
+ "keepLast": {
3546
+ "type": "integer",
3547
+ "minimum": 1,
3548
+ "maximum": 8,
3549
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3550
+ }
3551
+ }
3552
+ }
3553
+ }
3554
+ },
3555
+ "secret-slack": {
3556
+ "type": "object",
3557
+ "title": "DlpRule",
3558
+ "additionalProperties": false,
3559
+ "properties": {
3560
+ "action": {
3561
+ "type": "string",
3562
+ "enum": ["mask", "block", "log", "off"],
3563
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3564
+ },
3565
+ "inboundAction": {
3566
+ "type": "string",
3567
+ "enum": ["mask", "block", "log", "off"],
3568
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3569
+ },
3570
+ "outboundAction": {
3571
+ "type": "string",
3572
+ "enum": ["mask", "block", "log", "off"],
3573
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3574
+ },
3575
+ "detection": {
3576
+ "type": "string",
3577
+ "enum": ["corroborated", "standard", "aggressive"],
3578
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3579
+ },
3580
+ "mask": {
3581
+ "type": "string",
3582
+ "default": "[{type}]",
3583
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3584
+ },
3585
+ "partialMask": {
3586
+ "type": "object",
3587
+ "title": "DlpPartialMask",
3588
+ "additionalProperties": false,
3589
+ "required": ["keepLast"],
3590
+ "properties": {
3591
+ "keepLast": {
3592
+ "type": "integer",
3593
+ "minimum": 1,
3594
+ "maximum": 8,
3595
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3596
+ }
3597
+ }
3598
+ }
3599
+ }
3600
+ },
3601
+ "secret-square": {
3602
+ "type": "object",
3603
+ "title": "DlpRule",
3604
+ "additionalProperties": false,
3605
+ "properties": {
3606
+ "action": {
3607
+ "type": "string",
3608
+ "enum": ["mask", "block", "log", "off"],
3609
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3610
+ },
3611
+ "inboundAction": {
3612
+ "type": "string",
3613
+ "enum": ["mask", "block", "log", "off"],
3614
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3615
+ },
3616
+ "outboundAction": {
3617
+ "type": "string",
3618
+ "enum": ["mask", "block", "log", "off"],
3619
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3620
+ },
3621
+ "detection": {
3622
+ "type": "string",
3623
+ "enum": ["corroborated", "standard", "aggressive"],
3624
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3625
+ },
3626
+ "mask": {
3627
+ "type": "string",
3628
+ "default": "[{type}]",
3629
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3630
+ },
3631
+ "partialMask": {
3632
+ "type": "object",
3633
+ "title": "DlpPartialMask",
3634
+ "additionalProperties": false,
3635
+ "required": ["keepLast"],
3636
+ "properties": {
3637
+ "keepLast": {
3638
+ "type": "integer",
3639
+ "minimum": 1,
3640
+ "maximum": 8,
3641
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3642
+ }
3643
+ }
3644
+ }
3645
+ }
3646
+ },
3647
+ "secret-stripe": {
3648
+ "type": "object",
3649
+ "title": "DlpRule",
3650
+ "additionalProperties": false,
3651
+ "properties": {
3652
+ "action": {
3653
+ "type": "string",
3654
+ "enum": ["mask", "block", "log", "off"],
3655
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3656
+ },
3657
+ "inboundAction": {
3658
+ "type": "string",
3659
+ "enum": ["mask", "block", "log", "off"],
3660
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3661
+ },
3662
+ "outboundAction": {
3663
+ "type": "string",
3664
+ "enum": ["mask", "block", "log", "off"],
3665
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3666
+ },
3667
+ "detection": {
3668
+ "type": "string",
3669
+ "enum": ["corroborated", "standard", "aggressive"],
3670
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3671
+ },
3672
+ "mask": {
3673
+ "type": "string",
3674
+ "default": "[{type}]",
3675
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3676
+ },
3677
+ "partialMask": {
3678
+ "type": "object",
3679
+ "title": "DlpPartialMask",
3680
+ "additionalProperties": false,
3681
+ "required": ["keepLast"],
3682
+ "properties": {
3683
+ "keepLast": {
3684
+ "type": "integer",
3685
+ "minimum": 1,
3686
+ "maximum": 8,
3687
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3688
+ }
3689
+ }
3690
+ }
3691
+ }
3692
+ },
3693
+ "secret-telegram-bot": {
3694
+ "type": "object",
3695
+ "title": "DlpRule",
3696
+ "additionalProperties": false,
3697
+ "properties": {
3698
+ "action": {
3699
+ "type": "string",
3700
+ "enum": ["mask", "block", "log", "off"],
3701
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3702
+ },
3703
+ "inboundAction": {
3704
+ "type": "string",
3705
+ "enum": ["mask", "block", "log", "off"],
3706
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3707
+ },
3708
+ "outboundAction": {
3709
+ "type": "string",
3710
+ "enum": ["mask", "block", "log", "off"],
3711
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3712
+ },
3713
+ "detection": {
3714
+ "type": "string",
3715
+ "enum": ["corroborated", "standard", "aggressive"],
3716
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3717
+ },
3718
+ "mask": {
3719
+ "type": "string",
3720
+ "default": "[{type}]",
3721
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3722
+ },
3723
+ "partialMask": {
3724
+ "type": "object",
3725
+ "title": "DlpPartialMask",
3726
+ "additionalProperties": false,
3727
+ "required": ["keepLast"],
3728
+ "properties": {
3729
+ "keepLast": {
3730
+ "type": "integer",
3731
+ "minimum": 1,
3732
+ "maximum": 8,
3733
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3734
+ }
3735
+ }
3736
+ }
3737
+ }
3738
+ },
3739
+ "secret-terraform": {
3740
+ "type": "object",
3741
+ "title": "DlpRule",
3742
+ "additionalProperties": false,
3743
+ "properties": {
3744
+ "action": {
3745
+ "type": "string",
3746
+ "enum": ["mask", "block", "log", "off"],
3747
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3748
+ },
3749
+ "inboundAction": {
3750
+ "type": "string",
3751
+ "enum": ["mask", "block", "log", "off"],
3752
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3753
+ },
3754
+ "outboundAction": {
3755
+ "type": "string",
3756
+ "enum": ["mask", "block", "log", "off"],
3757
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3758
+ },
3759
+ "detection": {
3760
+ "type": "string",
3761
+ "enum": ["corroborated", "standard", "aggressive"],
3762
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3763
+ },
3764
+ "mask": {
3765
+ "type": "string",
3766
+ "default": "[{type}]",
3767
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3768
+ },
3769
+ "partialMask": {
3770
+ "type": "object",
3771
+ "title": "DlpPartialMask",
3772
+ "additionalProperties": false,
3773
+ "required": ["keepLast"],
3774
+ "properties": {
3775
+ "keepLast": {
3776
+ "type": "integer",
3777
+ "minimum": 1,
3778
+ "maximum": 8,
3779
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3780
+ }
3781
+ }
3782
+ }
3783
+ }
3784
+ },
3785
+ "secret-twilio": {
3786
+ "type": "object",
3787
+ "title": "DlpRule",
3788
+ "additionalProperties": false,
3789
+ "properties": {
3790
+ "action": {
3791
+ "type": "string",
3792
+ "enum": ["mask", "block", "log", "off"],
3793
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3794
+ },
3795
+ "inboundAction": {
3796
+ "type": "string",
3797
+ "enum": ["mask", "block", "log", "off"],
3798
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3799
+ },
3800
+ "outboundAction": {
3801
+ "type": "string",
3802
+ "enum": ["mask", "block", "log", "off"],
3803
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3804
+ },
3805
+ "detection": {
3806
+ "type": "string",
3807
+ "enum": ["corroborated", "standard", "aggressive"],
3808
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3809
+ },
3810
+ "mask": {
3811
+ "type": "string",
3812
+ "default": "[{type}]",
3813
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3814
+ },
3815
+ "partialMask": {
3816
+ "type": "object",
3817
+ "title": "DlpPartialMask",
3818
+ "additionalProperties": false,
3819
+ "required": ["keepLast"],
3820
+ "properties": {
3821
+ "keepLast": {
3822
+ "type": "integer",
3823
+ "minimum": 1,
3824
+ "maximum": 8,
3825
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3826
+ }
3827
+ }
3828
+ }
3829
+ }
3830
+ },
3831
+ "secret-zuplo": {
3832
+ "type": "object",
3833
+ "title": "DlpRule",
3834
+ "additionalProperties": false,
3835
+ "properties": {
3836
+ "action": {
3837
+ "type": "string",
3838
+ "enum": ["mask", "block", "log", "off"],
3839
+ "description": "What happens when this type is found, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the detected types (never the values); `log` records a finding and lets the traffic pass unchanged — use it to trial a rule before enforcing it; `off` excludes this type from a group enabled by a broader key. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3840
+ },
3841
+ "inboundAction": {
3842
+ "type": "string",
3843
+ "enum": ["mask", "block", "log", "off"],
3844
+ "description": "What happens when this type is found in what callers send the model (system prompt, message text, and tool-call arguments). Use with `outboundAction` to give one type different behavior per direction — for example mask PII on the way in and block it on the way out. Omitting it (or `off`) leaves the inbound direction unscanned for this type. Cannot be combined with `action`."
3845
+ },
3846
+ "outboundAction": {
3847
+ "type": "string",
3848
+ "enum": ["mask", "block", "log", "off"],
3849
+ "description": "What happens when this type is found in what the model sends back (buffered responses whole, streaming responses as they stream). Omitting it (or `off`) leaves the outbound direction unscanned for this type. Cannot be combined with `action`."
3850
+ },
3851
+ "detection": {
3852
+ "type": "string",
3853
+ "enum": ["corroborated", "standard", "aggressive"],
3854
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3855
+ },
3856
+ "mask": {
3857
+ "type": "string",
3858
+ "default": "[{type}]",
3859
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3860
+ },
3861
+ "partialMask": {
3862
+ "type": "object",
3863
+ "title": "DlpPartialMask",
3864
+ "additionalProperties": false,
3865
+ "required": ["keepLast"],
3866
+ "properties": {
3867
+ "keepLast": {
3868
+ "type": "integer",
3869
+ "minimum": 1,
3870
+ "maximum": 8,
3871
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3872
+ }
3873
+ }
3874
+ }
3875
+ }
3876
+ }
3877
+ }
3878
+ },
3879
+ "customRules": {
3880
+ "type": "array",
3881
+ "x-advanced": true,
3882
+ "description": "Your own detection rules alongside the built-ins: the same rule object plus a `name`, a regex `pattern`, and optional `context` words.",
3883
+ "items": {
3884
+ "type": "object",
3885
+ "title": "DlpCustomRule",
3886
+ "additionalProperties": false,
3887
+ "required": ["name", "pattern"],
3888
+ "properties": {
3889
+ "name": {
3890
+ "type": "string",
3891
+ "description": "Identifier reported in findings and block details for this rule."
3892
+ },
3893
+ "pattern": {
3894
+ "type": "string",
3895
+ "description": "A JavaScript regular expression source string. Remember to escape backslashes for JSON (for example `\\\\d` for a digit). An invalid pattern fails the configuration at request time — a broken guardrail never degrades into a silent pass-through."
3896
+ },
3897
+ "context": {
3898
+ "type": "array",
3899
+ "items": {
3900
+ "type": "string"
3901
+ },
3902
+ "description": "Context words for this rule. With `detection: \"corroborated\"` the rule only fires when one of these words appears near the match."
3903
+ },
3904
+ "action": {
3905
+ "type": "string",
3906
+ "enum": ["mask", "block", "log", "off"],
3907
+ "description": "What happens when this rule matches, in BOTH directions. `mask` replaces the matched text with a placeholder and the conversation continues; `block` rejects the request or terminates the response with an error naming only the rule's name (never the values); `log` records a finding and lets the traffic pass unchanged; `off` disables the rule. A rule states either `action` or the directional pair (`inboundAction`/`outboundAction`), never both."
3908
+ },
3909
+ "inboundAction": {
3910
+ "type": "string",
3911
+ "enum": ["mask", "block", "log", "off"],
3912
+ "description": "What happens when this rule matches in what callers send the model. Use with `outboundAction` to give the rule different behavior per direction. Omitting it (or `off`) leaves the inbound direction unscanned for this rule. Cannot be combined with `action`."
3913
+ },
3914
+ "outboundAction": {
3915
+ "type": "string",
3916
+ "enum": ["mask", "block", "log", "off"],
3917
+ "description": "What happens when this rule matches in what the model sends back. Omitting it (or `off`) leaves the outbound direction unscanned for this rule. Cannot be combined with `action`."
3918
+ },
3919
+ "detection": {
3920
+ "type": "string",
3921
+ "enum": ["corroborated", "standard", "aggressive"],
3922
+ "description": "How much evidence a match needs before this rule acts. `corroborated` additionally requires one of the type's context words near the match (types that define no context words behave as `standard`); `standard` uses the catalog as tuned — distinctive shapes act on their own while ambiguous shapes need nearby context; `aggressive` counts every pattern match and is false-positive-prone — pair it with the `log` action for audits. Overrides the policy-level `detection` for this rule."
3923
+ },
3924
+ "mask": {
3925
+ "type": "string",
3926
+ "default": "[{type}]",
3927
+ "description": "Replacement text for this rule's masked matches. The `{type}` token inserts the detected type id in UPPER\\_SNAKE form, so the default turns a matched email into `[CONTACT_EMAIL]` — typed placeholders keep masked conversations legible to the model. Set a literal like `[REDACTED]` to hide the type."
3928
+ },
3929
+ "partialMask": {
3930
+ "type": "object",
3931
+ "title": "DlpPartialMask",
3932
+ "additionalProperties": false,
3933
+ "required": ["keepLast"],
3934
+ "properties": {
3935
+ "keepLast": {
3936
+ "type": "integer",
3937
+ "minimum": 1,
3938
+ "maximum": 8,
3939
+ "description": "Keep the last N characters of the matched value unmasked and replace the rest with `*`, preserving length (for example `**** **** **** 4242`). Values no longer than N characters are fully masked."
3940
+ }
3941
+ }
3942
+ }
3943
+ }
3944
+ }
3945
+ },
3946
+ "allowValues": {
3947
+ "type": "array",
3948
+ "items": {
3949
+ "type": "string"
3950
+ },
3951
+ "description": "Exact strings that are never flagged by any rule — documentation samples like Stripe's public test card `4242 4242 4242 4242`, or your own support email address. Matching is case-sensitive against the exact detected text, including when a value arrives split across streaming chunks."
3952
+ },
3953
+ "detection": {
3954
+ "type": "string",
3955
+ "enum": ["corroborated", "standard", "aggressive"],
3956
+ "default": "standard",
3957
+ "description": "Default evidence level for rules that do not set their own. See the per-rule `detection` description for the level semantics. There are no numeric confidence thresholds to tune — levels are the whole dial."
3958
+ },
3959
+ "scanToolArguments": {
3960
+ "type": "boolean",
3961
+ "default": true,
3962
+ "x-advanced": true,
3963
+ "description": "Also scan tool/function-call argument payloads — in requests, buffered responses, and streamed tool-call deltas. Tool arguments are user and model content; disabling this exempts them from every rule."
3964
+ },
3965
+ "streaming": {
3966
+ "type": "object",
3967
+ "title": "DlpStreamingSettings",
3968
+ "x-advanced": true,
3969
+ "additionalProperties": false,
3970
+ "description": "Tuning for streaming (SSE) response scanning. Each chunk is held until the boundary scan that includes its successor passes, then released — so values split across chunks are always fully maskable, at the cost of one chunk of latency.",
3971
+ "properties": {
3972
+ "enabled": {
3973
+ "type": "boolean",
3974
+ "default": true,
3975
+ "description": "Scan streaming responses. When false, streaming responses pass through unscanned even when rules cover the outbound direction."
3976
+ },
3977
+ "boundaryScan": {
3978
+ "type": "boolean",
3979
+ "default": true,
3980
+ "description": "Scan across chunk boundaries using a carried tail of already-scanned text. When false, each chunk is scanned alone and released immediately — lower cost, but values split across two chunks are missed."
3981
+ },
3982
+ "maxCarryChars": {
3983
+ "type": "number",
3984
+ "minimum": 32,
3985
+ "maximum": 4096,
3986
+ "default": 512,
3987
+ "description": "How many trailing characters are carried from one chunk into the next boundary scan. Bounds memory and re-scan cost; must be larger than the longest value you need to catch."
3988
+ }
3989
+ }
3990
+ },
3991
+ "endpoints": {
3992
+ "type": "array",
3993
+ "title": "Applicable Endpoints",
3994
+ "x-advanced": true,
3995
+ "description": "The endpoint shapes this policy applies to. Omit to apply to all (openai-chat, openai-responses, anthropic-messages).",
3996
+ "items": {
3997
+ "type": "string",
3998
+ "enum": [
3999
+ "openai-chat",
4000
+ "openai-responses",
4001
+ "anthropic-messages"
4002
+ ]
4003
+ }
4004
+ },
4005
+ "onUnknownShape": {
4006
+ "type": "string",
4007
+ "title": "On Unknown Shape",
4008
+ "x-advanced": true,
4009
+ "enum": ["deny", "skip"],
4010
+ "default": "deny",
4011
+ "description": "What to do when the request shape cannot be inspected. As a guardrail this policy defaults to `deny` (fail closed) so uninspectable content is never served."
4012
+ },
4013
+ "onError": {
4014
+ "type": "string",
4015
+ "title": "On Engine Error",
4016
+ "x-advanced": true,
4017
+ "enum": ["block", "allow"],
4018
+ "default": "block",
4019
+ "description": "What to do if the scanner itself throws. The engine is a local in-gateway scanner, so this is effectively unreachable outside of a runtime defect — but a guardrail must declare its failure posture. `block` (the default) fails closed with a 500 in the route's native error format; `allow` fails open and serves the content uninspected."
4020
+ },
4021
+ "engine": {
4022
+ "type": "string",
4023
+ "x-advanced": true,
4024
+ "enum": ["builtin"],
4025
+ "default": "builtin",
4026
+ "description": "The detection engine. Only `builtin` (in-gateway regex + checksum detection with context-word scoring; no data egress) is available today. Declaring the discriminator now keeps future engines an additive, non-breaking change."
4027
+ }
4028
+ }
4029
+ }
4030
+ },
4031
+ "examples": [
4032
+ {
4033
+ "export": "AIGatewayDlpInboundPolicy",
4034
+ "module": "$import(@zuplo/runtime)",
4035
+ "options": {
4036
+ "rules": {
4037
+ "pii": {
4038
+ "inboundAction": "mask",
4039
+ "outboundAction": "block"
4040
+ },
4041
+ "secret": {
4042
+ "action": "block"
4043
+ }
4044
+ }
4045
+ }
4046
+ }
4047
+ ]
4048
+ }
4049
+ }
4050
+ }