@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,257 @@
|
|
|
1
|
+
import { statusTone } from "../output.js";
|
|
2
|
+
// The console's logic, with no React and no terminal in it.
|
|
3
|
+
//
|
|
4
|
+
// Everything here is a pure function over plain values: where a selection
|
|
5
|
+
// moves, which slice of a long list is on screen, what a keystroke does to a
|
|
6
|
+
// text field, what a half-finished chat turn currently says. Keeping it
|
|
7
|
+
// separate is what makes the console testable at all — a React tree wired to a
|
|
8
|
+
// live control plane is not something a unit test can hold, but these are.
|
|
9
|
+
/** Ink colour for a lifecycle word. The vocabulary itself lives in output.ts,
|
|
10
|
+
* so the console and the plain tables agree on what "provisioning" means. */
|
|
11
|
+
export function toneColor(tone) {
|
|
12
|
+
switch (tone) {
|
|
13
|
+
case "good":
|
|
14
|
+
return "green";
|
|
15
|
+
case "bad":
|
|
16
|
+
return "red";
|
|
17
|
+
case "busy":
|
|
18
|
+
return "yellow";
|
|
19
|
+
default:
|
|
20
|
+
return "gray";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export const statusColorName = (status) => toneColor(statusTone(status));
|
|
24
|
+
/**
|
|
25
|
+
* Move a selection by `delta`, clamped to the list.
|
|
26
|
+
*
|
|
27
|
+
* Clamped rather than wrapping: in a list of thirty environments, holding the
|
|
28
|
+
* down arrow and silently landing back on the first one is disorienting, and
|
|
29
|
+
* there is no way to tell it apart from not having moved at all.
|
|
30
|
+
*/
|
|
31
|
+
export function moveSelection(count, current, delta) {
|
|
32
|
+
if (count === 0)
|
|
33
|
+
return 0;
|
|
34
|
+
return Math.min(count - 1, Math.max(0, current + delta));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The slice of a list to draw, given how many rows the pane has.
|
|
38
|
+
*
|
|
39
|
+
* The window only moves when the selection would leave it, so paging through a
|
|
40
|
+
* long list scrolls a line at a time instead of jumping by a screenful and
|
|
41
|
+
* losing the reader's place.
|
|
42
|
+
*/
|
|
43
|
+
export function scrollWindow(count, selected, height, previousStart = 0) {
|
|
44
|
+
if (height <= 0 || count === 0)
|
|
45
|
+
return { start: 0, end: 0 };
|
|
46
|
+
const maxStart = Math.max(0, count - height);
|
|
47
|
+
let start = Math.min(previousStart, maxStart);
|
|
48
|
+
if (selected < start)
|
|
49
|
+
start = selected;
|
|
50
|
+
if (selected >= start + height)
|
|
51
|
+
start = selected - height + 1;
|
|
52
|
+
return { start, end: Math.min(count, start + height) };
|
|
53
|
+
}
|
|
54
|
+
export const emptyLine = (value = "") => ({
|
|
55
|
+
value,
|
|
56
|
+
cursor: value.length,
|
|
57
|
+
});
|
|
58
|
+
// Control characters, which a paste can carry and which have no business in a
|
|
59
|
+
// name, a command or a message body: invisible on screen and unfixable once in.
|
|
60
|
+
// eslint-disable-next-line no-control-regex
|
|
61
|
+
const CONTROL = /[\u0000-\u001F\u007F]/g;
|
|
62
|
+
/**
|
|
63
|
+
* Apply one keystroke to a text field.
|
|
64
|
+
*
|
|
65
|
+
* Written as a reducer so the editing rules — including the readline habits
|
|
66
|
+
* people's fingers already know (ctrl+a/e/u/k/w) — can be tested without a
|
|
67
|
+
* terminal. Returns the state unchanged when the keystroke means nothing here.
|
|
68
|
+
*
|
|
69
|
+
* Note on backspace: some terminals report the backspace key as `delete` with
|
|
70
|
+
* no `backspace` flag, so a `delete` at the end of the line rubs out to the
|
|
71
|
+
* left rather than doing nothing at all.
|
|
72
|
+
*/
|
|
73
|
+
export function editLine(state, input, key) {
|
|
74
|
+
const { value, cursor } = state;
|
|
75
|
+
if (key.leftArrow)
|
|
76
|
+
return { value, cursor: Math.max(0, cursor - 1) };
|
|
77
|
+
if (key.rightArrow)
|
|
78
|
+
return { value, cursor: Math.min(value.length, cursor + 1) };
|
|
79
|
+
if (key.home)
|
|
80
|
+
return { value, cursor: 0 };
|
|
81
|
+
if (key.end)
|
|
82
|
+
return { value, cursor: value.length };
|
|
83
|
+
if (key.backspace) {
|
|
84
|
+
if (cursor === 0)
|
|
85
|
+
return state;
|
|
86
|
+
return {
|
|
87
|
+
value: value.slice(0, cursor - 1) + value.slice(cursor),
|
|
88
|
+
cursor: cursor - 1,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (key.delete) {
|
|
92
|
+
// Forward delete when there is something ahead of the cursor; otherwise
|
|
93
|
+
// treat it as the backspace this terminal meant it to be.
|
|
94
|
+
if (cursor < value.length) {
|
|
95
|
+
return { value: value.slice(0, cursor) + value.slice(cursor + 1), cursor };
|
|
96
|
+
}
|
|
97
|
+
if (cursor === 0)
|
|
98
|
+
return state;
|
|
99
|
+
return { value: value.slice(0, cursor - 1), cursor: cursor - 1 };
|
|
100
|
+
}
|
|
101
|
+
if (key.ctrl) {
|
|
102
|
+
switch (input) {
|
|
103
|
+
case "a":
|
|
104
|
+
return { value, cursor: 0 };
|
|
105
|
+
case "e":
|
|
106
|
+
return { value, cursor: value.length };
|
|
107
|
+
case "u":
|
|
108
|
+
// Kill to the start of the line.
|
|
109
|
+
return { value: value.slice(cursor), cursor: 0 };
|
|
110
|
+
case "k":
|
|
111
|
+
// Kill to the end of the line.
|
|
112
|
+
return { value: value.slice(0, cursor), cursor };
|
|
113
|
+
case "w": {
|
|
114
|
+
// Kill the word behind the cursor, trailing whitespace included.
|
|
115
|
+
const head = value.slice(0, cursor).replace(/\S*\s*$/, "");
|
|
116
|
+
return { value: head + value.slice(cursor), cursor: head.length };
|
|
117
|
+
}
|
|
118
|
+
default:
|
|
119
|
+
return state;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// A paste arrives as one multi-character input, so insert whatever came in
|
|
123
|
+
// rather than assuming a single keypress.
|
|
124
|
+
const text = input.replace(CONTROL, "");
|
|
125
|
+
if (!text || key.meta)
|
|
126
|
+
return state;
|
|
127
|
+
return {
|
|
128
|
+
value: value.slice(0, cursor) + text + value.slice(cursor),
|
|
129
|
+
cursor: cursor + text.length,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const EMPTY_TURN = {
|
|
133
|
+
text: "",
|
|
134
|
+
streaming: false,
|
|
135
|
+
tool: null,
|
|
136
|
+
sessionId: null,
|
|
137
|
+
stdErr: "",
|
|
138
|
+
exitCode: null,
|
|
139
|
+
};
|
|
140
|
+
const str = (value) => (typeof value === "string" ? value : "");
|
|
141
|
+
/**
|
|
142
|
+
* Read a message job's result.
|
|
143
|
+
*
|
|
144
|
+
* The control plane writes the reply into the job's result as it arrives — a
|
|
145
|
+
* partial snapshot flagged `streaming` a few times a second, then the final
|
|
146
|
+
* one — so polling the job is how the console shows an agent thinking out loud
|
|
147
|
+
* instead of staring at a spinner for two minutes.
|
|
148
|
+
*
|
|
149
|
+
* Read defensively: this is a `Record<string, unknown>` on the wire, and a turn
|
|
150
|
+
* that fell back to the SSH path carries no session id at all.
|
|
151
|
+
*/
|
|
152
|
+
export function readChatTurn(result) {
|
|
153
|
+
if (!result || typeof result !== "object")
|
|
154
|
+
return EMPTY_TURN;
|
|
155
|
+
const row = result;
|
|
156
|
+
return {
|
|
157
|
+
text: str(row.stdOut),
|
|
158
|
+
streaming: row.streaming === true,
|
|
159
|
+
tool: typeof row.tool === "string" && row.tool ? row.tool : null,
|
|
160
|
+
sessionId: typeof row.sessionId === "string" && row.sessionId ? row.sessionId : null,
|
|
161
|
+
stdErr: str(row.stdErr),
|
|
162
|
+
exitCode: typeof row.exitCode === "number" ? row.exitCode : null,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// ---- refresh cadence -----------------------------------------------------
|
|
166
|
+
const SETTLED = ["active", "off", "archive", "succeeded", "failed", "cancelled"];
|
|
167
|
+
/**
|
|
168
|
+
* How long to wait before refreshing a pane, in milliseconds.
|
|
169
|
+
*
|
|
170
|
+
* A fleet at rest changes on the scale of minutes and every poll is a real
|
|
171
|
+
* request against someone's control plane, so the idle cadence is deliberately
|
|
172
|
+
* slow. Anything mid-flight — provisioning, deploying, a running job — is worth
|
|
173
|
+
* watching closely, and only then does the console poll hard.
|
|
174
|
+
*/
|
|
175
|
+
export function refreshDelay(statuses, idleMs = 20_000, activeMs = 3_000) {
|
|
176
|
+
const moving = statuses.some((status) => !SETTLED.includes(status.toLowerCase()));
|
|
177
|
+
return moving ? activeMs : idleMs;
|
|
178
|
+
}
|
|
179
|
+
/** Step completion for a job row, e.g. "9/12". Mirrors jobProgress.jobSummary. */
|
|
180
|
+
export function jobProgressText(job) {
|
|
181
|
+
if (job.steps.length === 0)
|
|
182
|
+
return "";
|
|
183
|
+
const done = job.steps.filter((s) => s.status === "Succeeded").length;
|
|
184
|
+
return `${done}/${job.steps.length}`;
|
|
185
|
+
}
|
|
186
|
+
/** The step a job is on right now, for a one-line summary. */
|
|
187
|
+
export function currentStep(job) {
|
|
188
|
+
const running = job.steps.find((s) => s.status === "Running");
|
|
189
|
+
if (running)
|
|
190
|
+
return running.label || running.key;
|
|
191
|
+
const last = [...job.steps].reverse().find((s) => s.status !== "Pending");
|
|
192
|
+
return last ? last.label || last.key : "";
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Break text into lines that fit `width`, keeping the newlines it already has.
|
|
196
|
+
*
|
|
197
|
+
* The chat transcript needs to know how many lines a reply actually occupies
|
|
198
|
+
* before it can decide how much of the conversation still fits on screen, and
|
|
199
|
+
* asking the renderer after the fact is too late. Words longer than the width
|
|
200
|
+
* (a URL, a stack frame) are split rather than allowed to overflow.
|
|
201
|
+
*/
|
|
202
|
+
export function wrapText(text, width) {
|
|
203
|
+
if (width <= 0)
|
|
204
|
+
return [];
|
|
205
|
+
const out = [];
|
|
206
|
+
for (const paragraph of text.split("\n")) {
|
|
207
|
+
let line = "";
|
|
208
|
+
for (const word of paragraph.split(" ")) {
|
|
209
|
+
let piece = word;
|
|
210
|
+
// A single word wider than the column is cut into full-width chunks.
|
|
211
|
+
while (piece.length > width) {
|
|
212
|
+
if (line) {
|
|
213
|
+
out.push(line);
|
|
214
|
+
line = "";
|
|
215
|
+
}
|
|
216
|
+
out.push(piece.slice(0, width));
|
|
217
|
+
piece = piece.slice(width);
|
|
218
|
+
}
|
|
219
|
+
if (!line) {
|
|
220
|
+
line = piece;
|
|
221
|
+
}
|
|
222
|
+
else if (line.length + 1 + piece.length <= width) {
|
|
223
|
+
line += ` ${piece}`;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
out.push(line);
|
|
227
|
+
line = piece;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
out.push(line);
|
|
231
|
+
}
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* A date someone can read, from whatever the wire sent.
|
|
236
|
+
*
|
|
237
|
+
* Timestamps arrive as ISO strings in some places and epoch millis in others
|
|
238
|
+
* (the usage governor's period bounds among them), and "1786150711602" is not
|
|
239
|
+
* an answer to "when does my billing period end".
|
|
240
|
+
*/
|
|
241
|
+
export function readableDate(value) {
|
|
242
|
+
if (value === null || value === undefined || value === "")
|
|
243
|
+
return "";
|
|
244
|
+
const date = new Date(typeof value === "number" ? value : value);
|
|
245
|
+
if (Number.isNaN(date.getTime()))
|
|
246
|
+
return String(value);
|
|
247
|
+
return date.toISOString().slice(0, 16).replace("T", " ");
|
|
248
|
+
}
|
|
249
|
+
/** Fit text to a column, with an ellipsis when it does not. */
|
|
250
|
+
export function truncate(text, width) {
|
|
251
|
+
if (width <= 0)
|
|
252
|
+
return "";
|
|
253
|
+
if (text.length <= width)
|
|
254
|
+
return text;
|
|
255
|
+
return width <= 1 ? text.slice(0, width) : `${text.slice(0, width - 1)}…`;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/tui/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { Job } from "@qoren/sdk";
|
|
3
|
+
export type Choice<T> = {
|
|
4
|
+
item: T;
|
|
5
|
+
label: string;
|
|
6
|
+
detail?: string;
|
|
7
|
+
hint?: string;
|
|
8
|
+
};
|
|
9
|
+
export type JobOutcome = {
|
|
10
|
+
status: "done";
|
|
11
|
+
job: Job;
|
|
12
|
+
} | {
|
|
13
|
+
status: "failed";
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
/** The reader stopped watching. The job itself is untouched and still
|
|
17
|
+
* running; `jobs watch` or the Jobs pane picks it back up. */
|
|
18
|
+
| {
|
|
19
|
+
status: "detached";
|
|
20
|
+
};
|
|
21
|
+
type Ask = {
|
|
22
|
+
prompt: (spec: {
|
|
23
|
+
title: string;
|
|
24
|
+
label?: string;
|
|
25
|
+
initial?: string;
|
|
26
|
+
placeholder?: string;
|
|
27
|
+
/** Return a sentence to refuse the value, or null to accept it. */
|
|
28
|
+
validate?: (value: string) => string | null;
|
|
29
|
+
}) => Promise<string | null>;
|
|
30
|
+
confirm: (spec: {
|
|
31
|
+
title: string;
|
|
32
|
+
body?: string;
|
|
33
|
+
danger?: boolean;
|
|
34
|
+
/** Make it deliberate: the reader must type this exactly. For destroying
|
|
35
|
+
* an environment, which takes its agents with it. */
|
|
36
|
+
requireText?: string;
|
|
37
|
+
}) => Promise<boolean>;
|
|
38
|
+
select: <T>(spec: {
|
|
39
|
+
title: string;
|
|
40
|
+
choices: Choice<T>[];
|
|
41
|
+
initial?: number;
|
|
42
|
+
}) => Promise<T | null>;
|
|
43
|
+
/** Follow a job to its end, drawing each step as it starts. */
|
|
44
|
+
job: (jobId: string, title: string) => Promise<JobOutcome>;
|
|
45
|
+
/** Show a block of text — a log, command output, a diagnosis. */
|
|
46
|
+
show: (title: string, body: string) => Promise<void>;
|
|
47
|
+
/** A one-line result in the status bar. Clears itself. */
|
|
48
|
+
toast: (message: string, tone?: "good" | "bad") => void;
|
|
49
|
+
};
|
|
50
|
+
type Ui = Ask & {
|
|
51
|
+
/** What to draw instead of the pane body, or null when nothing is being
|
|
52
|
+
* asked. */
|
|
53
|
+
overlay: ReactNode | null;
|
|
54
|
+
/** True while an overlay owns the keyboard, so panes stand down. */
|
|
55
|
+
busy: boolean;
|
|
56
|
+
notice: {
|
|
57
|
+
message: string;
|
|
58
|
+
tone: "good" | "bad";
|
|
59
|
+
} | null;
|
|
60
|
+
};
|
|
61
|
+
export declare function useUi(): Ui;
|
|
62
|
+
export declare function UiProvider({ children }: {
|
|
63
|
+
children: ReactNode;
|
|
64
|
+
}): import("react").JSX.Element;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/tui/overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAyBtC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACvC;8DAC8D;GAC5D;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3B,KAAK,GAAG,GAAG;IACT,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,mEAAmE;QACnE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;KAC7C,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB;6DACqD;QACrD,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxB,+DAA+D;IAC/D,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3D,iEAAiE;IACjE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,0DAA0D;IAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,KAAK,EAAE,GAAG,GAAG,GAAG;IACd;gBACY;IACZ,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,oEAAoE;IACpE,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1D,CAAC;AAIF,wBAAgB,KAAK,IAAI,EAAE,CAI1B;AAOD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAsE/D"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { currentStep, emptyLine } from "./model.js";
|
|
5
|
+
import { describeError, useSession } from "./store.js";
|
|
6
|
+
import { ACCENT, Choices, Field, Hints, Spinner, navigate, } from "./ui.js";
|
|
7
|
+
const UiContext = createContext(null);
|
|
8
|
+
export function useUi() {
|
|
9
|
+
const ui = useContext(UiContext);
|
|
10
|
+
if (!ui)
|
|
11
|
+
throw new Error("useUi outside a UiProvider");
|
|
12
|
+
return ui;
|
|
13
|
+
}
|
|
14
|
+
export function UiProvider({ children }) {
|
|
15
|
+
const [pending, setPending] = useState(null);
|
|
16
|
+
const [notice, setNotice] = useState(null);
|
|
17
|
+
const noticeTimer = useRef(undefined);
|
|
18
|
+
const open = useCallback((render) => new Promise((resolve) => {
|
|
19
|
+
setPending({
|
|
20
|
+
render: render,
|
|
21
|
+
resolve: resolve,
|
|
22
|
+
});
|
|
23
|
+
}), []);
|
|
24
|
+
const toast = useCallback((message, tone = "good") => {
|
|
25
|
+
setNotice({ message, tone });
|
|
26
|
+
clearTimeout(noticeTimer.current);
|
|
27
|
+
noticeTimer.current = setTimeout(() => {
|
|
28
|
+
setNotice(null);
|
|
29
|
+
}, 6_000);
|
|
30
|
+
}, []);
|
|
31
|
+
useEffect(() => () => {
|
|
32
|
+
clearTimeout(noticeTimer.current);
|
|
33
|
+
}, []);
|
|
34
|
+
const api = useMemo(() => ({
|
|
35
|
+
prompt: (spec) => open((done) => _jsx(PromptBox, { spec: spec, done: done })),
|
|
36
|
+
confirm: (spec) => open((done) => _jsx(ConfirmBox, { spec: spec, done: done })),
|
|
37
|
+
select: (spec) => open((done) => _jsx(SelectBox, { spec: spec, done: done })),
|
|
38
|
+
job: (jobId, title) => open((done) => (_jsx(JobBox, { jobId: jobId, title: title, done: done }))),
|
|
39
|
+
show: (title, body) => open((done) => _jsx(ShowBox, { title: title, body: body, done: done })),
|
|
40
|
+
toast,
|
|
41
|
+
}), [open, toast]);
|
|
42
|
+
const done = useCallback((value) => {
|
|
43
|
+
const current = pending;
|
|
44
|
+
setPending(null);
|
|
45
|
+
current?.resolve(value);
|
|
46
|
+
}, [pending]);
|
|
47
|
+
const value = {
|
|
48
|
+
...api,
|
|
49
|
+
overlay: pending ? pending.render(done) : null,
|
|
50
|
+
busy: pending !== null,
|
|
51
|
+
notice,
|
|
52
|
+
};
|
|
53
|
+
return _jsx(UiContext.Provider, { value: value, children: children });
|
|
54
|
+
}
|
|
55
|
+
// ---- the boxes -----------------------------------------------------------
|
|
56
|
+
function Frame({ title, danger, children, hints, }) {
|
|
57
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, borderStyle: "round", borderColor: danger ? "red" : ACCENT, paddingX: 1, children: [_jsx(Text, { bold: true, color: danger ? "red" : ACCENT, children: title }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingTop: 1, children: children }), _jsx(Hints, { keys: hints })] }));
|
|
58
|
+
}
|
|
59
|
+
function PromptBox({ spec, done, }) {
|
|
60
|
+
const [line, setLine] = useState(() => emptyLine(spec.initial));
|
|
61
|
+
const [problem, setProblem] = useState(null);
|
|
62
|
+
return (_jsxs(Frame, { title: spec.title, hints: [
|
|
63
|
+
["enter", "confirm"],
|
|
64
|
+
["esc", "cancel"],
|
|
65
|
+
], children: [_jsxs(Box, { children: [spec.label ? _jsx(Text, { dimColor: true, children: `${spec.label} ` }) : null, _jsx(Field, { value: line, onChange: (next) => {
|
|
66
|
+
setProblem(null);
|
|
67
|
+
setLine(next);
|
|
68
|
+
}, placeholder: spec.placeholder ?? "", onSubmit: (value) => {
|
|
69
|
+
const trimmed = value.trim();
|
|
70
|
+
const refusal = spec.validate?.(trimmed) ?? null;
|
|
71
|
+
if (refusal) {
|
|
72
|
+
setProblem(refusal);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
done(trimmed);
|
|
76
|
+
}, onCancel: () => {
|
|
77
|
+
done(null);
|
|
78
|
+
} })] }), problem ? _jsx(Text, { color: "red", children: problem }) : null] }));
|
|
79
|
+
}
|
|
80
|
+
function ConfirmBox({ spec, done, }) {
|
|
81
|
+
const [line, setLine] = useState(() => emptyLine());
|
|
82
|
+
// A plain yes/no needs no field, so it answers to a single keystroke. The
|
|
83
|
+
// default is always no: an accidental return should never destroy anything.
|
|
84
|
+
useInput((input, key) => {
|
|
85
|
+
if (input === "y" || input === "Y") {
|
|
86
|
+
done(true);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Escape, "n", and a bare return all mean no.
|
|
90
|
+
if (key.escape || key.return || input === "n" || input === "N") {
|
|
91
|
+
done(false);
|
|
92
|
+
}
|
|
93
|
+
}, { isActive: !spec.requireText });
|
|
94
|
+
return (_jsxs(Frame, { title: spec.title, danger: spec.danger, hints: spec.requireText
|
|
95
|
+
? [
|
|
96
|
+
["enter", "confirm"],
|
|
97
|
+
["esc", "cancel"],
|
|
98
|
+
]
|
|
99
|
+
: [
|
|
100
|
+
["y", "yes"],
|
|
101
|
+
["n", "no"],
|
|
102
|
+
["esc", "cancel"],
|
|
103
|
+
], children: [spec.body ? _jsx(Text, { children: spec.body }) : null, spec.requireText ? (_jsxs(Box, { paddingTop: 1, children: [_jsx(Text, { dimColor: true, children: `Type ${spec.requireText} to confirm ` }), _jsx(Field, { value: line, onChange: setLine, onSubmit: (value) => {
|
|
104
|
+
done(value.trim() === spec.requireText);
|
|
105
|
+
}, onCancel: () => {
|
|
106
|
+
done(false);
|
|
107
|
+
} })] })) : (_jsx(Box, { paddingTop: 1, children: _jsx(Text, { dimColor: true, children: "y / n" }) }))] }));
|
|
108
|
+
}
|
|
109
|
+
function SelectBox({ spec, done, }) {
|
|
110
|
+
const [selected, setSelected] = useState(spec.initial ?? 0);
|
|
111
|
+
useInput((input, key) => {
|
|
112
|
+
if (key.escape) {
|
|
113
|
+
done(null);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (key.return) {
|
|
117
|
+
const choice = spec.choices[selected];
|
|
118
|
+
done(choice ? choice.item : null);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const next = navigate(spec.choices.length, selected, input, key);
|
|
122
|
+
if (next !== null)
|
|
123
|
+
setSelected(next);
|
|
124
|
+
});
|
|
125
|
+
return (_jsx(Frame, { title: spec.title, hints: [
|
|
126
|
+
["up/down", "move"],
|
|
127
|
+
["enter", "choose"],
|
|
128
|
+
["esc", "cancel"],
|
|
129
|
+
], children: _jsx(Choices, { items: spec.choices, selected: selected, height: 12, render: (choice) => ({
|
|
130
|
+
label: choice.label,
|
|
131
|
+
...(choice.detail !== undefined ? { detail: choice.detail } : {}),
|
|
132
|
+
}), hint: (choice) => choice.hint }) }));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Follow a job.
|
|
136
|
+
*
|
|
137
|
+
* The same shape as `followJob` in the command line: one line per step, printed
|
|
138
|
+
* when the step starts, because a redrawn progress bar tells you less than a
|
|
139
|
+
* list of what has actually been done. Escape detaches without cancelling —
|
|
140
|
+
* a twelve-step deploy is durable, and someone who stops watching has not
|
|
141
|
+
* changed their mind about wanting it.
|
|
142
|
+
*/
|
|
143
|
+
function JobBox({ jobId, title, done, }) {
|
|
144
|
+
const { qoren } = useSession();
|
|
145
|
+
const [steps, setSteps] = useState([]);
|
|
146
|
+
const [job, setJob] = useState(null);
|
|
147
|
+
const [reconnecting, setReconnecting] = useState(false);
|
|
148
|
+
const doneRef = useRef(done);
|
|
149
|
+
doneRef.current = done;
|
|
150
|
+
useInput((_input, key) => {
|
|
151
|
+
if (key.escape)
|
|
152
|
+
doneRef.current({ status: "detached" });
|
|
153
|
+
});
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
const controller = new AbortController();
|
|
156
|
+
const announced = new Set();
|
|
157
|
+
void qoren.jobs
|
|
158
|
+
.await(jobId, (snapshot) => {
|
|
159
|
+
if (!snapshot) {
|
|
160
|
+
setReconnecting(true);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
setReconnecting(false);
|
|
164
|
+
setJob(snapshot);
|
|
165
|
+
const fresh = snapshot.steps
|
|
166
|
+
.filter((s) => s.status !== "Pending" && !announced.has(s.key))
|
|
167
|
+
.map((s) => {
|
|
168
|
+
announced.add(s.key);
|
|
169
|
+
return s.label || s.key;
|
|
170
|
+
});
|
|
171
|
+
if (fresh.length > 0)
|
|
172
|
+
setSteps((prior) => [...prior, ...fresh]);
|
|
173
|
+
}, controller.signal)
|
|
174
|
+
.then((finished) => {
|
|
175
|
+
doneRef.current({ status: "done", job: finished });
|
|
176
|
+
}, (err) => {
|
|
177
|
+
if (controller.signal.aborted)
|
|
178
|
+
return;
|
|
179
|
+
doneRef.current({ status: "failed", message: describeError(err) });
|
|
180
|
+
});
|
|
181
|
+
return () => {
|
|
182
|
+
controller.abort();
|
|
183
|
+
};
|
|
184
|
+
}, [jobId, qoren]);
|
|
185
|
+
const phase = job ? currentStep(job) : "";
|
|
186
|
+
return (_jsx(Frame, { title: title, hints: [["esc", "stop watching (the job keeps going)"]], children: _jsxs(Box, { flexDirection: "column", children: [steps.map((step, i) => (_jsx(Text, { dimColor: true, children: ` . ${step}` }, `${step}-${i}`))), _jsx(Box, { paddingTop: 1, children: reconnecting ? (_jsx(Text, { color: "yellow", children: " reconnecting..." })) : (_jsx(Spinner, { label: phase || "starting" })) }), _jsx(Text, { dimColor: true, children: ` job ${jobId}` })] }) }));
|
|
187
|
+
}
|
|
188
|
+
function ShowBox({ title, body, done, }) {
|
|
189
|
+
const lines = useMemo(() => body.replace(/\s+$/, "").split("\n"), [body]);
|
|
190
|
+
const [top, setTop] = useState(0);
|
|
191
|
+
const height = 18;
|
|
192
|
+
useInput((input, key) => {
|
|
193
|
+
if (key.escape || key.return || input === "q") {
|
|
194
|
+
done(undefined);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const max = Math.max(0, lines.length - height);
|
|
198
|
+
if (key.downArrow || input === "j")
|
|
199
|
+
setTop((t) => Math.min(max, t + 1));
|
|
200
|
+
if (key.upArrow || input === "k")
|
|
201
|
+
setTop((t) => Math.max(0, t - 1));
|
|
202
|
+
if (key.pageDown)
|
|
203
|
+
setTop((t) => Math.min(max, t + height));
|
|
204
|
+
if (key.pageUp)
|
|
205
|
+
setTop((t) => Math.max(0, t - height));
|
|
206
|
+
if (input === "g")
|
|
207
|
+
setTop(0);
|
|
208
|
+
if (input === "G")
|
|
209
|
+
setTop(max);
|
|
210
|
+
});
|
|
211
|
+
return (_jsx(Frame, { title: title, hints: [
|
|
212
|
+
["up/down", "scroll"],
|
|
213
|
+
["esc", "close"],
|
|
214
|
+
], children: _jsxs(Box, { flexDirection: "column", children: [lines.slice(top, top + height).map((line, i) => (_jsx(Text, { wrap: "truncate-end", children: line || " " }, top + i))), lines.length > height ? (_jsx(Text, { dimColor: true, children: `${top + 1}-${Math.min(lines.length, top + height)} of ${lines.length}` })) : null] }) }));
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/tui/overlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/tui/panes/account.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,+BAkNA"}
|