@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.
Files changed (171) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +162 -0
  3. package/dist/args.d.ts +5 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +23 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/commands/account.d.ts +4 -0
  8. package/dist/commands/account.d.ts.map +1 -0
  9. package/dist/commands/account.js +154 -0
  10. package/dist/commands/account.js.map +1 -0
  11. package/dist/commands/agent.d.ts +27 -0
  12. package/dist/commands/agent.d.ts.map +1 -0
  13. package/dist/commands/agent.js +968 -0
  14. package/dist/commands/agent.js.map +1 -0
  15. package/dist/commands/api.d.ts +4 -0
  16. package/dist/commands/api.d.ts.map +1 -0
  17. package/dist/commands/api.js +66 -0
  18. package/dist/commands/api.js.map +1 -0
  19. package/dist/commands/approvals.d.ts +11 -0
  20. package/dist/commands/approvals.d.ts.map +1 -0
  21. package/dist/commands/approvals.js +140 -0
  22. package/dist/commands/approvals.js.map +1 -0
  23. package/dist/commands/auth.d.ts +4 -0
  24. package/dist/commands/auth.d.ts.map +1 -0
  25. package/dist/commands/auth.js +215 -0
  26. package/dist/commands/auth.js.map +1 -0
  27. package/dist/commands/clients.d.ts +62 -0
  28. package/dist/commands/clients.d.ts.map +1 -0
  29. package/dist/commands/clients.js +311 -0
  30. package/dist/commands/clients.js.map +1 -0
  31. package/dist/commands/console.d.ts +4 -0
  32. package/dist/commands/console.d.ts.map +1 -0
  33. package/dist/commands/console.js +26 -0
  34. package/dist/commands/console.js.map +1 -0
  35. package/dist/commands/customAgent.d.ts +42 -0
  36. package/dist/commands/customAgent.d.ts.map +1 -0
  37. package/dist/commands/customAgent.js +449 -0
  38. package/dist/commands/customAgent.js.map +1 -0
  39. package/dist/commands/designer.d.ts +32 -0
  40. package/dist/commands/designer.d.ts.map +1 -0
  41. package/dist/commands/designer.js +682 -0
  42. package/dist/commands/designer.js.map +1 -0
  43. package/dist/commands/env.d.ts +15 -0
  44. package/dist/commands/env.d.ts.map +1 -0
  45. package/dist/commands/env.js +245 -0
  46. package/dist/commands/env.js.map +1 -0
  47. package/dist/commands/interactive.d.ts +4 -0
  48. package/dist/commands/interactive.d.ts.map +1 -0
  49. package/dist/commands/interactive.js +30 -0
  50. package/dist/commands/interactive.js.map +1 -0
  51. package/dist/commands/jobs.d.ts +4 -0
  52. package/dist/commands/jobs.d.ts.map +1 -0
  53. package/dist/commands/jobs.js +59 -0
  54. package/dist/commands/jobs.js.map +1 -0
  55. package/dist/commands/secrets.d.ts +15 -0
  56. package/dist/commands/secrets.d.ts.map +1 -0
  57. package/dist/commands/secrets.js +164 -0
  58. package/dist/commands/secrets.js.map +1 -0
  59. package/dist/commands/webhook.d.ts +4 -0
  60. package/dist/commands/webhook.d.ts.map +1 -0
  61. package/dist/commands/webhook.js +275 -0
  62. package/dist/commands/webhook.js.map +1 -0
  63. package/dist/config.d.ts +38 -0
  64. package/dist/config.d.ts.map +1 -0
  65. package/dist/config.js +117 -0
  66. package/dist/config.js.map +1 -0
  67. package/dist/context.d.ts +52 -0
  68. package/dist/context.d.ts.map +1 -0
  69. package/dist/context.js +163 -0
  70. package/dist/context.js.map +1 -0
  71. package/dist/duration.d.ts +9 -0
  72. package/dist/duration.d.ts.map +1 -0
  73. package/dist/duration.js +30 -0
  74. package/dist/duration.js.map +1 -0
  75. package/dist/index.d.ts +3 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +27 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/issues.d.ts +10 -0
  80. package/dist/issues.d.ts.map +1 -0
  81. package/dist/issues.js +45 -0
  82. package/dist/issues.js.map +1 -0
  83. package/dist/jobProgress.d.ts +12 -0
  84. package/dist/jobProgress.d.ts.map +1 -0
  85. package/dist/jobProgress.js +56 -0
  86. package/dist/jobProgress.js.map +1 -0
  87. package/dist/loopback.d.ts +28 -0
  88. package/dist/loopback.d.ts.map +1 -0
  89. package/dist/loopback.js +110 -0
  90. package/dist/loopback.js.map +1 -0
  91. package/dist/migrate/apply.d.ts +29 -0
  92. package/dist/migrate/apply.d.ts.map +1 -0
  93. package/dist/migrate/apply.js +135 -0
  94. package/dist/migrate/apply.js.map +1 -0
  95. package/dist/migrate/bundle.d.ts +89 -0
  96. package/dist/migrate/bundle.d.ts.map +1 -0
  97. package/dist/migrate/bundle.js +681 -0
  98. package/dist/migrate/bundle.js.map +1 -0
  99. package/dist/migrate/tar.d.ts +9 -0
  100. package/dist/migrate/tar.d.ts.map +1 -0
  101. package/dist/migrate/tar.js +89 -0
  102. package/dist/migrate/tar.js.map +1 -0
  103. package/dist/output.d.ts +46 -0
  104. package/dist/output.d.ts.map +1 -0
  105. package/dist/output.js +152 -0
  106. package/dist/output.js.map +1 -0
  107. package/dist/program.d.ts +17 -0
  108. package/dist/program.d.ts.map +1 -0
  109. package/dist/program.js +89 -0
  110. package/dist/program.js.map +1 -0
  111. package/dist/runtimes.d.ts +11 -0
  112. package/dist/runtimes.d.ts.map +1 -0
  113. package/dist/runtimes.js +20 -0
  114. package/dist/runtimes.js.map +1 -0
  115. package/dist/slug.d.ts +3 -0
  116. package/dist/slug.d.ts.map +1 -0
  117. package/dist/slug.js +15 -0
  118. package/dist/slug.js.map +1 -0
  119. package/dist/taskChain.d.ts +20 -0
  120. package/dist/taskChain.d.ts.map +1 -0
  121. package/dist/taskChain.js +40 -0
  122. package/dist/taskChain.js.map +1 -0
  123. package/dist/taskDelivery.d.ts +33 -0
  124. package/dist/taskDelivery.d.ts.map +1 -0
  125. package/dist/taskDelivery.js +67 -0
  126. package/dist/taskDelivery.js.map +1 -0
  127. package/dist/tui/app.d.ts +5 -0
  128. package/dist/tui/app.d.ts.map +1 -0
  129. package/dist/tui/app.js +130 -0
  130. package/dist/tui/app.js.map +1 -0
  131. package/dist/tui/index.d.ts +12 -0
  132. package/dist/tui/index.d.ts.map +1 -0
  133. package/dist/tui/index.js +34 -0
  134. package/dist/tui/index.js.map +1 -0
  135. package/dist/tui/model.d.ts +110 -0
  136. package/dist/tui/model.d.ts.map +1 -0
  137. package/dist/tui/model.js +257 -0
  138. package/dist/tui/model.js.map +1 -0
  139. package/dist/tui/overlay.d.ts +66 -0
  140. package/dist/tui/overlay.d.ts.map +1 -0
  141. package/dist/tui/overlay.js +216 -0
  142. package/dist/tui/overlay.js.map +1 -0
  143. package/dist/tui/panes/account.d.ts +5 -0
  144. package/dist/tui/panes/account.d.ts.map +1 -0
  145. package/dist/tui/panes/account.js +108 -0
  146. package/dist/tui/panes/account.js.map +1 -0
  147. package/dist/tui/panes/agents.d.ts +9 -0
  148. package/dist/tui/panes/agents.d.ts.map +1 -0
  149. package/dist/tui/panes/agents.js +340 -0
  150. package/dist/tui/panes/agents.js.map +1 -0
  151. package/dist/tui/panes/chat.d.ts +14 -0
  152. package/dist/tui/panes/chat.d.ts.map +1 -0
  153. package/dist/tui/panes/chat.js +169 -0
  154. package/dist/tui/panes/chat.js.map +1 -0
  155. package/dist/tui/panes/environments.d.ts +6 -0
  156. package/dist/tui/panes/environments.d.ts.map +1 -0
  157. package/dist/tui/panes/environments.js +364 -0
  158. package/dist/tui/panes/environments.js.map +1 -0
  159. package/dist/tui/panes/jobs.d.ts +5 -0
  160. package/dist/tui/panes/jobs.d.ts.map +1 -0
  161. package/dist/tui/panes/jobs.js +104 -0
  162. package/dist/tui/panes/jobs.js.map +1 -0
  163. package/dist/tui/store.d.ts +40 -0
  164. package/dist/tui/store.d.ts.map +1 -0
  165. package/dist/tui/store.js +124 -0
  166. package/dist/tui/store.js.map +1 -0
  167. package/dist/tui/ui.d.ts +95 -0
  168. package/dist/tui/ui.d.ts.map +1 -0
  169. package/dist/tui/ui.js +144 -0
  170. package/dist/tui/ui.js.map +1 -0
  171. 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"}