@winstonsayno/mcp-gateway 7.6.0 → 7.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Approvals 2.0 (7.7): multi-step, conditional approval flows with named approvers and escalation.
3
+ *
4
+ * The 1.x approvals hold a call until *an operator* approves it. An **approval flow** holds matching calls until each
5
+ * of its **steps** is approved by the required number of **approvers** (client-id globs — any authenticated client,
6
+ * not only operators). Flows and steps can be **conditional** on the arguments; a step can **escalate** to more
7
+ * approvers after a while. A denial at any step, or the flow timeout, refuses the call (JSON-RPC -32004, as 1.x).
8
+ *
9
+ * ```yaml
10
+ * approvalFlows:
11
+ * flows:
12
+ * - id: payments
13
+ * tools: ["payments/transfer"] # server/tool globs
14
+ * when: [{ path: amount, op: gte, value: 1000 }]
15
+ * timeoutSeconds: 900
16
+ * steps:
17
+ * - { name: lead, approvers: ["key:lead-*"] }
18
+ * - name: finance
19
+ * approvers: ["key:fin-*"]
20
+ * required: 2
21
+ * when: [{ path: amount, op: gte, value: 10000 }] # only for large transfers
22
+ * escalateAfterSeconds: 300
23
+ * escalateTo: ["key:cfo"]
24
+ * ```
25
+ *
26
+ * Conditions: `{ path, op, value }` on the arguments (dot path), `op` ∈ `eq ne gt gte lt lte in matches exists`.
27
+ * The requester can never approve its own call; one approval per client per step.
28
+ *
29
+ * Approvers (any client): `GET /api/v1/features/approval-flows/inbox`, `GET …/mine`,
30
+ * `POST /api/v1/features/approval-flows/:id/approve|deny` `{ reason? }`.
31
+ * Operators: `GET /api/v1/admin/approval-flows`, `POST /api/v1/admin/approval-flows/:id/approve|deny` (override),
32
+ * `POST /api/v1/admin/approval-flows/evaluate` `{ server, tool, client?, arguments? }` (which flow / steps would apply).
33
+ *
34
+ * @module features/approval-flows
35
+ */
36
+ import { randomUUID } from 'node:crypto';
37
+ import { z } from 'zod';
38
+ import { registerFeature, objectBody, badRequest, clientIdOf } from '../gateway/features.js';
39
+ import { registerCallHook } from '../gateway/hooks.js';
40
+ import { ERR_APPROVAL_REJECTED } from '../gateway/invoker.js';
41
+ import { globToRegExp } from '../utils/tool-filter.js';
42
+ import { redactValue } from '../security/redact.js';
43
+ const Cond = z
44
+ .object({ path: z.string().min(1), op: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'matches', 'exists']), value: z.unknown().optional() })
45
+ .strict()
46
+ .superRefine((c, ctx) => {
47
+ if (c.op === 'matches') {
48
+ try {
49
+ new RegExp(String(c.value));
50
+ }
51
+ catch {
52
+ ctx.addIssue({ code: 'custom', message: `invalid regular expression ${JSON.stringify(c.value)}` });
53
+ }
54
+ }
55
+ if (c.op === 'in' && !Array.isArray(c.value))
56
+ ctx.addIssue({ code: 'custom', message: '`in` needs an array value' });
57
+ });
58
+ const Step = z
59
+ .object({
60
+ name: z.string().min(1),
61
+ approvers: z.array(z.string().min(1)).min(1),
62
+ required: z.number().int().min(1).default(1),
63
+ when: z.array(Cond).default([]),
64
+ escalateAfterSeconds: z.number().int().min(1).optional(),
65
+ escalateTo: z.array(z.string().min(1)).default([]),
66
+ })
67
+ .strict();
68
+ const Flow = z
69
+ .object({
70
+ id: z.string().min(1).regex(/^[A-Za-z0-9._-]+$/),
71
+ tools: z.array(z.string().min(1)).min(1),
72
+ clients: z.array(z.string().min(1)).optional(),
73
+ when: z.array(Cond).default([]),
74
+ timeoutSeconds: z.number().int().min(1).max(7 * 86400).default(900),
75
+ steps: z.array(Step).min(1),
76
+ })
77
+ .strict();
78
+ export const ApprovalFlowsSchema = z
79
+ .object({ enabled: z.boolean().default(true), flows: z.array(Flow).default([]), historySize: z.number().int().min(1).max(10_000).default(200) })
80
+ .strict()
81
+ .superRefine((c, ctx) => {
82
+ const ids = new Set();
83
+ for (const f of c.flows) {
84
+ if (ids.has(f.id))
85
+ ctx.addIssue({ code: 'custom', message: `duplicate flow id "${f.id}"` });
86
+ ids.add(f.id);
87
+ }
88
+ });
89
+ const get = (obj, path) => path.split('.').reduce((o, k) => (o && typeof o === 'object' ? o[k] : undefined), obj);
90
+ /** Evaluate one condition against the call arguments. */
91
+ export function test(c, args) {
92
+ const v = get(args, c.path);
93
+ switch (c.op) {
94
+ case 'exists':
95
+ return v !== undefined;
96
+ case 'eq':
97
+ return JSON.stringify(v) === JSON.stringify(c.value);
98
+ case 'ne':
99
+ return JSON.stringify(v) !== JSON.stringify(c.value);
100
+ case 'in':
101
+ return c.value.some((x) => JSON.stringify(x) === JSON.stringify(v));
102
+ case 'matches':
103
+ return typeof v === 'string' && new RegExp(String(c.value)).test(v);
104
+ default: {
105
+ const a = Number(v);
106
+ const b = Number(c.value);
107
+ if (v === undefined || v === null || Number.isNaN(a) || Number.isNaN(b))
108
+ return false;
109
+ return c.op === 'gt' ? a > b : c.op === 'gte' ? a >= b : c.op === 'lt' ? a < b : a <= b;
110
+ }
111
+ }
112
+ }
113
+ const all = (cs, args) => cs.every((c) => test(c, args));
114
+ const anyGlob = (ps, v) => ps.some((p) => globToRegExp(p).test(v));
115
+ /** First flow matching a call, with the steps that apply to it. */
116
+ export function matchFlow(c, call) {
117
+ const target = `${call.serverId}/${call.tool}`;
118
+ for (const f of c.flows) {
119
+ if (!anyGlob(f.tools, target))
120
+ continue;
121
+ if (f.clients && !anyGlob(f.clients, call.clientId ?? 'anonymous'))
122
+ continue;
123
+ if (!all(f.when, call.args))
124
+ continue;
125
+ return { flow: f, steps: f.steps.filter((s) => all(s.when, call.args)) };
126
+ }
127
+ return undefined;
128
+ }
129
+ export class FlowError extends Error {
130
+ status;
131
+ constructor(message, status) {
132
+ super(message);
133
+ this.status = status;
134
+ }
135
+ }
136
+ export class FlowQueue {
137
+ historySize;
138
+ held = new Map();
139
+ history = [];
140
+ constructor(historySize = 200) {
141
+ this.historySize = historySize;
142
+ }
143
+ start(flow, steps, call) {
144
+ const now = Date.now();
145
+ const req = {
146
+ id: randomUUID(),
147
+ flow: flow.id,
148
+ status: 'pending',
149
+ clientId: call.clientId,
150
+ serverId: call.serverId,
151
+ tool: call.tool,
152
+ arguments: redactValue(call.args),
153
+ steps: steps.map((s, i) => ({ name: s.name, approvers: s.approvers, required: s.required, escalateTo: s.escalateTo, escalated: false, status: i === 0 ? 'pending' : 'waiting', approvals: [] })),
154
+ current: 0,
155
+ createdAt: new Date(now).toISOString(),
156
+ expiresAt: new Date(now + flow.timeoutSeconds * 1000).toISOString(),
157
+ };
158
+ return new Promise((resolve) => {
159
+ const h = { req, resolve, timers: [] };
160
+ this.held.set(req.id, h);
161
+ const t = setTimeout(() => this.finish(req.id, 'expired', undefined, 'not approved in time'), flow.timeoutSeconds * 1000);
162
+ t.unref();
163
+ h.timers.push(t);
164
+ this.armEscalation(h, steps);
165
+ });
166
+ }
167
+ armEscalation(h, steps) {
168
+ const s = steps[h.req.current];
169
+ if (!s?.escalateAfterSeconds || !s.escalateTo.length)
170
+ return;
171
+ const idx = h.req.current;
172
+ const t = setTimeout(() => {
173
+ if (h.req.status === 'pending' && h.req.current === idx)
174
+ h.req.steps[idx].escalated = true;
175
+ }, s.escalateAfterSeconds * 1000);
176
+ t.unref();
177
+ h.timers.push(t);
178
+ h.steps = steps;
179
+ }
180
+ finish(id, status, by, reason) {
181
+ const h = this.held.get(id);
182
+ if (!h)
183
+ return undefined;
184
+ this.held.delete(id);
185
+ for (const t of h.timers)
186
+ clearTimeout(t);
187
+ h.req.status = status;
188
+ h.req.decidedAt = new Date().toISOString();
189
+ if (by)
190
+ h.req.decidedBy = by;
191
+ if (reason)
192
+ h.req.reason = reason;
193
+ this.history.unshift(h.req);
194
+ if (this.history.length > this.historySize)
195
+ this.history.length = this.historySize;
196
+ h.resolve(h.req);
197
+ return h.req;
198
+ }
199
+ /** May `client` act on the current step of `req`? */
200
+ canApprove(req, client) {
201
+ const s = req.steps[req.current];
202
+ if (!s || req.status !== 'pending' || client === req.clientId)
203
+ return false;
204
+ return anyGlob(s.approvers, client) || (s.escalated && anyGlob(s.escalateTo, client));
205
+ }
206
+ /** Approve / deny the current step. `override` (operators) skips the approver check and completes the step. */
207
+ decide(id, approve, by, reason, override = false) {
208
+ const h = this.held.get(id);
209
+ if (!h) {
210
+ if (this.history.some((x) => x.id === id))
211
+ throw new FlowError('Approval request was already decided', 409);
212
+ throw new FlowError('Approval request not found', 404);
213
+ }
214
+ const req = h.req;
215
+ if (by === req.clientId && !override)
216
+ throw new FlowError('A client cannot approve its own tool call', 403);
217
+ if (!override && !this.canApprove(req, by))
218
+ throw new FlowError(`Not an approver of step "${req.steps[req.current].name}"`, 403);
219
+ const step = req.steps[req.current];
220
+ if (!approve)
221
+ return this.finish(id, 'denied', by, reason ?? `denied at step "${step.name}"`);
222
+ if (step.approvals.some((a) => a.by === by))
223
+ throw new FlowError('Already approved this step', 409);
224
+ step.approvals.push({ by, at: new Date().toISOString(), ...(reason ? { reason } : {}) });
225
+ if (override || step.approvals.length >= step.required) {
226
+ step.status = 'approved';
227
+ req.current++;
228
+ if (req.current >= req.steps.length)
229
+ return this.finish(id, 'approved', by);
230
+ req.steps[req.current].status = 'pending';
231
+ const steps = h.steps;
232
+ if (steps)
233
+ this.armEscalation(h, steps);
234
+ }
235
+ return req;
236
+ }
237
+ pending() {
238
+ return [...this.held.values()].map((h) => h.req);
239
+ }
240
+ get(id) {
241
+ return this.held.get(id)?.req ?? this.history.find((x) => x.id === id);
242
+ }
243
+ close() {
244
+ for (const id of [...this.held.keys()])
245
+ this.finish(id, 'expired', undefined, 'gateway stopped');
246
+ }
247
+ }
248
+ export const flowQueue = new FlowQueue();
249
+ const settings = (cfg) => {
250
+ if (!cfg.approvalFlows)
251
+ return undefined;
252
+ const c = ApprovalFlowsSchema.parse(cfg.approvalFlows);
253
+ return c.enabled ? c : undefined;
254
+ };
255
+ registerCallHook({
256
+ id: 'approval-flows',
257
+ before: async (call, cfg) => {
258
+ const c = settings(cfg);
259
+ if (!c)
260
+ return;
261
+ const m = matchFlow(c, call);
262
+ if (!m || !m.steps.length)
263
+ return;
264
+ const r = await flowQueue.start(m.flow, m.steps, call);
265
+ if (r.status === 'approved')
266
+ return;
267
+ const step = r.steps[Math.min(r.current, r.steps.length - 1)];
268
+ return {
269
+ refuse: {
270
+ code: ERR_APPROVAL_REJECTED,
271
+ message: r.status === 'expired' ? `Tool call was not approved in time (flow ${r.flow}, step ${step?.name})` : `Tool call was denied (flow ${r.flow}, step ${step?.name})`,
272
+ data: { flow: r.flow, step: step?.name, approval: r.status, requestId: r.id, ...(r.reason ? { reason: r.reason } : {}) },
273
+ },
274
+ };
275
+ },
276
+ });
277
+ function decideRoute(router, operator) {
278
+ for (const action of ['approve', 'deny']) {
279
+ router.post(`/:id/${action}`, (req, res) => {
280
+ const b = (req.body && typeof req.body === 'object' && !Array.isArray(req.body) ? req.body : {});
281
+ const by = clientIdOf(req) ?? 'anonymous';
282
+ try {
283
+ const r = flowQueue.decide(String(req.params.id), action === 'approve', operator ? `operator:${by}` : by, typeof b.reason === 'string' ? b.reason : undefined, operator);
284
+ res.json(r);
285
+ }
286
+ catch (err) {
287
+ if (err instanceof FlowError)
288
+ return void res.status(err.status).json({ error: err.status === 404 ? 'Not Found' : err.status === 409 ? 'Conflict' : 'Forbidden', message: err.message });
289
+ throw err;
290
+ }
291
+ });
292
+ }
293
+ }
294
+ registerFeature({
295
+ id: 'approval-flows',
296
+ since: '7.7.0',
297
+ summary: 'Approvals 2.0: multi-step, conditional approval flows with named approvers and escalation',
298
+ mount: (router, ctx) => {
299
+ ctx.onStop?.(() => flowQueue.close());
300
+ router.get('/', (_req, res) => {
301
+ const c = settings(ctx.config());
302
+ res.json({ enabled: !!c, flows: c?.flows ?? [], pending: flowQueue.pending(), recent: flowQueue.history.slice(0, 50) });
303
+ });
304
+ router.post('/evaluate', (req, res) => {
305
+ const b = objectBody(req, res);
306
+ if (!b)
307
+ return;
308
+ if (typeof b.server !== 'string' || typeof b.tool !== 'string')
309
+ return badRequest(res, 'Body must be { "server", "tool", "client"?, "arguments"? }');
310
+ const c = settings(ctx.config());
311
+ const m = c ? matchFlow(c, { serverId: b.server, tool: b.tool, clientId: typeof b.client === 'string' ? b.client : undefined, args: b.arguments ?? {} }) : undefined;
312
+ res.json(m ? { flow: m.flow.id, steps: m.steps.map((s) => ({ name: s.name, approvers: s.approvers, required: s.required })), held: m.steps.length > 0 } : { flow: null, steps: [], held: false });
313
+ });
314
+ router.get('/:id', (req, res) => {
315
+ const r = flowQueue.get(req.params.id);
316
+ if (!r)
317
+ return void res.status(404).json({ error: 'Not Found', message: 'Approval request not found' });
318
+ res.json(r);
319
+ });
320
+ decideRoute(router, true);
321
+ },
322
+ mountClient: (router) => {
323
+ router.get('/inbox', (req, res) => {
324
+ const me = clientIdOf(req) ?? 'anonymous';
325
+ res.json({ client: me, pending: flowQueue.pending().filter((r) => flowQueue.canApprove(r, me)) });
326
+ });
327
+ router.get('/mine', (req, res) => {
328
+ const me = clientIdOf(req) ?? 'anonymous';
329
+ res.json({ client: me, pending: flowQueue.pending().filter((r) => r.clientId === me), recent: flowQueue.history.filter((r) => r.clientId === me).slice(0, 50) });
330
+ });
331
+ decideRoute(router, false);
332
+ },
333
+ });
334
+ //# sourceMappingURL=approval-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-flows.js","sourceRoot":"","sources":["../../src/features/approval-flows.ts"],"names":[],"mappings":"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"}
@@ -25,5 +25,6 @@ import './sanitize.js';
25
25
  import './semantic-cache.js';
