@polpo-ai/core 0.15.43 → 0.15.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -0
- package/dist/__tests__/guardrail-detectors.test.d.ts +2 -0
- package/dist/__tests__/guardrail-detectors.test.d.ts.map +1 -0
- package/dist/__tests__/guardrail-detectors.test.js +316 -0
- package/dist/__tests__/guardrail-detectors.test.js.map +1 -0
- package/dist/__tests__/guardrail-engine.test.d.ts +2 -0
- package/dist/__tests__/guardrail-engine.test.d.ts.map +1 -0
- package/dist/__tests__/guardrail-engine.test.js +415 -0
- package/dist/__tests__/guardrail-engine.test.js.map +1 -0
- package/dist/__tests__/loop-context-trust.test.d.ts +2 -0
- package/dist/__tests__/loop-context-trust.test.d.ts.map +1 -0
- package/dist/__tests__/loop-context-trust.test.js +41 -0
- package/dist/__tests__/loop-context-trust.test.js.map +1 -0
- package/dist/__tests__/output-guardrails.test.d.ts +2 -0
- package/dist/__tests__/output-guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/output-guardrails.test.js +151 -0
- package/dist/__tests__/output-guardrails.test.js.map +1 -0
- package/dist/__tests__/runtime-context.test.d.ts +2 -0
- package/dist/__tests__/runtime-context.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-context.test.js +204 -0
- package/dist/__tests__/runtime-context.test.js.map +1 -0
- package/dist/__tests__/runtime-inspection.test.d.ts +2 -0
- package/dist/__tests__/runtime-inspection.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-inspection.test.js +189 -0
- package/dist/__tests__/runtime-inspection.test.js.map +1 -0
- package/dist/__tests__/task-execution-router.test.js +62 -0
- package/dist/__tests__/task-execution-router.test.js.map +1 -1
- package/dist/adapter.d.ts +20 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/guardrails/detectors.d.ts +24 -0
- package/dist/guardrails/detectors.d.ts.map +1 -0
- package/dist/guardrails/detectors.js +416 -0
- package/dist/guardrails/detectors.js.map +1 -0
- package/dist/guardrails/engine.d.ts +12 -0
- package/dist/guardrails/engine.d.ts.map +1 -0
- package/dist/guardrails/engine.js +189 -0
- package/dist/guardrails/engine.js.map +1 -0
- package/dist/guardrails/errors.d.ts +17 -0
- package/dist/guardrails/errors.d.ts.map +1 -0
- package/dist/guardrails/errors.js +23 -0
- package/dist/guardrails/errors.js.map +1 -0
- package/dist/guardrails/index.d.ts +8 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +7 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/output-policy.d.ts +4 -0
- package/dist/guardrails/output-policy.d.ts.map +1 -0
- package/dist/guardrails/output-policy.js +64 -0
- package/dist/guardrails/output-policy.js.map +1 -0
- package/dist/guardrails/settings.d.ts +12 -0
- package/dist/guardrails/settings.d.ts.map +1 -0
- package/dist/guardrails/settings.js +108 -0
- package/dist/guardrails/settings.js.map +1 -0
- package/dist/guardrails/tool-middleware.d.ts +6 -0
- package/dist/guardrails/tool-middleware.d.ts.map +1 -0
- package/dist/guardrails/tool-middleware.js +128 -0
- package/dist/guardrails/tool-middleware.js.map +1 -0
- package/dist/guardrails/types.d.ts +148 -0
- package/dist/guardrails/types.d.ts.map +1 -0
- package/dist/guardrails/types.js +2 -0
- package/dist/guardrails/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/loop/step-helpers.d.ts +2 -1
- package/dist/loop/step-helpers.d.ts.map +1 -1
- package/dist/loop/step-helpers.js +37 -4
- package/dist/loop/step-helpers.js.map +1 -1
- package/dist/runtime-context/context.d.ts +17 -0
- package/dist/runtime-context/context.d.ts.map +1 -0
- package/dist/runtime-context/context.js +338 -0
- package/dist/runtime-context/context.js.map +1 -0
- package/dist/runtime-context/index.d.ts +2 -1
- package/dist/runtime-context/index.d.ts.map +1 -1
- package/dist/runtime-context/index.js +1 -0
- package/dist/runtime-context/index.js.map +1 -1
- package/dist/runtime-context/types.d.ts +30 -0
- package/dist/runtime-context/types.d.ts.map +1 -1
- package/dist/runtime-context/types.js.map +1 -1
- package/dist/runtime-inspection/accounting.d.ts +4 -0
- package/dist/runtime-inspection/accounting.d.ts.map +1 -0
- package/dist/runtime-inspection/accounting.js +145 -0
- package/dist/runtime-inspection/accounting.js.map +1 -0
- package/dist/runtime-inspection/index.d.ts +4 -0
- package/dist/runtime-inspection/index.d.ts.map +1 -0
- package/dist/runtime-inspection/index.js +3 -0
- package/dist/runtime-inspection/index.js.map +1 -0
- package/dist/runtime-inspection/types.d.ts +40 -0
- package/dist/runtime-inspection/types.d.ts.map +1 -0
- package/dist/runtime-inspection/types.js +22 -0
- package/dist/runtime-inspection/types.js.map +1 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +59 -15
- package/dist/task-runner.js.map +1 -1
- package/dist/types/config.d.ts +12 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { GuardrailAbortedError } from "./errors.js";
|
|
2
|
+
const VALID_ACTIONS = new Set([
|
|
3
|
+
"allow",
|
|
4
|
+
"audit",
|
|
5
|
+
"taint",
|
|
6
|
+
"redact",
|
|
7
|
+
"rewrite",
|
|
8
|
+
"block",
|
|
9
|
+
"approval",
|
|
10
|
+
]);
|
|
11
|
+
const VALID_RISKS = new Set([
|
|
12
|
+
"none",
|
|
13
|
+
"low",
|
|
14
|
+
"medium",
|
|
15
|
+
"high",
|
|
16
|
+
"critical",
|
|
17
|
+
]);
|
|
18
|
+
function cloneValue(value, seen = new WeakMap()) {
|
|
19
|
+
if (value === null || typeof value !== "object")
|
|
20
|
+
return value;
|
|
21
|
+
const existing = seen.get(value);
|
|
22
|
+
if (existing !== undefined)
|
|
23
|
+
return existing;
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
const clone = [];
|
|
26
|
+
seen.set(value, clone);
|
|
27
|
+
for (const item of value)
|
|
28
|
+
clone.push(cloneValue(item, seen));
|
|
29
|
+
return clone;
|
|
30
|
+
}
|
|
31
|
+
if (value instanceof Date)
|
|
32
|
+
return new Date(value.getTime());
|
|
33
|
+
const clone = {};
|
|
34
|
+
seen.set(value, clone);
|
|
35
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
36
|
+
clone[key] = cloneValue(entry, seen);
|
|
37
|
+
}
|
|
38
|
+
return clone;
|
|
39
|
+
}
|
|
40
|
+
function freezeValue(value, seen = new WeakSet()) {
|
|
41
|
+
if (value === null || typeof value !== "object" || seen.has(value))
|
|
42
|
+
return value;
|
|
43
|
+
seen.add(value);
|
|
44
|
+
for (const entry of Object.values(value))
|
|
45
|
+
freezeValue(entry, seen);
|
|
46
|
+
return Object.freeze(value);
|
|
47
|
+
}
|
|
48
|
+
function freezeEvaluation(value, decisions, terminalAction) {
|
|
49
|
+
const frozenDecisions = Object.freeze(decisions.map((decision) => Object.freeze(decision)));
|
|
50
|
+
return Object.freeze({
|
|
51
|
+
value: freezeValue(value),
|
|
52
|
+
decisions: frozenDecisions,
|
|
53
|
+
...(terminalAction ? { terminalAction } : {}),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function assertPolicyResult(policy, result) {
|
|
57
|
+
if (!VALID_ACTIONS.has(result.action)) {
|
|
58
|
+
throw new Error(`Policy "${policy.id}" returned an invalid action`);
|
|
59
|
+
}
|
|
60
|
+
if (!VALID_RISKS.has(result.risk)) {
|
|
61
|
+
throw new Error(`Policy "${policy.id}" returned an invalid risk`);
|
|
62
|
+
}
|
|
63
|
+
if (typeof result.reason !== "string" || result.reason.trim().length === 0) {
|
|
64
|
+
throw new Error(`Policy "${policy.id}" returned an empty reason`);
|
|
65
|
+
}
|
|
66
|
+
if ((result.action === "redact" || result.action === "rewrite") &&
|
|
67
|
+
!Object.prototype.hasOwnProperty.call(result, "value")) {
|
|
68
|
+
throw new Error(`Policy "${policy.id}" must return a value for ${result.action}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function defaultPolicyFailure(input, options) {
|
|
72
|
+
if (input.tool?.sideEffect === "read" && options.readOnlyPolicyFailure !== "block") {
|
|
73
|
+
return { action: "audit", risk: "medium" };
|
|
74
|
+
}
|
|
75
|
+
return { action: "block", risk: "high" };
|
|
76
|
+
}
|
|
77
|
+
export class RuntimeGuardrailEngine {
|
|
78
|
+
policies;
|
|
79
|
+
options;
|
|
80
|
+
sequence = 0;
|
|
81
|
+
constructor(policies, options = {}) {
|
|
82
|
+
this.policies = policies
|
|
83
|
+
.map((policy, index) => ({ policy, index }))
|
|
84
|
+
.sort((a, b) => (a.policy.priority ?? 100) - (b.policy.priority ?? 100) || a.index - b.index)
|
|
85
|
+
.map(({ policy }) => policy);
|
|
86
|
+
this.options = options;
|
|
87
|
+
}
|
|
88
|
+
async evaluate(input) {
|
|
89
|
+
this.throwIfAborted(input.signal);
|
|
90
|
+
let value = freezeValue(cloneValue(input.value));
|
|
91
|
+
const decisions = [];
|
|
92
|
+
for (const policy of this.policies) {
|
|
93
|
+
if (!policy.phases.includes(input.phase))
|
|
94
|
+
continue;
|
|
95
|
+
this.throwIfAborted(input.signal, decisions);
|
|
96
|
+
const startedAt = (this.options.now ?? Date.now)();
|
|
97
|
+
let result;
|
|
98
|
+
let failure;
|
|
99
|
+
try {
|
|
100
|
+
result = await policy.evaluate(Object.freeze({
|
|
101
|
+
...input,
|
|
102
|
+
value,
|
|
103
|
+
}));
|
|
104
|
+
this.throwIfAborted(input.signal, decisions);
|
|
105
|
+
if (result)
|
|
106
|
+
assertPolicyResult(policy, result);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof GuardrailAbortedError)
|
|
110
|
+
throw error;
|
|
111
|
+
failure = error;
|
|
112
|
+
result = null;
|
|
113
|
+
}
|
|
114
|
+
const latencyMs = Math.max(0, (this.options.now ?? Date.now)() - startedAt);
|
|
115
|
+
let decision;
|
|
116
|
+
if (failure) {
|
|
117
|
+
const fallback = defaultPolicyFailure(input, this.options);
|
|
118
|
+
decision = {
|
|
119
|
+
id: this.createId(),
|
|
120
|
+
policyId: policy.id,
|
|
121
|
+
...(policy.version ? { policyVersion: policy.version } : {}),
|
|
122
|
+
phase: input.phase,
|
|
123
|
+
action: fallback.action,
|
|
124
|
+
risk: fallback.risk,
|
|
125
|
+
reason: "Policy evaluation failed",
|
|
126
|
+
latencyMs,
|
|
127
|
+
fallbackUsed: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
else if (result) {
|
|
131
|
+
decision = {
|
|
132
|
+
id: this.createId(),
|
|
133
|
+
policyId: policy.id,
|
|
134
|
+
...(policy.version ? { policyVersion: policy.version } : {}),
|
|
135
|
+
phase: input.phase,
|
|
136
|
+
action: result.action,
|
|
137
|
+
risk: result.risk,
|
|
138
|
+
reason: result.reason.trim(),
|
|
139
|
+
latencyMs,
|
|
140
|
+
fallbackUsed: result.fallbackUsed ?? false,
|
|
141
|
+
};
|
|
142
|
+
if (result.action === "redact" || result.action === "rewrite") {
|
|
143
|
+
value = freezeValue(cloneValue(result.value));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!decision)
|
|
147
|
+
continue;
|
|
148
|
+
const frozenDecision = Object.freeze(decision);
|
|
149
|
+
decisions.push(frozenDecision);
|
|
150
|
+
await this.emitDecision(frozenDecision, input);
|
|
151
|
+
this.throwIfAborted(input.signal, decisions);
|
|
152
|
+
if (decision.action === "block" || decision.action === "approval") {
|
|
153
|
+
return freezeEvaluation(value, decisions, decision.action);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return freezeEvaluation(value, decisions);
|
|
157
|
+
}
|
|
158
|
+
createId() {
|
|
159
|
+
return this.options.createId?.() ?? `guardrail-${++this.sequence}`;
|
|
160
|
+
}
|
|
161
|
+
throwIfAborted(signal, decisions = []) {
|
|
162
|
+
if (signal?.aborted)
|
|
163
|
+
throw new GuardrailAbortedError(undefined, decisions);
|
|
164
|
+
}
|
|
165
|
+
async emitDecision(decision, input) {
|
|
166
|
+
try {
|
|
167
|
+
await this.options.onDecision?.(Object.freeze({
|
|
168
|
+
decision,
|
|
169
|
+
context: input.context,
|
|
170
|
+
...(input.tool
|
|
171
|
+
? {
|
|
172
|
+
tool: Object.freeze({
|
|
173
|
+
name: input.tool.name,
|
|
174
|
+
callId: input.tool.callId,
|
|
175
|
+
sideEffect: input.tool.sideEffect,
|
|
176
|
+
}),
|
|
177
|
+
}
|
|
178
|
+
: {}),
|
|
179
|
+
...(input.outputTruncated !== undefined
|
|
180
|
+
? { outputTruncated: input.outputTruncated }
|
|
181
|
+
: {}),
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Audit sinks are observational and cannot change enforcement.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# 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,17 @@
|
|
|
1
|
+
import type { RuntimeGuardrailDecision } from "../runtime-plan/types.js";
|
|
2
|
+
export declare class GuardrailError extends Error {
|
|
3
|
+
readonly decisions: readonly RuntimeGuardrailDecision[];
|
|
4
|
+
constructor(message: string, decisions?: readonly RuntimeGuardrailDecision[]);
|
|
5
|
+
}
|
|
6
|
+
export declare class GuardrailBlockedError extends GuardrailError {
|
|
7
|
+
readonly code = "guardrail_blocked";
|
|
8
|
+
}
|
|
9
|
+
export declare class GuardrailApprovalRequiredError extends GuardrailError {
|
|
10
|
+
readonly code = "guardrail_approval_required";
|
|
11
|
+
}
|
|
12
|
+
export declare class GuardrailAbortedError extends GuardrailError {
|
|
13
|
+
readonly code = "guardrail_aborted";
|
|
14
|
+
readonly outcomeUncertain: boolean;
|
|
15
|
+
constructor(message?: string, decisions?: readonly RuntimeGuardrailDecision[], outcomeUncertain?: boolean);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/guardrails/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;gBAE5C,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,SAAS,wBAAwB,EAAO;CAKjF;AAED,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,uBAAuB;CACrC;AAED,qBAAa,8BAA+B,SAAQ,cAAc;IAChE,QAAQ,CAAC,IAAI,iCAAiC;CAC/C;AAED,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAGjC,OAAO,SAAqC,EAC5C,SAAS,GAAE,SAAS,wBAAwB,EAAO,EACnD,gBAAgB,UAAQ;CAK3B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class GuardrailError extends Error {
|
|
2
|
+
decisions;
|
|
3
|
+
constructor(message, decisions = []) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = new.target.name;
|
|
6
|
+
this.decisions = Object.freeze([...decisions]);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class GuardrailBlockedError extends GuardrailError {
|
|
10
|
+
code = "guardrail_blocked";
|
|
11
|
+
}
|
|
12
|
+
export class GuardrailApprovalRequiredError extends GuardrailError {
|
|
13
|
+
code = "guardrail_approval_required";
|
|
14
|
+
}
|
|
15
|
+
export class GuardrailAbortedError extends GuardrailError {
|
|
16
|
+
code = "guardrail_aborted";
|
|
17
|
+
outcomeUncertain;
|
|
18
|
+
constructor(message = "Guardrail evaluation was aborted", decisions = [], outcomeUncertain = false) {
|
|
19
|
+
super(message, decisions);
|
|
20
|
+
this.outcomeUncertain = outcomeUncertain;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/guardrails/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,SAAS,CAAsC;IAExD,YAAY,OAAe,EAAE,YAAiD,EAAE;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,cAAc;IAC9C,IAAI,GAAG,mBAAmB,CAAC;CACrC;AAED,MAAM,OAAO,8BAA+B,SAAQ,cAAc;IACvD,IAAI,GAAG,6BAA6B,CAAC;CAC/C;AAED,MAAM,OAAO,qBAAsB,SAAQ,cAAc;IAC9C,IAAI,GAAG,mBAAmB,CAAC;IAC3B,gBAAgB,CAAU;IAEnC,YACE,OAAO,GAAG,kCAAkC,EAC5C,YAAiD,EAAE,EACnD,gBAAgB,GAAG,KAAK;QAExB,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { GuardrailAbortedError, GuardrailApprovalRequiredError, GuardrailBlockedError, GuardrailError, } from "./errors.js";
|
|
2
|
+
export { RuntimeGuardrailEngine } from "./engine.js";
|
|
3
|
+
export { createBoundedValuePolicy, createCrossScopePolicy, createDefaultOutputGuardrailPolicies, createDefaultToolGuardrailPolicies, createDestructiveOperationPolicy, createPrivateNetworkPolicy, createSecretPatternPolicy, createToolArgumentsPolicy, } from "./detectors.js";
|
|
4
|
+
export { createRunOutputPolicy } from "./output-policy.js";
|
|
5
|
+
export { createRunToolMiddleware, inferToolSideEffect, wrapRunToolExecutor, } from "./tool-middleware.js";
|
|
6
|
+
export { createConfiguredRunToolMiddleware, createConfiguredRunOutputPolicy, normalizeRuntimeGuardrailSettings, } from "./settings.js";
|
|
7
|
+
export type { RunToolExecutionResult, RunOutputPolicy, RunOutputPolicyOptions, RunOutputPolicyRequest, RunOutputPolicyResult, RunToolMiddleware, RunToolMiddlewareOptions, RunToolNext, RunToolRequest, RuntimeGuardrailApprovalHandler, RuntimeGuardrailApprovalResult, RuntimeGuardrailOutputApprovalHandler, RuntimeGuardrailAuditEvent, RuntimeGuardrailContext, RuntimeGuardrailEngineOptions, RuntimeGuardrailEvaluation, RuntimeGuardrailEvaluationInput, RuntimeGuardrailHostAdapters, RuntimeGuardrailPolicy, RuntimeGuardrailPolicyResult, RuntimeGuardrailSettings, RuntimeOutputEnforcementMode, RuntimeStreamingOutputMode, RuntimeGuardrailScope, RuntimeGuardrailToolContext, RuntimeToolSideEffect, } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,EACrB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oCAAoC,EACpC,kCAAkC,EAClC,gCAAgC,EAChC,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,EACxB,WAAW,EACX,cAAc,EACd,+BAA+B,EAC/B,8BAA8B,EAC9B,qCAAqC,EACrC,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC1B,+BAA+B,EAC/B,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,wBAAwB,EACxB,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { GuardrailAbortedError, GuardrailApprovalRequiredError, GuardrailBlockedError, GuardrailError, } from "./errors.js";
|
|
2
|
+
export { RuntimeGuardrailEngine } from "./engine.js";
|
|
3
|
+
export { createBoundedValuePolicy, createCrossScopePolicy, createDefaultOutputGuardrailPolicies, createDefaultToolGuardrailPolicies, createDestructiveOperationPolicy, createPrivateNetworkPolicy, createSecretPatternPolicy, createToolArgumentsPolicy, } from "./detectors.js";
|
|
4
|
+
export { createRunOutputPolicy } from "./output-policy.js";
|
|
5
|
+
export { createRunToolMiddleware, inferToolSideEffect, wrapRunToolExecutor, } from "./tool-middleware.js";
|
|
6
|
+
export { createConfiguredRunToolMiddleware, createConfiguredRunOutputPolicy, normalizeRuntimeGuardrailSettings, } from "./settings.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,EACrB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oCAAoC,EACpC,kCAAkC,EAClC,gCAAgC,EAChC,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RuntimeGuardrailEngine } from "./engine.js";
|
|
2
|
+
import type { RunOutputPolicy, RunOutputPolicyOptions } from "./types.js";
|
|
3
|
+
export declare function createRunOutputPolicy(engine: RuntimeGuardrailEngine, options?: RunOutputPolicyOptions): RunOutputPolicy;
|
|
4
|
+
//# sourceMappingURL=output-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-policy.d.ts","sourceRoot":"","sources":["../../src/guardrails/output-policy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAQpB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAmFjB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { GuardrailAbortedError, GuardrailApprovalRequiredError, GuardrailBlockedError, } from "./errors.js";
|
|
2
|
+
function terminalDecision(decisions) {
|
|
3
|
+
return decisions[decisions.length - 1];
|
|
4
|
+
}
|
|
5
|
+
export function createRunOutputPolicy(engine, options = {}) {
|
|
6
|
+
const streamingMode = options.streamingMode ?? "audit";
|
|
7
|
+
if (streamingMode !== "audit" && streamingMode !== "buffer") {
|
|
8
|
+
throw new TypeError('streamingMode must be "audit" or "buffer"');
|
|
9
|
+
}
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
streamingMode,
|
|
12
|
+
async evaluate(request) {
|
|
13
|
+
if (typeof request.output !== "string") {
|
|
14
|
+
throw new TypeError("Guardrail output must be a string");
|
|
15
|
+
}
|
|
16
|
+
if (request.mode !== "enforce" && request.mode !== "audit") {
|
|
17
|
+
throw new TypeError('Guardrail output mode must be "enforce" or "audit"');
|
|
18
|
+
}
|
|
19
|
+
const evaluation = await engine.evaluate({
|
|
20
|
+
phase: "output",
|
|
21
|
+
value: request.output,
|
|
22
|
+
context: request.context,
|
|
23
|
+
signal: request.signal,
|
|
24
|
+
});
|
|
25
|
+
if (request.mode === "audit") {
|
|
26
|
+
return Object.freeze({
|
|
27
|
+
output: request.output,
|
|
28
|
+
decisions: evaluation.decisions,
|
|
29
|
+
enforced: false,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (evaluation.terminalAction === "block") {
|
|
33
|
+
throw new GuardrailBlockedError(terminalDecision(evaluation.decisions).reason, evaluation.decisions);
|
|
34
|
+
}
|
|
35
|
+
if (evaluation.terminalAction === "approval") {
|
|
36
|
+
const decision = terminalDecision(evaluation.decisions);
|
|
37
|
+
if (!options.approval) {
|
|
38
|
+
throw new GuardrailApprovalRequiredError(decision.reason, evaluation.decisions);
|
|
39
|
+
}
|
|
40
|
+
const approval = await options.approval(Object.freeze({
|
|
41
|
+
...request,
|
|
42
|
+
output: typeof evaluation.value === "string"
|
|
43
|
+
? evaluation.value
|
|
44
|
+
: request.output,
|
|
45
|
+
}), decision);
|
|
46
|
+
if (request.signal?.aborted) {
|
|
47
|
+
throw new GuardrailAbortedError("Guardrail output approval was interrupted", evaluation.decisions);
|
|
48
|
+
}
|
|
49
|
+
if (approval !== "approved") {
|
|
50
|
+
throw new GuardrailBlockedError("Guardrail output approval was denied", evaluation.decisions);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (typeof evaluation.value !== "string") {
|
|
54
|
+
throw new GuardrailBlockedError("Guardrail rewrote output to a non-string value", evaluation.decisions);
|
|
55
|
+
}
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
output: evaluation.value,
|
|
58
|
+
decisions: evaluation.decisions,
|
|
59
|
+
enforced: true,
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=output-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-policy.js","sourceRoot":"","sources":["../../src/guardrails/output-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RunOutputPolicy, RunToolMiddleware, RuntimeGuardrailHostAdapters, RuntimeGuardrailSettings } from "./types.js";
|
|
2
|
+
export declare function normalizeRuntimeGuardrailSettings(value: unknown): RuntimeGuardrailSettings | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Build the OSS deterministic policy pack from serializable host settings.
|
|
5
|
+
*
|
|
6
|
+
* Undefined settings are the off switch and return undefined. Host adapters
|
|
7
|
+
* remain process-local: audit and approval callbacks never enter persisted
|
|
8
|
+
* RunnerConfig data.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createConfiguredRunToolMiddleware(value: RuntimeGuardrailSettings | undefined, adapters?: RuntimeGuardrailHostAdapters): RunToolMiddleware | undefined;
|
|
11
|
+
export declare function createConfiguredRunOutputPolicy(value: RuntimeGuardrailSettings | undefined, adapters?: RuntimeGuardrailHostAdapters): RunOutputPolicy | undefined;
|
|
12
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/guardrails/settings.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,GACb,wBAAwB,GAAG,SAAS,CAiGtC;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,wBAAwB,GAAG,SAAS,EAC3C,QAAQ,GAAE,4BAAiC,GAC1C,iBAAiB,GAAG,SAAS,CAe/B;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,wBAAwB,GAAG,SAAS,EAC3C,QAAQ,GAAE,4BAAiC,GAC1C,eAAe,GAAG,SAAS,CAY7B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createDefaultOutputGuardrailPolicies, createDefaultToolGuardrailPolicies, } from "./detectors.js";
|
|
2
|
+
import { RuntimeGuardrailEngine } from "./engine.js";
|
|
3
|
+
import { createRunOutputPolicy } from "./output-policy.js";
|
|
4
|
+
import { createRunToolMiddleware } from "./tool-middleware.js";
|
|
5
|
+
export function normalizeRuntimeGuardrailSettings(value) {
|
|
6
|
+
if (value === undefined || value === null)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
9
|
+
throw new TypeError("guardrails must be an object");
|
|
10
|
+
}
|
|
11
|
+
const raw = value;
|
|
12
|
+
if (raw.toolPolicyPack === undefined
|
|
13
|
+
&& raw.outputPolicyPack === undefined
|
|
14
|
+
&& Object.keys(raw).length === 0) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
if (raw.toolPolicyPack !== undefined && raw.toolPolicyPack !== "default") {
|
|
18
|
+
throw new TypeError('guardrails.toolPolicyPack must be "default"');
|
|
19
|
+
}
|
|
20
|
+
if (raw.outputPolicyPack !== undefined && raw.outputPolicyPack !== "default") {
|
|
21
|
+
throw new TypeError('guardrails.outputPolicyPack must be "default"');
|
|
22
|
+
}
|
|
23
|
+
if (raw.toolPolicyPack === undefined && (raw.maxToolOutputCharacters !== undefined
|
|
24
|
+
|| raw.readOnlyPolicyFailure !== undefined)) {
|
|
25
|
+
throw new TypeError("guardrails tool settings require guardrails.toolPolicyPack");
|
|
26
|
+
}
|
|
27
|
+
if (raw.outputPolicyPack === undefined && (raw.maxFinalOutputCharacters !== undefined
|
|
28
|
+
|| raw.streamingOutputMode !== undefined)) {
|
|
29
|
+
const field = raw.streamingOutputMode !== undefined
|
|
30
|
+
? "streamingOutputMode"
|
|
31
|
+
: "maxFinalOutputCharacters";
|
|
32
|
+
throw new TypeError(`guardrails.${field} requires guardrails.outputPolicyPack`);
|
|
33
|
+
}
|
|
34
|
+
if (raw.toolPolicyPack === undefined && raw.outputPolicyPack === undefined) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
let maxToolOutputCharacters;
|
|
38
|
+
if (raw.maxToolOutputCharacters !== undefined) {
|
|
39
|
+
if (!Number.isSafeInteger(raw.maxToolOutputCharacters) ||
|
|
40
|
+
raw.maxToolOutputCharacters < 1) {
|
|
41
|
+
throw new TypeError("guardrails.maxToolOutputCharacters must be a positive safe integer");
|
|
42
|
+
}
|
|
43
|
+
maxToolOutputCharacters = raw.maxToolOutputCharacters;
|
|
44
|
+
}
|
|
45
|
+
let readOnlyPolicyFailure;
|
|
46
|
+
if (raw.readOnlyPolicyFailure !== undefined) {
|
|
47
|
+
if (raw.readOnlyPolicyFailure !== "audit" && raw.readOnlyPolicyFailure !== "block") {
|
|
48
|
+
throw new TypeError('guardrails.readOnlyPolicyFailure must be "audit" or "block"');
|
|
49
|
+
}
|
|
50
|
+
readOnlyPolicyFailure = raw.readOnlyPolicyFailure;
|
|
51
|
+
}
|
|
52
|
+
let maxFinalOutputCharacters;
|
|
53
|
+
if (raw.maxFinalOutputCharacters !== undefined) {
|
|
54
|
+
if (!Number.isSafeInteger(raw.maxFinalOutputCharacters)
|
|
55
|
+
|| raw.maxFinalOutputCharacters < 1) {
|
|
56
|
+
throw new TypeError("guardrails.maxFinalOutputCharacters must be a positive safe integer");
|
|
57
|
+
}
|
|
58
|
+
maxFinalOutputCharacters = raw.maxFinalOutputCharacters;
|
|
59
|
+
}
|
|
60
|
+
let streamingOutputMode;
|
|
61
|
+
if (raw.outputPolicyPack !== undefined) {
|
|
62
|
+
if (raw.streamingOutputMode !== undefined
|
|
63
|
+
&& raw.streamingOutputMode !== "audit"
|
|
64
|
+
&& raw.streamingOutputMode !== "buffer") {
|
|
65
|
+
throw new TypeError('guardrails.streamingOutputMode must be "audit" or "buffer"');
|
|
66
|
+
}
|
|
67
|
+
streamingOutputMode = (raw.streamingOutputMode ?? "audit");
|
|
68
|
+
}
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
...(raw.toolPolicyPack === "default" ? { toolPolicyPack: "default" } : {}),
|
|
71
|
+
...(raw.outputPolicyPack === "default" ? { outputPolicyPack: "default" } : {}),
|
|
72
|
+
...(maxToolOutputCharacters !== undefined ? { maxToolOutputCharacters } : {}),
|
|
73
|
+
...(maxFinalOutputCharacters !== undefined ? { maxFinalOutputCharacters } : {}),
|
|
74
|
+
...(readOnlyPolicyFailure !== undefined ? { readOnlyPolicyFailure } : {}),
|
|
75
|
+
...(streamingOutputMode !== undefined ? { streamingOutputMode } : {}),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build the OSS deterministic policy pack from serializable host settings.
|
|
80
|
+
*
|
|
81
|
+
* Undefined settings are the off switch and return undefined. Host adapters
|
|
82
|
+
* remain process-local: audit and approval callbacks never enter persisted
|
|
83
|
+
* RunnerConfig data.
|
|
84
|
+
*/
|
|
85
|
+
export function createConfiguredRunToolMiddleware(value, adapters = {}) {
|
|
86
|
+
const settings = normalizeRuntimeGuardrailSettings(value);
|
|
87
|
+
if (!settings?.toolPolicyPack)
|
|
88
|
+
return undefined;
|
|
89
|
+
const engine = new RuntimeGuardrailEngine(createDefaultToolGuardrailPolicies(), {
|
|
90
|
+
onDecision: adapters.onDecision,
|
|
91
|
+
readOnlyPolicyFailure: settings.readOnlyPolicyFailure,
|
|
92
|
+
});
|
|
93
|
+
return createRunToolMiddleware(engine, {
|
|
94
|
+
approval: adapters.approval,
|
|
95
|
+
maxOutputCharacters: settings.maxToolOutputCharacters,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
export function createConfiguredRunOutputPolicy(value, adapters = {}) {
|
|
99
|
+
const settings = normalizeRuntimeGuardrailSettings(value);
|
|
100
|
+
if (!settings?.outputPolicyPack)
|
|
101
|
+
return undefined;
|
|
102
|
+
const engine = new RuntimeGuardrailEngine(createDefaultOutputGuardrailPolicies(settings.maxFinalOutputCharacters), { onDecision: adapters.onDecision });
|
|
103
|
+
return createRunOutputPolicy(engine, {
|
|
104
|
+
approval: adapters.outputApproval,
|
|
105
|
+
streamingMode: settings.streamingOutputMode,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/guardrails/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RuntimeGuardrailEngine } from "./engine.js";
|
|
2
|
+
import type { RunToolMiddleware, RunToolMiddlewareOptions, RunToolRequest, RuntimeToolSideEffect } from "./types.js";
|
|
3
|
+
export declare function inferToolSideEffect(name: string): RuntimeToolSideEffect;
|
|
4
|
+
export declare function createRunToolMiddleware(engine: RuntimeGuardrailEngine, options?: RunToolMiddlewareOptions): RunToolMiddleware;
|
|
5
|
+
export declare function wrapRunToolExecutor(executor: (name: string, args: Record<string, unknown>) => Promise<string>, middleware: RunToolMiddleware | undefined, resolveRequest: (name: string, args: Record<string, unknown>) => Omit<RunToolRequest, "name" | "args"> & Partial<Pick<RunToolRequest, "name" | "args">>): (name: string, args: Record<string, unknown>) => Promise<string>;
|
|
6
|
+
//# sourceMappingURL=tool-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-middleware.d.ts","sourceRoot":"","sources":["../../src/guardrails/tool-middleware.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAEV,iBAAiB,EACjB,wBAAwB,EAExB,cAAc,EACd,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA6BpB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAavE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CA4GnB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAC1E,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GAC1F,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAclE"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { GuardrailAbortedError, GuardrailApprovalRequiredError, GuardrailBlockedError, } from "./errors.js";
|
|
2
|
+
const DEFAULT_MAX_OUTPUT_CHARACTERS = 256_000;
|
|
3
|
+
function freezeArgs(value) {
|
|
4
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
5
|
+
throw new GuardrailBlockedError("Guardrail rewrote tool arguments to a non-object value");
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function normalizeOutput(output, maxCharacters) {
|
|
10
|
+
const normalized = output.replace(/\r\n?/g, "\n");
|
|
11
|
+
if (normalized.length <= maxCharacters)
|
|
12
|
+
return { output: normalized, truncated: false };
|
|
13
|
+
let bounded = normalized.slice(0, maxCharacters);
|
|
14
|
+
const finalCode = bounded.charCodeAt(bounded.length - 1);
|
|
15
|
+
if (finalCode >= 0xd800 && finalCode <= 0xdbff)
|
|
16
|
+
bounded = bounded.slice(0, -1);
|
|
17
|
+
return { output: `${bounded}\n[TRUNCATED]`, truncated: true };
|
|
18
|
+
}
|
|
19
|
+
function terminalDecision(decisions) {
|
|
20
|
+
return decisions[decisions.length - 1];
|
|
21
|
+
}
|
|
22
|
+
export function inferToolSideEffect(name) {
|
|
23
|
+
const normalized = name.trim().toLowerCase().replace(/^mcp__[^_]+__/, "");
|
|
24
|
+
if (/^(get|list|read|search|find|inspect|describe|query|fetch|download|view|stat|check|lookup|count)(_|$)/.test(normalized)) {
|
|
25
|
+
return "read";
|
|
26
|
+
}
|
|
27
|
+
if (/^(create|add|set|update|edit|write|delete|remove|send|deploy|publish|run|execute|bash|shell|upload|move|copy|rename|approve|reject)(_|$)/.test(normalized)) {
|
|
28
|
+
return "write";
|
|
29
|
+
}
|
|
30
|
+
return "unknown";
|
|
31
|
+
}
|
|
32
|
+
export function createRunToolMiddleware(engine, options = {}) {
|
|
33
|
+
const maxOutputCharacters = options.maxOutputCharacters ?? DEFAULT_MAX_OUTPUT_CHARACTERS;
|
|
34
|
+
if (!Number.isSafeInteger(maxOutputCharacters) || maxOutputCharacters < 1) {
|
|
35
|
+
throw new TypeError("maxOutputCharacters must be a positive safe integer");
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
async execute(request, next) {
|
|
39
|
+
if (request.signal?.aborted)
|
|
40
|
+
throw new GuardrailAbortedError();
|
|
41
|
+
const normalizedRequest = Object.freeze({
|
|
42
|
+
...request,
|
|
43
|
+
sideEffect: request.sideEffect ?? inferToolSideEffect(request.name),
|
|
44
|
+
});
|
|
45
|
+
const before = await engine.evaluate({
|
|
46
|
+
phase: "tool.before",
|
|
47
|
+
value: request.args,
|
|
48
|
+
context: request.context,
|
|
49
|
+
tool: {
|
|
50
|
+
name: request.name,
|
|
51
|
+
callId: request.callId,
|
|
52
|
+
sideEffect: normalizedRequest.sideEffect,
|
|
53
|
+
schema: request.schema,
|
|
54
|
+
},
|
|
55
|
+
signal: request.signal,
|
|
56
|
+
});
|
|
57
|
+
const args = freezeArgs(before.value);
|
|
58
|
+
if (before.terminalAction === "block") {
|
|
59
|
+
throw new GuardrailBlockedError(terminalDecision(before.decisions).reason, before.decisions);
|
|
60
|
+
}
|
|
61
|
+
if (before.terminalAction === "approval") {
|
|
62
|
+
const decision = terminalDecision(before.decisions);
|
|
63
|
+
if (!options.approval) {
|
|
64
|
+
throw new GuardrailApprovalRequiredError(decision.reason, before.decisions);
|
|
65
|
+
}
|
|
66
|
+
const approval = await options.approval(Object.freeze({ ...normalizedRequest, args }), decision);
|
|
67
|
+
if (request.signal?.aborted) {
|
|
68
|
+
throw new GuardrailAbortedError(undefined, before.decisions);
|
|
69
|
+
}
|
|
70
|
+
if (approval !== "approved") {
|
|
71
|
+
throw new GuardrailBlockedError("Guardrail approval was denied", before.decisions);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const toolRequest = Object.freeze({ ...normalizedRequest, args });
|
|
75
|
+
const rawOutput = await next(toolRequest);
|
|
76
|
+
if (typeof rawOutput !== "string") {
|
|
77
|
+
throw new TypeError(`Tool "${request.name}" returned a non-string result`);
|
|
78
|
+
}
|
|
79
|
+
if (request.signal?.aborted) {
|
|
80
|
+
throw new GuardrailAbortedError("Tool execution was aborted after dispatch; the outcome may be uncertain", before.decisions, normalizedRequest.sideEffect !== "read");
|
|
81
|
+
}
|
|
82
|
+
const bounded = normalizeOutput(rawOutput, maxOutputCharacters);
|
|
83
|
+
const after = await engine.evaluate({
|
|
84
|
+
phase: "tool.after",
|
|
85
|
+
value: bounded.output,
|
|
86
|
+
context: request.context,
|
|
87
|
+
tool: {
|
|
88
|
+
name: request.name,
|
|
89
|
+
callId: request.callId,
|
|
90
|
+
sideEffect: normalizedRequest.sideEffect,
|
|
91
|
+
schema: request.schema,
|
|
92
|
+
},
|
|
93
|
+
signal: request.signal,
|
|
94
|
+
outputTruncated: bounded.truncated,
|
|
95
|
+
});
|
|
96
|
+
const decisions = Object.freeze([...before.decisions, ...after.decisions]);
|
|
97
|
+
if (after.terminalAction === "block") {
|
|
98
|
+
throw new GuardrailBlockedError(terminalDecision(after.decisions).reason, decisions);
|
|
99
|
+
}
|
|
100
|
+
if (after.terminalAction === "approval") {
|
|
101
|
+
throw new GuardrailApprovalRequiredError("Approval cannot be deferred until after a tool has executed", decisions);
|
|
102
|
+
}
|
|
103
|
+
if (typeof after.value !== "string") {
|
|
104
|
+
throw new GuardrailBlockedError("Guardrail rewrote tool output to a non-string value", decisions);
|
|
105
|
+
}
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
output: after.value,
|
|
108
|
+
args,
|
|
109
|
+
decisions,
|
|
110
|
+
outputTruncated: bounded.truncated,
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export function wrapRunToolExecutor(executor, middleware, resolveRequest) {
|
|
116
|
+
if (!middleware)
|
|
117
|
+
return executor;
|
|
118
|
+
return async (name, args) => {
|
|
119
|
+
const request = resolveRequest(name, args);
|
|
120
|
+
const result = await middleware.execute({
|
|
121
|
+
...request,
|
|
122
|
+
name: request.name ?? name,
|
|
123
|
+
args: request.args ?? args,
|
|
124
|
+
}, (nextRequest) => executor(nextRequest.name, nextRequest.args));
|
|
125
|
+
return result.output;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=tool-middleware.js.map
|