@intutic/cli 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/cli.js +103 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +15 -2
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/decide.d.ts +220 -0
- package/dist/commands/decide.d.ts.map +1 -0
- package/dist/commands/decide.js +1297 -0
- package/dist/commands/decide.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +56 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/gates.d.ts +5 -0
- package/dist/commands/gates.d.ts.map +1 -1
- package/dist/commands/gates.js +42 -1
- package/dist/commands/gates.js.map +1 -1
- package/dist/commands/judge.d.ts +21 -1
- package/dist/commands/judge.d.ts.map +1 -1
- package/dist/commands/judge.js +71 -5
- package/dist/commands/judge.js.map +1 -1
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +11 -0
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/skill.d.ts +17 -0
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +172 -7
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/start.d.ts +6 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +31 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/decideBudget.d.ts +40 -0
- package/dist/lib/decideBudget.d.ts.map +1 -0
- package/dist/lib/decideBudget.js +46 -0
- package/dist/lib/decideBudget.js.map +1 -0
- package/dist/lib/decideEval.d.ts +126 -0
- package/dist/lib/decideEval.d.ts.map +1 -0
- package/dist/lib/decideEval.js +412 -0
- package/dist/lib/decideEval.js.map +1 -0
- package/dist/lib/decideLocal.d.ts +84 -0
- package/dist/lib/decideLocal.d.ts.map +1 -0
- package/dist/lib/decideLocal.js +178 -0
- package/dist/lib/decideLocal.js.map +1 -0
- package/dist/lib/decideRules.d.ts +43 -0
- package/dist/lib/decideRules.d.ts.map +1 -0
- package/dist/lib/decideRules.js +104 -0
- package/dist/lib/decideRules.js.map +1 -0
- package/dist/lib/localGates.d.ts +7 -7
- package/dist/lib/localGates.d.ts.map +1 -1
- package/dist/lib/localGates.js +94 -11
- package/dist/lib/localGates.js.map +1 -1
- package/dist/lib/policySnapshot.d.ts +27 -0
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +64 -2
- package/dist/lib/policySnapshot.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where `intutic decide` keeps its machine state, under `~/.intutic/decide/`:
|
|
3
|
+
*
|
|
4
|
+
* - `engine.json` (0600): the engine's url, adapter, model, timeoutMs,
|
|
5
|
+
* parallel and structured, and the per-call p95 `doctor` measured
|
|
6
|
+
* (`q95Ms`). Never the key: `INTUTIC_DECIDE_API_KEY` is read from the
|
|
7
|
+
* environment only, and never written or logged.
|
|
8
|
+
* - `evals/<ruleHash>/<digest>.json`: a pin a passing `decide eval` earned,
|
|
9
|
+
* which the snapshot writer reads; `evals/<ruleHash>/runs/<id>.json`, each
|
|
10
|
+
* run's report; `evals/<ruleHash>/candidates/<digest>.json`, what
|
|
11
|
+
* `decide calibrate` fitted.
|
|
12
|
+
* - `canary.json`, the canary cache; `stats/<ruleHash>.json`, the drift
|
|
13
|
+
* stats; `disabled`, the `decide disable` marker.
|
|
14
|
+
*
|
|
15
|
+
* The decide log is `~/.intutic/logs/decide-YYYY-MM-DD.jsonl`.
|
|
16
|
+
*
|
|
17
|
+
* Every path is computed at call time from the home directory, so a test's
|
|
18
|
+
* HOME applies. Nothing here imports the sync daemon: `decide check` runs
|
|
19
|
+
* on every gated call and its start-up time is the gate's budget.
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
import * as node_fs from 'node:fs';
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
import { join } from 'node:path';
|
|
27
|
+
import { createDecideEngine, DecideEngineError, decideStoredQ95Ms, resolveDecideEngineConfig, } from '@intutic/shared-types';
|
|
28
|
+
export const sha256Hex = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
|
|
29
|
+
export function decideDir() {
|
|
30
|
+
return join(homedir(), '.intutic', 'decide');
|
|
31
|
+
}
|
|
32
|
+
export function engineFile() {
|
|
33
|
+
return join(decideDir(), 'engine.json');
|
|
34
|
+
}
|
|
35
|
+
export function evalsDir(ruleHash) {
|
|
36
|
+
return join(decideDir(), 'evals', ruleHash);
|
|
37
|
+
}
|
|
38
|
+
export function runsDir(ruleHash) {
|
|
39
|
+
return join(evalsDir(ruleHash), 'runs');
|
|
40
|
+
}
|
|
41
|
+
export function candidatesDir(ruleHash) {
|
|
42
|
+
return join(evalsDir(ruleHash), 'candidates');
|
|
43
|
+
}
|
|
44
|
+
export function statsDir() {
|
|
45
|
+
return join(decideDir(), 'stats');
|
|
46
|
+
}
|
|
47
|
+
export function canaryFile() {
|
|
48
|
+
return join(decideDir(), 'canary.json');
|
|
49
|
+
}
|
|
50
|
+
export function disabledFile() {
|
|
51
|
+
return join(decideDir(), 'disabled');
|
|
52
|
+
}
|
|
53
|
+
export function logsDir() {
|
|
54
|
+
return join(homedir(), '.intutic', 'logs');
|
|
55
|
+
}
|
|
56
|
+
/** A model digest as a file name: anything but `[A-Za-z0-9._-]` becomes `-`. */
|
|
57
|
+
export function digestFileName(modelDigest) {
|
|
58
|
+
return `${modelDigest.replace(/[^A-Za-z0-9._-]/g, '-')}.json`;
|
|
59
|
+
}
|
|
60
|
+
/** The fields `engine.json` may hold. The key is never one of them. */
|
|
61
|
+
export const ENGINE_FILE_FIELDS = ['url', 'adapter', 'model', 'timeoutMs', 'parallel', 'structured', 'ollama', 'q95Ms', 'q95MeasuredAt'];
|
|
62
|
+
/** engine.json, parsed, or null when there is none. Throws when it does not parse. */
|
|
63
|
+
export function readEngineFile() {
|
|
64
|
+
let text;
|
|
65
|
+
try {
|
|
66
|
+
text = node_fs.readFileSync(engineFile(), 'utf8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const v = JSON.parse(text);
|
|
72
|
+
if (typeof v !== 'object' || v === null || Array.isArray(v))
|
|
73
|
+
throw new Error(`${engineFile()} must hold a JSON object`);
|
|
74
|
+
return v;
|
|
75
|
+
}
|
|
76
|
+
/** Writes engine.json (0600 in a 0700 directory), keeping only the known fields: a key passed in by mistake is dropped. */
|
|
77
|
+
export function writeEngineFile(values) {
|
|
78
|
+
const kept = {};
|
|
79
|
+
for (const k of ENGINE_FILE_FIELDS)
|
|
80
|
+
if (values[k] !== undefined)
|
|
81
|
+
kept[k] = values[k];
|
|
82
|
+
writeJson(engineFile(), kept);
|
|
83
|
+
}
|
|
84
|
+
/** Writes JSON whole by a rename, mode 0600, its directory 0700. */
|
|
85
|
+
export function writeJson(file, value) {
|
|
86
|
+
const dir = file.replace(/[\\/][^\\/]*$/, '');
|
|
87
|
+
node_fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
88
|
+
const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
89
|
+
node_fs.writeFileSync(tmp, JSON.stringify(value, null, 2) + '\n', { mode: 0o600 });
|
|
90
|
+
node_fs.renameSync(tmp, file);
|
|
91
|
+
}
|
|
92
|
+
export function readJson(file) {
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(node_fs.readFileSync(file, 'utf8'));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** The environment variables the engine configuration reads, and only those. */
|
|
101
|
+
export function decideEnv() {
|
|
102
|
+
return {
|
|
103
|
+
INTUTIC_DECIDE_ENGINE_URL: process.env.INTUTIC_DECIDE_ENGINE_URL,
|
|
104
|
+
INTUTIC_DECIDE_ADAPTER: process.env.INTUTIC_DECIDE_ADAPTER,
|
|
105
|
+
INTUTIC_DECIDE_MODEL: process.env.INTUTIC_DECIDE_MODEL,
|
|
106
|
+
INTUTIC_DECIDE_TIMEOUT_MS: process.env.INTUTIC_DECIDE_TIMEOUT_MS,
|
|
107
|
+
INTUTIC_DECIDE_PARALLEL: process.env.INTUTIC_DECIDE_PARALLEL,
|
|
108
|
+
INTUTIC_DECIDE_API_KEY: process.env.INTUTIC_DECIDE_API_KEY,
|
|
109
|
+
INTUTIC_DECIDE_MODEL_DIGEST: process.env.INTUTIC_DECIDE_MODEL_DIGEST,
|
|
110
|
+
INTUTIC_SELF_HOSTED_DECISION_HOSTS: process.env.INTUTIC_SELF_HOSTED_DECISION_HOSTS,
|
|
111
|
+
INTUTIC_DECIDE_MAX_RESPONSE_STATE_BYTES: process.env.INTUTIC_DECIDE_MAX_RESPONSE_STATE_BYTES,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** The engine engine.json and the environment describe. Never throws. */
|
|
115
|
+
export function loadEngine(env = decideEnv()) {
|
|
116
|
+
let file;
|
|
117
|
+
try {
|
|
118
|
+
file = readEngineFile();
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return { cfg: null, engine: new DecideEngineError('not_configured', err instanceof Error ? err.message : String(err)), q95Ms: null };
|
|
122
|
+
}
|
|
123
|
+
// Read as every gate's decide tier reads it.
|
|
124
|
+
const q95 = decideStoredQ95Ms(file);
|
|
125
|
+
let cfg;
|
|
126
|
+
try {
|
|
127
|
+
cfg = resolveDecideEngineConfig(file, env);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return { cfg: null, engine: err instanceof DecideEngineError ? err : new DecideEngineError('not_configured', String(err)), q95Ms: q95 };
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
return { cfg, engine: createDecideEngine(cfg), q95Ms: q95 };
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
return { cfg, engine: err instanceof DecideEngineError ? err : new DecideEngineError('not_configured', String(err)), q95Ms: q95 };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** `host:port` of an engine URL, for logs; never its path, query or credentials. */
|
|
140
|
+
export function engineHost(url) {
|
|
141
|
+
try {
|
|
142
|
+
const u = new URL(url);
|
|
143
|
+
return u.port ? `${u.hostname}:${u.port}` : u.hostname;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return '';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* What 3.0 does not do with a readable rule as written, one sentence each,
|
|
151
|
+
* for `decide lint`, `gates install` and `doctor`:
|
|
152
|
+
*
|
|
153
|
+
* - `context: ["last_user_turn"]`: reserved. No gate supplies the user's last
|
|
154
|
+
* turn, so the rule is asked without one, and `decide test` and
|
|
155
|
+
* `decide eval` ask it the same way so the eval measures what a gate asks.
|
|
156
|
+
*
|
|
157
|
+
* An `on: response` rule is carried out: the gateway judges each complete
|
|
158
|
+
* response by it.
|
|
159
|
+
*/
|
|
160
|
+
export function decideRuleNotes(rule) {
|
|
161
|
+
const out = [];
|
|
162
|
+
if ((rule.context ?? []).includes('last_user_turn')) {
|
|
163
|
+
out.push(`decide rule ${rule.id} declares context: ["last_user_turn"], which is reserved and not supplied in 3.0: ` +
|
|
164
|
+
'no gate passes the user\'s last turn, so the rule is asked without it (in `decide test` and `decide eval` too)');
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
/** The drift baseline of a stored eval run, or null. */
|
|
169
|
+
export function readEvalRunBaseline(ruleHash, evalRunId) {
|
|
170
|
+
if (!/^[A-Za-z0-9._-]+$/.test(evalRunId))
|
|
171
|
+
return null;
|
|
172
|
+
const run = readJson(join(runsDir(ruleHash), `${evalRunId}.json`));
|
|
173
|
+
const b = run?.baseline;
|
|
174
|
+
if (!b || typeof b.escalationRate !== 'number' || typeof b.questions !== 'object' || b.questions === null)
|
|
175
|
+
return null;
|
|
176
|
+
return b;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=decideLocal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decideLocal.js","sourceRoot":"","sources":["../../src/lib/decideLocal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The local SOPs' `decide:` rules as `intutic decide` sees them: each line
|
|
3
|
+
* with its file and line number, parsed as the snapshot writer parses it
|
|
4
|
+
* (`localDecideRules`), and the snapshot rewritten after a pin or the
|
|
5
|
+
* disable marker changes.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { type DecideDecl } from '@intutic/shared-types';
|
|
10
|
+
export interface LocalDecideLine {
|
|
11
|
+
sopId: string;
|
|
12
|
+
/** `.intutic/sops/<file>` or `.intutic/sops/<folder>/<file>`. */
|
|
13
|
+
file: string;
|
|
14
|
+
/** 1-based line number in the file. */
|
|
15
|
+
line: number;
|
|
16
|
+
sopTitle: string;
|
|
17
|
+
ruleText: string;
|
|
18
|
+
decl: DecideDecl;
|
|
19
|
+
/** `<sopId>#<id>` for a readable rule. */
|
|
20
|
+
ref: string | null;
|
|
21
|
+
ruleHash: string | null;
|
|
22
|
+
}
|
|
23
|
+
/** The workspace the decide commands read: the recorded one, else the current directory. */
|
|
24
|
+
export declare function decideWorkspaceRoot(override?: string): string;
|
|
25
|
+
/** Every local SOP's `decide:` lines, in snapshot order, each parsed with its SOP's other lines. */
|
|
26
|
+
export declare function loadLocalDecideLines(root: string): Promise<LocalDecideLine[]>;
|
|
27
|
+
/**
|
|
28
|
+
* The rule `spec` names: its ref (`local:data.md#prod-data-export`), its id
|
|
29
|
+
* when only one local rule has it, or `<file>#<id>` / `<file>` for a SOP
|
|
30
|
+
* file with one rule. Throws a message for the user otherwise.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findDecideRule(lines: readonly LocalDecideLine[], spec: string): LocalDecideLine & {
|
|
33
|
+
decl: Extract<DecideDecl, {
|
|
34
|
+
kind: 'rule';
|
|
35
|
+
}>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Writes the policy snapshot again so a changed pin or the disable marker
|
|
39
|
+
* applies now: the local snapshot (`intutic gates install`'s) is rewritten
|
|
40
|
+
* here; a connected machine's sync daemon rewrites its own on its next poll.
|
|
41
|
+
*/
|
|
42
|
+
export declare function rewriteDecideSnapshot(): Promise<'local' | 'connected' | 'none'>;
|
|
43
|
+
//# sourceMappingURL=decideRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decideRules.d.ts","sourceRoot":"","sources":["../../src/lib/decideRules.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAKL,KAAK,UAAU,EAEhB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7D;AAMD,oGAAoG;AACpG,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA4BnF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAgBjJ;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC,CAcrF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The local SOPs' `decide:` rules as `intutic decide` sees them: each line
|
|
3
|
+
* with its file and line number, parsed as the snapshot writer parses it
|
|
4
|
+
* (`localDecideRules`), and the snapshot rewritten after a pin or the
|
|
5
|
+
* disable marker changes.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import * as node_path from 'node:path';
|
|
10
|
+
import { decideRuleHash, decideRuleRef, parseDecideLines, splitFrontMatter, } from '@intutic/shared-types';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { loadLocalSopEntries, localDecideRules, localHoldTokensFor, writeLocalPolicySnapshot } from '@intutic/sync-daemon';
|
|
13
|
+
import { loadConfig, loadCredentials } from '../config/store.js';
|
|
14
|
+
import { decideDir, sha256Hex } from './decideLocal.js';
|
|
15
|
+
import { gatesSource } from './localGates.js';
|
|
16
|
+
/** The workspace the decide commands read: the recorded one, else the current directory. */
|
|
17
|
+
export function decideWorkspaceRoot(override) {
|
|
18
|
+
if (override)
|
|
19
|
+
return node_path.resolve(override);
|
|
20
|
+
return loadConfig()?.workspaceRoot ?? process.cwd();
|
|
21
|
+
}
|
|
22
|
+
function sopFile(sopId) {
|
|
23
|
+
return `.intutic/sops/${sopId.replace(/^local:/, '').replace(':', '/')}`;
|
|
24
|
+
}
|
|
25
|
+
/** Every local SOP's `decide:` lines, in snapshot order, each parsed with its SOP's other lines. */
|
|
26
|
+
export async function loadLocalDecideLines(root) {
|
|
27
|
+
const entries = await loadLocalSopEntries(root, [], { ignoreSelection: true });
|
|
28
|
+
const served = await localDecideRules(entries, { decideDir: decideDir() });
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const { front } = splitFrontMatter(entry.content);
|
|
32
|
+
const numbered = front
|
|
33
|
+
.split('\n')
|
|
34
|
+
.map((l, k) => ({ text: l.trim(), line: k + 1 }))
|
|
35
|
+
.filter((l) => l.text.startsWith('decide:'));
|
|
36
|
+
if (numbered.length === 0)
|
|
37
|
+
continue;
|
|
38
|
+
const mine = served.filter((s) => s.sopId === entry.sopId);
|
|
39
|
+
const decls = parseDecideLines(numbered.map((l) => l.text.slice('decide:'.length)));
|
|
40
|
+
decls.forEach((decl, i) => {
|
|
41
|
+
const s = mine[i];
|
|
42
|
+
out.push({
|
|
43
|
+
sopId: entry.sopId,
|
|
44
|
+
file: sopFile(entry.sopId),
|
|
45
|
+
line: numbered[i].line,
|
|
46
|
+
sopTitle: s?.sopTitle ?? entry.title,
|
|
47
|
+
ruleText: s?.ruleText ?? '',
|
|
48
|
+
decl,
|
|
49
|
+
ref: decl.kind === 'rule' ? decideRuleRef(entry.sopId, decl.rule.id) : null,
|
|
50
|
+
ruleHash: decl.kind === 'rule' ? decideRuleHash(decl.rule, sha256Hex) : null,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The rule `spec` names: its ref (`local:data.md#prod-data-export`), its id
|
|
58
|
+
* when only one local rule has it, or `<file>#<id>` / `<file>` for a SOP
|
|
59
|
+
* file with one rule. Throws a message for the user otherwise.
|
|
60
|
+
*/
|
|
61
|
+
export function findDecideRule(lines, spec) {
|
|
62
|
+
const readable = lines.filter((l) => l.decl.kind === 'rule');
|
|
63
|
+
let hits = readable.filter((l) => l.ref === spec);
|
|
64
|
+
if (hits.length === 0)
|
|
65
|
+
hits = readable.filter((l) => l.decl.rule.id === spec);
|
|
66
|
+
if (hits.length === 0) {
|
|
67
|
+
const [file, id] = spec.split('#');
|
|
68
|
+
const base = node_path.basename(file);
|
|
69
|
+
hits = readable.filter((l) => (l.file === file || l.file.endsWith(`/${file}`) || node_path.basename(l.file) === base) && (id === undefined || l.decl.rule.id === id));
|
|
70
|
+
}
|
|
71
|
+
if (hits.length === 1)
|
|
72
|
+
return hits[0];
|
|
73
|
+
if (hits.length === 0) {
|
|
74
|
+
const broken = lines.find((l) => l.decl.kind === 'unreadable' && (l.decl.id === spec || spec.endsWith(`#${l.decl.id}`)));
|
|
75
|
+
if (broken && broken.decl.kind === 'unreadable')
|
|
76
|
+
throw new Error(`${broken.file}:${broken.line}: ${broken.decl.error}`);
|
|
77
|
+
throw new Error(`No local decide rule named ${spec}. \`intutic decide lint\` lists them.`);
|
|
78
|
+
}
|
|
79
|
+
throw new Error(`${spec} names ${hits.length} rules: use one of ${hits.map((h) => h.ref).join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Writes the policy snapshot again so a changed pin or the disable marker
|
|
83
|
+
* applies now: the local snapshot (`intutic gates install`'s) is rewritten
|
|
84
|
+
* here; a connected machine's sync daemon rewrites its own on its next poll.
|
|
85
|
+
*/
|
|
86
|
+
export async function rewriteDecideSnapshot() {
|
|
87
|
+
if ((await loadCredentials()) !== null)
|
|
88
|
+
return 'connected';
|
|
89
|
+
if ((await gatesSource()) !== 'local')
|
|
90
|
+
return 'none';
|
|
91
|
+
const config = loadConfig();
|
|
92
|
+
if (!config)
|
|
93
|
+
return 'none';
|
|
94
|
+
const disconnected = new Set(config.disconnectedHarnesses ?? []);
|
|
95
|
+
const harnesses = config.harnesses.filter((h) => !disconnected.has(h));
|
|
96
|
+
const root = config.workspaceRoot;
|
|
97
|
+
const holdTokens = await localHoldTokensFor(root, [], undefined, harnesses);
|
|
98
|
+
const localSops = await loadLocalSopEntries(root, harnesses, { ignoreSelection: true });
|
|
99
|
+
const decideRules = await localDecideRules(localSops, { decideDir: decideDir() });
|
|
100
|
+
// The rule records and lane holds the snapshot carries beside the decide rules.
|
|
101
|
+
await writeLocalPolicySnapshot({ localHoldTokens: holdTokens, snapshotDir: node_path.join(homedir(), '.intutic', 'hooks'), decideRules, localSops });
|
|
102
|
+
return 'local';
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=decideRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decideRules.js","sourceRoot":"","sources":["../../src/lib/decideRules.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/localGates.d.ts
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* `intutic gates install` writes, and `intutic start` refreshes.
|
|
4
4
|
*
|
|
5
5
|
* The same writers `intutic connect` runs, fed from this machine only: the
|
|
6
|
-
* local `.intutic/sops` for the rules files
|
|
7
|
-
* and a policy snapshot compiled from no workspace
|
|
8
|
-
* (`writeLocalPolicySnapshot`), which still carries the
|
|
9
|
-
* and skill tiers. Nothing here fetches, drains or
|
|
10
|
-
* wrapped and no file is made immutable. The
|
|
11
|
-
* pointed at the local proxy only with `routing`,
|
|
12
|
-
* proxy that is not running stops working.
|
|
6
|
+
* local `.intutic/sops` for the rules files, the `review_before:` tokens and
|
|
7
|
+
* the `decide:` rules, and a policy snapshot compiled from no workspace
|
|
8
|
+
* policy (`writeLocalPolicySnapshot`), which still carries the
|
|
9
|
+
* destructive-command and skill tiers. Nothing here fetches, drains or
|
|
10
|
+
* reports; no MCP server is wrapped and no file is made immutable. The
|
|
11
|
+
* harnesses' LLM traffic is pointed at the local proxy only with `routing`,
|
|
12
|
+
* since a harness routed at a proxy that is not running stops working.
|
|
13
13
|
*
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localGates.d.ts","sourceRoot":"","sources":["../../src/lib/localGates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"localGates.d.ts","sourceRoot":"","sources":["../../src/lib/localGates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,uBAAuB,CAAA;AAqBnE,gGAAgG;AAChG,eAAO,MAAM,wBAAwB,QAAmB,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yBAAyB;IACzB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;IACd,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,wEAAwE;IACxE,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,0DAA0D;IAC1D,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,CAYzE;AAED,qEAAqE;AACrE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE5D;AAqFD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgF1F"}
|
package/dist/lib/localGates.js
CHANGED
|
@@ -3,25 +3,26 @@
|
|
|
3
3
|
* `intutic gates install` writes, and `intutic start` refreshes.
|
|
4
4
|
*
|
|
5
5
|
* The same writers `intutic connect` runs, fed from this machine only: the
|
|
6
|
-
* local `.intutic/sops` for the rules files
|
|
7
|
-
* and a policy snapshot compiled from no workspace
|
|
8
|
-
* (`writeLocalPolicySnapshot`), which still carries the
|
|
9
|
-
* and skill tiers. Nothing here fetches, drains or
|
|
10
|
-
* wrapped and no file is made immutable. The
|
|
11
|
-
* pointed at the local proxy only with `routing`,
|
|
12
|
-
* proxy that is not running stops working.
|
|
6
|
+
* local `.intutic/sops` for the rules files, the `review_before:` tokens and
|
|
7
|
+
* the `decide:` rules, and a policy snapshot compiled from no workspace
|
|
8
|
+
* policy (`writeLocalPolicySnapshot`), which still carries the
|
|
9
|
+
* destructive-command and skill tiers. Nothing here fetches, drains or
|
|
10
|
+
* reports; no MCP server is wrapped and no file is made immutable. The
|
|
11
|
+
* harnesses' LLM traffic is pointed at the local proxy only with `routing`,
|
|
12
|
+
* since a harness routed at a proxy that is not running stops working.
|
|
13
13
|
*
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
16
16
|
import * as node_fs from 'node:fs/promises';
|
|
17
17
|
import * as node_path from 'node:path';
|
|
18
18
|
import { homedir } from 'node:os';
|
|
19
|
-
import { gateKindForHarness, HarnessType } from '@intutic/shared-types';
|
|
20
|
-
import { buildSnapshotRules, findGateFile, loadLocalSopEntries, localHoldTokensFor, localResolvedPolicy, noteProxyUrl, SNAPSHOT_JSON, SNAPSHOT_RULES, updatePreToolUseHooks, writeLocalPolicySnapshot, writeRuntimeEnv, } from '@intutic/sync-daemon';
|
|
19
|
+
import { DECIDE_MAX_RULES_PER_CALL, gateKindForHarness, HarnessType, parseDecideLines, parseFrontMatterEnforcing, splitFrontMatter } from '@intutic/shared-types';
|
|
20
|
+
import { buildSnapshotRules, findGateFile, loadLocalSopEntries, localDecideRules, localHoldTokensFor, localResolvedPolicy, noteProxyUrl, SNAPSHOT_JSON, SNAPSHOT_RULES, updatePreToolUseHooks, writeLocalPolicySnapshot, writeRuntimeEnv, } from '@intutic/sync-daemon';
|
|
21
21
|
import { getAdapter } from '../harness/detector.js';
|
|
22
22
|
import { writeHarnessConfigs } from '../harness/writeHarnessConfigs.js';
|
|
23
23
|
import { loadCredentials } from '../config/store.js';
|
|
24
24
|
import { localProxyPort } from './localProxy.js';
|
|
25
|
+
import { decideRuleNotes } from './decideLocal.js';
|
|
25
26
|
/** The hook events log is rotated past this size; nothing drains it without a control plane. */
|
|
26
27
|
export const HOOK_EVENTS_ROTATE_BYTES = 10 * 1024 * 1024;
|
|
27
28
|
function snapshotDir() {
|
|
@@ -75,6 +76,70 @@ async function rotateHookEvents(workspaceRoot, dryRun) {
|
|
|
75
76
|
await node_fs.rename(log, `${log}.1`);
|
|
76
77
|
return `${log}.1`;
|
|
77
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* One warning per `decide:` line that does not read, naming its SOP file and
|
|
81
|
+
* line number. The snapshot refuses the tools such a line names until it is
|
|
82
|
+
* fixed. A bare or non-JSON line gets the one-rule-per-line hint.
|
|
83
|
+
*/
|
|
84
|
+
function unreadableDecideLines(entries) {
|
|
85
|
+
const out = [];
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
const numbered = splitFrontMatter(entry.content)
|
|
88
|
+
.front.split('\n')
|
|
89
|
+
.map((l, k) => ({ text: l.trim(), line: k + 1 }))
|
|
90
|
+
.filter((l) => l.text.startsWith('decide:'));
|
|
91
|
+
if (numbered.length === 0)
|
|
92
|
+
continue;
|
|
93
|
+
const file = `.intutic/sops/${entry.sopId.replace(/^local:/, '').replace(':', '/')}`;
|
|
94
|
+
parseDecideLines(numbered.map((l) => l.text.slice('decide:'.length))).forEach((d, i) => {
|
|
95
|
+
if (d.kind === 'unreadable')
|
|
96
|
+
out.push(`${file}:${numbered[i].line}: decide line ${i + 1} does not read, so its tools are refused: ${d.error}`);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* One warning per readable `decide:` rule 3.0 does not carry out as written
|
|
103
|
+
* (`decideRuleNotes`: a reserved `context`), naming its SOP file and line
|
|
104
|
+
* number.
|
|
105
|
+
*/
|
|
106
|
+
function notedDecideRules(entries) {
|
|
107
|
+
const out = [];
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const numbered = splitFrontMatter(entry.content)
|
|
110
|
+
.front.split('\n')
|
|
111
|
+
.map((l, k) => ({ text: l.trim(), line: k + 1 }))
|
|
112
|
+
.filter((l) => l.text.startsWith('decide:'));
|
|
113
|
+
if (numbered.length === 0)
|
|
114
|
+
continue;
|
|
115
|
+
const file = `.intutic/sops/${entry.sopId.replace(/^local:/, '').replace(':', '/')}`;
|
|
116
|
+
parseDecideLines(numbered.map((l) => l.text.slice('decide:'.length))).forEach((d, i) => {
|
|
117
|
+
if (d.kind === 'rule')
|
|
118
|
+
for (const note of decideRuleNotes(d.rule))
|
|
119
|
+
out.push(`${file}:${numbered[i].line}: ${note}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
/** Tools more than {@link DECIDE_MAX_RULES_PER_CALL} local decide rules name: a call evaluates only that many. */
|
|
125
|
+
function crowdedDecideTools(entries) {
|
|
126
|
+
const byTool = new Map();
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
const values = splitFrontMatter(entry.content)
|
|
129
|
+
.front.split('\n')
|
|
130
|
+
.map((l) => l.trim())
|
|
131
|
+
.filter((l) => l.startsWith('decide:'))
|
|
132
|
+
.map((l) => l.slice('decide:'.length));
|
|
133
|
+
for (const d of parseDecideLines(values)) {
|
|
134
|
+
if (d.kind === 'rule' && d.rule.on === 'tool_call')
|
|
135
|
+
for (const t of new Set(d.rule.tools ?? []))
|
|
136
|
+
byTool.set(t, (byTool.get(t) ?? 0) + 1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return [...byTool]
|
|
140
|
+
.filter(([, n]) => n > DECIDE_MAX_RULES_PER_CALL)
|
|
141
|
+
.map(([tool, n]) => `${n} decide rules name ${tool}; a call evaluates at most ${DECIDE_MAX_RULES_PER_CALL}, and an enforcing rule past that refuses the call`);
|
|
142
|
+
}
|
|
78
143
|
/**
|
|
79
144
|
* Writes (or with `dryRun`, reports) the local gates. See the module note for
|
|
80
145
|
* what it does not do.
|
|
@@ -93,12 +158,30 @@ export async function installLocalGates(opts) {
|
|
|
93
158
|
onError: (err) => warn(`Could not read every local SOP in .intutic/sops; the rules files are written without the ones that failed: ${err instanceof Error ? err.message : String(err)}`),
|
|
94
159
|
});
|
|
95
160
|
const holdTokens = await localHoldTokensFor(root, [], undefined, harnesses);
|
|
161
|
+
// Every local SOP's decide: rules, whatever the session selected, as for
|
|
162
|
+
// the holds: the selection narrows the rules files, never what is enforced.
|
|
163
|
+
const allSops = await loadLocalSopEntries(root, harnesses, { ignoreSelection: true });
|
|
164
|
+
const decideRules = await localDecideRules(allSops, { decideDir: node_path.join(homedir(), '.intutic', 'decide') });
|
|
165
|
+
for (const line of [...unreadableDecideLines(allSops), ...notedDecideRules(allSops), ...crowdedDecideTools(allSops)])
|
|
166
|
+
warn(line);
|
|
167
|
+
// Every local SOP's rule records and lane holds: qualified
|
|
168
|
+
// requires_before, scope_paths_mode: enforce, plan_approval:, closed_lanes:.
|
|
169
|
+
// With no control plane, plan_approval: refuses every call that is not a
|
|
170
|
+
// read (no plan can be approved), and a lane hold refuses rather than holds.
|
|
171
|
+
for (const entry of allSops) {
|
|
172
|
+
// An enforcing plan_approval record compiles from a SOP with no roles:,
|
|
173
|
+
// not in mode: shadow (compileSopGateRecords, @intutic/shared-types).
|
|
174
|
+
const fm = parseFrontMatterEnforcing(splitFrontMatter(entry.content).front);
|
|
175
|
+
if (fm.planApproval !== null && fm.roles.length === 0 && fm.mode !== 'shadow') {
|
|
176
|
+
warn(`${entry.sopId} sets plan_approval:, and with no control plane no plan can be approved: every gated call that is not a read is refused (PLAN_NOT_APPROVED). Remove it, or connect a workspace.`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
96
179
|
let snapshot;
|
|
97
180
|
if (dryRun) {
|
|
98
|
-
snapshot = { digest: '', ruleCount: buildSnapshotRules(localResolvedPolicy(), holdTokens, 'block').length };
|
|
181
|
+
snapshot = { digest: '', ruleCount: buildSnapshotRules({ ...localResolvedPolicy(), decideRules }, holdTokens, 'block', allSops).length };
|
|
99
182
|
}
|
|
100
183
|
else {
|
|
101
|
-
snapshot = await writeLocalPolicySnapshot({ localHoldTokens: holdTokens, snapshotDir: snapshotDir() });
|
|
184
|
+
snapshot = await writeLocalPolicySnapshot({ localHoldTokens: holdTokens, snapshotDir: snapshotDir(), decideRules, localSops: allSops });
|
|
102
185
|
}
|
|
103
186
|
files.push(node_path.join(snapshotDir(), SNAPSHOT_RULES), node_path.join(snapshotDir(), SNAPSHOT_JSON));
|
|
104
187
|
if (dryRun) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localGates.js","sourceRoot":"","sources":["../../src/lib/localGates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"localGates.js","sourceRoot":"","sources":["../../src/lib/localGates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAEjK,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,GAChB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,gGAAgG;AAChG,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAiCxD,SAAS,WAAW;IAClB,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAA;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,CAAC,MAAM,WAAW,EAAE,CAAC,KAAK,OAAO,CAAA;AAC1C,CAAC;AAED,iHAAiH;AACjH,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,+FAA+F;AAC/F,KAAK,UAAU,gBAAgB,CAAC,aAAqB,EAAE,MAAe;IACpE,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAA;IACpF,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,wBAAwB;YAAE,OAAO,IAAI,CAAA;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAA;IAClD,OAAO,GAAG,GAAG,IAAI,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,OAAgC;IAC7D,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;aAC7C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACnC,MAAM,IAAI,GAAG,iBAAiB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;QACpF,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrF,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACjJ,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;aAC7C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACnC,MAAM,IAAI,GAAG,iBAAiB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;QACpF,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrF,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAA;QACtH,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,kHAAkH;AAClH,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;aAC3C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACxC,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,WAAW;gBAAE,KAAK,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC;SACf,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,yBAAyB,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,sBAAsB,IAAI,8BAA8B,yBAAyB,oDAAoD,CAAC,CAAA;AAClK,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAuB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAA;IAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,oBAAoB,cAAc,EAAE,EAAE,CAAA;IACvD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,SAA0B,EAAE;QACvE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,8GAA8G,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;KACzK,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,SAA0B,CAAC,CAAA;IAC5F,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,SAA0B,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;IACtG,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnH,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEhI,2DAA2D;IAC3D,6EAA6E;IAC7E,yEAAyE;IACzE,6EAA6E;IAC7E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,EAAE,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAA;QAC3E,IAAI,EAAE,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9E,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,iLAAiL,CAAC,CAAA;QACvM,CAAC;IACH,CAAC;IACD,IAAI,QAA+C,CAAA;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,GAAG,mBAAmB,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;IAC1I,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IACzI,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;IAEvG,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,CAAA;YAC1C,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAgB,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC1H,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC9C,MAAM,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;YAChE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;QAC7D,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;IACvI,CAAC;IAED,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,CAAA;IACzE,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,MAAM;YAAE,MAAM,eAAe,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;QAC7G,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACxB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEhC,MAAM,KAAK,GAAgB,EAAE,CAAA;IAC7B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAsB,CAAC,CAAA;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACvG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;AAC9E,CAAC"}
|
|
@@ -56,6 +56,25 @@ export interface PolicySnapshotHealth {
|
|
|
56
56
|
ruleCount: number;
|
|
57
57
|
/** Rules dropped because their regex would not compile. */
|
|
58
58
|
droppedRules: number;
|
|
59
|
+
/** The format its `@format` record names; 1 without one. */
|
|
60
|
+
formatVersion: number;
|
|
61
|
+
/**
|
|
62
|
+
* Decide rules whose `@decide` records decode, as the gates read them. Each
|
|
63
|
+
* one's fallback line is left out of {@link ruleCount} only when the gates
|
|
64
|
+
* evaluate decide rules ({@link CAN_EVALUATE_DECIDE}). 0 on `invalid`.
|
|
65
|
+
*/
|
|
66
|
+
decideRules: number;
|
|
67
|
+
/**
|
|
68
|
+
* Rule records (`@rule`) that decode, as the gates read them. The
|
|
69
|
+
* fallback line each enforcing one names is left out of {@link ruleCount}:
|
|
70
|
+
* every v23 hook gate evaluates the record instead. 0 on `invalid`.
|
|
71
|
+
*/
|
|
72
|
+
gateRules: number;
|
|
73
|
+
/**
|
|
74
|
+
* Whether a `plan_approval:` record is in force: every call waits for an
|
|
75
|
+
* approved plan, which only a control plane can hold.
|
|
76
|
+
*/
|
|
77
|
+
planApproval: boolean;
|
|
59
78
|
/** Where the snapshot was looked for. */
|
|
60
79
|
path: string;
|
|
61
80
|
}
|
|
@@ -68,6 +87,14 @@ export interface PolicySnapshotHealth {
|
|
|
68
87
|
* doctor inspect a directory nothing writes to and report every snapshot absent.
|
|
69
88
|
*/
|
|
70
89
|
export declare function resolveSnapshotRulesPath(): string;
|
|
90
|
+
/**
|
|
91
|
+
* Whether the gates this reports on, and this CLI, evaluate the decide rules
|
|
92
|
+
* a snapshot carries. They do: every gate family evaluates them (the shell
|
|
93
|
+
* and n8n gates through `intutic decide check`), so a fallback line a decoded
|
|
94
|
+
* record names is skipped by the gates and not counted as a rule here. A
|
|
95
|
+
* fallback line no decoded record names still refuses, and is counted.
|
|
96
|
+
*/
|
|
97
|
+
export declare const CAN_EVALUATE_DECIDE = true;
|
|
71
98
|
/**
|
|
72
99
|
* Classify snapshot text exactly as `intuticLoadSnapshot` does.
|
|
73
100
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policySnapshot.d.ts","sourceRoot":"","sources":["../../src/lib/policySnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;
|
|
1
|
+
{"version":3,"file":"policySnapshot.d.ts","sourceRoot":"","sources":["../../src/lib/policySnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAkBH;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,0BAA0B,CAAA;AAE1D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;AAE3E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAA;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAA;IACrB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAQvC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACrE,oBAAoB,CAgItB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GACtD,oBAAoB,CAsBtB"}
|