@qoren/cli 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 +202 -0
- package/README.md +162 -0
- package/dist/args.d.ts +5 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +23 -0
- package/dist/args.js.map +1 -0
- package/dist/commands/account.d.ts +4 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +154 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/agent.d.ts +27 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +968 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/api.d.ts +4 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +66 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/approvals.d.ts +11 -0
- package/dist/commands/approvals.d.ts.map +1 -0
- package/dist/commands/approvals.js +140 -0
- package/dist/commands/approvals.js.map +1 -0
- package/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +215 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/clients.d.ts +62 -0
- package/dist/commands/clients.d.ts.map +1 -0
- package/dist/commands/clients.js +311 -0
- package/dist/commands/clients.js.map +1 -0
- package/dist/commands/console.d.ts +4 -0
- package/dist/commands/console.d.ts.map +1 -0
- package/dist/commands/console.js +26 -0
- package/dist/commands/console.js.map +1 -0
- package/dist/commands/customAgent.d.ts +42 -0
- package/dist/commands/customAgent.d.ts.map +1 -0
- package/dist/commands/customAgent.js +449 -0
- package/dist/commands/customAgent.js.map +1 -0
- package/dist/commands/designer.d.ts +32 -0
- package/dist/commands/designer.d.ts.map +1 -0
- package/dist/commands/designer.js +682 -0
- package/dist/commands/designer.js.map +1 -0
- package/dist/commands/env.d.ts +15 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +245 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/interactive.d.ts +4 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +30 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/jobs.d.ts +4 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +59 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/secrets.d.ts +15 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +164 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/webhook.d.ts +4 -0
- package/dist/commands/webhook.d.ts.map +1 -0
- package/dist/commands/webhook.js +275 -0
- package/dist/commands/webhook.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +117 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +52 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +163 -0
- package/dist/context.js.map +1 -0
- package/dist/duration.d.ts +9 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +30 -0
- package/dist/duration.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/issues.d.ts +10 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +45 -0
- package/dist/issues.js.map +1 -0
- package/dist/jobProgress.d.ts +12 -0
- package/dist/jobProgress.d.ts.map +1 -0
- package/dist/jobProgress.js +56 -0
- package/dist/jobProgress.js.map +1 -0
- package/dist/loopback.d.ts +28 -0
- package/dist/loopback.d.ts.map +1 -0
- package/dist/loopback.js +110 -0
- package/dist/loopback.js.map +1 -0
- package/dist/migrate/apply.d.ts +29 -0
- package/dist/migrate/apply.d.ts.map +1 -0
- package/dist/migrate/apply.js +135 -0
- package/dist/migrate/apply.js.map +1 -0
- package/dist/migrate/bundle.d.ts +89 -0
- package/dist/migrate/bundle.d.ts.map +1 -0
- package/dist/migrate/bundle.js +681 -0
- package/dist/migrate/bundle.js.map +1 -0
- package/dist/migrate/tar.d.ts +9 -0
- package/dist/migrate/tar.d.ts.map +1 -0
- package/dist/migrate/tar.js +89 -0
- package/dist/migrate/tar.js.map +1 -0
- package/dist/output.d.ts +46 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +152 -0
- package/dist/output.js.map +1 -0
- package/dist/program.d.ts +17 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +89 -0
- package/dist/program.js.map +1 -0
- package/dist/runtimes.d.ts +11 -0
- package/dist/runtimes.d.ts.map +1 -0
- package/dist/runtimes.js +20 -0
- package/dist/runtimes.js.map +1 -0
- package/dist/slug.d.ts +3 -0
- package/dist/slug.d.ts.map +1 -0
- package/dist/slug.js +15 -0
- package/dist/slug.js.map +1 -0
- package/dist/taskChain.d.ts +20 -0
- package/dist/taskChain.d.ts.map +1 -0
- package/dist/taskChain.js +40 -0
- package/dist/taskChain.js.map +1 -0
- package/dist/taskDelivery.d.ts +33 -0
- package/dist/taskDelivery.d.ts.map +1 -0
- package/dist/taskDelivery.js +67 -0
- package/dist/taskDelivery.js.map +1 -0
- package/dist/tui/app.d.ts +5 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +130 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/index.d.ts +12 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +34 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/model.d.ts +110 -0
- package/dist/tui/model.d.ts.map +1 -0
- package/dist/tui/model.js +257 -0
- package/dist/tui/model.js.map +1 -0
- package/dist/tui/overlay.d.ts +66 -0
- package/dist/tui/overlay.d.ts.map +1 -0
- package/dist/tui/overlay.js +216 -0
- package/dist/tui/overlay.js.map +1 -0
- package/dist/tui/panes/account.d.ts +5 -0
- package/dist/tui/panes/account.d.ts.map +1 -0
- package/dist/tui/panes/account.js +108 -0
- package/dist/tui/panes/account.js.map +1 -0
- package/dist/tui/panes/agents.d.ts +9 -0
- package/dist/tui/panes/agents.d.ts.map +1 -0
- package/dist/tui/panes/agents.js +340 -0
- package/dist/tui/panes/agents.js.map +1 -0
- package/dist/tui/panes/chat.d.ts +14 -0
- package/dist/tui/panes/chat.d.ts.map +1 -0
- package/dist/tui/panes/chat.js +169 -0
- package/dist/tui/panes/chat.js.map +1 -0
- package/dist/tui/panes/environments.d.ts +6 -0
- package/dist/tui/panes/environments.d.ts.map +1 -0
- package/dist/tui/panes/environments.js +364 -0
- package/dist/tui/panes/environments.js.map +1 -0
- package/dist/tui/panes/jobs.d.ts +5 -0
- package/dist/tui/panes/jobs.d.ts.map +1 -0
- package/dist/tui/panes/jobs.js +104 -0
- package/dist/tui/panes/jobs.js.map +1 -0
- package/dist/tui/store.d.ts +40 -0
- package/dist/tui/store.d.ts.map +1 -0
- package/dist/tui/store.js +124 -0
- package/dist/tui/store.js.map +1 -0
- package/dist/tui/ui.d.ts +95 -0
- package/dist/tui/ui.d.ts.map +1 -0
- package/dist/tui/ui.js +144 -0
- package/dist/tui/ui.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { TERMINAL_RUN_STATUSES, } from "@qoren/sdk";
|
|
2
|
+
import { requireContext, run } from "../context.js";
|
|
3
|
+
import { parseDuration } from "../duration.js";
|
|
4
|
+
import { followJob } from "../jobProgress.js";
|
|
5
|
+
import { age, bold, details, dim, emit, note, statusColor, table, warn } from "../output.js";
|
|
6
|
+
import { gated, matchEnvironment, resolveClient } from "./clients.js";
|
|
7
|
+
import { readJsonArg } from "../args.js";
|
|
8
|
+
// Operating a Custom agent: the verbs under `qoren agent` that only make sense
|
|
9
|
+
// for an agent built in the Agent Designer. Runs, chat and threads read from the
|
|
10
|
+
// Designer; channels and attached environments wire the agent to the world.
|
|
11
|
+
// A hosted agent answers these with a 409, and `qoren agent message` still
|
|
12
|
+
// works for both kinds.
|
|
13
|
+
const RUN_STATUSES = [
|
|
14
|
+
"queued",
|
|
15
|
+
"running",
|
|
16
|
+
"waiting",
|
|
17
|
+
"parked_credits",
|
|
18
|
+
"succeeded",
|
|
19
|
+
"failed",
|
|
20
|
+
"canceled",
|
|
21
|
+
"expired",
|
|
22
|
+
"budget_exceeded",
|
|
23
|
+
];
|
|
24
|
+
const CHANNEL_KINDS = ["slack", "telegram", "discord"];
|
|
25
|
+
const ago = (value) => value ? age(new Date(value).toISOString()) : "";
|
|
26
|
+
export function isTerminalRun(status) {
|
|
27
|
+
return TERMINAL_RUN_STATUSES.includes(status);
|
|
28
|
+
}
|
|
29
|
+
/** How long a run took, or has been going. */
|
|
30
|
+
export function runDuration(r, now = Date.now()) {
|
|
31
|
+
const ms = (r.endedAt ?? now) - r.startedAt;
|
|
32
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
33
|
+
return "";
|
|
34
|
+
if (ms < 1000)
|
|
35
|
+
return `${ms}ms`;
|
|
36
|
+
const s = Math.round(ms / 1000);
|
|
37
|
+
return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m ${s % 60}s`;
|
|
38
|
+
}
|
|
39
|
+
/** A run's status with what it waits on, e.g. "waiting (approval)". */
|
|
40
|
+
export function runStatus(r) {
|
|
41
|
+
return r.waitingOn && !isTerminalRun(r.status)
|
|
42
|
+
? `${statusColor(r.status)} ${dim(`(${r.waitingOn})`)}`
|
|
43
|
+
: statusColor(r.status);
|
|
44
|
+
}
|
|
45
|
+
function oneLine(text, max = 80) {
|
|
46
|
+
const line = (text ?? "").split("\n")[0]?.trim() ?? "";
|
|
47
|
+
return line.length > max ? `${line.slice(0, max - 1)}…` : line;
|
|
48
|
+
}
|
|
49
|
+
function runTable(runs) {
|
|
50
|
+
table(runs, [
|
|
51
|
+
{ header: "run", value: (r) => r.runId },
|
|
52
|
+
{ header: "status", value: runStatus },
|
|
53
|
+
{ header: "trigger", value: (r) => r.trigger.kind },
|
|
54
|
+
{ header: "started", value: (r) => ago(r.startedAt) },
|
|
55
|
+
{ header: "took", value: (r) => runDuration(r) },
|
|
56
|
+
{ header: "credits", value: (r) => String(Math.round(r.spentCredits)) },
|
|
57
|
+
{ header: "note", value: (r) => oneLine(r.error ?? r.trigger.summary) },
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
function printResult(result) {
|
|
61
|
+
if (result === null || result === undefined)
|
|
62
|
+
return;
|
|
63
|
+
process.stdout.write(typeof result === "string" ? `${result}\n` : `${JSON.stringify(result, null, 2)}\n`);
|
|
64
|
+
}
|
|
65
|
+
export function printRun(r) {
|
|
66
|
+
details([
|
|
67
|
+
["Run", r.runId],
|
|
68
|
+
["Status", runStatus(r)],
|
|
69
|
+
["Trigger", [r.trigger.kind, r.trigger.nodeId, r.trigger.summary].filter(Boolean).join(" · ")],
|
|
70
|
+
["Version", r.version == null ? "" : `v${r.version}`],
|
|
71
|
+
["Thread", r.threadId ?? ""],
|
|
72
|
+
["Credits", String(Math.round(r.spentCredits))],
|
|
73
|
+
["Started", new Date(r.startedAt).toISOString()],
|
|
74
|
+
["Took", runDuration(r)],
|
|
75
|
+
["Error", r.error ?? ""],
|
|
76
|
+
]);
|
|
77
|
+
if (r.steps?.length) {
|
|
78
|
+
note(bold("\nSteps"));
|
|
79
|
+
table(r.steps, [
|
|
80
|
+
{ header: "#", value: (s) => String(s.seq) },
|
|
81
|
+
{ header: "node", value: (s) => s.nodeId },
|
|
82
|
+
{ header: "kind", value: (s) => s.kind },
|
|
83
|
+
{ header: "status", value: (s) => statusColor(s.status) },
|
|
84
|
+
{ header: "credits", value: (s) => (s.credits ? String(Math.round(s.credits)) : "") },
|
|
85
|
+
{ header: "note", value: (s) => oneLine(s.error ?? s.outputPreview, 60) },
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
if (r.result !== null && r.result !== undefined) {
|
|
89
|
+
note(bold("\nResult"));
|
|
90
|
+
printResult(r.result);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
94
|
+
/**
|
|
95
|
+
* Poll a run until it finishes or the time is up. Says once what a waiting run
|
|
96
|
+
* waits on, because an approval can take hours and silence looks like a hang.
|
|
97
|
+
* `read` fetches the run: an agent's run or a design's test run.
|
|
98
|
+
*/
|
|
99
|
+
export async function waitForRun(read, timeoutSeconds) {
|
|
100
|
+
const deadline = Date.now() + timeoutSeconds * 1000;
|
|
101
|
+
let said = "";
|
|
102
|
+
for (;;) {
|
|
103
|
+
const current = await read();
|
|
104
|
+
if (isTerminalRun(current.status))
|
|
105
|
+
return { run: current, finished: true };
|
|
106
|
+
const state = `${current.status}${current.waitingOn ? `:${current.waitingOn}` : ""}`;
|
|
107
|
+
if (state !== said) {
|
|
108
|
+
said = state;
|
|
109
|
+
note(dim(current.waitingOn ? ` waiting on ${current.waitingOn}…` : ` ${current.status}…`));
|
|
110
|
+
}
|
|
111
|
+
if (Date.now() > deadline)
|
|
112
|
+
return { run: current, finished: false };
|
|
113
|
+
await sleep(2000);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Read `--timeout` for a `--wait`. */
|
|
117
|
+
export function parseWaitTimeout(value) {
|
|
118
|
+
const timeout = parseDuration(value);
|
|
119
|
+
if (timeout === null) {
|
|
120
|
+
throw new Error(`Could not read "${value}" as a duration. Use one like 30m or 2h.`);
|
|
121
|
+
}
|
|
122
|
+
return timeout;
|
|
123
|
+
}
|
|
124
|
+
/** The end of a waited-for run, for a person: outcome, cost, result. Sets the
|
|
125
|
+
* exit code when it did not succeed or is still going. */
|
|
126
|
+
export function reportWaitedRun({ run: r, finished }, timeoutText, checkBack, options = {}) {
|
|
127
|
+
emit(r, () => {
|
|
128
|
+
if (!finished) {
|
|
129
|
+
warn(`Still ${r.status} after ${timeoutText}. Check back with ${checkBack}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (options.trace) {
|
|
133
|
+
printRun(r);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
note(`${runStatus(r)} ${dim(`in ${runDuration(r)}, ${Math.round(r.spentCredits)} credits`)}`);
|
|
137
|
+
if (r.error)
|
|
138
|
+
warn(r.error);
|
|
139
|
+
printResult(r.result);
|
|
140
|
+
});
|
|
141
|
+
if (!finished || r.status !== "succeeded")
|
|
142
|
+
process.exitCode = 1;
|
|
143
|
+
}
|
|
144
|
+
function parseLimit(value, max) {
|
|
145
|
+
if (value === undefined)
|
|
146
|
+
return undefined;
|
|
147
|
+
const n = Number.parseInt(value, 10);
|
|
148
|
+
if (!Number.isInteger(n) || n < 1 || n > max) {
|
|
149
|
+
throw new Error(`--limit must be between 1 and ${max}.`);
|
|
150
|
+
}
|
|
151
|
+
return n;
|
|
152
|
+
}
|
|
153
|
+
/** The connect request for `channel add`, refusing what the control plane
|
|
154
|
+
* would refuse before anything is sent: an unknown kind, no bot token, a Slack
|
|
155
|
+
* app without its signing secret, or a Discord bot without its server id
|
|
156
|
+
* (the bot only ignores other servers when it is bound to one). */
|
|
157
|
+
export function channelInput(kind, options) {
|
|
158
|
+
if (!CHANNEL_KINDS.includes(kind)) {
|
|
159
|
+
throw new Error(`Unknown channel "${kind}". Choose one of: ${CHANNEL_KINDS.join(", ")}.`);
|
|
160
|
+
}
|
|
161
|
+
const botToken = options.botToken?.trim();
|
|
162
|
+
if (!botToken)
|
|
163
|
+
throw new Error("Pass --bot-token, or set QOREN_BOT_TOKEN.");
|
|
164
|
+
switch (kind) {
|
|
165
|
+
case "slack": {
|
|
166
|
+
const signingSecret = options.signingSecret?.trim();
|
|
167
|
+
if (!signingSecret) {
|
|
168
|
+
throw new Error("Slack needs your app's signing secret: pass --signing-secret, or set QOREN_SIGNING_SECRET.");
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
kind: "slack",
|
|
172
|
+
credentials: { botToken, signingSecret },
|
|
173
|
+
...(options.botName ? { botName: options.botName } : {}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
case "discord": {
|
|
177
|
+
const guildId = options.guild?.trim();
|
|
178
|
+
if (!guildId) {
|
|
179
|
+
throw new Error("Discord needs the server (guild) id the bot answers in: pass --guild <id>. In Discord, turn on Developer Mode (User Settings, Advanced), then right-click the server and choose Copy Server ID.");
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
kind: "discord",
|
|
183
|
+
credentials: { botToken, guildId },
|
|
184
|
+
...(options.allMessages ? { mentionsOnly: false } : {}),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
default:
|
|
188
|
+
return { kind: "telegram", credentials: { botToken } };
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function customAgentCommands(agent, global) {
|
|
192
|
+
agent
|
|
193
|
+
.command("run <id>")
|
|
194
|
+
.description("Start a manual run of a Custom agent")
|
|
195
|
+
.option("--input <json>", "the run's input, inline or as @file.json")
|
|
196
|
+
.option("--key <idempotencyKey>", "the same key twice returns the first run instead of starting another")
|
|
197
|
+
.option("--wait", "wait for the run to finish and print its result")
|
|
198
|
+
.option("--timeout <duration>", "with --wait: give up after this long, e.g. 10m", "30m")
|
|
199
|
+
.action((id, options) => run(async () => {
|
|
200
|
+
const input = options.input !== undefined ? readJsonArg(options.input, "--input") : undefined;
|
|
201
|
+
const timeout = parseWaitTimeout(options.timeout);
|
|
202
|
+
const ctx = requireContext(global());
|
|
203
|
+
const started = await ctx.qoren.agents.run(id, {
|
|
204
|
+
...(input !== undefined ? { input } : {}),
|
|
205
|
+
...(options.key ? { idempotencyKey: options.key } : {}),
|
|
206
|
+
});
|
|
207
|
+
if (!options.wait) {
|
|
208
|
+
emit(started, () => note(started.existing
|
|
209
|
+
? `Run ${bold(started.runId)} already exists for that key (${started.status}).`
|
|
210
|
+
: `Run ${bold(started.runId)} started. Check it with: qoren agent run-get ${id} ${started.runId}`));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
note(dim(`Run ${started.runId} started.`));
|
|
214
|
+
reportWaitedRun(await waitForRun(() => ctx.qoren.agents.getRun(id, started.runId), timeout), options.timeout, `qoren agent run-get ${id} ${started.runId}`);
|
|
215
|
+
})());
|
|
216
|
+
agent
|
|
217
|
+
.command("runs <id>")
|
|
218
|
+
.description("List a Custom agent's recent runs")
|
|
219
|
+
.option("--status <status>", `only runs in this state: ${RUN_STATUSES.join(", ")}`)
|
|
220
|
+
.option("--limit <n>", "how many, up to 100", "25")
|
|
221
|
+
.option("--cursor <cursor>", "the next page, from a previous --json answer")
|
|
222
|
+
.action((id, options) => run(async () => {
|
|
223
|
+
if (options.status && !RUN_STATUSES.includes(options.status)) {
|
|
224
|
+
throw new Error(`Unknown status "${options.status}". Choose one of: ${RUN_STATUSES.join(", ")}.`);
|
|
225
|
+
}
|
|
226
|
+
const limit = parseLimit(options.limit, 100);
|
|
227
|
+
const ctx = requireContext(global());
|
|
228
|
+
const page = await ctx.qoren.agents.runs(id, {
|
|
229
|
+
...(options.status ? { status: options.status } : {}),
|
|
230
|
+
...(limit ? { limit } : {}),
|
|
231
|
+
...(options.cursor ? { cursor: options.cursor } : {}),
|
|
232
|
+
});
|
|
233
|
+
emit(page, () => {
|
|
234
|
+
runTable(page.runs);
|
|
235
|
+
if (page.cursor)
|
|
236
|
+
note(dim(`More: qoren agent runs ${id} --cursor ${page.cursor}`));
|
|
237
|
+
});
|
|
238
|
+
})());
|
|
239
|
+
agent
|
|
240
|
+
.command("run-get <id> <runId>")
|
|
241
|
+
.description("Show one run: status, steps and result")
|
|
242
|
+
.action((id, runId) => run(async () => {
|
|
243
|
+
const ctx = requireContext(global());
|
|
244
|
+
const r = await ctx.qoren.agents.getRun(id, runId);
|
|
245
|
+
emit(r, () => printRun(r));
|
|
246
|
+
})());
|
|
247
|
+
agent
|
|
248
|
+
.command("run-cancel <id> <runId>")
|
|
249
|
+
.description("Stop a run")
|
|
250
|
+
.action((id, runId) => run(async () => {
|
|
251
|
+
const ctx = requireContext(global());
|
|
252
|
+
const result = await ctx.qoren.agents.cancelRun(id, runId);
|
|
253
|
+
emit(result, () => note(result.cancelled ? `Run ${bold(runId)} cancelled.` : `Run ${bold(runId)} had already finished.`));
|
|
254
|
+
})());
|
|
255
|
+
agent
|
|
256
|
+
.command("chat <id> <message>")
|
|
257
|
+
.description("Chat with a Custom agent and wait for its reply")
|
|
258
|
+
.option("--thread <threadId>", "continue a conversation (see qoren agent threads)")
|
|
259
|
+
.option("--no-wait", "print the job id and exit instead of waiting")
|
|
260
|
+
.action((id, message, options) => run(async () => {
|
|
261
|
+
const ctx = requireContext(global());
|
|
262
|
+
const started = await ctx.qoren.agents.chat(id, message, options.thread ?? null);
|
|
263
|
+
if (!options.wait) {
|
|
264
|
+
emit(started, () => note(`Job ${bold(started.jobId)} started in thread ${started.threadId}.`));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const job = await followJob(ctx, started.jobId, dim("Thinking…"));
|
|
268
|
+
const reply = (job.result ?? null);
|
|
269
|
+
emit({ ...started, reply: reply?.stdOut ?? null, output: reply?.output ?? null }, () => {
|
|
270
|
+
if (reply?.stdOut)
|
|
271
|
+
process.stdout.write(`${reply.stdOut.replace(/\n?$/, "\n")}`);
|
|
272
|
+
note(dim(`Continue with: qoren agent chat ${id} --thread ${started.threadId} "..."`));
|
|
273
|
+
});
|
|
274
|
+
if (reply && reply.exitCode !== 0)
|
|
275
|
+
process.exitCode = 1;
|
|
276
|
+
})());
|
|
277
|
+
agent
|
|
278
|
+
.command("threads <id> [threadId]")
|
|
279
|
+
.description("List a Custom agent's conversations, or show one conversation's messages")
|
|
280
|
+
.option("--limit <n>", "how many, up to 100")
|
|
281
|
+
.option("--cursor <cursor>", "the next page, from a previous --json answer")
|
|
282
|
+
.action((id, threadId, options) => run(async () => {
|
|
283
|
+
const limit = parseLimit(options.limit, 100);
|
|
284
|
+
const page = {
|
|
285
|
+
...(limit ? { limit } : {}),
|
|
286
|
+
...(options.cursor ? { cursor: options.cursor } : {}),
|
|
287
|
+
};
|
|
288
|
+
const ctx = requireContext(global());
|
|
289
|
+
if (!threadId) {
|
|
290
|
+
const threads = await ctx.qoren.agents.threads(id, page);
|
|
291
|
+
emit(threads, () => {
|
|
292
|
+
table(threads.threads, [
|
|
293
|
+
{ header: "thread", value: (t) => t.threadId },
|
|
294
|
+
{ header: "channel", value: (t) => t.channel },
|
|
295
|
+
{ header: "title", value: (t) => oneLine(t.title, 50) },
|
|
296
|
+
{ header: "last message", value: (t) => ago(t.lastMessageAt) },
|
|
297
|
+
{ header: "active run", value: (t) => t.activeRunId ?? "" },
|
|
298
|
+
]);
|
|
299
|
+
if (threads.cursor)
|
|
300
|
+
note(dim(`More: qoren agent threads ${id} --cursor ${threads.cursor}`));
|
|
301
|
+
});
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const messages = await ctx.qoren.agents.threadMessages(id, threadId, page);
|
|
305
|
+
emit(messages, () => {
|
|
306
|
+
for (const m of messages.messages) {
|
|
307
|
+
const who = m.role === "user" ? bold("you") : m.role === "assistant" ? bold("agent") : dim(m.role);
|
|
308
|
+
process.stdout.write(`${dim(new Date(m.createdAt).toISOString())} ${who}\n${m.text}\n\n`);
|
|
309
|
+
}
|
|
310
|
+
if (messages.cursor) {
|
|
311
|
+
note(dim(`Older: qoren agent threads ${id} ${threadId} --cursor ${messages.cursor}`));
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
})());
|
|
315
|
+
agent
|
|
316
|
+
.command("client <id> <client>")
|
|
317
|
+
.description('Assign a Custom agent to an agency client, by id or name, or "none" to clear it')
|
|
318
|
+
.action((id, ref) => run(async () => {
|
|
319
|
+
const ctx = requireContext(global());
|
|
320
|
+
const clear = ref.toLowerCase() === "none";
|
|
321
|
+
const client = clear ? null : await resolveClient(ctx, ref);
|
|
322
|
+
const result = await gated(ctx.qoren.agents.setClient(id, client?.id ?? null));
|
|
323
|
+
emit(result, () => note(client
|
|
324
|
+
? `${bold(result.agent.name)} now works for ${bold(client.name)}. Its cost from now on is theirs.`
|
|
325
|
+
: `${bold(result.agent.name)} no longer has a client.`));
|
|
326
|
+
})());
|
|
327
|
+
// --- channels ---------------------------------------------------------------
|
|
328
|
+
const channel = agent
|
|
329
|
+
.command("channel")
|
|
330
|
+
.alias("channels")
|
|
331
|
+
.description("Connect a Custom agent to Slack, Telegram or Discord");
|
|
332
|
+
channel
|
|
333
|
+
.command("ls <id>")
|
|
334
|
+
.alias("list")
|
|
335
|
+
.description("List a Custom agent's channels")
|
|
336
|
+
.action((id) => run(async () => {
|
|
337
|
+
const ctx = requireContext(global());
|
|
338
|
+
const channels = await ctx.qoren.agents.channels.list(id);
|
|
339
|
+
emit(channels, () => table(channels, [
|
|
340
|
+
{ header: "id", value: (c) => c.id },
|
|
341
|
+
{ header: "kind", value: (c) => c.kind },
|
|
342
|
+
{ header: "bot", value: (c) => c.bot ?? c.address ?? "" },
|
|
343
|
+
{ header: "status", value: (c) => statusColor(c.status) },
|
|
344
|
+
{ header: "last event", value: (c) => ago(c.lastEventAt) },
|
|
345
|
+
{ header: "error", value: (c) => oneLine(c.lastError, 60) },
|
|
346
|
+
]));
|
|
347
|
+
})());
|
|
348
|
+
channel
|
|
349
|
+
.command("add <id> <kind>")
|
|
350
|
+
.description(`Connect a bot (${CHANNEL_KINDS.join(", ")}). Slack is your own app: pass its signing secret too. Discord needs --guild`)
|
|
351
|
+
.option("--bot-token <token>", "the bot token (or set QOREN_BOT_TOKEN to keep it out of shell history)")
|
|
352
|
+
.option("--signing-secret <secret>", "Slack only: the app's signing secret (or set QOREN_SIGNING_SECRET)")
|
|
353
|
+
.option("--guild <id>", "Discord only, required: the server id the bot answers in (Developer Mode on, then right-click the server, Copy Server ID)")
|
|
354
|
+
.option("--bot-name <name>", "Slack only: the bot's name in the generated app manifest")
|
|
355
|
+
.option("--all-messages", "Discord only: answer every message in a channel, not only mentions")
|
|
356
|
+
.action((id, kind, options) => run(async () => {
|
|
357
|
+
const input = channelInput(kind, {
|
|
358
|
+
...options,
|
|
359
|
+
botToken: options.botToken ?? process.env.QOREN_BOT_TOKEN,
|
|
360
|
+
signingSecret: options.signingSecret ?? process.env.QOREN_SIGNING_SECRET,
|
|
361
|
+
});
|
|
362
|
+
const ctx = requireContext(global());
|
|
363
|
+
const result = await ctx.qoren.agents.channels.add(id, input);
|
|
364
|
+
emit(result, () => {
|
|
365
|
+
const bot = result.channel.bot ? ` as ${bold(result.channel.bot)}` : "";
|
|
366
|
+
note(`Connected ${kind}${bot}: channel ${bold(result.channel.id)} (${result.channel.status}).`);
|
|
367
|
+
if (result.requestUrl) {
|
|
368
|
+
note(`Paste this request URL into your Slack app's Event Subscriptions:\n ${bold(result.requestUrl)}`);
|
|
369
|
+
}
|
|
370
|
+
for (const step of result.instructions ?? [])
|
|
371
|
+
note(` ${dim("·")} ${step}`);
|
|
372
|
+
if (result.manifest) {
|
|
373
|
+
note(dim("Your Slack app manifest follows on stdout; paste it into the app's settings."));
|
|
374
|
+
printResult(result.manifest);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
})());
|
|
378
|
+
channel
|
|
379
|
+
.command("rm <id> <channelId>")
|
|
380
|
+
.alias("remove")
|
|
381
|
+
.description("Disconnect a channel")
|
|
382
|
+
.action((id, channelId) => run(async () => {
|
|
383
|
+
const ctx = requireContext(global());
|
|
384
|
+
await ctx.qoren.agents.channels.remove(id, channelId);
|
|
385
|
+
emit({ ok: true, channelId }, () => note(`Channel ${bold(channelId)} disconnected.`));
|
|
386
|
+
})());
|
|
387
|
+
channel
|
|
388
|
+
.command("test <id> <channelId>")
|
|
389
|
+
.description("Check a channel still works with its provider")
|
|
390
|
+
.action((id, channelId) => run(async () => {
|
|
391
|
+
const ctx = requireContext(global());
|
|
392
|
+
const result = await ctx.qoren.agents.channels.test(id, channelId);
|
|
393
|
+
emit(result, () => result.ok
|
|
394
|
+
? note(`Channel ${bold(channelId)} works (${result.status}).${result.detail ? ` ${result.detail}` : ""}`)
|
|
395
|
+
: warn(`Channel ${channelId} is not working (${result.status}). ${result.detail ?? ""}`.trim()));
|
|
396
|
+
if (!result.ok)
|
|
397
|
+
process.exitCode = 1;
|
|
398
|
+
})());
|
|
399
|
+
// --- attached environments ------------------------------------------------
|
|
400
|
+
agent
|
|
401
|
+
.command("attach <id> <environment>")
|
|
402
|
+
.description("Let a Custom agent use an environment for shell and files, as its own confined user")
|
|
403
|
+
.option("--approve", "ask a person to approve each command (runs unattended by default)")
|
|
404
|
+
.option("--no-wait", "print the job id and exit instead of following the setup")
|
|
405
|
+
.action((id, ref, options) => run(async () => {
|
|
406
|
+
const ctx = requireContext(global());
|
|
407
|
+
const environment = matchEnvironment(await ctx.qoren.environments.list(), ref);
|
|
408
|
+
const result = await ctx.qoren.agents.attachedEnvironments.attach(id, {
|
|
409
|
+
machineId: environment.id,
|
|
410
|
+
autonomy: options.approve ? "approve" : "auto",
|
|
411
|
+
});
|
|
412
|
+
if (!options.wait) {
|
|
413
|
+
emit(result, () => note(`Setting up ${bold(environment.name)} (${result.grant.id}) in job ${bold(result.jobId)}.`));
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
await followJob(ctx, result.jobId, `Setting up access on ${bold(environment.name)}…`);
|
|
417
|
+
emit({ ...result, grant: { ...result.grant, status: "ready" } }, () => note(`Attached ${bold(environment.name)} (${result.grant.id}) as ${result.grant.unixUser}. ` +
|
|
418
|
+
(options.approve ? "Each command waits for approval." : "Commands run unattended.")));
|
|
419
|
+
})());
|
|
420
|
+
agent
|
|
421
|
+
.command("detach <id> <attachmentId>")
|
|
422
|
+
.description("Take an environment away from a Custom agent and remove its user there")
|
|
423
|
+
.option("--no-wait", "print the job id and exit instead of following the removal")
|
|
424
|
+
.action((id, grantId, options) => run(async () => {
|
|
425
|
+
const ctx = requireContext(global());
|
|
426
|
+
const result = await ctx.qoren.agents.attachedEnvironments.detach(id, grantId);
|
|
427
|
+
if (!options.wait) {
|
|
428
|
+
emit(result, () => note(`Removing ${bold(grantId)} in job ${bold(result.jobId)}.`));
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
await followJob(ctx, result.jobId, `Removing ${bold(grantId)}…`);
|
|
432
|
+
emit(result, () => note(`Detached ${bold(grantId)}.`));
|
|
433
|
+
})());
|
|
434
|
+
agent
|
|
435
|
+
.command("attached <id>")
|
|
436
|
+
.description("List the environments a Custom agent may use")
|
|
437
|
+
.action((id) => run(async () => {
|
|
438
|
+
const ctx = requireContext(global());
|
|
439
|
+
const grants = await ctx.qoren.agents.attachedEnvironments.list(id);
|
|
440
|
+
emit(grants, () => table(grants, [
|
|
441
|
+
{ header: "id", value: (g) => g.id },
|
|
442
|
+
{ header: "environment", value: (g) => g.machineName ?? g.machineId },
|
|
443
|
+
{ header: "user", value: (g) => g.unixUser },
|
|
444
|
+
{ header: "autonomy", value: (g) => g.autonomy },
|
|
445
|
+
{ header: "status", value: (g) => statusColor(g.status) },
|
|
446
|
+
]));
|
|
447
|
+
})());
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=customAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customAgent.js","sourceRoot":"","sources":["../../src/commands/customAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { DesignBindings, DesignerAgentView, DesignInput, DesignSpec, DesignSummary, DesignVersionRef } from "@qoren/sdk";
|
|
3
|
+
import { type GlobalOptions } from "../context.js";
|
|
4
|
+
/** Repeatable `--input key=value` flags. */
|
|
5
|
+
export declare function collectPairs(value: string, previous?: string[]): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Pick one design by id, exact name, or the name's slug. Archived designs are
|
|
8
|
+
* matched only by id. Null when nothing matches; a name that matches more than
|
|
9
|
+
* one design is refused rather than guessed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findDesign(designs: DesignSummary[], ref: string): DesignSummary | null;
|
|
12
|
+
export declare function matchDesign(designs: DesignSummary[], ref: string): DesignSummary;
|
|
13
|
+
/** `draft`, `latest` or a version number, off the command line. */
|
|
14
|
+
export declare function parseVersionRef(input: string): DesignVersionRef;
|
|
15
|
+
export declare function parseVersion(input: string): number;
|
|
16
|
+
/** Read a design spec file, refusing anything that is not one. */
|
|
17
|
+
export declare function readSpecFile(path: string): DesignSpec;
|
|
18
|
+
/**
|
|
19
|
+
* Turn `key=value` pairs into the three binding maps, using what the design
|
|
20
|
+
* says each input is. A secret input takes a vault secret NAME (never a value),
|
|
21
|
+
* a resource input takes an id, and a scalar is typed by its kind: `number`
|
|
22
|
+
* and `boolean` are parsed, a multiple-choice input splits on commas, and an
|
|
23
|
+
* empty value clears the input.
|
|
24
|
+
*/
|
|
25
|
+
export declare function bindInputs(inputs: DesignInput[], pairs: string[]): DesignBindings;
|
|
26
|
+
/** Laid over what an agent already has: the API replaces a map whole. */
|
|
27
|
+
export declare function mergeBindings(current: Pick<DesignerAgentView, "bindings" | "secretBindings" | "resourceBindings">, changes: DesignBindings): DesignBindings;
|
|
28
|
+
/** A Custom agent's design settings, for a person. Secret inputs show the
|
|
29
|
+
* vault name they point at; no value ever reaches this command. */
|
|
30
|
+
export declare function printAgentDesigner(v: DesignerAgentView): void;
|
|
31
|
+
export declare function designerCommands(program: Command, global: () => GlobalOptions): void;
|
|
32
|
+
//# sourceMappingURL=designer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer.d.ts","sourceRoot":"","sources":["../../src/commands/designer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EACV,cAAc,EAEd,iBAAiB,EACjB,WAAW,EAGX,UAAU,EACV,aAAa,EACb,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAsBvB,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EAAE,EACxB,GAAG,EAAE,MAAM,GACV,aAAa,GAAG,IAAI,CAetB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAQhF;AAMD,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAM/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAmBrD;AAUD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CA4BjF;AA2BD,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,EACpF,OAAO,EAAE,cAAc,GACtB,cAAc,CAMhB;AAsBD;mEACmE;AACnE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CA0C7D;AAKD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,QA8kB7E"}
|