@lobu/core 6.1.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/agent-policy-harden.test.d.ts +11 -0
- package/dist/__tests__/agent-policy-harden.test.d.ts.map +1 -0
- package/dist/__tests__/agent-policy-harden.test.js +216 -0
- package/dist/__tests__/agent-policy-harden.test.js.map +1 -0
- package/dist/__tests__/agent-store.test.d.ts +8 -0
- package/dist/__tests__/agent-store.test.d.ts.map +1 -0
- package/dist/__tests__/agent-store.test.js +38 -0
- package/dist/__tests__/agent-store.test.js.map +1 -0
- package/dist/__tests__/command-registry.test.d.ts +8 -0
- package/dist/__tests__/command-registry.test.d.ts.map +1 -0
- package/dist/__tests__/command-registry.test.js +188 -0
- package/dist/__tests__/command-registry.test.js.map +1 -0
- package/dist/__tests__/encryption-key-validation.test.d.ts +2 -0
- package/dist/__tests__/encryption-key-validation.test.d.ts.map +1 -0
- package/dist/__tests__/encryption-key-validation.test.js +53 -0
- package/dist/__tests__/encryption-key-validation.test.js.map +1 -0
- package/dist/__tests__/encryption.test.js +2 -0
- package/dist/__tests__/encryption.test.js.map +1 -1
- package/dist/__tests__/errors.test.js +0 -36
- package/dist/__tests__/errors.test.js.map +1 -1
- package/dist/__tests__/guardrails-harden.test.d.ts +16 -0
- package/dist/__tests__/guardrails-harden.test.d.ts.map +1 -0
- package/dist/__tests__/guardrails-harden.test.js +328 -0
- package/dist/__tests__/guardrails-harden.test.js.map +1 -0
- package/dist/__tests__/instruction-provider.test.d.ts +8 -0
- package/dist/__tests__/instruction-provider.test.d.ts.map +1 -0
- package/dist/__tests__/instruction-provider.test.js +129 -0
- package/dist/__tests__/instruction-provider.test.js.map +1 -0
- package/dist/__tests__/lobu-toml-schema-harden.test.d.ts +10 -0
- package/dist/__tests__/lobu-toml-schema-harden.test.d.ts.map +1 -0
- package/dist/__tests__/lobu-toml-schema-harden.test.js +722 -0
- package/dist/__tests__/lobu-toml-schema-harden.test.js.map +1 -0
- package/dist/__tests__/lobu-toml-schema.test.js +40 -5
- package/dist/__tests__/lobu-toml-schema.test.js.map +1 -1
- package/dist/__tests__/network-domains.test.d.ts +9 -0
- package/dist/__tests__/network-domains.test.d.ts.map +1 -0
- package/dist/__tests__/network-domains.test.js +97 -0
- package/dist/__tests__/network-domains.test.js.map +1 -0
- package/dist/__tests__/sanitize.test.js +11 -0
- package/dist/__tests__/sanitize.test.js.map +1 -1
- package/dist/__tests__/utils-env.test.d.ts +8 -0
- package/dist/__tests__/utils-env.test.d.ts.map +1 -0
- package/dist/__tests__/utils-env.test.js +125 -0
- package/dist/__tests__/utils-env.test.js.map +1 -0
- package/dist/__tests__/utils-json.test.d.ts +8 -0
- package/dist/__tests__/utils-json.test.d.ts.map +1 -0
- package/dist/__tests__/utils-json.test.js +114 -0
- package/dist/__tests__/utils-json.test.js.map +1 -0
- package/dist/__tests__/utils-urls.test.d.ts +7 -0
- package/dist/__tests__/utils-urls.test.d.ts.map +1 -0
- package/dist/__tests__/utils-urls.test.js +37 -0
- package/dist/__tests__/utils-urls.test.js.map +1 -0
- package/dist/__tests__/worker-auth.test.js +8 -0
- package/dist/__tests__/worker-auth.test.js.map +1 -1
- package/dist/command-registry.d.ts +4 -0
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js.map +1 -1
- package/dist/errors.d.ts +0 -19
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -38
- package/dist/errors.js.map +1 -1
- package/dist/lobu-toml-schema.d.ts +23 -8
- package/dist/lobu-toml-schema.d.ts.map +1 -1
- package/dist/lobu-toml-schema.js +31 -5
- package/dist/lobu-toml-schema.js.map +1 -1
- package/dist/logger.js +4 -4
- package/dist/logger.js.map +1 -1
- package/dist/utils/encryption.d.ts +2 -0
- package/dist/utils/encryption.d.ts.map +1 -1
- package/dist/utils/encryption.js +29 -11
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/json.d.ts +0 -5
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js +0 -16
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +29 -5
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sanitize.d.ts +0 -24
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/utils/sanitize.js +40 -29
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/worker/auth.d.ts +1 -0
- package/dist/worker/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +12 -1
- package/dist/worker/auth.js.map +1 -1
- package/package.json +1 -1
|
@@ -81,42 +81,6 @@ const errors_1 = require("../errors");
|
|
|
81
81
|
(0, bun_test_1.expect)(err).toBeInstanceOf(errors_1.BaseError);
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
|
-
(0, bun_test_1.describe)("PlatformError", () => {
|
|
85
|
-
(0, bun_test_1.test)("stores platform and operation", () => {
|
|
86
|
-
const err = new errors_1.PlatformError("slack", "send", "rate limited");
|
|
87
|
-
(0, bun_test_1.expect)(err.name).toBe("PlatformError");
|
|
88
|
-
(0, bun_test_1.expect)(err.platform).toBe("slack");
|
|
89
|
-
(0, bun_test_1.expect)(err.operation).toBe("send");
|
|
90
|
-
(0, bun_test_1.expect)(err.message).toBe("rate limited");
|
|
91
|
-
});
|
|
92
|
-
(0, bun_test_1.test)("toJSON includes platform alongside base fields", () => {
|
|
93
|
-
const cause = new Error("429");
|
|
94
|
-
const err = new errors_1.PlatformError("slack", "send", "rate limited", cause);
|
|
95
|
-
const json = err.toJSON();
|
|
96
|
-
(0, bun_test_1.expect)(json.platform).toBe("slack");
|
|
97
|
-
(0, bun_test_1.expect)(json.name).toBe("PlatformError");
|
|
98
|
-
(0, bun_test_1.expect)(json.message).toBe("rate limited");
|
|
99
|
-
(0, bun_test_1.expect)(json.operation).toBe("send");
|
|
100
|
-
(0, bun_test_1.expect)(json.cause).toBe("429");
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
(0, bun_test_1.describe)("SessionError", () => {
|
|
104
|
-
(0, bun_test_1.test)("stores sessionKey and code", () => {
|
|
105
|
-
const err = new errors_1.SessionError("sess-1", "EXPIRED", "session expired");
|
|
106
|
-
(0, bun_test_1.expect)(err.name).toBe("SessionError");
|
|
107
|
-
(0, bun_test_1.expect)(err.sessionKey).toBe("sess-1");
|
|
108
|
-
(0, bun_test_1.expect)(err.code).toBe("EXPIRED");
|
|
109
|
-
(0, bun_test_1.expect)(err.message).toBe("session expired");
|
|
110
|
-
});
|
|
111
|
-
(0, bun_test_1.test)("toJSON includes sessionKey and code", () => {
|
|
112
|
-
const err = new errors_1.SessionError("sess-1", "EXPIRED", "session expired");
|
|
113
|
-
const json = err.toJSON();
|
|
114
|
-
(0, bun_test_1.expect)(json.sessionKey).toBe("sess-1");
|
|
115
|
-
(0, bun_test_1.expect)(json.code).toBe("EXPIRED");
|
|
116
|
-
(0, bun_test_1.expect)(json.name).toBe("SessionError");
|
|
117
|
-
(0, bun_test_1.expect)(json.message).toBe("session expired");
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
84
|
(0, bun_test_1.describe)("OrchestratorError", () => {
|
|
121
85
|
(0, bun_test_1.test)("stores code, details, shouldRetry default false", () => {
|
|
122
86
|
const err = new errors_1.OrchestratorError(errors_1.ErrorCode.DEPLOYMENT_CREATE_FAILED, "create failed");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":";;AAAA,uCAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hardened guardrails tests — edge cases not covered by guardrails.test.ts.
|
|
3
|
+
*
|
|
4
|
+
* Focus areas:
|
|
5
|
+
* - Concurrent trips: two guardrails trip near-simultaneously; only first wins.
|
|
6
|
+
* - `ran` snapshot isolation: slow guardrail finishes after short-circuit and
|
|
7
|
+
* must NOT appear in the returned `ran` array.
|
|
8
|
+
* - Rejected-promise (vs sync-throw) guardrail treated as pass.
|
|
9
|
+
* - All enabled names unknown → {tripped: null, ran: []}.
|
|
10
|
+
* - Output + pre-tool stage coverage via runGuardrails.
|
|
11
|
+
* - pre-tool guardrail that denies a destructive tool call.
|
|
12
|
+
* - createNoopGuardrail default name derivation.
|
|
13
|
+
* - Registry: get() on unregistered stage returns undefined.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=guardrails-harden.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails-harden.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/guardrails-harden.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hardened guardrails tests — edge cases not covered by guardrails.test.ts.
|
|
4
|
+
*
|
|
5
|
+
* Focus areas:
|
|
6
|
+
* - Concurrent trips: two guardrails trip near-simultaneously; only first wins.
|
|
7
|
+
* - `ran` snapshot isolation: slow guardrail finishes after short-circuit and
|
|
8
|
+
* must NOT appear in the returned `ran` array.
|
|
9
|
+
* - Rejected-promise (vs sync-throw) guardrail treated as pass.
|
|
10
|
+
* - All enabled names unknown → {tripped: null, ran: []}.
|
|
11
|
+
* - Output + pre-tool stage coverage via runGuardrails.
|
|
12
|
+
* - pre-tool guardrail that denies a destructive tool call.
|
|
13
|
+
* - createNoopGuardrail default name derivation.
|
|
14
|
+
* - Registry: get() on unregistered stage returns undefined.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const bun_test_1 = require("bun:test");
|
|
18
|
+
const guardrails_1 = require("../guardrails");
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function deferred() {
|
|
23
|
+
let resolve;
|
|
24
|
+
let reject;
|
|
25
|
+
const promise = new Promise((res, rej) => {
|
|
26
|
+
resolve = res;
|
|
27
|
+
reject = rej;
|
|
28
|
+
});
|
|
29
|
+
return { promise, resolve, reject };
|
|
30
|
+
}
|
|
31
|
+
const inputCtx = {
|
|
32
|
+
agentId: "agent-1",
|
|
33
|
+
userId: "user-1",
|
|
34
|
+
message: "hello world",
|
|
35
|
+
platform: "telegram",
|
|
36
|
+
};
|
|
37
|
+
const outputCtx = {
|
|
38
|
+
agentId: "agent-1",
|
|
39
|
+
userId: "user-1",
|
|
40
|
+
text: "assistant reply",
|
|
41
|
+
platform: "telegram",
|
|
42
|
+
};
|
|
43
|
+
const preToolCtx = {
|
|
44
|
+
agentId: "agent-1",
|
|
45
|
+
userId: "user-1",
|
|
46
|
+
toolName: "shell_exec",
|
|
47
|
+
arguments: { command: "rm -rf /" },
|
|
48
|
+
};
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Concurrent trip: two guardrails resolve nearly simultaneously
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
(0, bun_test_1.describe)("runGuardrails — concurrent trip ordering", () => {
|
|
53
|
+
(0, bun_test_1.test)("when both guardrails trip simultaneously only the first-to-settle wins", async () => {
|
|
54
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
55
|
+
// Gate both so we can release them together (same microtask tick).
|
|
56
|
+
const gate = deferred();
|
|
57
|
+
const first = {
|
|
58
|
+
name: "first",
|
|
59
|
+
stage: "input",
|
|
60
|
+
async run() {
|
|
61
|
+
await gate.promise;
|
|
62
|
+
return { tripped: true, reason: "first-reason" };
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const second = {
|
|
66
|
+
name: "second",
|
|
67
|
+
stage: "input",
|
|
68
|
+
async run() {
|
|
69
|
+
await gate.promise;
|
|
70
|
+
return { tripped: true, reason: "second-reason" };
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
registry.register(first);
|
|
74
|
+
registry.register(second);
|
|
75
|
+
const outcomeP = (0, guardrails_1.runGuardrails)(registry, "input", ["first", "second"], inputCtx);
|
|
76
|
+
// Release both in the same microtask: the promise iteration order
|
|
77
|
+
// determines who settles first (first registered = first in loop).
|
|
78
|
+
gate.resolve();
|
|
79
|
+
const outcome = await outcomeP;
|
|
80
|
+
// Exactly one guardrail's trip is surfaced.
|
|
81
|
+
(0, bun_test_1.expect)(outcome.tripped).not.toBeNull();
|
|
82
|
+
(0, bun_test_1.expect)(["first", "second"]).toContain(outcome.tripped?.guardrail);
|
|
83
|
+
// The reason must match the winning guardrail name.
|
|
84
|
+
(0, bun_test_1.expect)(outcome.tripped?.reason).toBe(`${outcome.tripped?.guardrail}-reason`);
|
|
85
|
+
});
|
|
86
|
+
(0, bun_test_1.test)("ran snapshot does not include slow guardrail that finishes after short-circuit", async () => {
|
|
87
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
88
|
+
const slowGate = deferred();
|
|
89
|
+
const fast = {
|
|
90
|
+
name: "fast-tripper",
|
|
91
|
+
stage: "input",
|
|
92
|
+
async run() {
|
|
93
|
+
return { tripped: true, reason: "fast" };
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// slow completes AFTER the race resolves (we hold its gate).
|
|
97
|
+
const slow = {
|
|
98
|
+
name: "slow-pass",
|
|
99
|
+
stage: "input",
|
|
100
|
+
async run() {
|
|
101
|
+
await slowGate.promise;
|
|
102
|
+
return { tripped: false };
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
registry.register(fast);
|
|
106
|
+
registry.register(slow);
|
|
107
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "input", ["fast-tripper", "slow-pass"], inputCtx);
|
|
108
|
+
// fast-tripper tripped and short-circuited before slow-pass resolved.
|
|
109
|
+
(0, bun_test_1.expect)(outcome.tripped?.guardrail).toBe("fast-tripper");
|
|
110
|
+
// slow-pass had NOT settled when finish() was called — it must NOT appear
|
|
111
|
+
// in the snapshot.
|
|
112
|
+
(0, bun_test_1.expect)(outcome.ran).toEqual(["fast-tripper"]);
|
|
113
|
+
// Release the slow gate so the background promise settles cleanly.
|
|
114
|
+
slowGate.resolve();
|
|
115
|
+
});
|
|
116
|
+
(0, bun_test_1.test)("ran snapshot correctness when fast guardrail passes and slow one trips later", async () => {
|
|
117
|
+
// Ensures the runner doesn't short-circuit on a *pass* — it must wait for
|
|
118
|
+
// all guardrails when no trip has occurred yet.
|
|
119
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
120
|
+
const slowGate = deferred();
|
|
121
|
+
const fast = {
|
|
122
|
+
name: "fast-pass",
|
|
123
|
+
stage: "input",
|
|
124
|
+
async run() {
|
|
125
|
+
return { tripped: false };
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
const slow = {
|
|
129
|
+
name: "slow-tripper",
|
|
130
|
+
stage: "input",
|
|
131
|
+
async run() {
|
|
132
|
+
await slowGate.promise;
|
|
133
|
+
return { tripped: true, reason: "late-trip" };
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
registry.register(fast);
|
|
137
|
+
registry.register(slow);
|
|
138
|
+
const outcomeP = (0, guardrails_1.runGuardrails)(registry, "input", ["fast-pass", "slow-tripper"], inputCtx);
|
|
139
|
+
slowGate.resolve();
|
|
140
|
+
const outcome = await outcomeP;
|
|
141
|
+
(0, bun_test_1.expect)(outcome.tripped?.guardrail).toBe("slow-tripper");
|
|
142
|
+
// Both must appear in ran when slow finally settled.
|
|
143
|
+
(0, bun_test_1.expect)(outcome.ran.sort()).toEqual(["fast-pass", "slow-tripper"]);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Rejected promise treated as pass
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
(0, bun_test_1.describe)("runGuardrails — rejected promise", () => {
|
|
150
|
+
(0, bun_test_1.test)("guardrail returning Promise.reject is treated as a pass (not a trip)", async () => {
|
|
151
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
152
|
+
const rejecter = {
|
|
153
|
+
name: "rejecter",
|
|
154
|
+
stage: "input",
|
|
155
|
+
run() {
|
|
156
|
+
return Promise.reject(new Error("network timeout"));
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
registry.register(rejecter);
|
|
160
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("input", "pass"));
|
|
161
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "input", ["rejecter", "pass"], inputCtx);
|
|
162
|
+
(0, bun_test_1.expect)(outcome.tripped).toBeNull();
|
|
163
|
+
// rejecter didn't add to ran; pass did.
|
|
164
|
+
(0, bun_test_1.expect)(outcome.ran).toEqual(["pass"]);
|
|
165
|
+
});
|
|
166
|
+
(0, bun_test_1.test)("rejection does not prevent the other guardrails from completing", async () => {
|
|
167
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
168
|
+
const rejecter = {
|
|
169
|
+
name: "rejecter",
|
|
170
|
+
stage: "input",
|
|
171
|
+
run() {
|
|
172
|
+
return Promise.reject("boom");
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
const tripper = {
|
|
176
|
+
name: "tripper",
|
|
177
|
+
stage: "input",
|
|
178
|
+
async run() {
|
|
179
|
+
return { tripped: true, reason: "caught" };
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
registry.register(rejecter);
|
|
183
|
+
registry.register(tripper);
|
|
184
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "input", ["rejecter", "tripper"], inputCtx);
|
|
185
|
+
// tripper should still win despite rejecter firing in parallel.
|
|
186
|
+
(0, bun_test_1.expect)(outcome.tripped?.guardrail).toBe("tripper");
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// All enabled names are unknown (none resolve from registry)
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
(0, bun_test_1.describe)("runGuardrails — all unknown names", () => {
|
|
193
|
+
(0, bun_test_1.test)("every enabled name unknown → tripped null, ran empty", async () => {
|
|
194
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
195
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "input", ["ghost-a", "ghost-b"], inputCtx);
|
|
196
|
+
(0, bun_test_1.expect)(outcome.tripped).toBeNull();
|
|
197
|
+
(0, bun_test_1.expect)(outcome.ran).toEqual([]);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Output stage
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
(0, bun_test_1.describe)("runGuardrails — output stage", () => {
|
|
204
|
+
(0, bun_test_1.test)("output guardrail inspects response text", async () => {
|
|
205
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
206
|
+
const piiDetector = {
|
|
207
|
+
name: "pii-output",
|
|
208
|
+
stage: "output",
|
|
209
|
+
async run(ctx) {
|
|
210
|
+
if (ctx.text.includes("SSN:")) {
|
|
211
|
+
return {
|
|
212
|
+
tripped: true,
|
|
213
|
+
reason: "pii-leak",
|
|
214
|
+
metadata: { field: "SSN" },
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return { tripped: false };
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
registry.register(piiDetector);
|
|
221
|
+
const safeOutcome = await (0, guardrails_1.runGuardrails)(registry, "output", ["pii-output"], { ...outputCtx, text: "Here is your answer." });
|
|
222
|
+
(0, bun_test_1.expect)(safeOutcome.tripped).toBeNull();
|
|
223
|
+
const riskyOutcome = await (0, guardrails_1.runGuardrails)(registry, "output", ["pii-output"], { ...outputCtx, text: "Your SSN: 123-45-6789" });
|
|
224
|
+
(0, bun_test_1.expect)(riskyOutcome.tripped?.guardrail).toBe("pii-output");
|
|
225
|
+
(0, bun_test_1.expect)(riskyOutcome.tripped?.metadata).toEqual({ field: "SSN" });
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
// Pre-tool stage — authorization of destructive tool calls
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
(0, bun_test_1.describe)("runGuardrails — pre-tool stage", () => {
|
|
232
|
+
(0, bun_test_1.test)("pre-tool guardrail blocks a destructive shell command", async () => {
|
|
233
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
234
|
+
const shellBlocker = {
|
|
235
|
+
name: "shell-blocker",
|
|
236
|
+
stage: "pre-tool",
|
|
237
|
+
async run(ctx) {
|
|
238
|
+
if (ctx.toolName === "shell_exec") {
|
|
239
|
+
const args = ctx.arguments;
|
|
240
|
+
if (args.command?.includes("rm -rf")) {
|
|
241
|
+
return { tripped: true, reason: "destructive-command-blocked" };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return { tripped: false };
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
registry.register(shellBlocker);
|
|
248
|
+
const blockedOutcome = await (0, guardrails_1.runGuardrails)(registry, "pre-tool", ["shell-blocker"], preToolCtx);
|
|
249
|
+
(0, bun_test_1.expect)(blockedOutcome.tripped?.guardrail).toBe("shell-blocker");
|
|
250
|
+
(0, bun_test_1.expect)(blockedOutcome.tripped?.reason).toBe("destructive-command-blocked");
|
|
251
|
+
// Benign tool call passes.
|
|
252
|
+
const benignOutcome = await (0, guardrails_1.runGuardrails)(registry, "pre-tool", ["shell-blocker"], { ...preToolCtx, toolName: "read_file", arguments: { path: "/tmp/out" } });
|
|
253
|
+
(0, bun_test_1.expect)(benignOutcome.tripped).toBeNull();
|
|
254
|
+
(0, bun_test_1.expect)(benignOutcome.ran).toEqual(["shell-blocker"]);
|
|
255
|
+
});
|
|
256
|
+
(0, bun_test_1.test)("pre-tool noop guardrail always passes", async () => {
|
|
257
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
258
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("pre-tool", "noop-pre"));
|
|
259
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "pre-tool", ["noop-pre"], preToolCtx);
|
|
260
|
+
(0, bun_test_1.expect)(outcome.tripped).toBeNull();
|
|
261
|
+
(0, bun_test_1.expect)(outcome.ran).toEqual(["noop-pre"]);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// Registry edge cases
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
(0, bun_test_1.describe)("GuardrailRegistry — edge cases", () => {
|
|
268
|
+
(0, bun_test_1.test)("get() on unregistered stage returns undefined", () => {
|
|
269
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
270
|
+
(0, bun_test_1.expect)(registry.get("pre-tool", "anything")).toBeUndefined();
|
|
271
|
+
});
|
|
272
|
+
(0, bun_test_1.test)("list() on empty registry returns empty array for every stage", () => {
|
|
273
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
274
|
+
(0, bun_test_1.expect)(registry.list("input")).toEqual([]);
|
|
275
|
+
(0, bun_test_1.expect)(registry.list("output")).toEqual([]);
|
|
276
|
+
(0, bun_test_1.expect)(registry.list("pre-tool")).toEqual([]);
|
|
277
|
+
});
|
|
278
|
+
(0, bun_test_1.test)("resolve() on a stage with no registered guardrails returns empty array", () => {
|
|
279
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
280
|
+
// Register only on 'input'; resolve 'output' → should return [].
|
|
281
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("input", "in"));
|
|
282
|
+
(0, bun_test_1.expect)(registry.resolve("output", ["in"])).toEqual([]);
|
|
283
|
+
});
|
|
284
|
+
(0, bun_test_1.test)("registering a guardrail under its default name", () => {
|
|
285
|
+
const g = (0, guardrails_1.createNoopGuardrail)("input");
|
|
286
|
+
(0, bun_test_1.expect)(g.name).toBe("noop-input");
|
|
287
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
288
|
+
registry.register(g);
|
|
289
|
+
(0, bun_test_1.expect)(registry.get("input", "noop-input")).toBeDefined();
|
|
290
|
+
});
|
|
291
|
+
(0, bun_test_1.test)("different stages can hold guardrails with the same name independently", () => {
|
|
292
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
293
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("input", "x"));
|
|
294
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("output", "x"));
|
|
295
|
+
registry.register((0, guardrails_1.createNoopGuardrail)("pre-tool", "x"));
|
|
296
|
+
(0, bun_test_1.expect)(registry.list("input")).toHaveLength(1);
|
|
297
|
+
(0, bun_test_1.expect)(registry.list("output")).toHaveLength(1);
|
|
298
|
+
(0, bun_test_1.expect)(registry.list("pre-tool")).toHaveLength(1);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// Stage isolation: runGuardrails only runs guardrails for the target stage
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
(0, bun_test_1.describe)("runGuardrails — stage isolation", () => {
|
|
305
|
+
(0, bun_test_1.test)("input guardrail is not invoked when running output stage", async () => {
|
|
306
|
+
const registry = new guardrails_1.GuardrailRegistry();
|
|
307
|
+
let inputRan = false;
|
|
308
|
+
const inputGuard = {
|
|
309
|
+
name: "input-guard",
|
|
310
|
+
stage: "input",
|
|
311
|
+
async run() {
|
|
312
|
+
inputRan = true;
|
|
313
|
+
return { tripped: true, reason: "should-not-run" };
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
const outputGuard = (0, guardrails_1.createNoopGuardrail)("output", "output-guard");
|
|
317
|
+
registry.register(inputGuard);
|
|
318
|
+
registry.register(outputGuard);
|
|
319
|
+
// Run the output stage — 'input-guard' is registered for 'input', not 'output'.
|
|
320
|
+
// Even if we pass its name in `enabled`, resolve() will find nothing.
|
|
321
|
+
const outcome = await (0, guardrails_1.runGuardrails)(registry, "output", ["input-guard", "output-guard"], outputCtx);
|
|
322
|
+
(0, bun_test_1.expect)(inputRan).toBe(false);
|
|
323
|
+
// output-guard ran and passed.
|
|
324
|
+
(0, bun_test_1.expect)(outcome.tripped).toBeNull();
|
|
325
|
+
(0, bun_test_1.expect)(outcome.ran).toEqual(["output-guard"]);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
//# sourceMappingURL=guardrails-harden.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails-harden.test.js","sourceRoot":"","sources":["../../src/__tests__/guardrails-harden.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for instruction-provider.ts (BaseInstructionProvider).
|
|
3
|
+
*
|
|
4
|
+
* No prior tests existed. Covers: happy-path getInstructions, error-swallowing,
|
|
5
|
+
* priority ordering convention, and name/priority contract.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=instruction-provider.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/instruction-provider.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for instruction-provider.ts (BaseInstructionProvider).
|
|
4
|
+
*
|
|
5
|
+
* No prior tests existed. Covers: happy-path getInstructions, error-swallowing,
|
|
6
|
+
* priority ordering convention, and name/priority contract.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const bun_test_1 = require("bun:test");
|
|
10
|
+
const instruction_provider_1 = require("../instruction-provider");
|
|
11
|
+
// ── Minimal context ──────────────────────────────────────────────────────────
|
|
12
|
+
const CTX = {
|
|
13
|
+
userId: "user-1",
|
|
14
|
+
agentId: "agent-1",
|
|
15
|
+
sessionKey: "sess-abc",
|
|
16
|
+
workingDirectory: "/workspace",
|
|
17
|
+
};
|
|
18
|
+
// ── Concrete test implementations ─────────────────────────────────────────────
|
|
19
|
+
class HappyProvider extends instruction_provider_1.BaseInstructionProvider {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.name = "happy";
|
|
23
|
+
this.priority = 10;
|
|
24
|
+
}
|
|
25
|
+
buildInstructions(_ctx) {
|
|
26
|
+
return "## Happy Instructions";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
class AsyncProvider extends instruction_provider_1.BaseInstructionProvider {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.name = "async";
|
|
33
|
+
this.priority = 20;
|
|
34
|
+
}
|
|
35
|
+
async buildInstructions(ctx) {
|
|
36
|
+
return `## Instructions for ${ctx.userId}`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class ThrowingProvider extends instruction_provider_1.BaseInstructionProvider {
|
|
40
|
+
constructor() {
|
|
41
|
+
super(...arguments);
|
|
42
|
+
this.name = "thrower";
|
|
43
|
+
this.priority = 30;
|
|
44
|
+
}
|
|
45
|
+
buildInstructions(_ctx) {
|
|
46
|
+
throw new Error("build failed");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class EmptyProvider extends instruction_provider_1.BaseInstructionProvider {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
this.name = "empty";
|
|
53
|
+
this.priority = 40;
|
|
54
|
+
}
|
|
55
|
+
buildInstructions(_ctx) {
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
class ContextAwareProvider extends instruction_provider_1.BaseInstructionProvider {
|
|
60
|
+
constructor() {
|
|
61
|
+
super(...arguments);
|
|
62
|
+
this.name = "ctx-aware";
|
|
63
|
+
this.priority = 5;
|
|
64
|
+
}
|
|
65
|
+
buildInstructions(ctx) {
|
|
66
|
+
return `user=${ctx.userId} agent=${ctx.agentId}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
70
|
+
(0, bun_test_1.describe)("BaseInstructionProvider.getInstructions", () => {
|
|
71
|
+
(0, bun_test_1.test)("returns value from buildInstructions (sync)", async () => {
|
|
72
|
+
const provider = new HappyProvider();
|
|
73
|
+
const result = await provider.getInstructions(CTX);
|
|
74
|
+
(0, bun_test_1.expect)(result).toBe("## Happy Instructions");
|
|
75
|
+
});
|
|
76
|
+
(0, bun_test_1.test)("returns value from buildInstructions (async)", async () => {
|
|
77
|
+
const provider = new AsyncProvider();
|
|
78
|
+
const result = await provider.getInstructions(CTX);
|
|
79
|
+
(0, bun_test_1.expect)(result).toBe("## Instructions for user-1");
|
|
80
|
+
});
|
|
81
|
+
(0, bun_test_1.test)("swallows exceptions and returns empty string", async () => {
|
|
82
|
+
const provider = new ThrowingProvider();
|
|
83
|
+
// Should not throw; returns ""
|
|
84
|
+
const result = await provider.getInstructions(CTX);
|
|
85
|
+
(0, bun_test_1.expect)(result).toBe("");
|
|
86
|
+
});
|
|
87
|
+
(0, bun_test_1.test)("passes empty string through when buildInstructions returns empty", async () => {
|
|
88
|
+
const provider = new EmptyProvider();
|
|
89
|
+
const result = await provider.getInstructions(CTX);
|
|
90
|
+
(0, bun_test_1.expect)(result).toBe("");
|
|
91
|
+
});
|
|
92
|
+
(0, bun_test_1.test)("passes context fields to buildInstructions", async () => {
|
|
93
|
+
const provider = new ContextAwareProvider();
|
|
94
|
+
const result = await provider.getInstructions(CTX);
|
|
95
|
+
(0, bun_test_1.expect)(result).toContain("user-1");
|
|
96
|
+
(0, bun_test_1.expect)(result).toContain("agent-1");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
(0, bun_test_1.describe)("BaseInstructionProvider contract", () => {
|
|
100
|
+
(0, bun_test_1.test)("name is accessible on the instance", () => {
|
|
101
|
+
(0, bun_test_1.expect)(new HappyProvider().name).toBe("happy");
|
|
102
|
+
});
|
|
103
|
+
(0, bun_test_1.test)("priority is accessible on the instance", () => {
|
|
104
|
+
(0, bun_test_1.expect)(new HappyProvider().priority).toBe(10);
|
|
105
|
+
});
|
|
106
|
+
(0, bun_test_1.test)("lower priority value = earlier ordering (convention check)", () => {
|
|
107
|
+
const providers = [
|
|
108
|
+
new AsyncProvider(),
|
|
109
|
+
new ContextAwareProvider(),
|
|
110
|
+
new HappyProvider(),
|
|
111
|
+
];
|
|
112
|
+
const sorted = [...providers].sort((a, b) => a.priority - b.priority);
|
|
113
|
+
(0, bun_test_1.expect)(sorted[0]?.name).toBe("ctx-aware");
|
|
114
|
+
(0, bun_test_1.expect)(sorted[1]?.name).toBe("happy");
|
|
115
|
+
(0, bun_test_1.expect)(sorted[2]?.name).toBe("async");
|
|
116
|
+
});
|
|
117
|
+
(0, bun_test_1.test)("each call to getInstructions is independent (no shared state)", async () => {
|
|
118
|
+
const provider = new ContextAwareProvider();
|
|
119
|
+
const ctx1 = { ...CTX, userId: "alice" };
|
|
120
|
+
const ctx2 = { ...CTX, userId: "bob" };
|
|
121
|
+
const [r1, r2] = await Promise.all([
|
|
122
|
+
provider.getInstructions(ctx1),
|
|
123
|
+
provider.getInstructions(ctx2),
|
|
124
|
+
]);
|
|
125
|
+
(0, bun_test_1.expect)(r1).toContain("alice");
|
|
126
|
+
(0, bun_test_1.expect)(r2).toContain("bob");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=instruction-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/instruction-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hardened edge-case tests for lobu-toml-schema.ts.
|
|
3
|
+
*
|
|
4
|
+
* The existing lobu-toml-schema.test.ts covers preview and memory.
|
|
5
|
+
* This file covers: agent ID validation, provider mutual-exclusion,
|
|
6
|
+
* pre_approved tool pattern enforcement, network config, egress,
|
|
7
|
+
* platform name regex, and unknown/wrong-type fields.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=lobu-toml-schema-harden.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lobu-toml-schema-harden.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/lobu-toml-schema-harden.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|