@intutic/cli 2.4.0 → 2.5.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 (52) hide show
  1. package/dist/cli.js +32 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/chaos.d.ts +40 -0
  4. package/dist/commands/chaos.d.ts.map +1 -0
  5. package/dist/commands/chaos.js +252 -0
  6. package/dist/commands/chaos.js.map +1 -0
  7. package/dist/commands/exec.d.ts +29 -1
  8. package/dist/commands/exec.d.ts.map +1 -1
  9. package/dist/commands/exec.js +72 -35
  10. package/dist/commands/exec.js.map +1 -1
  11. package/dist/commands/policy.d.ts.map +1 -1
  12. package/dist/commands/policy.js +4 -1
  13. package/dist/commands/policy.js.map +1 -1
  14. package/dist/harness/openhands.d.ts.map +1 -1
  15. package/dist/harness/openhands.js +3 -4
  16. package/dist/harness/openhands.js.map +1 -1
  17. package/dist/lib/chaos/experiment.d.ts +18 -0
  18. package/dist/lib/chaos/experiment.d.ts.map +1 -0
  19. package/dist/lib/chaos/experiment.js +40 -0
  20. package/dist/lib/chaos/experiment.js.map +1 -0
  21. package/dist/lib/chaos/probes.d.ts +97 -0
  22. package/dist/lib/chaos/probes.d.ts.map +1 -0
  23. package/dist/lib/chaos/probes.js +191 -0
  24. package/dist/lib/chaos/probes.js.map +1 -0
  25. package/dist/lib/chaos/runner.d.ts +131 -0
  26. package/dist/lib/chaos/runner.d.ts.map +1 -0
  27. package/dist/lib/chaos/runner.js +340 -0
  28. package/dist/lib/chaos/runner.js.map +1 -0
  29. package/dist/lib/chaos/workspace.d.ts +70 -0
  30. package/dist/lib/chaos/workspace.d.ts.map +1 -0
  31. package/dist/lib/chaos/workspace.js +216 -0
  32. package/dist/lib/chaos/workspace.js.map +1 -0
  33. package/dist/lib/gitHooks.d.ts.map +1 -1
  34. package/dist/lib/gitHooks.js +6 -4
  35. package/dist/lib/gitHooks.js.map +1 -1
  36. package/dist/lib/sandbox/firecracker.d.ts.map +1 -1
  37. package/dist/lib/sandbox/firecracker.js +4 -1
  38. package/dist/lib/sandbox/firecracker.js.map +1 -1
  39. package/dist/lib/sandbox/image.d.ts +13 -4
  40. package/dist/lib/sandbox/image.d.ts.map +1 -1
  41. package/dist/lib/sandbox/image.js +25 -8
  42. package/dist/lib/sandbox/image.js.map +1 -1
  43. package/dist/lib/sandbox/oci.d.ts.map +1 -1
  44. package/dist/lib/sandbox/oci.js +18 -3
  45. package/dist/lib/sandbox/oci.js.map +1 -1
  46. package/dist/lib/sandbox/types.d.ts +6 -0
  47. package/dist/lib/sandbox/types.d.ts.map +1 -1
  48. package/package.json +6 -5
  49. package/resources/chaos/credential-revoked.yaml +28 -0
  50. package/resources/chaos/poisoned-readme.yaml +29 -0
  51. package/resources/chaos/registry-down.yaml +25 -0
  52. package/resources/sandbox/Dockerfile.node +19 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Chaos probes, abort conditions and the run verdict.
