@whiteroom-ai/cli 1.1.0 → 2.0.1

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 (39) hide show
  1. package/README.md +79 -0
  2. package/contract/catalog.json +264 -0
  3. package/dist/index.js +19 -15
  4. package/dist/index.js.map +1 -1
  5. package/dist/legacy-args.d.ts +4 -0
  6. package/dist/legacy-args.js +17 -0
  7. package/dist/legacy-args.js.map +1 -0
  8. package/dist/practice/adapter.d.ts +59 -0
  9. package/dist/practice/adapter.js +169 -0
  10. package/dist/practice/adapter.js.map +1 -0
  11. package/dist/practice/catalog.d.ts +27 -0
  12. package/dist/practice/catalog.js +6 -0
  13. package/dist/practice/catalog.js.map +1 -0
  14. package/dist/practice/engine.d.ts +52 -0
  15. package/dist/practice/engine.js +151 -0
  16. package/dist/practice/engine.js.map +1 -0
  17. package/dist/practice/index.d.ts +2 -0
  18. package/dist/practice/index.js +79 -0
  19. package/dist/practice/index.js.map +1 -0
  20. package/dist/practice/preflight.d.ts +64 -0
  21. package/dist/practice/preflight.js +204 -0
  22. package/dist/practice/preflight.js.map +1 -0
  23. package/dist/practice/run.d.ts +13 -0
  24. package/dist/practice/run.js +380 -0
  25. package/dist/practice/run.js.map +1 -0
  26. package/dist/practice/text.d.ts +107 -0
  27. package/dist/practice/text.js +185 -0
  28. package/dist/practice/text.js.map +1 -0
  29. package/dist/sandbox/index.d.ts +2 -0
  30. package/dist/sandbox/index.js +62 -0
  31. package/dist/sandbox/index.js.map +1 -0
  32. package/dist/sandbox/listen.d.ts +57 -0
  33. package/dist/sandbox/listen.js +299 -0
  34. package/dist/sandbox/listen.js.map +1 -0
  35. package/package.json +10 -3
  36. package/starters/wr-adapter.mjs +104 -0
  37. package/starters/wr_adapter.py +136 -0
  38. package/src/index.ts +0 -144
  39. package/tsconfig.json +0 -16
