@skillcdn/console 0.0.0-stage → 0.1.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/LICENSE.md +21 -0
- package/README.md +79 -2
- package/dist/api.d.ts +7 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +11 -0
- package/dist/api.js.map +1 -0
- package/dist/cli/cli.d.ts +32 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +553 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/credentials.d.ts +16 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +46 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/format.d.ts +16 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +151 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/help.d.ts +16 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +180 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +25 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/terminal.d.ts +12 -0
- package/dist/cli/terminal.d.ts.map +1 -0
- package/dist/cli/terminal.js +68 -0
- package/dist/cli/terminal.js.map +1 -0
- package/dist/client.d.ts +92 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +117 -0
- package/dist/client.js.map +1 -0
- package/dist/components/board.d.ts +20 -0
- package/dist/components/board.d.ts.map +1 -0
- package/dist/components/board.js +19 -0
- package/dist/components/board.js.map +1 -0
- package/dist/components/decision-form.d.ts +13 -0
- package/dist/components/decision-form.d.ts.map +1 -0
- package/dist/components/decision-form.js +23 -0
- package/dist/components/decision-form.js.map +1 -0
- package/dist/components/decision-list.d.ts +22 -0
- package/dist/components/decision-list.d.ts.map +1 -0
- package/dist/components/decision-list.js +28 -0
- package/dist/components/decision-list.js.map +1 -0
- package/dist/components/event-feed.d.ts +13 -0
- package/dist/components/event-feed.d.ts.map +1 -0
- package/dist/components/event-feed.js +59 -0
- package/dist/components/event-feed.js.map +1 -0
- package/dist/components/markdown.d.ts +4 -0
- package/dist/components/markdown.d.ts.map +1 -0
- package/dist/components/markdown.js +34 -0
- package/dist/components/markdown.js.map +1 -0
- package/dist/components/people.d.ts +11 -0
- package/dist/components/people.d.ts.map +1 -0
- package/dist/components/people.js +7 -0
- package/dist/components/people.js.map +1 -0
- package/dist/components/runs.d.ts +27 -0
- package/dist/components/runs.d.ts.map +1 -0
- package/dist/components/runs.js +45 -0
- package/dist/components/runs.js.map +1 -0
- package/dist/components/shell.d.ts +22 -0
- package/dist/components/shell.d.ts.map +1 -0
- package/dist/components/shell.js +16 -0
- package/dist/components/shell.js.map +1 -0
- package/dist/components/sign-in.d.ts +11 -0
- package/dist/components/sign-in.d.ts.map +1 -0
- package/dist/components/sign-in.js +15 -0
- package/dist/components/sign-in.js.map +1 -0
- package/dist/components/skills.d.ts +7 -0
- package/dist/components/skills.d.ts.map +1 -0
- package/dist/components/skills.js +26 -0
- package/dist/components/skills.js.map +1 -0
- package/dist/components/task-form.d.ts +14 -0
- package/dist/components/task-form.d.ts.map +1 -0
- package/dist/components/task-form.js +34 -0
- package/dist/components/task-form.js.map +1 -0
- package/dist/components/task-view.d.ts +22 -0
- package/dist/components/task-view.d.ts.map +1 -0
- package/dist/components/task-view.js +32 -0
- package/dist/components/task-view.js.map +1 -0
- package/dist/components/tokens.d.ts +26 -0
- package/dist/components/tokens.d.ts.map +1 -0
- package/dist/components/tokens.js +42 -0
- package/dist/components/tokens.js.map +1 -0
- package/dist/components/ui.d.ts +61 -0
- package/dist/components/ui.d.ts.map +1 -0
- package/dist/components/ui.js +109 -0
- package/dist/components/ui.js.map +1 -0
- package/dist/console.css +1382 -0
- package/dist/console.d.ts +44 -0
- package/dist/console.d.ts.map +1 -0
- package/dist/console.js +181 -0
- package/dist/console.js.map +1 -0
- package/dist/data.d.ts +41 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +208 -0
- package/dist/data.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +37 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +40 -0
- package/dist/limits.js.map +1 -0
- package/dist/router.d.ts +37 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +55 -0
- package/dist/router.js.map +1 -0
- package/dist/routes.d.ts +47 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +53 -0
- package/dist/routes.js.map +1 -0
- package/dist/schemas.d.ts +789 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +341 -0
- package/dist/schemas.js.map +1 -0
- package/dist/text.d.ts +6 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +31 -0
- package/dist/text.js.map +1 -0
- package/dist/vocabulary.d.ts +35 -0
- package/dist/vocabulary.d.ts.map +1 -0
- package/dist/vocabulary.js +57 -0
- package/dist/vocabulary.js.map +1 -0
- package/package.json +70 -3
package/dist/cli/cli.js
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import { basename, extname } from "node:path";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { ApiError, createClient } from "../client.js";
|
|
4
|
+
import { MAX_OPTIONS, MIN_OPTIONS } from "../limits.js";
|
|
5
|
+
import { TASK_PRIORITIES, TASK_STATES } from "../vocabulary.js";
|
|
6
|
+
import { formatAnswer, formatDecision, formatDecisionLine, formatOptions, formatRun, formatRunLine, formatSkills, formatTask, formatTaskLine, } from "./format.js";
|
|
7
|
+
import { COMMAND_HELP, helpFor, usage } from "./help.js";
|
|
8
|
+
// The `console` command (docs/specs/cli.md): the agent's side of the console. A thin client of
|
|
9
|
+
// the REST API with no logic of its own: every command is one or two requests and the words to
|
|
10
|
+
// say what came back. It takes what it needs from `CliIo`, so that tests run it whole, against
|
|
11
|
+
// the app and no socket, with a store and readers of their own.
|
|
12
|
+
/** The exit codes of the command, for whoever runs it: a shell, a hook, an agent. */
|
|
13
|
+
export const EXIT = {
|
|
14
|
+
ok: 0,
|
|
15
|
+
/** The console refused, or could not be reached; the reason is on stderr. */
|
|
16
|
+
failed: 1,
|
|
17
|
+
/** The command was not understood. */
|
|
18
|
+
usage: 2,
|
|
19
|
+
/** The decision still waits for a person. */
|
|
20
|
+
waiting: 3,
|
|
21
|
+
};
|
|
22
|
+
/** How long one request for a decision's answer asks the console to hold it: what the server allows. */
|
|
23
|
+
const WAIT_STEP_SECONDS = 50;
|
|
24
|
+
/** A breath between two such requests, should the console answer at once. */
|
|
25
|
+
const WAIT_PAUSE_MS = 500;
|
|
26
|
+
/** How long `ask` waits when nothing is said: within what an agent's shell gives a command. */
|
|
27
|
+
const DEFAULT_ASK_WAIT_SECONDS = 60;
|
|
28
|
+
/** The longest wait a person may ask for: a day. */
|
|
29
|
+
const MAX_WAIT_SECONDS = 86_400;
|
|
30
|
+
/** The command stops with an exit code and a word on stderr. */
|
|
31
|
+
class CliExit extends Error {
|
|
32
|
+
exit;
|
|
33
|
+
constructor(exit, message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = "CliExit";
|
|
36
|
+
this.exit = exit;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const failed = (message) => new CliExit(EXIT.failed, message);
|
|
40
|
+
const misuse = (message) => new CliExit(EXIT.usage, message);
|
|
41
|
+
const GLOBAL_OPTIONS = { json: { type: "boolean" }, url: { type: "string" } };
|
|
42
|
+
function parse(args, options, allowPositionals = true) {
|
|
43
|
+
try {
|
|
44
|
+
return parseArgs({
|
|
45
|
+
args: [...args],
|
|
46
|
+
options: { ...GLOBAL_OPTIONS, ...options },
|
|
47
|
+
allowPositionals,
|
|
48
|
+
strict: true,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw misuse(error instanceof Error ? error.message : "The arguments were not understood.");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const text = (values, name) => {
|
|
56
|
+
const value = values[name];
|
|
57
|
+
return typeof value === "string" ? value : undefined;
|
|
58
|
+
};
|
|
59
|
+
const on = (values, name) => values[name] === true;
|
|
60
|
+
const texts = (values, name) => {
|
|
61
|
+
const value = values[name];
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
return value.filter((item) => typeof item === "string");
|
|
64
|
+
}
|
|
65
|
+
return typeof value === "string" ? [value] : [];
|
|
66
|
+
};
|
|
67
|
+
/** The console and the token to talk to it with: the flags, the environment, then what login kept. */
|
|
68
|
+
async function open(io, values) {
|
|
69
|
+
const stored = await io.store.load();
|
|
70
|
+
const url = text(values, "url") ?? io.env.CONSOLE_URL ?? stored?.url;
|
|
71
|
+
const token = io.env.CONSOLE_TOKEN ?? stored?.token;
|
|
72
|
+
if (url === undefined || token === undefined) {
|
|
73
|
+
throw failed("Not signed in. A person signs the command in: console login --url <the console's origin>");
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
client: createClient({ baseUrl: url, token, fetch: io.fetch }),
|
|
77
|
+
url,
|
|
78
|
+
json: on(values, "json"),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Prints what came back: the console's JSON on `--json`, the words otherwise. */
|
|
82
|
+
function answer(io, session, value, words) {
|
|
83
|
+
io.stdout(session.json ? `${JSON.stringify(value, null, 2)}\n` : `${words()}\n`);
|
|
84
|
+
}
|
|
85
|
+
/** The run a command on a run means: the one named, else the one open run of this token. */
|
|
86
|
+
async function currentRun(session, values) {
|
|
87
|
+
const given = text(values, "run");
|
|
88
|
+
if (given !== undefined) {
|
|
89
|
+
return given;
|
|
90
|
+
}
|
|
91
|
+
const { items } = await session.client.runs({ open: true, mine: true });
|
|
92
|
+
const [only] = items;
|
|
93
|
+
if (only !== undefined && items.length === 1) {
|
|
94
|
+
return only.id;
|
|
95
|
+
}
|
|
96
|
+
if (items.length === 0) {
|
|
97
|
+
throw failed("No run of yours is open. Take a task first: console take <number>");
|
|
98
|
+
}
|
|
99
|
+
throw failed(`Several runs of yours are open; say which with --run <id>:\n${items.map((run) => ` ${formatRunLine(run)}`).join("\n")}`);
|
|
100
|
+
}
|
|
101
|
+
/** A Markdown body: from `--file`, from standard input for `-`, or as given. */
|
|
102
|
+
async function bodyOf(io, values, given) {
|
|
103
|
+
const file = text(values, "file");
|
|
104
|
+
if (file !== undefined) {
|
|
105
|
+
return io.readFile(file);
|
|
106
|
+
}
|
|
107
|
+
return given === "-" ? io.readStdin() : given;
|
|
108
|
+
}
|
|
109
|
+
function originOf(value) {
|
|
110
|
+
const url = URL.canParse(value) ? new URL(value) : undefined;
|
|
111
|
+
if (url === undefined ||
|
|
112
|
+
!/^https?:$/.test(url.protocol) ||
|
|
113
|
+
url.pathname !== "/" ||
|
|
114
|
+
url.search !== "" ||
|
|
115
|
+
url.hash !== "") {
|
|
116
|
+
throw misuse(`Not an origin: ${value}. Say the console's address without a path, such as https://console.example.com`);
|
|
117
|
+
}
|
|
118
|
+
return url.origin;
|
|
119
|
+
}
|
|
120
|
+
function stateOf(value) {
|
|
121
|
+
if (value === undefined) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const found = TASK_STATES.find((state) => state === value);
|
|
125
|
+
if (found === undefined) {
|
|
126
|
+
throw misuse(`Not a state: ${value}. One of ${TASK_STATES.join(", ")}`);
|
|
127
|
+
}
|
|
128
|
+
return found;
|
|
129
|
+
}
|
|
130
|
+
function priorityOf(value) {
|
|
131
|
+
if (value === undefined) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const found = TASK_PRIORITIES.find((priority) => priority === value);
|
|
135
|
+
if (found === undefined) {
|
|
136
|
+
throw misuse(`Not a priority: ${value}. One of ${TASK_PRIORITIES.join(", ")}`);
|
|
137
|
+
}
|
|
138
|
+
return found;
|
|
139
|
+
}
|
|
140
|
+
function secondsOf(value, fallback) {
|
|
141
|
+
if (value === undefined) {
|
|
142
|
+
return fallback;
|
|
143
|
+
}
|
|
144
|
+
const seconds = Number(value);
|
|
145
|
+
if (!Number.isInteger(seconds) || seconds < 0 || seconds > MAX_WAIT_SECONDS) {
|
|
146
|
+
throw misuse(`Not a number of seconds to wait: ${value}`);
|
|
147
|
+
}
|
|
148
|
+
return seconds;
|
|
149
|
+
}
|
|
150
|
+
/** One positional, and nothing else. */
|
|
151
|
+
function theOne(positionals, ask) {
|
|
152
|
+
const [first] = positionals;
|
|
153
|
+
if (first === undefined || positionals.length > 1) {
|
|
154
|
+
throw misuse(ask);
|
|
155
|
+
}
|
|
156
|
+
return first;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The decision once answered, or as it stands when the wait is over. Each request asks the
|
|
160
|
+
* console to hold it for a while, so the answer arrives as soon as a person gives it.
|
|
161
|
+
*/
|
|
162
|
+
async function waitForAnswer(io, client, decision, seconds) {
|
|
163
|
+
const deadline = io.now() + seconds * 1000;
|
|
164
|
+
let current = decision;
|
|
165
|
+
for (;;) {
|
|
166
|
+
const left = deadline - io.now();
|
|
167
|
+
if (current.answer !== null || left <= 0) {
|
|
168
|
+
return current;
|
|
169
|
+
}
|
|
170
|
+
current = await client.awaitDecision(current.id, Math.max(1, Math.min(Math.ceil(left / 1000), WAIT_STEP_SECONDS)));
|
|
171
|
+
if (current.answer === null) {
|
|
172
|
+
await io.sleep(WAIT_PAUSE_MS);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const stillWaiting = (id) => `Decision ${id} still waits for a person; the run waits with it. Keep waiting with: console decision ${id} --wait 100, as often as needed. Meanwhile, go on only with work that does not depend on the answer.`;
|
|
177
|
+
/**
|
|
178
|
+
* Waits for the answer and says what it is, or that it is still to come. On `--json`, a decision
|
|
179
|
+
* printed already as it was raised (`shown`) is printed again only with its answer.
|
|
180
|
+
*/
|
|
181
|
+
async function settle(io, session, decision, seconds, shown = false) {
|
|
182
|
+
const outcome = decision.answer === null && seconds > 0
|
|
183
|
+
? await waitForAnswer(io, session.client, decision, seconds)
|
|
184
|
+
: decision;
|
|
185
|
+
if (session.json) {
|
|
186
|
+
if (!shown || outcome.answer !== null) {
|
|
187
|
+
io.stdout(`${JSON.stringify(outcome, null, 2)}\n`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
io.stdout(`${outcome.answer === null ? stillWaiting(outcome.id) : formatAnswer(outcome)}\n`);
|
|
192
|
+
}
|
|
193
|
+
return outcome.answer === null ? EXIT.waiting : EXIT.ok;
|
|
194
|
+
}
|
|
195
|
+
const login = async (args, io) => {
|
|
196
|
+
const { values } = parse(args, { "token-stdin": { type: "boolean" } }, false);
|
|
197
|
+
const stored = await io.store.load();
|
|
198
|
+
const wanted = text(values, "url") ?? io.env.CONSOLE_URL ?? stored?.url;
|
|
199
|
+
if (wanted === undefined) {
|
|
200
|
+
throw misuse("Say where the console is: console login --url https://console.example.com");
|
|
201
|
+
}
|
|
202
|
+
const url = originOf(wanted);
|
|
203
|
+
const token = (on(values, "token-stdin")
|
|
204
|
+
? await io.readStdin()
|
|
205
|
+
: await io.readSecret(`Paste a token made at ${url}/tokens: `)).trim();
|
|
206
|
+
if (token.length === 0) {
|
|
207
|
+
throw failed("No token was given.");
|
|
208
|
+
}
|
|
209
|
+
const me = await createClient({ baseUrl: url, token, fetch: io.fetch }).me();
|
|
210
|
+
const person = me.person;
|
|
211
|
+
if (person === null) {
|
|
212
|
+
throw failed("The console does not know this token. Make one on your Tokens page and try again.");
|
|
213
|
+
}
|
|
214
|
+
const kept = await io.store.save({ url, token });
|
|
215
|
+
io.stdout(`Signed in to ${me.workspace.name} at ${url} as ${person.login} (${person.role}). The token is kept in ${kept}.\n`);
|
|
216
|
+
return EXIT.ok;
|
|
217
|
+
};
|
|
218
|
+
const logout = async (args, io) => {
|
|
219
|
+
parse(args, {}, false);
|
|
220
|
+
await io.store.clear();
|
|
221
|
+
io.stdout("Signed out here. The token itself is removed on your Tokens page.\n");
|
|
222
|
+
return EXIT.ok;
|
|
223
|
+
};
|
|
224
|
+
const whoami = async (args, io) => {
|
|
225
|
+
const { values } = parse(args, {}, false);
|
|
226
|
+
const session = await open(io, values);
|
|
227
|
+
const me = await session.client.me();
|
|
228
|
+
const person = me.person;
|
|
229
|
+
if (person === null) {
|
|
230
|
+
throw failed("The console does not know this token. Sign in again: console login");
|
|
231
|
+
}
|
|
232
|
+
answer(io, session, me, () => `${person.login} (${person.role}) at ${me.workspace.name}, ${session.url}`);
|
|
233
|
+
return EXIT.ok;
|
|
234
|
+
};
|
|
235
|
+
const tasks = async (args, io) => {
|
|
236
|
+
const { values } = parse(args, { state: { type: "string" } }, false);
|
|
237
|
+
const state = stateOf(text(values, "state"));
|
|
238
|
+
const session = await open(io, values);
|
|
239
|
+
const found = await session.client.tasks(state === undefined ? {} : { state });
|
|
240
|
+
answer(io, session, found, () => found.items.length === 0 ? "No tasks." : found.items.map(formatTaskLine).join("\n"));
|
|
241
|
+
return EXIT.ok;
|
|
242
|
+
};
|
|
243
|
+
const skills = async (args, io) => {
|
|
244
|
+
const { values } = parse(args, {}, false);
|
|
245
|
+
const session = await open(io, values);
|
|
246
|
+
const found = await session.client.skills();
|
|
247
|
+
answer(io, session, found, () => formatSkills(found));
|
|
248
|
+
return EXIT.ok;
|
|
249
|
+
};
|
|
250
|
+
const newTask = async (args, io) => {
|
|
251
|
+
const { values, positionals } = parse(args, {
|
|
252
|
+
body: { type: "string" },
|
|
253
|
+
file: { type: "string" },
|
|
254
|
+
state: { type: "string" },
|
|
255
|
+
priority: { type: "string" },
|
|
256
|
+
});
|
|
257
|
+
const title = theOne(positionals, 'Say the title: console task new "<title>"');
|
|
258
|
+
const state = stateOf(text(values, "state"));
|
|
259
|
+
const priority = priorityOf(text(values, "priority"));
|
|
260
|
+
const body = await bodyOf(io, values, text(values, "body"));
|
|
261
|
+
const session = await open(io, values);
|
|
262
|
+
const made = await session.client.createTask({
|
|
263
|
+
title,
|
|
264
|
+
...(body === undefined ? {} : { body }),
|
|
265
|
+
...(state === undefined ? {} : { state }),
|
|
266
|
+
...(priority === undefined ? {} : { priority }),
|
|
267
|
+
});
|
|
268
|
+
answer(io, session, made, () => `Task #${made.number} written: ${made.title}\nid: ${made.id}`);
|
|
269
|
+
return EXIT.ok;
|
|
270
|
+
};
|
|
271
|
+
const task = async (args, io) => {
|
|
272
|
+
if (args[0] === "new") {
|
|
273
|
+
return newTask(args.slice(1), io);
|
|
274
|
+
}
|
|
275
|
+
const { values, positionals } = parse(args, {});
|
|
276
|
+
const ref = theOne(positionals, "Say which task: console task <number|id>");
|
|
277
|
+
const session = await open(io, values);
|
|
278
|
+
const found = await session.client.task(ref);
|
|
279
|
+
const [decisions, runs] = await Promise.all([
|
|
280
|
+
session.client.decisions({ task: found.id }),
|
|
281
|
+
session.client.runs({ task: found.id }),
|
|
282
|
+
]);
|
|
283
|
+
answer(io, session, { task: found, decisions: decisions.items, runs: runs.items }, () => formatTask(found, decisions.items, runs.items));
|
|
284
|
+
return EXIT.ok;
|
|
285
|
+
};
|
|
286
|
+
const take = async (args, io) => {
|
|
287
|
+
const { values, positionals } = parse(args, { agent: { type: "string" } });
|
|
288
|
+
const ref = theOne(positionals, "Say which task: console take <number|id>");
|
|
289
|
+
const session = await open(io, values);
|
|
290
|
+
const found = await session.client.task(ref);
|
|
291
|
+
const agent = text(values, "agent");
|
|
292
|
+
const run = await session.client.startRun({
|
|
293
|
+
taskId: found.id,
|
|
294
|
+
...(agent === undefined ? {} : { agent }),
|
|
295
|
+
});
|
|
296
|
+
answer(io, session, { run, task: found }, () => [
|
|
297
|
+
`Run ${run.id} began on #${found.number} ${found.title}, as "${run.agent}" for ${run.person.login}. The task is in progress and theirs.`,
|
|
298
|
+
"",
|
|
299
|
+
formatTask(found),
|
|
300
|
+
"",
|
|
301
|
+
'Say how it goes: console report "<what you found or did>". Hand in what you make: console hand-in <https url | file path>.',
|
|
302
|
+
'Ask when a person must decide: console ask "<question>" --option "..." --option "...". End with: console finish --summary "<what was done, what is left>".',
|
|
303
|
+
].join("\n"));
|
|
304
|
+
return EXIT.ok;
|
|
305
|
+
};
|
|
306
|
+
const report = async (args, io) => {
|
|
307
|
+
const { values, positionals } = parse(args, {
|
|
308
|
+
file: { type: "string" },
|
|
309
|
+
run: { type: "string" },
|
|
310
|
+
});
|
|
311
|
+
if (positionals.length > 1) {
|
|
312
|
+
throw misuse('Say the report as one argument: console report "<markdown>"');
|
|
313
|
+
}
|
|
314
|
+
const body = await bodyOf(io, values, positionals[0]);
|
|
315
|
+
if (body === undefined) {
|
|
316
|
+
throw misuse('Say what to report: console report "<markdown>", or --file <path>, or - to read standard input.');
|
|
317
|
+
}
|
|
318
|
+
const session = await open(io, values);
|
|
319
|
+
const runId = await currentRun(session, values);
|
|
320
|
+
const run = await session.client.report(runId, { body });
|
|
321
|
+
answer(io, session, run, () => `Reported on run ${run.id}: ${run.reports.length} report${run.reports.length === 1 ? "" : "s"} so far.`);
|
|
322
|
+
return EXIT.ok;
|
|
323
|
+
};
|
|
324
|
+
/** The media types of the kinds of file an agent hands in, by extension; the rest is bytes. */
|
|
325
|
+
const CONTENT_TYPES = {
|
|
326
|
+
".md": "text/markdown",
|
|
327
|
+
".txt": "text/plain",
|
|
328
|
+
".log": "text/plain",
|
|
329
|
+
".csv": "text/csv",
|
|
330
|
+
".json": "application/json",
|
|
331
|
+
".yaml": "application/yaml",
|
|
332
|
+
".yml": "application/yaml",
|
|
333
|
+
".html": "text/html",
|
|
334
|
+
".png": "image/png",
|
|
335
|
+
".jpg": "image/jpeg",
|
|
336
|
+
".jpeg": "image/jpeg",
|
|
337
|
+
".gif": "image/gif",
|
|
338
|
+
".webp": "image/webp",
|
|
339
|
+
".svg": "image/svg+xml",
|
|
340
|
+
".pdf": "application/pdf",
|
|
341
|
+
".zip": "application/zip",
|
|
342
|
+
};
|
|
343
|
+
const soFar = (count) => `${count} artifact${count === 1 ? "" : "s"} so far.`;
|
|
344
|
+
const handIn = async (args, io) => {
|
|
345
|
+
const { values, positionals } = parse(args, {
|
|
346
|
+
label: { type: "string" },
|
|
347
|
+
run: { type: "string" },
|
|
348
|
+
});
|
|
349
|
+
const what = theOne(positionals, "Say what to hand in: console hand-in <https url | file path> [--label <words>]");
|
|
350
|
+
const label = text(values, "label");
|
|
351
|
+
const session = await open(io, values);
|
|
352
|
+
const runId = await currentRun(session, values);
|
|
353
|
+
// A URL is handed in as a link, and the console says whether it takes it; anything else
|
|
354
|
+
// names a file on this machine.
|
|
355
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(what)) {
|
|
356
|
+
const run = await session.client.handIn(runId, {
|
|
357
|
+
url: what,
|
|
358
|
+
...(label === undefined ? {} : { label }),
|
|
359
|
+
});
|
|
360
|
+
answer(io, session, run, () => `Handed in ${what} on run ${run.id}: ${soFar(run.artifacts.length)}`);
|
|
361
|
+
return EXIT.ok;
|
|
362
|
+
}
|
|
363
|
+
let bytes;
|
|
364
|
+
try {
|
|
365
|
+
bytes = await io.readBytes(what);
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
throw failed(`No file could be read at ${what}. Hand in an https link, or the path of a file.`);
|
|
369
|
+
}
|
|
370
|
+
const name = basename(what);
|
|
371
|
+
const contentType = CONTENT_TYPES[extname(name).toLowerCase()];
|
|
372
|
+
const run = await session.client.handInFile(runId, {
|
|
373
|
+
name,
|
|
374
|
+
bytes,
|
|
375
|
+
...(contentType === undefined ? {} : { contentType }),
|
|
376
|
+
...(label === undefined ? {} : { label }),
|
|
377
|
+
});
|
|
378
|
+
answer(io, session, run, () => `Handed in the file ${name} (${bytes.byteLength} bytes) on run ${run.id}: ${soFar(run.artifacts.length)}`);
|
|
379
|
+
return EXIT.ok;
|
|
380
|
+
};
|
|
381
|
+
const ask = async (args, io) => {
|
|
382
|
+
const { values, positionals } = parse(args, {
|
|
383
|
+
option: { type: "string", multiple: true },
|
|
384
|
+
body: { type: "string" },
|
|
385
|
+
file: { type: "string" },
|
|
386
|
+
run: { type: "string" },
|
|
387
|
+
wait: { type: "string" },
|
|
388
|
+
});
|
|
389
|
+
const question = theOne(positionals, 'Say the question: console ask "<question>" --option "<label>" --option "<label>"');
|
|
390
|
+
const options = texts(values, "option");
|
|
391
|
+
if (options.length < MIN_OPTIONS || options.length > MAX_OPTIONS) {
|
|
392
|
+
throw misuse(`Give ${MIN_OPTIONS} to ${MAX_OPTIONS} options, one --option each.`);
|
|
393
|
+
}
|
|
394
|
+
const seconds = secondsOf(text(values, "wait"), DEFAULT_ASK_WAIT_SECONDS);
|
|
395
|
+
const body = await bodyOf(io, values, text(values, "body"));
|
|
396
|
+
const session = await open(io, values);
|
|
397
|
+
const runId = await currentRun(session, values);
|
|
398
|
+
const raised = await session.client.raiseDecision({
|
|
399
|
+
question,
|
|
400
|
+
options: options.map((label) => ({ label })),
|
|
401
|
+
runId,
|
|
402
|
+
...(body === undefined ? {} : { body }),
|
|
403
|
+
});
|
|
404
|
+
// The id is printed before any waiting, so that a wait cut short loses nothing.
|
|
405
|
+
io.stdout(session.json
|
|
406
|
+
? `${JSON.stringify(raised, null, 2)}\n`
|
|
407
|
+
: `Decision ${raised.id} raised on run ${runId}; the run waits for a person.\n${formatOptions(raised)}\n`);
|
|
408
|
+
return settle(io, session, raised, seconds, true);
|
|
409
|
+
};
|
|
410
|
+
const decision = async (args, io) => {
|
|
411
|
+
const { values, positionals } = parse(args, { wait: { type: "string" } });
|
|
412
|
+
const id = theOne(positionals, "Say which decision: console decision <id> [--wait <seconds>]");
|
|
413
|
+
const seconds = secondsOf(text(values, "wait"), 0);
|
|
414
|
+
const session = await open(io, values);
|
|
415
|
+
const found = await session.client.decision(id);
|
|
416
|
+
if (seconds === 0) {
|
|
417
|
+
answer(io, session, found, () => formatDecision(found));
|
|
418
|
+
return EXIT.ok;
|
|
419
|
+
}
|
|
420
|
+
return settle(io, session, found, seconds);
|
|
421
|
+
};
|
|
422
|
+
const decisions = async (args, io) => {
|
|
423
|
+
const { values } = parse(args, { open: { type: "boolean" } }, false);
|
|
424
|
+
const session = await open(io, values);
|
|
425
|
+
const found = await session.client.decisions(on(values, "open") ? { open: true } : {});
|
|
426
|
+
answer(io, session, found, () => found.items.length === 0 ? "No decisions." : found.items.map(formatDecisionLine).join("\n"));
|
|
427
|
+
return EXIT.ok;
|
|
428
|
+
};
|
|
429
|
+
const ending = (status) => async (args, io) => {
|
|
430
|
+
const { values } = parse(args, { summary: { type: "string" }, file: { type: "string" }, run: { type: "string" } }, false);
|
|
431
|
+
const summary = await bodyOf(io, values, text(values, "summary"));
|
|
432
|
+
const session = await open(io, values);
|
|
433
|
+
const runId = await currentRun(session, values);
|
|
434
|
+
const run = await session.client.endRun(runId, {
|
|
435
|
+
status,
|
|
436
|
+
...(summary === undefined ? {} : { summary }),
|
|
437
|
+
});
|
|
438
|
+
answer(io, session, run, () => status === "finished"
|
|
439
|
+
? `Run ${run.id} finished; the task is up for review.`
|
|
440
|
+
: `Run ${run.id} failed; the task stays as it is.`);
|
|
441
|
+
return EXIT.ok;
|
|
442
|
+
};
|
|
443
|
+
const abandon = async (args, io) => {
|
|
444
|
+
const { values, positionals } = parse(args, {
|
|
445
|
+
summary: { type: "string" },
|
|
446
|
+
file: { type: "string" },
|
|
447
|
+
run: { type: "string" },
|
|
448
|
+
});
|
|
449
|
+
if (positionals.length > 1) {
|
|
450
|
+
throw misuse("Say which run: console abandon [<run id>]");
|
|
451
|
+
}
|
|
452
|
+
const summary = await bodyOf(io, values, text(values, "summary"));
|
|
453
|
+
const session = await open(io, values);
|
|
454
|
+
const runId = positionals[0] ?? (await currentRun(session, values));
|
|
455
|
+
const run = await session.client.endRun(runId, {
|
|
456
|
+
status: "abandoned",
|
|
457
|
+
...(summary === undefined ? {} : { summary }),
|
|
458
|
+
});
|
|
459
|
+
answer(io, session, run, () => `Run ${run.id} abandoned; the task stays as it is.`);
|
|
460
|
+
return EXIT.ok;
|
|
461
|
+
};
|
|
462
|
+
const runs = async (args, io) => {
|
|
463
|
+
const { values } = parse(args, { task: { type: "string" }, open: { type: "boolean" }, mine: { type: "boolean" } }, false);
|
|
464
|
+
const session = await open(io, values);
|
|
465
|
+
const ref = text(values, "task");
|
|
466
|
+
const taskId = ref === undefined ? undefined : (await session.client.task(ref)).id;
|
|
467
|
+
const found = await session.client.runs({
|
|
468
|
+
...(taskId === undefined ? {} : { task: taskId }),
|
|
469
|
+
...(on(values, "open") ? { open: true } : {}),
|
|
470
|
+
...(on(values, "mine") ? { mine: true } : {}),
|
|
471
|
+
});
|
|
472
|
+
answer(io, session, found, () => found.items.length === 0 ? "No runs." : found.items.map(formatRunLine).join("\n"));
|
|
473
|
+
return EXIT.ok;
|
|
474
|
+
};
|
|
475
|
+
const run = async (args, io) => {
|
|
476
|
+
const { values, positionals } = parse(args, {});
|
|
477
|
+
const id = theOne(positionals, "Say which run: console run <id>");
|
|
478
|
+
const session = await open(io, values);
|
|
479
|
+
const found = await session.client.run(id);
|
|
480
|
+
answer(io, session, found, () => formatRun(found));
|
|
481
|
+
return EXIT.ok;
|
|
482
|
+
};
|
|
483
|
+
const COMMANDS = {
|
|
484
|
+
login,
|
|
485
|
+
logout,
|
|
486
|
+
whoami,
|
|
487
|
+
tasks,
|
|
488
|
+
task,
|
|
489
|
+
skills,
|
|
490
|
+
take,
|
|
491
|
+
report,
|
|
492
|
+
"hand-in": handIn,
|
|
493
|
+
ask,
|
|
494
|
+
decision,
|
|
495
|
+
decisions,
|
|
496
|
+
finish: ending("finished"),
|
|
497
|
+
fail: ending("failed"),
|
|
498
|
+
abandon,
|
|
499
|
+
runs,
|
|
500
|
+
run,
|
|
501
|
+
};
|
|
502
|
+
function help(io, name) {
|
|
503
|
+
if (name === undefined) {
|
|
504
|
+
io.stdout(usage());
|
|
505
|
+
return EXIT.ok;
|
|
506
|
+
}
|
|
507
|
+
const found = helpFor(name);
|
|
508
|
+
if (found === undefined) {
|
|
509
|
+
throw misuse(`Not a command: ${name}. The commands: ${Object.keys(COMMAND_HELP).join(", ")}`);
|
|
510
|
+
}
|
|
511
|
+
io.stdout(found);
|
|
512
|
+
return EXIT.ok;
|
|
513
|
+
}
|
|
514
|
+
/** What a refusal of the console is followed by, when there is something to do about it. */
|
|
515
|
+
function hintFor(error) {
|
|
516
|
+
switch (error.code) {
|
|
517
|
+
case "auth.required":
|
|
518
|
+
return "The token is not one the console knows, any more or at all. A person signs the command in again: console login\n";
|
|
519
|
+
case "network":
|
|
520
|
+
return "Is the console's address right? console whoami --url <origin> says what the command uses.\n";
|
|
521
|
+
default:
|
|
522
|
+
return "";
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/** Runs the command and answers with its exit code. What it prints goes through `io`. */
|
|
526
|
+
export async function runCli(argv, io) {
|
|
527
|
+
const [name, ...rest] = argv;
|
|
528
|
+
try {
|
|
529
|
+
if (name === undefined || name === "help" || name === "--help" || name === "-h") {
|
|
530
|
+
return help(io, rest[0]);
|
|
531
|
+
}
|
|
532
|
+
if (rest.includes("--help") || rest.includes("-h")) {
|
|
533
|
+
return help(io, name);
|
|
534
|
+
}
|
|
535
|
+
const command = COMMANDS[name];
|
|
536
|
+
if (command === undefined) {
|
|
537
|
+
throw misuse(`Not a command: ${name}. Run: console help`);
|
|
538
|
+
}
|
|
539
|
+
return await command(rest, io);
|
|
540
|
+
}
|
|
541
|
+
catch (error) {
|
|
542
|
+
if (error instanceof CliExit) {
|
|
543
|
+
io.stderr(`${error.message}\n`);
|
|
544
|
+
return error.exit;
|
|
545
|
+
}
|
|
546
|
+
if (error instanceof ApiError) {
|
|
547
|
+
io.stderr(`${error.code}: ${error.message}\n${hintFor(error)}`);
|
|
548
|
+
return EXIT.failed;
|
|
549
|
+
}
|
|
550
|
+
throw error;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Credentials {
|
|
2
|
+
/** The origin of the console, without a path. */
|
|
3
|
+
readonly url: string;
|
|
4
|
+
/** A token made on the console's Tokens page. */
|
|
5
|
+
readonly token: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CredentialStore {
|
|
8
|
+
load(): Promise<Credentials | undefined>;
|
|
9
|
+
/** Keeps the credentials and answers where. */
|
|
10
|
+
save(credentials: Credentials): Promise<string>;
|
|
11
|
+
clear(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** The directory the file lives in: under `XDG_CONFIG_HOME`, or `~/.config`. */
|
|
14
|
+
export declare function defaultConfigDir(env: Readonly<Record<string, string | undefined>>): string;
|
|
15
|
+
export declare function createFileStore(directory: string): CredentialStore;
|
|
16
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACzC,+CAA+C;IAC/C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AASD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAM1F;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CA4BlE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import * as z from "zod/mini";
|
|
5
|
+
const credentialsSchema = z.object({
|
|
6
|
+
url: z.string().check(z.minLength(1)),
|
|
7
|
+
token: z.string().check(z.minLength(1)),
|
|
8
|
+
});
|
|
9
|
+
const FILE_NAME = "credentials.json";
|
|
10
|
+
/** The directory the file lives in: under `XDG_CONFIG_HOME`, or `~/.config`. */
|
|
11
|
+
export function defaultConfigDir(env) {
|
|
12
|
+
const base = env.XDG_CONFIG_HOME;
|
|
13
|
+
return join(base === undefined || base.length === 0 ? join(homedir(), ".config") : base, "skillcdn-console");
|
|
14
|
+
}
|
|
15
|
+
export function createFileStore(directory) {
|
|
16
|
+
const path = join(directory, FILE_NAME);
|
|
17
|
+
return {
|
|
18
|
+
async load() {
|
|
19
|
+
let content;
|
|
20
|
+
try {
|
|
21
|
+
content = await readFile(path, "utf8");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const parsed = credentialsSchema.safeParse(JSON.parse(content));
|
|
28
|
+
return parsed.success ? parsed.data : undefined;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
async save(credentials) {
|
|
35
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
36
|
+
await writeFile(path, `${JSON.stringify(credentials, null, 2)}\n`, { mode: 0o600 });
|
|
37
|
+
// The mode above applies to a file made now; one that was there keeps its own, so it is set again.
|
|
38
|
+
await chmod(path, 0o600).catch(() => undefined);
|
|
39
|
+
return path;
|
|
40
|
+
},
|
|
41
|
+
async clear() {
|
|
42
|
+
await rm(path, { force: true });
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=credentials.js.map
|