@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,169 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { emptyLine, readChatTurn, wrapText } from "../model.js";
5
+ import { useUi } from "../overlay.js";
6
+ import { describeError, useResource, useSession } from "../store.js";
7
+ import { ACCENT, Field, Hints, Spinner, StatusLine } from "../ui.js";
8
+ export function ChatPane({ height, width, focused, agent, onPickAgent, typing, onTyping, }) {
9
+ const { qoren } = useSession();
10
+ const ui = useUi();
11
+ const [entries, setEntries] = useState([]);
12
+ const [line, setLine] = useState(() => emptyLine());
13
+ const [sending, setSending] = useState(false);
14
+ const [scrollBack, setScrollBack] = useState(0);
15
+ const sessionId = useRef(null);
16
+ const nextId = useRef(0);
17
+ // Only used to offer a picker when no agent has been chosen yet.
18
+ const agents = useResource("agents:chat", () => qoren.agents.list(), {
19
+ active: !ui.busy,
20
+ interval: () => 60_000,
21
+ });
22
+ // A different agent is a different conversation. Starting a new one silently
23
+ // on top of the old transcript would make the reply look like a non sequitur.
24
+ useEffect(() => {
25
+ setEntries([]);
26
+ setScrollBack(0);
27
+ sessionId.current = null;
28
+ }, [agent?._id]);
29
+ const pick = async () => {
30
+ const rows = agents.data ?? [];
31
+ if (rows.length === 0) {
32
+ ui.toast("No agents to talk to yet.", "bad");
33
+ return;
34
+ }
35
+ const chosen = await ui.select({
36
+ title: "Talk to",
37
+ choices: rows.map((a) => ({
38
+ item: a,
39
+ label: a.name,
40
+ detail: `${a.runtime ?? "?"} ${a.status}`,
41
+ })),
42
+ });
43
+ if (chosen)
44
+ onPickAgent(chosen);
45
+ };
46
+ const send = async (text) => {
47
+ const message = text.trim();
48
+ if (!message || !agent || sending)
49
+ return;
50
+ setLine(emptyLine());
51
+ setScrollBack(0);
52
+ const replyId = nextId.current + 1;
53
+ nextId.current += 2;
54
+ setEntries((prior) => [
55
+ ...prior,
56
+ { id: replyId - 1, role: "you", text: message },
57
+ { id: replyId, role: "agent", text: "", pending: true },
58
+ ]);
59
+ setSending(true);
60
+ const patch = (change) => {
61
+ setEntries((prior) => prior.map((e) => (e.id === replyId ? { ...e, ...change } : e)));
62
+ };
63
+ try {
64
+ const { jobId } = await qoren.agents.message(agent._id, message, sessionId.current);
65
+ const job = await qoren.jobs.await(jobId, (snapshot) => {
66
+ if (!snapshot)
67
+ return;
68
+ const turn = readChatTurn(snapshot.result);
69
+ if (turn.text || turn.tool) {
70
+ patch({ text: turn.text, tool: turn.tool });
71
+ }
72
+ });
73
+ const turn = readChatTurn(job.result);
74
+ // Only replace the session when the harness gave one: the warm path
75
+ // returns a conversation id, the SSH fallback does not, and overwriting a
76
+ // good id with null would silently end the conversation.
77
+ if (turn.sessionId)
78
+ sessionId.current = turn.sessionId;
79
+ patch({
80
+ text: turn.text || turn.stdErr || "(the agent said nothing)",
81
+ tool: null,
82
+ pending: false,
83
+ ...(turn.exitCode !== null && turn.exitCode !== 0
84
+ ? { failed: true }
85
+ : {}),
86
+ });
87
+ }
88
+ catch (err) {
89
+ patch({
90
+ text: describeError(err),
91
+ tool: null,
92
+ pending: false,
93
+ failed: true,
94
+ });
95
+ }
96
+ finally {
97
+ setSending(false);
98
+ }
99
+ };
100
+ // Pane keys, which apply once the input has been released with escape — and
101
+ // always before an agent has been chosen, when there is no field to type into
102
+ // and "a" is the only thing there is to do.
103
+ useInput((input, key) => {
104
+ if (input === "a") {
105
+ void pick();
106
+ return;
107
+ }
108
+ if (input === "c") {
109
+ setEntries([]);
110
+ sessionId.current = null;
111
+ setScrollBack(0);
112
+ return;
113
+ }
114
+ if (input === "i" || key.return)
115
+ onTyping(true);
116
+ }, { isActive: focused && !ui.busy && (!typing || agent === null) });
117
+ // Scrolling works whether or not the input has the keyboard: page keys are
118
+ // not something anyone types into a message.
119
+ useInput((_input, key) => {
120
+ if (key.pageUp)
121
+ setScrollBack((s) => s + 5);
122
+ if (key.pageDown)
123
+ setScrollBack((s) => Math.max(0, s - 5));
124
+ }, { isActive: focused && !ui.busy });
125
+ if (!agent) {
126
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Box, { flexGrow: 1, paddingTop: 1, children: _jsx(Text, { dimColor: true, children: agents.loading
127
+ ? "Loading agents..."
128
+ : "Pick an agent to talk to. Press a." }) }), _jsx(Hints, { keys: [["a", "choose an agent"]] })] }));
129
+ }
130
+ // Lay the transcript out as concrete lines so the tail that fits on screen is
131
+ // exact rather than estimated.
132
+ const bodyWidth = Math.max(20, width - 8);
133
+ const lines = [];
134
+ for (const entry of entries) {
135
+ const label = entry.role === "you" ? "you " : `${agent.slug} `;
136
+ const rendered = wrapText(entry.text || " ", bodyWidth);
137
+ rendered.forEach((text, i) => {
138
+ lines.push({
139
+ text: `${i === 0 ? label.padEnd(8) : " ".repeat(8)}${text}`,
140
+ role: entry.role,
141
+ ...(entry.failed ? { failed: true } : {}),
142
+ });
143
+ });
144
+ if (entry.pending) {
145
+ lines.push({
146
+ text: `${" ".repeat(8)}${entry.tool ? `running ${entry.tool}...` : "thinking..."}`,
147
+ role: "agent",
148
+ });
149
+ }
150
+ lines.push({ text: "", role: entry.role });
151
+ }
152
+ const viewport = Math.max(1, height - 2);
153
+ const end = Math.max(0, lines.length - scrollBack);
154
+ const visible = lines.slice(Math.max(0, end - viewport), end);
155
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: ACCENT, children: agent.name }), _jsxs(Text, { dimColor: true, children: [` ${agent.runtime ?? "?"} ${agent.model}`, sessionId.current ? " continuing" : " new conversation"] })] }), _jsx(Box, { flexDirection: "column", flexGrow: 1, children: visible.length === 0 ? (_jsx(Text, { dimColor: true, children: "Say something." })) : (visible.map((row, i) => (_jsx(Text, { color: row.failed ? "red" : undefined, dimColor: row.role === "you", wrap: "truncate-end", children: row.text || " " }, i)))) }), _jsxs(Box, { children: [_jsx(Text, { color: typing ? ACCENT : "gray", children: "> " }), sending ? (_jsx(Spinner, { label: "waiting for the agent" })) : (_jsx(Field, { value: line, onChange: setLine, onSubmit: (value) => void send(value), onCancel: () => {
156
+ onTyping(false);
157
+ }, placeholder: "write a message", focused: focused && typing && !ui.busy }))] }), _jsx(Box, { children: _jsx(StatusLine, { error: agents.error, children: _jsx(Hints, { keys: typing
158
+ ? [
159
+ ["enter", "send"],
160
+ ["esc", "release the keyboard"],
161
+ ["pgup/pgdn", "scroll"],
162
+ ]
163
+ : [
164
+ ["i", "write"],
165
+ ["a", "another agent"],
166
+ ["c", "clear"],
167
+ ] }) }) })] }));
168
+ }
169
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/tui/panes/chat.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function EnvironmentsPane({ height, focused, onOpenAgents, }: {
2
+ height: number;
3
+ focused: boolean;
4
+ onOpenAgents: (environmentId: string) => void;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=environments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../../src/tui/panes/environments.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,YAAY,GACb,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,+BAmZA"}
@@ -0,0 +1,364 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { QorenError } from "@qoren/sdk";
5
+ import { orgSlug } from "../../context.js";
6
+ import { age } from "../../output.js";
7
+ import { statusColorName } from "../model.js";
8
+ import { useUi } from "../overlay.js";
9
+ import { describeError, statusPaced, useResource, useSession } from "../store.js";
10
+ import { Details, Hints, StatusLine, Table, navigate } from "../ui.js";
11
+ // Environments: the hosts agents run on.
12
+ //
13
+ // The one place this deliberately differs from `qoren env create` is the
14
+ // availability refusal. The command line answers it with a sentence naming a
15
+ // flag to re-run with, because that is all a command that has already exited
16
+ // can do. A console is still here and still has the reader's attention, so it
17
+ // offers the remedy instead: "nyc1 can't run that size — use nyc3?" is a
18
+ // question worth asking, and being told to retype something is not.
19
+ /**
20
+ * The "no preference" region, which is `region` omitted on the wire.
21
+ *
22
+ * The @ is what keeps it from ever colliding with a real choice: region
23
+ * values are provider slugs like fra1 and nyc1, which are alphanumeric.
24
+ */
25
+ const ANYWHERE = "@anywhere";
26
+ export function EnvironmentsPane({ height, focused, onOpenAgents, }) {
27
+ const session = useSession();
28
+ const { qoren } = session;
29
+ const ui = useUi();
30
+ const [selected, setSelected] = useState(0);
31
+ const environments = useResource("environments", () => qoren.environments.list(), {
32
+ active: !ui.busy,
33
+ interval: statusPaced((rows) => rows.map((m) => m.status)),
34
+ });
35
+ const rows = environments.data ?? [];
36
+ const current = rows[Math.min(selected, rows.length - 1)];
37
+ /** The plan's own menu of sizes and regions. Fetched when a form needs one
38
+ * rather than on mount: most sessions never open one. */
39
+ const loadOptions = async () => {
40
+ try {
41
+ return await qoren.account.options();
42
+ }
43
+ catch (err) {
44
+ ui.toast(describeError(err), "bad");
45
+ return null;
46
+ }
47
+ };
48
+ const sizeChoices = (sizes, marked, markedAs) => sizes.map((s) => ({
49
+ item: s.slug,
50
+ label: s.slug,
51
+ detail: `${s.description} ${s.price}`,
52
+ ...(s.slug === marked ? { hint: markedAs } : {}),
53
+ }));
54
+ /**
55
+ * Turn an availability refusal into a question.
56
+ *
57
+ * Returns the size and region to retry with, or null when there is nothing
58
+ * to offer or the reader declined — in which case the backend's own message
59
+ * is the last word.
60
+ */
61
+ const offerRemedy = async (err, size, region) => {
62
+ if (!(err instanceof QorenError))
63
+ return null;
64
+ const refusal = err.regionUnavailable;
65
+ if (!refusal)
66
+ return null;
67
+ if (refusal.suggestedRegion) {
68
+ const move = await ui.confirm({
69
+ title: `${refusal.region} can't run that size right now`,
70
+ body: `${refusal.suggestedRegion} is the closest region that can. Build it there instead?`,
71
+ });
72
+ // `autoRegion: true` on the retry is what grants the substitution; the
73
+ // pinned region stays in the request so the platform picks the closest
74
+ // one to it rather than starting over.
75
+ if (move)
76
+ return { size, region };
77
+ }
78
+ if (refusal.availableSizes.length === 0)
79
+ return null;
80
+ const other = await ui.select({
81
+ title: `Sizes ${refusal.region} does have`,
82
+ choices: refusal.availableSizes.map((s) => ({
83
+ item: s.slug,
84
+ label: s.slug,
85
+ detail: s.label,
86
+ })),
87
+ });
88
+ return other ? { size: other, region } : null;
89
+ };
90
+ const create = async () => {
91
+ const name = await ui.prompt({
92
+ title: "New environment",
93
+ label: "Name",
94
+ placeholder: "production",
95
+ validate: (value) => (value ? null : "Give it a name."),
96
+ });
97
+ if (!name)
98
+ return;
99
+ const options = await loadOptions();
100
+ if (!options)
101
+ return;
102
+ const firstSize = await ui.select({
103
+ title: `Size for ${name}`,
104
+ choices: sizeChoices(options.sizes, options.defaultSize, "default"),
105
+ initial: Math.max(0, options.sizes.findIndex((s) => s.slug === options.defaultSize)),
106
+ });
107
+ if (!firstSize)
108
+ return;
109
+ // "Anywhere" first, and the default: pinning a region is a promise the
110
+ // platform keeps even when that region cannot run the size, so it should be
111
+ // a deliberate choice rather than the one you land on by pressing enter.
112
+ const firstRegion = await ui.select({
113
+ title: "Region",
114
+ choices: [
115
+ {
116
+ item: ANYWHERE,
117
+ label: "anywhere",
118
+ detail: "let the platform pick one that can run this size",
119
+ },
120
+ ...options.regions.map((r) => ({
121
+ item: r.slug,
122
+ label: r.slug,
123
+ detail: r.description,
124
+ ...(r.slug === options.defaultRegion ? { hint: "default" } : {}),
125
+ })),
126
+ ],
127
+ });
128
+ if (firstRegion === null)
129
+ return;
130
+ let size = firstSize;
131
+ let region = firstRegion;
132
+ // Up to two attempts: the first as asked, the second after the reader has
133
+ // answered whatever the refusal offered.
134
+ for (let attempt = 0; attempt < 2; attempt++) {
135
+ const pinned = region !== ANYWHERE;
136
+ try {
137
+ const result = await qoren.environments.create({
138
+ clientSlug: await orgSlug(session),
139
+ name,
140
+ size,
141
+ ...(pinned ? { region, autoRegion: attempt > 0 } : {}),
142
+ });
143
+ if (!result.jobId) {
144
+ ui.toast(`${name} requested.`);
145
+ break;
146
+ }
147
+ const outcome = await ui.job(result.jobId, `Creating ${name}`);
148
+ ui.toast(outcome.status === "done"
149
+ ? `${name} is ready.`
150
+ : outcome.status === "failed"
151
+ ? outcome.message
152
+ : `${name} is still being created.`, outcome.status === "failed" ? "bad" : "good");
153
+ break;
154
+ }
155
+ catch (err) {
156
+ const remedy = attempt === 0 ? await offerRemedy(err, size, region) : null;
157
+ if (!remedy) {
158
+ ui.toast(describeError(err), "bad");
159
+ break;
160
+ }
161
+ size = remedy.size;
162
+ region = remedy.region;
163
+ }
164
+ }
165
+ environments.reload();
166
+ };
167
+ const rename = async (machine) => {
168
+ const name = await ui.prompt({
169
+ title: `Rename ${machine.name}`,
170
+ label: "Name",
171
+ initial: machine.name,
172
+ validate: (value) => (value ? null : "Give it a name."),
173
+ });
174
+ if (!name || name === machine.name)
175
+ return;
176
+ try {
177
+ await qoren.environments.rename(machine.id, name);
178
+ ui.toast(`Renamed to ${name}.`);
179
+ }
180
+ catch (err) {
181
+ ui.toast(describeError(err), "bad");
182
+ }
183
+ environments.reload();
184
+ };
185
+ const resize = async (machine) => {
186
+ const options = await loadOptions();
187
+ if (!options)
188
+ return;
189
+ const target = await ui.select({
190
+ title: `Resize ${machine.name}`,
191
+ choices: sizeChoices(options.sizes, machine.size, "current"),
192
+ });
193
+ if (!target || target === machine.size)
194
+ return;
195
+ let size = target;
196
+ const ok = await ui.confirm({
197
+ title: `Resize ${machine.name} to ${size}?`,
198
+ body: "The environment powers off, resizes and comes back up. Its agents are unreachable until it does.",
199
+ });
200
+ if (!ok)
201
+ return;
202
+ for (let attempt = 0; attempt < 2; attempt++) {
203
+ try {
204
+ const result = await qoren.environments.resize(machine.id, size);
205
+ const outcome = await ui.job(result.jobId, `Resizing ${machine.name}`);
206
+ ui.toast(outcome.status === "failed" ? outcome.message : "Resize complete.", outcome.status === "failed" ? "bad" : "good");
207
+ break;
208
+ }
209
+ catch (err) {
210
+ // An environment cannot change region, so the only remedy on offer is
211
+ // a size the region it already lives in does run.
212
+ const sizes = attempt === 0 && err instanceof QorenError
213
+ ? (err.sizeUnavailable?.availableSizes ?? [])
214
+ : [];
215
+ if (sizes.length === 0) {
216
+ ui.toast(describeError(err), "bad");
217
+ break;
218
+ }
219
+ const other = await ui.select({
220
+ title: `Sizes ${machine.region} does have`,
221
+ choices: sizes.map((s) => ({
222
+ item: s.slug,
223
+ label: s.slug,
224
+ detail: s.label,
225
+ })),
226
+ });
227
+ if (!other)
228
+ break;
229
+ size = other;
230
+ }
231
+ }
232
+ environments.reload();
233
+ };
234
+ const destroy = async (machine) => {
235
+ const ok = await ui.confirm({
236
+ title: `Destroy ${machine.name}?`,
237
+ body: "This removes the environment and every agent on it. It cannot be undone.",
238
+ danger: true,
239
+ requireText: machine.name,
240
+ });
241
+ if (!ok)
242
+ return;
243
+ try {
244
+ const result = await qoren.environments.destroy(machine.id);
245
+ const outcome = await ui.job(result.jobId, `Destroying ${machine.name}`);
246
+ ui.toast(outcome.status === "failed" ? outcome.message : "Environment destroyed.", outcome.status === "failed" ? "bad" : "good");
247
+ }
248
+ catch (err) {
249
+ ui.toast(describeError(err), "bad");
250
+ }
251
+ setSelected(0);
252
+ environments.reload();
253
+ };
254
+ const collaboration = async (machine) => {
255
+ const turningOn = !machine.teamMessagingEnabled;
256
+ const ok = await ui.confirm({
257
+ title: `Turn collaboration ${turningOn ? "on" : "off"} for ${machine.name}?`,
258
+ body: turningOn
259
+ ? "The agents on this environment will be able to discover and message each other."
260
+ : "The agents on this environment will stop being able to reach each other.",
261
+ });
262
+ if (!ok)
263
+ return;
264
+ try {
265
+ const result = await qoren.environments.setCollaboration(machine.id, turningOn);
266
+ ui.toast(`Collaboration ${result.enabled ? "on" : "off"}; ${result.jobIds.length} agent(s) reconfiguring.`);
267
+ }
268
+ catch (err) {
269
+ ui.toast(describeError(err), "bad");
270
+ }
271
+ environments.reload();
272
+ };
273
+ const inspect = async (machine) => {
274
+ // Vitals are a live read off the host, so they are fetched on demand and
275
+ // reported as unavailable rather than holding up the rest: an environment
276
+ // still provisioning has none to give.
277
+ let vitals;
278
+ try {
279
+ vitals = JSON.stringify(await qoren.environments.vitals(machine.id), null, 2);
280
+ }
281
+ catch (err) {
282
+ vitals = `Host readings unavailable: ${describeError(err)}`;
283
+ }
284
+ await ui.show(machine.name, [
285
+ `Id ${machine.id}`,
286
+ `Name ${machine.name}`,
287
+ `Status ${machine.status}`,
288
+ `Size ${machine.size}`,
289
+ `Region ${machine.region}`,
290
+ `Image ${machine.image}`,
291
+ `IP ${machine.ip ?? "-"}`,
292
+ `Created ${machine.createdAt}`,
293
+ `Collaboration ${machine.teamMessagingEnabled ? "on" : "off"}`,
294
+ `Cost ${machine.hourlyUsd == null ? "-" : `$${machine.hourlyUsd}/hour`}`,
295
+ "",
296
+ "Host readings",
297
+ vitals,
298
+ ].join("\n"));
299
+ };
300
+ useInput((input, key) => {
301
+ const next = navigate(rows.length, selected, input, key);
302
+ if (next !== null) {
303
+ setSelected(next);
304
+ return;
305
+ }
306
+ if (input === "n") {
307
+ void create();
308
+ return;
309
+ }
310
+ if (!current)
311
+ return;
312
+ if (key.return)
313
+ void inspect(current);
314
+ else if (input === "R")
315
+ void rename(current);
316
+ else if (input === "s")
317
+ void resize(current);
318
+ else if (input === "d")
319
+ void destroy(current);
320
+ else if (input === "c")
321
+ void collaboration(current);
322
+ else if (input === "a")
323
+ onOpenAgents(current.id);
324
+ }, { isActive: focused && !ui.busy });
325
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Table, { rows: rows, selected: selected, height: height, focused: focused, empty: environments.loading
326
+ ? "Loading..."
327
+ : "No environments yet. Press n to make one.", columns: [
328
+ { header: "name", width: 22, value: (m) => m.name },
329
+ {
330
+ header: "status",
331
+ width: 13,
332
+ value: (m) => m.status,
333
+ color: (m) => statusColorName(m.status),
334
+ },
335
+ { header: "size", width: 24, value: (m) => m.size },
336
+ { header: "region", width: 7, value: (m) => m.region },
337
+ { header: "ip", width: 16, value: (m) => m.ip ?? "" },
338
+ {
339
+ header: "collab",
340
+ width: 6,
341
+ value: (m) => (m.teamMessagingEnabled ? "on" : ""),
342
+ },
343
+ { header: "age", value: (m) => age(m.createdAt) },
344
+ ] }) }), current ? (_jsx(Box, { paddingTop: 1, children: _jsx(Details, { pairs: [
345
+ ["id", current.id],
346
+ [
347
+ "state",
348
+ _jsx(Text, { color: statusColorName(current.status), children: current.status }, "state"),
349
+ ],
350
+ [
351
+ "cost",
352
+ current.hourlyUsd == null ? "" : `$${current.hourlyUsd}/hour`,
353
+ ],
354
+ ] }) })) : null, _jsx(Box, { children: _jsx(StatusLine, { error: environments.error, refreshing: environments.refreshing, children: _jsx(Hints, { keys: [
355
+ ["enter", "details"],
356
+ ["n", "new"],
357
+ ["R", "rename"],
358
+ ["s", "resize"],
359
+ ["c", "collab"],
360
+ ["d", "destroy"],
361
+ ["a", "agents"],
362
+ ] }) }) })] }));
363
+ }
364
+ //# sourceMappingURL=environments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.js","sourceRoot":"","sources":["../../../src/tui/panes/environments.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function JobsPane({ height, focused, }: {
2
+ height: number;
3
+ focused: boolean;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/tui/panes/jobs.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,+BAmHA"}