@@ -0,0 +1,204 @@
1
+ // Checks that run before anything is sent (spec §10 CLI, §9.3): the target,
2
+ // the adapter command, the provider key and the run code's shape.
3
+ import { accessSync, constants, statSync } from "node:fs";
4
+ import { basename, delimiter, isAbsolute, join, resolve } from "node:path";
5
+ import { CATALOG } from "./catalog.js";
6
+ import { copy } from "./text.js";
7
+ export const PRODUCTION = "https://proxy.whiteroom.tech";
8
+ const LOOPBACK = new Set(["localhost", "127.0.0.1", "[::1]"]);
9
+ export const RUN_CODE = /^wrrt_[A-Za-z0-9_-]{43}$/;
10
+ /**
11
+ * The origin practice commands talk to: production, or `--url` if it is
12
+ * WhiteRoom's own (https on whiteroom.tech) or loopback, since the provider
13
+ * key goes there. Any other https host only with WHITEROOM_PRACTICE_DEV=1
14
+ * (testing WhiteRoom itself). Null if `--url` isn't allowed.
15
+ */
16
+ export function targetOrigin(url, env = process.env) {
17
+ if (url === undefined)
18
+ return PRODUCTION;
19
+ let u;
20
+ try {
21
+ u = new URL(url);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ if (u.username || u.password)
27
+ return null;
28
+ if (u.protocol === "http:")
29
+ return LOOPBACK.has(u.hostname) ? u.origin : null;
30
+ if (u.protocol !== "https:")
31
+ return null;
32
+ const ours = u.hostname === "whiteroom.tech" || u.hostname.endsWith(".whiteroom.tech") || LOOPBACK.has(u.hostname);
33
+ return ours || env.WHITEROOM_PRACTICE_DEV === "1" ? u.origin : null;
34
+ }
35
+ /** Splits a command line into words as a POSIX shell would for plain words and quotes (enough to find files). */
36
+ export function words(cmd) {
37
+ const out = [];
38
+ const re = /"((?:[^"\\]|\\.)*)"|'([^']*)'|((?:[^\s"'\\]|\\.)+)|(\s+)/g;
39
+ let cur = null;
40
+ for (const m of cmd.matchAll(re)) {
41
+ if (m[4] !== undefined) {
42
+ if (cur !== null)
43
+ out.push(cur);
44
+ cur = null;
45
+ continue;
46
+ }
47
+ const part = m[1] !== undefined ? m[1].replace(/\\(.)/g, "$1") : m[2] ?? m[3].replace(/\\(.)/g, "$1");
48
+ cur = (cur ?? "") + part;
49
+ }
50
+ if (cur !== null)
51
+ out.push(cur);
52
+ return out;
53
+ }
54
+ const isFile = (p) => {
55
+ try {
56
+ return statSync(p).isFile();
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ };
62
+ const isExecutable = (p) => {
63
+ try {
64
+ accessSync(p, constants.X_OK);
65
+ return isFile(p);
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ };
71
+ const SCRIPT = /\.(m?js|cjs|ts|mts|py|rb|php|pl|sh|jar|exe)$/i;
72
+ /** Shell syntax and builtins this check can't follow: the user's shell runs the command, so it isn't second-guessed. */
73
+ const SHELL_SYNTAX = /[&|;<>$`(){}*?~\n]/;
74
+ const BUILTINS = new Set(["cd", "source", ".", "export", "exec", "eval", "set", "alias", "command", "builtin", "time", "nohup", "env"]);
75
+ /**
76
+ * Why `--adapter` can't start, or null: its program is on PATH (or a file), and
77
+ * script files it names (by extension) exist. Commands with shell syntax or a
78
+ * builtin first word are left to the shell.
79
+ */
80
+ export function adapterProblem(cmd, cwd = process.cwd(), path = process.env.PATH ?? "") {
81
+ if (!cmd.trim())
82
+ return "the command is empty";
83
+ if (SHELL_SYNTAX.test(cmd))
84
+ return null;
85
+ const w = words(cmd);
86
+ while (w.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(w[0]))
87
+ w.shift(); // FOO=1 node agent.js
88
+ const [program, ...args] = w;
89
+ if (!program || BUILTINS.has(program))
90
+ return null;
91
+ if (program.includes("/")) {
92
+ if (!isExecutable(resolve(cwd, program)))
93
+ return `${program} isn't a file you can run`;
94
+ }
95
+ else if (!path.split(delimiter).some((dir) => dir && isExecutable(join(isAbsolute(dir) ? dir : resolve(cwd, dir), program)))) {
96
+ return `${program} isn't on your PATH`;
97
+ }
98
+ const missing = args.find((a) => !a.startsWith("-") && SCRIPT.test(a) && !/^[a-z][a-z0-9+.-]*:\/\//i.test(a) && !isFile(resolve(cwd, a)));
99
+ return missing ? `${missing} doesn't exist` : null;
100
+ }
101
+ /**
102
+ * The adapter as reported to WhiteRoom (§7 "What was tested"): only the
103
+ * program's name and its script file's name, e.g. "python3 wr_adapter.py".
104
+ * Never environment assignments, flags, flag values or directories.
105
+ */
106
+ export function adapterLabel(cmd) {
107
+ const w = words(cmd).filter((x) => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(x));
108
+ const safe = (p) => basename(p).replace(/[^\w.+-]/g, "").slice(0, 64);
109
+ const script = w.slice(1).find((a) => !a.startsWith("-") && SCRIPT.test(a));
110
+ return [w[0] && safe(w[0]), script && safe(script)].filter(Boolean).join(" ") || "adapter";
111
+ }
112
+ export const isProvider = (v) => typeof v === "string" && Object.hasOwn(CATALOG.providers, v);
113
+ /** The variable a provider's key is read from, and the adapter gets it in. */
114
+ export const keyVarOf = (p) => CATALOG.providers[p].keyVar;
115
+ const ALL_KEY_VARS = Object.values(CATALOG.providers).map((p) => p.keyVar);
116
+ export const isKeyVar = (v) => ALL_KEY_VARS.includes(v);
117
+ /** OpenAI and Azure OpenAI take chat completions (their SDKs want a base URL ending in /v1); the others Anthropic's Messages API. */
118
+ export const chatCompletions = (p) => CATALOG.providers[p].api === "chat_completions";
119
+ /** The header a provider's key travels in, as the catalog says: Azure's api-key, a Bearer token, or x-api-key. */
120
+ export function keyHeader(p, key) {
121
+ const h = CATALOG.providers[p].header;
122
+ return h === "bearer" ? { authorization: `Bearer ${key}` } : { [h]: key };
123
+ }
124
+ /** A direct key's provider, by its shape: what an older WhiteRoom that names no provider means. */
125
+ export const providerByShape = (key) => (key.startsWith("sk-ant-") ? "anthropic" : "openai");
126
+ /**
127
+ * What's wrong with a key's shape, before it's sent (uses no try), or null:
128
+ * pasted twice (a hidden prompt shows nothing, so a second paste is easy),
129
+ * or with spaces or line breaks inside.
130
+ */
131
+ export function keyShapeProblem(key) {
132
+ const half = key.length / 2;
133
+ if (key.length >= 40 && Number.isInteger(half) && key.slice(0, half) === key.slice(half))
134
+ return "twice";
135
+ if (/\s/.test(key))
136
+ return "spaces";
137
+ return null;
138
+ }
139
+ /** Short-term Bedrock keys can expire during a test; WhiteRoom refuses them without using a try. */
140
+ export const isShortTermBedrockKey = (key) => key.startsWith("bedrock-api-key-");
141
+ /**
142
+ * The key from `keyEnv` (`--key-env`, the variable the dashboard's command
143
+ * names), else from the one provider variable that is set; null to prompt.
144
+ * When more than one is set, the variables: before the claim the CLI can't
145
+ * tell which provider the run uses, and a guess could use a try.
146
+ */
147
+ export function keyFromEnv(env, keyEnv) {
148
+ const set = keyEnv ? [keyEnv].filter((v) => env[v]?.trim()) : ALL_KEY_VARS.filter((v) => env[v]?.trim());
149
+ if (set.length > 1)
150
+ return set;
151
+ return set.length ? { from: set[0], key: env[set[0]].trim() } : null;
152
+ }
153
+ export class Interrupted extends Error {
154
+ }
155
+ /** Reads a line from the terminal without echoing it. Ctrl+C rejects with Interrupted. */
156
+ export function hiddenPrompt(question, stdin = process.stdin) {
157
+ const { stderr } = process;
158
+ stderr.write(question);
159
+ stdin.setRawMode(true);
160
+ stdin.setEncoding("utf8");
161
+ stdin.resume();
162
+ return new Promise((resolvePrompt, reject) => {
163
+ let raw = "";
164
+ const done = () => {
165
+ stdin.off("data", onData);
166
+ stdin.setRawMode(false);
167
+ stdin.pause();
168
+ stderr.write("\n");
169
+ };
170
+ const onData = (chunk) => {
171
+ raw += chunk;
172
+ const end = raw.search(/[\r\n\u0003]/);
173
+ if (end < 0)
174
+ return;
175
+ if (raw[end] === "\u0003")
176
+ return done(), reject(new Interrupted());
177
+ // A terminal with bracketed paste wraps a paste in ESC[200~ … ESC[201~, and a
178
+ // marker can arrive split across chunks, so it's removed from the whole line.
179
+ let s = "";
180
+ for (const ch of raw.slice(0, end).replace(/\x1b\[20[01]~/g, "")) {
181
+ if (ch === "\u007f" || ch === "\b")
182
+ s = s.slice(0, -1);
183
+ else if (ch >= " ")
184
+ s += ch;
185
+ }
186
+ done();
187
+ resolvePrompt(s.trim());
188
+ };
189
+ stdin.on("data", onData);
190
+ });
191
+ }
192
+ /** The first line of stdin (`--code-stdin`). */
193
+ export async function firstLineOfStdin() {
194
+ let data = "";
195
+ process.stdin.setEncoding("utf8");
196
+ for await (const chunk of process.stdin) {
197
+ data += chunk;
198
+ if (data.includes("\n") || data.length > 4096)
199
+ break;
200
+ }
201
+ return data.split("\n")[0].trim();
202
+ }
203
+ export const nodeTooOld = (version = process.versions.node) => (Number(version.split(".")[0]) < 20 ? copy.node(version) : null);
204
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/practice/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** The final answer WhiteRoom takes: 32 Ki characters, inside its 64 KiB body limit. */
2
+ export declare function finalText(s: string): string;
3
+ export declare const STARTERS_DIR: URL;
4
+ export interface RunArgs {
5
+ adapter?: string;
6
+ codeStdin: boolean;
7
+ url?: string;
8
+ /** --key-env: the variable the run's key is read from, when several are set. */
9
+ keyEnv?: string;
10
+ /** --require: rows that must be Passed in Enforce, or the result exits 1 (pre-flight D6). */
11
+ require?: readonly string[];
12
+ }
13
+ export declare function practiceRun(a: RunArgs): Promise<number>;
@@ -0,0 +1,380 @@
1
+ // `whiteroom practice run` (spec §4 Claim / Practice tasks, §6, §8, §10):
2
+ // preflight, claim, then the practice tasks and control checks the engine
3
+ // hands out, one at a time, until it returns the result.
4
+ import { readFileSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
6
+ import { childEnv, runAdapter } from "./adapter.js";
7
+ import { Engine, pace, REDIRECTED, sleep, Stopped, Unreachable } from "./engine.js";
8
+ import { CATALOG } from "./catalog.js";
9
+ import { adapterLabel, adapterProblem, chatCompletions, firstLineOfStdin, hiddenPrompt, Interrupted, isKeyVar, isProvider, isShortTermBedrockKey, keyFromEnv, keyHeader, keyShapeProblem, keyVarOf, nodeTooOld, providerByShape, RUN_CODE, targetOrigin, } from "./preflight.js";
10
+ import { copy, ending, hideSecret, results, say, warn } from "./text.js";
11
+ const HEARTBEAT_MS = 30_000;
12
+ /** A practice task WhiteRoom dropped (a restart, a failed capture): ask for it again, it doesn't count (§2 rule 4). */
13
+ const RESTART = new Set(["attempt_discarded", "not_found"]);
14
+ /** The final answer WhiteRoom takes: 32 Ki characters, inside its 64 KiB body limit. */
15
+ export function finalText(s) {
16
+ let out = s.slice(0, 32 * 1024);
17
+ while (Buffer.byteLength(out) > 60_000)
18
+ out = out.slice(0, Math.floor(out.length * 0.9));
19
+ return out;
20
+ }
21
+ export const STARTERS_DIR = new URL("../../starters/", import.meta.url);
22
+ /** The sample agent is the JS starter adapter (§5 Agents). */
23
+ const SAMPLE_AGENT = fileURLToPath(new URL("wr-adapter.mjs", STARTERS_DIR));
24
+ const VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
25
+ /** This run's --require rows, for wherever its result is printed. */
26
+ let required = [];
27
+ /**
28
+ * Any refusal after a good claim ends the test with exit 3 (§8, §10 "Post-claim 409s").
29
+ * 5xx and network errors never get here: Engine.post retries them or throws Unreachable.
30
+ */
31
+ function sessionEnding(r) {
32
+ const reason = r.body?.reason;
33
+ // The run already finished (WhiteRoom finished it meanwhile): its result, not a refusal. Without one, tasks/next replays it.
34
+ if (r.body?.done || reason === "finished")
35
+ return r.body?.report ? results(r.body.report, required) : { ...ending(3, copy.finished(r.body?.verdict)), result: true, replay: true };
36
+ if (r.status === REDIRECTED)
37
+ return ending(3, copy.redirected);
38
+ if (reason === "engine_update")
39
+ return ending(3, copy.engineUpdate(Number(r.body.tasksFinished) || 0));
40
+ if (reason === "ended_by_owner")
41
+ return ending(3, copy.endedByOwner);
42
+ if (reason === "expired")
43
+ return ending(3, copy.expired);
44
+ if (reason === "call_cap")
45
+ return ending(3, copy.callCap);
46
+ if (reason === "no_model_calls")
47
+ return ending(3, copy.noModelCalls);
48
+ if (reason === "engine_error")
49
+ return ending(3, copy.engineError);
50
+ if (r.status === 401)
51
+ return ending(3, copy.sessionGone);
52
+ if (r.status === 429)
53
+ return ending(3, copy.busy);
54
+ if (r.status === 403)
55
+ return ending(3, copy.refused);
56
+ if (r.status === 404 && !reason)
57
+ return ending(3, copy.unavailable);
58
+ return ending(3, copy.cliOutdated); // A 4xx this CLI doesn't know: it's older than the server.
59
+ }
60
+ const print = (e, out = say) => {
61
+ for (const l of e.lines)
62
+ out(l);
63
+ return e.code;
64
+ };
65
+ /** A refusal on stderr; a result (the run had already finished) on stdout. */
66
+ const fail = (e) => print(e, e.result ? say : warn);
67
+ export async function practiceRun(a) {
68
+ required = a.require ?? [];
69
+ // ── Preflight: nothing is sent until every check passes ──
70
+ const old = nodeTooOld();
71
+ if (old)
72
+ return fail(ending(2, old));
73
+ if (process.platform === "win32")
74
+ return fail(ending(2, copy.windows));
75
+ if (process.env.WHITEROOM_URL)
76
+ say(copy.ignoringUrl);
77
+ const origin = targetOrigin(a.url);
78
+ if (!origin)
79
+ return fail(ending(2, copy.badUrl));
80
+ if (a.adapter !== undefined) {
81
+ const why = adapterProblem(a.adapter);
82
+ if (why)
83
+ return fail(ending(2, copy.adapterMissing(a.adapter, why)));
84
+ }
85
+ // The user's own command runs through their shell as typed; nothing from WhiteRoom is ever put into it (§9.4).
86
+ const launch = a.adapter !== undefined ? { shell: a.adapter } : { file: process.execPath, args: [SAMPLE_AGENT] };
87
+ if (a.keyEnv !== undefined && !isKeyVar(a.keyEnv))
88
+ return fail(ending(2, copy.badKeyEnv(a.keyEnv)));
89
+ const fromEnv = keyFromEnv(process.env, a.keyEnv);
90
+ if (Array.isArray(fromEnv))
91
+ return fail(ending(2, copy.bothKeys(fromEnv)));
92
+ let choice = fromEnv;
93
+ let code = "";
94
+ try {
95
+ if (a.codeStdin)
96
+ code = await firstLineOfStdin();
97
+ if (!choice) {
98
+ if (!process.stdin.isTTY)
99
+ return fail(ending(2, copy.noKey(a.keyEnv)));
100
+ const pasted = await hiddenPrompt(copy.needKey);
101
+ if (!pasted)
102
+ return fail(ending(2, copy.noKey(a.keyEnv)));
103
+ choice = { from: null, key: pasted };
104
+ }
105
+ if (!a.codeStdin) {
106
+ if (!process.stdin.isTTY)
107
+ return fail(ending(2, copy.noTerminal));
108
+ // A malformed paste uses no try: ask again, up to 3 times.
109
+ for (let i = 0; i < 3 && !RUN_CODE.test(code); i++) {
110
+ if (i)
111
+ warn(copy.badCode);
112
+ code = await hiddenPrompt(copy.needCode);
113
+ }
114
+ }
115
+ }
116
+ catch (err) {
117
+ if (err instanceof Interrupted)
118
+ return fail(ending(3, copy.stoppedEarly));
119
+ throw err;
120
+ }
121
+ if (!RUN_CODE.test(code))
122
+ return fail(ending(2, copy.badCode));
123
+ const { key, from } = choice;
124
+ hideSecret(key);
125
+ hideSecret(code);
126
+ // WhiteRoom refuses these without using a try; saying so here sends nothing.
127
+ if (isShortTermBedrockKey(key))
128
+ return fail(ending(2, copy.shortTermKey));
129
+ const shape = keyShapeProblem(key);
130
+ if (shape)
131
+ return fail(ending(2, shape === "twice" ? copy.keyTwice(from, key.length) : copy.keySpaces(from)));
132
+ if (from)
133
+ say(copy.keyInUse(from, key));
134
+ say(copy.host(new URL(origin).host));
135
+ // ── Claim: the key is checked against the fleet's; a mismatch uses a try and nothing else ──
136
+ const engine = new Engine(origin);
137
+ let claim;
138
+ try {
139
+ claim = await engine.post("/api/readiness/claim", {
140
+ code, key, cli: { version: VERSION, adapter: a.adapter === undefined ? "sample agent" : adapterLabel(a.adapter) },
141
+ });
142
+ }
143
+ catch (err) {
144
+ if (err instanceof Unreachable)
145
+ return fail(ending(3, copy.unreachable));
146
+ throw err;
147
+ }
148
+ if (claim.status === 401 && claim.body?.reason === "key_mismatch") {
149
+ const b = claim.body;
150
+ const left = Number(b.triesLeft) || 0;
151
+ if (left <= 0)
152
+ return fail(ending(2, copy.lastTry));
153
+ // A run on a Fleet key provider key (R7) names that key's provider and last four.
154
+ const keyProvider = b.provider;
155
+ if (isProvider(keyProvider)) {
156
+ const hint = typeof b.keyHint === "string" && /^[\w-]{1,8}$/.test(b.keyHint) && b.keyHint !== "none" ? b.keyHint : null;
157
+ return fail(ending(2, copy.providerKeyMismatch(from, key, CATALOG.providers[keyProvider].label, hint)));
158
+ }
159
+ const fleet = typeof b.fleetName === "string" && b.fleetName.trim() ? b.fleetName.trim().slice(0, 100) : null;
160
+ return fail(ending(2, copy.keyMismatch(from ?? keyVarOf(providerByShape(key)), left, fleet)));
161
+ }
162
+ if (claim.status === 400 && claim.body?.reason === "short_term_key")
163
+ return fail(ending(2, copy.shortTermKey));
164
+ if (claim.status === REDIRECTED)
165
+ return fail(ending(2, copy.redirected));
166
+ if (claim.status === 410)
167
+ return fail(ending(2, copy.codeInvalid));
168
+ if (claim.status === 429)
169
+ return fail(ending(3, copy.busy));
170
+ // The owner ended the test while this claim was on its way.
171
+ if (claim.status === 409 && claim.body?.reason === "ended_by_owner")
172
+ return fail(ending(3, copy.endedBeforeStart));
173
+ if (claim.status === 404)
174
+ return fail(ending(2, copy.unavailable));
175
+ if (claim.status !== 200 || typeof claim.body?.session !== "string")
176
+ return fail(ending(2, copy.cliOutdated));
177
+ // The provider the run's calls go to decides the adapter's key variable, the header and the API.
178
+ const runProvider = claim.body.run?.provider;
179
+ if (!isProvider(runProvider))
180
+ return fail(ending(2, copy.cliOutdated));
181
+ const provider = runProvider;
182
+ engine.session = claim.body.session;
183
+ hideSecret(engine.session);
184
+ const runs = Number(claim.body.run?.runs) || 1;
185
+ // An engine before practiceTasks counts every step as a practice task.
186
+ const claimTasks = Number(claim.body.run?.tasks) || 0;
187
+ const practiceTasks = Number(claim.body.run?.practiceTasks ?? claim.body.run?.tasks) || 0;
188
+ say(copy.started(practiceTasks, runs, claim.body.run?.controls === true));
189
+ // The runs whose control checks have started: progress counts them as steps, the task line doesn't.
190
+ const controlRuns = new Set();
191
+ // ── From here the session is live: Ctrl+C twice, a signal, or WhiteRoom (heartbeat) can stop it ──
192
+ const stop = new AbortController();
193
+ engine.signal = stop.signal;
194
+ const halt = { why: null, cancel: false };
195
+ const stopWith = (e, cancel) => {
196
+ if (!halt.why)
197
+ Object.assign(halt, { why: e, cancel });
198
+ stop.abort();
199
+ };
200
+ let pressed = 0;
201
+ const onSigint = () => (++pressed === 1 ? warn(copy.pressAgain) : stopWith(ending(3, copy.cancelled), true));
202
+ const onTerm = () => stopWith(ending(3, copy.cancelled), true);
203
+ process.on("SIGINT", onSigint);
204
+ process.on("SIGTERM", onTerm);
205
+ process.on("SIGHUP", onTerm);
206
+ let beating = false;
207
+ const heartbeat = setInterval(() => {
208
+ if (beating)
209
+ return;
210
+ beating = true;
211
+ engine.post("/api/readiness/heartbeat", {}, { retryNetwork: true })
212
+ .then((r) => (r.status !== 200 || r.body?.done) && stopWith(sessionEnding(r), false))
213
+ .catch((err) => err instanceof Unreachable && stopWith(ending(3, copy.unreachable), false))
214
+ .finally(() => { beating = false; });
215
+ }, HEARTBEAT_MS);
216
+ heartbeat.unref();
217
+ /** The key only ever goes to the host the user chose. */
218
+ const ourHost = (url) => {
219
+ try {
220
+ return new URL(String(url)).origin === origin;
221
+ }
222
+ catch {
223
+ return false;
224
+ }
225
+ };
226
+ /** One practice task through the adapter. An Ending stops the test; null asks for the next task. */
227
+ const practiceTask = async (t, p) => {
228
+ if (!ourHost(t.baseUrl))
229
+ return ending(3, copy.otherHost);
230
+ const deadline = Date.parse(t.deadline);
231
+ if (!Number.isFinite(deadline))
232
+ return ending(3, copy.cliOutdated);
233
+ const run = runs > 1 ? ` (run ${t.runIndex + 1} of ${runs})` : "";
234
+ // Counted without the control-check steps, as the start line says ("5 practice tasks and a check of your controls").
235
+ // The progress total is the plan's every step; when it's the plan the claim described, count its practice tasks only.
236
+ const total = p.total === claimTasks && practiceTasks ? practiceTasks : p.total;
237
+ say(`Practice task ${p.done + 1 - (total === p.total ? 0 : controlRuns.size)} of ${total}: ${CATALOG.taskNames[t.scenario] ?? "Practice task"}${run}`);
238
+ const out = await runAdapter({
239
+ launch, env: childEnv(process.env, keyVarOf(provider), key), deadline, signal: stop.signal,
240
+ message: {
241
+ type: "task", task: t.prompt, tools: t.tools, headers: t.headers,
242
+ model: typeof t.model === "string" && t.model ? t.model : null,
243
+ // OpenAI SDKs (Azure OpenAI's too) take a base URL that ends in /v1.
244
+ base_url: chatCompletions(provider) ? `${t.baseUrl}/v1` : t.baseUrl,
245
+ },
246
+ tool: async (call) => {
247
+ const r = await engine.post("/api/readiness/tools", { attemptId: t.attemptId, ...call }).catch(() => null);
248
+ if (!r)
249
+ return { end: "lost" };
250
+ if (r.status === 200)
251
+ return { result: r.body?.result ?? null };
252
+ const reason = r.body?.reason;
253
+ return { end: RESTART.has(reason) ? "restart" : reason === "expired" ? "deadline" : reason === "tool_limit" ? "tool_limit" : r.status === 400 ? "bad_tool" : sessionEnding(r) };
254
+ },
255
+ });
256
+ if (out.kind === "stopped")
257
+ return null;
258
+ const why = out.kind === "ended" ? out.by : out.kind;
259
+ if (typeof why === "object")
260
+ return why;
261
+ if (why === "restart" || why === "lost")
262
+ return warn(why === "lost" ? copy.lostTask : copy.restart), null;
263
+ const send = (output, ended) => engine.post(`/api/readiness/tasks/${encodeURIComponent(t.attemptId)}/final`, { output, ended }).catch(() => null);
264
+ const final = async (output, ended) => {
265
+ const r = await send(output, ended);
266
+ if (!r)
267
+ return warn(copy.lostTask), null;
268
+ if (r.status === 200)
269
+ return null;
270
+ if (RESTART.has(r.body?.reason))
271
+ return warn(copy.restart), null;
272
+ return sessionEnding(r);
273
+ };
274
+ if (out.kind === "final")
275
+ return final(finalText(out.output), "final");
276
+ if (why === "deadline")
277
+ return warn(copy.deadline), final(null, "deadline");
278
+ // The adapter crashed or broke the protocol: kept as this task's result, unless WhiteRoom dropped the task
279
+ // (it runs again); then the test ends with a result over the tasks done so far (exit 3).
280
+ const r = await send(null, "adapter_exited");
281
+ if (r && r.status !== 200)
282
+ return RESTART.has(r.body?.reason) ? (warn(copy.restart), null) : sessionEnding(r);
283
+ const c = await engine.cancel(true);
284
+ if (c && c.status !== 200 && c.body?.reason === "finished")
285
+ return sessionEnding(c); // It finished meanwhile: its result wins.
286
+ const kept = c?.status === 200 && c.body?.lifecycle === "finished" ? copy.keptResults : copy.keptUnconfirmed;
287
+ if (out.kind === "exited")
288
+ return ending(3, ...copy.adapterCrashed(out.how, out.tail), kept);
289
+ return ending(3, copy.adapterBroke(out.kind === "broke" ? out.why : why === "tool_limit" ? copy.tooManyTools : copy.badTool), kept);
290
+ };
291
+ /** The control checks: each call WhiteRoom plans, sent with the key, its response reported back (§6). */
292
+ const controlChecks = async (c) => {
293
+ if (!ourHost(c.baseUrl))
294
+ return ending(3, copy.otherHost);
295
+ controlRuns.add(c.runIndex);
296
+ say(`Checking your controls${runs > 1 ? ` (run ${c.runIndex + 1} of ${runs})` : ""}`);
297
+ let result = null;
298
+ for (;;) {
299
+ const r = await engine.post("/api/readiness/controls/next", { attemptId: c.attemptId, result }).catch(() => null);
300
+ if (stop.signal.aborted)
301
+ return null;
302
+ // Lost or dropped: tasks/next starts the control checks again. Not safe to resend `result`.
303
+ if (!r)
304
+ return warn(copy.lostTask), null;
305
+ if (r.status !== 200)
306
+ return RESTART.has(r.body?.reason) || r.body?.reason === "expired" ? (warn(copy.restart), null) : sessionEnding(r);
307
+ if (r.body?.done)
308
+ return null;
309
+ const q = r.body?.request;
310
+ if (!q || typeof q.path !== "string")
311
+ return ending(3, copy.cliOutdated);
312
+ if (!ourHost(q.url))
313
+ return ending(3, copy.otherHost);
314
+ await sleep(Math.min(Math.max(Number(q.delayMs) || 0, 0), 120_000), stop.signal);
315
+ if (stop.signal.aborted)
316
+ return null;
317
+ const headers = {};
318
+ for (const [h, v] of Object.entries(q.headers ?? {}))
319
+ if (!/^(authorization|x-api-key|api-key)$/i.test(h))
320
+ headers[h] = String(v);
321
+ Object.assign(headers, keyHeader(provider, key));
322
+ await pace();
323
+ try {
324
+ const res = await fetch(q.url, { method: "POST", headers, body: JSON.stringify(q.body), redirect: "error", signal: AbortSignal.timeout(60_000) });
325
+ const wr = (await res.json().catch(() => null))?.whiteroom;
326
+ const str = (v, max) => (typeof v === "string" ? v.slice(0, max) : null);
327
+ result = { status: res.status, reason: str(wr?.reason, 64), ruleId: str(wr?.ruleId, 128) };
328
+ }
329
+ catch {
330
+ // A network error or a redirect (never followed, so the key stays on this host):
331
+ // not a result, so WhiteRoom calls the check a test problem.
332
+ result = { status: 0, reason: null, ruleId: null };
333
+ }
334
+ }
335
+ };
336
+ /** Shows how the test ended; a finished run whose reply had no result gets it from tasks/next (one try). */
337
+ const end = async (e) => {
338
+ if (e.replay) {
339
+ engine.signal = null;
340
+ const r = await engine.post("/api/readiness/tasks/next", { key }).catch(() => null);
341
+ if (r?.status === 200 && r.body?.done && r.body.report)
342
+ return print(results(r.body.report, required));
343
+ }
344
+ return fail(e);
345
+ };
346
+ // ── The practice tasks, until the result ──
347
+ try {
348
+ while (!halt.why) {
349
+ let next;
350
+ try {
351
+ next = await engine.post("/api/readiness/tasks/next", { key }, { retryNetwork: true });
352
+ }
353
+ catch (err) {
354
+ if (err instanceof Stopped)
355
+ break;
356
+ if (err instanceof Unreachable)
357
+ return fail(ending(3, copy.unreachable));
358
+ throw err;
359
+ }
360
+ if (next.status !== 200 || next.body?.done)
361
+ return end(sessionEnding(next));
362
+ const b = next.body;
363
+ const e = b?.task ? await practiceTask(b.task, b.progress) : b?.controls ? await controlChecks(b.controls) : ending(3, copy.cliOutdated);
364
+ // A result wins over how the session stopped meanwhile.
365
+ if (e && (!halt.why || e.result))
366
+ return end(e);
367
+ }
368
+ // Ctrl+C or a signal ends the run, so the dashboard doesn't wait for this computer.
369
+ if (halt.cancel)
370
+ await engine.cancel();
371
+ return end(halt.why);
372
+ }
373
+ finally {
374
+ clearInterval(heartbeat);
375
+ process.off("SIGINT", onSigint);
376
+ process.off("SIGTERM", onTerm);
377
+ process.off("SIGHUP", onTerm);
378
+ }
379
+ }
380
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/practice/run.ts"],"names":[],"mappings":"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"}