@intutic/gate 2.9.0 → 3.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.
Files changed (95) hide show
  1. package/dist/actions.d.ts +39 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +139 -0
  4. package/dist/actions.js.map +1 -1
  5. package/dist/client.d.ts +10 -0
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +19 -0
  8. package/dist/client.js.map +1 -1
  9. package/dist/decide.d.ts +269 -0
  10. package/dist/decide.d.ts.map +1 -0
  11. package/dist/decide.js +757 -0
  12. package/dist/decide.js.map +1 -0
  13. package/dist/decideApi.d.ts +24 -0
  14. package/dist/decideApi.d.ts.map +1 -0
  15. package/dist/decideApi.js +32 -0
  16. package/dist/decideApi.js.map +1 -0
  17. package/dist/decideEngine.d.ts +195 -0
  18. package/dist/decideEngine.d.ts.map +1 -0
  19. package/dist/decideEngine.js +707 -0
  20. package/dist/decideEngine.js.map +1 -0
  21. package/dist/decideEvaluate.d.ts +250 -0
  22. package/dist/decideEvaluate.d.ts.map +1 -0
  23. package/dist/decideEvaluate.js +504 -0
  24. package/dist/decideEvaluate.js.map +1 -0
  25. package/dist/decideHostGuard.d.ts +56 -0
  26. package/dist/decideHostGuard.d.ts.map +1 -0
  27. package/dist/decideHostGuard.js +194 -0
  28. package/dist/decideHostGuard.js.map +1 -0
  29. package/dist/decideLog.d.ts +287 -0
  30. package/dist/decideLog.d.ts.map +1 -0
  31. package/dist/decideLog.js +521 -0
  32. package/dist/decideLog.js.map +1 -0
  33. package/dist/decideLogRedaction.d.ts +17 -0
  34. package/dist/decideLogRedaction.d.ts.map +1 -0
  35. package/dist/decideLogRedaction.js +33 -0
  36. package/dist/decideLogRedaction.js.map +1 -0
  37. package/dist/decideRecord.d.ts +128 -0
  38. package/dist/decideRecord.d.ts.map +1 -0
  39. package/dist/decideRecord.js +254 -0
  40. package/dist/decideRecord.js.map +1 -0
  41. package/dist/decideSdk.d.ts +86 -0
  42. package/dist/decideSdk.d.ts.map +1 -0
  43. package/dist/decideSdk.js +146 -0
  44. package/dist/decideSdk.js.map +1 -0
  45. package/dist/dsh.d.ts.map +1 -1
  46. package/dist/dsh.js +6 -1
  47. package/dist/dsh.js.map +1 -1
  48. package/dist/errors.d.ts +26 -2
  49. package/dist/errors.d.ts.map +1 -1
  50. package/dist/errors.js +38 -1
  51. package/dist/errors.js.map +1 -1
  52. package/dist/gate.d.ts +85 -1
  53. package/dist/gate.d.ts.map +1 -1
  54. package/dist/gate.js +314 -18
  55. package/dist/gate.js.map +1 -1
  56. package/dist/gateRuleRecord.d.ts +244 -0
  57. package/dist/gateRuleRecord.d.ts.map +1 -0
  58. package/dist/gateRuleRecord.js +459 -0
  59. package/dist/gateRuleRecord.js.map +1 -0
  60. package/dist/harness.d.ts.map +1 -1
  61. package/dist/harness.js +22 -10
  62. package/dist/harness.js.map +1 -1
  63. package/dist/index.d.ts +14 -5
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +5 -3
  66. package/dist/index.js.map +1 -1
  67. package/dist/lanes.d.ts +94 -0
  68. package/dist/lanes.d.ts.map +1 -0
  69. package/dist/lanes.js +150 -0
  70. package/dist/lanes.js.map +1 -0
  71. package/dist/limits.d.ts +6 -0
  72. package/dist/limits.d.ts.map +1 -1
  73. package/dist/limits.js +6 -0
  74. package/dist/limits.js.map +1 -1
  75. package/dist/refusalDetail.d.ts +58 -0
  76. package/dist/refusalDetail.d.ts.map +1 -0
  77. package/dist/refusalDetail.js +121 -0
  78. package/dist/refusalDetail.js.map +1 -0
  79. package/dist/scopeMatch.d.ts +156 -0
  80. package/dist/scopeMatch.d.ts.map +1 -0
  81. package/dist/scopeMatch.js +438 -0
  82. package/dist/scopeMatch.js.map +1 -0
  83. package/dist/snapshot.d.ts +51 -3
  84. package/dist/snapshot.d.ts.map +1 -1
  85. package/dist/snapshot.js +86 -13
  86. package/dist/snapshot.js.map +1 -1
  87. package/dist/testOutcome.d.ts +164 -0
  88. package/dist/testOutcome.d.ts.map +1 -0
  89. package/dist/testOutcome.js +439 -0
  90. package/dist/testOutcome.js.map +1 -0
  91. package/dist/wrapTools.d.ts +7 -1
  92. package/dist/wrapTools.d.ts.map +1 -1
  93. package/dist/wrapTools.js +30 -2
  94. package/dist/wrapTools.js.map +1 -1
  95. package/package.json +2 -2
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Evaluating one tool call's decide rules against the engine, inside the
3
+ * engine protections:
4
+ *
5
+ * 1. Decisions only add friction: nothing is asked unless the deterministic
6
+ * tiers allowed the call, and a decide outcome can refuse or escalate,
7
+ * never lower another rule's verdict. Shadow rules never change the call.
8
+ * 2. The state is built from the call's own fields and the rule's text only
9
+ * (`buildDecideToolCallState`); a context field goes in quoted and marked
10
+ * untrusted.
11
+ * 3. Choice questions are asked in every order and averaged; orders that
12
+ * disagree make the answer unknown (`decide.ts`).
13
+ * 4. A rule enforces only under a pin for the model digest the engine
14
+ * reports on this call; any other digest runs it as shadow.
15
+ * 5. Pins belong to a rule hash: pins earned by another wording are not this
16
+ * rule's.
17
+ * 6. A known-answer canary, cached per engine URL and model digest for
18
+ * {@link DECIDE_CANARY_TTL_MS}, runs beside the rule's questions when the
19
+ * cache is missing, failed or stale. A failed canary discards every
20
+ * answer: the engine is unavailable, which refuses an enforcing rule.
21
+ *
22
+ * And the latency budget: with the engine's per-call p95 (`q95Ms`, which
23
+ * `intutic doctor` measures and stores in engine.json), a rule whose
24
+ * estimate does not fit the time left is not asked. An enforcing one
25
+ * escalates, as an unknown answer does; a shadow one is logged and allowed.
26
+ *
27
+ * Self-contained but for the decide modules beside it, so `@intutic/gate`
28
+ * carries a byte-identical copy. The canary cache's file is reached through
29
+ * the `fs` its caller passes ({@link createDecideCanaryFileStore}). The Python
30
+ * (`intutic_clawde/gate/decide_evaluate.py`) and Rust
31
+ * (`proxy/src/decide/evaluate.rs`) ports run the same `rollout` and
32
+ * `evaluate` cases of `fixtures/decide-engine-vectors.json`.
33
+ *
34
+ * @module
35
+ */
36
+ import { DECIDE_DEFAULT_BAND, DECIDE_JS_SOURCE, decideAtoms, decideCallOutcome, decideOptions, decideRuleHash, decideRuleOutcome, selectDecideRules, validateDecideRule, } from './decide.js';
37
+ import { DECIDE_RECORD_JS_SOURCE } from './decideRecord.js';
38
+ import { buildDecideToolCallState, DECIDE_ENGINE_JS_SOURCE, DecideEngineError, decideEngineErrorOutcome, decideModuleSource, runDecideCanary, } from './decideEngine.js';
39
+ import { DECIDE_HOST_GUARD_JS_SOURCE } from './decideHostGuard.js';
40
+ import { DECIDE_LOG_JS_SOURCE } from './decideLog.js';
41
+ /**
42
+ * Whether a rule enforces on this call. Only when its author wrote `enforce`,
43
+ * the snapshot stamped it `enforce`, and one of its pins is for `modelDigest`;
44
+ * otherwise it runs as shadow and `why` says which condition failed. A null
45
+ * digest (the engine could not say) leaves a stamped rule enforcing, so the
46
+ * engine's unavailability refuses rather than opening the call.
47
+ */
48
+ export function decideEffectiveRollout(entry, modelDigest) {
49
+ if (entry.ir.rollout !== 'enforce')
50
+ return { effective: 'shadow', why: 'rollout', pin: null };
51
+ if (entry.rollout !== 'enforce')
52
+ return { effective: 'shadow', why: entry.stampedBy === 'rule' ? 'rollout' : entry.stampedBy, pin: null };
53
+ if (entry.pins.length === 0)
54
+ return { effective: 'shadow', why: 'no-pins', pin: null };
55
+ if (modelDigest === null)
56
+ return { effective: 'enforce', why: null, pin: null };
57
+ const pin = entry.pins.find((p) => p.modelDigest === modelDigest);
58
+ return pin ? { effective: 'enforce', why: null, pin } : { effective: 'shadow', why: 'not_evaluated', pin: null };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // The canary cache (protection 6)
62
+ // ---------------------------------------------------------------------------
63
+ /** A canary result older than this is run again. */
64
+ export const DECIDE_CANARY_TTL_MS = 600_000;
65
+ /** The cache's file name in `~/.intutic/decide/`. */
66
+ export const DECIDE_CANARY_FILE = 'canary.json';
67
+ /** The most engine and digest pairs the file keeps, newest last. */
68
+ const CANARY_ENTRIES_MAX = 16;
69
+ /** A passed result younger than {@link DECIDE_CANARY_TTL_MS}. A failed one is never fresh: it runs again. */
70
+ export function decideCanaryFresh(entry, nowMs) {
71
+ return entry !== null && entry.ok && entry.atMs <= nowMs && nowMs - entry.atMs < DECIDE_CANARY_TTL_MS;
72
+ }
73
+ function canaryEntry(v) {
74
+ if (typeof v !== 'object' || v === null)
75
+ return null;
76
+ const e = v;
77
+ const num = (x) => typeof x === 'number' && Number.isFinite(x);
78
+ if (typeof e.url !== 'string' || typeof e.modelDigest !== 'string' || typeof e.ok !== 'boolean')
79
+ return null;
80
+ if (!num(e.atMs) || !num(e.pViolation) || !num(e.pClean) || typeof e.choiceTop !== 'string')
81
+ return null;
82
+ return { url: e.url, modelDigest: e.modelDigest, ok: e.ok, atMs: e.atMs, pViolation: e.pViolation, pClean: e.pClean, choiceTop: e.choiceTop };
83
+ }
84
+ /**
85
+ * The canary cache as one JSON file, `{"v":1,"entries":[…]}`, mode 0600 in a
86
+ * 0700 directory, replaced whole by a rename so a reader never sees half of
87
+ * it. A file that does not read is an empty cache, and the canary runs.
88
+ */
89
+ export function createDecideCanaryFileStore(file, fs) {
90
+ const readAll = () => {
91
+ try {
92
+ const doc = JSON.parse(fs.readFileSync(file, 'utf8'));
93
+ if (doc.v !== 1 || !Array.isArray(doc.entries))
94
+ return [];
95
+ return doc.entries.map(canaryEntry).filter((e) => e !== null);
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ };
101
+ return {
102
+ read(url, modelDigest) {
103
+ return readAll().find((e) => e.url === url && e.modelDigest === modelDigest) ?? null;
104
+ },
105
+ write(entry) {
106
+ const entries = [...readAll().filter((e) => e.url !== entry.url || e.modelDigest !== entry.modelDigest), entry].slice(-CANARY_ENTRIES_MAX);
107
+ const dir = file.replace(/[\\/][^\\/]*$/, '');
108
+ if (dir && dir !== file)
109
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
110
+ const tmp = `${file}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
111
+ fs.writeFileSync(tmp, JSON.stringify({ v: 1, entries }) + '\n', { mode: 0o600 });
112
+ fs.renameSync(tmp, file);
113
+ },
114
+ };
115
+ }
116
+ const ALLOW = { outcome: 'allow', code: null, ruleRef: null, via: null, reason: null };
117
+ function errorCode(err) {
118
+ return err instanceof DecideEngineError ? err.code : 'bad_response';
119
+ }
120
+ /**
121
+ * A call's verdict in the order of evidence: deterministic
122
+ * refusals, then consequence (holds), then trajectory, then model judgement
123
+ * last. `before` is the verdict of everything before decide; `decide` is
124
+ * what the decide rules answered, or null when none was asked. A hold or a
125
+ * refusal before decide stands whatever decide says; inside an open lane a
126
+ * decide refusal or escalation still applies.
127
+ */
128
+ export function decideVerdictInOrder(before, decide) {
129
+ if (before !== 'allow')
130
+ return before;
131
+ return decide === null ? 'allow' : decide.outcome;
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // The latency budget
135
+ // ---------------------------------------------------------------------------
136
+ /** The engine calls one evaluation of `rule` makes: a yes/no question one, a choice two, or three past three options (none_of_these counted). */
137
+ export function decideRuleCalls(rule) {
138
+ let n = 0;
139
+ for (const q of Object.values(rule.questions))
140
+ n += q.type === 'yes_no' ? 1 : decideOptions(q).length > 3 ? 3 : 2;
141
+ return n;
142
+ }
143
+ /** The estimated time to evaluate `rule`: the per-call p95 times its calls over `parallel`. */
144
+ export function decideRuleEstimateMs(rule, q95Ms, parallel) {
145
+ return Math.round(q95Ms * Math.ceil(decideRuleCalls(rule) / Math.max(1, parallel)));
146
+ }
147
+ /** The per-call p95 `intutic doctor` stored in engine.json (`q95Ms`, parsed), or null when there is none. */
148
+ export function decideStoredQ95Ms(file) {
149
+ const v = file !== null && typeof file === 'object' && !Array.isArray(file) ? file.q95Ms : undefined;
150
+ return typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : null;
151
+ }
152
+ /**
153
+ * Evaluates the decide rules a tool call matches. Never throws: an engine
154
+ * error is an unavailable rule (or, for `too_large`, an unknown one), which
155
+ * refuses with GOVERNANCE_UNAVAILABLE when the rule enforces.
156
+ *
157
+ * With the engine's p95 (`deps.q95Ms`), a rule whose estimate does not fit
158
+ * the time left before `deadlineMs` is not asked: its report carries
159
+ * `budget_skip`, and it is unknown. An enforcing one escalates (or refuses,
160
+ * with `escalate: refuse`); a shadow one is allowed. The rest are asked.
161
+ */
162
+ export async function evaluateDecideCall(input, deps) {
163
+ const q95 = deps.q95Ms ?? null;
164
+ if (q95 === null || input.deterministic !== 'allow')
165
+ return evaluateDecideRules(input, deps);
166
+ const leftMs = input.deadlineMs - (deps.now ?? Date.now)();
167
+ const inBudget = [];
168
+ const overBudget = [];
169
+ for (const r of input.rules) {
170
+ const v = validateDecideRule(r.ir);
171
+ const named = r.ir.on === 'tool_call' && (r.ir.tools ?? []).includes(input.tool);
172
+ if (named && v.ok && decideRuleEstimateMs(v.rule, q95, deps.parallel ?? 1) > leftMs)
173
+ overBudget.push(r);
174
+ else
175
+ inBudget.push(r);
176
+ }
177
+ const ev = await evaluateDecideRules({ ...input, rules: inBudget }, deps);
178
+ if (overBudget.length === 0)
179
+ return ev;
180
+ const digest = ev.engine?.modelDigest ?? null;
181
+ const skipped = overBudget.map((r) => {
182
+ const v = validateDecideRule(r.ir);
183
+ const pins = v.ok && decideRuleHash(v.rule, deps.sha256Hex) === r.ruleHash ? r.pins : [];
184
+ const eff = decideEffectiveRollout({ ...r, pins }, digest);
185
+ const escalate = v.ok ? v.rule.escalate ?? 'ask' : 'ask';
186
+ const report = { ref: r.ref, ruleHash: r.ruleHash, effective: eff.effective, why: eff.why, error: 'budget_skip', modelDigest: digest, answers: null };
187
+ if (eff.effective === 'shadow')
188
+ return { ...report, outcome: 'allow', code: null, via: null };
189
+ if (escalate === 'refuse')
190
+ return { ...report, outcome: 'refuse', code: 'DECIDE_ESCALATED', via: null };
191
+ return { ...report, outcome: 'escalate', code: 'DECIDE_ESCALATED', via: escalate };
192
+ });
193
+ const rules = [...ev.rules, ...skipped];
194
+ // A refusal for too many rules on the tool comes before any rule is asked, and stands.
195
+ const call = ev.rules.length === 0 && ev.call.outcome !== 'allow' ? ev.call : decideCallOutcome({ unavailable: null }, rules);
196
+ return { ...ev, call, rules };
197
+ }
198
+ /** {@link evaluateDecideCall} on every rule it is given, with no budget estimate. */
199
+ async function evaluateDecideRules(input, deps) {
200
+ const now = deps.now ?? Date.now;
201
+ if (input.deterministic !== 'allow') {
202
+ const reason = input.deterministic === 'hold' ? 'the call is held for a person; a decide answer never releases a hold' : 'a deterministic rule refused the call';
203
+ return {
204
+ call: { outcome: 'refuse', code: null, ruleRef: null, via: null, reason },
205
+ rules: [],
206
+ skipped: [],
207
+ engine: null,
208
+ canary: null,
209
+ };
210
+ }
211
+ const matched = input.rules.filter((r) => r.ir.on === 'tool_call' && (r.ir.tools ?? []).includes(input.tool));
212
+ if (matched.length === 0)
213
+ return { call: ALLOW, rules: [], skipped: [], engine: null, canary: null };
214
+ const engine = deps.engine instanceof DecideEngineError ? null : deps.engine;
215
+ let engineError = deps.engine instanceof DecideEngineError ? deps.engine.code : null;
216
+ let identity = null;
217
+ if (engine) {
218
+ try {
219
+ identity = await engine.describe(input.deadlineMs);
220
+ }
221
+ catch (err) {
222
+ engineError = errorCode(err);
223
+ }
224
+ }
225
+ const entries = matched.map((r) => {
226
+ const v = validateDecideRule(r.ir);
227
+ // Pins are earned by one rule hash: a rule whose hash is not the one its
228
+ // pins were stored under has none.
229
+ const pins = v.ok && decideRuleHash(v.rule, deps.sha256Hex) === r.ruleHash ? r.pins : [];
230
+ const entry = { ...r, pins };
231
+ return { entry, v, pre: decideEffectiveRollout(entry, identity?.modelDigest ?? null) };
232
+ });
233
+ const selection = selectDecideRules(entries.map((e) => ({ ref: e.entry.ref, on: e.entry.ir.on, tools: e.entry.ir.tools, effective: e.pre.effective, e })), input.tool);
234
+ const skipped = selection.skipped.map((c) => c.ref);
235
+ if (selection.unavailable) {
236
+ return { call: decideCallOutcome(selection, []), rules: [], skipped, engine: identity, canary: null };
237
+ }
238
+ const askRule = async (e) => {
239
+ if (!engine || engineError)
240
+ return { answers: null, error: engineError ?? 'not_configured', modelDigest: null };
241
+ if (!e.v.ok)
242
+ return { answers: null, error: 'bad_response', modelDigest: null };
243
+ const rule = e.v.rule;
244
+ const questions = Object.keys(rule.questions).map((name) => {
245
+ const q = rule.questions[name];
246
+ return q.type === 'choice' ? { name, type: 'choice', ask: q.ask, options: decideOptions(q) } : { name, type: 'yes_no', ask: q.ask };
247
+ });
248
+ try {
249
+ const state = buildDecideToolCallState({
250
+ ruleId: rule.id,
251
+ sopTitle: e.entry.sopTitle,
252
+ ruleText: e.entry.ruleText,
253
+ tool: input.tool,
254
+ cwd: input.cwd,
255
+ toolInput: input.toolInput,
256
+ ...((rule.context ?? []).includes('last_user_turn') ? { lastUserTurn: input.lastUserTurn ?? null } : {}),
257
+ });
258
+ const res = await engine.ask(state, questions, input.deadlineMs);
259
+ return { answers: res.answers, error: null, modelDigest: res.modelDigest };
260
+ }
261
+ catch (err) {
262
+ return { answers: null, error: errorCode(err), modelDigest: null };
263
+ }
264
+ };
265
+ let canary = null;
266
+ // `canary_failed` only when the canary was answered and the answer was
267
+ // wrong; an engine that did not answer it at all carries its own error
268
+ // (`upstream`, `timeout`, …).
269
+ let canaryRun = Promise.resolve(null);
270
+ if (engine && !engineError && identity) {
271
+ const key = identity.modelDigest;
272
+ if (decideCanaryFresh(deps.canary.read(deps.engineUrl, key), now())) {
273
+ canary = 'cached';
274
+ }
275
+ else {
276
+ canaryRun = runDecideCanary(engine.ask, input.deadlineMs).then((r) => {
277
+ try {
278
+ deps.canary.write({ url: deps.engineUrl, modelDigest: key, ok: r.ok, atMs: now(), pViolation: r.pViolation, pClean: r.pClean, choiceTop: r.choiceTop });
279
+ }
280
+ catch {
281
+ // An unwritable cache only means the canary runs again next call.
282
+ }
283
+ return r.ok ? null : 'canary_failed';
284
+ }, (err) => errorCode(err));
285
+ }
286
+ }
287
+ const [canaryError, asked] = await Promise.all([canaryRun, Promise.all(selection.evaluate.map((c) => askRule(c.e)))]);
288
+ if (canary === null && engine && !engineError && identity)
289
+ canary = canaryError === null ? 'ok' : canaryError === 'canary_failed' ? 'failed' : null;
290
+ const reports = selection.evaluate.map((c, i) => {
291
+ const e = c.e;
292
+ const a = asked[i];
293
+ const digest = a.modelDigest ?? identity?.modelDigest ?? null;
294
+ const eff = decideEffectiveRollout(e.entry, digest);
295
+ const base = { ref: e.entry.ref, ruleHash: e.entry.ruleHash, effective: eff.effective, why: eff.why, modelDigest: digest };
296
+ if (canaryError !== null) {
297
+ // A canary that got no answer: the rule's own engine error when it has
298
+ // one (it asked the same engine), else the canary's.
299
+ const error = canaryError !== 'canary_failed' && a.error && decideEngineErrorOutcome(a.error) === 'unavailable' ? a.error : canaryError;
300
+ return { ...base, outcome: 'unavailable', code: null, via: null, error, answers: null };
301
+ }
302
+ if (a.error && decideEngineErrorOutcome(a.error) === 'unavailable') {
303
+ return { ...base, outcome: 'unavailable', code: null, via: null, error: a.error, answers: null };
304
+ }
305
+ if (!e.v.ok)
306
+ return { ...base, outcome: 'unavailable', code: null, via: null, error: 'bad_response', answers: null };
307
+ const inputs = {};
308
+ for (const [name, ans] of Object.entries(a.answers ?? {}))
309
+ inputs[name] = { p: ans.p, perOrder: ans.perOrder };
310
+ // A pin's fitted combiner replaces `when`. Its per-question temperatures
311
+ // are not applied here.
312
+ const pin = eff.pin;
313
+ const combiner = pin?.combiner
314
+ ? { bias: pin.combiner.bias, weights: pin.combiner.weights, band: pin.band ?? e.v.rule.band ?? DECIDE_DEFAULT_BAND }
315
+ : null;
316
+ const o = decideRuleOutcome(e.v.rule, e.v.expr, inputs, combiner);
317
+ return { ...base, outcome: o.outcome, code: o.code, via: o.via, error: a.error, answers: a.answers };
318
+ });
319
+ const results = reports.map((r) => ({ ref: r.ref, effective: r.effective, outcome: r.outcome, code: r.code, via: r.via }));
320
+ return { call: decideCallOutcome(selection, results), rules: reports, skipped, engine: identity, canary };
321
+ }
322
+ /**
323
+ * The questions a rule could not answer: a yes/no question between its bands,
324
+ * a choice none of whose options cleared `yes_at` while one stayed unknown.
325
+ * Every question when none can be named (no answers came back).
326
+ */
327
+ function unknownQuestions(entry, answers) {
328
+ const v = validateDecideRule(entry.ir);
329
+ if (!v.ok)
330
+ return [];
331
+ const names = Object.keys(v.rule.questions);
332
+ if (answers) {
333
+ const inputs = {};
334
+ for (const [name, ans] of Object.entries(answers))
335
+ inputs[name] = { p: ans.p, perOrder: ans.perOrder };
336
+ const atoms = decideAtoms(v.rule, inputs);
337
+ const unknown = names.filter((name) => {
338
+ if (atoms.yes[name] !== undefined)
339
+ return atoms.yes[name] === 'U';
340
+ const values = Object.values(atoms.eq[name] ?? {});
341
+ return !values.includes('T') && values.includes('U');
342
+ });
343
+ if (unknown.length > 0)
344
+ return unknown.map((name) => v.rule.questions[name].ask);
345
+ }
346
+ return names.map((name) => v.rule.questions[name].ask);
347
+ }
348
+ /** What one evaluated rule says, for a refusal, a question or a shadow record. */
349
+ function decideRuleReason(report, entry) {
350
+ const title = entry.ir.title ?? entry.sopTitle;
351
+ if (report.error === 'budget_skip' && report.outcome !== 'allow') {
352
+ return `Needs a person: ${title} — the decide engine cannot answer rule ${entry.ir.id} within this call's time budget`;
353
+ }
354
+ if (report.outcome === 'unavailable') {
355
+ return `GOVERNANCE_UNAVAILABLE — the decide engine could not evaluate rule ${entry.ir.id} (${title}): ${report.error ?? 'unavailable'}`;
356
+ }
357
+ if (report.code === 'DECIDE_REFUSED')
358
+ return `Decide rule ${entry.ir.id} (${title}) refused this call`;
359
+ return `Needs a person: ${title} — ${unknownQuestions(entry, report.answers).join(' ')}`;
360
+ }
361
+ /**
362
+ * The decision a gate acts on for a call's evaluation of `rules` (the records
363
+ * it passed in), with the reason it refuses or asks with.
364
+ */
365
+ export function decideDecision(ev, rules) {
366
+ const call = ev.call;
367
+ if (call.outcome === 'allow')
368
+ return { outcome: 'allow', code: null, ruleId: null, via: null, reason: '' };
369
+ const ruleId = call.ruleRef === null ? null : `decide.${call.ruleRef}`;
370
+ const entry = rules.find((r) => r.ref === call.ruleRef);
371
+ const report = ev.rules.find((r) => r.ref === call.ruleRef);
372
+ const reason = entry && report
373
+ ? decideRuleReason(report, entry)
374
+ : `GOVERNANCE_UNAVAILABLE — ${call.reason ?? 'the decide rules for this call could not be evaluated'}`;
375
+ return { outcome: call.outcome, code: call.code, ruleId, via: call.outcome === 'escalate' ? call.via ?? 'ask' : null, reason };
376
+ }
377
+ /**
378
+ * The evaluated shadow rules that would have refused, escalated or found the
379
+ * engine unavailable: what a gate records, while the call goes on.
380
+ */
381
+ export function decideShadowFindings(ev, rules) {
382
+ const out = [];
383
+ for (const report of ev.rules) {
384
+ if (report.effective !== 'shadow' || report.outcome === 'allow')
385
+ continue;
386
+ const entry = rules.find((r) => r.ref === report.ref);
387
+ if (entry)
388
+ out.push({ ruleId: `decide.${report.ref}`, reason: decideRuleReason(report, entry) });
389
+ }
390
+ return out;
391
+ }
392
+ /**
393
+ * The decision when the evaluation itself could not run or finish (the CLI
394
+ * failed, the budget ran out): refuse with GOVERNANCE_UNAVAILABLE, under the
395
+ * first matched rule its snapshot record stamped `enforce`, unless every rule
396
+ * on the tool is stamped `shadow`, which allows.
397
+ */
398
+ export function decideUnavailableDecision(rules, tool, why) {
399
+ const matched = rules.filter((r) => r.ir.on === 'tool_call' && (r.ir.tools ?? []).includes(tool));
400
+ const enforcing = matched.find((r) => r.rollout === 'enforce');
401
+ if (!enforcing)
402
+ return { outcome: 'allow', code: null, ruleId: null, via: null, reason: '' };
403
+ return { outcome: 'refuse', code: 'GOVERNANCE_UNAVAILABLE', ruleId: `decide.${enforcing.ref}`, via: null, reason: `GOVERNANCE_UNAVAILABLE — ${why}` };
404
+ }
405
+ // ---------------------------------------------------------------------------
406
+ // As source
407
+ // ---------------------------------------------------------------------------
408
+ /**
409
+ * This module as JavaScript source, for the hook gates to embed. The
410
+ * embedding scope supplies what it imports from `decide.ts`
411
+ * (`DECIDE_DEFAULT_BAND`, `decideAtoms`, `decideCallOutcome`,
412
+ * `decideOptions`, `decideRuleHash`, `decideRuleOutcome`, `selectDecideRules`,
413
+ * `validateDecideRule`) and `decideEngine.ts` (`buildDecideToolCallState`,
414
+ * `DecideEngineError`, `decideEngineErrorOutcome`, `runDecideCanary`). A
415
+ * test holds the list to the functions this file declares.
416
+ */
417
+ export const DECIDE_EVALUATE_JS_SOURCE = decideModuleSource([
418
+ `const DECIDE_CANARY_TTL_MS = ${DECIDE_CANARY_TTL_MS};`,
419
+ `const DECIDE_CANARY_FILE = ${JSON.stringify(DECIDE_CANARY_FILE)};`,
420
+ `const CANARY_ENTRIES_MAX = ${CANARY_ENTRIES_MAX};`,
421
+ `const ALLOW = ${JSON.stringify(ALLOW)};`,
422
+ decideEffectiveRollout,
423
+ decideCanaryFresh,
424
+ canaryEntry,
425
+ createDecideCanaryFileStore,
426
+ errorCode,
427
+ decideRuleCalls,
428
+ decideRuleEstimateMs,
429
+ decideStoredQ95Ms,
430
+ decideVerdictInOrder,
431
+ evaluateDecideCall,
432
+ evaluateDecideRules,
433
+ unknownQuestions,
434
+ decideRuleReason,
435
+ decideDecision,
436
+ decideShadowFindings,
437
+ decideUnavailableDecision,
438
+ ]);
439
+ /**
440
+ * Every decide module a hook gate needs, as one JavaScript function
441
+ * expression: called with the gate's `sha256(text)` (hex), it returns the
442
+ * snapshot decoders (`format`, `record`), the engine (`resolveConfig`,
443
+ * `createEngine`, `EngineError`), the canary cache (`canaryStore(file, fs)`),
444
+ * the tier (`evaluate`, `decision`, `shadowFindings`, `unavailable`,
445
+ * `storedQ95`, the p95 an engine.json holds, and `verdictInOrder`, the order
446
+ * of evidence of the loops, graphs and gates release), and the decide log
447
+ * (`writeLog`, `logEngine`, `logDeps`).
448
+ * Each module has a scope of its own, since their private helpers share
449
+ * names, and receives what it imports as parameters.
450
+ */
451
+ export const DECIDE_GATE_JS_SOURCE = `(function (sha256) {
452
+ const decide = (function () {
453
+ ${DECIDE_JS_SOURCE}
454
+ ${DECIDE_RECORD_JS_SOURCE}
455
+ return { choiceOrders, DECIDE_DEFAULT_BAND, decideAtoms, decideCallOutcome, decideOptions, decideRuleHash, decideRuleOutcome,
456
+ selectDecideRules, validateDecideRule, decodeSnapshotFormatRecord, decodeDecideRecord, bandValue, choiceAtoms,
457
+ decideQuestionBand, parseWhen };
458
+ })();
459
+ const guard = (function () {
460
+ ${DECIDE_HOST_GUARD_JS_SOURCE}
461
+ return { checkSelfHostedDecisionHost };
462
+ })();
463
+ const engine = (function (choiceOrders, checkSelfHostedDecisionHost) {
464
+ ${DECIDE_ENGINE_JS_SOURCE}
465
+ return { DecideEngineError, resolveDecideEngineConfig, createDecideEngine, buildDecideToolCallState, decideEngineErrorOutcome, runDecideCanary,
466
+ decideCanonicalJson };
467
+ })(decide.choiceOrders, guard.checkSelfHostedDecisionHost);
468
+ const evaluate = (function (DECIDE_DEFAULT_BAND, decideAtoms, decideCallOutcome, decideOptions, decideRuleHash, decideRuleOutcome,
469
+ selectDecideRules, validateDecideRule, buildDecideToolCallState, DecideEngineError, decideEngineErrorOutcome, runDecideCanary) {
470
+ ${DECIDE_EVALUATE_JS_SOURCE}
471
+ return { createDecideCanaryFileStore, evaluateDecideCall, decideDecision, decideShadowFindings, decideUnavailableDecision, decideStoredQ95Ms,
472
+ decideVerdictInOrder };
473
+ })(decide.DECIDE_DEFAULT_BAND, decide.decideAtoms, decide.decideCallOutcome, decide.decideOptions, decide.decideRuleHash,
474
+ decide.decideRuleOutcome, decide.selectDecideRules, decide.validateDecideRule, engine.buildDecideToolCallState,
475
+ engine.DecideEngineError, engine.decideEngineErrorOutcome, engine.runDecideCanary);
476
+ const log = (function (bandValue, choiceAtoms, decideOptions, decideQuestionBand, parseWhen, validateDecideRule, buildDecideToolCallState,
477
+ decideCanonicalJson) {
478
+ ${DECIDE_LOG_JS_SOURCE}
479
+ return { writeDecideCallLog, decideLogEngine, decideLogDeps };
480
+ })(decide.bandValue, decide.choiceAtoms, decide.decideOptions, decide.decideQuestionBand, decide.parseWhen, decide.validateDecideRule,
481
+ engine.buildDecideToolCallState, engine.decideCanonicalJson);
482
+ const check = function (ir) {
483
+ const v = decide.validateDecideRule(ir);
484
+ return v.ok ? decide.decideRuleHash(v.rule, sha256) : null;
485
+ };
486
+ return {
487
+ format: decide.decodeSnapshotFormatRecord,
488
+ record: function (line) { return decide.decodeDecideRecord(line, check); },
489
+ EngineError: engine.DecideEngineError,
490
+ resolveConfig: engine.resolveDecideEngineConfig,
491
+ createEngine: engine.createDecideEngine,
492
+ canaryStore: evaluate.createDecideCanaryFileStore,
493
+ evaluate: evaluate.evaluateDecideCall,
494
+ decision: evaluate.decideDecision,
495
+ shadowFindings: evaluate.decideShadowFindings,
496
+ unavailable: evaluate.decideUnavailableDecision,
497
+ storedQ95: evaluate.decideStoredQ95Ms,
498
+ verdictInOrder: evaluate.decideVerdictInOrder,
499
+ writeLog: log.writeDecideCallLog,
500
+ logEngine: log.decideLogEngine,
501
+ logDeps: log.decideLogDeps,
502
+ };
503
+ })`;
504
+ //# sourceMappingURL=decideEvaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideEvaluate.js","sourceRoot":"","sources":["../src/decideEvaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The self-hosted guard on a decide engine's URL.
3
+ *
4
+ * A decide engine sees every tool call a rule asks about, so it must run on
5
+ * hardware the user controls. The guard judges the literal URL, with no DNS
6
+ * lookup: loopback and private addresses pass, a name passes only when it is
7
+ * `localhost`, ends in `.local`, or is listed in
8
+ * `INTUTIC_SELF_HOSTED_DECISION_HOSTS`, and the hosted decision APIs are
9
+ * refused even when listed.
10
+ *
11
+ * The parser is deliberately narrower than WHATWG's: a URL with anything but
12
+ * printable ASCII, a backslash, a percent sign, a query or a fragment is
13
+ * refused rather than normalised, so every HTTP client reaches the host the
14
+ * guard judged.
15
+ *
16
+ * Byte-identical copy in `packages/gate-js/src/`; the Python
17
+ * (`intutic_clawde/gate/decide_engine.py`) and Rust (`proxy/src/decide/guard.rs`)
18
+ * guards run the same `fixtures/decide-engine-vectors.json` host cases.
19
+ *
20
+ * @module
21
+ */
22
+ /** Hosted decision APIs, matched on the host or any subdomain of it. */
23
+ export declare const DECIDE_HOSTED_DENYLIST: readonly ["typesafe.ai", "fastino.ai", "api.openai.com", "openai.azure.com", "services.ai.azure.com", "gateway.ai.cloudflare.com", "ai-gateway.vercel.sh", "api.fireworks.ai", "api.perplexity.ai", "cloud.databricks.com", "azuredatabricks.net"];
24
+ export type DecideHostVerdict = {
25
+ ok: true;
26
+ host: string;
27
+ reason: 'loopback' | 'private' | 'listed';
28
+ } | {
29
+ ok: false;
30
+ host: string;
31
+ reason: 'scheme' | 'bad_url' | 'credentials' | 'denylist' | 'decision_path' | 'not_listed';
32
+ };
33
+ export declare class DecideHostRefusedError extends Error {
34
+ readonly verdict: Extract<DecideHostVerdict, {
35
+ ok: false;
36
+ }>;
37
+ readonly code: "host_refused";
38
+ constructor(verdict: Extract<DecideHostVerdict, {
39
+ ok: false;
40
+ }>);
41
+ }
42
+ /**
43
+ * Judges a decide engine's base URL. `listed` is the value of
44
+ * `INTUTIC_SELF_HOSTED_DECISION_HOSTS` (a comma list).
45
+ */
46
+ export declare function checkSelfHostedDecisionHost(url: string, listed?: string): DecideHostVerdict;
47
+ /** As {@link checkSelfHostedDecisionHost}, throwing {@link DecideHostRefusedError}; returns the host. */
48
+ export declare function assertSelfHostedDecisionHost(url: string, listed?: string): string;
49
+ /**
50
+ * {@link checkSelfHostedDecisionHost} as JavaScript source, with the
51
+ * constants and helpers it reads, for the hook gates to embed. A CommonJS
52
+ * build names an exported constant `exports.X` inside a function; the source
53
+ * defines each as a plain `X`, so that prefix is dropped.
54
+ */
55
+ export declare const DECIDE_HOST_GUARD_JS_SOURCE: string;
56
+ //# sourceMappingURL=decideHostGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideHostGuard.d.ts","sourceRoot":"","sources":["../src/decideHostGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,oPAYzB,CAAA;AAKV,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;CAAE,GACrE;IACE,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY,CAAA;CAC3F,CAAA;AAEL,qBAAa,sBAAuB,SAAQ,KAAK;IAEnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC;IADvE,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAClB,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC;CAIxE;AAiED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CA2C3F;AAED,yGAAyG;AACzG,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,QAM5B,CAAA"}