@intutic/clawde 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.
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Decide rules: the grammar, the validator and the semantics.
3
+ *
4
+ * A decide rule asks a self-hosted model a few narrow `yes_no` or `choice`
5
+ * questions about a tool call or a model response, turns each answer's
6
+ * probability into yes, no or unknown through a band, and combines the
7
+ * answers with the rule's `when` expression in Kleene three-valued logic:
8
+ * true refuses, false allows, unknown escalates. It is written as one SOP
9
+ * front-matter line, `decide: {json}`, one rule per line, the way a
10
+ * `hook_rule:` line is.
11
+ *
12
+ * This module is the pure part every layer shares:
13
+ *
14
+ * - {@link parseDecideLine} and {@link validateDecideRule}: the shape and the
15
+ * eight ordered checks, each failure with one fixed reason;
16
+ * - {@link parseWhen} and {@link canonicalWhen}: the `when` grammar and its
17
+ * fully parenthesised form, `!=` and `IN` rewritten;
18
+ * - {@link decideHashInput}: the canonical JSON the rule hash is taken over,
19
+ * which leaves out `id`, `title`, `escalate` and `rollout`;
20
+ * - {@link bandValue}, {@link choiceOrders}, {@link choiceAtoms}, the Kleene
21
+ * connectives, {@link decideRuleOutcome} and {@link decideCallOutcome}.
22
+ *
23
+ * Self-contained (no imports, no module state) so `@intutic/gate` can carry
24
+ * a byte-identical copy (`packages/gate-js/src/decide.ts`). The proxy's port
25
+ * is `packages/proxy/src/decide/mod.rs` and the Python gate's is
26
+ * `intutic_clawde/gate/decide.py`; all of them run
27
+ * `fixtures/decide-vectors.json` and must give the same answer, reason text
28
+ * included. The SHA-256 is passed in ({@link decideRuleHash}), because this
29
+ * file also runs where `node:crypto` does not.
30
+ *
31
+ * @module
32
+ */
33
+ export declare const DECIDE_MAX_QUESTIONS = 8;
34
+ export declare const DECIDE_MAX_OPTIONS = 8;
35
+ export declare const DECIDE_MAX_RULES_PER_CALL = 4;
36
+ export declare const DECIDE_MAX_WHEN_CHARS = 256;
37
+ export declare const DECIDE_MIN_ASK_CHARS = 8;
38
+ export declare const DECIDE_MAX_ASK_CHARS = 300;
39
+ export declare const DECIDE_DEFAULT_BAND: DecideBand;
40
+ /** Appended to every `choice` question's options when absent, and always asked last. */
41
+ export declare const NONE_OF_THESE = "none_of_these";
42
+ /**
43
+ * A question that asks about approval. Approval comes from the harness's ask
44
+ * or the review queue, never from a model reading text, so the validator
45
+ * refuses such a question (check 8). ASCII word boundaries and case folding,
46
+ * as JavaScript, Python's `re.ASCII` and Rust's `(?-u)` all read it.
47
+ */
48
+ export declare const DECIDE_APPROVAL_RE: RegExp;
49
+ export interface DecideBand {
50
+ yes_at: number;
51
+ no_below: number;
52
+ }
53
+ export interface DecideQuestion {
54
+ type: 'yes_no' | 'choice';
55
+ ask: string;
56
+ /** `choice` only, as written; {@link decideOptions} places `none_of_these`. */
57
+ options?: string[];
58
+ band?: DecideBand;
59
+ }
60
+ /** A rule as its front-matter line carries it: the IR without `kind`. */
61
+ export interface DecideRule {
62
+ id: string;
63
+ title?: string;
64
+ on: 'tool_call' | 'response';
65
+ tools?: string[];
66
+ questions: Record<string, DecideQuestion>;
67
+ when: string;
68
+ band?: DecideBand;
69
+ escalate?: 'ask' | 'review' | 'refuse';
70
+ rollout?: 'shadow' | 'enforce';
71
+ context?: Array<'last_user_turn'>;
72
+ }
73
+ /** A parsed `when`, with `!=` and `IN` already rewritten. */
74
+ export type DecideExpr = {
75
+ op: 'yes';
76
+ q: string;
77
+ } | {
78
+ op: 'eq';
79
+ q: string;
80
+ o: string;
81
+ } | {
82
+ op: 'not';
83
+ a: DecideExpr;
84
+ } | {
85
+ op: 'and' | 'or';
86
+ a: DecideExpr;
87
+ b: DecideExpr;
88
+ };
89
+ export type DecideValidation = {
90
+ ok: true;
91
+ rule: DecideRule;
92
+ expr: DecideExpr;
93
+ } | {
94
+ ok: false;
95
+ reason: string;
96
+ };
97
+ /** A `decide:` line, read or not. An unreadable line is kept, never dropped: it refuses what it would have judged. */
98
+ export type DecideDecl = {
99
+ kind: 'rule';
100
+ rule: DecideRule;
101
+ expr: DecideExpr;
102
+ } | {
103
+ kind: 'unreadable';
104
+ id: string | null;
105
+ error: string;
106
+ };
107
+ /** Parse a `when` expression (§3.3 of the decide LLD). Never throws. Names are not checked here; {@link validateDecideRule} does that. */
108
+ export declare function parseWhen(src: string): {
109
+ ok: true;
110
+ expr: DecideExpr;
111
+ } | {
112
+ ok: false;
113
+ message: string;
114
+ column: number;
115
+ };
116
+ /** The canonical form: fully parenthesised, `!=` and `IN` rewritten. `a AND b != o` → `(a AND (NOT (b == o)))`. */
117
+ export declare function canonicalWhen(e: DecideExpr): string;
118
+ /** A `choice` question's options as asked: `none_of_these` appended when absent and moved last when present. */
119
+ export declare function decideOptions(q: DecideQuestion): string[];
120
+ /** The band a question is judged on: its own, else the rule's, else the default. */
121
+ export declare function decideQuestionBand(rule: DecideRule, name: string): DecideBand;
122
+ /**
123
+ * Validate an untrusted value as a decide rule (the line's JSON, without
124
+ * `kind`). Never throws. The shape comes first, then the eight checks in
125
+ * their fixed order; the first failure is the reason. Questions are visited
126
+ * in sorted name order and `when` atoms left to right, so every port reports
127
+ * the same first failure.
128
+ */
129
+ export declare function validateDecideRule(value: unknown): DecideValidation;
130
+ /** The value of one `decide:` line (the text after the key). */
131
+ export declare function parseDecideLine(raw: string): DecideDecl;
132
+ /** Every `decide:` line of one SOP, in order. A line reusing an earlier line's id is unreadable: ids are unique within a SOP. */
133
+ export declare function parseDecideLines(values: readonly string[]): DecideDecl[];
134
+ /**
135
+ * What the rule hash covers: `on`, `tools` (sorted), the questions with
136
+ * their bands made explicit and `none_of_these` placed, `when` in canonical
137
+ * form and `context` (sorted), as canonical JSON. `id`, `title`, `escalate`
138
+ * and `rollout` are left out, so flipping shadow to enforce keeps the rule's
139
+ * evidence, while a changed word, option or band starts it over.
140
+ * `tools` and `context` are `[]` when absent.
141
+ */
142
+ export declare function decideHashInput(rule: DecideRule): string;
143
+ /** `ruleHash`: lower-case hex SHA-256 of {@link decideHashInput}. `sha256Hex` hashes a string's UTF-8 bytes. */
144
+ export declare function decideRuleHash(rule: DecideRule, sha256Hex: (text: string) => string): string;
145
+ /** Kleene's three values: true, false, unknown. */
146
+ export type Tri = 'T' | 'F' | 'U';
147
+ export declare function kAnd(a: Tri, b: Tri): Tri;
148
+ export declare function kOr(a: Tri, b: Tri): Tri;
149
+ export declare function kNot(a: Tri): Tri;
150
+ /** A probability through a band: T at or above `yes_at`, F below `no_below`, U between. */
151
+ export declare function bandValue(p: number, band: DecideBand): Tri;
152
+ /**
153
+ * The orders a `choice` question is asked in, as index lists over its n
154
+ * options: as written and reversed, plus, past three options, the list
155
+ * rotated by half, because reversing leaves the middle in the middle. The
156
+ * order rule of `attributeSops` in the judge cascade.
157
+ */
158
+ export declare function choiceOrders(n: number): number[][];
159
+ export interface ChoiceAtom {
160
+ /** The probability averaged over the orders. */
161
+ p: number;
162
+ /** The largest probability any order gave minus the smallest. */
163
+ spread: number;
164
+ value: Tri;
165
+ }
166
+ /**
167
+ * Each option's atom `q == o` from the per-order probabilities (option name
168
+ * to probability, one map per order; an option a map leaves out is 0). The
169
+ * mean goes through the band; when the orders disagree by more than the
170
+ * band's width the atom is U whatever the mean. No orders at all is U.
171
+ */
172
+ export declare function choiceAtoms(options: readonly string[], perOrder: ReadonlyArray<Readonly<Record<string, number>>>, band: DecideBand): Record<string, ChoiceAtom>;
173
+ /** The atoms a `when` is evaluated over. A missing atom is U. */
174
+ export interface DecideAtoms {
175
+ yes: Record<string, Tri>;
176
+ eq: Record<string, Record<string, Tri>>;
177
+ }
178
+ export declare function evalWhen(e: DecideExpr, atoms: DecideAtoms): Tri;
179
+ /** An engine's answer: `p` = p(yes) for `yes_no`; `perOrder` for `choice`, one option map per order of {@link choiceOrders}. */
180
+ export interface DecideAnswerInput {
181
+ p?: number;
182
+ perOrder?: Array<Record<string, number>>;
183
+ }
184
+ /** A fitted combiner: it replaces `when`, and is judged on its own band. */
185
+ export interface DecideCombiner {
186
+ bias: number;
187
+ weights: Record<string, number>;
188
+ band: DecideBand;
189
+ }
190
+ /**
191
+ * s = σ(bias + Σ w_q · logit(p_q)), summed in sorted question order. A
192
+ * `choice` question enters through the averaged probability of its top
193
+ * option. Null when a weighted
194
+ * question has no answer, which the caller reads as U.
195
+ */
196
+ export declare function combinerScore(rule: DecideRule, answers: Readonly<Record<string, DecideAnswerInput>>, combiner: DecideCombiner): number | null;
197
+ export interface DecideRuleOutcome {
198
+ /** `when`, or the combiner's band value when one is pinned. */
199
+ value: Tri;
200
+ outcome: 'allow' | 'refuse' | 'escalate';
201
+ code: 'DECIDE_REFUSED' | 'DECIDE_ESCALATED' | null;
202
+ /** How an escalation reaches a person: the rule's `escalate`, when it is `ask` or `review`. */
203
+ via: 'ask' | 'review' | null;
204
+ /** The combiner's score, when one decided. */
205
+ score: number | null;
206
+ atoms: DecideAtoms;
207
+ }
208
+ /** The atoms of a validated rule's answers, each question through its own band. */
209
+ export declare function decideAtoms(rule: DecideRule, answers: Readonly<Record<string, DecideAnswerInput>>): DecideAtoms;
210
+ /**
211
+ * One rule's outcome: T refuses (`DECIDE_REFUSED`), F allows, U escalates
212
+ * through `escalate` (default `ask`); `escalate: refuse` refuses with
213
+ * `DECIDE_ESCALATED`. `expr` is the rule's parsed `when`
214
+ * ({@link validateDecideRule} returns it).
215
+ */
216
+ export declare function decideRuleOutcome(rule: DecideRule, expr: DecideExpr, answers: Readonly<Record<string, DecideAnswerInput>>, combiner?: DecideCombiner | null): DecideRuleOutcome;
217
+ export interface DecideCandidate {
218
+ ref: string;
219
+ on: 'tool_call' | 'response';
220
+ tools?: readonly string[];
221
+ /** The effective rollout: `enforce` only when every condition for it holds. */
222
+ effective: 'enforce' | 'shadow';
223
+ }
224
+ export interface DecideSelection<C extends DecideCandidate = DecideCandidate> {
225
+ /** At most {@link DECIDE_MAX_RULES_PER_CALL}, enforce first, then in snapshot order. */
226
+ evaluate: C[];
227
+ /** Shadow rules past the limit: not evaluated, logged. */
228
+ skipped: C[];
229
+ /** Set when an enforce rule is past the limit: the call refuses `GOVERNANCE_UNAVAILABLE` before any engine call. */
230
+ unavailable: string | null;
231
+ }
232
+ /**
233
+ * The rules a tool call asks. `candidates` are in snapshot order (SOP order,
234
+ * then line order). A rule matches when it is `on: tool_call` and names the
235
+ * tool exactly.
236
+ */
237
+ export declare function selectDecideRules<C extends DecideCandidate>(candidates: readonly C[], tool: string): DecideSelection<C>;
238
+ /** One evaluated rule's result. `unavailable`: the engine could not answer (an error, a timeout, a failed canary). */
239
+ export interface DecideRuleResult {
240
+ ref: string;
241
+ effective: 'enforce' | 'shadow';
242
+ outcome: 'allow' | 'refuse' | 'escalate' | 'unavailable';
243
+ code?: 'DECIDE_REFUSED' | 'DECIDE_ESCALATED' | null;
244
+ via?: 'ask' | 'review' | null;
245
+ }
246
+ export interface DecideCallOutcome {
247
+ outcome: 'allow' | 'refuse' | 'escalate';
248
+ code: 'DECIDE_REFUSED' | 'DECIDE_ESCALATED' | 'GOVERNANCE_UNAVAILABLE' | null;
249
+ ruleRef: string | null;
250
+ via: 'ask' | 'review' | null;
251
+ reason: string | null;
252
+ }
253
+ /**
254
+ * The call's outcome from its rules' results, in evaluation order. Only
255
+ * enforce rules count: the first that refuses (or whose engine was
256
+ * unavailable, `GOVERNANCE_UNAVAILABLE`) refuses the call; otherwise the
257
+ * first that escalates escalates it; otherwise the call is allowed. Shadow
258
+ * results never change the call.
259
+ */
260
+ export declare function decideCallOutcome(selection: Pick<DecideSelection, 'unavailable'>, results: readonly DecideRuleResult[]): DecideCallOutcome;
261
+ /**
262
+ * This module as JavaScript source, for the hook gates to embed: every
263
+ * constant, the parser's error class and every function above, in a scope of
264
+ * the gate's choosing. A test holds the list to the functions this file
265
+ * declares. A CommonJS build names an exported constant `exports.X` inside a
266
+ * function; the source defines each as a plain `X`, so that prefix is dropped.
267
+ */
268
+ export declare const DECIDE_JS_SOURCE: string;
269
+ //# sourceMappingURL=decide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}