@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.
Files changed (57) hide show
  1. package/dist/cli.js +103 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/connect.d.ts.map +1 -1
  4. package/dist/commands/connect.js +15 -2
  5. package/dist/commands/connect.js.map +1 -1
  6. package/dist/commands/decide.d.ts +220 -0
  7. package/dist/commands/decide.d.ts.map +1 -0
  8. package/dist/commands/decide.js +1297 -0
  9. package/dist/commands/decide.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +10 -0
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +56 -2
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/gates.d.ts +5 -0
  15. package/dist/commands/gates.d.ts.map +1 -1
  16. package/dist/commands/gates.js +42 -1
  17. package/dist/commands/gates.js.map +1 -1
  18. package/dist/commands/judge.d.ts +21 -1
  19. package/dist/commands/judge.d.ts.map +1 -1
  20. package/dist/commands/judge.js +71 -5
  21. package/dist/commands/judge.js.map +1 -1
  22. package/dist/commands/rollback.d.ts.map +1 -1
  23. package/dist/commands/rollback.js +11 -0
  24. package/dist/commands/rollback.js.map +1 -1
  25. package/dist/commands/skill.d.ts +17 -0
  26. package/dist/commands/skill.d.ts.map +1 -1
  27. package/dist/commands/skill.js +172 -7
  28. package/dist/commands/skill.js.map +1 -1
  29. package/dist/commands/start.d.ts +6 -0
  30. package/dist/commands/start.d.ts.map +1 -1
  31. package/dist/commands/start.js +31 -1
  32. package/dist/commands/start.js.map +1 -1
  33. package/dist/lib/decideBudget.d.ts +40 -0
  34. package/dist/lib/decideBudget.d.ts.map +1 -0
  35. package/dist/lib/decideBudget.js +46 -0
  36. package/dist/lib/decideBudget.js.map +1 -0
  37. package/dist/lib/decideEval.d.ts +126 -0
  38. package/dist/lib/decideEval.d.ts.map +1 -0
  39. package/dist/lib/decideEval.js +412 -0
  40. package/dist/lib/decideEval.js.map +1 -0
  41. package/dist/lib/decideLocal.d.ts +84 -0
  42. package/dist/lib/decideLocal.d.ts.map +1 -0
  43. package/dist/lib/decideLocal.js +178 -0
  44. package/dist/lib/decideLocal.js.map +1 -0
  45. package/dist/lib/decideRules.d.ts +43 -0
  46. package/dist/lib/decideRules.d.ts.map +1 -0
  47. package/dist/lib/decideRules.js +104 -0
  48. package/dist/lib/decideRules.js.map +1 -0
  49. package/dist/lib/localGates.d.ts +7 -7
  50. package/dist/lib/localGates.d.ts.map +1 -1
  51. package/dist/lib/localGates.js +94 -11
  52. package/dist/lib/localGates.js.map +1 -1
  53. package/dist/lib/policySnapshot.d.ts +27 -0
  54. package/dist/lib/policySnapshot.d.ts.map +1 -1
  55. package/dist/lib/policySnapshot.js +64 -2
  56. package/dist/lib/policySnapshot.js.map +1 -1
  57. package/package.json +5 -5
