@polpo-ai/core 0.15.43 → 0.15.45
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 +163 -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 +455 -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/__tests__/task-runner-guardrail-events.test.d.ts +2 -0
- package/dist/__tests__/task-runner-guardrail-events.test.d.ts.map +1 -0
- package/dist/__tests__/task-runner-guardrail-events.test.js +130 -0
- package/dist/__tests__/task-runner-guardrail-events.test.js.map +1 -0
- package/dist/adapter.d.ts +24 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/events.d.ts +7 -0
- package/dist/events.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 +15 -0
- package/dist/guardrails/tool-middleware.d.ts.map +1 -0
- package/dist/guardrails/tool-middleware.js +158 -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 +1 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +97 -15
- package/dist/task-runner.js.map +1 -1
- package/dist/types/agent.d.ts +8 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/config.d.ts +17 -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,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 { createObservationalRunToolMiddleware, 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,oCAAoC,EACpC,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 { createObservationalRunToolMiddleware, 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,oCAAoC,EACpC,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,15 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Evaluate an enforcing middleware after the real tool call and retain only
|
|
7
|
+
* its secret-free decisions. The original arguments and output always win.
|
|
8
|
+
*
|
|
9
|
+
* Hosts use this for shadow/audit rollout modes. Policy failures are
|
|
10
|
+
* deliberately best-effort: observation must never change a successful tool
|
|
11
|
+
* execution.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createObservationalRunToolMiddleware(configured: RunToolMiddleware): RunToolMiddleware;
|
|
14
|
+
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>;
|
|
15
|
+
//# 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":"AAOA,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;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,iBAAiB,GAC5B,iBAAiB,CAyBnB;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,158 @@
|
|
|
1
|
+
import { GuardrailError, 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
|
+
/**
|
|
116
|
+
* Evaluate an enforcing middleware after the real tool call and retain only
|
|
117
|
+
* its secret-free decisions. The original arguments and output always win.
|
|
118
|
+
*
|
|
119
|
+
* Hosts use this for shadow/audit rollout modes. Policy failures are
|
|
120
|
+
* deliberately best-effort: observation must never change a successful tool
|
|
121
|
+
* execution.
|
|
122
|
+
*/
|
|
123
|
+
export function createObservationalRunToolMiddleware(configured) {
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
async execute(request, next) {
|
|
126
|
+
const output = await next(request);
|
|
127
|
+
let decisions = [];
|
|
128
|
+
try {
|
|
129
|
+
const evaluation = await configured.execute(request, async () => output);
|
|
130
|
+
decisions = evaluation.decisions;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error instanceof GuardrailError)
|
|
134
|
+
decisions = error.decisions;
|
|
135
|
+
}
|
|
136
|
+
return Object.freeze({
|
|
137
|
+
output,
|
|
138
|
+
args: request.args,
|
|
139
|
+
decisions: Object.freeze([...decisions]),
|
|
140
|
+
outputTruncated: false,
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export function wrapRunToolExecutor(executor, middleware, resolveRequest) {
|
|
146
|
+
if (!middleware)
|
|
147
|
+
return executor;
|
|
148
|
+
return async (name, args) => {
|
|
149
|
+
const request = resolveRequest(name, args);
|
|
150
|
+
const result = await middleware.execute({
|
|
151
|
+
...request,
|
|
152
|
+
name: request.name ?? name,
|
|
153
|
+
args: request.args ?? args,
|
|
154
|
+
}, (nextRequest) => executor(nextRequest.name, nextRequest.args));
|
|
155
|
+
return result.output;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=tool-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-middleware.js","sourceRoot":"","sources":["../../src/guardrails/tool-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { RuntimeGuardrailAction, RuntimeGuardrailDecision, RuntimeGuardrailPhase, RuntimeGuardrailRisk, RuntimeInvocationSource, RuntimeSurface } from "../runtime-plan/types.js";
|
|
2
|
+
export type RuntimeToolSideEffect = "read" | "write" | "unknown";
|
|
3
|
+
export interface RuntimeGuardrailScope {
|
|
4
|
+
readonly expected?: Readonly<Record<string, string | undefined>>;
|
|
5
|
+
readonly actual?: Readonly<Record<string, string | undefined>>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Host-neutral guardrail context. Hosts may attach identifiers used for
|
|
9
|
+
* auditing and scope comparison, but must never place credentials here.
|
|
10
|
+
*/
|
|
11
|
+
export interface RuntimeGuardrailContext {
|
|
12
|
+
readonly planId?: string;
|
|
13
|
+
readonly surface?: RuntimeSurface;
|
|
14
|
+
readonly source?: RuntimeInvocationSource;
|
|
15
|
+
readonly agent?: string;
|
|
16
|
+
readonly runId?: string;
|
|
17
|
+
readonly sessionId?: string;
|
|
18
|
+
readonly scope?: RuntimeGuardrailScope;
|
|
19
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
20
|
+
}
|
|
21
|
+
export interface RuntimeGuardrailToolContext {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly callId?: string;
|
|
24
|
+
readonly sideEffect: RuntimeToolSideEffect;
|
|
25
|
+
readonly schema?: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface RuntimeGuardrailEvaluationInput<T = unknown> {
|
|
28
|
+
readonly phase: RuntimeGuardrailPhase;
|
|
29
|
+
readonly value: T;
|
|
30
|
+
readonly context: RuntimeGuardrailContext;
|
|
31
|
+
readonly tool?: RuntimeGuardrailToolContext;
|
|
32
|
+
readonly signal?: AbortSignal;
|
|
33
|
+
readonly outputTruncated?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface RuntimeGuardrailPolicyResult<T = unknown> {
|
|
36
|
+
readonly action: RuntimeGuardrailAction;
|
|
37
|
+
readonly risk: RuntimeGuardrailRisk;
|
|
38
|
+
readonly reason: string;
|
|
39
|
+
/**
|
|
40
|
+
* Required for redact/rewrite. The engine passes this value to subsequent
|
|
41
|
+
* policies and, eventually, the guarded operation.
|
|
42
|
+
*/
|
|
43
|
+
readonly value?: T;
|
|
44
|
+
readonly fallbackUsed?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface RuntimeGuardrailPolicy<T = unknown> {
|
|
47
|
+
readonly id: string;
|
|
48
|
+
readonly version?: string;
|
|
49
|
+
readonly priority?: number;
|
|
50
|
+
readonly phases: readonly RuntimeGuardrailPhase[];
|
|
51
|
+
evaluate(input: RuntimeGuardrailEvaluationInput<T>): RuntimeGuardrailPolicyResult<T> | null | Promise<RuntimeGuardrailPolicyResult<T> | null>;
|
|
52
|
+
}
|
|
53
|
+
export interface RuntimeGuardrailEvaluation<T = unknown> {
|
|
54
|
+
readonly value: T;
|
|
55
|
+
readonly decisions: readonly RuntimeGuardrailDecision[];
|
|
56
|
+
readonly terminalAction?: Extract<RuntimeGuardrailAction, "block" | "approval">;
|
|
57
|
+
}
|
|
58
|
+
export interface RuntimeGuardrailAuditEvent {
|
|
59
|
+
readonly decision: RuntimeGuardrailDecision;
|
|
60
|
+
readonly context: RuntimeGuardrailContext;
|
|
61
|
+
readonly tool?: Readonly<{
|
|
62
|
+
name: string;
|
|
63
|
+
callId?: string;
|
|
64
|
+
sideEffect: RuntimeToolSideEffect;
|
|
65
|
+
}>;
|
|
66
|
+
readonly outputTruncated?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export interface RuntimeGuardrailEngineOptions {
|
|
69
|
+
readonly createId?: () => string;
|
|
70
|
+
readonly now?: () => number;
|
|
71
|
+
/**
|
|
72
|
+
* Secret-free decision sink. The evaluated value and tool schema are
|
|
73
|
+
* intentionally excluded from the event.
|
|
74
|
+
*/
|
|
75
|
+
readonly onDecision?: (event: RuntimeGuardrailAuditEvent) => void | Promise<void>;
|
|
76
|
+
readonly readOnlyPolicyFailure?: "audit" | "block";
|
|
77
|
+
}
|
|
78
|
+
export interface RunToolRequest {
|
|
79
|
+
readonly callId?: string;
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly args: Readonly<Record<string, unknown>>;
|
|
82
|
+
readonly schema?: unknown;
|
|
83
|
+
readonly sideEffect?: RuntimeToolSideEffect;
|
|
84
|
+
readonly context: RuntimeGuardrailContext;
|
|
85
|
+
readonly signal?: AbortSignal;
|
|
86
|
+
}
|
|
87
|
+
export type RunToolNext = (request: RunToolRequest) => Promise<string>;
|
|
88
|
+
export interface RunToolExecutionResult {
|
|
89
|
+
readonly output: string;
|
|
90
|
+
readonly args: Readonly<Record<string, unknown>>;
|
|
91
|
+
readonly decisions: readonly RuntimeGuardrailDecision[];
|
|
92
|
+
readonly outputTruncated: boolean;
|
|
93
|
+
}
|
|
94
|
+
export type RuntimeGuardrailApprovalResult = "approved" | "denied";
|
|
95
|
+
export type RuntimeGuardrailApprovalHandler = (request: RunToolRequest, decision: RuntimeGuardrailDecision) => RuntimeGuardrailApprovalResult | Promise<RuntimeGuardrailApprovalResult>;
|
|
96
|
+
export interface RunToolMiddleware {
|
|
97
|
+
execute(request: RunToolRequest, next: RunToolNext): Promise<RunToolExecutionResult>;
|
|
98
|
+
}
|
|
99
|
+
export interface RunToolMiddlewareOptions {
|
|
100
|
+
readonly approval?: RuntimeGuardrailApprovalHandler;
|
|
101
|
+
/** Maximum tool-result content characters evaluated and returned to the model. */
|
|
102
|
+
readonly maxOutputCharacters?: number;
|
|
103
|
+
}
|
|
104
|
+
export type RuntimeOutputEnforcementMode = "enforce" | "audit";
|
|
105
|
+
export type RuntimeStreamingOutputMode = "audit" | "buffer";
|
|
106
|
+
export interface RunOutputPolicyRequest {
|
|
107
|
+
readonly output: string;
|
|
108
|
+
readonly mode: RuntimeOutputEnforcementMode;
|
|
109
|
+
readonly context: RuntimeGuardrailContext;
|
|
110
|
+
readonly signal?: AbortSignal;
|
|
111
|
+
}
|
|
112
|
+
export interface RunOutputPolicyResult {
|
|
113
|
+
readonly output: string;
|
|
114
|
+
readonly decisions: readonly RuntimeGuardrailDecision[];
|
|
115
|
+
/** False means the output was already delivered and decisions are observational. */
|
|
116
|
+
readonly enforced: boolean;
|
|
117
|
+
}
|
|
118
|
+
export type RuntimeGuardrailOutputApprovalHandler = (request: RunOutputPolicyRequest, decision: RuntimeGuardrailDecision) => RuntimeGuardrailApprovalResult | Promise<RuntimeGuardrailApprovalResult>;
|
|
119
|
+
export interface RunOutputPolicy {
|
|
120
|
+
readonly streamingMode: RuntimeStreamingOutputMode;
|
|
121
|
+
evaluate(request: RunOutputPolicyRequest): Promise<RunOutputPolicyResult>;
|
|
122
|
+
}
|
|
123
|
+
export interface RunOutputPolicyOptions {
|
|
124
|
+
readonly approval?: RuntimeGuardrailOutputApprovalHandler;
|
|
125
|
+
readonly streamingMode?: RuntimeStreamingOutputMode;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Serializable, host-neutral settings that may cross a process boundary in a
|
|
129
|
+
* RunnerConfig. The absent setting is deliberately the disabled state.
|
|
130
|
+
*/
|
|
131
|
+
export interface RuntimeGuardrailSettings {
|
|
132
|
+
readonly toolPolicyPack?: "default";
|
|
133
|
+
readonly outputPolicyPack?: "default";
|
|
134
|
+
readonly maxToolOutputCharacters?: number;
|
|
135
|
+
readonly maxFinalOutputCharacters?: number;
|
|
136
|
+
readonly readOnlyPolicyFailure?: "audit" | "block";
|
|
137
|
+
readonly streamingOutputMode?: RuntimeStreamingOutputMode;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Process-local adapters. These callbacks are never persisted in settings or
|
|
141
|
+
* RunnerConfig and therefore remain the responsibility of the active host.
|
|
142
|
+
*/
|
|
143
|
+
export interface RuntimeGuardrailHostAdapters {
|
|
144
|
+
readonly approval?: RuntimeGuardrailApprovalHandler;
|
|
145
|
+
readonly outputApproval?: RuntimeGuardrailOutputApprovalHandler;
|
|
146
|
+
readonly onDecision?: RuntimeGuardrailEngineOptions["onDecision"];
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=types.d.ts.map
|