veto-sdk 2.5.1 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rules/feed-provider.d.ts +39 -0
- package/dist/rules/feed-provider.d.ts.map +1 -0
- package/dist/rules/feed-provider.js +65 -0
- package/dist/rules/feed-provider.js.map +1 -0
- package/dist/rules/index.d.ts +2 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +5 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/local-evaluator.d.ts +14 -3
- package/dist/rules/local-evaluator.d.ts.map +1 -1
- package/dist/rules/local-evaluator.js +20 -5
- package/dist/rules/local-evaluator.js.map +1 -1
- package/dist/rules/pipeline-dsl.d.ts +802 -0
- package/dist/rules/pipeline-dsl.d.ts.map +1 -0
- package/dist/rules/pipeline-dsl.js +198 -0
- package/dist/rules/pipeline-dsl.js.map +1 -0
- package/dist/rules/policy-ir-schema.d.ts +62 -0
- package/dist/rules/policy-ir-schema.d.ts.map +1 -1
- package/dist/rules/policy-ir-schema.js +58 -0
- package/dist/rules/policy-ir-schema.js.map +1 -1
- package/dist/rules/types.d.ts +78 -0
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +13 -0
- package/dist/rules/types.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed provider utilities for the local evaluator.
|
|
3
|
+
*
|
|
4
|
+
* The evaluator itself is sync and accepts any object implementing the
|
|
5
|
+
* FeedProvider interface declared in `./types.ts`. This module ships an
|
|
6
|
+
* in-memory reference provider suitable for tests, the CLI, and SDK
|
|
7
|
+
* consumers who manage refreshes externally.
|
|
8
|
+
*
|
|
9
|
+
* @module rules/feed-provider
|
|
10
|
+
*/
|
|
11
|
+
import type { FeedConditionValue, FeedProvider, FeedSnapshot, PipelineConditionValue } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Trivial in-memory provider. Caller `put()`s snapshots; evaluator `get()`s them.
|
|
14
|
+
*
|
|
15
|
+
* Not thread-safe. Not persistent. Intended for tests and single-process
|
|
16
|
+
* SDK usage. Platform code should provide its own Redis/KV-backed
|
|
17
|
+
* implementation.
|
|
18
|
+
*/
|
|
19
|
+
export declare class InMemoryFeedProvider implements FeedProvider {
|
|
20
|
+
private readonly store;
|
|
21
|
+
put(feedId: string, snapshot: FeedSnapshot): void;
|
|
22
|
+
get(feedId: string, _version?: string): FeedSnapshot | undefined;
|
|
23
|
+
clear(): void;
|
|
24
|
+
size(): number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a FeedRef / PipelineRef to an array comparand suitable for
|
|
28
|
+
* set-membership operators.
|
|
29
|
+
*
|
|
30
|
+
* Returns `{ resolved: unknown[] }` on hit, `{ fallback: "fail_open" | "fail_closed" }`
|
|
31
|
+
* on miss/stale. Caller decides enforcement semantics per the ref's
|
|
32
|
+
* `fallback` field.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveFeedRef(ref: FeedConditionValue | PipelineConditionValue, provider: FeedProvider | undefined, now_ms?: number): {
|
|
35
|
+
resolved: unknown[];
|
|
36
|
+
} | {
|
|
37
|
+
fallback: 'fail_open' | 'fail_closed';
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=feed-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-provider.d.ts","sourceRoot":"","sources":["../../src/rules/feed-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IAEzD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIjD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhE,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAGf;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,kBAAkB,GAAG,sBAAsB,EAChD,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,MAAM,GAAE,MAAmB,GAC1B;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAA;CAAE,CA2BrE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed provider utilities for the local evaluator.
|
|
3
|
+
*
|
|
4
|
+
* The evaluator itself is sync and accepts any object implementing the
|
|
5
|
+
* FeedProvider interface declared in `./types.ts`. This module ships an
|
|
6
|
+
* in-memory reference provider suitable for tests, the CLI, and SDK
|
|
7
|
+
* consumers who manage refreshes externally.
|
|
8
|
+
*
|
|
9
|
+
* @module rules/feed-provider
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Trivial in-memory provider. Caller `put()`s snapshots; evaluator `get()`s them.
|
|
13
|
+
*
|
|
14
|
+
* Not thread-safe. Not persistent. Intended for tests and single-process
|
|
15
|
+
* SDK usage. Platform code should provide its own Redis/KV-backed
|
|
16
|
+
* implementation.
|
|
17
|
+
*/
|
|
18
|
+
export class InMemoryFeedProvider {
|
|
19
|
+
store = new Map();
|
|
20
|
+
put(feedId, snapshot) {
|
|
21
|
+
this.store.set(feedId, snapshot);
|
|
22
|
+
}
|
|
23
|
+
get(feedId, _version) {
|
|
24
|
+
return this.store.get(feedId);
|
|
25
|
+
}
|
|
26
|
+
clear() {
|
|
27
|
+
this.store.clear();
|
|
28
|
+
}
|
|
29
|
+
size() {
|
|
30
|
+
return this.store.size;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a FeedRef / PipelineRef to an array comparand suitable for
|
|
35
|
+
* set-membership operators.
|
|
36
|
+
*
|
|
37
|
+
* Returns `{ resolved: unknown[] }` on hit, `{ fallback: "fail_open" | "fail_closed" }`
|
|
38
|
+
* on miss/stale. Caller decides enforcement semantics per the ref's
|
|
39
|
+
* `fallback` field.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveFeedRef(ref, provider, now_ms = Date.now()) {
|
|
42
|
+
const fallbackRoute = () => ({
|
|
43
|
+
fallback: ref.fallback === 'fail_closed' ? 'fail_closed' : 'fail_open',
|
|
44
|
+
});
|
|
45
|
+
if (provider === undefined)
|
|
46
|
+
return fallbackRoute();
|
|
47
|
+
const id = ref.kind === 'feed' ? ref.feed_id : ref.pipeline_id;
|
|
48
|
+
const snapshot = provider.get(id, ref.version);
|
|
49
|
+
if (snapshot === undefined)
|
|
50
|
+
return fallbackRoute();
|
|
51
|
+
// Defensive: a non-finite clock (NaN/Infinity) would make the staleness
|
|
52
|
+
// check meaningless and could let a stale snapshot through silently.
|
|
53
|
+
if (!Number.isFinite(now_ms) || !Number.isFinite(snapshot.refreshed_at_ms)) {
|
|
54
|
+
return ref.fallback === 'last_known_good'
|
|
55
|
+
? { resolved: snapshot.data }
|
|
56
|
+
: fallbackRoute();
|
|
57
|
+
}
|
|
58
|
+
const age_sec = Math.max(0, Math.floor((now_ms - snapshot.refreshed_at_ms) / 1000));
|
|
59
|
+
const stale = age_sec > ref.max_staleness_sec;
|
|
60
|
+
// last_known_good explicitly opts into stale snapshots.
|
|
61
|
+
if (stale && ref.fallback !== 'last_known_good')
|
|
62
|
+
return fallbackRoute();
|
|
63
|
+
return { resolved: snapshot.data };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=feed-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-provider.js","sourceRoot":"","sources":["../../src/rules/feed-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACd,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEzD,GAAG,CAAC,MAAc,EAAE,QAAsB;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,QAAiB;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAgD,EAChD,QAAkC,EAClC,SAAiB,IAAI,CAAC,GAAG,EAAE;IAE3B,MAAM,aAAa,GAAG,GAA8C,EAAE,CAAC,CAAC;QACtE,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;KACvE,CAAC,CAAC;IAEH,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,aAAa,EAAE,CAAC;IAEnD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;IAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,aAAa,EAAE,CAAC;IAEnD,wEAAwE;IACxE,qEAAqE;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC3E,OAAO,GAAG,CAAC,QAAQ,KAAK,iBAAiB;YACvC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;YAC7B,CAAC,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAE9C,wDAAwD;IACxD,IAAI,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB;QAAE,OAAO,aAAa,EAAE,CAAC;IAExE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -12,5 +12,6 @@ export * from './schema-validator.js';
|
|
|
12
12
|
export * from './policy-ir-schema.js';
|
|
13
13
|
export * from './condition-evaluator.js';
|
|
14
14
|
export * from './patterns.js';
|
|
15
|
-
export {
|
|
15
|
+
export { InMemoryFeedProvider, resolveFeedRef } from './feed-provider.js';
|
|
16
|
+
export { evaluateRulesLocally, evaluateCondition as evaluateConditionLocally, resolveFieldPath as resolveLocalFieldPath, type LocalEvalResult, type LocalEvalOptions, } from './local-evaluator.js';
|
|
16
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAK9B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,IAAI,wBAAwB,EAC7C,gBAAgB,IAAI,qBAAqB,EACzC,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC"}
|
package/dist/rules/index.js
CHANGED
|
@@ -12,5 +12,10 @@ export * from './schema-validator.js';
|
|
|
12
12
|
export * from './policy-ir-schema.js';
|
|
13
13
|
export * from './condition-evaluator.js';
|
|
14
14
|
export * from './patterns.js';
|
|
15
|
+
// NOTE: `./pipeline-dsl.js` is deliberately NOT re-exported here. It depends
|
|
16
|
+
// on `zod` (optional peerDep) and `node:crypto`. Consumers import it via the
|
|
17
|
+
// dedicated `veto-sdk/rules/pipeline-dsl` subpath so that the rules barrel
|
|
18
|
+
// remains zod-free for existing callers.
|
|
19
|
+
export { InMemoryFeedProvider, resolveFeedRef } from './feed-provider.js';
|
|
15
20
|
export { evaluateRulesLocally, evaluateCondition as evaluateConditionLocally, resolveFieldPath as resolveLocalFieldPath, } from './local-evaluator.js';
|
|
16
21
|
//# sourceMappingURL=index.js.map
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,IAAI,wBAAwB,EAC7C,gBAAgB,IAAI,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,IAAI,wBAAwB,EAC7C,gBAAgB,IAAI,qBAAqB,GAG1C,MAAM,sBAAsB,CAAC"}
|
|
@@ -17,12 +17,23 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @module rules/local-evaluator
|
|
19
19
|
*/
|
|
20
|
-
import type { Rule, RuleCondition } from './types.js';
|
|
20
|
+
import type { FeedProvider, Rule, RuleCondition } from './types.js';
|
|
21
21
|
export interface LocalEvalResult {
|
|
22
22
|
decision: 'allow' | 'deny' | 'require_approval' | null;
|
|
23
23
|
reason?: string;
|
|
24
24
|
ruleId?: string;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Optional knobs for local evaluation.
|
|
28
|
+
*
|
|
29
|
+
* `feedProvider` is required for rules whose condition values reference
|
|
30
|
+
* dynamic feeds. When absent, feed-backed conditions apply their
|
|
31
|
+
* `fallback` behavior exactly as if the snapshot were missing.
|
|
32
|
+
*/
|
|
33
|
+
export interface LocalEvalOptions {
|
|
34
|
+
feedProvider?: FeedProvider;
|
|
35
|
+
now_ms?: number;
|
|
36
|
+
}
|
|
26
37
|
/**
|
|
27
38
|
* Resolve a dot-notation field path in a nested object.
|
|
28
39
|
*
|
|
@@ -50,7 +61,7 @@ export declare function resolveFieldPath(path: string, obj: Record<string, unkno
|
|
|
50
61
|
*
|
|
51
62
|
* Unknown operators return false.
|
|
52
63
|
*/
|
|
53
|
-
export declare function evaluateCondition(condition: RuleCondition, context: Record<string, unknown
|
|
64
|
+
export declare function evaluateCondition(condition: RuleCondition, context: Record<string, unknown>, options?: LocalEvalOptions): boolean;
|
|
54
65
|
/**
|
|
55
66
|
* Evaluate an array of rules against a tool call.
|
|
56
67
|
*
|
|
@@ -61,5 +72,5 @@ export declare function evaluateCondition(condition: RuleCondition, context: Rec
|
|
|
61
72
|
* @param toolName - The tool being called (e.g. "browser_click")
|
|
62
73
|
* @param args - Context object for field resolution (typically `{ arguments: { ... } }`)
|
|
63
74
|
*/
|
|
64
|
-
export declare function evaluateRulesLocally(rules: Rule[], toolName: string, args: Record<string, unknown
|
|
75
|
+
export declare function evaluateRulesLocally(rules: Rule[], toolName: string, args: Record<string, unknown>, options?: LocalEvalOptions): LocalEvalResult;
|
|
65
76
|
//# sourceMappingURL=local-evaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/local-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"local-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/local-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAST;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAmKT;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAiCjB"}
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @module rules/local-evaluator
|
|
19
19
|
*/
|
|
20
|
+
import { isConditionValueRef } from './types.js';
|
|
20
21
|
import { createSafeRegex, evaluateTimeWindow } from './condition-evaluator.js';
|
|
22
|
+
import { resolveFeedRef } from './feed-provider.js';
|
|
21
23
|
/**
|
|
22
24
|
* Resolve a dot-notation field path in a nested object.
|
|
23
25
|
*
|
|
@@ -56,13 +58,26 @@ export function resolveFieldPath(path, obj) {
|
|
|
56
58
|
*
|
|
57
59
|
* Unknown operators return false.
|
|
58
60
|
*/
|
|
59
|
-
export function evaluateCondition(condition, context) {
|
|
61
|
+
export function evaluateCondition(condition, context, options = {}) {
|
|
60
62
|
if (!condition.field || !condition.operator)
|
|
61
63
|
return false;
|
|
62
64
|
const fieldValue = resolveFieldPath(condition.field, context);
|
|
63
|
-
|
|
65
|
+
let expected = condition.value;
|
|
64
66
|
if (fieldValue === undefined && condition.operator !== 'not_exists')
|
|
65
67
|
return false;
|
|
68
|
+
// Resolve typed FeedRef / PipelineRef comparands against the injected
|
|
69
|
+
// provider. On miss/stale we apply the fallback and return. On hit,
|
|
70
|
+
// `expected` is reassigned to the resolved array — set-membership
|
|
71
|
+
// operators use it normally; other operators compare against the
|
|
72
|
+
// array and correctly fail their type checks below.
|
|
73
|
+
if (isConditionValueRef(expected)) {
|
|
74
|
+
const outcome = resolveFeedRef(expected, options.feedProvider, options.now_ms);
|
|
75
|
+
if ('fallback' in outcome) {
|
|
76
|
+
// fail_open: do not match. fail_closed: match.
|
|
77
|
+
return outcome.fallback === 'fail_closed';
|
|
78
|
+
}
|
|
79
|
+
expected = outcome.resolved;
|
|
80
|
+
}
|
|
66
81
|
switch (condition.operator) {
|
|
67
82
|
case 'equals':
|
|
68
83
|
if (typeof fieldValue === 'string' && typeof expected === 'string') {
|
|
@@ -222,7 +237,7 @@ export function evaluateCondition(condition, context) {
|
|
|
222
237
|
* @param toolName - The tool being called (e.g. "browser_click")
|
|
223
238
|
* @param args - Context object for field resolution (typically `{ arguments: { ... } }`)
|
|
224
239
|
*/
|
|
225
|
-
export function evaluateRulesLocally(rules, toolName, args) {
|
|
240
|
+
export function evaluateRulesLocally(rules, toolName, args, options = {}) {
|
|
226
241
|
for (const rule of rules) {
|
|
227
242
|
if (!rule.enabled)
|
|
228
243
|
continue;
|
|
@@ -232,12 +247,12 @@ export function evaluateRulesLocally(rules, toolName, args) {
|
|
|
232
247
|
// If `conditions` is present and non-empty, evaluate only those.
|
|
233
248
|
// Otherwise fall through to `condition_groups`.
|
|
234
249
|
if (rule.conditions && rule.conditions.length > 0) {
|
|
235
|
-
const allMatch = rule.conditions.every(c => evaluateCondition(c, args));
|
|
250
|
+
const allMatch = rule.conditions.every(c => evaluateCondition(c, args, options));
|
|
236
251
|
if (!allMatch)
|
|
237
252
|
continue;
|
|
238
253
|
}
|
|
239
254
|
else if (rule.condition_groups && rule.condition_groups.length > 0) {
|
|
240
|
-
const anyGroupMatch = rule.condition_groups.some(group => group.every(c => evaluateCondition(c, args)));
|
|
255
|
+
const anyGroupMatch = rule.condition_groups.some(group => group.every(c => evaluateCondition(c, args, options)));
|
|
241
256
|
if (!anyGroupMatch)
|
|
242
257
|
continue;
|
|
243
258
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-evaluator.js","sourceRoot":"","sources":["../../src/rules/local-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"local-evaluator.js","sourceRoot":"","sources":["../../src/rules/local-evaluator.ts"],"names":[],"mappings":"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"}
|