@intutic/gate 2.9.1 → 3.0.1

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,521 @@
1
+ /**
2
+ * The decide log, and the drift alarm it feeds.
3
+ *
4
+ * Every process that evaluates a call's decide rules appends one line to
5
+ * `~/.intutic/logs/decide-YYYY-MM-DD.jsonl` (the UTC date), mode 0600, with
6
+ * a single append write: what was asked, of which model, and what came back.
7
+ * Stored by default: the hash of each state sent, the rule hashes, the model
8
+ * digest, every answer's probability and band, the outcome and the mode, and
9
+ * the call's arguments only after redaction, cut to
10
+ * {@link DECIDE_ARGS_EXCERPT_MAX_BYTES}. A line is at most
11
+ * {@link DECIDE_LOG_LINE_MAX_BYTES}; the excerpt is shortened first. The log
12
+ * is its own file, never a trace file, so nothing that uploads and deletes
13
+ * traces touches it.
14
+ *
15
+ * Drift (engine protection 8): each rule keeps its last
16
+ * {@link DECIDE_STATS_KEEP} decisions in `~/.intutic/decide/stats/<ruleHash>.json`.
17
+ * Against the eval run the rule's pin came from, `decide.drift` fires when
18
+ * the escalation rate moves more than {@link DECIDE_DRIFT_ESCALATION_DELTA}
19
+ * from the run's, or a question's median probability leaves the run's
20
+ * [p10, p90], at most once per {@link DECIDE_DRIFT_INTERVAL_MS} per rule and
21
+ * only once {@link DECIDE_DRIFT_MIN_DECISIONS} decisions are kept.
22
+ *
23
+ * Every gate that evaluates decide rules writes it, with the same record and
24
+ * redaction and under the same home directory ({@link decideLogDeps}):
25
+ * `intutic decide check` for the shell and n8n gates, the JavaScript hook
26
+ * gates (which embed {@link DECIDE_LOG_JS_SOURCE}), and both gate SDKs. A
27
+ * write that fails never changes the decision.
28
+ *
29
+ * Self-contained but for the decide modules beside it, so `@intutic/gate`
30
+ * carries a byte-identical copy. Files are reached through the `fs` its
31
+ * caller passes. The Python port is `intutic_clawde/gate/decide_log.py`; both
32
+ * run `fixtures/decide-log-vectors.json`.
33
+ *
34
+ * @module
35
+ */
36
+ import { bandValue, choiceAtoms, decideOptions, decideQuestionBand, parseWhen, validateDecideRule } from './decide.js';
37
+ import { buildDecideToolCallState, decideCanonicalJson, decideModuleSource } from './decideEngine.js';
38
+ /** The longest line the log holds, in UTF-8 bytes. */
39
+ export const DECIDE_LOG_LINE_MAX_BYTES = 8192;
40
+ /** The longest arguments excerpt, in UTF-8 bytes, cut on a character boundary. */
41
+ export const DECIDE_ARGS_EXCERPT_MAX_BYTES = 2048;
42
+ /** Days a decide log file is kept before housekeeping deletes it. */
43
+ export const DECIDE_LOG_RETENTION_DAYS = 30;
44
+ /** Decisions kept per rule for the drift alarm. */
45
+ export const DECIDE_STATS_KEEP = 200;
46
+ /** Fewer kept decisions than this never raise drift: one escalation in three is noise, not drift. */
47
+ export const DECIDE_DRIFT_MIN_DECISIONS = 20;
48
+ /** An escalation rate this far (absolute) from the eval run's is drift. */
49
+ export const DECIDE_DRIFT_ESCALATION_DELTA = 0.15;
50
+ /** At most one `decide.drift` per rule in this window. */
51
+ export const DECIDE_DRIFT_INTERVAL_MS = 86_400_000;
52
+ /** What a redacted match is replaced with. */
53
+ export const DECIDE_REDACTED = '[REDACTED]';
54
+ // ---------------------------------------------------------------------------
55
+ // Files and text
56
+ // ---------------------------------------------------------------------------
57
+ /** `decide-YYYY-MM-DD.jsonl` for the UTC date of `atMs`; `decide-state-…` for raw states. */
58
+ export function decideLogFileName(atMs, kind = 'decide') {
59
+ return `${kind}-${new Date(atMs).toISOString().slice(0, 10)}.jsonl`;
60
+ }
61
+ /** The UTC date a decide log file name carries, as epoch milliseconds at midnight, or null when the name is not one. */
62
+ export function decideLogFileDate(name) {
63
+ const m = /^decide(?:-state)?-([0-9]{4}-[0-9]{2}-[0-9]{2})\.jsonl$/.exec(name);
64
+ if (!m)
65
+ return null;
66
+ const t = Date.parse(`${m[1]}T00:00:00.000Z`);
67
+ return Number.isNaN(t) ? null : t;
68
+ }
69
+ function utf8Length(s) {
70
+ return new TextEncoder().encode(s).length;
71
+ }
72
+ /** The longest prefix of whole characters within `max` UTF-8 bytes. */
73
+ export function decideUtf8Prefix(s, max) {
74
+ let bytes = 0;
75
+ let end = 0;
76
+ for (const ch of s) {
77
+ const cp = ch.codePointAt(0);
78
+ const n = cp < 0x80 ? 1 : cp < 0x800 ? 2 : cp < 0x10000 ? 3 : 4;
79
+ if (bytes + n > max)
80
+ break;
81
+ bytes += n;
82
+ end += ch.length;
83
+ }
84
+ return s.slice(0, end);
85
+ }
86
+ /**
87
+ * `text` with every match of each source replaced by {@link DECIDE_REDACTED},
88
+ * the sources applied in order. A source that does not compile is skipped.
89
+ */
90
+ export function decideRedact(text, sources) {
91
+ let out = text;
92
+ for (const source of sources) {
93
+ let re;
94
+ try {
95
+ re = new RegExp(source, 'g');
96
+ }
97
+ catch {
98
+ continue;
99
+ }
100
+ out = out.replace(re, DECIDE_REDACTED);
101
+ }
102
+ return out;
103
+ }
104
+ /** The call's arguments as canonical JSON, redacted, then cut to `maxBytes`. */
105
+ export function decideArgsExcerpt(toolInput, sources, maxBytes = DECIDE_ARGS_EXCERPT_MAX_BYTES) {
106
+ return decideUtf8Prefix(decideRedact(decideCanonicalJson(toolInput ?? {}), sources), maxBytes);
107
+ }
108
+ /** The `q == o` atoms a `when` names, as `"q == o"` strings, in order of appearance. */
109
+ function eqAtoms(e, out = []) {
110
+ if (e.op === 'eq') {
111
+ const key = `${e.q} == ${e.o}`;
112
+ if (!out.includes(key))
113
+ out.push(key);
114
+ }
115
+ else if (e.op === 'not')
116
+ eqAtoms(e.a, out);
117
+ else if (e.op === 'and' || e.op === 'or') {
118
+ eqAtoms(e.a, out);
119
+ eqAtoms(e.b, out);
120
+ }
121
+ return out;
122
+ }
123
+ function logAnswer(rule, expr, name, a) {
124
+ const q = rule.questions[name];
125
+ if (!q)
126
+ return null;
127
+ const band = decideQuestionBand(rule, name);
128
+ const pair = [band.no_below, band.yes_at];
129
+ if (q.type === 'yes_no') {
130
+ const p = typeof a.p === 'number' ? a.p : null;
131
+ return { type: 'yes_no', p, pRaw: p, value: p === null ? 'U' : bandValue(p, band), band: pair };
132
+ }
133
+ const atoms = choiceAtoms(decideOptions(q), a.perOrder ?? [], band);
134
+ const used = expr ? eqAtoms(expr).filter((k) => k.startsWith(`${name} == `)) : [];
135
+ return {
136
+ type: 'choice',
137
+ p: Object.fromEntries(Object.entries(atoms).map(([o, c]) => [o, c.p])),
138
+ spread: Object.fromEntries(Object.entries(atoms).map(([o, c]) => [o, c.spread])),
139
+ atoms: Object.fromEntries(used.map((k) => [k, atoms[k.slice(name.length + 4)]?.value ?? 'U'])),
140
+ band: pair,
141
+ };
142
+ }
143
+ function whenValue(r) {
144
+ if (r.outcome === 'unavailable')
145
+ return null;
146
+ if (r.outcome === 'allow')
147
+ return 'F';
148
+ return r.code === 'DECIDE_REFUSED' ? 'T' : 'U';
149
+ }
150
+ /**
151
+ * The `decide.decision` record of one evaluated call. `rules` are the
152
+ * entries the call was evaluated over; each report's state is rebuilt from
153
+ * its entry and the call (it is deterministic) and hashed with `sha256Hex`.
154
+ */
155
+ export function buildDecideDecisionRecord(evaluation, rules, ctx, sha256Hex) {
156
+ const byRef = new Map(rules.map((r) => [r.ref, r]));
157
+ const logged = evaluation.rules.map((rep) => {
158
+ const entry = byRef.get(rep.ref);
159
+ const v = entry ? validateDecideRule(entry.ir) : null;
160
+ const rule = v && v.ok ? v.rule : null;
161
+ const expr = rule ? parseWhen(rule.when).expr : null;
162
+ let stateHash = null;
163
+ if (entry && rule) {
164
+ try {
165
+ const state = buildDecideToolCallState({
166
+ ruleId: rule.id,
167
+ sopTitle: entry.sopTitle,
168
+ ruleText: entry.ruleText,
169
+ tool: ctx.tool,
170
+ cwd: ctx.cwd,
171
+ toolInput: ctx.toolInput,
172
+ ...((rule.context ?? []).includes('last_user_turn') ? { lastUserTurn: ctx.lastUserTurn ?? null } : {}),
173
+ });
174
+ stateHash = `sha256:${sha256Hex(state)}`;
175
+ }
176
+ catch {
177
+ stateHash = null;
178
+ }
179
+ }
180
+ let answers = null;
181
+ if (rule && rep.answers) {
182
+ answers = {};
183
+ for (const name of Object.keys(rep.answers).sort()) {
184
+ const a = logAnswer(rule, expr, name, rep.answers[name]);
185
+ if (a)
186
+ answers[name] = a;
187
+ }
188
+ }
189
+ return {
190
+ ref: rep.ref,
191
+ ruleHash: rep.ruleHash,
192
+ rollout: entry?.rollout ?? 'shadow',
193
+ effective: rep.effective,
194
+ why: rep.why,
195
+ stateHash,
196
+ modelDigest: rep.modelDigest,
197
+ answers,
198
+ when: whenValue(rep),
199
+ outcome: rep.outcome,
200
+ escalate: entry?.ir.escalate ?? 'ask',
201
+ error: rep.error,
202
+ };
203
+ });
204
+ return {
205
+ v: 1,
206
+ event: 'decide.decision',
207
+ at: new Date(ctx.atMs).toISOString(),
208
+ harness: ctx.harness,
209
+ workspaceId: ctx.workspaceId,
210
+ sessionId: ctx.sessionId,
211
+ tool: ctx.tool,
212
+ lane: ctx.lane ?? null,
213
+ revertRate: typeof ctx.revertRate === 'number' && Number.isFinite(ctx.revertRate) ? ctx.revertRate : null,
214
+ stateHash: logged[0]?.stateHash ?? null,
215
+ argsExcerpt: decideArgsExcerpt(ctx.toolInput, ctx.redact),
216
+ engine: ctx.engine,
217
+ budgetMs: ctx.budgetMs,
218
+ latencyMs: ctx.latencyMs,
219
+ outcome: evaluation.call.outcome,
220
+ code: evaluation.call.code,
221
+ rules: logged,
222
+ skipped: [...evaluation.skipped],
223
+ };
224
+ }
225
+ /** An event other than a decision, in the same envelope. */
226
+ export function buildDecideEventRecord(event, ctx, body) {
227
+ return { v: 1, event, at: new Date(ctx.atMs).toISOString(), harness: ctx.harness, workspaceId: ctx.workspaceId, sessionId: ctx.sessionId, ...body };
228
+ }
229
+ /**
230
+ * The record as one JSON line (with its newline) of at most `max` bytes.
231
+ * Over it, the arguments excerpt is shortened first, by halves down to
232
+ * nothing; then each choice answer keeps only its atoms; then the answers
233
+ * go. Whatever was cut, `truncated` says so.
234
+ */
235
+ export function decideLogLine(record, max = DECIDE_LOG_LINE_MAX_BYTES) {
236
+ const fits = (r) => {
237
+ const line = JSON.stringify(r) + '\n';
238
+ return utf8Length(line) <= max ? line : null;
239
+ };
240
+ const whole = fits(record);
241
+ if (whole)
242
+ return whole;
243
+ const r = { ...record, truncated: true };
244
+ if (typeof r.argsExcerpt === 'string') {
245
+ let excerpt = r.argsExcerpt;
246
+ while (excerpt.length > 0) {
247
+ excerpt = decideUtf8Prefix(excerpt, Math.floor(utf8Length(excerpt) / 2));
248
+ const line = fits({ ...r, argsExcerpt: excerpt });
249
+ if (line)
250
+ return line;
251
+ }
252
+ r.argsExcerpt = '';
253
+ }
254
+ if (Array.isArray(r.rules)) {
255
+ const slim = r.rules.map((rule) => ({
256
+ ...rule,
257
+ answers: rule.answers
258
+ ? Object.fromEntries(Object.entries(rule.answers).map(([n, a]) => [n, a.type === 'choice' ? { type: 'choice', atoms: a.atoms, band: a.band } : a]))
259
+ : null,
260
+ }));
261
+ const line = fits({ ...r, rules: slim });
262
+ if (line)
263
+ return line;
264
+ const bare = fits({ ...r, rules: slim.map((rule) => ({ ...rule, answers: null })) });
265
+ if (bare)
266
+ return bare;
267
+ }
268
+ // Nothing smaller is a record; the envelope alone always fits.
269
+ return JSON.stringify({ v: 1, event: record.event, at: record.at, truncated: true }) + '\n';
270
+ }
271
+ /** Appends one line to `dir/file` with a single write to a file opened for append, mode 0600 in a 0700 directory. */
272
+ export function appendDecideLogLine(fs, dir, file, line) {
273
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
274
+ const fd = fs.openSync(`${dir}/${file}`, 'a', 0o600);
275
+ try {
276
+ fs.writeSync(fd, line);
277
+ }
278
+ finally {
279
+ fs.closeSync(fd);
280
+ }
281
+ }
282
+ /** The probability a question's answer is tracked by, or null when it has none. */
283
+ export function decideTrackedP(rule, name, a) {
284
+ const q = rule.questions[name];
285
+ if (!q)
286
+ return null;
287
+ if (q.type === 'yes_no')
288
+ return typeof a.p === 'number' ? a.p : null;
289
+ const atoms = choiceAtoms(decideOptions(q), a.perOrder ?? [], decideQuestionBand(rule, name));
290
+ const ps = Object.values(atoms).map((c) => c.p);
291
+ return ps.length === 0 ? null : Math.max(...ps);
292
+ }
293
+ /** `stats` with `d` appended and only the last {@link DECIDE_STATS_KEEP} kept. */
294
+ export function recordDecideStats(stats, ruleHash, d) {
295
+ const prior = stats && stats.ruleHash === ruleHash ? stats : { v: 1, ruleHash, decisions: [], lastDriftAtMs: null };
296
+ return { ...prior, decisions: [...prior.decisions, d].slice(-DECIDE_STATS_KEEP) };
297
+ }
298
+ /** The median of a non-empty list. */
299
+ function median(xs) {
300
+ const s = [...xs].sort((a, b) => a - b);
301
+ const m = Math.floor(s.length / 2);
302
+ return s.length % 2 === 1 ? s[m] : (s[m - 1] + s[m]) / 2;
303
+ }
304
+ /**
305
+ * Whether the kept decisions have drifted from the eval run. Null below
306
+ * {@link DECIDE_DRIFT_MIN_DECISIONS}, inside {@link DECIDE_DRIFT_INTERVAL_MS}
307
+ * of the last drift, or when nothing moved. The escalation rate is checked
308
+ * first, then each question in name order.
309
+ */
310
+ export function checkDecideDrift(stats, run, nowMs) {
311
+ const n = stats.decisions.length;
312
+ if (n < DECIDE_DRIFT_MIN_DECISIONS)
313
+ return null;
314
+ if (stats.lastDriftAtMs !== null && nowMs - stats.lastDriftAtMs < DECIDE_DRIFT_INTERVAL_MS)
315
+ return null;
316
+ const rate = stats.decisions.filter((d) => d.outcome === 'escalate').length / n;
317
+ if (Math.abs(rate - run.escalationRate) > DECIDE_DRIFT_ESCALATION_DELTA) {
318
+ return { measure: 'escalation_rate', question: null, value: rate, expected: run.escalationRate, threshold: DECIDE_DRIFT_ESCALATION_DELTA, n };
319
+ }
320
+ for (const name of Object.keys(run.questions).sort()) {
321
+ const range = run.questions[name];
322
+ const ps = stats.decisions.map((d) => d.p[name]).filter((p) => typeof p === 'number');
323
+ if (ps.length < DECIDE_DRIFT_MIN_DECISIONS)
324
+ continue;
325
+ const m = median(ps);
326
+ if (m < range.p10 || m > range.p90)
327
+ return { measure: 'median_p', question: name, value: m, expected: [range.p10, range.p90], threshold: null, n: ps.length };
328
+ }
329
+ return null;
330
+ }
331
+ function statsOf(v, ruleHash) {
332
+ if (typeof v !== 'object' || v === null)
333
+ return null;
334
+ const s = v;
335
+ if (s.v !== 1 || s.ruleHash !== ruleHash || !Array.isArray(s.decisions))
336
+ return null;
337
+ const decisions = s.decisions.filter((d) => typeof d === 'object' && d !== null && typeof d.atMs === 'number' &&
338
+ ['allow', 'refuse', 'escalate'].includes(d.outcome) &&
339
+ typeof d.p === 'object' && d.p !== null);
340
+ return { v: 1, ruleHash, decisions, lastDriftAtMs: typeof s.lastDriftAtMs === 'number' ? s.lastDriftAtMs : null };
341
+ }
342
+ /** A rule's stats file, `dir/<ruleHash>.json`, replaced whole by a rename. A file that does not read is no stats. */
343
+ export function readDecideStats(fs, dir, ruleHash) {
344
+ try {
345
+ return statsOf(JSON.parse(fs.readFileSync(`${dir}/${ruleHash}.json`, 'utf8')), ruleHash);
346
+ }
347
+ catch {
348
+ return null;
349
+ }
350
+ }
351
+ export function writeDecideStats(fs, dir, stats) {
352
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
353
+ const tmp = `${dir}/${stats.ruleHash}.json.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
354
+ fs.writeFileSync(tmp, JSON.stringify(stats) + '\n', { mode: 0o600 });
355
+ fs.renameSync(tmp, `${dir}/${stats.ruleHash}.json`);
356
+ }
357
+ /**
358
+ * Writes one evaluated call: its `decide.decision` line, a `decide.canary_failed`,
359
+ * `decide.unavailable` or `decide.not_evaluated` line when one applies, then
360
+ * each answered rule's stats, and a `decide.drift` line for each rule that
361
+ * drifted from the eval run of the pin it ran under. Returns the drifts.
362
+ * Throws on a write error; a caller on the decision path catches it, because
363
+ * a log that cannot be written must not change the decision.
364
+ */
365
+ export function writeDecideCallLog(evaluation, rules, ctx, deps) {
366
+ if (evaluation.rules.length === 0 && evaluation.skipped.length === 0 && evaluation.call.outcome === 'allow')
367
+ return [];
368
+ const file = decideLogFileName(ctx.atMs);
369
+ const append = (r) => appendDecideLogLine(deps.fs, deps.logsDir, file, decideLogLine(r));
370
+ const record = buildDecideDecisionRecord(evaluation, rules, ctx, deps.sha256Hex);
371
+ append(record);
372
+ const head = { atMs: ctx.atMs, harness: ctx.harness, workspaceId: ctx.workspaceId, sessionId: ctx.sessionId };
373
+ if (evaluation.canary === 'failed') {
374
+ append(buildDecideEventRecord('decide.canary_failed', head, { engineHost: ctx.engine.host, modelDigest: ctx.engine.digest }));
375
+ }
376
+ const unavailable = evaluation.rules.filter((r) => r.outcome === 'unavailable');
377
+ if (unavailable.length > 0) {
378
+ append(buildDecideEventRecord('decide.unavailable', head, { tool: ctx.tool, rules: unavailable.map((r) => ({ ref: r.ref, effective: r.effective, error: r.error })) }));
379
+ }
380
+ const notEvaluated = evaluation.rules.filter((r) => r.why === 'not_evaluated');
381
+ if (notEvaluated.length > 0) {
382
+ append(buildDecideEventRecord('decide.not_evaluated', head, { modelDigest: ctx.engine.digest, rules: notEvaluated.map((r) => ({ ref: r.ref, ruleHash: r.ruleHash })) }));
383
+ }
384
+ const drifts = [];
385
+ const byRef = new Map(rules.map((r) => [r.ref, r]));
386
+ for (const rep of evaluation.rules) {
387
+ const entry = byRef.get(rep.ref);
388
+ if (!entry || !rep.answers || rep.outcome === 'unavailable')
389
+ continue;
390
+ const v = validateDecideRule(entry.ir);
391
+ if (!v.ok)
392
+ continue;
393
+ const p = {};
394
+ for (const [name, a] of Object.entries(rep.answers)) {
395
+ const x = decideTrackedP(v.rule, name, a);
396
+ if (x !== null)
397
+ p[name] = x;
398
+ }
399
+ let stats = recordDecideStats(readDecideStats(deps.fs, deps.statsDir, rep.ruleHash), rep.ruleHash, { atMs: ctx.atMs, outcome: rep.outcome, p });
400
+ const pin = entry.pins.find((x) => x.modelDigest === rep.modelDigest);
401
+ const run = pin ? deps.evalRun(rep.ruleHash, pin.evalRunId) : null;
402
+ const drift = run ? checkDecideDrift(stats, run, ctx.atMs) : null;
403
+ if (drift) {
404
+ stats = { ...stats, lastDriftAtMs: ctx.atMs };
405
+ drifts.push(drift);
406
+ append(buildDecideEventRecord('decide.drift', head, { ruleRef: rep.ref, ruleHash: rep.ruleHash, modelDigest: rep.modelDigest, evalRunId: pin.evalRunId, ...drift }));
407
+ }
408
+ writeDecideStats(deps.fs, deps.statsDir, stats);
409
+ }
410
+ return drifts;
411
+ }
412
+ // ---------------------------------------------------------------------------
413
+ // Where a gate writes it
414
+ // ---------------------------------------------------------------------------
415
+ /** `host:port` of an engine URL, as the log records it; never its path, query or credentials. */
416
+ export function decideEngineHost(url) {
417
+ try {
418
+ const u = new URL(url);
419
+ return u.port ? `${u.hostname}:${u.port}` : u.hostname;
420
+ }
421
+ catch {
422
+ return '';
423
+ }
424
+ }
425
+ /**
426
+ * The engine as a call's record names it: the configured adapter, host and
427
+ * model (`cfg` is null when the engine is not configured), and the model,
428
+ * digest and canary the evaluation reported.
429
+ */
430
+ export function decideLogEngine(cfg, evaluation) {
431
+ return {
432
+ adapter: cfg?.adapter ?? '',
433
+ host: cfg ? decideEngineHost(cfg.url) : '',
434
+ model: evaluation.engine?.model ?? cfg?.model ?? null,
435
+ digest: evaluation.engine?.modelDigest ?? null,
436
+ digestStrength: evaluation.engine?.digestStrength ?? null,
437
+ canary: evaluation.canary,
438
+ };
439
+ }
440
+ /**
441
+ * The drift baseline of the eval run `intutic decide eval` stored at
442
+ * `decideDir/evals/<ruleHash>/runs/<evalRunId>.json`, or null when there is
443
+ * none, it does not read, or either name is not a plain file name.
444
+ */
445
+ export function readDecideEvalRunBaseline(fs, decideDir, ruleHash, evalRunId) {
446
+ if (!/^[0-9a-f]+$/.test(ruleHash) || !/^[A-Za-z0-9_-][A-Za-z0-9._-]*$/.test(evalRunId))
447
+ return null;
448
+ try {
449
+ const run = JSON.parse(fs.readFileSync(`${decideDir}/evals/${ruleHash}/runs/${evalRunId}.json`, 'utf8'));
450
+ const b = run?.baseline;
451
+ if (!b || typeof b.escalationRate !== 'number' || typeof b.questions !== 'object' || b.questions === null)
452
+ return null;
453
+ return b;
454
+ }
455
+ catch {
456
+ return null;
457
+ }
458
+ }
459
+ /**
460
+ * Where a gate writes the decide log and its drift stats under the home
461
+ * directory `home`, as `intutic decide check` does: `~/.intutic/logs`,
462
+ * `~/.intutic/decide/stats`, and the eval runs `decide eval` stored under
463
+ * `~/.intutic/decide/evals`.
464
+ */
465
+ export function decideLogDeps(fs, home, sha256Hex) {
466
+ const intutic = `${home}/.intutic`;
467
+ return {
468
+ fs,
469
+ logsDir: `${intutic}/logs`,
470
+ statsDir: `${intutic}/decide/stats`,
471
+ sha256Hex,
472
+ evalRun: (ruleHash, evalRunId) => readDecideEvalRunBaseline(fs, `${intutic}/decide`, ruleHash, evalRunId),
473
+ };
474
+ }
475
+ // ---------------------------------------------------------------------------
476
+ // As source
477
+ // ---------------------------------------------------------------------------
478
+ /**
479
+ * This module as JavaScript source, for the hook gates to embed: every
480
+ * constant and every function above. The embedding scope supplies what it
481
+ * imports from `decide.ts` (`bandValue`, `choiceAtoms`, `decideOptions`,
482
+ * `decideQuestionBand`, `parseWhen`, `validateDecideRule`) and
483
+ * `decideEngine.ts` (`buildDecideToolCallState`, `decideCanonicalJson`). A
484
+ * test holds the list to the functions this file declares.
485
+ */
486
+ export const DECIDE_LOG_JS_SOURCE = decideModuleSource([
487
+ `const DECIDE_LOG_LINE_MAX_BYTES = ${DECIDE_LOG_LINE_MAX_BYTES};`,
488
+ `const DECIDE_ARGS_EXCERPT_MAX_BYTES = ${DECIDE_ARGS_EXCERPT_MAX_BYTES};`,
489
+ `const DECIDE_LOG_RETENTION_DAYS = ${DECIDE_LOG_RETENTION_DAYS};`,
490
+ `const DECIDE_STATS_KEEP = ${DECIDE_STATS_KEEP};`,
491
+ `const DECIDE_DRIFT_MIN_DECISIONS = ${DECIDE_DRIFT_MIN_DECISIONS};`,
492
+ `const DECIDE_DRIFT_ESCALATION_DELTA = ${DECIDE_DRIFT_ESCALATION_DELTA};`,
493
+ `const DECIDE_DRIFT_INTERVAL_MS = ${DECIDE_DRIFT_INTERVAL_MS};`,
494
+ `const DECIDE_REDACTED = ${JSON.stringify(DECIDE_REDACTED)};`,
495
+ decideLogFileName,
496
+ decideLogFileDate,
497
+ utf8Length,
498
+ decideUtf8Prefix,
499
+ decideRedact,
500
+ decideArgsExcerpt,
501
+ eqAtoms,
502
+ logAnswer,
503
+ whenValue,
504
+ buildDecideDecisionRecord,
505
+ buildDecideEventRecord,
506
+ decideLogLine,
507
+ appendDecideLogLine,
508
+ decideTrackedP,
509
+ recordDecideStats,
510
+ median,
511
+ checkDecideDrift,
512
+ statsOf,
513
+ readDecideStats,
514
+ writeDecideStats,
515
+ writeDecideCallLog,
516
+ decideEngineHost,
517
+ decideLogEngine,
518
+ readDecideEvalRunBaseline,
519
+ decideLogDeps,
520
+ ]);
521
+ //# sourceMappingURL=decideLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideLog.js","sourceRoot":"","sources":["../src/decideLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The patterns the decide log's arguments excerpt is redacted with: the
3
+ * hook gates' credential-value patterns and the PII detectors' regexes,
4
+ * applied without the detectors' validators, so a stored excerpt loses more
5
+ * than live traffic would, never less. `@intutic/shared-types` derives the
6
+ * list from its own tables (`decideLogRedactionSources`); this package does
7
+ * not depend on it, so it carries the list, and
8
+ * `fixtures/decide-log-vectors.json` holds it to the shared one, as it holds
9
+ * the Python port's.
10
+ *
11
+ * Repetition is spelled out (`[A-Z2-7]` sixteen times) as the shared table
12
+ * spells it, so the sources compare equal.
13
+ *
14
+ * @module
15
+ */
16
+ export declare const DECIDE_LOG_REDACTION_SOURCES: readonly string[];
17
+ //# sourceMappingURL=decideLogRedaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideLogRedaction.d.ts","sourceRoot":"","sources":["../src/decideLogRedaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAezD,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The patterns the decide log's arguments excerpt is redacted with: the
3
+ * hook gates' credential-value patterns and the PII detectors' regexes,
4
+ * applied without the detectors' validators, so a stored excerpt loses more
5
+ * than live traffic would, never less. `@intutic/shared-types` derives the
6
+ * list from its own tables (`decideLogRedactionSources`); this package does
7
+ * not depend on it, so it carries the list, and
8
+ * `fixtures/decide-log-vectors.json` holds it to the shared one, as it holds
9
+ * the Python port's.
10
+ *
11
+ * Repetition is spelled out (`[A-Z2-7]` sixteen times) as the shared table
12
+ * spells it, so the sources compare equal.
13
+ *
14
+ * @module
15
+ */
16
+ const rep = (cls, n) => cls.repeat(n);
17
+ export const DECIDE_LOG_REDACTION_SOURCES = [
18
+ '(A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)' + rep('[A-Z2-7]', 16),
19
+ 'sk-ant-' + rep('[A-Za-z0-9_-]', 20) + '[A-Za-z0-9_-]*',
20
+ 'gh[pousr]_' + rep('[A-Za-z0-9]', 36),
21
+ '-----BEGIN [A-Z ]*PRIVATE KEY-----',
22
+ 'sk-or-v1-' + rep('[A-Za-z0-9]', 20) + '[A-Za-z0-9]*',
23
+ 'vk_' + rep('[a-f0-9]', 32),
24
+ 'gwk_' + rep('[a-f0-9]', 64),
25
+ 'sk_live_' + rep('[A-Za-z0-9]', 24),
26
+ '[0-9]{4}[ -][0-9]{4}[ -][0-9]{4}[ -][0-9]{4}|[0-9]{4}[ -][0-9]{6}[ -][0-9]{4,5}|[0-9]{13,19}',
27
+ '[A-Z]{2}[0-9]{2}(?: ?[A-Z0-9]){11,30}',
28
+ '[0-9]{3}-[0-9]{2}-[0-9]{4}',
29
+ '[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9-]{1,63}(?:\\.[A-Za-z0-9-]{1,63}){1,8}',
30
+ '\\+[1-9][0-9]{0,2}(?:[ .-]?\\([0-9]{1,4}\\)|[ .-]?[0-9]{1,4}){2,7}' +
31
+ '|(?:1[ .-])?(?:\\([2-9][0-9]{2}\\) ?|[2-9][0-9]{2}[ .-])[2-9][0-9]{2}[ .-][0-9]{4}',
32
+ ];
33
+ //# sourceMappingURL=decideLogRedaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideLogRedaction.js","sourceRoot":"","sources":["../src/decideLogRedaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,CAAS,EAAU,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,4BAA4B,GAAsB;IAC7D,mCAAmC,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IACzD,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,gBAAgB;IACvD,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;IACrC,oCAAoC;IACpC,WAAW,GAAG,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,cAAc;IACrD,KAAK,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IAC5B,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;IACnC,8FAA8F;IAC9F,uCAAuC;IACvC,4BAA4B;IAC5B,yEAAyE;IACzE,oEAAoE;QAClE,oFAAoF;CACvF,CAAA"}