@intutic/cli 2.3.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.
- package/dist/cli.js +133 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/budgetLimits.d.ts +70 -0
- package/dist/commands/budgetLimits.d.ts.map +1 -0
- package/dist/commands/budgetLimits.js +223 -0
- package/dist/commands/budgetLimits.js.map +1 -0
- package/dist/commands/chaos.d.ts +40 -0
- package/dist/commands/chaos.d.ts.map +1 -0
- package/dist/commands/chaos.js +252 -0
- package/dist/commands/chaos.js.map +1 -0
- package/dist/commands/credentials.d.ts +5 -1
- package/dist/commands/credentials.d.ts.map +1 -1
- package/dist/commands/credentials.js +98 -9
- package/dist/commands/credentials.js.map +1 -1
- package/dist/commands/exec.d.ts +29 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +72 -35
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/incidents.d.ts +32 -0
- package/dist/commands/incidents.d.ts.map +1 -0
- package/dist/commands/incidents.js +94 -0
- package/dist/commands/incidents.js.map +1 -0
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +4 -1
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/settings.d.ts +5 -4
- package/dist/commands/settings.d.ts.map +1 -1
- package/dist/commands/settings.js +8 -6
- package/dist/commands/settings.js.map +1 -1
- package/dist/harness/openhands.d.ts.map +1 -1
- package/dist/harness/openhands.js +3 -4
- package/dist/harness/openhands.js.map +1 -1
- package/dist/lib/chaos/experiment.d.ts +18 -0
- package/dist/lib/chaos/experiment.d.ts.map +1 -0
- package/dist/lib/chaos/experiment.js +40 -0
- package/dist/lib/chaos/experiment.js.map +1 -0
- package/dist/lib/chaos/probes.d.ts +97 -0
- package/dist/lib/chaos/probes.d.ts.map +1 -0
- package/dist/lib/chaos/probes.js +191 -0
- package/dist/lib/chaos/probes.js.map +1 -0
- package/dist/lib/chaos/runner.d.ts +131 -0
- package/dist/lib/chaos/runner.d.ts.map +1 -0
- package/dist/lib/chaos/runner.js +340 -0
- package/dist/lib/chaos/runner.js.map +1 -0
- package/dist/lib/chaos/workspace.d.ts +70 -0
- package/dist/lib/chaos/workspace.d.ts.map +1 -0
- package/dist/lib/chaos/workspace.js +216 -0
- package/dist/lib/chaos/workspace.js.map +1 -0
- package/dist/lib/gitHooks.d.ts.map +1 -1
- package/dist/lib/gitHooks.js +6 -4
- package/dist/lib/gitHooks.js.map +1 -1
- package/dist/lib/providerProbe.d.ts +1 -1
- package/dist/lib/providerProbe.d.ts.map +1 -1
- package/dist/lib/providerProbe.js +13 -5
- package/dist/lib/providerProbe.js.map +1 -1
- package/dist/lib/sandbox/firecracker.d.ts.map +1 -1
- package/dist/lib/sandbox/firecracker.js +4 -1
- package/dist/lib/sandbox/firecracker.js.map +1 -1
- package/dist/lib/sandbox/image.d.ts +13 -4
- package/dist/lib/sandbox/image.d.ts.map +1 -1
- package/dist/lib/sandbox/image.js +25 -8
- package/dist/lib/sandbox/image.js.map +1 -1
- package/dist/lib/sandbox/oci.d.ts.map +1 -1
- package/dist/lib/sandbox/oci.js +18 -3
- package/dist/lib/sandbox/oci.js.map +1 -1
- package/dist/lib/sandbox/types.d.ts +6 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/resources/chaos/credential-revoked.yaml +28 -0
- package/resources/chaos/poisoned-readme.yaml +29 -0
- package/resources/chaos/registry-down.yaml +25 -0
- package/resources/sandbox/Dockerfile.node +19 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic budget set|keys|key|members|member` — the workspace caps, and the
|
|
3
|
+
* spend budgets and rate limits on virtual keys and members.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* - `intutic budget set [--daily <usd|default>] [--monthly <usd|default>] [--threshold <pct>]
|
|
7
|
+
* [--daily-enforcement hard|soft] [--monthly-enforcement hard|soft]`
|
|
8
|
+
* - `intutic budget keys [--json]`
|
|
9
|
+
* - `intutic budget key <keyId> [--daily <usd|none>] [--monthly <usd|none>]
|
|
10
|
+
* [--daily-enforcement hard|soft] [--monthly-enforcement hard|soft]
|
|
11
|
+
* [--rpm <n|none>] [--tpm <n|none>]`
|
|
12
|
+
* - `intutic budget members [--json]`
|
|
13
|
+
* - `intutic budget member <memberId|default> [--daily <usd|none>]
|
|
14
|
+
* [--monthly <usd|none>] [--daily-enforcement hard|soft]
|
|
15
|
+
* [--monthly-enforcement hard|soft]`
|
|
16
|
+
*
|
|
17
|
+
* Server side (services/control-plane/src/routes/budget.ts, routes/keys.ts):
|
|
18
|
+
* `PUT /api/v1/budget`, `GET /api/v1/budget/keys`, `PATCH /api/v1/keys/:id`,
|
|
19
|
+
* `GET /api/v1/budget/members`, `PUT /api/v1/budget/members/:memberId`. The
|
|
20
|
+
* writes need OWNER or ADMIN, and member budgets a plan with them; the
|
|
21
|
+
* server's refusal is printed as it says it.
|
|
22
|
+
*
|
|
23
|
+
* Every write here changes only what its flags name. `budget set` sends only
|
|
24
|
+
* those fields (the route is a partial update); the key and member writes
|
|
25
|
+
* read the subject's budgets first and send them back with the change,
|
|
26
|
+
* because those routes replace a subject's budgets whole.
|
|
27
|
+
*
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
import { log } from '../lib/logger.js';
|
|
31
|
+
import { fail, runApiCommand } from './apiCommand.js';
|
|
32
|
+
const usd = (n) => `$${n.toFixed(2)}`;
|
|
33
|
+
/** A dollar amount, or `none` (returned as `null`), or fails naming the flag. */
|
|
34
|
+
function amountOrNone(value, flag) {
|
|
35
|
+
if (value.trim().toLowerCase() === 'none')
|
|
36
|
+
return null;
|
|
37
|
+
const n = Number(value);
|
|
38
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
39
|
+
fail(`${flag} must be a dollar amount above 0, or "none", got "${value}"`);
|
|
40
|
+
return n;
|
|
41
|
+
}
|
|
42
|
+
/** A whole number, or `none` (returned as `null`), or fails naming the flag. */
|
|
43
|
+
function countOrNone(value, flag) {
|
|
44
|
+
if (value.trim().toLowerCase() === 'none')
|
|
45
|
+
return null;
|
|
46
|
+
const n = Number(value);
|
|
47
|
+
if (!Number.isInteger(n) || n <= 0)
|
|
48
|
+
fail(`${flag} must be a positive whole number, or "none", got "${value}"`);
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
function enforcement(value, flag) {
|
|
52
|
+
if (value === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (value !== 'hard' && value !== 'soft')
|
|
55
|
+
fail(`${flag} must be hard or soft, got "${value}"`);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `current` with the periods the flags name changed: `--daily none` removes
|
|
60
|
+
* the day budget, `--daily 5` sets it (keeping its enforcement unless
|
|
61
|
+
* `--daily-enforcement` says otherwise, hard for a new one), and an
|
|
62
|
+
* enforcement flag alone changes an existing budget's.
|
|
63
|
+
*/
|
|
64
|
+
export function applyBudgetFlags(current, flags) {
|
|
65
|
+
const out = new Map(current.map((b) => [b.period, { ...b }]));
|
|
66
|
+
for (const [period, amount, mode, flag] of [
|
|
67
|
+
['day', flags.daily, flags.dailyEnforcement, '--daily'],
|
|
68
|
+
['month', flags.monthly, flags.monthlyEnforcement, '--monthly'],
|
|
69
|
+
]) {
|
|
70
|
+
const how = enforcement(mode, `${flag}-enforcement`);
|
|
71
|
+
if (amount !== undefined) {
|
|
72
|
+
const limitUsd = amountOrNone(amount, flag);
|
|
73
|
+
if (limitUsd === null)
|
|
74
|
+
out.delete(period);
|
|
75
|
+
else
|
|
76
|
+
out.set(period, { period, limitUsd, enforcement: how ?? out.get(period)?.enforcement ?? 'hard' });
|
|
77
|
+
}
|
|
78
|
+
else if (how) {
|
|
79
|
+
const existing = out.get(period);
|
|
80
|
+
if (!existing)
|
|
81
|
+
fail(`${flag}-enforcement needs a ${period} budget: set one with ${flag} <usd>`);
|
|
82
|
+
existing.enforcement = how;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return [...out.values()].sort((a, b) => (a.period === b.period ? 0 : a.period === 'day' ? -1 : 1));
|
|
86
|
+
}
|
|
87
|
+
/** One budget list in words: `$5.00/day hard, $50.00/month soft`, or `none`. */
|
|
88
|
+
export function describeBudgets(budgets) {
|
|
89
|
+
if (budgets.length === 0)
|
|
90
|
+
return 'none';
|
|
91
|
+
return budgets.map((b) => `${usd(b.limitUsd)}/${b.period} ${b.enforcement}`).join(', ');
|
|
92
|
+
}
|
|
93
|
+
function describeRateLimit(r) {
|
|
94
|
+
const parts = [r.rpm ? `${r.rpm} requests/min` : '', r.tpm ? `${r.tpm} tokens/min` : ''].filter(Boolean);
|
|
95
|
+
return parts.length ? parts.join(', ') : 'none';
|
|
96
|
+
}
|
|
97
|
+
function hasBudgetFlags(flags) {
|
|
98
|
+
return [flags.daily, flags.monthly, flags.dailyEnforcement, flags.monthlyEnforcement].some((v) => v !== undefined);
|
|
99
|
+
}
|
|
100
|
+
/** A cap flag: a dollar amount (0 is no cap), or `default` (sent as `null`) to return to the default. */
|
|
101
|
+
function capOrDefault(value, flag) {
|
|
102
|
+
if (value === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (value.trim().toLowerCase() === 'default')
|
|
105
|
+
return null;
|
|
106
|
+
const n = Number(value);
|
|
107
|
+
if (!(n >= 0))
|
|
108
|
+
fail(`${flag} must be a dollar amount (0 for no cap) or "default", got "${value}"`);
|
|
109
|
+
return n;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The `PUT /api/v1/budget` body for the flags given: only those, so a cap
|
|
113
|
+
* nobody named stays as it is — in particular a daily cap that was never
|
|
114
|
+
* saved stays on the default.
|
|
115
|
+
*/
|
|
116
|
+
export function budgetSetBody(opts) {
|
|
117
|
+
const body = {};
|
|
118
|
+
const daily = capOrDefault(opts.daily, '--daily');
|
|
119
|
+
const monthly = capOrDefault(opts.monthly, '--monthly');
|
|
120
|
+
if (daily !== undefined)
|
|
121
|
+
body.daily_budget_usd = daily;
|
|
122
|
+
if (monthly !== undefined)
|
|
123
|
+
body.monthly_budget_usd = monthly;
|
|
124
|
+
if (opts.threshold !== undefined) {
|
|
125
|
+
const t = Number(opts.threshold);
|
|
126
|
+
if (!(Number.isInteger(t) && t >= 1 && t <= 100))
|
|
127
|
+
fail(`--threshold must be a whole percentage from 1 to 100, got "${opts.threshold}"`);
|
|
128
|
+
body.alert_threshold_pct = t;
|
|
129
|
+
}
|
|
130
|
+
const dailyEnforcement = enforcement(opts.dailyEnforcement, '--daily-enforcement');
|
|
131
|
+
const monthlyEnforcement = enforcement(opts.monthlyEnforcement, '--monthly-enforcement');
|
|
132
|
+
if (dailyEnforcement)
|
|
133
|
+
body.daily_enforcement = dailyEnforcement;
|
|
134
|
+
if (monthlyEnforcement)
|
|
135
|
+
body.monthly_enforcement = monthlyEnforcement;
|
|
136
|
+
if (Object.keys(body).length === 0) {
|
|
137
|
+
fail('Nothing to change: pass --daily, --monthly, --threshold, --daily-enforcement or --monthly-enforcement');
|
|
138
|
+
}
|
|
139
|
+
return body;
|
|
140
|
+
}
|
|
141
|
+
export async function runBudgetSet(opts) {
|
|
142
|
+
const body = budgetSetBody(opts);
|
|
143
|
+
await runApiCommand(opts, 'Failed to update the workspace budget', async (client) => {
|
|
144
|
+
await client.put('/api/v1/budget', body);
|
|
145
|
+
return client.get('/api/v1/budget');
|
|
146
|
+
}, (b) => {
|
|
147
|
+
log.success('Workspace budget updated');
|
|
148
|
+
log.field('Daily cap', `${usd(b.daily_budget_usd)} (${b.daily_enforcement})${b.daily_budget_is_default ? ', the default' : ''}`);
|
|
149
|
+
log.field('Monthly cap', `${usd(b.monthly_budget_usd)} (${b.monthly_enforcement})`);
|
|
150
|
+
log.field('Alert at', `${b.alert_threshold_pct}%`);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function runBudgetKeys(opts) {
|
|
154
|
+
await runApiCommand(opts, 'Failed to list key budgets', (client) => client.get('/api/v1/budget/keys'), (res) => {
|
|
155
|
+
log.header('Virtual key budgets');
|
|
156
|
+
if (res.keys.length === 0)
|
|
157
|
+
console.log(' No live keys.');
|
|
158
|
+
for (const k of res.keys) {
|
|
159
|
+
console.log(` ${k.keyPrefix}… ${k.label} (${k.keyId}, ${k.memberEmail})`);
|
|
160
|
+
console.log(` Spent today ${usd(k.spendTodayUsd)}, this month ${usd(k.spendThisMonthUsd)}`);
|
|
161
|
+
console.log(` Budgets: ${describeBudgets(k.budgets)} Rate limit: ${describeRateLimit(k.rateLimit)}`);
|
|
162
|
+
}
|
|
163
|
+
console.log(` Days reset at ${res.dayResetsAt}; months at ${res.monthResetsAt} (UTC).`);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export async function runBudgetKey(keyId, opts) {
|
|
167
|
+
const budgetsChange = hasBudgetFlags(opts);
|
|
168
|
+
if (!budgetsChange && opts.rpm === undefined && opts.tpm === undefined) {
|
|
169
|
+
fail('Nothing to change: pass --daily, --monthly, an enforcement flag, --rpm or --tpm');
|
|
170
|
+
}
|
|
171
|
+
const rateLimit = {};
|
|
172
|
+
if (opts.rpm !== undefined)
|
|
173
|
+
rateLimit.rpm = countOrNone(opts.rpm, '--rpm');
|
|
174
|
+
if (opts.tpm !== undefined)
|
|
175
|
+
rateLimit.tpm = countOrNone(opts.tpm, '--tpm');
|
|
176
|
+
await runApiCommand(opts, `Failed to update key ${keyId}`, async (client) => {
|
|
177
|
+
let budgets;
|
|
178
|
+
if (budgetsChange) {
|
|
179
|
+
const listed = await client.get('/api/v1/budget/keys');
|
|
180
|
+
const current = listed.keys.find((k) => k.keyId === keyId);
|
|
181
|
+
if (!current)
|
|
182
|
+
throw new Error(`no live key ${keyId} in this workspace`);
|
|
183
|
+
budgets = applyBudgetFlags(current.budgets, opts);
|
|
184
|
+
}
|
|
185
|
+
return client.patch(`/api/v1/keys/${keyId}`, {
|
|
186
|
+
...(budgets ? { budgets } : {}),
|
|
187
|
+
...(Object.keys(rateLimit).length ? { rateLimit } : {}),
|
|
188
|
+
});
|
|
189
|
+
}, (k) => {
|
|
190
|
+
log.success(`Key ${k.keyId} updated`);
|
|
191
|
+
log.field('Budgets', describeBudgets(k.budgets));
|
|
192
|
+
log.field('Rate limit', describeRateLimit(k.rateLimit));
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
export async function runBudgetMembers(opts) {
|
|
196
|
+
await runApiCommand(opts, 'Failed to list member budgets', (client) => client.get('/api/v1/budget/members'), (res) => {
|
|
197
|
+
log.header('Member budgets');
|
|
198
|
+
log.field('Default (every member without their own)', describeBudgets(res.defaultBudgets));
|
|
199
|
+
for (const m of res.members) {
|
|
200
|
+
console.log(` ${m.email} (${m.memberId})`);
|
|
201
|
+
console.log(` Spent today ${usd(m.spendTodayUsd)}, this month ${usd(m.spendThisMonthUsd)}`);
|
|
202
|
+
console.log(` Own: ${describeBudgets(m.budgets)} Applies: ${describeBudgets(m.effectiveBudgets)}`);
|
|
203
|
+
}
|
|
204
|
+
console.log(` Days reset at ${res.dayResetsAt}; months at ${res.monthResetsAt} (UTC).`);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
export async function runBudgetMember(memberId, opts) {
|
|
208
|
+
if (!hasBudgetFlags(opts))
|
|
209
|
+
fail('Nothing to change: pass --daily, --monthly or an enforcement flag');
|
|
210
|
+
await runApiCommand(opts, `Failed to update the budgets of ${memberId}`, async (client) => {
|
|
211
|
+
const listed = await client.get('/api/v1/budget/members');
|
|
212
|
+
const current = memberId === 'default' ? listed.defaultBudgets : listed.members.find((m) => m.memberId === memberId)?.budgets;
|
|
213
|
+
if (!current)
|
|
214
|
+
throw new Error(`no active member ${memberId} in this workspace`);
|
|
215
|
+
return client.put(`/api/v1/budget/members/${encodeURIComponent(memberId)}`, {
|
|
216
|
+
budgets: applyBudgetFlags(current, opts),
|
|
217
|
+
});
|
|
218
|
+
}, (m) => {
|
|
219
|
+
log.success(m.memberId === 'default' ? 'Default member budget updated' : `Budgets of ${m.memberId} updated`);
|
|
220
|
+
log.field('Budgets', describeBudgets(m.budgets));
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=budgetLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budgetLimits.js","sourceRoot":"","sources":["../../src/commands/budgetLimits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAuB,MAAM,iBAAiB,CAAA;AAkE1E,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AAE7C,iFAAiF;AACjF,SAAS,YAAY,CAAC,KAAa,EAAE,IAAY;IAC/C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,GAAG,IAAI,qDAAqD,KAAK,GAAG,CAAC,CAAA;IAC7G,OAAO,CAAC,CAAA;AACV,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,KAAa,EAAE,IAAY;IAC9C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,GAAG,IAAI,qDAAqD,KAAK,GAAG,CAAC,CAAA;IAC9G,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,IAAY;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;QAAE,IAAI,CAAC,GAAG,IAAI,+BAA+B,KAAK,GAAG,CAAC,CAAA;IAC9F,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA+B,EAAE,KAAkB;IAClF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAiC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7F,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI;QACzC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,SAAS,CAAC;QACvD,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC;KACvD,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,IAAI,cAAc,CAAC,CAAA;QACpD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,QAAQ,KAAK,IAAI;gBAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;gBACpC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,MAAM,EAAE,CAAC,CAAA;QACxG,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAChC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,GAAG,IAAI,wBAAwB,MAAM,yBAAyB,IAAI,QAAQ,CAAC,CAAA;YAC/F,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACpG,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzF,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAe;IACxC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,KAAkB;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;AACpH,CAAC;AAED,yGAAyG;AACzG,SAAS,YAAY,CAAC,KAAyB,EAAE,IAAY;IAC3D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,IAAI,CAAC,GAAG,IAAI,8DAA8D,KAAK,GAAG,CAAC,CAAA;IAClG,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,IAAI,GAA4B,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACvD,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAA;IACtD,IAAI,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAA;IAC5D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,8DAA8D,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QACvI,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAA;IAClF,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAA;IACxF,IAAI,gBAAgB;QAAE,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;IAC/D,IAAI,kBAAkB;QAAE,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAA;IACrE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,uGAAuG,CAAC,CAAA;IAC/G,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,aAAa,CACjB,IAAI,EACJ,uCAAuC,EACvC,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QACxC,OAAO,MAAM,CAAC,GAAG,CAAkB,gBAAgB,CAAC,CAAA;IACtD,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;QACvC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAChI,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAA;QACnF,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAA;IACpD,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAoB;IACtD,MAAM,aAAa,CACjB,IAAI,EACJ,4BAA4B,EAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAe,qBAAqB,CAAC,EAC3D,CAAC,GAAG,EAAE,EAAE;QACN,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;QACjC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QACzD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAA;YAC5E,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;YAC9F,OAAO,CAAC,GAAG,CAAC,gBAAgB,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAC3G,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,WAAW,eAAe,GAAG,CAAC,aAAa,SAAS,CAAC,CAAA;IAC1F,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,IAAc;IAC9D,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACvE,IAAI,CAAC,iFAAiF,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,SAAS,GAA0B,EAAE,CAAA;IAC3C,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QAAE,SAAS,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC1E,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QAAE,SAAS,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE1E,MAAM,aAAa,CACjB,IAAI,EACJ,wBAAwB,KAAK,EAAE,EAC/B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,OAAkC,CAAA;QACtC,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,qBAAqB,CAAC,CAAA;YACpE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YAC1D,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,oBAAoB,CAAC,CAAA;YACvE,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAqE,gBAAgB,KAAK,EAAE,EAAE;YAC/G,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,UAAU,CAAC,CAAA;QACrC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAChD,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IACzD,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACzD,MAAM,aAAa,CACjB,IAAI,EACJ,+BAA+B,EAC/B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAkB,wBAAwB,CAAC,EACjE,CAAC,GAAG,EAAE,EAAE;QACN,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAC5B,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;QAC1F,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAA;YAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;YAC9F,OAAO,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;QACzG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,WAAW,eAAe,GAAG,CAAC,aAAa,SAAS,CAAC,CAAA;IAC1F,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAiB;IACvE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,mEAAmE,CAAC,CAAA;IACpG,MAAM,aAAa,CACjB,IAAI,EACJ,mCAAmC,QAAQ,EAAE,EAC7C,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,wBAAwB,CAAC,CAAA;QAC1E,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAA;QAC7H,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,oBAAoB,CAAC,CAAA;QAC/E,OAAO,MAAM,CAAC,GAAG,CAA+C,0BAA0B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;YACxH,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC;SACzC,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAA;QAC5G,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAClD,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic chaos` — run an agent with a known fault injected, check what it
|
|
3
|
+
* did, score it.
|
|
4
|
+
*
|
|
5
|
+
* - `validate <file>` checks an experiment file;
|
|
6
|
+
* - `list` prints the fault catalog;
|
|
7
|
+
* - `run <file>` runs the experiment in the sandbox (never on the host).
|
|
8
|
+
*
|
|
9
|
+
* The orchestration lives in lib/chaos/runner.ts; this file wires it to the
|
|
10
|
+
* real sandbox, proxy binary and git, and prints the result.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { type RunVerdict } from '@intutic/shared-types';
|
|
15
|
+
import { type GraphIdentity } from '../lib/graphIdentity.js';
|
|
16
|
+
import { type ChaosReport } from '../lib/chaos/runner.js';
|
|
17
|
+
/** `intutic chaos validate <file>` */
|
|
18
|
+
export declare function runChaosValidate(file: string): Promise<void>;
|
|
19
|
+
/** `intutic chaos list` */
|
|
20
|
+
export declare function runChaosList(): void;
|
|
21
|
+
/** The example experiments shipped with the CLI (src/ and dist/ sit at the same depth). */
|
|
22
|
+
export declare function examplesDir(): string;
|
|
23
|
+
/** `intutic chaos run <file>` */
|
|
24
|
+
export declare function runChaosRun(file: string, opts: {
|
|
25
|
+
sandboxImage?: string;
|
|
26
|
+
out?: string;
|
|
27
|
+
keep?: boolean;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
/** 0 scored, 1 aborted, 2 invalid. */
|
|
30
|
+
export declare function exitCode(verdict: RunVerdict): number;
|
|
31
|
+
export declare function printSummary(report: ChaosReport): void;
|
|
32
|
+
/**
|
|
33
|
+
* The sandbox environment for a repetition. Never the workspace login: each
|
|
34
|
+
* repetition's proxy runs standalone, so it cannot resolve an Intutic key, and
|
|
35
|
+
* handing one to the agent in place of its provider keys would fail every
|
|
36
|
+
* model call (every baseline, so every run, invalid). The agent keeps its own
|
|
37
|
+
* provider keys, passed by name, and the standalone proxy forwards them.
|
|
38
|
+
*/
|
|
39
|
+
export declare function chaosSandboxEnv(identity: GraphIdentity, port: number): Record<string, string>;
|
|
40
|
+
//# sourceMappingURL=chaos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chaos.d.ts","sourceRoot":"","sources":["../../src/commands/chaos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACjF,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAM5E,OAAO,EAA0C,KAAK,WAAW,EAAqB,MAAM,wBAAwB,CAAA;AASpH,sCAAsC;AACtC,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED,2BAA2B;AAC3B,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,iCAAiC;AACjC,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED,sCAAsC;AACtC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAuBtD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE7F"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic chaos` — run an agent with a known fault injected, check what it
|
|
3
|
+
* did, score it.
|
|
4
|
+
*
|
|
5
|
+
* - `validate <file>` checks an experiment file;
|
|
6
|
+
* - `list` prints the fault catalog;
|
|
7
|
+
* - `run <file>` runs the experiment in the sandbox (never on the host).
|
|
8
|
+
*
|
|
9
|
+
* The orchestration lives in lib/chaos/runner.ts; this file wires it to the
|
|
10
|
+
* real sandbox, proxy binary and git, and prints the result.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import { randomBytes } from 'node:crypto';
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as net from 'node:net';
|
|
18
|
+
import * as os from 'node:os';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
import pc from 'picocolors';
|
|
22
|
+
import { FAULT_CATALOG, FAULT_IDS } from '@intutic/shared-types';
|
|
23
|
+
import { deriveIdentity } from '../lib/graphIdentity.js';
|
|
24
|
+
import { log } from '../lib/logger.js';
|
|
25
|
+
import { resolveProxyBinary } from '../lib/proxyBinary.js';
|
|
26
|
+
import { resolveSnapshotRulesPath } from '../lib/policySnapshot.js';
|
|
27
|
+
import { selectBackend } from '../lib/sandbox/index.js';
|
|
28
|
+
import { loadExperiment } from '../lib/chaos/experiment.js';
|
|
29
|
+
import { ChaosRefusal, runChaos } from '../lib/chaos/runner.js';
|
|
30
|
+
import { readySandbox, sandboxProxyEnv, sandboxSpec, SandboxUnavailableError, } from './exec.js';
|
|
31
|
+
/** `intutic chaos validate <file>` */
|
|
32
|
+
export async function runChaosValidate(file) {
|
|
33
|
+
const result = await loadExperiment(file);
|
|
34
|
+
if (!result.ok) {
|
|
35
|
+
log.error(`${file} is not a valid experiment:`);
|
|
36
|
+
for (const e of result.errors)
|
|
37
|
+
log.dim(` ${e}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const x = result.experiment;
|
|
41
|
+
log.success(`${file} is valid: ${x.name} — ${x.faults.length} fault${x.faults.length > 1 ? 's' : ''}, ${x.repeat} baseline + ${x.repeat} faulted repetitions`);
|
|
42
|
+
}
|
|
43
|
+
/** `intutic chaos list` */
|
|
44
|
+
export function runChaosList() {
|
|
45
|
+
const width = Math.max(...FAULT_IDS.map((id) => id.length));
|
|
46
|
+
console.log(pc.bold(`${'FAULT'.padEnd(width)} ${'INJECTED BY'.padEnd(18)} SAFETY`));
|
|
47
|
+
for (const id of FAULT_IDS) {
|
|
48
|
+
const { injectedBy, safety } = FAULT_CATALOG[id];
|
|
49
|
+
console.log(`${id.padEnd(width)} ${injectedBy.join(', ').padEnd(18)} ${safety === 'mutating' ? pc.yellow(safety) : safety}`);
|
|
50
|
+
}
|
|
51
|
+
console.log('');
|
|
52
|
+
log.dim('fail_safe faults deny, delay or error; mutating faults change what the agent sees. Every fault runs only in the sandbox.');
|
|
53
|
+
log.dim(`Example experiments: ${examplesDir()}`);
|
|
54
|
+
}
|
|
55
|
+
/** The example experiments shipped with the CLI (src/ and dist/ sit at the same depth). */
|
|
56
|
+
export function examplesDir() {
|
|
57
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../resources/chaos');
|
|
58
|
+
}
|
|
59
|
+
/** `intutic chaos run <file>` */
|
|
60
|
+
export async function runChaosRun(file, opts) {
|
|
61
|
+
const result = await loadExperiment(file);
|
|
62
|
+
if (!result.ok) {
|
|
63
|
+
log.error(`${file} is not a valid experiment:`);
|
|
64
|
+
for (const e of result.errors)
|
|
65
|
+
log.dim(` ${e}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const experiment = result.experiment;
|
|
69
|
+
const { DEFAULT_SANDBOX_IMAGE } = await import('../lib/sandbox/image.js');
|
|
70
|
+
const image = opts.sandboxImage ?? experiment.sandbox_image ?? DEFAULT_SANDBOX_IMAGE;
|
|
71
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
72
|
+
// Under the temp dir by default: a report in the project would dirty the
|
|
73
|
+
// tree the next run requires clean.
|
|
74
|
+
const outPath = path.resolve(opts.out ?? path.join(os.tmpdir(), 'intutic-chaos', `report-${experiment.name}-${stamp}.json`));
|
|
75
|
+
log.header(`Chaos run: ${experiment.name}`);
|
|
76
|
+
log.dim('Every repetition runs a real agent and spends real tokens; the cost ceiling in the experiment applies to each.');
|
|
77
|
+
let report;
|
|
78
|
+
try {
|
|
79
|
+
report = await runChaos({
|
|
80
|
+
experiment,
|
|
81
|
+
cwd: process.cwd(),
|
|
82
|
+
image,
|
|
83
|
+
outPath,
|
|
84
|
+
keep: Boolean(opts.keep),
|
|
85
|
+
// Where this machine's gates read them, as the gates resolve it.
|
|
86
|
+
snapshotRules: resolveSnapshotRulesPath(),
|
|
87
|
+
approvedBypasses: process.env.INTUTIC_APPROVED_BYPASSES || path.join(os.homedir(), '.intutic', 'hooks', 'approved-bypasses.jsonl'),
|
|
88
|
+
}, await defaultDeps());
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (err instanceof ChaosRefusal || err instanceof SandboxUnavailableError) {
|
|
92
|
+
log.error(`Refusing to run: ${err.message}`);
|
|
93
|
+
if (err instanceof SandboxUnavailableError) {
|
|
94
|
+
log.dim('A chaos run never falls back to the host. Start Docker (or Podman) and try again.');
|
|
95
|
+
}
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
printSummary(report);
|
|
101
|
+
process.exit(exitCode(report.verdict));
|
|
102
|
+
}
|
|
103
|
+
/** 0 scored, 1 aborted, 2 invalid. */
|
|
104
|
+
export function exitCode(verdict) {
|
|
105
|
+
return verdict.kind === 'scored' ? 0 : verdict.kind === 'aborted' ? 1 : 2;
|
|
106
|
+
}
|
|
107
|
+
export function printSummary(report) {
|
|
108
|
+
const v = report.verdict;
|
|
109
|
+
log.header(`Result: ${report.experiment.name}`);
|
|
110
|
+
if (v.kind === 'invalid') {
|
|
111
|
+
log.error(`Invalid: ${v.reason}`);
|
|
112
|
+
log.dim('Fix the task (or its verify command) so it passes without faults; no score is given.');
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const label = v.kind === 'scored' ? pc.green('scored') : pc.yellow(`aborted (${v.reason})`);
|
|
116
|
+
log.field('Verdict', label);
|
|
117
|
+
log.field('Resilience score', `${pc.bold(String(v.score))} / 100`);
|
|
118
|
+
console.log('');
|
|
119
|
+
for (const p of report.probes) {
|
|
120
|
+
const rate = p.evaluated ? `${p.passes}/${p.evaluated} ${Math.round(p.passRate * 100)}%` : 'not evaluated';
|
|
121
|
+
const extra = p.allPassed !== undefined && p.evaluated ? ` pass^k: ${p.allPassed ? 'yes' : 'no'}` : '';
|
|
122
|
+
console.log(` ${p.id.padEnd(24)} ${rate.padEnd(16)} weight ${p.weight}${extra}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (report.warnings.length) {
|
|
126
|
+
console.log('');
|
|
127
|
+
for (const w of report.warnings)
|
|
128
|
+
log.warn(w);
|
|
129
|
+
}
|
|
130
|
+
console.log('');
|
|
131
|
+
log.field('Report', report.reportPath);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The sandbox environment for a repetition. Never the workspace login: each
|
|
135
|
+
* repetition's proxy runs standalone, so it cannot resolve an Intutic key, and
|
|
136
|
+
* handing one to the agent in place of its provider keys would fail every
|
|
137
|
+
* model call (every baseline, so every run, invalid). The agent keeps its own
|
|
138
|
+
* provider keys, passed by name, and the standalone proxy forwards them.
|
|
139
|
+
*/
|
|
140
|
+
export function chaosSandboxEnv(identity, port) {
|
|
141
|
+
return sandboxProxyEnv(null, identity, String(port), []).env;
|
|
142
|
+
}
|
|
143
|
+
/** The real sandbox, proxy binary and git. */
|
|
144
|
+
async function defaultDeps() {
|
|
145
|
+
const identity = deriveIdentity();
|
|
146
|
+
const sandboxOpts = (image) => ({
|
|
147
|
+
kind: 'oci',
|
|
148
|
+
image,
|
|
149
|
+
memory: '2g',
|
|
150
|
+
cpus: '2',
|
|
151
|
+
pidsLimit: 512,
|
|
152
|
+
allow: [],
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
async readySandbox(image) {
|
|
156
|
+
// OCI only: it mounts the repetition's worktree at /work, which the
|
|
157
|
+
// events path inside the sandbox depends on.
|
|
158
|
+
const backend = await readySandbox('oci', {}, image);
|
|
159
|
+
return { name: backend.name };
|
|
160
|
+
},
|
|
161
|
+
runInSandbox({ command, workdir, env, image, name, onStdout, signal }) {
|
|
162
|
+
const spec = sandboxSpec(command, workdir, env, sandboxOpts(image), { tty: false, name, onStdout, signal });
|
|
163
|
+
return selectBackend('oci', env).run(spec);
|
|
164
|
+
},
|
|
165
|
+
sandboxEnv: (port) => chaosSandboxEnv(identity, port),
|
|
166
|
+
startProxy: ({ port, env, logPath }) => startProxy(port, env, logPath),
|
|
167
|
+
async proxyHealthy(port) {
|
|
168
|
+
try {
|
|
169
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) });
|
|
170
|
+
return res.ok;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
freePort,
|
|
177
|
+
git: {
|
|
178
|
+
status: (cwd) => git(cwd, ['status', '--porcelain']),
|
|
179
|
+
worktreeAdd: async (cwd, dir) => {
|
|
180
|
+
await git(cwd, ['worktree', 'add', '--detach', dir, 'HEAD']);
|
|
181
|
+
},
|
|
182
|
+
worktreeRemove: async (cwd, dir) => {
|
|
183
|
+
await git(cwd, ['worktree', 'remove', '--force', dir]);
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
makeTempDir: () => fs.promises.mkdtemp(path.join(os.tmpdir(), 'intutic-chaos-')),
|
|
187
|
+
randomHex: (bytes) => randomBytes(bytes).toString('hex'),
|
|
188
|
+
echo: (chunk) => {
|
|
189
|
+
process.stdout.write(chunk);
|
|
190
|
+
},
|
|
191
|
+
log,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* A dedicated proxy: the binary `intutic start` runs, on its own port, always
|
|
196
|
+
* standalone. It never reports to a control plane, so injected failures cannot
|
|
197
|
+
* reach a workspace's trust scores, incidents or rule promotion; local rules
|
|
198
|
+
* still apply.
|
|
199
|
+
*/
|
|
200
|
+
function startProxy(port, env, logPath) {
|
|
201
|
+
const out = fs.openSync(logPath, 'a');
|
|
202
|
+
const inherited = { ...process.env };
|
|
203
|
+
delete inherited.CONTROL_PLANE_URL;
|
|
204
|
+
const child = spawn(resolveProxyBinary(), [], {
|
|
205
|
+
stdio: ['ignore', out, out],
|
|
206
|
+
env: { ...inherited, INTUTIC_STANDALONE: '1', ...env },
|
|
207
|
+
});
|
|
208
|
+
fs.closeSync(out);
|
|
209
|
+
const exited = new Promise((resolve) => {
|
|
210
|
+
child.on('error', (err) => resolve(err.code === 'ENOENT' ? 'the intutic-proxy binary was not found; install it with npm install -g @intutic/proxy' : err.message));
|
|
211
|
+
child.on('exit', (code, signal) => resolve(signal ? `signal ${signal}` : `exit code ${code}; see ${logPath}`));
|
|
212
|
+
});
|
|
213
|
+
let done = false;
|
|
214
|
+
void exited.then(() => {
|
|
215
|
+
done = true;
|
|
216
|
+
});
|
|
217
|
+
return {
|
|
218
|
+
exited,
|
|
219
|
+
async stop() {
|
|
220
|
+
if (done)
|
|
221
|
+
return;
|
|
222
|
+
child.kill('SIGTERM');
|
|
223
|
+
const timeout = new Promise((r) => setTimeout(() => r('timeout'), 5000).unref());
|
|
224
|
+
if ((await Promise.race([exited, timeout])) === 'timeout')
|
|
225
|
+
child.kill('SIGKILL');
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function freePort() {
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
const server = net.createServer();
|
|
232
|
+
server.unref();
|
|
233
|
+
server.on('error', reject);
|
|
234
|
+
server.listen(0, '127.0.0.1', () => {
|
|
235
|
+
const addr = server.address();
|
|
236
|
+
const port = typeof addr === 'object' && addr ? addr.port : 0;
|
|
237
|
+
server.close(() => (port ? resolve(port) : reject(new Error('no free port'))));
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function git(cwd, args) {
|
|
242
|
+
return new Promise((resolve, reject) => {
|
|
243
|
+
const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
244
|
+
let stdout = '';
|
|
245
|
+
let stderr = '';
|
|
246
|
+
child.stdout.on('data', (c) => (stdout += c));
|
|
247
|
+
child.stderr.on('data', (c) => (stderr += c));
|
|
248
|
+
child.on('error', reject);
|
|
249
|
+
child.on('exit', (code) => code === 0 ? resolve(stdout) : reject(new Error(stderr.trim() || `git ${args[0]} exited ${code}`)));
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=chaos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chaos.js","sourceRoot":"","sources":["../../src/commands/chaos.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Subcommands:
|
|
6
6
|
* - `intutic credentials list [--json]`
|
|
7
|
-
* - `intutic credentials set <provider> --field key=value [--field key=
|
|
7
|
+
* - `intutic credentials set <provider> --field key=value [--field-file key=path ...]`
|
|
8
8
|
* - `intutic credentials unset <provider>`
|
|
9
|
+
* - `intutic credentials models <provider> [--json]`
|
|
9
10
|
*
|
|
10
11
|
* Server side: services/control-plane/src/routes/providerCredentials.ts.
|
|
11
12
|
* `list` reports every provider in the shared registry
|
|
@@ -24,8 +25,11 @@ export declare function runCredentialsList(opts: CredentialsCliOpts): Promise<vo
|
|
|
24
25
|
/** `intutic credentials set <provider>` */
|
|
25
26
|
export declare function runCredentialsSet(provider: string, opts: CredentialsCliOpts & {
|
|
26
27
|
field?: string[];
|
|
28
|
+
fieldFile?: string[];
|
|
27
29
|
}): Promise<void>;
|
|
28
30
|
/** `intutic credentials unset <provider>` */
|
|
29
31
|
export declare function runCredentialsUnset(provider: string, opts: CredentialsCliOpts): Promise<void>;
|
|
32
|
+
/** `intutic credentials models <provider>` */
|
|
33
|
+
export declare function runCredentialsModels(provider: string, opts: CredentialsCliOpts): Promise<void>;
|
|
30
34
|
export {};
|
|
31
35
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA6CD,iCAAiC;AACjC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF;AAED,2CAA2C;AAC3C,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CA2Hf;AAED,6CAA6C;AAC7C,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,8CAA8C;AAC9C,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCpG"}
|