@adonis-agora/agent 0.34.1 → 0.36.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/CHANGELOG.md +24 -0
- package/README.md +34 -0
- package/dist/assets/spa/assets/index-7XqfoeQH.js +9 -0
- package/dist/assets/spa/index.html +1 -1
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +4 -0
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/agent-deps-factory.d.ts +5 -0
- package/dist/src/agent-deps-factory.d.ts.map +1 -1
- package/dist/src/agent-deps-factory.js +6 -0
- package/dist/src/agent-deps-factory.js.map +1 -1
- package/dist/src/agent-deps.d.ts +5 -0
- package/dist/src/agent-deps.d.ts.map +1 -1
- package/dist/src/agent-deps.js.map +1 -1
- package/dist/src/define_config.d.ts +12 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/guardrails/agent.d.ts +211 -0
- package/dist/src/guardrails/agent.d.ts.map +1 -0
- package/dist/src/guardrails/agent.js +433 -0
- package/dist/src/guardrails/agent.js.map +1 -0
- package/dist/src/guardrails/detectors/custom.d.ts +9 -0
- package/dist/src/guardrails/detectors/custom.d.ts.map +1 -0
- package/dist/src/guardrails/detectors/custom.js +81 -0
- package/dist/src/guardrails/detectors/custom.js.map +1 -0
- package/dist/src/guardrails/detectors/injection.d.ts +23 -0
- package/dist/src/guardrails/detectors/injection.d.ts.map +1 -0
- package/dist/src/guardrails/detectors/injection.js +208 -0
- package/dist/src/guardrails/detectors/injection.js.map +1 -0
- package/dist/src/guardrails/detectors/pii.d.ts +23 -0
- package/dist/src/guardrails/detectors/pii.d.ts.map +1 -0
- package/dist/src/guardrails/detectors/pii.js +295 -0
- package/dist/src/guardrails/detectors/pii.js.map +1 -0
- package/dist/src/guardrails/detectors/secrets.d.ts +5 -0
- package/dist/src/guardrails/detectors/secrets.d.ts.map +1 -0
- package/dist/src/guardrails/detectors/secrets.js +110 -0
- package/dist/src/guardrails/detectors/secrets.js.map +1 -0
- package/dist/src/guardrails/detectors/tool-poisoning.d.ts +16 -0
- package/dist/src/guardrails/detectors/tool-poisoning.d.ts.map +1 -0
- package/dist/src/guardrails/detectors/tool-poisoning.js +116 -0
- package/dist/src/guardrails/detectors/tool-poisoning.js.map +1 -0
- package/dist/src/guardrails/engine.d.ts +90 -0
- package/dist/src/guardrails/engine.d.ts.map +1 -0
- package/dist/src/guardrails/engine.js +324 -0
- package/dist/src/guardrails/engine.js.map +1 -0
- package/dist/src/guardrails/glob.d.ts +4 -0
- package/dist/src/guardrails/glob.d.ts.map +1 -0
- package/dist/src/guardrails/glob.js +20 -0
- package/dist/src/guardrails/glob.js.map +1 -0
- package/dist/src/guardrails/index.d.ts +20 -0
- package/dist/src/guardrails/index.d.ts.map +1 -0
- package/dist/src/guardrails/index.js +20 -0
- package/dist/src/guardrails/index.js.map +1 -0
- package/dist/src/guardrails/segments.d.ts +14 -0
- package/dist/src/guardrails/segments.d.ts.map +1 -0
- package/dist/src/guardrails/segments.js +32 -0
- package/dist/src/guardrails/segments.js.map +1 -0
- package/dist/src/guardrails/types.d.ts +161 -0
- package/dist/src/guardrails/types.d.ts.map +1 -0
- package/dist/src/guardrails/types.js +49 -0
- package/dist/src/guardrails/types.js.map +1 -0
- package/dist/src/guardrails/vault.d.ts +44 -0
- package/dist/src/guardrails/vault.d.ts.map +1 -0
- package/dist/src/guardrails/vault.js +103 -0
- package/dist/src/guardrails/vault.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/mcp-client/index.d.ts +1 -1
- package/dist/src/mcp-client/index.d.ts.map +1 -1
- package/dist/src/mcp-client/index.js.map +1 -1
- package/dist/src/mcp-client/options.d.ts +32 -0
- package/dist/src/mcp-client/options.d.ts.map +1 -1
- package/dist/src/mcp-client/tool-source.d.ts +2 -0
- package/dist/src/mcp-client/tool-source.d.ts.map +1 -1
- package/dist/src/mcp-client/tool-source.js +27 -1
- package/dist/src/mcp-client/tool-source.js.map +1 -1
- package/dist/src/rag/http-reranker.d.ts +46 -0
- package/dist/src/rag/http-reranker.d.ts.map +1 -0
- package/dist/src/rag/http-reranker.js +83 -0
- package/dist/src/rag/http-reranker.js.map +1 -0
- package/dist/src/rag/hybrid-retriever.d.ts +6 -1
- package/dist/src/rag/hybrid-retriever.d.ts.map +1 -1
- package/dist/src/rag/hybrid-retriever.js +27 -3
- package/dist/src/rag/hybrid-retriever.js.map +1 -1
- package/dist/src/rag/index.d.ts +6 -2
- package/dist/src/rag/index.d.ts.map +1 -1
- package/dist/src/rag/index.js +6 -2
- package/dist/src/rag/index.js.map +1 -1
- package/dist/src/rag/lexical-query.d.ts +28 -0
- package/dist/src/rag/lexical-query.d.ts.map +1 -0
- package/dist/src/rag/lexical-query.js +90 -0
- package/dist/src/rag/lexical-query.js.map +1 -0
- package/dist/src/rag/lexical-retriever.d.ts +23 -0
- package/dist/src/rag/lexical-retriever.d.ts.map +1 -0
- package/dist/src/rag/lexical-retriever.js +28 -0
- package/dist/src/rag/lexical-retriever.js.map +1 -0
- package/dist/src/rag/openai-embeddings.d.ts +62 -0
- package/dist/src/rag/openai-embeddings.d.ts.map +1 -0
- package/dist/src/rag/openai-embeddings.js +106 -0
- package/dist/src/rag/openai-embeddings.js.map +1 -0
- package/dist/src/rag/pg-vector-store.d.ts +133 -6
- package/dist/src/rag/pg-vector-store.d.ts.map +1 -1
- package/dist/src/rag/pg-vector-store.js +272 -31
- package/dist/src/rag/pg-vector-store.js.map +1 -1
- package/dist/src/rag/vector-store.d.ts +15 -0
- package/dist/src/rag/vector-store.d.ts.map +1 -1
- package/dist/src/rag/vector-store.js +4 -0
- package/dist/src/rag/vector-store.js.map +1 -1
- package/dist/src/stores/factory.d.ts +25 -3
- package/dist/src/stores/factory.d.ts.map +1 -1
- package/dist/src/stores/factory.js +21 -3
- package/dist/src/stores/factory.js.map +1 -1
- package/dist/src/testing/fake-embedding-provider.d.ts +12 -0
- package/dist/src/testing/fake-embedding-provider.d.ts.map +1 -1
- package/dist/src/testing/fake-embedding-provider.js +35 -0
- package/dist/src/testing/fake-embedding-provider.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -1
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -1
- package/dist/src/testing/index.js.map +1 -1
- package/package.json +9 -3
- package/dist/assets/spa/assets/index-DjIMQOxi.js +0 -9
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { detectKeywords, detectRegex } from './detectors/custom.js';
|
|
2
|
+
import { scoreInjection } from './detectors/injection.js';
|
|
3
|
+
import { detectPii } from './detectors/pii.js';
|
|
4
|
+
import { detectSecrets } from './detectors/secrets.js';
|
|
5
|
+
import { scoreToolText } from './detectors/tool-poisoning.js';
|
|
6
|
+
import { matchesAny } from './glob.js';
|
|
7
|
+
import { ACTION_SEVERITY, } from './types.js';
|
|
8
|
+
import { labelFor, Vault } from './vault.js';
|
|
9
|
+
export const DEFAULT_MESSAGES = {
|
|
10
|
+
llm_request: "This message was blocked by your organization's AI guardrails.",
|
|
11
|
+
llm_response: "The answer was withheld by your organization's AI guardrails.",
|
|
12
|
+
tool_args: "This tool call was blocked by your organization's AI guardrails.",
|
|
13
|
+
tool_result: "The tool's result was withheld by your organization's AI guardrails.",
|
|
14
|
+
tool_description: "This tool was quarantined by your organization's AI guardrails.",
|
|
15
|
+
};
|
|
16
|
+
export const DEFAULT_APPROVAL_MESSAGE = "This needs approval under your organization's AI guardrails before it can go ahead.";
|
|
17
|
+
/** What replaces an instruction-like finding: it is removed, not tokenized. */
|
|
18
|
+
export const INJECTION_REPLACEMENT = '[removed: suspected prompt injection]';
|
|
19
|
+
const ruleName = (rule) => rule.name ?? rule.id;
|
|
20
|
+
/** Whether a rule's scope covers the context (stage, tool, `when`). Segments are filtered apart. */
|
|
21
|
+
export function ruleApplies(rule, ctx) {
|
|
22
|
+
if (rule.enabled === false || !rule.stages.includes(ctx.stage))
|
|
23
|
+
return false;
|
|
24
|
+
const tools = rule.match?.tools;
|
|
25
|
+
if (tools?.length) {
|
|
26
|
+
const toolStage = ctx.stage === 'tool_args' || ctx.stage === 'tool_result' || ctx.stage === 'tool_description';
|
|
27
|
+
if (!toolStage || !matchesAny(ctx.tool ?? '', tools))
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return rule.when === undefined || rule.when(ctx);
|
|
31
|
+
}
|
|
32
|
+
export function orderRules(rules) {
|
|
33
|
+
return [...rules].sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100) || ruleName(a).localeCompare(ruleName(b)));
|
|
34
|
+
}
|
|
35
|
+
/** Runs one detector on one text. A custom detector's throw is the rule's fail mode to decide. */
|
|
36
|
+
export async function runDetector(spec, text, ctx) {
|
|
37
|
+
if (!text)
|
|
38
|
+
return [];
|
|
39
|
+
switch (spec.kind) {
|
|
40
|
+
case 'pii':
|
|
41
|
+
return detectPii(text, spec.types?.length ? spec.types : undefined);
|
|
42
|
+
case 'secrets':
|
|
43
|
+
return detectSecrets(text, spec.types?.length ? spec.types : undefined);
|
|
44
|
+
case 'injection':
|
|
45
|
+
return scoreInjection(text, spec.threshold ?? 0.5).findings;
|
|
46
|
+
case 'tool_poisoning':
|
|
47
|
+
return scoreToolText(text, spec.threshold ?? 0.5).findings;
|
|
48
|
+
case 'regex':
|
|
49
|
+
return detectRegex(text, spec.patterns, spec.label ?? 'custom');
|
|
50
|
+
case 'keywords':
|
|
51
|
+
return detectKeywords(text, spec.words, spec.label ?? 'keywords');
|
|
52
|
+
case 'custom':
|
|
53
|
+
return spec.detect(text, ctx);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The in-process detectors of a rule set, as one span locator — what a stream window must never
|
|
58
|
+
* cut through (see `StreamGuard`'s `locate`). Custom detectors are left out: they may be remote.
|
|
59
|
+
*/
|
|
60
|
+
export function spanLocator(rules) {
|
|
61
|
+
const specs = rules
|
|
62
|
+
.flatMap((r) => r.detectors)
|
|
63
|
+
.filter((d) => d.kind !== 'custom' && d.kind !== 'tool_poisoning');
|
|
64
|
+
if (specs.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
return (text) => specs.flatMap((d) => {
|
|
67
|
+
switch (d.kind) {
|
|
68
|
+
case 'pii':
|
|
69
|
+
return detectPii(text, d.types?.length ? d.types : undefined);
|
|
70
|
+
case 'secrets':
|
|
71
|
+
return detectSecrets(text, d.types?.length ? d.types : undefined);
|
|
72
|
+
case 'regex':
|
|
73
|
+
return detectRegex(text, d.patterns);
|
|
74
|
+
case 'keywords':
|
|
75
|
+
return detectKeywords(text, d.words);
|
|
76
|
+
case 'injection':
|
|
77
|
+
return scoreInjection(text, 0).findings;
|
|
78
|
+
default:
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Non-overlapping spans. Overlapping findings are merged into their union (nothing that any
|
|
85
|
+
* detector found is left uncovered), labelled by the longer finding (ties: the higher score) —
|
|
86
|
+
* an injected HTML comment that contains an email address is removed as a whole. With `text`, a
|
|
87
|
+
* merged span's value is re-read from it.
|
|
88
|
+
*/
|
|
89
|
+
export function resolveOverlaps(findings, text) {
|
|
90
|
+
const sorted = [...findings]
|
|
91
|
+
.filter((f) => f.spanned !== false && f.end > f.start)
|
|
92
|
+
.sort((a, b) => a.start - b.start || b.end - a.end || b.score - a.score);
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const f of sorted) {
|
|
95
|
+
const last = out[out.length - 1];
|
|
96
|
+
if (!last || f.start >= last.end) {
|
|
97
|
+
out.push({ ...f });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const longer = f.end - f.start > last.end - last.start ||
|
|
101
|
+
(f.end - f.start === last.end - last.start && f.score > last.score)
|
|
102
|
+
? f
|
|
103
|
+
: last;
|
|
104
|
+
const merged = { ...longer, start: last.start, end: Math.max(last.end, f.end) };
|
|
105
|
+
if (text !== undefined)
|
|
106
|
+
merged.value = text.slice(merged.start, merged.end);
|
|
107
|
+
out[out.length - 1] = merged;
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** Placeholder text for a finding. Instruction-like findings are removed, not tokenized. */
|
|
112
|
+
function replacementFor(f, vault, restorable) {
|
|
113
|
+
if (f.replacement !== undefined)
|
|
114
|
+
return f.replacement;
|
|
115
|
+
if (f.detector === 'injection' || f.detector === 'tool_poisoning')
|
|
116
|
+
return INJECTION_REPLACEMENT;
|
|
117
|
+
return vault.tokenFor(labelFor(f.category), f.value, restorable);
|
|
118
|
+
}
|
|
119
|
+
export function applyRedactions(text, findings, vault, restorable) {
|
|
120
|
+
const whole = findings.find((f) => f.spanned === false);
|
|
121
|
+
if (whole) {
|
|
122
|
+
return { text: whole.replacement ?? `[removed: ${whole.category}]`, count: 1 };
|
|
123
|
+
}
|
|
124
|
+
const spans = resolveOverlaps(findings, text);
|
|
125
|
+
if (spans.length === 0)
|
|
126
|
+
return { text, count: 0 };
|
|
127
|
+
let out = '';
|
|
128
|
+
let at = 0;
|
|
129
|
+
for (const f of spans) {
|
|
130
|
+
out += text.slice(at, f.start) + replacementFor(f, vault, restorable);
|
|
131
|
+
at = f.end;
|
|
132
|
+
}
|
|
133
|
+
return { text: out + text.slice(at), count: spans.length };
|
|
134
|
+
}
|
|
135
|
+
function memoKey(spec) {
|
|
136
|
+
return spec.kind === 'custom' ? `custom\u0000${spec.name}` : JSON.stringify(spec);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Evaluates the rules for one stage over a set of segments. Rules run by ascending priority; an
|
|
140
|
+
* `allow` rule that fires stops evaluation; otherwise every firing rule contributes and the most
|
|
141
|
+
* severe action wins (block > approve > redact > log). Detector results are shared between rules.
|
|
142
|
+
*
|
|
143
|
+
* Blocking applies to the NEWEST turn: content found only in re-sent history (`fresh: false`) was
|
|
144
|
+
* already refused once, so it is removed one-way instead — the conversation can go on and the value
|
|
145
|
+
* still never reaches the model.
|
|
146
|
+
*/
|
|
147
|
+
export async function scan(rules, ctx, segments, vault = new Vault(), options = {}) {
|
|
148
|
+
const started = performance.now();
|
|
149
|
+
const applicable = orderRules(rules).filter((r) => ruleApplies(r, ctx));
|
|
150
|
+
const result = {
|
|
151
|
+
stage: ctx.stage,
|
|
152
|
+
action: 'allow',
|
|
153
|
+
segments: segments.map((s) => s.text),
|
|
154
|
+
changed: false,
|
|
155
|
+
hits: [],
|
|
156
|
+
vault,
|
|
157
|
+
redactions: 0,
|
|
158
|
+
latencyMs: 0,
|
|
159
|
+
};
|
|
160
|
+
if (applicable.length === 0 || segments.length === 0) {
|
|
161
|
+
result.latencyMs = performance.now() - started;
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
const stageMessage = options.messages?.[ctx.stage] ?? DEFAULT_MESSAGES[ctx.stage];
|
|
165
|
+
const restorableStage = (options.restorableStages ?? ['llm_request']).includes(ctx.stage);
|
|
166
|
+
const memo = new Map();
|
|
167
|
+
const detect = (spec, index) => {
|
|
168
|
+
const key = `${index}\u0000${memoKey(spec)}`;
|
|
169
|
+
let p = memo.get(key);
|
|
170
|
+
if (!p) {
|
|
171
|
+
// Wrapped so a synchronous throw becomes a rejection the fail mode can decide on.
|
|
172
|
+
p = Promise.resolve().then(() => runDetector(spec, segments[index]?.text ?? '', ctx));
|
|
173
|
+
memo.set(key, p);
|
|
174
|
+
}
|
|
175
|
+
return p;
|
|
176
|
+
};
|
|
177
|
+
const outcomes = [];
|
|
178
|
+
for (const rule of applicable) {
|
|
179
|
+
const sources = rule.match?.sources;
|
|
180
|
+
const indexes = segments
|
|
181
|
+
.map((s, i) => ({ s, i }))
|
|
182
|
+
.filter(({ s }) => !sources?.length || !s.source || sources.includes(s.source))
|
|
183
|
+
.map(({ i }) => i);
|
|
184
|
+
const outcome = { rule, bySegment: new Map() };
|
|
185
|
+
if (rule.detectors.length === 0) {
|
|
186
|
+
// Scope-only rule: fires for everything in scope (an exemption, or a blanket block/approval).
|
|
187
|
+
if (rule.action === 'allow' || rule.action === 'block' || rule.action === 'approve')
|
|
188
|
+
outcomes.push(outcome);
|
|
189
|
+
if (rule.action === 'allow')
|
|
190
|
+
break;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const jobs = rule.detectors.flatMap((spec) => indexes.map(async (i) => ({ i, found: await detect(spec, i) })));
|
|
194
|
+
const settled = await Promise.allSettled(jobs);
|
|
195
|
+
for (const s of settled) {
|
|
196
|
+
if (s.status === 'rejected') {
|
|
197
|
+
outcome.failed = s.reason?.message ?? String(s.reason);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (s.value.found.length === 0)
|
|
201
|
+
continue;
|
|
202
|
+
const list = outcome.bySegment.get(s.value.i) ?? [];
|
|
203
|
+
list.push(...s.value.found);
|
|
204
|
+
outcome.bySegment.set(s.value.i, list);
|
|
205
|
+
}
|
|
206
|
+
if (outcome.bySegment.size === 0 && !outcome.failed)
|
|
207
|
+
continue;
|
|
208
|
+
outcomes.push(outcome);
|
|
209
|
+
if (rule.action === 'allow' && outcome.bySegment.size > 0)
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
// Combine: most severe action; redactions of every redact rule.
|
|
213
|
+
const redactBySegment = new Map();
|
|
214
|
+
for (const o of outcomes) {
|
|
215
|
+
const { rule } = o;
|
|
216
|
+
const name = ruleName(rule);
|
|
217
|
+
const failMode = rule.options?.failMode ?? 'open';
|
|
218
|
+
let action = rule.action;
|
|
219
|
+
if (o.failed) {
|
|
220
|
+
result.hits.push({
|
|
221
|
+
ruleId: rule.id,
|
|
222
|
+
ruleName: name,
|
|
223
|
+
action: failMode === 'closed' ? 'block' : 'log',
|
|
224
|
+
detector: 'detector_error',
|
|
225
|
+
category: 'error.detector_unavailable',
|
|
226
|
+
score: 0,
|
|
227
|
+
count: 1,
|
|
228
|
+
values: [],
|
|
229
|
+
fresh: true,
|
|
230
|
+
error: o.failed.slice(0, 300),
|
|
231
|
+
failMode,
|
|
232
|
+
});
|
|
233
|
+
if (failMode === 'closed' && o.bySegment.size === 0)
|
|
234
|
+
action = 'block';
|
|
235
|
+
else if (o.bySegment.size === 0)
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const historyOnly = (action === 'block' || action === 'approve') &&
|
|
239
|
+
o.bySegment.size > 0 &&
|
|
240
|
+
[...o.bySegment.keys()].every((i) => segments[i]?.fresh === false);
|
|
241
|
+
if (historyOnly) {
|
|
242
|
+
action = 'redact';
|
|
243
|
+
for (const [i, findings] of o.bySegment) {
|
|
244
|
+
const entry = redactBySegment.get(i) ?? { findings: [], restorable: false };
|
|
245
|
+
entry.findings.push(...findings);
|
|
246
|
+
redactBySegment.set(i, entry);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (ACTION_SEVERITY[action] > ACTION_SEVERITY[result.action]) {
|
|
250
|
+
result.action = action;
|
|
251
|
+
if (action === 'block' || action === 'approve') {
|
|
252
|
+
result.decisive = {
|
|
253
|
+
id: rule.id,
|
|
254
|
+
name,
|
|
255
|
+
message: rule.options?.message ||
|
|
256
|
+
(o.failed && o.bySegment.size === 0
|
|
257
|
+
? `${stageMessage} (a required check could not run)`
|
|
258
|
+
: action === 'approve'
|
|
259
|
+
? (options.approvalMessage ?? DEFAULT_APPROVAL_MESSAGE)
|
|
260
|
+
: stageMessage),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (o.bySegment.size === 0 && rule.detectors.length === 0) {
|
|
265
|
+
result.hits.push({
|
|
266
|
+
ruleId: rule.id,
|
|
267
|
+
ruleName: name,
|
|
268
|
+
action,
|
|
269
|
+
detector: 'scope',
|
|
270
|
+
category: 'scope.match',
|
|
271
|
+
score: 1,
|
|
272
|
+
count: 1,
|
|
273
|
+
values: [],
|
|
274
|
+
fresh: true,
|
|
275
|
+
});
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
// Hits: one per category per rule, with distinct values and whether any occurrence is fresh.
|
|
279
|
+
const grouped = new Map();
|
|
280
|
+
for (const [i, findings] of o.bySegment) {
|
|
281
|
+
for (const f of findings) {
|
|
282
|
+
const hit = grouped.get(f.category) ?? {
|
|
283
|
+
ruleId: rule.id,
|
|
284
|
+
ruleName: name,
|
|
285
|
+
action,
|
|
286
|
+
detector: f.detector,
|
|
287
|
+
category: f.category,
|
|
288
|
+
score: 0,
|
|
289
|
+
count: 0,
|
|
290
|
+
values: [],
|
|
291
|
+
fresh: false,
|
|
292
|
+
};
|
|
293
|
+
hit.count++;
|
|
294
|
+
hit.score = Math.max(hit.score, f.score);
|
|
295
|
+
if (f.value && !hit.values.includes(f.value) && hit.values.length < 20)
|
|
296
|
+
hit.values.push(f.value);
|
|
297
|
+
if (segments[i]?.fresh !== false)
|
|
298
|
+
hit.fresh = true;
|
|
299
|
+
grouped.set(f.category, hit);
|
|
300
|
+
}
|
|
301
|
+
if (action === 'redact' && !historyOnly) {
|
|
302
|
+
const entry = redactBySegment.get(i) ?? { findings: [], restorable: false };
|
|
303
|
+
entry.findings.push(...findings);
|
|
304
|
+
entry.restorable ||= restorableStage && rule.options?.restore !== false;
|
|
305
|
+
redactBySegment.set(i, entry);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
result.hits.push(...grouped.values());
|
|
309
|
+
}
|
|
310
|
+
if (result.action !== 'block' && result.action !== 'approve') {
|
|
311
|
+
for (const [i, { findings, restorable }] of redactBySegment) {
|
|
312
|
+
const original = segments[i]?.text ?? '';
|
|
313
|
+
const { text, count } = applyRedactions(original, findings, vault, restorable);
|
|
314
|
+
if (count > 0 && text !== original) {
|
|
315
|
+
result.segments[i] = text;
|
|
316
|
+
result.redactions += count;
|
|
317
|
+
result.changed = true;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
result.latencyMs = performance.now() - started;
|
|
322
|
+
return result;
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/guardrails/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Minimal glob: `*` matches any run of characters, `?` a single one. Case-sensitive. */
|
|
2
|
+
export declare function globToRegExp(pattern: string): RegExp;
|
|
3
|
+
export declare function matchesAny(value: string, patterns: readonly string[] | undefined): boolean;
|
|
4
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/guardrails/glob.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAG1F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const cache = new Map();
|
|
2
|
+
/** Minimal glob: `*` matches any run of characters, `?` a single one. Case-sensitive. */
|
|
3
|
+
export function globToRegExp(pattern) {
|
|
4
|
+
let re = cache.get(pattern);
|
|
5
|
+
if (!re) {
|
|
6
|
+
const body = pattern
|
|
7
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
8
|
+
.replace(/\*/g, '.*')
|
|
9
|
+
.replace(/\?/g, '.');
|
|
10
|
+
re = new RegExp(`^${body}$`);
|
|
11
|
+
cache.set(pattern, re);
|
|
12
|
+
}
|
|
13
|
+
return re;
|
|
14
|
+
}
|
|
15
|
+
export function matchesAny(value, patterns) {
|
|
16
|
+
if (!patterns || patterns.length === 0)
|
|
17
|
+
return true;
|
|
18
|
+
return patterns.some((p) => globToRegExp(p).test(value));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/guardrails/glob.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,OAAO;aACjB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;aACpC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAuC;IAC/E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@adonis-agora/agent/guardrails` — PII, secret, prompt-injection and tool-poisoning detection, a
|
|
3
|
+
* rule engine with reversible redaction, and the adapter onto the agent loop's processor seams.
|
|
4
|
+
*
|
|
5
|
+
* A port of `@dudousxd/nestjs-agent-core/guardrails` (the reference implementation, see PARITY.md):
|
|
6
|
+
* the detectors and the engine are the same code. The provider wire-format helpers and the SSE
|
|
7
|
+
* `StreamGuard` live only there, since nothing in this package proxies raw provider traffic.
|
|
8
|
+
*/
|
|
9
|
+
export { type AgentGuardContext, createGuardrails, GuardrailBlockedError, type GuardrailEvent, type GuardrailEventHit, type GuardrailRulesSource, Guardrails, type GuardrailsOptions, type InjectionShorthand, InMemoryVaultStore, type PiiShorthand, type SecretsShorthand, screenToolDefinition, shorthandRules, type ToolPoisoningShorthand, type VaultStore, } from './agent.js';
|
|
10
|
+
export { compileGuardPattern, detectKeywords, detectRegex, fold } from './detectors/custom.js';
|
|
11
|
+
export { decodeTagChars, INJECTION_SIGNALS, type InjectionResult, type Signal, scoreInjection, } from './detectors/injection.js';
|
|
12
|
+
export { cardBrand, cnpjValid, cpfValid, detectPii, ibanValid, isIPv4, luhnValid, phoneValid, ssnValid, } from './detectors/pii.js';
|
|
13
|
+
export { detectSecrets, entropy } from './detectors/secrets.js';
|
|
14
|
+
export { type PoisoningResult, scoreToolText, type ToolDefinitionText, toolText, } from './detectors/tool-poisoning.js';
|
|
15
|
+
export { applyRedactions, DEFAULT_APPROVAL_MESSAGE, DEFAULT_MESSAGES, type GuardHit, INJECTION_REPLACEMENT, orderRules, resolveOverlaps, ruleApplies, runDetector, type ScanOptions, type ScanResult, scan, spanLocator, } from './engine.js';
|
|
16
|
+
export { globToRegExp, matchesAny } from './glob.js';
|
|
17
|
+
export { jsonSlots, type Slot } from './segments.js';
|
|
18
|
+
export { ACTION_SEVERITY, type CustomDetector, type DetectorKind, type DetectorSpec, type Finding, GUARDRAIL_STAGES, type GuardContext, type GuardrailAction, type GuardrailMatch, type GuardrailOptions, type GuardrailRule, type GuardrailStage, PII_TYPES, type PiiType, SECRET_TYPES, type SecretType, type Segment, type SegmentSource, } from './types.js';
|
|
19
|
+
export { labelFor, Vault, type VaultSnapshot } from './vault.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,cAAc,EACd,KAAK,sBAAsB,EAC3B,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,KAAK,eAAe,EACpB,aAAa,EACb,KAAK,kBAAkB,EACvB,QAAQ,GACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,QAAQ,EACb,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,IAAI,EACJ,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,SAAS,EACT,KAAK,OAAO,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@adonis-agora/agent/guardrails` — PII, secret, prompt-injection and tool-poisoning detection, a
|
|
3
|
+
* rule engine with reversible redaction, and the adapter onto the agent loop's processor seams.
|
|
4
|
+
*
|
|
5
|
+
* A port of `@dudousxd/nestjs-agent-core/guardrails` (the reference implementation, see PARITY.md):
|
|
6
|
+
* the detectors and the engine are the same code. The provider wire-format helpers and the SSE
|
|
7
|
+
* `StreamGuard` live only there, since nothing in this package proxies raw provider traffic.
|
|
8
|
+
*/
|
|
9
|
+
export { createGuardrails, GuardrailBlockedError, Guardrails, InMemoryVaultStore, screenToolDefinition, shorthandRules, } from './agent.js';
|
|
10
|
+
export { compileGuardPattern, detectKeywords, detectRegex, fold } from './detectors/custom.js';
|
|
11
|
+
export { decodeTagChars, INJECTION_SIGNALS, scoreInjection, } from './detectors/injection.js';
|
|
12
|
+
export { cardBrand, cnpjValid, cpfValid, detectPii, ibanValid, isIPv4, luhnValid, phoneValid, ssnValid, } from './detectors/pii.js';
|
|
13
|
+
export { detectSecrets, entropy } from './detectors/secrets.js';
|
|
14
|
+
export { scoreToolText, toolText, } from './detectors/tool-poisoning.js';
|
|
15
|
+
export { applyRedactions, DEFAULT_APPROVAL_MESSAGE, DEFAULT_MESSAGES, INJECTION_REPLACEMENT, orderRules, resolveOverlaps, ruleApplies, runDetector, scan, spanLocator, } from './engine.js';
|
|
16
|
+
export { globToRegExp, matchesAny } from './glob.js';
|
|
17
|
+
export { jsonSlots } from './segments.js';
|
|
18
|
+
export { ACTION_SEVERITY, GUARDRAIL_STAGES, PII_TYPES, SECRET_TYPES, } from './types.js';
|
|
19
|
+
export { labelFor, Vault } from './vault.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,gBAAgB,EAChB,qBAAqB,EAIrB,UAAU,EAGV,kBAAkB,EAGlB,oBAAoB,EACpB,cAAc,GAGf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,iBAAiB,EAGjB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAEL,aAAa,EAEb,QAAQ,GACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAEhB,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,WAAW,EACX,WAAW,EAGX,IAAI,EACJ,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,eAAe,EAKf,gBAAgB,EAOhB,SAAS,EAET,YAAY,GAIb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAsB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Segment, SegmentSource } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Text slots of structured values (tool arguments, tool results): each slot is a piece of text to
|
|
4
|
+
* scan plus a setter that writes the (redacted / restored) text back in place.
|
|
5
|
+
*/
|
|
6
|
+
export interface Slot {
|
|
7
|
+
segment: Segment;
|
|
8
|
+
set(text: string): void;
|
|
9
|
+
/** The text lives inside a JSON document (tool-call arguments): restored values are escaped. */
|
|
10
|
+
json?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** String leaves of a JSON value (tool arguments, structured results). */
|
|
13
|
+
export declare function jsonSlots(root: unknown, source: SegmentSource, fresh: boolean, replaceRoot?: (v: string) => void): Slot[];
|
|
14
|
+
//# sourceMappingURL=segments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../../src/guardrails/segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gGAAgG;IAChG,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID,0EAA0E;AAC1E,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAChC,IAAI,EAAE,CAkCR"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const MAX_SLOTS = 2_000;
|
|
2
|
+
/** String leaves of a JSON value (tool arguments, structured results). */
|
|
3
|
+
export function jsonSlots(root, source, fresh, replaceRoot) {
|
|
4
|
+
const out = [];
|
|
5
|
+
const walk = (value, set, depth) => {
|
|
6
|
+
if (out.length >= MAX_SLOTS || depth > 10)
|
|
7
|
+
return;
|
|
8
|
+
if (typeof value === 'string') {
|
|
9
|
+
if (value)
|
|
10
|
+
out.push({ segment: { text: value, source, fresh }, set });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
for (let i = 0; i < value.length; i++) {
|
|
15
|
+
walk(value[i], (t) => {
|
|
16
|
+
value[i] = t;
|
|
17
|
+
}, depth + 1);
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (value && typeof value === 'object') {
|
|
22
|
+
const o = value;
|
|
23
|
+
for (const k of Object.keys(o))
|
|
24
|
+
walk(o[k], (t) => {
|
|
25
|
+
o[k] = t;
|
|
26
|
+
}, depth + 1);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
walk(root, replaceRoot ?? (() => undefined), 0);
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=segments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments.js","sourceRoot":"","sources":["../../../src/guardrails/segments.ts"],"names":[],"mappings":"AAaA,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CACvB,IAAa,EACb,MAAqB,EACrB,KAAc,EACd,WAAiC;IAEjC,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,GAAwB,EAAE,KAAa,EAAE,EAAE;QACvE,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CACF,KAAK,CAAC,CAAC,CAAC,EACR,CAAC,CAAC,EAAE,EAAE;oBACJ,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC,EACD,KAAK,GAAG,CAAC,CACV,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,KAAgC,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,IAAI,CACF,CAAC,CAAC,CAAC,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE;oBACJ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,CAAC,EACD,KAAK,GAAG,CAAC,CACV,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC"}
|