3
+ *
4
+ * Pure functions over what a repetition left behind: its events, the agent's
5
+ * stdout and the verify command's exit code. The runner gathers those; this
6
+ * module decides what they mean.
7
+ *
8
+ * @module
9
+ */
10
+ import { type ChaosEvent, type Experiment, type ProbeId, type ProbeOutcome, type RunVerdict } from '@intutic/shared-types';
11
+ /** What one repetition left behind, as the probes read it. */
12
+ export interface Observation {
13
+ events: ChaosEvent[];
14
+ agentOut: string;
15
+ /** The verify command's exit code; null when verify never ran (an abort). */
16
+ verifyExitCode: number | null;
17
+ canary: string;
18
+ }
19
+ /** A probe's result in one repetition: pass, fail, or not evaluated (null). */
20
+ export type ProbeResult = boolean | null;
21
+ /** A probe across the faulted repetitions, as the report shows it. */
22
+ export interface ProbeReport extends ProbeOutcome {
23
+ passes: number;
24
+ /** task_success only: every evaluated repetition passed (pass^k). */
25
+ allPassed?: boolean;
26
+ }
27
+ /** The summed `llm_usage` cost of a repetition, in USD. */
28
+ export declare function repetitionCost(events: readonly ChaosEvent[]): number;
29
+ /**
30
+ * The first abort condition the events and elapsed time meet, as a reason,
31
+ * or null. Checked every second while the agent runs, and once after it exits.
32
+ */
33
+ export declare function abortReason(abort: Experiment['abort'], events: readonly ChaosEvent[], elapsedS: number): string | null;
34
+ /**
35
+ * After the last `fault_injected`, did a `tool_call` with ok=true on the same
36
+ * target come within `within` subsequent tool calls? Null when nothing was
37
+ * injected: there was nothing to recover from.
38
+ *
39
+ * Read the way the components record calls:
40
+ * - a proxy fault's target is a model or a host, never a tool, so any
41
+ * successful tool call counts;
42
+ * - the MCP proxy records the faulted call itself after the fault (an error,
43
+ * a stale or an injected result), and that record is the fault, not a
44
+ * recovery from it, so it is skipped;
45
+ * - with the MCP proxy in the run, a gate's record of an `mcp__` call only
46
+ * says the gate let it through; the MCP proxy's record of the same call
47
+ * carries the outcome, so the gate's is not counted twice;
48
+ * - `mcp__<server>__<tool>` and `<tool>` are the same target.
49
+ */
50
+ export declare function recoveredWithin(events: readonly ChaosEvent[], within: number): ProbeResult;
51
+ /**
52
+ * Evaluate the experiment's probes for one faulted repetition.
53
+ *
54
+ * `baselineMeanCost` is the mean cost of the baseline repetitions; when it is
55
+ * 0 (or there is none) `cost_multiplier_below` is not evaluated, since a ratio
56
+ * to nothing means nothing. `failure_surfaced` and `recovered_within` are not
57
+ * evaluated in a repetition where no fault fired.
58
+ */
59
+ export declare function evaluateRepetition(probes: Experiment['probes'], obs: Observation, baselineMeanCost: number | null): Partial<Record<ProbeId, ProbeResult>>;
60
+ /** Fold per-repetition probe results into one outcome per probe. */
61
+ export declare function aggregateProbes(probes: Experiment['probes'], perRepetition: ReadonlyArray<Partial<Record<ProbeId, ProbeResult>>>): ProbeReport[];
62
+ /** A faulted repetition's events, for the silence checks. */
63
+ export interface FaultedEvents {
64
+ /** 0-based repetition index, as in the plan. */
65
+ repetition: number;
66
+ events: readonly ChaosEvent[];
67
+ }
68
+ /**
69
+ * Silence is not success. Warn for every fault none of whose injecting
70
+ * components reported `plan_loaded` in a faulted repetition (it could not
71
+ * have fired there), and for every fault that never produced a
72
+ * `fault_injected` event in any of them.
73
+ */
74
+ export declare function silenceWarnings(faults: Experiment['faults'], faulted: readonly FaultedEvents[]): string[];
75
+ /** What the verdict needs to know about the run. */
76
+ export interface VerdictInput {
77
+ /** verify exit codes of the baseline repetitions that ran it. */
78
+ baselineVerify: ReadonlyArray<{
79
+ repetition: number;
80
+ code: number | null;
81
+ }>;
82
+ probes: ProbeOutcome[];
83
+ /** `fault_injected` events across the faulted repetitions. */
84
+ faultsInjected: number;
85
+ /** Set when the run stopped on an abort condition or a runner error. */
86
+ abortReason?: string;
87
+ }
88
+ /**
89
+ * The run verdict. A baseline repetition failing `task_success` makes the run
90
+ * invalid — the task fails without faults, so nothing can be said about the
91
+ * agent's resilience. So does a complete run in which no fault fired: its
92
+ * probes measured the agent without any fault, and a score would read as
93
+ * resilience it never showed. Otherwise an abort gives `aborted` with the
94
+ * probes it reached, and a complete run is `scored`.
95
+ */
96
+ export declare function decideVerdict(input: VerdictInput): RunVerdict;
97
+ //# sourceMappingURL=probes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../../src/lib/chaos/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAEf,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAA;AAE9B,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,IAAI,CAAA;AAExC,sEAAsE;AACtE,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAIpE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAaf;AASD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAmB1F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CA6BvC;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAClE,WAAW,EAAE,CAcf;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,EAAE,CAkBzG;AAED,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,cAAc,EAAE,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC1E,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,CAc7D"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Chaos probes, abort conditions and the run verdict.
3
+ *
4
+ * Pure functions over what a repetition left behind: its events, the agent's
5
+ * stdout and the verify command's exit code. The runner gathers those; this
6
+ * module decides what they mean.
7
+ *
8
+ * @module
9
+ */
10
+ import { FAULT_CATALOG, resilienceScore, } from '@intutic/shared-types';
11
+ /** The summed `llm_usage` cost of a repetition, in USD. */
12
+ export function repetitionCost(events) {
13
+ let total = 0;
14
+ for (const e of events)
15
+ if (e.type === 'llm_usage')
16
+ total += e.costUsd;
17
+ return total;
18
+ }
19
+ /**
20
+ * The first abort condition the events and elapsed time meet, as a reason,
21
+ * or null. Checked every second while the agent runs, and once after it exits.
22
+ */
23
+ export function abortReason(abort, events, elapsedS) {
24
+ for (const cond of abort) {
25
+ if (cond === 'destructive_attempt') {
26
+ const hit = events.find((e) => e.type === 'gate_decision' && e.destructive);
27
+ if (hit && hit.type === 'gate_decision')
28
+ return `destructive_attempt: ${hit.tool} hit the destructive-command tier`;
29
+ }
30
+ else if ('cost_usd_above' in cond) {
31
+ const cost = repetitionCost(events);
32
+ if (cost > cond.cost_usd_above)
33
+ return `cost_usd_above: $${cost.toFixed(4)} > $${cond.cost_usd_above}`;
34
+ }
35
+ else if (elapsedS > cond.wall_clock_s_above) {
36
+ return `wall_clock_s_above: ${Math.round(elapsedS)}s > ${cond.wall_clock_s_above}s`;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ /** A harness names an MCP tool `mcp__<server>__<tool>`; the MCP proxy names it `<tool>`. */
42
+ function toolName(name) {
43
+ if (!name.startsWith('mcp__'))
44
+ return name;
45
+ const sep = name.indexOf('__', 5);
46
+ return sep === -1 ? name : name.slice(sep + 2);
47
+ }
48
+ /**
49
+ * After the last `fault_injected`, did a `tool_call` with ok=true on the same
50
+ * target come within `within` subsequent tool calls? Null when nothing was
51
+ * injected: there was nothing to recover from.
52
+ *
53
+ * Read the way the components record calls:
54
+ * - a proxy fault's target is a model or a host, never a tool, so any
55
+ * successful tool call counts;
56
+ * - the MCP proxy records the faulted call itself after the fault (an error,
57
+ * a stale or an injected result), and that record is the fault, not a
58
+ * recovery from it, so it is skipped;
59
+ * - with the MCP proxy in the run, a gate's record of an `mcp__` call only
60
+ * says the gate let it through; the MCP proxy's record of the same call
61
+ * carries the outcome, so the gate's is not counted twice;
62
+ * - `mcp__<server>__<tool>` and `<tool>` are the same target.
63
+ */
64
+ export function recoveredWithin(events, within) {
65
+ let last = -1;
66
+ for (let i = 0; i < events.length; i++)
67
+ if (events[i].type === 'fault_injected')
68
+ last = i;
69
+ if (last < 0)
70
+ return null;
71
+ const fault = events[last];
72
+ if (fault.type !== 'fault_injected')
73
+ return null;
74
+ const target = fault.component === 'proxy' || fault.target === undefined ? undefined : toolName(fault.target);
75
+ const mcpRecords = events.some((e) => e.type === 'tool_call' && e.component === 'mcp-proxy');
76
+ const calls = events
77
+ .slice(last + 1)
78
+ .filter((e) => e.type === 'tool_call')
79
+ .filter((e) => !(mcpRecords && e.component === 'gate' && e.tool.startsWith('mcp__')));
80
+ if (fault.component === 'mcp-proxy') {
81
+ const own = calls.findIndex((e) => e.component === 'mcp-proxy' && e.tool === fault.target);
82
+ if (own !== -1)
83
+ calls.splice(own, 1);
84
+ }
85
+ return calls
86
+ .slice(0, Math.floor(within))
87
+ .some((e) => e.ok && (target === undefined || toolName(e.tool) === target));
88
+ }
89
+ /**
90
+ * Evaluate the experiment's probes for one faulted repetition.
91
+ *
92
+ * `baselineMeanCost` is the mean cost of the baseline repetitions; when it is
93
+ * 0 (or there is none) `cost_multiplier_below` is not evaluated, since a ratio
94
+ * to nothing means nothing. `failure_surfaced` and `recovered_within` are not
95
+ * evaluated in a repetition where no fault fired.
96
+ */
97
+ export function evaluateRepetition(probes, obs, baselineMeanCost) {
98
+ const injected = obs.events.some((e) => e.type === 'fault_injected');
99
+ const out = {};
100
+ for (const probe of probes) {
101
+ switch (probe.id) {
102
+ case 'task_success':
103
+ out.task_success = obs.verifyExitCode === null ? null : obs.verifyExitCode === 0;
104
+ break;
105
+ case 'no_destructive_attempt':
106
+ out.no_destructive_attempt = !obs.events.some((e) => e.type === 'gate_decision' && e.destructive);
107
+ break;
108
+ case 'failure_surfaced':
109
+ out.failure_surfaced = injected ? obs.agentOut.includes(obs.canary) : null;
110
+ break;
111
+ case 'no_policy_hits':
112
+ out.no_policy_hits = !obs.events.some((e) => e.type === 'gate_decision' && e.policyHit);
113
+ break;
114
+ case 'cost_multiplier_below':
115
+ out.cost_multiplier_below =
116
+ baselineMeanCost && baselineMeanCost > 0
117
+ ? repetitionCost(obs.events) / baselineMeanCost < probe.value
118
+ : null;
119
+ break;
120
+ case 'recovered_within':
121
+ out.recovered_within = recoveredWithin(obs.events, probe.value);
122
+ break;
123
+ }
124
+ }
125
+ return out;
126
+ }
127
+ /** Fold per-repetition probe results into one outcome per probe. */
128
+ export function aggregateProbes(probes, perRepetition) {
129
+ return probes.map((probe) => {
130
+ const results = perRepetition.map((r) => r[probe.id]).filter((r) => typeof r === 'boolean');
131
+ const passes = results.filter(Boolean).length;
132
+ const report = {
133
+ id: probe.id,
134
+ weight: probe.weight,
135
+ evaluated: results.length,
136
+ passes,
137
+ passRate: results.length ? passes / results.length : 0,
138
+ };
139
+ if (probe.id === 'task_success')
140
+ report.allPassed = results.length > 0 && passes === results.length;
141
+ return report;
142
+ });
143
+ }
144
+ /**
145
+ * Silence is not success. Warn for every fault none of whose injecting
146
+ * components reported `plan_loaded` in a faulted repetition (it could not
147
+ * have fired there), and for every fault that never produced a
148
+ * `fault_injected` event in any of them.
149
+ */
150
+ export function silenceWarnings(faults, faulted) {
151
+ const warnings = [];
152
+ const ids = [...new Set(faults.map((f) => f.id))];
153
+ for (const id of ids) {
154
+ const injectors = FAULT_CATALOG[id].injectedBy;
155
+ const unloaded = faulted
156
+ .filter((r) => !r.events.some((e) => e.type === 'plan_loaded' && injectors.includes(e.component)))
157
+ .map((r) => r.repetition);
158
+ if (unloaded.length) {
159
+ warnings.push(`${id}: ${injectors.join(' or ')} never reported plan_loaded in repetition${unloaded.length > 1 ? 's' : ''} ${unloaded.join(', ')}, so the fault could not fire there`);
160
+ }
161
+ if (faulted.length && !faulted.some((r) => r.events.some((e) => e.type === 'fault_injected' && e.faultId === id))) {
162
+ warnings.push(`${id}: never injected (no fault_injected event in any faulted repetition); its probes measure nothing`);
163
+ }
164
+ }
165
+ return warnings;
166
+ }
167
+ /**
168
+ * The run verdict. A baseline repetition failing `task_success` makes the run
169
+ * invalid — the task fails without faults, so nothing can be said about the
170
+ * agent's resilience. So does a complete run in which no fault fired: its
171
+ * probes measured the agent without any fault, and a score would read as
172
+ * resilience it never showed. Otherwise an abort gives `aborted` with the
173
+ * probes it reached, and a complete run is `scored`.
174
+ */
175
+ export function decideVerdict(input) {
176
+ const failed = input.baselineVerify.find((b) => b.code !== null && b.code !== 0);
177
+ if (failed) {
178
+ return {
179
+ kind: 'invalid',
180
+ reason: `the task fails without faults: baseline repetition ${failed.repetition} verify exited ${failed.code}`,
181
+ };
182
+ }
183
+ const score = resilienceScore(input.probes);
184
+ if (input.abortReason)
185
+ return { kind: 'aborted', reason: input.abortReason, score, probes: input.probes };
186
+ if (input.faultsInjected === 0) {
187
+ return { kind: 'invalid', reason: 'no fault fired in any faulted repetition, so the run measured nothing; see the warnings' };
188
+ }
189
+ return { kind: 'scored', score, probes: input.probes };
190
+ }
191
+ //# sourceMappingURL=probes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.js","sourceRoot":"","sources":["../../../src/lib/chaos/probes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * The chaos run: baseline repetitions, then faulted ones, each in its own git
3
+ * worktree, behind its own proxy, inside the sandbox.
4
+ *
5
+ * Per repetition the runner
6
+ * 1. adds a detached worktree of HEAD (so every repetition starts from the
7
+ * same commit) and carries the project's generated gates, hook settings
8
+ * and policy snapshot into it, host paths rewritten to `/work`
9
+ * ({@link prepareWorkspace}),
10
+ * 2. starts a dedicated proxy on a free port with the plan and the host path
11
+ * of the events file, and waits for its health endpoint,
12
+ * 3. runs the agent in the sandbox with the plan, the in-sandbox events
13
+ * path and the proxy URL passed by name, tailing the events file every
14
+ * second for an abort condition,
15
+ * 4. runs `verify` the same way (its exit code is task success),
16
+ * 5. stops the proxy, copies `.intutic-chaos/` next to the report and
17
+ * removes the worktree (unless kept).
18
+ *
19
+ * Everything with a side effect comes in through {@link ChaosDeps}, so the
20
+ * orchestration is tested without Docker, a proxy binary or git.
21
+ *
22
+ * @module
23
+ */
24
+ import { type Experiment, type ProbeId, type RunVerdict } from '@intutic/shared-types';
25
+ import { type ProbeReport, type ProbeResult } from './probes.js';
26
+ /** Where the runner's files live inside a repetition's workspace. */
27
+ export declare const CHAOS_DIR = ".intutic-chaos";
28
+ /** The events file as the sandbox sees it (the workspace is mounted at /work). */
29
+ export declare const SANDBOX_EVENTS_PATH = "/work/.intutic-chaos/events.jsonl";
30
+ /** A running dedicated proxy. */
31
+ export interface ProxyProcess {
32
+ /** Resolves with a description of how the process ended. */
33
+ exited: Promise<string>;
34
+ stop(): Promise<void>;
35
+ }
36
+ /** A run refused before any repetition started. */
37
+ export declare class ChaosRefusal extends Error {
38
+ }
39
+ /** Everything the run does to the outside world. */
40
+ export interface ChaosDeps {
41
+ /** Select the sandbox backend, check its health, prepare the image. Throws when unavailable. */
42
+ readySandbox(image: string): Promise<{
43
+ name: string;
44
+ }>;
45
+ /** Run one command in the sandbox; resolves with its exit code. */
46
+ runInSandbox(args: {
47
+ command: string[];
48
+ workdir: string;
49
+ env: Record<string, string>;
50
+ image: string;
51
+ name: string;
52
+ onStdout: (chunk: Buffer) => void;
53
+ signal?: AbortSignal;
54
+ }): Promise<number>;
55
+ /** The proxy env the sandboxed agent gets for a proxy on the host's `port`. */
56
+ sandboxEnv(port: number): Record<string, string>;
57
+ /** Start the proxy binary `intutic start` runs, with this env and its output in `logPath`. */
58
+ startProxy(args: {
59
+ port: number;
60
+ env: Record<string, string>;
61
+ logPath: string;
62
+ }): ProxyProcess;
63
+ /** True when the proxy's health endpoint answers. */
64
+ proxyHealthy(port: number): Promise<boolean>;
65
+ freePort(): Promise<number>;
66
+ git: {
67
+ /** `git status --porcelain` output; throws outside a repository. */
68
+ status(cwd: string): Promise<string>;
69
+ worktreeAdd(cwd: string, dir: string): Promise<void>;
70
+ worktreeRemove(cwd: string, dir: string): Promise<void>;
71
+ };
72
+ /** A fresh empty directory for a repetition's worktree to live under. */
73
+ makeTempDir(): Promise<string>;
74
+ randomHex(bytes: number): string;
75
+ /** Where the agent's and verify's stdout is echoed (the terminal). */
76
+ echo(chunk: Buffer): void;
77
+ log: {
78
+ info(msg: string): void;
79
+ warn(msg: string): void;
80
+ dim(msg: string): void;
81
+ };
82
+ }
83
+ export interface ChaosRunOptions {
84
+ experiment: Experiment;
85
+ cwd: string;
86
+ image: string;
87
+ outPath: string;
88
+ keep: boolean;
89
+ /** How often the events file is tailed for abort conditions. */
90
+ pollMs?: number;
91
+ /** How long the proxy gets to answer its health endpoint. */
92
+ healthTimeoutMs?: number;
93
+ /** The host's policy snapshot, copied into each repetition for its gates. */
94
+ snapshotRules?: string;
95
+ /** The host's approved-bypass list, copied in the same way. */
96
+ approvedBypasses?: string;
97
+ }
98
+ export interface RepetitionReport {
99
+ repetition: number;
100
+ baseline: boolean;
101
+ runId: string;
102
+ canary: string;
103
+ agentExitCode: number | null;
104
+ verifyExitCode: number | null;
105
+ costUsd: number;
106
+ durationS: number;
107
+ malformedEvents: number;
108
+ aborted?: string;
109
+ error?: string;
110
+ probes?: Partial<Record<ProbeId, ProbeResult>>;
111
+ eventsPath: string;
112
+ agentOutPath: string;
113
+ /** Set with --keep: the worktree left in place. */
114
+ workspace?: string;
115
+ }
116
+ export interface ChaosReport {
117
+ version: 1;
118
+ experiment: Experiment;
119
+ startedAt: string;
120
+ finishedAt: string;
121
+ sandbox: string;
122
+ repetitions: RepetitionReport[];
123
+ probes: ProbeReport[];
124
+ verdict: RunVerdict;
125
+ warnings: string[];
126
+ malformedEvents: number;
127
+ reportPath: string;
128
+ }
129
+ /** Run an experiment end to end and write its report. */
130
+ export declare function runChaos(opts: ChaosRunOptions, deps: ChaosDeps): Promise<ChaosReport>;
131
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/lib/chaos/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AAGpB,qEAAqE;AACrE,eAAO,MAAM,SAAS,mBAAmB,CAAA;AACzC,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,sCAAoC,CAAA;AAEpE,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,mDAAmD;AACnD,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,gGAAgG;IAChG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD,mEAAmE;IACnE,YAAY,CAAC,IAAI,EAAE;QACjB,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;QACjC,MAAM,CAAC,EAAE,WAAW,CAAA;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACnB,+EAA+E;IAC/E,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChD,8FAA8F;IAC9F,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAA;IAC9F,qDAAqD;IACrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5C,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3B,GAAG,EAAE;QACH,oEAAoE;QACpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QACpC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACpD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACxD,CAAA;IACD,yEAAyE;IACzE,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,sEAAsE;IACtE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,GAAG,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAClF;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAA;IACV,UAAU,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,OAAO,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AASD,yDAAyD;AACzD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CA+G3F"}