@intutic/gate 2.9.1 → 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,194 @@
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 const DECIDE_HOSTED_DENYLIST = [
24
+ 'typesafe.ai',
25
+ 'fastino.ai',
26
+ 'api.openai.com',
27
+ 'openai.azure.com',
28
+ 'services.ai.azure.com',
29
+ 'gateway.ai.cloudflare.com',
30
+ 'ai-gateway.vercel.sh',
31
+ 'api.fireworks.ai',
32
+ 'api.perplexity.ai',
33
+ 'cloud.databricks.com',
34
+ 'azuredatabricks.net',
35
+ ];
36
+ /** Decision routes that are refused on any host that is not loopback or private. */
37
+ const DECISION_ROUTES = ['/v1/decisions', '/v1/systemone'];
38
+ export class DecideHostRefusedError extends Error {
39
+ verdict;
40
+ code = 'host_refused';
41
+ constructor(verdict) {
42
+ super(`decide engine host refused (${verdict.reason}): ${verdict.host || '<none>'}`);
43
+ this.verdict = verdict;
44
+ this.name = 'DecideHostRefusedError';
45
+ }
46
+ }
47
+ function hostMatches(host, name) {
48
+ return host === name || host.endsWith('.' + name);
49
+ }
50
+ function normaliseName(name) {
51
+ const lower = name.trim().toLowerCase();
52
+ return lower.endsWith('.') ? lower.slice(0, -1) : lower;
53
+ }
54
+ function parseIpv4(host) {
55
+ const parts = host.split('.');
56
+ if (parts.length !== 4)
57
+ return null;
58
+ const out = [];
59
+ for (const p of parts) {
60
+ if (!/^(0|[1-9][0-9]{0,2})$/.test(p))
61
+ return null;
62
+ const n = Number(p);
63
+ if (n > 255)
64
+ return null;
65
+ out.push(n);
66
+ }
67
+ return out;
68
+ }
69
+ /** The eight 16-bit groups of an IPv6 literal, or null. */
70
+ function parseIpv6(text) {
71
+ if (!/^[0-9a-f:.]+$/.test(text))
72
+ return null;
73
+ const halves = text.split('::');
74
+ if (halves.length > 2)
75
+ return null;
76
+ const groups = (part) => {
77
+ if (part === '')
78
+ return [];
79
+ const out = [];
80
+ const items = part.split(':');
81
+ for (let i = 0; i < items.length; i++) {
82
+ const item = items[i];
83
+ if (i === items.length - 1 && item.includes('.')) {
84
+ const v4 = parseIpv4(item);
85
+ if (!v4)
86
+ return null;
87
+ out.push((v4[0] << 8) | v4[1], (v4[2] << 8) | v4[3]);
88
+ }
89
+ else if (/^[0-9a-f]{1,4}$/.test(item)) {
90
+ out.push(parseInt(item, 16));
91
+ }
92
+ else {
93
+ return null;
94
+ }
95
+ }
96
+ return out;
97
+ };
98
+ const head = groups(halves[0]);
99
+ const tail = halves.length === 2 ? groups(halves[1]) : [];
100
+ if (!head || !tail)
101
+ return null;
102
+ if (halves.length === 1)
103
+ return head.length === 8 ? head : null;
104
+ const fill = 8 - head.length - tail.length;
105
+ if (fill < 1)
106
+ return null;
107
+ return [...head, ...new Array(fill).fill(0), ...tail];
108
+ }
109
+ /** Parses INTUTIC_SELF_HOSTED_DECISION_HOSTS: exact names, or `.suffix` for a name and its subdomains. */
110
+ function listedNames(listed) {
111
+ return (listed ?? '')
112
+ .split(',')
113
+ .map((e) => normaliseName(e))
114
+ .map((e) => (e.startsWith('.') ? e.slice(1) : e))
115
+ .filter((e) => e !== '');
116
+ }
117
+ /**
118
+ * Judges a decide engine's base URL. `listed` is the value of
119
+ * `INTUTIC_SELF_HOSTED_DECISION_HOSTS` (a comma list).
120
+ */
121
+ export function checkSelfHostedDecisionHost(url, listed) {
122
+ const scheme = /^(https?):\/\//i.exec(url);
123
+ if (!scheme)
124
+ return { ok: false, host: '', reason: 'scheme' };
125
+ const rest = url.slice(scheme[0].length);
126
+ if (/[^\x21-\x7e]|[\\%?#]/.test(rest))
127
+ return { ok: false, host: '', reason: 'bad_url' };
128
+ const slash = rest.indexOf('/');
129
+ const authority = slash === -1 ? rest : rest.slice(0, slash);
130
+ const path = slash === -1 ? '' : rest.slice(slash);
131
+ if (authority.includes('@'))
132
+ return { ok: false, host: '', reason: 'credentials' };
133
+ const m = /^(?:\[([0-9A-Fa-f:.]+)\]|([A-Za-z0-9._-]+))(?::([0-9]{1,5}))?$/.exec(authority);
134
+ if (!m || (m[3] !== undefined && Number(m[3]) > 65535))
135
+ return { ok: false, host: '', reason: 'bad_url' };
136
+ const v6 = m[1] !== undefined ? parseIpv6(m[1].toLowerCase()) : null;
137
+ if (m[1] !== undefined && !v6)
138
+ return { ok: false, host: '', reason: 'bad_url' };
139
+ const host = m[1] !== undefined ? m[1].toLowerCase() : normaliseName(m[2]);
140
+ if (host === '')
141
+ return { ok: false, host: '', reason: 'bad_url' };
142
+ if (DECIDE_HOSTED_DENYLIST.some((d) => hostMatches(host, d)))
143
+ return { ok: false, host, reason: 'denylist' };
144
+ let local = null;
145
+ if (v6) {
146
+ if (v6.slice(0, 7).every((g) => g === 0) && v6[7] === 1)
147
+ local = 'loopback';
148
+ else if ((v6[0] & 0xfe00) === 0xfc00)
149
+ local = 'private';
150
+ }
151
+ else {
152
+ const v4 = parseIpv4(host);
153
+ if (v4) {
154
+ if (v4[0] === 127)
155
+ local = 'loopback';
156
+ else if (v4[0] === 10 ||
157
+ (v4[0] === 172 && v4[1] >= 16 && v4[1] <= 31) ||
158
+ (v4[0] === 192 && v4[1] === 168) ||
159
+ (v4[0] === 169 && v4[1] === 254))
160
+ local = 'private';
161
+ }
162
+ else if (host === 'localhost')
163
+ local = 'loopback';
164
+ else if (host.endsWith('.local'))
165
+ local = 'private';
166
+ }
167
+ if (local)
168
+ return { ok: true, host, reason: local };
169
+ const lowerPath = path.toLowerCase();
170
+ if (DECISION_ROUTES.some((r) => lowerPath.includes(r)))
171
+ return { ok: false, host, reason: 'decision_path' };
172
+ if (listedNames(listed).some((name) => hostMatches(host, name)))
173
+ return { ok: true, host, reason: 'listed' };
174
+ return { ok: false, host, reason: 'not_listed' };
175
+ }
176
+ /** As {@link checkSelfHostedDecisionHost}, throwing {@link DecideHostRefusedError}; returns the host. */
177
+ export function assertSelfHostedDecisionHost(url, listed) {
178
+ const verdict = checkSelfHostedDecisionHost(url, listed);
179
+ if (!verdict.ok)
180
+ throw new DecideHostRefusedError(verdict);
181
+ return verdict.host;
182
+ }
183
+ /**
184
+ * {@link checkSelfHostedDecisionHost} as JavaScript source, with the
185
+ * constants and helpers it reads, for the hook gates to embed. A CommonJS
186
+ * build names an exported constant `exports.X` inside a function; the source
187
+ * defines each as a plain `X`, so that prefix is dropped.
188
+ */
189
+ export const DECIDE_HOST_GUARD_JS_SOURCE = [
190
+ `const DECIDE_HOSTED_DENYLIST = ${JSON.stringify(DECIDE_HOSTED_DENYLIST)};`,
191
+ `const DECISION_ROUTES = ${JSON.stringify(DECISION_ROUTES)};`,
192
+ ...[hostMatches, normaliseName, parseIpv4, parseIpv6, listedNames, checkSelfHostedDecisionHost].map((fn) => fn.toString().replace(/\bexports\./g, '')),
193
+ ].join('\n');
194
+ //# sourceMappingURL=decideHostGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideHostGuard.js","sourceRoot":"","sources":["../src/decideHostGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
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 { type DecideRule } from './decide.js';
37
+ import { type DecideAnswer } from './decideEngine.js';
38
+ import type { DecideEvaluation, DecideRuleEntry, DecideRuleReport } from './decideEvaluate.js';
39
+ /** The longest line the log holds, in UTF-8 bytes. */
40
+ export declare const DECIDE_LOG_LINE_MAX_BYTES = 8192;
41
+ /** The longest arguments excerpt, in UTF-8 bytes, cut on a character boundary. */
42
+ export declare const DECIDE_ARGS_EXCERPT_MAX_BYTES = 2048;
43
+ /** Days a decide log file is kept before housekeeping deletes it. */
44
+ export declare const DECIDE_LOG_RETENTION_DAYS = 30;
45
+ /** Decisions kept per rule for the drift alarm. */
46
+ export declare const DECIDE_STATS_KEEP = 200;
47
+ /** Fewer kept decisions than this never raise drift: one escalation in three is noise, not drift. */
48
+ export declare const DECIDE_DRIFT_MIN_DECISIONS = 20;
49
+ /** An escalation rate this far (absolute) from the eval run's is drift. */
50
+ export declare const DECIDE_DRIFT_ESCALATION_DELTA = 0.15;
51
+ /** At most one `decide.drift` per rule in this window. */
52
+ export declare const DECIDE_DRIFT_INTERVAL_MS = 86400000;
53
+ /** What a redacted match is replaced with. */
54
+ export declare const DECIDE_REDACTED = "[REDACTED]";
55
+ export type DecideLogEvent = 'decide.decision' | 'decide.unavailable' | 'decide.canary_failed' | 'decide.drift' | 'decide.not_evaluated';
56
+ /** `decide-YYYY-MM-DD.jsonl` for the UTC date of `atMs`; `decide-state-…` for raw states. */
57
+ export declare function decideLogFileName(atMs: number, kind?: 'decide' | 'decide-state'): string;
58
+ /** The UTC date a decide log file name carries, as epoch milliseconds at midnight, or null when the name is not one. */
59
+ export declare function decideLogFileDate(name: string): number | null;
60
+ /** The longest prefix of whole characters within `max` UTF-8 bytes. */
61
+ export declare function decideUtf8Prefix(s: string, max: number): string;
62
+ /**
63
+ * `text` with every match of each source replaced by {@link DECIDE_REDACTED},
64
+ * the sources applied in order. A source that does not compile is skipped.
65
+ */
66
+ export declare function decideRedact(text: string, sources: readonly string[]): string;
67
+ /** The call's arguments as canonical JSON, redacted, then cut to `maxBytes`. */
68
+ export declare function decideArgsExcerpt(toolInput: unknown, sources: readonly string[], maxBytes?: number): string;
69
+ export interface DecideLogEngine {
70
+ adapter: string;
71
+ /** `host:port` of the engine URL; never the key. */
72
+ host: string;
73
+ model: string | null;
74
+ digest: string | null;
75
+ digestStrength: 'strong' | 'weak' | null;
76
+ canary: 'ok' | 'cached' | 'failed' | null;
77
+ }
78
+ export interface DecideLogContext {
79
+ /** Epoch milliseconds. */
80
+ atMs: number;
81
+ harness: string;
82
+ workspaceId: string;
83
+ sessionId: string;
84
+ tool: string;
85
+ toolInput: unknown;
86
+ cwd: string;
87
+ lastUserTurn?: string | null;
88
+ budgetMs: number;
89
+ latencyMs: number;
90
+ engine: DecideLogEngine;
91
+ /** Regex sources the arguments excerpt is redacted with. */
92
+ redact: readonly string[];
93
+ /**
94
+ * The call's reversibility class (`laneOf` of the tokens it
95
+ * classifies to, lanes.ts), or null when it has none or the caller cannot
96
+ * say. Logged so calibrations can be stratified by consequence.
97
+ */
98
+ lane?: 'irreversible' | 'reversible_wide' | 'reversible_contained' | null;
99
+ /** The subject's role-level revert or rejection rate, or null when none is published. */
100
+ revertRate?: number | null;
101
+ }
102
+ /** One question's answer as the log keeps it. */
103
+ export type DecideLogAnswer = {
104
+ type: 'yes_no';
105
+ p: number | null;
106
+ pRaw: number | null;
107
+ value: 'T' | 'F' | 'U';
108
+ band: [number, number];
109
+ } | {
110
+ type: 'choice';
111
+ p: Record<string, number>;
112
+ spread: Record<string, number>;
113
+ atoms: Record<string, 'T' | 'F' | 'U'>;
114
+ band: [number, number];
115
+ };
116
+ export interface DecideLogRule {
117
+ ref: string;
118
+ ruleHash: string;
119
+ /** The record's stamp. */
120
+ rollout: 'shadow' | 'enforce';
121
+ effective: 'enforce' | 'shadow';
122
+ why: string | null;
123
+ /** sha256 of the exact state bytes sent for this rule, `sha256:<hex>`. */
124
+ stateHash: string | null;
125
+ modelDigest: string | null;
126
+ answers: Record<string, DecideLogAnswer> | null;
127
+ when: 'T' | 'F' | 'U' | null;
128
+ outcome: DecideRuleReport['outcome'];
129
+ escalate: 'ask' | 'review' | 'refuse';
130
+ error: string | null;
131
+ }
132
+ export interface DecideDecisionRecord {
133
+ v: 1;
134
+ event: 'decide.decision';
135
+ at: string;
136
+ harness: string;
137
+ workspaceId: string;
138
+ sessionId: string;
139
+ tool: string;
140
+ /** The call's reversibility class, or null. Readers ignore fields they do not know. */
141
+ lane: 'irreversible' | 'reversible_wide' | 'reversible_contained' | null;
142
+ /** The subject's revert or rejection rate, or null. */
143
+ revertRate: number | null;
144
+ stateHash: string | null;
145
+ argsExcerpt: string;
146
+ engine: DecideLogEngine;
147
+ budgetMs: number;
148
+ latencyMs: number;
149
+ outcome: 'allow' | 'refuse' | 'escalate';
150
+ code: string | null;
151
+ rules: DecideLogRule[];
152
+ skipped: string[];
153
+ truncated?: true;
154
+ }
155
+ /**
156
+ * The `decide.decision` record of one evaluated call. `rules` are the
157
+ * entries the call was evaluated over; each report's state is rebuilt from
158
+ * its entry and the call (it is deterministic) and hashed with `sha256Hex`.
159
+ */
160
+ export declare function buildDecideDecisionRecord(evaluation: DecideEvaluation, rules: readonly DecideRuleEntry[], ctx: DecideLogContext, sha256Hex: (text: string) => string): DecideDecisionRecord;
161
+ /** An event other than a decision, in the same envelope. */
162
+ export declare function buildDecideEventRecord(event: Exclude<DecideLogEvent, 'decide.decision'>, ctx: Pick<DecideLogContext, 'atMs' | 'harness' | 'workspaceId' | 'sessionId'>, body: Record<string, unknown>): Record<string, unknown>;
163
+ /**
164
+ * The record as one JSON line (with its newline) of at most `max` bytes.
165
+ * Over it, the arguments excerpt is shortened first, by halves down to
166
+ * nothing; then each choice answer keeps only its atoms; then the answers
167
+ * go. Whatever was cut, `truncated` says so.
168
+ */
169
+ export declare function decideLogLine(record: Record<string, unknown>, max?: number): string;
170
+ /** The parts of `node:fs` the log and the stats use. */
171
+ export interface DecideLogFs {
172
+ mkdirSync(path: string, options: {
173
+ recursive: true;
174
+ mode: number;
175
+ }): unknown;
176
+ openSync(path: string, flags: string, mode: number): number;
177
+ writeSync(fd: number, data: string): number;
178
+ closeSync(fd: number): void;
179
+ readFileSync(path: string, encoding: 'utf8'): string;
180
+ writeFileSync(path: string, data: string, options: {
181
+ mode: number;
182
+ }): void;
183
+ renameSync(from: string, to: string): void;
184
+ }
185
+ /** Appends one line to `dir/file` with a single write to a file opened for append, mode 0600 in a 0700 directory. */
186
+ export declare function appendDecideLogLine(fs: DecideLogFs, dir: string, file: string, line: string): void;
187
+ /** One kept decision: the rule's own outcome and each question's probability. */
188
+ export interface DecideStatsDecision {
189
+ atMs: number;
190
+ outcome: 'allow' | 'refuse' | 'escalate';
191
+ /** p(yes) for a yes/no question; the top option's averaged probability for a choice. */
192
+ p: Record<string, number>;
193
+ }
194
+ export interface DecideStats {
195
+ v: 1;
196
+ ruleHash: string;
197
+ decisions: DecideStatsDecision[];
198
+ /** When `decide.drift` last fired for this rule. */
199
+ lastDriftAtMs: number | null;
200
+ }
201
+ /** What an eval run measured, as drift compares against it. */
202
+ export interface DecideEvalRunBaseline {
203
+ evalRunId: string;
204
+ escalationRate: number;
205
+ /** Per question: the 10th and 90th percentile of its probability over the run's cases. */
206
+ questions: Record<string, {
207
+ p10: number;
208
+ p90: number;
209
+ }>;
210
+ }
211
+ export interface DecideDrift {
212
+ measure: 'escalation_rate' | 'median_p';
213
+ question: string | null;
214
+ value: number;
215
+ /** The run's escalation rate, or its [p10, p90]. */
216
+ expected: number | [number, number];
217
+ threshold: number | null;
218
+ n: number;
219
+ }
220
+ /** The probability a question's answer is tracked by, or null when it has none. */
221
+ export declare function decideTrackedP(rule: DecideRule, name: string, a: DecideAnswer): number | null;
222
+ /** `stats` with `d` appended and only the last {@link DECIDE_STATS_KEEP} kept. */
223
+ export declare function recordDecideStats(stats: DecideStats | null, ruleHash: string, d: DecideStatsDecision): DecideStats;
224
+ /**
225
+ * Whether the kept decisions have drifted from the eval run. Null below
226
+ * {@link DECIDE_DRIFT_MIN_DECISIONS}, inside {@link DECIDE_DRIFT_INTERVAL_MS}
227
+ * of the last drift, or when nothing moved. The escalation rate is checked
228
+ * first, then each question in name order.
229
+ */
230
+ export declare function checkDecideDrift(stats: DecideStats, run: DecideEvalRunBaseline, nowMs: number): DecideDrift | null;
231
+ /** A rule's stats file, `dir/<ruleHash>.json`, replaced whole by a rename. A file that does not read is no stats. */
232
+ export declare function readDecideStats(fs: DecideLogFs, dir: string, ruleHash: string): DecideStats | null;
233
+ export declare function writeDecideStats(fs: DecideLogFs, dir: string, stats: DecideStats): void;
234
+ export interface DecideLogWriteDeps {
235
+ fs: DecideLogFs;
236
+ /** `~/.intutic/logs`. */
237
+ logsDir: string;
238
+ /** `~/.intutic/decide/stats`. */
239
+ statsDir: string;
240
+ sha256Hex: (text: string) => string;
241
+ /** The baseline of an eval run a rule's pin names, or null when there is none on this machine. */
242
+ evalRun: (ruleHash: string, evalRunId: string) => DecideEvalRunBaseline | null;
243
+ }
244
+ /**
245
+ * Writes one evaluated call: its `decide.decision` line, a `decide.canary_failed`,
246
+ * `decide.unavailable` or `decide.not_evaluated` line when one applies, then
247
+ * each answered rule's stats, and a `decide.drift` line for each rule that
248
+ * drifted from the eval run of the pin it ran under. Returns the drifts.
249
+ * Throws on a write error; a caller on the decision path catches it, because
250
+ * a log that cannot be written must not change the decision.
251
+ */
252
+ export declare function writeDecideCallLog(evaluation: DecideEvaluation, rules: readonly DecideRuleEntry[], ctx: DecideLogContext, deps: DecideLogWriteDeps): DecideDrift[];
253
+ /** `host:port` of an engine URL, as the log records it; never its path, query or credentials. */
254
+ export declare function decideEngineHost(url: string): string;
255
+ /**
256
+ * The engine as a call's record names it: the configured adapter, host and
257
+ * model (`cfg` is null when the engine is not configured), and the model,
258
+ * digest and canary the evaluation reported.
259
+ */
260
+ export declare function decideLogEngine(cfg: {
261
+ adapter: string;
262
+ url: string;
263
+ model: string;
264
+ } | null, evaluation: Pick<DecideEvaluation, 'engine' | 'canary'>): DecideLogEngine;
265
+ /**
266
+ * The drift baseline of the eval run `intutic decide eval` stored at
267
+ * `decideDir/evals/<ruleHash>/runs/<evalRunId>.json`, or null when there is
268
+ * none, it does not read, or either name is not a plain file name.
269
+ */
270
+ export declare function readDecideEvalRunBaseline(fs: Pick<DecideLogFs, 'readFileSync'>, decideDir: string, ruleHash: string, evalRunId: string): DecideEvalRunBaseline | null;
271
+ /**
272
+ * Where a gate writes the decide log and its drift stats under the home
273
+ * directory `home`, as `intutic decide check` does: `~/.intutic/logs`,
274
+ * `~/.intutic/decide/stats`, and the eval runs `decide eval` stored under
275
+ * `~/.intutic/decide/evals`.
276
+ */
277
+ export declare function decideLogDeps(fs: DecideLogFs, home: string, sha256Hex: (text: string) => string): DecideLogWriteDeps;
278
+ /**
279
+ * This module as JavaScript source, for the hook gates to embed: every
280
+ * constant and every function above. The embedding scope supplies what it
281
+ * imports from `decide.ts` (`bandValue`, `choiceAtoms`, `decideOptions`,
282
+ * `decideQuestionBand`, `parseWhen`, `validateDecideRule`) and
283
+ * `decideEngine.ts` (`buildDecideToolCallState`, `decideCanonicalJson`). A
284
+ * test holds the list to the functions this file declares.
285
+ */
286
+ export declare const DECIDE_LOG_JS_SOURCE: string;
287
+ //# sourceMappingURL=decideLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decideLog.d.ts","sourceRoot":"","sources":["../src/decideLog.ts"],"names":[],"mappings":"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"}