26
26
  import './rollouts.js';
27
27
  import './offline.js';
28
+ import './approval-flows.js';
28
29
  export { listFeatures, registerFeature, createFeatureRouter } from '../gateway/features.js';
29
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AACzB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,eAAe,CAAC;AACvB,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,gBAAgB,CAAC;AACxB,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AACzB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,UAAU,CAAC;AAClB,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AACzB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,eAAe,CAAC;AACvB,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,gBAAgB,CAAC;AACxB,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AACzB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,UAAU,CAAC;AAClB,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,cAAc,CAAC;AACtB,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -25,5 +25,6 @@ import './sanitize.js';
25
25
  import './semantic-cache.js';
26
26
  import './rollouts.js';
27
27
  import './offline.js';
28
+ import './approval-flows.js';
28
29
  export { listFeatures, registerFeature, createFeatureRouter } from '../gateway/features.js';
29
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AACzB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,eAAe,CAAC;AACvB,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,gBAAgB,CAAC;AACxB,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AACzB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,UAAU,CAAC;AAClB,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AACzB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,eAAe,CAAC;AACvB,OAAO,UAAU,CAAC;AAClB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,gBAAgB,CAAC;AACxB,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AACzB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,UAAU,CAAC;AAClB,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,cAAc,CAAC;AACtB,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -49,11 +49,11 @@ export declare const McpGatewaySpecSchema: z.ZodObject<{
49
49
  }, "strict", z.ZodTypeAny, {
50
50
  config: Record<string, unknown>;
51
51
  port: number;
52
- replicas: number;
53
52
  resources: {
54
53
  requests?: Record<string, string> | undefined;
55
54
  limits?: Record<string, string> | undefined;
56
55
  };
56
+ replicas: number;
57
57
  serviceMonitor: boolean;
58
58
  image?: string | undefined;
59
59
  envFromSecret?: string | undefined;
@@ -66,11 +66,11 @@ export declare const McpGatewaySpecSchema: z.ZodObject<{
66
66
  }, {
67
67
  config?: Record<string, unknown> | undefined;
68
68
  port?: number | undefined;
69
- replicas?: number | undefined;
70
69
  resources?: {
71
70
  requests?: Record<string, string> | undefined;
72
71
  limits?: Record<string, string> | undefined;
73
72
  } | undefined;
73
+ replicas?: number | undefined;
74
74
  image?: string | undefined;
75
75
  envFromSecret?: string | undefined;
76
76
  autoscaling?: {
@@ -43,9 +43,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
43
43
  notUnder: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
44
44
  }, "strict", z.ZodTypeAny, {
45
45
  path: string;
46
+ in?: (string | number | boolean)[] | undefined;
46
47
  exists?: boolean | undefined;
47
48
  equals?: string | number | boolean | undefined;
48
- in?: (string | number | boolean)[] | undefined;
49
49
  glob?: string[] | undefined;
50
50
  notGlob?: string[] | undefined;
51
51
  regex?: string | undefined;
@@ -55,9 +55,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
55
55
  notUnder?: string[] | undefined;
56
56
  }, {
57
57
  path: string;
58
+ in?: (string | number | boolean)[] | undefined;
58
59
  exists?: boolean | undefined;
59
60
  equals?: string | number | boolean | undefined;
60
- in?: (string | number | boolean)[] | undefined;
61
61
  glob?: string[] | undefined;
62
62
  notGlob?: string[] | undefined;
63
63
  regex?: string | undefined;
@@ -76,9 +76,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
76
76
  clients?: string[] | undefined;
77
77
  args?: {
78
78
  path: string;
79
+ in?: (string | number | boolean)[] | undefined;
79
80
  exists?: boolean | undefined;
80
81
  equals?: string | number | boolean | undefined;
81
- in?: (string | number | boolean)[] | undefined;
82
82
  glob?: string[] | undefined;
83
83
  notGlob?: string[] | undefined;
84
84
  regex?: string | undefined;
@@ -96,9 +96,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
96
96
  clients?: string[] | undefined;
97
97
  args?: {
98
98
  path: string;
99
+ in?: (string | number | boolean)[] | undefined;
99
100
  exists?: boolean | undefined;
100
101
  equals?: string | number | boolean | undefined;
101
- in?: (string | number | boolean)[] | undefined;
102
102
  glob?: string[] | undefined;
103
103
  notGlob?: string[] | undefined;
104
104
  regex?: string | undefined;
@@ -120,9 +120,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
120
120
  clients?: string[] | undefined;
121
121
  args?: {
122
122
  path: string;
123
+ in?: (string | number | boolean)[] | undefined;
123
124
  exists?: boolean | undefined;
124
125
  equals?: string | number | boolean | undefined;
125
- in?: (string | number | boolean)[] | undefined;
126
126
  glob?: string[] | undefined;
127
127
  notGlob?: string[] | undefined;
128
128
  regex?: string | undefined;
@@ -143,9 +143,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
143
143
  clients?: string[] | undefined;
144
144
  args?: {
145
145
  path: string;
146
+ in?: (string | number | boolean)[] | undefined;
146
147
  exists?: boolean | undefined;
147
148
  equals?: string | number | boolean | undefined;
148
- in?: (string | number | boolean)[] | undefined;
149
149
  glob?: string[] | undefined;
150
150
  notGlob?: string[] | undefined;
151
151
  regex?: string | undefined;
@@ -166,9 +166,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
166
166
  clients?: string[] | undefined;
167
167
  args?: {
168
168
  path: string;
169
+ in?: (string | number | boolean)[] | undefined;
169
170
  exists?: boolean | undefined;
170
171
  equals?: string | number | boolean | undefined;
171
- in?: (string | number | boolean)[] | undefined;
172
172
  glob?: string[] | undefined;
173
173
  notGlob?: string[] | undefined;
174
174
  regex?: string | undefined;
@@ -189,9 +189,9 @@ export declare const CandidatePolicySchema: z.ZodEffects<z.ZodObject<{
189
189
  clients?: string[] | undefined;
190
190
  args?: {
191
191
  path: string;
192
+ in?: (string | number | boolean)[] | undefined;
192
193
  exists?: boolean | undefined;
193
194
  equals?: string | number | boolean | undefined;
194
- in?: (string | number | boolean)[] | undefined;
195
195
  glob?: string[] | undefined;
196
196
  notGlob?: string[] | undefined;
197
197
  regex?: string | undefined;
@@ -224,9 +224,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
224
224
  notUnder: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
225
225
  }, "strict", z.ZodTypeAny, {
226
226
  path: string;
227
+ in?: (string | number | boolean)[] | undefined;
227
228
  exists?: boolean | undefined;
228
229
  equals?: string | number | boolean | undefined;
229
- in?: (string | number | boolean)[] | undefined;
230
230
  glob?: string[] | undefined;
231
231
  notGlob?: string[] | undefined;
232
232
  regex?: string | undefined;
@@ -236,9 +236,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
236
236
  notUnder?: string[] | undefined;
237
237
  }, {
238
238
  path: string;
239
+ in?: (string | number | boolean)[] | undefined;
239
240
  exists?: boolean | undefined;
240
241
  equals?: string | number | boolean | undefined;
241
- in?: (string | number | boolean)[] | undefined;
242
242
  glob?: string[] | undefined;
243
243
  notGlob?: string[] | undefined;
244
244
  regex?: string | undefined;
@@ -257,9 +257,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
257
257
  clients?: string[] | undefined;
258
258
  args?: {
259
259
  path: string;
260
+ in?: (string | number | boolean)[] | undefined;
260
261
  exists?: boolean | undefined;
261
262
  equals?: string | number | boolean | undefined;
262
- in?: (string | number | boolean)[] | undefined;
263
263
  glob?: string[] | undefined;
264
264
  notGlob?: string[] | undefined;
265
265
  regex?: string | undefined;
@@ -277,9 +277,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
277
277
  clients?: string[] | undefined;
278
278
  args?: {
279
279
  path: string;
280
+ in?: (string | number | boolean)[] | undefined;
280
281
  exists?: boolean | undefined;
281
282
  equals?: string | number | boolean | undefined;
282
- in?: (string | number | boolean)[] | undefined;
283
283
  glob?: string[] | undefined;
284
284
  notGlob?: string[] | undefined;
285
285
  regex?: string | undefined;
@@ -302,9 +302,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
302
302
  clients?: string[] | undefined;
303
303
  args?: {
304
304
  path: string;
305
+ in?: (string | number | boolean)[] | undefined;
305
306
  exists?: boolean | undefined;
306
307
  equals?: string | number | boolean | undefined;
307
- in?: (string | number | boolean)[] | undefined;
308
308
  glob?: string[] | undefined;
309
309
  notGlob?: string[] | undefined;
310
310
  regex?: string | undefined;
@@ -326,9 +326,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
326
326
  clients?: string[] | undefined;
327
327
  args?: {
328
328
  path: string;
329
+ in?: (string | number | boolean)[] | undefined;
329
330
  exists?: boolean | undefined;
330
331
  equals?: string | number | boolean | undefined;
331
- in?: (string | number | boolean)[] | undefined;
332
332
  glob?: string[] | undefined;
333
333
  notGlob?: string[] | undefined;
334
334
  regex?: string | undefined;
@@ -350,9 +350,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
350
350
  clients?: string[] | undefined;
351
351
  args?: {
352
352
  path: string;
353
+ in?: (string | number | boolean)[] | undefined;
353
354
  exists?: boolean | undefined;
354
355
  equals?: string | number | boolean | undefined;
355
- in?: (string | number | boolean)[] | undefined;
356
356
  glob?: string[] | undefined;
357
357
  notGlob?: string[] | undefined;
358
358
  regex?: string | undefined;
@@ -374,9 +374,9 @@ export declare const PolicyShadowSchema: z.ZodEffects<z.ZodObject<{
374
374
  clients?: string[] | undefined;
375
375
  args?: {
376
376
  path: string;
377
+ in?: (string | number | boolean)[] | undefined;
377
378
  exists?: boolean | undefined;
378
379
  equals?: string | number | boolean | undefined;
379
- in?: (string | number | boolean)[] | undefined;
380
380
  glob?: string[] | undefined;
381
381
  notGlob?: string[] | undefined;
382
382
  regex?: string | undefined;