@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,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,5 @@
1
+ export declare function AccountPane({ height, focused, }: {
2
+ height: number;
3
+ focused: boolean;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=account.d.ts.map
@@ -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"}