@polpo-ai/core 0.15.48 → 0.15.50
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 +90 -14
- package/dist/__tests__/agent-model-routing.test.d.ts +2 -0
- package/dist/__tests__/agent-model-routing.test.d.ts.map +1 -0
- package/dist/__tests__/agent-model-routing.test.js +22 -0
- package/dist/__tests__/agent-model-routing.test.js.map +1 -0
- package/dist/__tests__/guardrail-policy-packs.test.d.ts +2 -0
- package/dist/__tests__/guardrail-policy-packs.test.d.ts.map +1 -0
- package/dist/__tests__/guardrail-policy-packs.test.js +287 -0
- package/dist/__tests__/guardrail-policy-packs.test.js.map +1 -0
- package/dist/__tests__/model-profiles.test.js +33 -2
- package/dist/__tests__/model-profiles.test.js.map +1 -1
- package/dist/__tests__/model-router.test.js +114 -0
- package/dist/__tests__/model-router.test.js.map +1 -1
- package/dist/guardrails/detectors.d.ts +12 -3
- package/dist/guardrails/detectors.d.ts.map +1 -1
- package/dist/guardrails/detectors.js +79 -4
- package/dist/guardrails/detectors.js.map +1 -1
- package/dist/guardrails/engine.d.ts.map +1 -1
- package/dist/guardrails/engine.js +6 -1
- package/dist/guardrails/engine.js.map +1 -1
- package/dist/guardrails/index.d.ts +4 -3
- package/dist/guardrails/index.d.ts.map +1 -1
- package/dist/guardrails/index.js +3 -2
- package/dist/guardrails/index.js.map +1 -1
- package/dist/guardrails/preflight-policy.d.ts +4 -0
- package/dist/guardrails/preflight-policy.d.ts.map +1 -0
- package/dist/guardrails/preflight-policy.js +43 -0
- package/dist/guardrails/preflight-policy.js.map +1 -0
- package/dist/guardrails/settings.d.ts +2 -1
- package/dist/guardrails/settings.d.ts.map +1 -1
- package/dist/guardrails/settings.js +175 -11
- package/dist/guardrails/settings.js.map +1 -1
- package/dist/guardrails/types.d.ts +47 -0
- package/dist/guardrails/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/model-profiles.d.ts +4 -0
- package/dist/model-profiles.d.ts.map +1 -1
- package/dist/model-profiles.js +8 -8
- package/dist/model-profiles.js.map +1 -1
- package/dist/model-router.d.ts +30 -0
- package/dist/model-router.d.ts.map +1 -1
- package/dist/model-router.js +201 -4
- package/dist/model-router.js.map +1 -1
- package/dist/runtime-context/index.d.ts +2 -2
- package/dist/runtime-context/index.d.ts.map +1 -1
- package/dist/runtime-context/index.js +1 -1
- package/dist/runtime-context/index.js.map +1 -1
- package/dist/runtime-context/runtime-context.d.ts +2 -0
- package/dist/runtime-context/runtime-context.d.ts.map +1 -1
- package/dist/runtime-context/runtime-context.js +39 -4
- package/dist/runtime-context/runtime-context.js.map +1 -1
- package/dist/runtime-context/runtime-context.test.js +38 -0
- package/dist/runtime-context/runtime-context.test.js.map +1 -1
- package/dist/runtime-context/types.d.ts +9 -0
- package/dist/runtime-context/types.d.ts.map +1 -1
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +2 -2
- package/dist/task-runner.js.map +1 -1
- package/dist/types/agent.d.ts +7 -1
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -134,14 +134,14 @@ remain concrete model IDs. A profile is selected only with the explicit
|
|
|
134
134
|
}
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Agents can select a profile and optionally narrow which profiles
|
|
138
|
-
|
|
137
|
+
Agents can select a profile and optionally narrow which root profiles they may
|
|
138
|
+
use:
|
|
139
139
|
|
|
140
140
|
```jsonc
|
|
141
141
|
{
|
|
142
142
|
"name": "support",
|
|
143
143
|
"model": { "profile": "balanced" },
|
|
144
|
-
"allowedModelProfiles": ["balanced"
|
|
144
|
+
"allowedModelProfiles": ["balanced"]
|
|
145
145
|
}
|
|
146
146
|
```
|
|
147
147
|
|
|
@@ -149,6 +149,21 @@ Resolution is recursive, deterministic, deduplicates concrete models while
|
|
|
149
149
|
preserving order, and fails closed for unknown profiles, cycles, invalid
|
|
150
150
|
allowlists, excessive depth, or too many fallbacks. The runtime resolves the
|
|
151
151
|
profile before provider setup; providers receive only concrete model IDs.
|
|
152
|
+
Nested aliases inherit the grant of the selected root alias, so changing
|
|
153
|
+
`balanced` to reuse another project alias does not invalidate existing agent
|
|
154
|
+
assignments. Selecting that nested alias directly still requires its own grant.
|
|
155
|
+
|
|
156
|
+
An agent's configured direct model or profile stays pinned by default. Set
|
|
157
|
+
`modelRouting.mode` to `auto` only when that agent should delegate selection to
|
|
158
|
+
the project router:
|
|
159
|
+
|
|
160
|
+
```jsonc
|
|
161
|
+
{
|
|
162
|
+
"name": "support",
|
|
163
|
+
"allowedModelProfiles": ["fast", "balanced"],
|
|
164
|
+
"modelRouting": { "mode": "auto" }
|
|
165
|
+
}
|
|
166
|
+
```
|
|
152
167
|
|
|
153
168
|
## Model routing
|
|
154
169
|
|
|
@@ -173,6 +188,15 @@ const route = await resolveModelRoute({
|
|
|
173
188
|
mode: "auto",
|
|
174
189
|
fallbackProfile: "balanced",
|
|
175
190
|
allowedProfiles: ["fast", "balanced"],
|
|
191
|
+
rules: [{
|
|
192
|
+
id: "free-users",
|
|
193
|
+
profile: "fast",
|
|
194
|
+
when: { allLabels: ["tier:free"] },
|
|
195
|
+
}],
|
|
196
|
+
profileHints: {
|
|
197
|
+
fast: "Short, low-complexity requests.",
|
|
198
|
+
balanced: "Requests that need stronger reasoning.",
|
|
199
|
+
},
|
|
176
200
|
},
|
|
177
201
|
}, {
|
|
178
202
|
classifier: createStructuredModelRouteClassifier({ model: routerModel }),
|
|
@@ -182,11 +206,14 @@ const route = await resolveModelRoute({
|
|
|
182
206
|
const { model, audit } = modelRouteRuntimePlanFields(route);
|
|
183
207
|
```
|
|
184
208
|
|
|
185
|
-
Explicit authorized profiles skip
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
209
|
+
Explicit authorized profiles skip all automation. Ordered deterministic rules
|
|
210
|
+
match trusted labels, runtime surface, and invocation source before any
|
|
211
|
+
classifier is created. Disabled routing, single-profile allowlists, missing
|
|
212
|
+
input, and missing classifiers resolve deterministically. Timeout, provider
|
|
213
|
+
failure, malformed output, unknown profiles, and low confidence use the
|
|
214
|
+
configured fallback; caller cancellation stops planning instead of starting
|
|
215
|
+
execution with a fallback. Rules and classifiers can only narrow the configured
|
|
216
|
+
profile allowlist and never select raw model IDs.
|
|
190
217
|
|
|
191
218
|
## Runtime inspection
|
|
192
219
|
|
|
@@ -265,8 +292,56 @@ retrieved Memory and Brain runtime context, so both can coexist on one run.
|
|
|
265
292
|
|
|
266
293
|
## Guardrails
|
|
267
294
|
|
|
268
|
-
Runtime hosts can opt into the shared ordered policy engine
|
|
269
|
-
|
|
295
|
+
Runtime hosts can opt into the shared ordered policy engine across input,
|
|
296
|
+
retrieved context, model preflight, tool input/output, and final output.
|
|
297
|
+
Nothing is enabled when `settings.guardrails` is absent.
|
|
298
|
+
|
|
299
|
+
New configurations use one product-level pack:
|
|
300
|
+
|
|
301
|
+
```json
|
|
302
|
+
{
|
|
303
|
+
"settings": {
|
|
304
|
+
"guardrails": {
|
|
305
|
+
"policyPack": "standard"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
- `standard` redacts common secret shapes, validates tool arguments, blocks
|
|
312
|
+
private-network targets, and requires approval for destructive operations.
|
|
313
|
+
- `strict` additionally blocks destructive operations and policy failures,
|
|
314
|
+
and buffers streaming output so output rules can enforce before delivery.
|
|
315
|
+
- `custom` keeps the standard baseline and adds bounded literal content rules.
|
|
316
|
+
User-authored regular expressions and private classifier prompts are not
|
|
317
|
+
accepted.
|
|
318
|
+
|
|
319
|
+
For example:
|
|
320
|
+
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"settings": {
|
|
324
|
+
"guardrails": {
|
|
325
|
+
"policyPack": "custom",
|
|
326
|
+
"contentRules": [{
|
|
327
|
+
"id": "support.private-content",
|
|
328
|
+
"phases": ["input", "context", "model.preflight", "output"],
|
|
329
|
+
"action": "redact",
|
|
330
|
+
"risk": "high",
|
|
331
|
+
"containsAny": ["private marker"],
|
|
332
|
+
"replacement": "[PRIVATE]"
|
|
333
|
+
}]
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
Runtime hosts may inject process-local policies, including bounded model
|
|
340
|
+
classifiers, through `RuntimeGuardrailHostAdapters.policies`. Those functions,
|
|
341
|
+
credentials, and private prompts never enter serializable settings or
|
|
342
|
+
`RunnerConfig`.
|
|
343
|
+
|
|
344
|
+
The same middleware wraps every locally executed tool:
|
|
270
345
|
|
|
271
346
|
```ts
|
|
272
347
|
import {
|
|
@@ -315,17 +390,18 @@ are enabled automatically. Provider-executed tools and client-side tools are
|
|
|
315
390
|
declared to the model but execute outside the local runtime, so they require
|
|
316
391
|
provider/client enforcement rather than this middleware.
|
|
317
392
|
|
|
318
|
-
The
|
|
319
|
-
|
|
393
|
+
The legacy split `toolPolicyPack` / `outputPolicyPack` configuration remains
|
|
394
|
+
accepted for backward compatibility but does not enable the new preflight
|
|
395
|
+
phases. The Node host applies the product-level pack to both in-process and
|
|
396
|
+
subprocess task runs:
|
|
320
397
|
|
|
321
398
|
```json
|
|
322
399
|
{
|
|
323
400
|
"settings": {
|
|
324
401
|
"guardrails": {
|
|
325
|
-
"
|
|
402
|
+
"policyPack": "standard",
|
|
326
403
|
"maxToolOutputCharacters": 256000,
|
|
327
404
|
"readOnlyPolicyFailure": "audit",
|
|
328
|
-
"outputPolicyPack": "default",
|
|
329
405
|
"maxFinalOutputCharacters": 65536,
|
|
330
406
|
"streamingOutputMode": "audit"
|
|
331
407
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-model-routing.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-model-routing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateAgentModelRoutingConfig } from "../model-router.js";
|
|
3
|
+
describe("validateAgentModelRoutingConfig", () => {
|
|
4
|
+
it.each([
|
|
5
|
+
undefined,
|
|
6
|
+
{ mode: "off" },
|
|
7
|
+
{ mode: "auto" },
|
|
8
|
+
])("accepts a supported model routing mode %#", (config) => {
|
|
9
|
+
expect(validateAgentModelRoutingConfig(config)).toEqual(config);
|
|
10
|
+
});
|
|
11
|
+
it.each([
|
|
12
|
+
null,
|
|
13
|
+
"auto",
|
|
14
|
+
[],
|
|
15
|
+
{},
|
|
16
|
+
{ mode: "future" },
|
|
17
|
+
{ mode: "auto", hidden: true },
|
|
18
|
+
])("rejects unsafe agent model routing config %#", (config) => {
|
|
19
|
+
expect(() => validateAgentModelRoutingConfig(config)).toThrow(/Agent model routing/);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=agent-model-routing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-model-routing.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-model-routing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAErE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,IAAI,CAAC;QACN,SAAS;QACT,EAAE,IAAI,EAAE,KAAc,EAAE;QACxB,EAAE,IAAI,EAAE,MAAe,EAAE;KAC1B,CAAC,CAAC,2CAA2C,EAAE,CAAC,MAAM,EAAE,EAAE;QACzD,MAAM,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,IAAI;QACJ,MAAM;QACN,EAAE;QACF,EAAE;QACF,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;KAC/B,CAAC,CAAC,8CAA8C,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAC3D,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-policy-packs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/guardrail-policy-packs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { GuardrailBlockedError, createConfiguredRunOutputPolicy, createConfiguredRunPreflightPolicy, createConfiguredRunToolMiddleware, normalizeRuntimeGuardrailSettings, } from "../guardrails/index.js";
|
|
3
|
+
describe("guardrail policy packs", () => {
|
|
4
|
+
it("keeps the legacy default tool/output settings backward compatible", () => {
|
|
5
|
+
expect(normalizeRuntimeGuardrailSettings({
|
|
6
|
+
toolPolicyPack: "default",
|
|
7
|
+
outputPolicyPack: "default",
|
|
8
|
+
})).toEqual({
|
|
9
|
+
toolPolicyPack: "default",
|
|
10
|
+
outputPolicyPack: "default",
|
|
11
|
+
streamingOutputMode: "audit",
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
it("normalizes the explicit standard pack and keeps guardrails opt-in", () => {
|
|
15
|
+
expect(normalizeRuntimeGuardrailSettings(undefined)).toBeUndefined();
|
|
16
|
+
expect(normalizeRuntimeGuardrailSettings({})).toBeUndefined();
|
|
17
|
+
expect(normalizeRuntimeGuardrailSettings({
|
|
18
|
+
policyPack: "standard",
|
|
19
|
+
})).toEqual({
|
|
20
|
+
policyPack: "standard",
|
|
21
|
+
streamingOutputMode: "audit",
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it("makes strict policy failures and destructive operations fail closed", async () => {
|
|
25
|
+
const settings = normalizeRuntimeGuardrailSettings({
|
|
26
|
+
policyPack: "strict",
|
|
27
|
+
});
|
|
28
|
+
const middleware = createConfiguredRunToolMiddleware(settings);
|
|
29
|
+
const next = vi.fn(async () => "should not run");
|
|
30
|
+
expect(settings).toEqual({
|
|
31
|
+
policyPack: "strict",
|
|
32
|
+
readOnlyPolicyFailure: "block",
|
|
33
|
+
streamingOutputMode: "buffer",
|
|
34
|
+
});
|
|
35
|
+
await expect(middleware?.execute({
|
|
36
|
+
name: "bash",
|
|
37
|
+
args: { command: "rm -rf /" },
|
|
38
|
+
sideEffect: "write",
|
|
39
|
+
context: {},
|
|
40
|
+
}, next)).rejects.toBeInstanceOf(GuardrailBlockedError);
|
|
41
|
+
expect(next).not.toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
it("runs standard input policy before the model and redacts secrets", async () => {
|
|
44
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
45
|
+
policyPack: "standard",
|
|
46
|
+
});
|
|
47
|
+
await expect(policy?.evaluate({
|
|
48
|
+
phase: "input",
|
|
49
|
+
value: "token ghp_abcdefghijklmnopqrstuvwxyz1234567890",
|
|
50
|
+
mode: "enforce",
|
|
51
|
+
context: { surface: "agent" },
|
|
52
|
+
})).resolves.toMatchObject({
|
|
53
|
+
value: "token [REDACTED]",
|
|
54
|
+
enforced: true,
|
|
55
|
+
decisions: [expect.objectContaining({
|
|
56
|
+
policyId: "secrets.preflight",
|
|
57
|
+
action: "redact",
|
|
58
|
+
})],
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it("keeps rewritten content unchanged in observational mode", async () => {
|
|
62
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
63
|
+
policyPack: "standard",
|
|
64
|
+
});
|
|
65
|
+
const input = "token ghp_abcdefghijklmnopqrstuvwxyz1234567890";
|
|
66
|
+
await expect(policy?.evaluate({
|
|
67
|
+
phase: "input",
|
|
68
|
+
value: input,
|
|
69
|
+
mode: "audit",
|
|
70
|
+
context: {},
|
|
71
|
+
})).resolves.toMatchObject({
|
|
72
|
+
value: input,
|
|
73
|
+
enforced: false,
|
|
74
|
+
decisions: [expect.objectContaining({ action: "redact" })],
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it("supports bounded deterministic custom content rules", async () => {
|
|
78
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
79
|
+
policyPack: "custom",
|
|
80
|
+
contentRules: [{
|
|
81
|
+
id: "support.no-passwords",
|
|
82
|
+
phases: ["input", "output"],
|
|
83
|
+
action: "block",
|
|
84
|
+
risk: "high",
|
|
85
|
+
containsAny: ["password reset token", "one-time password"],
|
|
86
|
+
}],
|
|
87
|
+
});
|
|
88
|
+
await expect(policy?.evaluate({
|
|
89
|
+
phase: "input",
|
|
90
|
+
value: "Please expose the PASSWORD RESET TOKEN",
|
|
91
|
+
mode: "enforce",
|
|
92
|
+
context: {},
|
|
93
|
+
})).rejects.toMatchObject({
|
|
94
|
+
code: "guardrail_blocked",
|
|
95
|
+
decisions: [expect.objectContaining({
|
|
96
|
+
policyId: "support.no-passwords",
|
|
97
|
+
})],
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it("redacts every literal match without regular-expression semantics", async () => {
|
|
101
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
102
|
+
policyPack: "custom",
|
|
103
|
+
contentRules: [{
|
|
104
|
+
id: "content.literal-redaction",
|
|
105
|
+
phases: ["input"],
|
|
106
|
+
action: "redact",
|
|
107
|
+
risk: "medium",
|
|
108
|
+
containsAny: ["A+B"],
|
|
109
|
+
replacement: "[TERM]",
|
|
110
|
+
}],
|
|
111
|
+
});
|
|
112
|
+
await expect(policy?.evaluate({
|
|
113
|
+
phase: "input",
|
|
114
|
+
value: "a+b A+B a.*b",
|
|
115
|
+
mode: "enforce",
|
|
116
|
+
context: {},
|
|
117
|
+
})).resolves.toMatchObject({
|
|
118
|
+
value: "[TERM] [TERM] a.*b",
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
it("blocks oversized input before running later host policies", async () => {
|
|
122
|
+
const hostPolicy = {
|
|
123
|
+
id: "host.must-not-run",
|
|
124
|
+
phases: ["input"],
|
|
125
|
+
evaluate: vi.fn(() => null),
|
|
126
|
+
};
|
|
127
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
128
|
+
policyPack: "standard",
|
|
129
|
+
maxInputCharacters: 8,
|
|
130
|
+
}, {
|
|
131
|
+
policies: [hostPolicy],
|
|
132
|
+
});
|
|
133
|
+
await expect(policy?.evaluate({
|
|
134
|
+
phase: "input",
|
|
135
|
+
value: "123456789",
|
|
136
|
+
mode: "enforce",
|
|
137
|
+
context: {},
|
|
138
|
+
})).rejects.toMatchObject({
|
|
139
|
+
code: "guardrail_blocked",
|
|
140
|
+
decisions: [expect.objectContaining({
|
|
141
|
+
policyId: "input.bounded-value",
|
|
142
|
+
})],
|
|
143
|
+
});
|
|
144
|
+
expect(hostPolicy.evaluate).not.toHaveBeenCalled();
|
|
145
|
+
});
|
|
146
|
+
it("accepts host policies without serializing classifier implementations", async () => {
|
|
147
|
+
const classify = vi.fn(() => ({
|
|
148
|
+
action: "block",
|
|
149
|
+
risk: "high",
|
|
150
|
+
reason: "Host classifier rejected the request",
|
|
151
|
+
}));
|
|
152
|
+
const hostPolicy = {
|
|
153
|
+
id: "host.content-classifier",
|
|
154
|
+
phases: ["model.preflight"],
|
|
155
|
+
evaluate: classify,
|
|
156
|
+
};
|
|
157
|
+
const policy = createConfiguredRunPreflightPolicy({ policyPack: "standard" }, { policies: [hostPolicy] });
|
|
158
|
+
await expect(policy?.evaluate({
|
|
159
|
+
phase: "model.preflight",
|
|
160
|
+
value: "bounded model input",
|
|
161
|
+
mode: "enforce",
|
|
162
|
+
context: {},
|
|
163
|
+
})).rejects.toBeInstanceOf(GuardrailBlockedError);
|
|
164
|
+
expect(classify).toHaveBeenCalledOnce();
|
|
165
|
+
});
|
|
166
|
+
it("fails closed when a host content classifier throws", async () => {
|
|
167
|
+
const policy = createConfiguredRunPreflightPolicy({ policyPack: "standard" }, {
|
|
168
|
+
policies: [{
|
|
169
|
+
id: "host.unavailable-classifier",
|
|
170
|
+
phases: ["input"],
|
|
171
|
+
evaluate: () => {
|
|
172
|
+
throw new Error("classifier unavailable");
|
|
173
|
+
},
|
|
174
|
+
}],
|
|
175
|
+
});
|
|
176
|
+
await expect(policy?.evaluate({
|
|
177
|
+
phase: "input",
|
|
178
|
+
value: "ordinary request",
|
|
179
|
+
mode: "enforce",
|
|
180
|
+
context: {},
|
|
181
|
+
})).rejects.toMatchObject({
|
|
182
|
+
code: "guardrail_blocked",
|
|
183
|
+
decisions: [expect.objectContaining({
|
|
184
|
+
policyId: "host.unavailable-classifier",
|
|
185
|
+
action: "block",
|
|
186
|
+
fallbackUsed: true,
|
|
187
|
+
})],
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
it("applies custom output rules through the same unified pack", async () => {
|
|
191
|
+
const policy = createConfiguredRunOutputPolicy({
|
|
192
|
+
policyPack: "custom",
|
|
193
|
+
contentRules: [{
|
|
194
|
+
id: "output.customer-name",
|
|
195
|
+
phases: ["output"],
|
|
196
|
+
action: "redact",
|
|
197
|
+
risk: "medium",
|
|
198
|
+
containsAny: ["Private Customer"],
|
|
199
|
+
replacement: "[CUSTOMER]",
|
|
200
|
+
}],
|
|
201
|
+
});
|
|
202
|
+
await expect(policy?.evaluate({
|
|
203
|
+
output: "Result for private customer",
|
|
204
|
+
mode: "enforce",
|
|
205
|
+
context: {},
|
|
206
|
+
})).resolves.toMatchObject({
|
|
207
|
+
output: "Result for [CUSTOMER]",
|
|
208
|
+
enforced: true,
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
it("preserves __proto__ as inert data while redacting nested input", async () => {
|
|
212
|
+
const value = JSON.parse('{"__proto__":{"polluted":"yes"},"token":"ghp_abcdefghijklmnopqrstuvwxyz1234567890"}');
|
|
213
|
+
const policy = createConfiguredRunPreflightPolicy({
|
|
214
|
+
policyPack: "standard",
|
|
215
|
+
});
|
|
216
|
+
const result = await policy?.evaluate({
|
|
217
|
+
phase: "input",
|
|
218
|
+
value,
|
|
219
|
+
mode: "enforce",
|
|
220
|
+
context: {},
|
|
221
|
+
});
|
|
222
|
+
expect(Object.prototype).not.toHaveProperty("polluted");
|
|
223
|
+
expect(Object.getPrototypeOf(result?.value)).toBe(Object.prototype);
|
|
224
|
+
expect(Object.prototype.hasOwnProperty.call(result?.value, "__proto__")).toBe(true);
|
|
225
|
+
expect(result?.value).toMatchObject({
|
|
226
|
+
token: "[REDACTED]",
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
it("rejects policy id collisions instead of producing ambiguous audit records", () => {
|
|
230
|
+
expect(() => createConfiguredRunPreflightPolicy({
|
|
231
|
+
policyPack: "custom",
|
|
232
|
+
contentRules: [{
|
|
233
|
+
id: "secrets.preflight",
|
|
234
|
+
phases: ["input"],
|
|
235
|
+
action: "block",
|
|
236
|
+
risk: "high",
|
|
237
|
+
containsAny: ["x"],
|
|
238
|
+
}],
|
|
239
|
+
})).toThrow('Duplicate guardrail policy id "secrets.preflight"');
|
|
240
|
+
});
|
|
241
|
+
it.each([
|
|
242
|
+
{
|
|
243
|
+
policyPack: "standard",
|
|
244
|
+
toolPolicyPack: "default",
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
policyPack: "custom",
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
policyPack: "standard",
|
|
251
|
+
contentRules: [],
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
policyPack: "custom",
|
|
255
|
+
contentRules: [{
|
|
256
|
+
id: "invalid",
|
|
257
|
+
phases: ["tool.before"],
|
|
258
|
+
action: "block",
|
|
259
|
+
risk: "high",
|
|
260
|
+
containsAny: ["x"],
|
|
261
|
+
}],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
policyPack: "custom",
|
|
265
|
+
contentRules: [{
|
|
266
|
+
id: "invalid",
|
|
267
|
+
phases: ["input"],
|
|
268
|
+
action: "approval",
|
|
269
|
+
risk: "high",
|
|
270
|
+
containsAny: ["x"],
|
|
271
|
+
}],
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
policyPack: "custom",
|
|
275
|
+
contentRules: [{
|
|
276
|
+
id: "invalid id with spaces",
|
|
277
|
+
phases: ["input"],
|
|
278
|
+
action: "block",
|
|
279
|
+
risk: "high",
|
|
280
|
+
containsAny: ["x"],
|
|
281
|
+
}],
|
|
282
|
+
},
|
|
283
|
+
])("rejects unsafe or ambiguous pack configuration %#", (settings) => {
|
|
284
|
+
expect(() => normalizeRuntimeGuardrailSettings(settings)).toThrow();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=guardrail-policy-packs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-policy-packs.test.js","sourceRoot":"","sources":["../../src/__tests__/guardrail-policy-packs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -171,8 +171,23 @@ describe("model profile resolution", () => {
|
|
|
171
171
|
model: "google/gemini-2.5-flash",
|
|
172
172
|
}));
|
|
173
173
|
});
|
|
174
|
-
it("
|
|
175
|
-
expect(
|
|
174
|
+
it("keeps nested profile dependencies behind the granted root profile", () => {
|
|
175
|
+
expect(resolveModelProfileSelection({ profile: "balanced" }, {
|
|
176
|
+
profiles: {
|
|
177
|
+
balanced: { profile: "fast" },
|
|
178
|
+
fast: "openai/gpt-4o-mini",
|
|
179
|
+
},
|
|
180
|
+
allowedProfiles: ["balanced"],
|
|
181
|
+
})).toEqual({
|
|
182
|
+
selection: "openai/gpt-4o-mini",
|
|
183
|
+
policy: {
|
|
184
|
+
primary: "openai/gpt-4o-mini",
|
|
185
|
+
fallbacks: [],
|
|
186
|
+
candidates: ["openai/gpt-4o-mini"],
|
|
187
|
+
},
|
|
188
|
+
profiles: ["balanced", "fast"],
|
|
189
|
+
});
|
|
190
|
+
expect(() => resolveModelProfileSelection({ profile: "fast" }, {
|
|
176
191
|
profiles: {
|
|
177
192
|
balanced: { profile: "fast" },
|
|
178
193
|
fast: "openai/gpt-4o-mini",
|
|
@@ -183,6 +198,22 @@ describe("model profile resolution", () => {
|
|
|
183
198
|
profile: "fast",
|
|
184
199
|
}));
|
|
185
200
|
});
|
|
201
|
+
it("validates every explicitly selected root profile in a model policy", () => {
|
|
202
|
+
expect(() => resolveModelProfileSelection({
|
|
203
|
+
primary: { profile: "balanced" },
|
|
204
|
+
fallbacks: [{ profile: "emergency" }],
|
|
205
|
+
}, {
|
|
206
|
+
profiles: {
|
|
207
|
+
balanced: { profile: "fast" },
|
|
208
|
+
fast: "openai/gpt-4o-mini",
|
|
209
|
+
emergency: "google/gemini-2.5-flash",
|
|
210
|
+
},
|
|
211
|
+
allowedProfiles: ["balanced"],
|
|
212
|
+
})).toThrowError(expect.objectContaining({
|
|
213
|
+
code: "DISALLOWED_PROFILE",
|
|
214
|
+
profile: "emergency",
|
|
215
|
+
}));
|
|
216
|
+
});
|
|
186
217
|
it("does not mutate inputs and freezes the complete resolution result", () => {
|
|
187
218
|
const selection = {
|
|
188
219
|
primary: { profile: "fast" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-profiles.test.js","sourceRoot":"","sources":["../../src/__tests__/model-profiles.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-profiles.test.js","sourceRoot":"","sources":["../../src/__tests__/model-profiles.test.ts"],"names":[],"mappings":"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"}
|