attenu-guard 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/LICENSE +202 -0
- package/README.md +200 -0
- package/SECURITY.md +34 -0
- package/bin/attenu-guard.js +4 -0
- package/dist/cjs/adapters/langgraph.d.ts +174 -0
- package/dist/cjs/adapters/langgraph.d.ts.map +1 -0
- package/dist/cjs/adapters/langgraph.js +242 -0
- package/dist/cjs/adapters/langgraph.js.map +1 -0
- package/dist/cjs/audit.d.ts +82 -0
- package/dist/cjs/audit.d.ts.map +1 -0
- package/dist/cjs/audit.js +195 -0
- package/dist/cjs/audit.js.map +1 -0
- package/dist/cjs/authority.d.ts +114 -0
- package/dist/cjs/authority.d.ts.map +1 -0
- package/dist/cjs/authority.js +238 -0
- package/dist/cjs/authority.js.map +1 -0
- package/dist/cjs/canonical.d.ts +91 -0
- package/dist/cjs/canonical.d.ts.map +1 -0
- package/dist/cjs/canonical.js +372 -0
- package/dist/cjs/canonical.js.map +1 -0
- package/dist/cjs/ceilings.d.ts +211 -0
- package/dist/cjs/ceilings.d.ts.map +1 -0
- package/dist/cjs/ceilings.js +476 -0
- package/dist/cjs/ceilings.js.map +1 -0
- package/dist/cjs/chain.d.ts +106 -0
- package/dist/cjs/chain.d.ts.map +1 -0
- package/dist/cjs/chain.js +0 -0
- package/dist/cjs/chain.js.map +1 -0
- package/dist/cjs/cli.d.ts +16 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +100 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/evidence.d.ts +163 -0
- package/dist/cjs/evidence.d.ts.map +1 -0
- package/dist/cjs/evidence.js +409 -0
- package/dist/cjs/evidence.js.map +1 -0
- package/dist/cjs/guard.d.ts +186 -0
- package/dist/cjs/guard.d.ts.map +1 -0
- package/dist/cjs/guard.js +432 -0
- package/dist/cjs/guard.js.map +1 -0
- package/dist/cjs/index.d.ts +52 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +99 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/reasons.d.ts +93 -0
- package/dist/cjs/reasons.d.ts.map +1 -0
- package/dist/cjs/reasons.js +139 -0
- package/dist/cjs/reasons.js.map +1 -0
- package/dist/cjs/strikes.d.ts +24 -0
- package/dist/cjs/strikes.d.ts.map +1 -0
- package/dist/cjs/strikes.js +30 -0
- package/dist/cjs/strikes.js.map +1 -0
- package/dist/cjs/wire.d.ts +83 -0
- package/dist/cjs/wire.d.ts.map +1 -0
- package/dist/cjs/wire.js +165 -0
- package/dist/cjs/wire.js.map +1 -0
- package/dist/esm/adapters/langgraph.d.ts +174 -0
- package/dist/esm/adapters/langgraph.d.ts.map +1 -0
- package/dist/esm/adapters/langgraph.js +199 -0
- package/dist/esm/adapters/langgraph.js.map +1 -0
- package/dist/esm/audit.d.ts +82 -0
- package/dist/esm/audit.d.ts.map +1 -0
- package/dist/esm/audit.js +189 -0
- package/dist/esm/audit.js.map +1 -0
- package/dist/esm/authority.d.ts +114 -0
- package/dist/esm/authority.d.ts.map +1 -0
- package/dist/esm/authority.js +233 -0
- package/dist/esm/authority.js.map +1 -0
- package/dist/esm/canonical.d.ts +91 -0
- package/dist/esm/canonical.d.ts.map +1 -0
- package/dist/esm/canonical.js +359 -0
- package/dist/esm/canonical.js.map +1 -0
- package/dist/esm/ceilings.d.ts +211 -0
- package/dist/esm/ceilings.d.ts.map +1 -0
- package/dist/esm/ceilings.js +460 -0
- package/dist/esm/ceilings.js.map +1 -0
- package/dist/esm/chain.d.ts +106 -0
- package/dist/esm/chain.d.ts.map +1 -0
- package/dist/esm/chain.js +0 -0
- package/dist/esm/chain.js.map +1 -0
- package/dist/esm/cli.d.ts +16 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +97 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/evidence.d.ts +163 -0
- package/dist/esm/evidence.d.ts.map +1 -0
- package/dist/esm/evidence.js +398 -0
- package/dist/esm/evidence.js.map +1 -0
- package/dist/esm/guard.d.ts +186 -0
- package/dist/esm/guard.d.ts.map +1 -0
- package/dist/esm/guard.js +427 -0
- package/dist/esm/guard.js.map +1 -0
- package/dist/esm/index.d.ts +52 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +42 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/reasons.d.ts +93 -0
- package/dist/esm/reasons.d.ts.map +1 -0
- package/dist/esm/reasons.js +134 -0
- package/dist/esm/reasons.js.map +1 -0
- package/dist/esm/strikes.d.ts +24 -0
- package/dist/esm/strikes.d.ts.map +1 -0
- package/dist/esm/strikes.js +26 -0
- package/dist/esm/strikes.js.map +1 -0
- package/dist/esm/wire.d.ts +83 -0
- package/dist/esm/wire.d.ts.map +1 -0
- package/dist/esm/wire.js +159 -0
- package/dist/esm/wire.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ceilings.ts — typed, self-narrowing, self-enforcing bounds on an Authority.
|
|
4
|
+
*
|
|
5
|
+
* A `Ceiling` is a small typed object that knows how to (a) check itself against
|
|
6
|
+
* a request context, (b) narrow itself against a sibling ceiling of the same
|
|
7
|
+
* kind, (c) state whether it admits a superset of what another ceiling of its
|
|
8
|
+
* kind admits, and (d) read and write its own wire form. `Authority` never needs
|
|
9
|
+
* to know the semantics of any particular ceiling — it just calls these methods.
|
|
10
|
+
*
|
|
11
|
+
* The property the Internet-Draft's constraint vocabulary demands: "a verifier
|
|
12
|
+
* that encounters an unknown constraint type MUST treat the action as denied
|
|
13
|
+
* (fail-closed), never as unconstrained." That is `ceilingFromWire`: an
|
|
14
|
+
* unrecognised wire constraint becomes an `UnknownCeiling`, whose `permits`
|
|
15
|
+
* always denies. There is no code path by which an unrecognised bound is
|
|
16
|
+
* silently dropped.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.UnknownCeiling = exports.Prefix = exports.Deny = exports.Allow = exports.EgressRank = exports.CallLimit = exports.SpendCap = exports.RowLimit = void 0;
|
|
20
|
+
exports.ctxFieldOf = ctxFieldOf;
|
|
21
|
+
exports.describe = describe;
|
|
22
|
+
exports.isMetered = isMetered;
|
|
23
|
+
exports.registerCeiling = registerCeiling;
|
|
24
|
+
exports.ceilingFromWire = ceilingFromWire;
|
|
25
|
+
const canonical_js_1 = require("./canonical.js");
|
|
26
|
+
const reasons_js_1 = require("./reasons.js");
|
|
27
|
+
// Ordered enum for egress: index 0 is the strictest. A value outside this
|
|
28
|
+
// vocabulary is treated as maximally permissive-requested (worst case), so a
|
|
29
|
+
// garbage or unknown egress value fails closed rather than silently passing.
|
|
30
|
+
const EGRESS_ORDER = ["none", "internal", "any"];
|
|
31
|
+
function egressRankOf(value) {
|
|
32
|
+
const i = EGRESS_ORDER.indexOf(value);
|
|
33
|
+
return i === -1 ? EGRESS_ORDER.length : i;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The request-context field a ceiling reads. Prefers an explicit `ctxField`,
|
|
37
|
+
* then the caller-keyed `field`, then the ceiling's own `key`.
|
|
38
|
+
*/
|
|
39
|
+
function ctxFieldOf(ceiling) {
|
|
40
|
+
if (ceiling.ctxField)
|
|
41
|
+
return ceiling.ctxField;
|
|
42
|
+
if (ceiling.field)
|
|
43
|
+
return ceiling.field;
|
|
44
|
+
return ceiling.key;
|
|
45
|
+
}
|
|
46
|
+
/** Uniform human-readable rendering of any ceiling. Never parsed back. */
|
|
47
|
+
function describe(ceiling) {
|
|
48
|
+
if (typeof ceiling.describe === "function")
|
|
49
|
+
return ceiling.describe();
|
|
50
|
+
return `${ceiling.key}=${JSON.stringify(ceiling.toWire())}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A METERED ceiling bounds a consumed quantity the caller must declare (rows
|
|
54
|
+
* read, spend, calls) — by convention its key starts with "max_". Rank and
|
|
55
|
+
* membership ceilings are not metered: omitting them from a context means "not
|
|
56
|
+
* asserting anything here", not "consuming an undeclared amount".
|
|
57
|
+
*/
|
|
58
|
+
function isMetered(ceiling) {
|
|
59
|
+
return Boolean(ceiling.metered) || String(ceiling.key).startsWith("max_");
|
|
60
|
+
}
|
|
61
|
+
function sortByStr(values) {
|
|
62
|
+
return Array.from(values).sort((a, b) => (0, canonical_js_1.compareCodePoints)(strOf(a), strOf(b)));
|
|
63
|
+
}
|
|
64
|
+
function strOf(value) {
|
|
65
|
+
if (typeof value === "number")
|
|
66
|
+
return (0, canonical_js_1.pyNumber)(value);
|
|
67
|
+
if (value === null)
|
|
68
|
+
return "None";
|
|
69
|
+
if (typeof value === "boolean")
|
|
70
|
+
return value ? "True" : "False";
|
|
71
|
+
if (typeof value === "string")
|
|
72
|
+
return value;
|
|
73
|
+
return JSON.stringify(value);
|
|
74
|
+
}
|
|
75
|
+
// =========================================================================
|
|
76
|
+
// Built-in ceilings — fixed-key numeric and enum caps. For these four the wire
|
|
77
|
+
// "key" IS the type discriminator, so the registry can route on "key" alone.
|
|
78
|
+
// =========================================================================
|
|
79
|
+
/** Per-call cap on rows read or returned. Context field: "rows". */
|
|
80
|
+
class RowLimit {
|
|
81
|
+
maxRows;
|
|
82
|
+
key = "max_rows";
|
|
83
|
+
ctxField = "rows";
|
|
84
|
+
constructor(maxRows) {
|
|
85
|
+
this.maxRows = maxRows;
|
|
86
|
+
}
|
|
87
|
+
permits(ctx) {
|
|
88
|
+
const n = ctx["rows"];
|
|
89
|
+
if (n === undefined || n === null || n <= this.maxRows)
|
|
90
|
+
return reasons_js_1.Decision.allow();
|
|
91
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
92
|
+
constraint: this.key,
|
|
93
|
+
limit: this.maxRows,
|
|
94
|
+
requested: n,
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
describe() {
|
|
98
|
+
return `${this.key}<=${(0, canonical_js_1.pyNumber)(this.maxRows)}`;
|
|
99
|
+
}
|
|
100
|
+
narrow(other) {
|
|
101
|
+
return new RowLimit(Math.min(this.maxRows, other.maxRows));
|
|
102
|
+
}
|
|
103
|
+
subsumes(other) {
|
|
104
|
+
return this.maxRows >= other.maxRows;
|
|
105
|
+
}
|
|
106
|
+
toWire() {
|
|
107
|
+
return { key: this.key, max: this.maxRows };
|
|
108
|
+
}
|
|
109
|
+
static fromWire(d) {
|
|
110
|
+
return new RowLimit(d["max"]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.RowLimit = RowLimit;
|
|
114
|
+
/** Per-call cap on spend, currency-agnostic. Context field: "spend". */
|
|
115
|
+
class SpendCap {
|
|
116
|
+
maxSpend;
|
|
117
|
+
key = "max_spend";
|
|
118
|
+
ctxField = "spend";
|
|
119
|
+
constructor(maxSpend) {
|
|
120
|
+
this.maxSpend = maxSpend;
|
|
121
|
+
}
|
|
122
|
+
permits(ctx) {
|
|
123
|
+
const n = ctx["spend"];
|
|
124
|
+
if (n === undefined || n === null || n <= this.maxSpend)
|
|
125
|
+
return reasons_js_1.Decision.allow();
|
|
126
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
127
|
+
constraint: this.key,
|
|
128
|
+
limit: this.maxSpend,
|
|
129
|
+
requested: n,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
describe() {
|
|
133
|
+
return `${this.key}<=${(0, canonical_js_1.pyNumber)(this.maxSpend)}`;
|
|
134
|
+
}
|
|
135
|
+
narrow(other) {
|
|
136
|
+
return new SpendCap(Math.min(this.maxSpend, other.maxSpend));
|
|
137
|
+
}
|
|
138
|
+
subsumes(other) {
|
|
139
|
+
return this.maxSpend >= other.maxSpend;
|
|
140
|
+
}
|
|
141
|
+
toWire() {
|
|
142
|
+
return { key: this.key, max: this.maxSpend };
|
|
143
|
+
}
|
|
144
|
+
static fromWire(d) {
|
|
145
|
+
return new SpendCap(d["max"]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.SpendCap = SpendCap;
|
|
149
|
+
/**
|
|
150
|
+
* Cap on a call COUNT. Context field: "calls" — the running count including
|
|
151
|
+
* this call.
|
|
152
|
+
*
|
|
153
|
+
* `appliesTo` makes the ceiling SCOPED: it only bites requests for that scope
|
|
154
|
+
* (wildcards as in scopes: "fs.write", "web.*"). A scoped limit is its own
|
|
155
|
+
* dimension — `key` becomes `max_calls[<appliesTo>]` — so an unscoped and a
|
|
156
|
+
* scoped limit coexist in one Authority and pair independently.
|
|
157
|
+
*
|
|
158
|
+
* `Guard.check` supplies `calls` itself, per (node, pattern), when the caller
|
|
159
|
+
* does not; an explicit `calls` in the context still wins.
|
|
160
|
+
*/
|
|
161
|
+
class CallLimit {
|
|
162
|
+
maxCalls;
|
|
163
|
+
appliesTo;
|
|
164
|
+
key;
|
|
165
|
+
ctxField;
|
|
166
|
+
constructor(maxCalls, appliesTo = null) {
|
|
167
|
+
this.maxCalls = maxCalls;
|
|
168
|
+
this.appliesTo = appliesTo;
|
|
169
|
+
this.key = appliesTo ? `max_calls[${appliesTo}]` : "max_calls";
|
|
170
|
+
this.ctxField = appliesTo ? `calls[${appliesTo}]` : "calls";
|
|
171
|
+
}
|
|
172
|
+
/** What this ceiling counts: the pattern it applies to, or every call. */
|
|
173
|
+
get meterKey() {
|
|
174
|
+
return this.appliesTo ?? "*";
|
|
175
|
+
}
|
|
176
|
+
appliesToScope(scope) {
|
|
177
|
+
if (!this.appliesTo || scope === null || scope === undefined)
|
|
178
|
+
return true;
|
|
179
|
+
const held = this.appliesTo;
|
|
180
|
+
return held === scope || (held.endsWith(".*") && String(scope).startsWith(held.slice(0, -1)));
|
|
181
|
+
}
|
|
182
|
+
permits(ctx) {
|
|
183
|
+
if (!this.appliesToScope(ctx["_scope"]))
|
|
184
|
+
return reasons_js_1.Decision.allow();
|
|
185
|
+
const n = ctx[this.ctxField];
|
|
186
|
+
if (n === undefined || n === null || n <= this.maxCalls)
|
|
187
|
+
return reasons_js_1.Decision.allow();
|
|
188
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
189
|
+
constraint: this.key,
|
|
190
|
+
limit: this.maxCalls,
|
|
191
|
+
requested: n,
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
describe() {
|
|
195
|
+
return `${this.key}<=${(0, canonical_js_1.pyNumber)(this.maxCalls)}`;
|
|
196
|
+
}
|
|
197
|
+
narrow(other) {
|
|
198
|
+
return new CallLimit(Math.min(this.maxCalls, other.maxCalls), this.appliesTo);
|
|
199
|
+
}
|
|
200
|
+
subsumes(other) {
|
|
201
|
+
return this.maxCalls >= other.maxCalls;
|
|
202
|
+
}
|
|
203
|
+
toWire() {
|
|
204
|
+
if (!this.appliesTo)
|
|
205
|
+
return { key: this.key, max: this.maxCalls };
|
|
206
|
+
return { key: this.key, type: "max_calls", max: this.maxCalls, applies_to: this.appliesTo };
|
|
207
|
+
}
|
|
208
|
+
static fromWire(d) {
|
|
209
|
+
return new CallLimit(d["max"], d["applies_to"] ?? null);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.CallLimit = CallLimit;
|
|
213
|
+
/** Ordered-enum egress ceiling: none < internal < any. Context field: "egress". */
|
|
214
|
+
class EgressRank {
|
|
215
|
+
level;
|
|
216
|
+
key = "egress";
|
|
217
|
+
ctxField = "egress";
|
|
218
|
+
constructor(level) {
|
|
219
|
+
this.level = level;
|
|
220
|
+
}
|
|
221
|
+
permits(ctx) {
|
|
222
|
+
const val = ctx["egress"];
|
|
223
|
+
if (val === undefined || val === null || egressRankOf(val) <= egressRankOf(this.level)) {
|
|
224
|
+
return reasons_js_1.Decision.allow();
|
|
225
|
+
}
|
|
226
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
227
|
+
constraint: this.key,
|
|
228
|
+
limit: this.level,
|
|
229
|
+
requested: val,
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
describe() {
|
|
233
|
+
return `${this.key}<=${this.level}`;
|
|
234
|
+
}
|
|
235
|
+
narrow(other) {
|
|
236
|
+
const o = other;
|
|
237
|
+
return new EgressRank(egressRankOf(this.level) <= egressRankOf(o.level) ? this.level : o.level);
|
|
238
|
+
}
|
|
239
|
+
subsumes(other) {
|
|
240
|
+
return egressRankOf(this.level) >= egressRankOf(other.level);
|
|
241
|
+
}
|
|
242
|
+
toWire() {
|
|
243
|
+
return { key: this.key, rank: this.level };
|
|
244
|
+
}
|
|
245
|
+
static fromWire(d) {
|
|
246
|
+
return new EgressRank(d["rank"]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.EgressRank = EgressRank;
|
|
250
|
+
// =========================================================================
|
|
251
|
+
// Built-in ceilings — generic, caller-keyed set membership and prefix bounds.
|
|
252
|
+
// `key` here IS a caller choice, so it cannot double as the wire discriminator;
|
|
253
|
+
// these carry an explicit "type" on the wire.
|
|
254
|
+
// =========================================================================
|
|
255
|
+
/** Membership allow-list: the context value MUST be one of `oneOf`. */
|
|
256
|
+
class Allow {
|
|
257
|
+
key;
|
|
258
|
+
field;
|
|
259
|
+
oneOf;
|
|
260
|
+
constructor(key, oneOf, field = null) {
|
|
261
|
+
this.key = key;
|
|
262
|
+
this.field = field;
|
|
263
|
+
this.oneOf = new Set(oneOf);
|
|
264
|
+
}
|
|
265
|
+
ctxKey() {
|
|
266
|
+
return this.field ?? this.key;
|
|
267
|
+
}
|
|
268
|
+
permits(ctx) {
|
|
269
|
+
const val = ctx[this.ctxKey()];
|
|
270
|
+
if (val === undefined || val === null || this.oneOf.has(val))
|
|
271
|
+
return reasons_js_1.Decision.allow();
|
|
272
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
273
|
+
constraint: this.key,
|
|
274
|
+
limit: sortByStr(this.oneOf),
|
|
275
|
+
requested: val,
|
|
276
|
+
}));
|
|
277
|
+
}
|
|
278
|
+
describe() {
|
|
279
|
+
return `${this.key} in [${sortByStr(this.oneOf).map(strOf).join(", ")}]`;
|
|
280
|
+
}
|
|
281
|
+
narrow(other) {
|
|
282
|
+
const o = other;
|
|
283
|
+
return new Allow(this.key, Array.from(this.oneOf).filter((v) => o.oneOf.has(v)), this.field);
|
|
284
|
+
}
|
|
285
|
+
subsumes(other) {
|
|
286
|
+
return Array.from(other.oneOf).every((v) => this.oneOf.has(v));
|
|
287
|
+
}
|
|
288
|
+
toWire() {
|
|
289
|
+
const d = { key: this.key, type: "allow", one_of: sortByStr(this.oneOf) };
|
|
290
|
+
if (this.field !== null && this.field !== this.key)
|
|
291
|
+
d["field"] = this.field;
|
|
292
|
+
return d;
|
|
293
|
+
}
|
|
294
|
+
static fromWire(d) {
|
|
295
|
+
return new Allow(d["key"], d["one_of"] ?? [], d["field"] ?? null);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
exports.Allow = Allow;
|
|
299
|
+
/** Membership deny-list: the context value MUST NOT be one of `notOneOf`. */
|
|
300
|
+
class Deny {
|
|
301
|
+
key;
|
|
302
|
+
field;
|
|
303
|
+
notOneOf;
|
|
304
|
+
constructor(key, notOneOf, field = null) {
|
|
305
|
+
this.key = key;
|
|
306
|
+
this.field = field;
|
|
307
|
+
this.notOneOf = new Set(notOneOf);
|
|
308
|
+
}
|
|
309
|
+
ctxKey() {
|
|
310
|
+
return this.field ?? this.key;
|
|
311
|
+
}
|
|
312
|
+
permits(ctx) {
|
|
313
|
+
const val = ctx[this.ctxKey()];
|
|
314
|
+
if (val === undefined || val === null || !this.notOneOf.has(val))
|
|
315
|
+
return reasons_js_1.Decision.allow();
|
|
316
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
317
|
+
constraint: this.key,
|
|
318
|
+
limit: sortByStr(this.notOneOf),
|
|
319
|
+
requested: val,
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
describe() {
|
|
323
|
+
return `${this.key} not in [${sortByStr(this.notOneOf).map(strOf).join(", ")}]`;
|
|
324
|
+
}
|
|
325
|
+
narrow(other) {
|
|
326
|
+
const o = other;
|
|
327
|
+
return new Deny(this.key, [...this.notOneOf, ...o.notOneOf], this.field);
|
|
328
|
+
}
|
|
329
|
+
subsumes(other) {
|
|
330
|
+
// `this` admits a superset of `other`'s admitted set iff it forbids a
|
|
331
|
+
// subset of what `other` forbids.
|
|
332
|
+
return Array.from(this.notOneOf).every((v) => other.notOneOf.has(v));
|
|
333
|
+
}
|
|
334
|
+
toWire() {
|
|
335
|
+
const d = {
|
|
336
|
+
key: this.key,
|
|
337
|
+
type: "deny",
|
|
338
|
+
not_one_of: sortByStr(this.notOneOf),
|
|
339
|
+
};
|
|
340
|
+
if (this.field !== null && this.field !== this.key)
|
|
341
|
+
d["field"] = this.field;
|
|
342
|
+
return d;
|
|
343
|
+
}
|
|
344
|
+
static fromWire(d) {
|
|
345
|
+
return new Deny(d["key"], d["not_one_of"] ?? [], d["field"] ?? null);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.Deny = Deny;
|
|
349
|
+
/** String-prefix bound: the context value MUST start with `prefix`. */
|
|
350
|
+
class Prefix {
|
|
351
|
+
key;
|
|
352
|
+
prefix;
|
|
353
|
+
field;
|
|
354
|
+
constructor(key, prefix, field = null) {
|
|
355
|
+
this.key = key;
|
|
356
|
+
this.prefix = prefix;
|
|
357
|
+
this.field = field;
|
|
358
|
+
}
|
|
359
|
+
ctxKey() {
|
|
360
|
+
return this.field ?? this.key;
|
|
361
|
+
}
|
|
362
|
+
permits(ctx) {
|
|
363
|
+
const val = ctx[this.ctxKey()];
|
|
364
|
+
if (val === undefined || val === null || String(val).startsWith(this.prefix)) {
|
|
365
|
+
return reasons_js_1.Decision.allow();
|
|
366
|
+
}
|
|
367
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.CEILING_EXCEEDED, {
|
|
368
|
+
constraint: this.key,
|
|
369
|
+
limit: this.prefix,
|
|
370
|
+
requested: val,
|
|
371
|
+
}));
|
|
372
|
+
}
|
|
373
|
+
describe() {
|
|
374
|
+
return `${this.key} startswith ${this.prefix}`;
|
|
375
|
+
}
|
|
376
|
+
narrow(other) {
|
|
377
|
+
const o = other;
|
|
378
|
+
// If one prefix is a prefix of the other, the longer (more specific) one
|
|
379
|
+
// admits the subset and is the sound meet.
|
|
380
|
+
if (this.prefix.startsWith(o.prefix))
|
|
381
|
+
return this;
|
|
382
|
+
if (o.prefix.startsWith(this.prefix))
|
|
383
|
+
return o;
|
|
384
|
+
// Incomparable prefixes (e.g. "eu-" and "us-"): no real value can start
|
|
385
|
+
// with both, so the sound meet admits nothing. That is encoded as a prefix
|
|
386
|
+
// containing a NUL byte, which cannot be a genuine prefix of any realistic
|
|
387
|
+
// context string — so `permits` soundly denies every real request rather
|
|
388
|
+
// than picking one side and silently admitting values the other rejected.
|
|
389
|
+
return new Prefix(this.key, `${this.prefix}\u0000${o.prefix}`, this.field);
|
|
390
|
+
}
|
|
391
|
+
subsumes(other) {
|
|
392
|
+
return other.prefix.startsWith(this.prefix);
|
|
393
|
+
}
|
|
394
|
+
toWire() {
|
|
395
|
+
const d = { key: this.key, type: "prefix", prefix: this.prefix };
|
|
396
|
+
if (this.field !== null && this.field !== this.key)
|
|
397
|
+
d["field"] = this.field;
|
|
398
|
+
return d;
|
|
399
|
+
}
|
|
400
|
+
static fromWire(d) {
|
|
401
|
+
return new Prefix(d["key"], d["prefix"], d["field"] ?? null);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
exports.Prefix = Prefix;
|
|
405
|
+
const REGISTRY = new Map();
|
|
406
|
+
/**
|
|
407
|
+
* Register a ceiling class's `fromWire` under a wire discriminator.
|
|
408
|
+
* Re-registering replaces the previous mapping — callers may shadow a built-in
|
|
409
|
+
* deliberately, but should do so knowingly.
|
|
410
|
+
*/
|
|
411
|
+
function registerCeiling(key, cls) {
|
|
412
|
+
REGISTRY.set(key, cls);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Fail-closed placeholder for a wire constraint this build does not recognise.
|
|
416
|
+
*
|
|
417
|
+
* `permits` always denies. `narrow` stays an unknown ceiling, so it can never
|
|
418
|
+
* resolve to something more permissive than "deny everything". `subsumes` is
|
|
419
|
+
* true only against an identical unknown ceiling — just enough reflexivity for
|
|
420
|
+
* `isNarrowerThan(self)`. `toWire` preserves the original bytes losslessly, so
|
|
421
|
+
* a chain that merely forwards constraints can still do so.
|
|
422
|
+
*/
|
|
423
|
+
class UnknownCeiling {
|
|
424
|
+
raw;
|
|
425
|
+
key;
|
|
426
|
+
constructor(key, raw = {}) {
|
|
427
|
+
this.raw = raw;
|
|
428
|
+
this.key = key === null || key === undefined ? "" : String(key);
|
|
429
|
+
}
|
|
430
|
+
permits(_ctx) {
|
|
431
|
+
return reasons_js_1.Decision.deny(new reasons_js_1.Reason(reasons_js_1.ReasonCode.UNKNOWN_CONSTRAINT, {
|
|
432
|
+
constraint: this.key,
|
|
433
|
+
message: `unrecognised constraint type for key=${JSON.stringify(this.key)}; fail-closed`,
|
|
434
|
+
}));
|
|
435
|
+
}
|
|
436
|
+
narrow(_other) {
|
|
437
|
+
return this;
|
|
438
|
+
}
|
|
439
|
+
subsumes(other) {
|
|
440
|
+
return (other instanceof UnknownCeiling &&
|
|
441
|
+
JSON.stringify(canonicalPairs(other.raw)) === JSON.stringify(canonicalPairs(this.raw)));
|
|
442
|
+
}
|
|
443
|
+
toWire() {
|
|
444
|
+
return { ...this.raw };
|
|
445
|
+
}
|
|
446
|
+
static fromWire(d) {
|
|
447
|
+
return new UnknownCeiling(d["key"] ?? null, { ...d });
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
exports.UnknownCeiling = UnknownCeiling;
|
|
451
|
+
function canonicalPairs(d) {
|
|
452
|
+
return Object.keys(d)
|
|
453
|
+
.sort(canonical_js_1.compareCodePoints)
|
|
454
|
+
.map((k) => [k, d[k]]);
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Reconstruct a Ceiling from its wire form. Routes on "type" when present (it
|
|
458
|
+
* disambiguates the generic ceilings), else on "key". An unrecognised
|
|
459
|
+
* discriminator fails closed via `UnknownCeiling`.
|
|
460
|
+
*/
|
|
461
|
+
function ceilingFromWire(wire) {
|
|
462
|
+
const d = (0, canonical_js_1.toPlain)(wire);
|
|
463
|
+
const discriminator = d["type"] ?? d["key"];
|
|
464
|
+
const cls = typeof discriminator === "string" ? REGISTRY.get(discriminator) : undefined;
|
|
465
|
+
if (cls === undefined)
|
|
466
|
+
return UnknownCeiling.fromWire(d);
|
|
467
|
+
return cls.fromWire(d);
|
|
468
|
+
}
|
|
469
|
+
registerCeiling("max_rows", RowLimit);
|
|
470
|
+
registerCeiling("max_spend", SpendCap);
|
|
471
|
+
registerCeiling("max_calls", CallLimit);
|
|
472
|
+
registerCeiling("egress", EgressRank);
|
|
473
|
+
registerCeiling("allow", Allow);
|
|
474
|
+
registerCeiling("deny", Deny);
|
|
475
|
+
registerCeiling("prefix", Prefix);
|
|
476
|
+
//# sourceMappingURL=ceilings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ceilings.js","sourceRoot":"","sources":["../../src/ceilings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain state — the live delegation graph, TTL, integrity and cascade revocation.
|
|
3
|
+
*
|
|
4
|
+
* A Chain tracks the tree of delegations rooted at one top-level task and
|
|
5
|
+
* enforces the structural invariants no single-agent policy model can express:
|
|
6
|
+
*
|
|
7
|
+
* * monotonic attenuation: every child authority <= its parent's (via `meet`);
|
|
8
|
+
* * time bounds: an authority stops authorizing once its TTL elapses;
|
|
9
|
+
* * depth and fanout ceilings on the tree;
|
|
10
|
+
* * aggregate ceilings summed across the whole chain;
|
|
11
|
+
* * cascade revocation: revoking any node revokes its whole subtree;
|
|
12
|
+
* * in-process integrity: each node's authority is sealed with a per-chain
|
|
13
|
+
* secret, so accidental (or unsophisticated) mutation of node state is
|
|
14
|
+
* caught at check time.
|
|
15
|
+
*
|
|
16
|
+
* That last one raises the bar against bugs and casual tampering only — code
|
|
17
|
+
* running in the same process can read the secret. Real tamper-resistance comes
|
|
18
|
+
* from the signed, offline-verifiable evidence bundle; the in-process library
|
|
19
|
+
* tier trusts its own process.
|
|
20
|
+
*/
|
|
21
|
+
import { type Json } from "./canonical.js";
|
|
22
|
+
import { Authority, AuthorityError } from "./authority.js";
|
|
23
|
+
/** A source of seconds for TTL expiry. Injectable so tests are deterministic. */
|
|
24
|
+
export interface Clock {
|
|
25
|
+
now(): number;
|
|
26
|
+
}
|
|
27
|
+
/** The default wall clock: monotonic seconds. */
|
|
28
|
+
export declare class MonotonicClock implements Clock {
|
|
29
|
+
now(): number;
|
|
30
|
+
}
|
|
31
|
+
/** A test clock the caller advances by hand. */
|
|
32
|
+
export declare class ManualClock implements Clock {
|
|
33
|
+
private t;
|
|
34
|
+
constructor(t?: number);
|
|
35
|
+
now(): number;
|
|
36
|
+
advance(seconds: number): void;
|
|
37
|
+
set(seconds: number): void;
|
|
38
|
+
}
|
|
39
|
+
export interface Node {
|
|
40
|
+
nodeId: string;
|
|
41
|
+
parentId: string | null;
|
|
42
|
+
agentId: string;
|
|
43
|
+
authority: Authority;
|
|
44
|
+
task: string;
|
|
45
|
+
depth: number;
|
|
46
|
+
issuedAt: number;
|
|
47
|
+
revoked: boolean;
|
|
48
|
+
/** Lifecycle end marker: informational, never widens or narrows authority. */
|
|
49
|
+
complete: boolean;
|
|
50
|
+
children: string[];
|
|
51
|
+
/** HMAC of the authority under the chain secret. */
|
|
52
|
+
seal: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ChainInit {
|
|
55
|
+
maxDepth?: number;
|
|
56
|
+
maxFanout?: number;
|
|
57
|
+
clock?: Clock;
|
|
58
|
+
}
|
|
59
|
+
export declare class Chain {
|
|
60
|
+
readonly chainId: string;
|
|
61
|
+
readonly maxDepth: number;
|
|
62
|
+
readonly maxFanout: number;
|
|
63
|
+
readonly clock: Clock;
|
|
64
|
+
readonly nodes: Map<string, Node>;
|
|
65
|
+
private readonly revokedNodes;
|
|
66
|
+
private readonly bannedAgents;
|
|
67
|
+
private nextId;
|
|
68
|
+
private readonly consumed;
|
|
69
|
+
private readonly calls;
|
|
70
|
+
private readonly strikes;
|
|
71
|
+
private readonly secret;
|
|
72
|
+
constructor(chainId: string, init?: ChainInit);
|
|
73
|
+
private seal;
|
|
74
|
+
verifyIntegrity(node: Node): boolean;
|
|
75
|
+
newNodeId(): string;
|
|
76
|
+
addRoot(agentId: string, authority: Authority, task: string): Node;
|
|
77
|
+
isExpired(node: Node): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* The structural preconditions for `addChild`, WITHOUT mutating anything:
|
|
80
|
+
* the `AuthorityError` that `addChild` would throw, or `null` if the
|
|
81
|
+
* delegation is currently permitted.
|
|
82
|
+
*/
|
|
83
|
+
delegationError(parentId: string, agentId: string): AuthorityError | null;
|
|
84
|
+
addChild(parentId: string, agentId: string, requested: Authority, task: string): Node;
|
|
85
|
+
/** Revoke `nodeId` and its whole subtree. Returns the ids revoked by this call. */
|
|
86
|
+
revoke(nodeId: string): string[];
|
|
87
|
+
isRevoked(nodeId: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* PRINCIPAL-scoped revocation: cascade-revoke every node held by `agentId`
|
|
90
|
+
* and ban the agent, so no node in this chain can delegate to it again.
|
|
91
|
+
* Closes the re-delegation bypass where a framework hands off again to a
|
|
92
|
+
* revoked agent and would otherwise mint it a fresh child from a still-valid
|
|
93
|
+
* parent.
|
|
94
|
+
*/
|
|
95
|
+
revokeAgent(agentId: string): string[];
|
|
96
|
+
isBanned(agentId: string): boolean;
|
|
97
|
+
/** Add to a chain-wide running total, throwing if it passes the ceiling. */
|
|
98
|
+
consume(key: string, amount: number, chainCeiling: number | null): void;
|
|
99
|
+
private static meterKey;
|
|
100
|
+
callsSoFar(nodeId: string, pattern: string): number;
|
|
101
|
+
countCall(nodeId: string, pattern: string): number;
|
|
102
|
+
/** Count a denial for the strike policy; returns the running total. */
|
|
103
|
+
recordStrike(key: string): number;
|
|
104
|
+
graph(): Record<string, Json>;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/chain.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attenu-guard — command-line tool.
|
|
3
|
+
*
|
|
4
|
+
* attenu-guard verify <log.jsonl | bundle.json> [--hs256-key HEX | --pubkey HEX] [--kid KID]
|
|
5
|
+
*
|
|
6
|
+
* A `.jsonl` audit log is checked for hash-chain integrity. A bundle (the
|
|
7
|
+
* output of `exportBundle`, or of the Python library's `export_bundle`) is
|
|
8
|
+
* checked for integrity, monotonicity (child ⊆ parent) and containment from the
|
|
9
|
+
* bundle alone; the signed anchor is verified when a key is given and reported
|
|
10
|
+
* as "not checked" otherwise.
|
|
11
|
+
*
|
|
12
|
+
* Exit codes: 0 = ok, 2 = a check failed, 1 = usage. The output lines match the
|
|
13
|
+
* Python CLI's, so either implementation can stand in for the other in a script.
|
|
14
|
+
*/
|
|
15
|
+
export declare function main(argv?: string[]): number;
|
|
16
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6EH,wBAAgB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,MAAM,CASnE"}
|