@intutic/cli 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.
- 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
package/dist/commands/judge.js
CHANGED
|
@@ -7,8 +7,15 @@
|
|
|
7
7
|
* hosted provider (`isHostedModelRef`) is refused.
|
|
8
8
|
*
|
|
9
9
|
* Deliberately local-artifacts-only: it writes a `litellm_config.yaml` and
|
|
10
|
+
* the decide engine's configuration (`~/.intutic/decide/engine.json`), and
|
|
10
11
|
* prints env / Helm snippets for the operator to apply themselves. It never
|
|
11
|
-
* calls a remote API to flip anything on.
|
|
12
|
+
* calls a remote API to flip anything on.
|
|
13
|
+
*
|
|
14
|
+
* The gateway variables it prints are deprecated since 3.0: the gateway maps
|
|
15
|
+
* the typed band to the decide rule `local-judge` with a warning, and 4.0
|
|
16
|
+
* removes them. engine.json is where 3.0 keeps the model a decide rule asks
|
|
17
|
+
* (`--engine-url`, default Ollama on this machine); its key stays in
|
|
18
|
+
* `INTUTIC_DECIDE_API_KEY` and is never written. `local_judge` is deliberately NOT
|
|
12
19
|
* exposed through `PATCH /api/v1/gateways/:id/config`
|
|
13
20
|
* (`services/control-plane/src/lib/gateway.ts`) — this command respects that
|
|
14
21
|
* boundary by construction, not by omission.
|
|
@@ -20,11 +27,55 @@
|
|
|
20
27
|
*
|
|
21
28
|
* @module
|
|
22
29
|
*/
|
|
23
|
-
import { writeFileSync } from 'node:fs';
|
|
24
|
-
import {
|
|
30
|
+
import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
31
|
+
import { homedir } from 'node:os';
|
|
32
|
+
import { dirname, join, resolve } from 'node:path';
|
|
25
33
|
import pc from 'picocolors';
|
|
26
|
-
import { selfHostedJudgeModelChoices, isHostedModelRef, SELF_HOSTED_MODEL_PROVIDER_IDS, findCatalogModel, normalizeModelRef, } from '@intutic/shared-types';
|
|
34
|
+
import { checkSelfHostedDecisionHost, DECIDE_DEFAULT_ENGINE_URL, DECIDE_ENGINE_FILE_PATH, resolveDecideEngineConfig, selfHostedJudgeModelChoices, isHostedModelRef, SELF_HOSTED_MODEL_PROVIDER_IDS, findCatalogModel, normalizeModelRef, } from '@intutic/shared-types';
|
|
27
35
|
import { createClackIO } from './setup.js';
|
|
36
|
+
/** The gateway variables the env block prints, all deprecated since 3.0. */
|
|
37
|
+
export const DEPRECATED_JUDGE_ENV = [
|
|
38
|
+
'INTUTIC_GATEWAY_LOCAL_JUDGE',
|
|
39
|
+
'LITELLM_LOCAL_URL',
|
|
40
|
+
'LITELLM_LOCAL_API_KEY',
|
|
41
|
+
'LITELLM_LOCAL_JUDGE_MODEL',
|
|
42
|
+
'LITELLM_LOCAL_TYPED_JUDGE_MODEL',
|
|
43
|
+
'INTUTIC_GATEWAY_LOCAL_JUDGE_TYPED_LO',
|
|
44
|
+
'INTUTIC_GATEWAY_LOCAL_JUDGE_TYPED_HI',
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Writes the decide engine's configuration to `file` (mode 0600 in a 0700
|
|
48
|
+
* directory, replaced whole by a rename): `url`, `adapter`, `model`,
|
|
49
|
+
* `timeoutMs`, `parallel` and `structured`. Other keys an existing file holds
|
|
50
|
+
* are kept. Never the key, which is environment only.
|
|
51
|
+
*/
|
|
52
|
+
export function writeDecideEngineFile(file, url, model) {
|
|
53
|
+
let existing = {};
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(readFileSync(file, 'utf-8'));
|
|
56
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
57
|
+
existing = parsed;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// No file, or one that does not parse: start afresh.
|
|
61
|
+
}
|
|
62
|
+
const cfg = resolveDecideEngineConfig({ url, adapter: 'logprobs', model }, {});
|
|
63
|
+
const doc = {
|
|
64
|
+
...existing,
|
|
65
|
+
url: cfg.url,
|
|
66
|
+
adapter: cfg.adapter,
|
|
67
|
+
model: cfg.model,
|
|
68
|
+
timeoutMs: cfg.timeoutMs,
|
|
69
|
+
parallel: cfg.parallel,
|
|
70
|
+
structured: cfg.structured,
|
|
71
|
+
};
|
|
72
|
+
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
73
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
74
|
+
writeFileSync(tmp, JSON.stringify(doc, null, 2) + '\n', { mode: 0o600 });
|
|
75
|
+
chmodSync(tmp, 0o600);
|
|
76
|
+
renameSync(tmp, file);
|
|
77
|
+
return doc;
|
|
78
|
+
}
|
|
28
79
|
/** Printed instead of paths into Intutic's own source tree, which customers do not have. */
|
|
29
80
|
const ON_PREM_JUDGE_DOCS = 'https://docs.intutic.ai/external/on-prem-judge';
|
|
30
81
|
/**
|
|
@@ -61,7 +112,8 @@ export function buildLiteLLMConfigYaml(modelRef) {
|
|
|
61
112
|
}
|
|
62
113
|
function envBlock(modelAlias) {
|
|
63
114
|
return [
|
|
64
|
-
"# The gateway's .env (beside docker-compose.gateway.yml in the release bundle) or your own env file
|
|
115
|
+
"# The gateway's .env (beside docker-compose.gateway.yml in the release bundle) or your own env file.",
|
|
116
|
+
'# Deprecated since 3.0 and removed in 4.0; the gateway maps them to the decide rule local-judge:',
|
|
65
117
|
'INTUTIC_GATEWAY_LOCAL_JUDGE=true',
|
|
66
118
|
'LITELLM_LOCAL_URL=http://litellm:4000',
|
|
67
119
|
'LITELLM_LOCAL_API_KEY=${LITELLM_MASTER_KEY}',
|
|
@@ -86,6 +138,17 @@ export async function runJudgeConfigure(opts, io = createClackIO()) {
|
|
|
86
138
|
io.log.info('This writes local files only — it never calls a remote API. local_judge is deliberately ' +
|
|
87
139
|
'not remotely configurable; apply what this generates yourself. Judges run only on ' +
|
|
88
140
|
'self-hosted models: hosted APIs (Anthropic, OpenAI, Gemini, OpenRouter, Ollama Cloud…) are refused.');
|
|
141
|
+
io.log.warn(`Deprecated since 3.0: ${DEPRECATED_JUDGE_ENV.join(', ')}. The gateway maps them to the decide ` +
|
|
142
|
+
'rule local-judge with a warning, and 4.0 removes them. This command also writes the decide ' +
|
|
143
|
+
`engine configuration (~/${DECIDE_ENGINE_FILE_PATH.join('/')}). See ${ON_PREM_JUDGE_DOCS}`);
|
|
144
|
+
const engineUrl = (opts.engineUrl ?? DECIDE_DEFAULT_ENGINE_URL).trim();
|
|
145
|
+
const host = checkSelfHostedDecisionHost(engineUrl, process.env.INTUTIC_SELF_HOSTED_DECISION_HOSTS);
|
|
146
|
+
if (!host.ok) {
|
|
147
|
+
io.log.error(`The decide engine URL ${engineUrl} is not a self-hosted host (${host.reason}). Use a loopback or ` +
|
|
148
|
+
'private address, or list the host in INTUTIC_SELF_HOSTED_DECISION_HOSTS.');
|
|
149
|
+
io.outro('Nothing written.');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
89
152
|
// Self-hosted catalog entries, plus a free-text alias for anything else the
|
|
90
153
|
// operator's own LiteLLM serves (vLLM, a renamed Ollama model…).
|
|
91
154
|
const CUSTOM = '__custom__';
|
|
@@ -127,6 +190,9 @@ export async function runJudgeConfigure(opts, io = createClackIO()) {
|
|
|
127
190
|
writeFileSync(outPath, yaml, 'utf-8');
|
|
128
191
|
io.log.success(`Written to ${outPath}`);
|
|
129
192
|
const { id: modelAlias } = normalizeModelRef(modelRef);
|
|
193
|
+
const engineFile = join(opts.home ?? homedir(), ...DECIDE_ENGINE_FILE_PATH);
|
|
194
|
+
writeDecideEngineFile(engineFile, engineUrl, modelAlias || modelRef);
|
|
195
|
+
io.log.success(`Decide engine: ${modelAlias || modelRef} at ${engineUrl}, written to ${engineFile}`);
|
|
130
196
|
io.note(envBlock(modelAlias || modelRef), 'Environment');
|
|
131
197
|
io.note(helmSnippet(modelAlias || modelRef, outPath), 'Helm values');
|
|
132
198
|
io.log.info(`Full walkthrough, including the optional typed stage: ${ON_PREM_JUDGE_DOCS}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/commands/judge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/commands/judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AA0FA,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFhB"}
|
|
@@ -41,6 +41,14 @@ function readManifest() {
|
|
|
41
41
|
return [];
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
/** A captured entry's action tokens (gate body v23 writes them), at most 16. */
|
|
45
|
+
function actionsOf(entry) {
|
|
46
|
+
const raw = entry.actions;
|
|
47
|
+
if (!Array.isArray(raw))
|
|
48
|
+
return {};
|
|
49
|
+
const actions = raw.filter((t) => typeof t === 'string' && t.startsWith('action:') && t.length <= 64).slice(0, 16);
|
|
50
|
+
return actions.length > 0 ? { actions } : {};
|
|
51
|
+
}
|
|
44
52
|
/** Appends to the same log the gate writes, so the undo is in the same trail. */
|
|
45
53
|
function recordRestore(entry, note) {
|
|
46
54
|
try {
|
|
@@ -57,6 +65,9 @@ function recordRestore(entry, note) {
|
|
|
57
65
|
incidentId: crypto.createHash('sha1').update(ts + entry.id).digest('hex').slice(0, 16),
|
|
58
66
|
// Made once and resent with this line: processed once however often the drain retries.
|
|
59
67
|
eventId: crypto.randomBytes(16).toString('hex'),
|
|
68
|
+
// The action tokens the gate classified the call to at capture (LLD
|
|
69
|
+
// #75 §7.1): the control plane records the revert against each one.
|
|
70
|
+
...actionsOf(entry),
|
|
60
71
|
}) + '\n', { flag: 'a' });
|
|
61
72
|
}
|
|
62
73
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAOtC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AAC3E,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAA;AAElE,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,EAAE;aACN,YAAY,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;aACjC,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAkB,CAAC,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,SAAS,aAAa,CAAC,KAAoB,EAAE,IAAY;IACvD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;QAChE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACnC,EAAE,CAAC,cAAc,CACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;YACpB,MAAM,EAAE,yBAAyB,KAAK,CAAC,EAAE,KAAK,IAAI,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAC3F,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACtF,uFAAuF;YACvF,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.d.ts
CHANGED
|
@@ -318,6 +318,23 @@ export declare function runLoopStart(opts: {
|
|
|
318
318
|
autoJudge?: boolean;
|
|
319
319
|
dev?: boolean;
|
|
320
320
|
}): Promise<void>;
|
|
321
|
+
/**
|
|
322
|
+
* Verifies a loop run: the diff from `--base` (or the commit
|
|
323
|
+
* the run started from) is checked against the local SOPs' `scope_paths`
|
|
324
|
+
* first; a local failure stops it with nothing sent. Then the control plane
|
|
325
|
+
* checks scope and plan, and asks the judge only if those pass. True when the
|
|
326
|
+
* verify passed.
|
|
327
|
+
*/
|
|
328
|
+
export declare function verifyLoopRun(loopRunId: string, opts: {
|
|
329
|
+
base?: string;
|
|
330
|
+
task?: string;
|
|
331
|
+
dev?: boolean;
|
|
332
|
+
}, client?: Awaited<ReturnType<typeof getClient>>): Promise<boolean>;
|
|
333
|
+
export declare function runLoopVerify(loopRunId: string, opts: {
|
|
334
|
+
base?: string;
|
|
335
|
+
task?: string;
|
|
336
|
+
dev?: boolean;
|
|
337
|
+
}): Promise<void>;
|
|
321
338
|
export declare function runLoopComplete(loopRunId: string, opts: {
|
|
322
339
|
dev?: boolean;
|
|
323
340
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAYL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.js
CHANGED
|
@@ -13,9 +13,9 @@ import { NOT_AUTHENTICATED } from '../lib/authMessages.js';
|
|
|
13
13
|
import { loadCredentials, loadConfig } from '../config/store.js';
|
|
14
14
|
import { getIntuticDir, resolveControlPlaneUrl } from '../config/paths.js';
|
|
15
15
|
import { createApiClient } from '../lib/api.js';
|
|
16
|
-
import { scanSkillContent, skillContentForTransport, skillExceedsTransportCap, SKILL_PARTIAL_SCAN_REASON, SKILL_SCAN_PATTERNS, scanScriptContent, SCRIPT_SCAN_PATTERNS, detectScriptLanguage, MAX_SKILL_DIR_DEPTH, MAX_FILES_PER_SKILL, MAX_SCRIPT_SCAN_BYTES, } from '@intutic/shared-types';
|
|
16
|
+
import { scanSkillContent, skillContentForTransport, skillExceedsTransportCap, SKILL_PARTIAL_SCAN_REASON, SKILL_SCAN_PATTERNS, scanScriptContent, SCRIPT_SCAN_PATTERNS, detectScriptLanguage, MAX_SKILL_DIR_DEPTH, MAX_FILES_PER_SKILL, MAX_SCRIPT_SCAN_BYTES, isWithinScope, } from '@intutic/shared-types';
|
|
17
17
|
import { ciscoScannerOnPath, runCiscoScan, combineCiscoSarifRuns, } from '../lib/ciscoScanner.js';
|
|
18
|
-
import { listSopSets } from '@intutic/sync-daemon';
|
|
18
|
+
import { listSopSets, loadLocalSopEntries } from '@intutic/sync-daemon';
|
|
19
19
|
import pc from 'picocolors';
|
|
20
20
|
/** The words the audit uses for each {@link UnscannedReason}. */
|
|
21
21
|
export function describeUnscanned(reason) {
|
|
@@ -960,7 +960,7 @@ export async function runLoopStart(opts) {
|
|
|
960
960
|
// Write loop env file locally
|
|
961
961
|
const loopEnvPath = join(getIntuticDir(), 'env', 'loop.env');
|
|
962
962
|
await fs.mkdir(dirname(loopEnvPath), { recursive: true }).catch(() => { });
|
|
963
|
-
await
|
|
963
|
+
await writeLoopEnv(res.loop.loopRunId, workspaceRoot);
|
|
964
964
|
log.dim(`Wrote run context to ~/.intutic/env/loop.env`);
|
|
965
965
|
}
|
|
966
966
|
else {
|
|
@@ -973,11 +973,153 @@ export async function runLoopStart(opts) {
|
|
|
973
973
|
process.exit(1);
|
|
974
974
|
}
|
|
975
975
|
}
|
|
976
|
+
/** The commit a loop run started from, so `loop verify` can diff against it. Empty outside a git repo. */
|
|
977
|
+
function headCommit(cwd) {
|
|
978
|
+
try {
|
|
979
|
+
return execFileSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
980
|
+
}
|
|
981
|
+
catch {
|
|
982
|
+
return '';
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
/** `~/.intutic/env/loop.env`: the run id, and the commit the run started from. */
|
|
986
|
+
async function writeLoopEnv(loopRunId, workspaceRoot) {
|
|
987
|
+
const loopEnvPath = join(getIntuticDir(), 'env', 'loop.env');
|
|
988
|
+
await fs.mkdir(dirname(loopEnvPath), { recursive: true }).catch(() => { });
|
|
989
|
+
const base = headCommit(workspaceRoot);
|
|
990
|
+
await fs.writeFile(loopEnvPath, `INTUTIC_LOOP_RUN_ID=${loopRunId}\n` + (base ? `INTUTIC_LOOP_BASE_COMMIT=${base}\n` : ''));
|
|
991
|
+
}
|
|
992
|
+
async function loopEnvValue(key) {
|
|
993
|
+
try {
|
|
994
|
+
const text = await fs.readFile(join(getIntuticDir(), 'env', 'loop.env'), 'utf8');
|
|
995
|
+
const line = text.split('\n').find((l) => l.startsWith(`${key}=`));
|
|
996
|
+
return line ? line.slice(key.length + 1).trim() : '';
|
|
997
|
+
}
|
|
998
|
+
catch {
|
|
999
|
+
return '';
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
function printLoopRefusal(status, body) {
|
|
1003
|
+
log.error(`The control plane did not complete the run (${status}${body.code ? ` ${body.code}` : ''}): ${body.error ?? 'refused'}`);
|
|
1004
|
+
for (const f of body.findings ?? [])
|
|
1005
|
+
log.info(` - ${f}`);
|
|
1006
|
+
if (body.code === 'E_LOOP_NOT_VERIFIED' || body.code === 'E_LOOP_VERIFY_STALE') {
|
|
1007
|
+
log.dim('Verify the run first: intutic loop verify <loopRunId>');
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
/** Strips quotes and brackets from both ends, in linear time. */
|
|
1011
|
+
function trimQuoted(v) {
|
|
1012
|
+
const q = (c) => c === '"' || c === "'" || c === '[' || c === ']';
|
|
1013
|
+
let a = 0;
|
|
1014
|
+
let b = v.length;
|
|
1015
|
+
while (a < b && q(v[a]))
|
|
1016
|
+
a++;
|
|
1017
|
+
while (b > a && q(v[b - 1]))
|
|
1018
|
+
b--;
|
|
1019
|
+
return v.slice(a, b);
|
|
1020
|
+
}
|
|
1021
|
+
/**
|
|
1022
|
+
* The local half of a verify: every changed path must be
|
|
1023
|
+
* inside the `scope_paths` of the local SOPs the session selected (and that
|
|
1024
|
+
* declare no `roles:`; a loop has no agent role). No tolerance: a verify is a
|
|
1025
|
+
* boundary check. Returns the findings; empty passes.
|
|
1026
|
+
*/
|
|
1027
|
+
async function localScopeFindings(workspaceRoot, changed) {
|
|
1028
|
+
const sops = await loadLocalSopEntries(workspaceRoot, []);
|
|
1029
|
+
const scopes = [];
|
|
1030
|
+
for (const sop of sops) {
|
|
1031
|
+
const front = sop.content.trimStart().startsWith('---') ? sop.content.trimStart().slice(3).split('\n---')[0] ?? '' : '';
|
|
1032
|
+
if (front.split('\n').some((l) => l.startsWith('roles:') && l.slice(6).trim() !== ''))
|
|
1033
|
+
continue;
|
|
1034
|
+
for (const line of front.split('\n')) {
|
|
1035
|
+
const t = line.trim();
|
|
1036
|
+
if (!t.startsWith('scope_paths:'))
|
|
1037
|
+
continue;
|
|
1038
|
+
for (const piece of t.slice('scope_paths:'.length).split(',')) {
|
|
1039
|
+
const v = trimQuoted(piece.trim());
|
|
1040
|
+
if (v)
|
|
1041
|
+
scopes.push(v);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
if (scopes.length === 0)
|
|
1046
|
+
return [];
|
|
1047
|
+
const out = changed.filter((p) => !isWithinScope(p, scopes));
|
|
1048
|
+
return out.length === 0 ? [] : [`Changed outside scope_paths (${scopes.join(', ')}): ${out.slice(0, 10).join(', ')}${out.length > 10 ? ', …' : ''}`];
|
|
1049
|
+
}
|
|
1050
|
+
/**
|
|
1051
|
+
* Verifies a loop run: the diff from `--base` (or the commit
|
|
1052
|
+
* the run started from) is checked against the local SOPs' `scope_paths`
|
|
1053
|
+
* first; a local failure stops it with nothing sent. Then the control plane
|
|
1054
|
+
* checks scope and plan, and asks the judge only if those pass. True when the
|
|
1055
|
+
* verify passed.
|
|
1056
|
+
*/
|
|
1057
|
+
export async function verifyLoopRun(loopRunId, opts, client) {
|
|
1058
|
+
const config = loadConfig();
|
|
1059
|
+
const workspaceRoot = config?.workspaceRoot ?? process.cwd();
|
|
1060
|
+
const base = opts.base || process.env.INTUTIC_LOOP_BASE_COMMIT || (await loopEnvValue('INTUTIC_LOOP_BASE_COMMIT')) || 'HEAD';
|
|
1061
|
+
let diff;
|
|
1062
|
+
let files;
|
|
1063
|
+
try {
|
|
1064
|
+
diff = execFileSync('git', ['diff', base], { cwd: workspaceRoot, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
1065
|
+
files = execFileSync('git', ['diff', '--name-only', base], { cwd: workspaceRoot, encoding: 'utf8' }).split('\n').filter(Boolean).slice(0, 2000);
|
|
1066
|
+
}
|
|
1067
|
+
catch (err) {
|
|
1068
|
+
log.error(`Could not take the diff against ${base}: ${err instanceof Error ? err.message : String(err)}`);
|
|
1069
|
+
return false;
|
|
1070
|
+
}
|
|
1071
|
+
const local = await localScopeFindings(workspaceRoot, files);
|
|
1072
|
+
if (local.length > 0) {
|
|
1073
|
+
log.error('The run fails the local scope check; nothing was sent.');
|
|
1074
|
+
for (const f of local)
|
|
1075
|
+
log.info(` - ${f}`);
|
|
1076
|
+
return false;
|
|
1077
|
+
}
|
|
1078
|
+
if (!diff.trim())
|
|
1079
|
+
diff = `(no changes against ${base})`;
|
|
1080
|
+
const api = client ?? (await getClient(opts.dev));
|
|
1081
|
+
const res = await api.postWithStatus(`/api/v1/loops/${loopRunId}/verify`, {
|
|
1082
|
+
diff,
|
|
1083
|
+
taskDescription: opts.task || `Loop run ${loopRunId}`,
|
|
1084
|
+
...(files.length > 0 ? { files } : {}),
|
|
1085
|
+
base,
|
|
1086
|
+
});
|
|
1087
|
+
if (res.status !== 200) {
|
|
1088
|
+
log.error(`Verify failed (${res.status}): ${res.body.error ?? 'refused'}`);
|
|
1089
|
+
return false;
|
|
1090
|
+
}
|
|
1091
|
+
const v = res.body;
|
|
1092
|
+
for (const c of v.checks ?? []) {
|
|
1093
|
+
log.info(` ${c.id}: ${c.status}`);
|
|
1094
|
+
for (const f of c.findings)
|
|
1095
|
+
log.dim(` ${f}`);
|
|
1096
|
+
}
|
|
1097
|
+
if (v.ok && !v.unverified) {
|
|
1098
|
+
log.success(`Verified (${v.stage ?? 'judge'}${v.verificationId ? `, ${v.verificationId}` : ''}).`);
|
|
1099
|
+
return true;
|
|
1100
|
+
}
|
|
1101
|
+
log.error(v.unverified ? 'Nothing could verify this run (no scope, plan or judge applied).' : `Verify did not pass (${v.stage ?? 'judge'}).`);
|
|
1102
|
+
for (const f of v.findings ?? [])
|
|
1103
|
+
log.info(` - ${f}`);
|
|
1104
|
+
return false;
|
|
1105
|
+
}
|
|
1106
|
+
export async function runLoopVerify(loopRunId, opts) {
|
|
1107
|
+
log.header('Intutic — Verify Loop');
|
|
1108
|
+
if (!(await verifyLoopRun(loopRunId, opts)))
|
|
1109
|
+
process.exitCode = 1;
|
|
1110
|
+
}
|
|
976
1111
|
export async function runLoopComplete(loopRunId, opts) {
|
|
977
1112
|
log.header('Intutic — Complete Loop');
|
|
978
1113
|
const client = await getClient(opts.dev);
|
|
979
1114
|
try {
|
|
980
|
-
const
|
|
1115
|
+
const done = await client.postWithStatus(`/api/v1/loops/${loopRunId}/complete`);
|
|
1116
|
+
if (done.status === 409 || done.status === 503) {
|
|
1117
|
+
printLoopRefusal(done.status, done.body);
|
|
1118
|
+
process.exit(1);
|
|
1119
|
+
}
|
|
1120
|
+
if (done.status !== 200)
|
|
1121
|
+
throw new Error(`API POST /api/v1/loops/${loopRunId}/complete failed (${done.status}): ${done.body.error ?? ''}`);
|
|
1122
|
+
const res = done.body;
|
|
981
1123
|
if (res.ok) {
|
|
982
1124
|
log.success(`Loop run ${loopRunId} completed.`);
|
|
983
1125
|
// Clean env
|
|
@@ -1109,6 +1251,7 @@ export async function runLoopExec(commandAndArgs, opts) {
|
|
|
1109
1251
|
}
|
|
1110
1252
|
const loopRunId = res.loop.loopRunId;
|
|
1111
1253
|
log.success(`Loop run registered: ${loopRunId}`);
|
|
1254
|
+
await writeLoopEnv(loopRunId, workspaceRoot);
|
|
1112
1255
|
// Execute process with INTUTIC_LOOP_RUN_ID in environment
|
|
1113
1256
|
const childEnv = {
|
|
1114
1257
|
...process.env,
|
|
@@ -1152,9 +1295,31 @@ export async function runLoopExec(commandAndArgs, opts) {
|
|
|
1152
1295
|
// than leaving the run open on a transient error.
|
|
1153
1296
|
}
|
|
1154
1297
|
if (code === 0) {
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1298
|
+
// The completion gate: when the workspace requires a
|
|
1299
|
+
// verified completion, verify first. A refusal is shown and leaves the
|
|
1300
|
+
// run ACTIVE, and the wrapper exits non-zero.
|
|
1301
|
+
let gated = false;
|
|
1302
|
+
try {
|
|
1303
|
+
const detail = await client.get(`/api/v1/loops/${loopRunId}`);
|
|
1304
|
+
gated = detail?.requiresVerifiedCompletion === true;
|
|
1305
|
+
}
|
|
1306
|
+
catch {
|
|
1307
|
+
// Unknown: complete as usual; the server refuses an unverified run itself.
|
|
1308
|
+
}
|
|
1309
|
+
if (gated && !(await verifyLoopRun(loopRunId, { task: loopName, dev: opts.dev }, client))) {
|
|
1310
|
+
log.warn(`The run stays ACTIVE. Fix it and run: intutic loop verify ${loopRunId} && intutic loop complete ${loopRunId}`);
|
|
1311
|
+
process.exit(1);
|
|
1312
|
+
return;
|
|
1313
|
+
}
|
|
1314
|
+
const done = await client
|
|
1315
|
+
.postWithStatus(`/api/v1/loops/${loopRunId}/complete`, { outcome: 'SUCCEEDED' })
|
|
1316
|
+
.catch((err) => ({ status: 0, body: { error: err instanceof Error ? err.message : String(err) } }));
|
|
1317
|
+
if (done.status !== 200) {
|
|
1318
|
+
printLoopRefusal(done.status, done.body);
|
|
1319
|
+
log.warn('The run stays ACTIVE.');
|
|
1320
|
+
process.exit(1);
|
|
1321
|
+
return;
|
|
1322
|
+
}
|
|
1158
1323
|
log.success('Loop command execution succeeded. Wrapper loop marked COMPLETED.');
|
|
1159
1324
|
}
|
|
1160
1325
|
else {
|