@whiteroom-ai/cli 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -0
- package/contract/catalog.json +197 -0
- package/dist/index.js +12 -15
- package/dist/index.js.map +1 -1
- package/dist/legacy-args.d.ts +4 -0
- package/dist/legacy-args.js +17 -0
- package/dist/legacy-args.js.map +1 -0
- package/dist/practice/adapter.d.ts +59 -0
- package/dist/practice/adapter.js +169 -0
- package/dist/practice/adapter.js.map +1 -0
- package/dist/practice/catalog.d.ts +16 -0
- package/dist/practice/catalog.js +6 -0
- package/dist/practice/catalog.js.map +1 -0
- package/dist/practice/engine.d.ts +50 -0
- package/dist/practice/engine.js +147 -0
- package/dist/practice/engine.js.map +1 -0
- package/dist/practice/index.d.ts +2 -0
- package/dist/practice/index.js +72 -0
- package/dist/practice/index.js.map +1 -0
- package/dist/practice/preflight.d.ts +58 -0
- package/dist/practice/preflight.js +185 -0
- package/dist/practice/preflight.js.map +1 -0
- package/dist/practice/run.d.ts +11 -0
- package/dist/practice/run.js +374 -0
- package/dist/practice/run.js.map +1 -0
- package/dist/practice/text.d.ts +91 -0
- package/dist/practice/text.js +140 -0
- package/dist/practice/text.js.map +1 -0
- package/package.json +10 -3
- package/starters/wr-adapter.mjs +104 -0
- package/starters/wr_adapter.py +136 -0
- package/src/index.ts +0 -144
- package/tsconfig.json +0 -16
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/practice/text.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whiteroom-ai/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "CLI for WhiteRoom — manage AI agent fleets from the terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"whiteroom": "dist/index.js"
|
|
8
8
|
},
|
|
9
|
+
"files": ["dist", "starters", "contract/catalog.json"],
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=20"
|
|
12
|
+
},
|
|
9
13
|
"scripts": {
|
|
10
14
|
"build": "tsc",
|
|
11
15
|
"typecheck": "tsc --noEmit",
|
|
12
|
-
"
|
|
16
|
+
"test": "node --import tsx --test test/*.test.ts",
|
|
17
|
+
"dev": "tsx src/index.ts",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
13
19
|
},
|
|
14
20
|
"license": "Apache-2.0",
|
|
15
21
|
"dependencies": {
|
|
16
22
|
"@whiteroom-ai/sdk": "^1.1.0"
|
|
17
23
|
},
|
|
18
24
|
"devDependencies": {
|
|
19
|
-
"
|
|
25
|
+
"@types/node": "^26.6.2",
|
|
26
|
+
"typescript": "^7.0.2",
|
|
20
27
|
"tsx": "^4.19.0"
|
|
21
28
|
}
|
|
22
29
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// WhiteRoom practice test adapter (JavaScript starter, Node 20+, no dependencies).
|
|
2
|
+
// Run it with: whiteroom practice run --adapter "node wr-adapter.mjs"
|
|
3
|
+
// The CLI sends one practice task as a JSON line on stdin. You answer with
|
|
4
|
+
// {"type":"tool_call",...} lines (each gets a {"type":"tool_result",...} line
|
|
5
|
+
// back) and finish with one {"type":"final","output":"..."} line. Print your
|
|
6
|
+
// own logs to stderr: stdout is only for these JSON lines.
|
|
7
|
+
import { createInterface } from "node:readline";
|
|
8
|
+
|
|
9
|
+
const lines = createInterface({ input: process.stdin })[Symbol.asyncIterator]();
|
|
10
|
+
const receive = async () => JSON.parse((await lines.next()).value ?? "null");
|
|
11
|
+
const send = (msg) => process.stdout.write(JSON.stringify(msg) + "\n");
|
|
12
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
13
|
+
let calls = 0;
|
|
14
|
+
async function callTool(name, input) {
|
|
15
|
+
const id = `call-${++calls}`;
|
|
16
|
+
send({ type: "tool_call", id, name, input });
|
|
17
|
+
return (await receive()).result;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The CLI sets only the variable of the provider the practice test uses.
|
|
21
|
+
// It decides the API: chat completions for OpenAI and Azure OpenAI (where the
|
|
22
|
+
// model is your deployment name), Anthropic's Messages API for Anthropic,
|
|
23
|
+
// Claude on Azure (Foundry) and AWS Bedrock. And the header the key goes in.
|
|
24
|
+
const KEYS = {
|
|
25
|
+
ANTHROPIC_API_KEY: (k) => ({ "x-api-key": k }),
|
|
26
|
+
ANTHROPIC_FOUNDRY_API_KEY: (k) => ({ "x-api-key": k }),
|
|
27
|
+
AWS_BEARER_TOKEN_BEDROCK: (k) => ({ authorization: `Bearer ${k}` }),
|
|
28
|
+
OPENAI_API_KEY: (k) => ({ authorization: `Bearer ${k}` }),
|
|
29
|
+
AZURE_OPENAI_API_KEY: (k) => ({ "api-key": k }),
|
|
30
|
+
};
|
|
31
|
+
const KEY_VAR = Object.keys(KEYS).find((v) => process.env[v]) ?? "ANTHROPIC_API_KEY";
|
|
32
|
+
const anthropic = !["OPENAI_API_KEY", "AZURE_OPENAI_API_KEY"].includes(KEY_VAR);
|
|
33
|
+
// The model to use when the practice task doesn't name one (cloud providers always name one).
|
|
34
|
+
const DEFAULT_MODEL = anthropic ? "claude-haiku-4-5" : "gpt-4o-mini";
|
|
35
|
+
const BLOCKED = "Stopped: one of my WhiteRoom controls blocked the model call.";
|
|
36
|
+
const GONE = "Stopped: WhiteRoom closed this practice task.";
|
|
37
|
+
|
|
38
|
+
// One model call through WhiteRoom; a final answer (text) if WhiteRoom stopped it.
|
|
39
|
+
// Never follows a redirect, so the key only goes to WhiteRoom.
|
|
40
|
+
// Waits and tries again when WhiteRoom or the provider asks it to, saying each reason once per practice task.
|
|
41
|
+
// Each practice task runs in its own adapter process, so this is per task.
|
|
42
|
+
const said = new Set();
|
|
43
|
+
async function model(base_url, headers, body) {
|
|
44
|
+
const url = anthropic ? `${base_url}/v1/messages` : `${base_url}/chat/completions`;
|
|
45
|
+
const auth = { ...KEYS[KEY_VAR](process.env[KEY_VAR] ?? ""), ...(anthropic && { "anthropic-version": "2023-06-01" }) };
|
|
46
|
+
for (let tries = 1; ; tries++) {
|
|
47
|
+
const res = await fetch(url, { method: "POST", headers: { "content-type": "application/json", ...headers, ...auth },
|
|
48
|
+
body: JSON.stringify(body), redirect: "error", signal: AbortSignal.timeout(180_000) });
|
|
49
|
+
if (res.ok) return res.json();
|
|
50
|
+
const wr = (await res.json().catch(() => null))?.whiteroom;
|
|
51
|
+
const wait = res.status === 503 && wr ? ["WhiteRoom is switching servers. Waiting, then trying again.", Number(res.headers.get("retry-after") || 1)]
|
|
52
|
+
: res.status === 429 && wr ? ["WhiteRoom is saving a summary of your agent's memory. Waiting until it's saved.", 2]
|
|
53
|
+
: res.status === 403 && wr?.retryable ? ["One of your WhiteRoom controls is limiting calls. Waiting, then trying again.", 10]
|
|
54
|
+
: [429, 500, 502, 503, 529].includes(res.status) && !wr && tries < 5 ? ["Your model provider is busy. Waiting, then trying again.", 5 * tries] : null;
|
|
55
|
+
if (res.status === 403 && wr && !wait) return BLOCKED; // Blocked by one of the fleet's controls.
|
|
56
|
+
if (res.status === 410) return GONE; // The practice task's fleet is gone: WhiteRoom reran or ended it.
|
|
57
|
+
if (!wait || tries > 150) throw new Error(`The model call failed (HTTP ${res.status}).`);
|
|
58
|
+
if (!said.has(wait[0])) { said.add(wait[0]); console.error(wait[0]); }
|
|
59
|
+
await sleep(wait[1] * 1000);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ── Replace this function with a call to your own agent. ────────────────
|
|
64
|
+
// It gets the task, the test tools, WhiteRoom's address and the model your
|
|
65
|
+
// dashboard chose (null: use your own); it calls tools with
|
|
66
|
+
// callTool(name, input) and returns its final answer as text.
|
|
67
|
+
async function runAgent({ task, tools, base_url, headers, model: chosen }) {
|
|
68
|
+
const MODEL = chosen || DEFAULT_MODEL;
|
|
69
|
+
const messages = [{ role: "user", content: task }];
|
|
70
|
+
const fns = tools.map((t) => ({ type: "function", function: { name: t.name, description: t.description, parameters: t.input_schema } }));
|
|
71
|
+
for (let turn = 0; turn < 40; turn++) {
|
|
72
|
+
if (anthropic) {
|
|
73
|
+
const r = await model(base_url, headers, { model: MODEL, max_tokens: 1024, tools, messages });
|
|
74
|
+
if (typeof r === "string") return r;
|
|
75
|
+
messages.push({ role: "assistant", content: r.content });
|
|
76
|
+
const uses = r.content.filter((b) => b.type === "tool_use");
|
|
77
|
+
if (!uses.length) return r.content.filter((b) => b.type === "text").map((b) => b.text).join("\n");
|
|
78
|
+
const results = [];
|
|
79
|
+
for (const u of uses) results.push({ type: "tool_result", tool_use_id: u.id, content: JSON.stringify(await callTool(u.name, u.input)) });
|
|
80
|
+
messages.push({ role: "user", content: results });
|
|
81
|
+
} else {
|
|
82
|
+
const r = await model(base_url, headers, { model: MODEL, tools: fns, messages });
|
|
83
|
+
if (typeof r === "string") return r;
|
|
84
|
+
const m = r.choices[0].message;
|
|
85
|
+
messages.push(m);
|
|
86
|
+
if (!m.tool_calls?.length) return m.content ?? "";
|
|
87
|
+
for (const c of m.tool_calls) {
|
|
88
|
+
const result = await callTool(c.function.name, JSON.parse(c.function.arguments || "{}"));
|
|
89
|
+
messages.push({ role: "tool", tool_call_id: c.id, content: JSON.stringify(result) });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return "Stopped: too many turns.";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const msg = await receive();
|
|
98
|
+
if (msg?.type !== "task") throw new Error("Expected a task from the WhiteRoom CLI.");
|
|
99
|
+
send({ type: "final", output: await runAgent(msg) });
|
|
100
|
+
process.exit(0);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
console.error(err.message);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# WhiteRoom practice test adapter (Python starter, Python 3.9+, standard library only).
|
|
2
|
+
# Run it with: whiteroom practice run --adapter "python3 wr_adapter.py"
|
|
3
|
+
# The CLI sends one practice task as a JSON line on stdin. You answer with
|
|
4
|
+
# {"type":"tool_call",...} lines (each gets a {"type":"tool_result",...} line
|
|
5
|
+
# back) and finish with one {"type":"final","output":"..."} line. Print your
|
|
6
|
+
# own logs to stderr: stdout is only for these JSON lines.
|
|
7
|
+
import json, os, sys, time, urllib.error, urllib.request
|
|
8
|
+
|
|
9
|
+
# The CLI sets only the variable of the provider the practice test uses.
|
|
10
|
+
# It decides the API: chat completions for OpenAI and Azure OpenAI (where the
|
|
11
|
+
# model is your deployment name), Anthropic's Messages API for Anthropic,
|
|
12
|
+
# Claude on Azure (Foundry) and AWS Bedrock. And the header the key goes in.
|
|
13
|
+
KEYS = {
|
|
14
|
+
"ANTHROPIC_API_KEY": lambda k: {"x-api-key": k},
|
|
15
|
+
"ANTHROPIC_FOUNDRY_API_KEY": lambda k: {"x-api-key": k},
|
|
16
|
+
"AWS_BEARER_TOKEN_BEDROCK": lambda k: {"authorization": "Bearer " + k},
|
|
17
|
+
"OPENAI_API_KEY": lambda k: {"authorization": "Bearer " + k},
|
|
18
|
+
"AZURE_OPENAI_API_KEY": lambda k: {"api-key": k},
|
|
19
|
+
}
|
|
20
|
+
KEY_VAR = next((v for v in KEYS if os.environ.get(v)), "ANTHROPIC_API_KEY")
|
|
21
|
+
ANTHROPIC = KEY_VAR not in ("OPENAI_API_KEY", "AZURE_OPENAI_API_KEY")
|
|
22
|
+
# The model to use when the practice task doesn't name one (cloud providers always name one).
|
|
23
|
+
DEFAULT_MODEL = "claude-haiku-4-5" if ANTHROPIC else "gpt-4o-mini"
|
|
24
|
+
BLOCKED = "Stopped: one of my WhiteRoom controls blocked the model call."
|
|
25
|
+
GONE = "Stopped: WhiteRoom closed this practice task."
|
|
26
|
+
calls = 0
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class NoRedirects(urllib.request.HTTPRedirectHandler):
|
|
30
|
+
# A redirect is an error, never followed, so the key only goes to WhiteRoom.
|
|
31
|
+
def redirect_request(self, *args):
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
open_url = urllib.request.build_opener(NoRedirects).open
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def receive():
|
|
39
|
+
line = sys.stdin.readline()
|
|
40
|
+
return json.loads(line) if line else None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def send(msg):
|
|
44
|
+
sys.stdout.write(json.dumps(msg) + "\n")
|
|
45
|
+
sys.stdout.flush()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def call_tool(name, args):
|
|
49
|
+
global calls
|
|
50
|
+
calls += 1
|
|
51
|
+
send({"type": "tool_call", "id": f"call-{calls}", "name": name, "input": args})
|
|
52
|
+
return receive()["result"]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Each practice task runs in its own adapter process, so this is per task.
|
|
56
|
+
SAID = set()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def model(base_url, headers, body):
|
|
60
|
+
"""One model call through WhiteRoom; a final answer (text) if WhiteRoom stopped it.
|
|
61
|
+
Waits and tries again when WhiteRoom or the provider asks it to, saying each reason once per practice task."""
|
|
62
|
+
url = f"{base_url}/v1/messages" if ANTHROPIC else f"{base_url}/chat/completions"
|
|
63
|
+
auth = {**KEYS[KEY_VAR](os.environ.get(KEY_VAR, "")), **({"anthropic-version": "2023-06-01"} if ANTHROPIC else {})}
|
|
64
|
+
for tries in range(1, 152):
|
|
65
|
+
req = urllib.request.Request(url, json.dumps(body).encode(), {"content-type": "application/json", **headers, **auth})
|
|
66
|
+
try:
|
|
67
|
+
with open_url(req, timeout=180) as res:
|
|
68
|
+
return json.load(res)
|
|
69
|
+
except urllib.error.HTTPError as err:
|
|
70
|
+
try:
|
|
71
|
+
wr = json.load(err).get("whiteroom")
|
|
72
|
+
except Exception:
|
|
73
|
+
wr = None
|
|
74
|
+
if err.code == 503 and wr:
|
|
75
|
+
wait = ("WhiteRoom is switching servers. Waiting, then trying again.", float(err.headers.get("retry-after") or 1))
|
|
76
|
+
elif err.code == 429 and wr:
|
|
77
|
+
wait = ("WhiteRoom is saving a summary of your agent's memory. Waiting until it's saved.", 2)
|
|
78
|
+
elif err.code == 403 and wr and wr.get("retryable"):
|
|
79
|
+
wait = ("One of your WhiteRoom controls is limiting calls. Waiting, then trying again.", 10)
|
|
80
|
+
elif err.code == 403 and wr:
|
|
81
|
+
return BLOCKED # Blocked by one of the fleet's controls.
|
|
82
|
+
elif err.code == 410:
|
|
83
|
+
return GONE # The practice task's fleet is gone: WhiteRoom reran or ended it.
|
|
84
|
+
elif err.code in (429, 500, 502, 503, 529) and not wr and tries < 5:
|
|
85
|
+
wait = ("Your model provider is busy. Waiting, then trying again.", 5 * tries)
|
|
86
|
+
else:
|
|
87
|
+
raise RuntimeError(f"The model call failed (HTTP {err.code}).") from None
|
|
88
|
+
if wait[0] not in SAID:
|
|
89
|
+
SAID.add(wait[0])
|
|
90
|
+
print(wait[0], file=sys.stderr)
|
|
91
|
+
time.sleep(wait[1])
|
|
92
|
+
raise RuntimeError("The model call kept failing.")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# ── Replace this function with a call to your own agent. ────────────────
|
|
96
|
+
# It gets the task, the test tools, WhiteRoom's address and the model your
|
|
97
|
+
# dashboard chose (None: use your own); it calls tools with
|
|
98
|
+
# call_tool(name, input) and returns its final answer as text.
|
|
99
|
+
def run_agent(task, tools, base_url, headers, chosen_model=None):
|
|
100
|
+
MODEL = chosen_model or DEFAULT_MODEL
|
|
101
|
+
messages = [{"role": "user", "content": task}]
|
|
102
|
+
fns = [{"type": "function", "function": {"name": t["name"], "description": t["description"], "parameters": t["input_schema"]}} for t in tools]
|
|
103
|
+
for _ in range(40):
|
|
104
|
+
if ANTHROPIC:
|
|
105
|
+
r = model(base_url, headers, {"model": MODEL, "max_tokens": 1024, "tools": tools, "messages": messages})
|
|
106
|
+
if isinstance(r, str):
|
|
107
|
+
return r
|
|
108
|
+
messages.append({"role": "assistant", "content": r["content"]})
|
|
109
|
+
uses = [b for b in r["content"] if b["type"] == "tool_use"]
|
|
110
|
+
if not uses:
|
|
111
|
+
return "\n".join(b["text"] for b in r["content"] if b["type"] == "text")
|
|
112
|
+
messages.append({"role": "user", "content": [
|
|
113
|
+
{"type": "tool_result", "tool_use_id": u["id"], "content": json.dumps(call_tool(u["name"], u["input"]))} for u in uses]})
|
|
114
|
+
else:
|
|
115
|
+
r = model(base_url, headers, {"model": MODEL, "tools": fns, "messages": messages})
|
|
116
|
+
if isinstance(r, str):
|
|
117
|
+
return r
|
|
118
|
+
m = r["choices"][0]["message"]
|
|
119
|
+
messages.append(m)
|
|
120
|
+
if not m.get("tool_calls"):
|
|
121
|
+
return m.get("content") or ""
|
|
122
|
+
for c in m["tool_calls"]:
|
|
123
|
+
result = call_tool(c["function"]["name"], json.loads(c["function"]["arguments"] or "{}"))
|
|
124
|
+
messages.append({"role": "tool", "tool_call_id": c["id"], "content": json.dumps(result)})
|
|
125
|
+
return "Stopped: too many turns."
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if __name__ == "__main__":
|
|
129
|
+
try:
|
|
130
|
+
msg = receive()
|
|
131
|
+
if not msg or msg.get("type") != "task":
|
|
132
|
+
raise RuntimeError("Expected a task from the WhiteRoom CLI.")
|
|
133
|
+
send({"type": "final", "output": run_agent(msg["task"], msg["tools"], msg["base_url"], msg["headers"], msg.get("model"))})
|
|
134
|
+
except Exception as err:
|
|
135
|
+
print(err, file=sys.stderr)
|
|
136
|
+
sys.exit(1)
|
package/src/index.ts
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { WhiteRoomClient, WhiteRoomError } from "@whiteroom-ai/sdk";
|
|
3
|
-
|
|
4
|
-
const USAGE = `whiteroom — CLI for WhiteRoom agent governance
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
whiteroom health
|
|
8
|
-
whiteroom register <agent_id> [--fleet <id>] [--role <role>]
|
|
9
|
-
whiteroom pair <agent_a> <agent_b> [--fleet <id>]
|
|
10
|
-
whiteroom auto-pair [--fleet <id>]
|
|
11
|
-
whiteroom start <agent_id> [--fleet <id>]
|
|
12
|
-
whiteroom task <agent_id> <task_name> [--minutes <n>] [--tokens <n>] [--fleet <id>]
|
|
13
|
-
whiteroom check <agent_id> [--fleet <id>]
|
|
14
|
-
whiteroom handover <from_agent> <to_agent> [--fleet <id>]
|
|
15
|
-
whiteroom alarm <agent_id> [--fleet <id>]
|
|
16
|
-
whiteroom report [--fleet <id>]
|
|
17
|
-
whiteroom fleets
|
|
18
|
-
whiteroom login <fleet_token>
|
|
19
|
-
|
|
20
|
-
Options:
|
|
21
|
-
--url <base_url> Server URL (default: WHITEROOM_URL or http://localhost:3000)
|
|
22
|
-
--key <api_key> API key (default: WHITEROOM_API_KEY)
|
|
23
|
-
`;
|
|
24
|
-
|
|
25
|
-
function parseArgs(argv: string[]) {
|
|
26
|
-
const args: string[] = [];
|
|
27
|
-
const flags: Record<string, string> = {};
|
|
28
|
-
for (let i = 0; i < argv.length; i++) {
|
|
29
|
-
if (argv[i].startsWith("--") && i + 1 < argv.length) {
|
|
30
|
-
flags[argv[i].slice(2)] = argv[++i];
|
|
31
|
-
} else {
|
|
32
|
-
args.push(argv[i]);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return { args, flags };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function main() {
|
|
39
|
-
const { args, flags } = parseArgs(process.argv.slice(2));
|
|
40
|
-
const command = args[0];
|
|
41
|
-
|
|
42
|
-
if (!command || command === "help" || command === "--help") {
|
|
43
|
-
console.log(USAGE);
|
|
44
|
-
process.exit(0);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const client = new WhiteRoomClient({
|
|
48
|
-
baseUrl: flags.url ?? process.env.WHITEROOM_URL ?? "http://localhost:3000",
|
|
49
|
-
apiKey: flags.key ?? process.env.WHITEROOM_API_KEY,
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
switch (command) {
|
|
54
|
-
case "health":
|
|
55
|
-
print(await client.health());
|
|
56
|
-
break;
|
|
57
|
-
|
|
58
|
-
case "register":
|
|
59
|
-
requireArg(args[1], "agent_id");
|
|
60
|
-
print(await client.registerAgent(args[1], { fleetId: flags.fleet, role: flags.role }));
|
|
61
|
-
break;
|
|
62
|
-
|
|
63
|
-
case "pair":
|
|
64
|
-
requireArg(args[1], "agent_a");
|
|
65
|
-
requireArg(args[2], "agent_b");
|
|
66
|
-
print(await client.pairAgents(args[1], args[2], flags.fleet));
|
|
67
|
-
break;
|
|
68
|
-
|
|
69
|
-
case "auto-pair":
|
|
70
|
-
print(await client.autoPair(flags.fleet));
|
|
71
|
-
break;
|
|
72
|
-
|
|
73
|
-
case "start":
|
|
74
|
-
requireArg(args[1], "agent_id");
|
|
75
|
-
print(await client.startWatch(args[1], flags.fleet));
|
|
76
|
-
break;
|
|
77
|
-
|
|
78
|
-
case "task":
|
|
79
|
-
requireArg(args[1], "agent_id");
|
|
80
|
-
requireArg(args[2], "task_name");
|
|
81
|
-
print(
|
|
82
|
-
await client.completeTask(args[1], args[2], {
|
|
83
|
-
fleetId: flags.fleet,
|
|
84
|
-
minutesSpent: flags.minutes ? Number(flags.minutes) : undefined,
|
|
85
|
-
tokensUsed: flags.tokens ? Number(flags.tokens) : undefined,
|
|
86
|
-
})
|
|
87
|
-
);
|
|
88
|
-
break;
|
|
89
|
-
|
|
90
|
-
case "check":
|
|
91
|
-
requireArg(args[1], "agent_id");
|
|
92
|
-
print(await client.checkWatch(args[1], flags.fleet));
|
|
93
|
-
break;
|
|
94
|
-
|
|
95
|
-
case "handover":
|
|
96
|
-
requireArg(args[1], "from_agent");
|
|
97
|
-
requireArg(args[2], "to_agent");
|
|
98
|
-
print(await client.initiateHandover(args[1], args[2], { fleetId: flags.fleet }));
|
|
99
|
-
break;
|
|
100
|
-
|
|
101
|
-
case "alarm":
|
|
102
|
-
requireArg(args[1], "agent_id");
|
|
103
|
-
print(await client.fireAlarm(args[1], flags.fleet));
|
|
104
|
-
break;
|
|
105
|
-
|
|
106
|
-
case "report":
|
|
107
|
-
print(await client.fleetReport(flags.fleet));
|
|
108
|
-
break;
|
|
109
|
-
|
|
110
|
-
case "fleets":
|
|
111
|
-
print(await client.listFleets());
|
|
112
|
-
break;
|
|
113
|
-
|
|
114
|
-
case "login":
|
|
115
|
-
requireArg(args[1], "fleet_token");
|
|
116
|
-
print(await client.tokenLogin(args[1]));
|
|
117
|
-
break;
|
|
118
|
-
|
|
119
|
-
default:
|
|
120
|
-
console.error(`Unknown command: ${command}\n`);
|
|
121
|
-
console.log(USAGE);
|
|
122
|
-
process.exit(1);
|
|
123
|
-
}
|
|
124
|
-
} catch (e) {
|
|
125
|
-
if (e instanceof WhiteRoomError) {
|
|
126
|
-
console.error(`Error ${(e as WhiteRoomError).status}: ${(e as WhiteRoomError).message}`);
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
129
|
-
throw e;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function requireArg(value: string | undefined, name: string): asserts value is string {
|
|
134
|
-
if (!value) {
|
|
135
|
-
console.error(`Missing required argument: <${name}>`);
|
|
136
|
-
process.exit(1);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function print(data: unknown) {
|
|
141
|
-
console.log(JSON.stringify(data, null, 2));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
main();
|
package/tsconfig.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"outDir": "dist",
|
|
7
|
-
"rootDir": "src",
|
|
8
|
-
"strict": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"declaration": true,
|
|
12
|
-
"sourceMap": true
|
|
13
|
-
},
|
|
14
|
-
"include": ["src"],
|
|
15
|
-
"exclude": ["node_modules", "dist"]
|
|
16
|
-
}
|