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