@@ -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. `local_judge` is deliberately NOT
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 { resolve } from 'node:path';
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;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,8BAA8B,EAC9B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAOxD,4FAA4F;AAC5F,MAAM,kBAAkB,GAAG,gDAAgD,CAAA;AAE3E;;;;GAIG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;IACpC,OAAO,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC;QACnD,CAAC,CAAC,8BAA8B,GAAG,aAAa;QAChD,CAAC,CAAC,6BAA6B,GAAG,YAAY,CAAA;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACxD,MAAM,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAA;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEzD,OAAO,CACL,+EAA+E;QAC/E,mDAAmD,kBAAkB,MAAM;QAC3E,eAAe;QACf,mBAAmB,KAAK,IAAI;QAC5B,uBAAuB;QACvB,gBAAgB,YAAY,IAAI;QAChC,QAAQ;QACR,IAAI;QACJ,qBAAqB;QACrB,+CAA+C,CAChD,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,UAAkB;IAClC,OAAO;QACL,sGAAsG;QACtG,kCAAkC;QAClC,uCAAuC;QACvC,6CAA6C;QAC7C,6BAA6B,UAAU,EAAE;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,UAAkB;IACzD,OAAO;QACL,mFAAmF;QACnF,yDAAyD,UAAU,qBAAqB;QACxF,QAAQ;QACR,oBAAoB;QACpB,UAAU;QACV,iBAAiB;QACjB,kBAAkB,UAAU,GAAG;QAC/B,iGAAiG;QACjG,2BAA2B;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAwB,EAAE,KAAc,aAAa,EAAE;IAC7F,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAA;IAC1D,EAAE,CAAC,GAAG,CAAC,IAAI,CACT,0FAA0F;QACxF,oFAAoF;QACpF,qGAAqG,CACxG,CAAA;IAED,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,MAAM,GAAG,YAAY,CAAA;IAC3B,MAAM,OAAO,GAAG,2BAA2B,EAAE,CAAA;IAC7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;QAC3B,OAAO,EAAE,uDAAuD;QAChE,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;YACjG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,8EAA8E,EAAE;SACzG;KACF,CAAC,CAAA;IACF,uEAAuE;IACvE,wEAAwE;IACxE,qEAAqE;IACrE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QACtB,OAAM;IACR,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iFAAiF,EAAE,CAAC,CAAA;QAC5H,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QACxB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,GAAG,CAAC,KAAK,CACV,IAAI,QAAQ,mFAAmF;gBAC7F,sCAAsC,CACzC,CAAA;YACD,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;YAC5B,OAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,2EAA2E,CAAC,CAAA;IACtG,CAAC;IAED,MAAM,IAAI,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAA;IAC5D,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACrC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,OAAO,EAAE,CAAC,CAAA;IAEvC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACtD,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAA;IACxD,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,QAAQ,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAA;IAEpE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,yDAAyD,kBAAkB,EAAE,CAAC,CAAA;IAE1F,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAA;AACvF,CAAC"}
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":"AA+EA,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFhB"}
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":"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"}
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,gFAAgF;AAChF,SAAS,SAAS,CAAC,KAAoB;IACrC,MAAM,GAAG,GAAI,KAA+C,CAAC,OAAO,CAAA;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/H,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9C,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;YAC/C,oEAAoE;YACpE,oEAAoE;YACpE,GAAG,SAAS,CAAC,KAAK,CAAC;SACpB,CAAC,GAAG,IAAI,EACT,EAAE,IAAI,EAAE,GAAG,EAAE,CACd,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,uEAAuE;QACvE,wCAAwC;QACxC,GAAG,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;IAC5F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAGjC;IACC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAE9B,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;YACnC,GAAG,CAAC,GAAG,CACL,qFAAqF;gBACnF,kFAAkF,CACrF,CAAA;YACD,OAAM;QACR,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,wCAAwC,CAAC,CAAA;QACnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,uCAAuC,CAAA;YACtF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACjD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5B,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAC1D,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,EAAE,0CAA0C,CAAC,CAAA;QAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1D,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,wEAAwE;QACxE,gEAAgE;QAChE,GAAG,CAAC,KAAK,CACP,aAAa,KAAK,CAAC,EAAE,8DAA8D;YACjF,gEAAgE,CACnE,CAAA;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,2EAA2E;IAC3E,6CAA6C;IAC7C,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YACpD,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC,CAAA;YAC1E,EAAE,CAAC,cAAc,CACf,QAAQ,EAAE,EACV,IAAI,CAAC,SAAS,CAAC;gBACb,GAAG,KAAK;gBACR,EAAE,EAAE,MAAM;gBACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,WAAW,KAAK,CAAC,EAAE,EAAE;gBAC7B,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI;gBACrC,OAAO,EAAE,IAAI;aACd,CAAC,GAAG,IAAI,EACT,EAAE,IAAI,EAAE,GAAG,EAAE,CACd,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CACP,4DACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,qEAAqE,CACtE,CAAA;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YACnC,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,mBAAmB,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,IAAI,CAAC,CAAA;YACtF,aAAa,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,wEAAwE;YACxE,yEAAyE;YACzE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC3B,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,gDAAgD,CAAC,CAAA;YACjF,aAAa,CAAC,KAAK,EAAE,yCAAyC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
@@ -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":"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"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -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 fs.writeFile(loopEnvPath, `INTUTIC_LOOP_RUN_ID=${res.loop.loopRunId}\n`);
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 res = await client.post(`/api/v1/loops/${loopRunId}/complete`);
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
- await client
1156
- .post(`/api/v1/loops/${loopRunId}/complete`, { outcome: 'SUCCEEDED' })
1157
- .catch(() => { });
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 {