projectinator 0.3.0 → 0.4.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/README.md +30 -11
- package/bin/projectinator.mjs +56 -11
- package/dist/bakeoff.js +163 -0
- package/dist/bakeoff.js.map +1 -0
- package/dist/build-state.js +26 -0
- package/dist/build-state.js.map +1 -0
- package/dist/burndown.js +19 -0
- package/dist/burndown.js.map +1 -0
- package/dist/calibration.js +86 -0
- package/dist/calibration.js.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/dist/cost.js +35 -0
- package/dist/cost.js.map +1 -0
- package/dist/council.js +147 -0
- package/dist/council.js.map +1 -0
- package/dist/demo.js +93 -0
- package/dist/demo.js.map +1 -0
- package/dist/estimate.js +98 -0
- package/dist/estimate.js.map +1 -0
- package/dist/executor.js +118 -0
- package/dist/executor.js.map +1 -0
- package/dist/git.js +82 -0
- package/dist/git.js.map +1 -0
- package/dist/intake.js +98 -0
- package/dist/intake.js.map +1 -0
- package/dist/models.js +171 -0
- package/dist/models.js.map +1 -0
- package/dist/narrate.js +76 -0
- package/dist/narrate.js.map +1 -0
- package/dist/openrouter.js +112 -0
- package/dist/openrouter.js.map +1 -0
- package/dist/orchestrator.js +273 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/pm.js +245 -0
- package/dist/pm.js.map +1 -0
- package/dist/preview.js +194 -0
- package/dist/preview.js.map +1 -0
- package/dist/registry-store.js +38 -0
- package/dist/registry-store.js.map +1 -0
- package/dist/registry.js +115 -0
- package/dist/registry.js.map +1 -0
- package/dist/research.js +98 -0
- package/dist/research.js.map +1 -0
- package/dist/retro.js +83 -0
- package/dist/retro.js.map +1 -0
- package/dist/roles.js +357 -0
- package/dist/roles.js.map +1 -0
- package/dist/router.js +95 -0
- package/dist/router.js.map +1 -0
- package/dist/run-bakeoff.js +68 -0
- package/dist/run-bakeoff.js.map +1 -0
- package/dist/run-build.js +193 -0
- package/dist/run-build.js.map +1 -0
- package/{src/run-dev.ts → dist/run-dev.js} +23 -39
- package/dist/run-dev.js.map +1 -0
- package/{src/run-pm.ts → dist/run-pm.js} +34 -46
- package/dist/run-pm.js.map +1 -0
- package/{src/run-research.ts → dist/run-research.js} +19 -30
- package/dist/run-research.js.map +1 -0
- package/{src/run-scout.ts → dist/run-scout.js} +17 -27
- package/dist/run-scout.js.map +1 -0
- package/dist/run-web.js +93 -0
- package/dist/run-web.js.map +1 -0
- package/dist/scout.js +81 -0
- package/dist/scout.js.map +1 -0
- package/dist/session-cost.js +15 -0
- package/dist/session-cost.js.map +1 -0
- package/dist/stack.js +34 -0
- package/dist/stack.js.map +1 -0
- package/dist/stuck.js +21 -0
- package/dist/stuck.js.map +1 -0
- package/dist/tui/App.js +1269 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/BakeOff.js +95 -0
- package/dist/tui/BakeOff.js.map +1 -0
- package/dist/tui/BoardEditor.js +183 -0
- package/dist/tui/BoardEditor.js.map +1 -0
- package/dist/tui/EditableBoard.js +140 -0
- package/dist/tui/EditableBoard.js.map +1 -0
- package/dist/tui/Frame.js +78 -0
- package/dist/tui/Frame.js.map +1 -0
- package/dist/tui/Intake.js +59 -0
- package/dist/tui/Intake.js.map +1 -0
- package/dist/tui/Kanban.js +75 -0
- package/dist/tui/Kanban.js.map +1 -0
- package/dist/tui/Settings.js +299 -0
- package/dist/tui/Settings.js.map +1 -0
- package/dist/tui/StackPick.js +44 -0
- package/dist/tui/StackPick.js.map +1 -0
- package/dist/tui/WebAccounts.js +131 -0
- package/dist/tui/WebAccounts.js.map +1 -0
- package/dist/tui/components.js +178 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/config.js +129 -0
- package/dist/tui/config.js.map +1 -0
- package/dist/tui/deploy.js +114 -0
- package/dist/tui/deploy.js.map +1 -0
- package/dist/tui/engine.js +710 -0
- package/dist/tui/engine.js.map +1 -0
- package/dist/tui/notify.js +47 -0
- package/dist/tui/notify.js.map +1 -0
- package/dist/tui/panels.js +42 -0
- package/dist/tui/panels.js.map +1 -0
- package/dist/tui/templates.js +106 -0
- package/dist/tui/templates.js.map +1 -0
- package/dist/tui/theme.js +42 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/validate.js +51 -0
- package/dist/tui/validate.js.map +1 -0
- package/{src/tui.tsx → dist/tui.js} +23 -33
- package/dist/tui.js.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/web/oauth-anthropic.js +179 -0
- package/dist/web/oauth-anthropic.js.map +1 -0
- package/dist/web/session.js +274 -0
- package/dist/web/session.js.map +1 -0
- package/package.json +5 -4
- package/src/bakeoff.ts +0 -214
- package/src/build-state.ts +0 -47
- package/src/burndown.ts +0 -35
- package/src/calibration.ts +0 -88
- package/src/cost.ts +0 -43
- package/src/council.ts +0 -175
- package/src/demo.ts +0 -106
- package/src/estimate.ts +0 -111
- package/src/executor.ts +0 -169
- package/src/git.ts +0 -72
- package/src/intake.ts +0 -125
- package/src/models.ts +0 -175
- package/src/narrate.ts +0 -87
- package/src/openrouter.ts +0 -119
- package/src/orchestrator.ts +0 -310
- package/src/pm.ts +0 -302
- package/src/preview.ts +0 -206
- package/src/registry-store.ts +0 -41
- package/src/registry.ts +0 -132
- package/src/research.ts +0 -123
- package/src/retro.ts +0 -99
- package/src/roles.ts +0 -401
- package/src/router.ts +0 -120
- package/src/run-bakeoff.ts +0 -77
- package/src/run-build.ts +0 -203
- package/src/run-web.ts +0 -87
- package/src/scout.ts +0 -121
- package/src/session-cost.ts +0 -17
- package/src/stack.ts +0 -46
- package/src/tui/App.tsx +0 -1760
- package/src/tui/BakeOff.tsx +0 -190
- package/src/tui/BoardEditor.tsx +0 -260
- package/src/tui/EditableBoard.tsx +0 -179
- package/src/tui/Frame.tsx +0 -142
- package/src/tui/Intake.tsx +0 -111
- package/src/tui/Kanban.tsx +0 -158
- package/src/tui/Settings.tsx +0 -513
- package/src/tui/StackPick.tsx +0 -79
- package/src/tui/WebAccounts.tsx +0 -197
- package/src/tui/components.tsx +0 -340
- package/src/tui/config.ts +0 -150
- package/src/tui/deploy.ts +0 -137
- package/src/tui/engine.ts +0 -749
- package/src/tui/notify.ts +0 -21
- package/src/tui/panels.tsx +0 -89
- package/src/tui/templates.ts +0 -119
- package/src/tui/theme.ts +0 -44
- package/src/tui/validate.ts +0 -53
- package/src/types.ts +0 -208
- package/src/web/oauth-anthropic.ts +0 -206
- package/src/web/session.ts +0 -299
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Settings — API keys, model-per-role assignments, preferences, web-login (soon).
|
|
3
|
+
// Self-contained: manages its own sub-navigation; calls onExit when done.
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { Box, Text } from "ink";
|
|
6
|
+
import { Spinner, StatusMessage } from "@inkjs/ui";
|
|
7
|
+
import { C, Panel, Menu as SelectInput, GroupedMenu, KeyHint, TextField as TextInput, Password } from "./components.js";
|
|
8
|
+
import { WebAccounts } from "./WebAccounts.js";
|
|
9
|
+
import { connectedProviders } from "../web/session.js";
|
|
10
|
+
import { estimateAccuracy } from "../estimate.js";
|
|
11
|
+
import { availableProviders, effectiveRoster, allModels, setRoleModel, PROVIDER_LABEL } from "./engine.js";
|
|
12
|
+
import { setKey, getPrefs, setPrefs, loadConfig, setPreferredProvider, getDefaultMode, setDefaultMode, getNotify, setNotify, getWebhookUrl, setWebhookUrl, getPreferredStack, setPreferredStack, ENV_VAR } from "./config.js";
|
|
13
|
+
import { validateKey } from "./validate.js";
|
|
14
|
+
import { openRouterModels, refreshOpenRouterModels } from "../openrouter.js";
|
|
15
|
+
export function Settings({ onExit }) {
|
|
16
|
+
const [sub, setSub] = useState("menu");
|
|
17
|
+
const [keyProvider, setKeyProvider] = useState("anthropic");
|
|
18
|
+
const [keyDraft, setKeyDraft] = useState("");
|
|
19
|
+
const [checking, setChecking] = useState(false);
|
|
20
|
+
const [keyError, setKeyError] = useState("");
|
|
21
|
+
const [role, setRole] = useState(null);
|
|
22
|
+
const [notice, setNotice] = useState("");
|
|
23
|
+
const [orQuery, setOrQuery] = useState(""); // OpenRouter model-browser filter
|
|
24
|
+
const [hookDraft, setHookDraft] = useState(() => getWebhookUrl());
|
|
25
|
+
const [, force] = useState(0);
|
|
26
|
+
const refresh = () => force((n) => n + 1);
|
|
27
|
+
// ---------- menu ----------
|
|
28
|
+
if (sub === "menu") {
|
|
29
|
+
const groups = [
|
|
30
|
+
{ title: "Models & providers", items: [
|
|
31
|
+
{ label: "API keys", value: "keys" },
|
|
32
|
+
{ label: "Preferred provider", value: "provider" },
|
|
33
|
+
{ label: "Model assignments", value: "models" },
|
|
34
|
+
{ label: "Estimate accuracy", value: "accuracy" },
|
|
35
|
+
] },
|
|
36
|
+
{ title: "Build defaults", items: [
|
|
37
|
+
{ label: "Default workflow", value: "workflow" },
|
|
38
|
+
{ label: `Default stack: ${getPreferredStack()}`, value: "stack" },
|
|
39
|
+
{ label: "Budget, speed & alerts", value: "prefs" },
|
|
40
|
+
{ label: `Notify on done: ${getNotify() ? "On" : "Off"}`, value: "notify" },
|
|
41
|
+
{ label: `Webhook: ${getWebhookUrl() || "off"}`, value: "webhook" },
|
|
42
|
+
] },
|
|
43
|
+
// Web-login (browser automation / OAuth) is parked — vendors closed
|
|
44
|
+
// third-party subscription auth in 2026. Hidden unless PROJECTINATOR_WEB=1.
|
|
45
|
+
...(process.env.PROJECTINATOR_WEB === "1"
|
|
46
|
+
? [{ title: "Experimental", items: [{ label: `Connect accounts${connectedProviders().length ? ` (${connectedProviders().length})` : ""}`, value: "weblogin" }] }]
|
|
47
|
+
: []),
|
|
48
|
+
{ title: "", items: [{ label: "Back", value: "back" }] },
|
|
49
|
+
];
|
|
50
|
+
return (_jsxs(Box, { flexDirection: "column", children: [notice ? _jsx(Box, { marginBottom: 1, children: _jsx(StatusMessage, { variant: "success", children: notice }) }) : null, _jsx(Panel, { title: "Settings", children: _jsx(GroupedMenu, { groups: groups, onSelect: (i) => {
|
|
51
|
+
setNotice("");
|
|
52
|
+
if (i.value === "back")
|
|
53
|
+
onExit();
|
|
54
|
+
else if (i.value === "notify") {
|
|
55
|
+
const next = !getNotify();
|
|
56
|
+
setNotify(next);
|
|
57
|
+
setNotice(`Notifications ${next ? "on" : "off"}.`);
|
|
58
|
+
}
|
|
59
|
+
else
|
|
60
|
+
setSub(i.value);
|
|
61
|
+
} }) })] }));
|
|
62
|
+
}
|
|
63
|
+
// ---------- API keys ----------
|
|
64
|
+
if (sub === "keys") {
|
|
65
|
+
const have = new Set(availableProviders());
|
|
66
|
+
const providers = ["anthropic", "openai", "google", "openrouter"];
|
|
67
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "API keys", children: [_jsx(Text, { color: C.textMuted, children: "Select a provider to add or replace its key. Saved to ~/.projectinator (0600)." }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
68
|
+
...providers.map((p) => ({
|
|
69
|
+
label: `${have.has(p) ? "✓" : "·"} ${PROVIDER_LABEL[p]} ${have.has(p) ? "(set)" : "(not set)"}`,
|
|
70
|
+
value: p,
|
|
71
|
+
})),
|
|
72
|
+
{ label: "Back", value: "__back" },
|
|
73
|
+
], onSelect: (i) => {
|
|
74
|
+
if (i.value === "__back")
|
|
75
|
+
setSub("menu");
|
|
76
|
+
else {
|
|
77
|
+
setKeyProvider(i.value);
|
|
78
|
+
setKeyDraft("");
|
|
79
|
+
setKeyError("");
|
|
80
|
+
setChecking(false);
|
|
81
|
+
setSub("keyEntry");
|
|
82
|
+
}
|
|
83
|
+
} }) })] }) }));
|
|
84
|
+
}
|
|
85
|
+
if (sub === "keyEntry") {
|
|
86
|
+
if (checking) {
|
|
87
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsx(Panel, { title: `Enter key for ${PROVIDER_LABEL[keyProvider]}`, children: _jsx(Spinner, { label: `Verifying key with ${PROVIDER_LABEL[keyProvider]}…` }) }) }));
|
|
88
|
+
}
|
|
89
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: `Enter key for ${PROVIDER_LABEL[keyProvider]}`, children: [_jsxs(Text, { color: C.textMuted, children: ["Sets ", ENV_VAR[keyProvider], ". Paste and press Enter \u2014 it's verified before saving. (hidden)"] }), keyError ? _jsx(Box, { marginTop: 1, children: _jsx(StatusMessage, { variant: "error", children: keyError }) }) : null, _jsx(Box, { marginTop: 1, children: _jsx(Password, { placeholder: "paste your key\u2026", onSubmit: (k) => {
|
|
90
|
+
const trimmed = k.trim();
|
|
91
|
+
if (!trimmed) {
|
|
92
|
+
setSub("menu");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
setKeyError("");
|
|
96
|
+
setChecking(true);
|
|
97
|
+
void validateKey(keyProvider, trimmed).then((res) => {
|
|
98
|
+
setChecking(false);
|
|
99
|
+
if (res.ok) {
|
|
100
|
+
setKey(keyProvider, trimmed);
|
|
101
|
+
setNotice(`Saved ${PROVIDER_LABEL[keyProvider]} key (verified ✓).`);
|
|
102
|
+
setSub("menu");
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
setKeyError(res.error ?? "Key rejected.");
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
} }) })] }) }));
|
|
109
|
+
}
|
|
110
|
+
// ---------- model assignments ----------
|
|
111
|
+
if (sub === "models") {
|
|
112
|
+
const rows = effectiveRoster();
|
|
113
|
+
const lock = loadConfig().preferredProvider;
|
|
114
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Model assignments", children: [_jsxs(Text, { color: C.textMuted, children: ["Which model plays each role. ", lock ? `Pinned to ${PROVIDER_LABEL[lock]} — pick from its models.` : "Saved as overrides."] }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
115
|
+
...rows.map((r) => ({
|
|
116
|
+
label: `${r.label.padEnd(16)} ${r.model ?? "—"}`,
|
|
117
|
+
value: `${r.capability}:${r.tier}`,
|
|
118
|
+
})),
|
|
119
|
+
{ label: "Back", value: "__back" },
|
|
120
|
+
], onSelect: (i) => {
|
|
121
|
+
if (i.value === "__back")
|
|
122
|
+
setSub("menu");
|
|
123
|
+
else {
|
|
124
|
+
const [capability, tier] = i.value.split(":");
|
|
125
|
+
const r = rows.find((x) => x.capability === capability && x.tier === tier);
|
|
126
|
+
setRole({ capability, tier, label: r.label });
|
|
127
|
+
if (lock === "openrouter") {
|
|
128
|
+
setOrQuery("");
|
|
129
|
+
void refreshOpenRouterModels().then(() => refresh()); // freshen catalog in the background
|
|
130
|
+
setSub("orBrowse");
|
|
131
|
+
}
|
|
132
|
+
else
|
|
133
|
+
setSub("modelPick");
|
|
134
|
+
}
|
|
135
|
+
} }) })] }) }));
|
|
136
|
+
}
|
|
137
|
+
if (sub === "modelPick" && role) {
|
|
138
|
+
const lock = loadConfig().preferredProvider;
|
|
139
|
+
const models = lock ? allModels().filter((m) => m.provider === lock) : allModels();
|
|
140
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: `Pick a model for ${role.label}`, children: [lock ? _jsxs(Text, { color: C.textMuted, children: ["Showing ", PROVIDER_LABEL[lock], " models (you've pinned this provider)."] }) : null, _jsx(Box, { marginTop: lock ? 1 : 0, children: _jsx(SelectInput, { limit: 10, items: [
|
|
141
|
+
...models.map((m) => ({ label: `${m.name} (${m.provider})`, value: m.id })),
|
|
142
|
+
{ label: "Back", value: "__back" },
|
|
143
|
+
], onSelect: (i) => {
|
|
144
|
+
if (i.value !== "__back") {
|
|
145
|
+
setRoleModel(role.capability, role.tier, i.value);
|
|
146
|
+
setNotice(`${role.label} → ${i.value}`);
|
|
147
|
+
refresh();
|
|
148
|
+
}
|
|
149
|
+
setSub("models");
|
|
150
|
+
} }) })] }) }));
|
|
151
|
+
}
|
|
152
|
+
// ---------- OpenRouter model browser: filter the whole catalog by name ----------
|
|
153
|
+
if ((sub === "orBrowse" || sub === "orPick") && role) {
|
|
154
|
+
const all = openRouterModels();
|
|
155
|
+
const q = orQuery.trim().toLowerCase();
|
|
156
|
+
const matches = q ? all.filter((m) => m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q)) : all;
|
|
157
|
+
const price = (m) => `$${m.cost.input}/$${m.cost.output}`;
|
|
158
|
+
if (sub === "orBrowse") {
|
|
159
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: `OpenRouter model for ${role.label}`, children: [_jsxs(Text, { color: C.textMuted, children: ["Type to filter ", all.length, " models by name or slug \u2014 e.g. \u201Ckimi\u201D, \u201Cdeepseek\u201D, \u201Ccoder\u201D."] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: C.accent, children: "filter › " }), _jsx(TextInput, { value: orQuery, onChange: setOrQuery, placeholder: "kimi", onSubmit: () => {
|
|
160
|
+
if (!orQuery.trim()) {
|
|
161
|
+
setSub("models");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (matches.length)
|
|
165
|
+
setSub("orPick");
|
|
166
|
+
} })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: C.textSubtle, children: [matches.length, " match", matches.length === 1 ? "" : "es", matches.length ? " — Enter to choose:" : ""] }), matches.slice(0, 6).map((m) => (_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: C.textMuted, children: m.name }), " ", _jsxs(Text, { color: C.textSubtle, children: [m.id, " ", price(m)] })] }, m.id))), matches.length > 6 ? _jsx(Text, { color: C.textSubtle, children: " \u2026refine to narrow" }) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(KeyHint, { hints: [{ keys: "Enter", label: "choose" }, { keys: "empty Enter", label: "back" }] }) })] }) }));
|
|
167
|
+
}
|
|
168
|
+
// orPick — select from the filtered matches
|
|
169
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsx(Panel, { title: `Pick a model · “${orQuery}” (${matches.length})`, children: _jsx(SelectInput, { limit: 12, items: [
|
|
170
|
+
...matches.slice(0, 50).map((m) => ({ label: `${m.name} ${m.id} ${price(m)}`, value: m.id })),
|
|
171
|
+
{ label: "← Refine filter", value: "__refine" },
|
|
172
|
+
{ label: "Back", value: "__back" },
|
|
173
|
+
], onSelect: (i) => {
|
|
174
|
+
if (i.value === "__refine") {
|
|
175
|
+
setSub("orBrowse");
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (i.value === "__back") {
|
|
179
|
+
setSub("models");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
setRoleModel(role.capability, role.tier, i.value);
|
|
183
|
+
setNotice(`${role.label} → ${i.value}`);
|
|
184
|
+
refresh();
|
|
185
|
+
setSub("models");
|
|
186
|
+
} }) }) }));
|
|
187
|
+
}
|
|
188
|
+
// ---------- preferred provider ----------
|
|
189
|
+
if (sub === "provider") {
|
|
190
|
+
const have = new Set(availableProviders());
|
|
191
|
+
const current = loadConfig().preferredProvider;
|
|
192
|
+
const providers = ["anthropic", "openai", "google", "openrouter"];
|
|
193
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Preferred provider", children: [_jsxs(Text, { color: C.textMuted, children: ["Pin one provider for every role, or Auto to use the best available. Current: ", current ?? "Auto", "."] }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
194
|
+
{ label: `Auto (best available)${!current ? " ✓" : ""}`, value: "__auto" },
|
|
195
|
+
...providers.map((p) => ({
|
|
196
|
+
label: `${PROVIDER_LABEL[p]}${have.has(p) ? "" : " (no key)"}${current === p ? " ✓" : ""}`,
|
|
197
|
+
value: p,
|
|
198
|
+
})),
|
|
199
|
+
{ label: "Back", value: "__back" },
|
|
200
|
+
], onSelect: (i) => {
|
|
201
|
+
if (i.value === "__back") {
|
|
202
|
+
setSub("menu");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const choice = i.value === "__auto" ? undefined : i.value;
|
|
206
|
+
setPreferredProvider(choice);
|
|
207
|
+
setNotice(`Preferred provider: ${choice ?? "Auto"}.`);
|
|
208
|
+
setSub("menu");
|
|
209
|
+
} }) })] }) }));
|
|
210
|
+
}
|
|
211
|
+
// ---------- default workflow ----------
|
|
212
|
+
if (sub === "workflow") {
|
|
213
|
+
const current = getDefaultMode();
|
|
214
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Default workflow for new builds", children: [_jsxs(Text, { color: C.textMuted, children: ["Current: ", current === "approval" ? "Approval-gated" : "Auto-run", "."] }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
215
|
+
{ label: `Auto-run — confirm cost, then build${current === "auto" ? " ✓" : ""}`, value: "auto" },
|
|
216
|
+
{ label: `Approval-gated — you approve the backlog first${current === "approval" ? " ✓" : ""}`, value: "approval" },
|
|
217
|
+
{ label: "Back", value: "__back" },
|
|
218
|
+
], onSelect: (i) => {
|
|
219
|
+
if (i.value !== "__back") {
|
|
220
|
+
setDefaultMode(i.value);
|
|
221
|
+
setNotice(`Default workflow: ${i.value === "approval" ? "Approval-gated" : "Auto-run"}.`);
|
|
222
|
+
}
|
|
223
|
+
setSub("menu");
|
|
224
|
+
} }) })] }) }));
|
|
225
|
+
}
|
|
226
|
+
// ---------- preferences ----------
|
|
227
|
+
if (sub === "prefs") {
|
|
228
|
+
const prefs = getPrefs();
|
|
229
|
+
return _jsx(PrefsEditor, { initial: prefs, onDone: (p) => { setPrefs(p); setNotice("Preferences saved."); setSub("menu"); }, onCancel: () => setSub("menu") });
|
|
230
|
+
}
|
|
231
|
+
// ---------- webhook ----------
|
|
232
|
+
if (sub === "webhook") {
|
|
233
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Webhook on build finished / halted", children: [_jsx(Text, { color: C.textMuted, children: "POSTs a JSON summary (status, idea, cost, files, workspace) to this URL. Works with" }), _jsx(Text, { color: C.textMuted, children: "Slack/Discord incoming webhooks, n8n, Zapier, or your own endpoint. Leave empty to turn off." }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: C.accent, children: "URL: " }), _jsx(TextInput, { value: hookDraft, onChange: setHookDraft, onSubmit: () => {
|
|
234
|
+
const url = hookDraft.trim();
|
|
235
|
+
if (url && !/^https?:\/\//.test(url)) {
|
|
236
|
+
setNotice("Webhook must start with http:// or https://.");
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
setWebhookUrl(url);
|
|
240
|
+
setNotice(url ? `Webhook set: ${url}` : "Webhook off.");
|
|
241
|
+
setSub("menu");
|
|
242
|
+
} })] }), _jsx(Box, { marginTop: 1, children: _jsx(KeyHint, { hints: [{ keys: "Enter", label: "save" }, { keys: "Esc", label: "back" }] }) })] }) }));
|
|
243
|
+
}
|
|
244
|
+
// ---------- estimate accuracy (calibration vs baseline) ----------
|
|
245
|
+
if (sub === "accuracy") {
|
|
246
|
+
const rows = estimateAccuracy();
|
|
247
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Estimate accuracy", children: [_jsx(Text, { color: C.textMuted, children: "Measured output tokens vs the static baseline, per role/difficulty \u2014 and per model that" }), _jsx(Text, { color: C.textMuted, children: "ran it (indented). Calibration replaces the baseline once a row has \u22652 samples (\u2713 live);" }), _jsx(Text, { color: C.textMuted, children: "the router uses the model row when it exists." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: rows.length === 0 ? (_jsx(Text, { color: C.dim, children: "No data yet \u2014 run some builds and this fills in." })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { color: C.dim, children: ["role/diff · model".padEnd(34), "base".padEnd(8), "actual".padEnd(8), "Δ".padEnd(8), "n".padEnd(4), "live"] }), rows.map((r) => {
|
|
248
|
+
const delta = r.baseOutput > 0 ? Math.round(((r.actualOutput - r.baseOutput) / r.baseOutput) * 100) : 0;
|
|
249
|
+
const label = r.model ? ` ↳ ${r.model}` : `${r.capability}/${r.difficulty}`;
|
|
250
|
+
return (_jsxs(Text, { children: [_jsx(Text, { color: r.model ? C.dim : C.text, children: label.slice(0, 33).padEnd(34) }), String(r.baseOutput).padEnd(8), _jsx(Text, { color: C.accent, children: String(r.actualOutput).padEnd(8) }), _jsx(Text, { color: Math.abs(delta) > 40 ? C.warn : C.dim, children: `${delta >= 0 ? "+" : ""}${delta}%`.padEnd(8) }), String(r.n).padEnd(4), r.active ? _jsx(Text, { color: C.good, children: "\u2713" }) : _jsx(Text, { color: C.dim, children: "\u00B7" })] }, `${r.capability}/${r.difficulty}/${r.model ?? ""}`));
|
|
251
|
+
})] })) }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [{ label: "Back", value: "back" }], onSelect: () => setSub("menu") }) })] }) }));
|
|
252
|
+
}
|
|
253
|
+
// ---------- default stack ----------
|
|
254
|
+
if (sub === "stack") {
|
|
255
|
+
const current = getPreferredStack();
|
|
256
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Default stack for new web builds", children: [_jsxs(Text, { color: C.textMuted, children: ["\u201CAsk each time\u201D shows the picker; anything else skips it. Current: ", current, "."] }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
257
|
+
{ label: `Ask each time${current === "ask" ? " ✓" : ""}`, value: "ask" },
|
|
258
|
+
{ label: `Vanilla HTML/CSS/JS${current === "vanilla" ? " ✓" : ""}`, value: "vanilla" },
|
|
259
|
+
{ label: `React (CDN, no build)${current === "react" ? " ✓" : ""}`, value: "react" },
|
|
260
|
+
{ label: `Let the AI decide${current === "ai" ? " ✓" : ""}`, value: "ai" },
|
|
261
|
+
{ label: "Back", value: "__back" },
|
|
262
|
+
], onSelect: (i) => {
|
|
263
|
+
if (i.value !== "__back") {
|
|
264
|
+
setPreferredStack(i.value);
|
|
265
|
+
setNotice(`Default stack: ${i.value}.`);
|
|
266
|
+
}
|
|
267
|
+
setSub("menu");
|
|
268
|
+
} }) })] }) }));
|
|
269
|
+
}
|
|
270
|
+
// ---------- connect accounts (web subscriptions) ----------
|
|
271
|
+
if (sub === "weblogin") {
|
|
272
|
+
return _jsx(WebAccounts, { onExit: () => setSub("menu") });
|
|
273
|
+
}
|
|
274
|
+
return _jsx(Text, { children: "\u2026" });
|
|
275
|
+
}
|
|
276
|
+
function PrefsEditor({ initial, onDone, onCancel, }) {
|
|
277
|
+
const [cap, setCap] = useState(String(initial.budgetCapUSD));
|
|
278
|
+
const [conc, setConc] = useState(String(initial.concurrency));
|
|
279
|
+
const [pct, setPct] = useState(String(initial.budgetAlertPct));
|
|
280
|
+
const [tmo, setTmo] = useState(String(initial.taskTimeoutMin));
|
|
281
|
+
const [tcap, setTcap] = useState(String(initial.taskCostCapUSD));
|
|
282
|
+
const [field, setField] = useState("cap");
|
|
283
|
+
const commit = () => {
|
|
284
|
+
const b = Math.max(1, parseFloat(cap) || initial.budgetCapUSD);
|
|
285
|
+
const c = Math.max(1, Math.floor(parseFloat(conc) || initial.concurrency));
|
|
286
|
+
const p = Math.min(99, Math.max(1, Math.round(parseFloat(pct) || initial.budgetAlertPct)));
|
|
287
|
+
// "0" is a valid value here (unlimited), so only a non-number falls back.
|
|
288
|
+
const parse0 = (s, fallback) => { const n = parseFloat(s); return Number.isFinite(n) ? Math.max(0, n) : fallback; };
|
|
289
|
+
onDone({
|
|
290
|
+
budgetCapUSD: b,
|
|
291
|
+
concurrency: c,
|
|
292
|
+
budgetAlertPct: p,
|
|
293
|
+
taskTimeoutMin: parse0(tmo, initial.taskTimeoutMin),
|
|
294
|
+
taskCostCapUSD: parse0(tcap, initial.taskCostCapUSD),
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Panel, { title: "Budget, speed, alerts & task limits", children: [_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Box, { width: 22, children: _jsx(Text, { color: field === "cap" ? C.accent : C.text, children: "Budget cap (USD)" }) }), field === "cap" ? (_jsx(TextInput, { value: cap, onChange: setCap, onSubmit: () => setField("conc") })) : (_jsx(Text, { children: cap }))] }), _jsxs(Box, { children: [_jsx(Box, { width: 22, children: _jsx(Text, { color: field === "conc" ? C.accent : C.text, children: "Tasks at once" }) }), field === "conc" ? (_jsx(TextInput, { value: conc, onChange: setConc, onSubmit: () => setField("pct") })) : (_jsx(Text, { children: conc }))] }), _jsxs(Box, { children: [_jsx(Box, { width: 22, children: _jsx(Text, { color: field === "pct" ? C.accent : C.text, children: "Alert at % of cap" }) }), field === "pct" ? (_jsx(TextInput, { value: pct, onChange: setPct, onSubmit: () => setField("tmo") })) : (_jsxs(Text, { children: [pct, "%"] }))] }), _jsxs(Box, { children: [_jsx(Box, { width: 22, children: _jsx(Text, { color: field === "tmo" ? C.accent : C.text, children: "Task timeout (min)" }) }), field === "tmo" ? (_jsx(TextInput, { value: tmo, onChange: setTmo, onSubmit: () => setField("tcap") })) : (_jsx(Text, { children: tmo === "0" ? "unlimited" : tmo }))] }), _jsxs(Box, { children: [_jsx(Box, { width: 22, children: _jsx(Text, { color: field === "tcap" ? C.accent : C.text, children: "Task cost cap (USD)" }) }), field === "tcap" ? (_jsx(TextInput, { value: tcap, onChange: setTcap, onSubmit: commit })) : (_jsx(Text, { children: tcap === "0" ? "unlimited" : tcap }))] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: C.textSubtle, children: "Enter moves to the next field, then saves. A task over its limit is aborted and the build halts (resumable); 0 = unlimited." }), _jsx(KeyHint, { hints: [{ keys: "Enter", label: "next / save" }, { keys: "Ctrl+C", label: "cancel" }] })] })] }) }));
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=Settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/tui/Settings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Stack picker — platform first, then (for web) the framework. Non-web platforms
|
|
3
|
+
// fall back to a web build for now. Returns the chosen StackChoice.
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { Box, Text } from "ink";
|
|
6
|
+
import { C, Panel, Menu as SelectInput, KeyHint, TextField as TextInput } from "./components.js";
|
|
7
|
+
import { WEB_FRAMEWORKS } from "../stack.js";
|
|
8
|
+
const OTHER = "__other__";
|
|
9
|
+
export function StackPick({ onDone }) {
|
|
10
|
+
const [platform, setPlatform] = useState(null);
|
|
11
|
+
const [typing, setTyping] = useState(false);
|
|
12
|
+
const [draft, setDraft] = useState("");
|
|
13
|
+
// step 1 — platform
|
|
14
|
+
if (!platform) {
|
|
15
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Panel, { title: "Target platform", children: _jsx(SelectInput, { items: [
|
|
16
|
+
{ label: "Web", value: "web" },
|
|
17
|
+
{ label: "Mobile (builds as a web app for now)", value: "mobile" },
|
|
18
|
+
{ label: "Desktop (builds as a web app for now)", value: "desktop" },
|
|
19
|
+
], onSelect: (i) => {
|
|
20
|
+
const p = i.value;
|
|
21
|
+
if (p === "web")
|
|
22
|
+
setPlatform("web");
|
|
23
|
+
else
|
|
24
|
+
onDone({ platform: p, framework: "ai" }); // web fallback, let PM decide
|
|
25
|
+
} }) }), _jsx(KeyHint, { hints: [{ keys: "Esc", label: "cancel the build" }] })] }));
|
|
26
|
+
}
|
|
27
|
+
// step 2 — framework (web only)
|
|
28
|
+
if (typing) {
|
|
29
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Which framework?" }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: C.accent, children: "› " }), _jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => onDone({ platform: "web", framework: draft.trim() || "ai" }) })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: C.dim, children: "Name it \u2014 must run with no build step." }), _jsx(KeyHint, { hints: [{ keys: "Enter", label: "continue" }] })] })] }));
|
|
30
|
+
}
|
|
31
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Panel, { title: "Web framework", children: _jsx(SelectInput, { items: [
|
|
32
|
+
...WEB_FRAMEWORKS.map((f) => ({ label: f.label, value: String(f.id) })),
|
|
33
|
+
{ label: "Something else…", value: OTHER },
|
|
34
|
+
{ label: "Platform", value: "__platform" },
|
|
35
|
+
], onSelect: (i) => {
|
|
36
|
+
if (i.value === "__platform")
|
|
37
|
+
setPlatform(null);
|
|
38
|
+
else if (i.value === OTHER)
|
|
39
|
+
setTyping(true);
|
|
40
|
+
else
|
|
41
|
+
onDone({ platform: "web", framework: i.value });
|
|
42
|
+
} }) }), _jsx(Text, { color: C.dim, children: "Esc cancels the build." })] }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=StackPick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackPick.js","sourceRoot":"","sources":["../../src/tui/StackPick.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Connect accounts — sign in to your paid Claude / ChatGPT / Gemini web
|
|
3
|
+
// subscriptions once; the app then drives one background browser per provider to
|
|
4
|
+
// get ~free completions. Brittle + against provider ToS (account-ban risk).
|
|
5
|
+
import { useEffect, useRef, useState } from "react";
|
|
6
|
+
import { Box, Text } from "ink";
|
|
7
|
+
import { Spinner, StatusMessage } from "@inkjs/ui";
|
|
8
|
+
import { C, Panel, Menu as SelectInput } from "./components.js";
|
|
9
|
+
import { PROVIDERS, isConnected, disconnect, webLoginBegin, webComplete, } from "../web/session.js";
|
|
10
|
+
const ORDER = ["claude", "chatgpt", "gemini"];
|
|
11
|
+
export function WebAccounts({ onExit }) {
|
|
12
|
+
const [view, setView] = useState({ kind: "list" });
|
|
13
|
+
const [notice, setNotice] = useState("");
|
|
14
|
+
const [, force] = useState(0);
|
|
15
|
+
const refresh = () => force((n) => n + 1);
|
|
16
|
+
// Handle for the open login browser (webLoginBegin), kept across renders.
|
|
17
|
+
const loginRef = useRef(null);
|
|
18
|
+
const openingRef = useRef(false);
|
|
19
|
+
// ---- open the login window when we enter "connecting" ----
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (view.kind !== "connecting" || openingRef.current)
|
|
22
|
+
return;
|
|
23
|
+
openingRef.current = true;
|
|
24
|
+
let alive = true;
|
|
25
|
+
void webLoginBegin(view.provider)
|
|
26
|
+
.then((h) => {
|
|
27
|
+
// If the user already left "connecting", close the just-opened browser
|
|
28
|
+
// instead of orphaning it with no UI path to finish/cancel.
|
|
29
|
+
if (!alive) {
|
|
30
|
+
void h.cancel();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
loginRef.current = h;
|
|
34
|
+
})
|
|
35
|
+
.catch(() => {
|
|
36
|
+
if (!alive)
|
|
37
|
+
return;
|
|
38
|
+
setNotice("Could not open the browser.");
|
|
39
|
+
setView({ kind: "list" });
|
|
40
|
+
})
|
|
41
|
+
.finally(() => { openingRef.current = false; });
|
|
42
|
+
return () => { alive = false; };
|
|
43
|
+
}, [view]);
|
|
44
|
+
// ---- run a test completion when we enter "testing" ----
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (view.kind !== "testing")
|
|
47
|
+
return;
|
|
48
|
+
const provider = view.provider;
|
|
49
|
+
let alive = true;
|
|
50
|
+
void webComplete(provider, "Reply with exactly one word: hello")
|
|
51
|
+
.then((text) => { if (alive)
|
|
52
|
+
setView({ kind: "result", provider, ok: true, text: text.trim() || "(empty)" }); })
|
|
53
|
+
.catch((e) => { if (alive)
|
|
54
|
+
setView({ kind: "result", provider, ok: false, text: e instanceof Error ? e.message : String(e) }); });
|
|
55
|
+
return () => { alive = false; };
|
|
56
|
+
}, [view]);
|
|
57
|
+
// ---------- list ----------
|
|
58
|
+
if (view.kind === "list") {
|
|
59
|
+
return (_jsxs(Box, { flexDirection: "column", children: [notice ? _jsx(Box, { marginBottom: 1, children: _jsx(StatusMessage, { variant: "success", children: notice }) }) : null, _jsxs(Panel, { title: "Connect accounts", children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: C.dim, children: "Sign in once to your paid web subscriptions. The app reuses one" }), _jsx(Text, { color: C.dim, children: "background browser per provider \u2014 no window pops up per task." }), _jsx(Text, { color: C.warn, children: "Uses the web UI (not the API): fragile, and against provider ToS." })] }), _jsx(SelectInput, { items: [
|
|
60
|
+
...ORDER.map((p) => ({
|
|
61
|
+
label: `${isConnected(p) ? "🟢" : "⚪"} ${PROVIDERS[p].label} ${isConnected(p) ? "(connected)" : "(not connected)"}`,
|
|
62
|
+
value: p,
|
|
63
|
+
})),
|
|
64
|
+
{ label: "Back", value: "__back" },
|
|
65
|
+
], onSelect: (i) => {
|
|
66
|
+
setNotice("");
|
|
67
|
+
if (i.value === "__back")
|
|
68
|
+
onExit();
|
|
69
|
+
else
|
|
70
|
+
setView({ kind: "actions", provider: i.value });
|
|
71
|
+
} })] })] }));
|
|
72
|
+
}
|
|
73
|
+
// ---------- per-provider actions ----------
|
|
74
|
+
if (view.kind === "actions") {
|
|
75
|
+
const p = view.provider;
|
|
76
|
+
const connected = isConnected(p);
|
|
77
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: PROVIDERS[p].label }), _jsx(Text, { color: C.dim, children: connected ? "Connected. You can test or disconnect it." : "Not connected yet." }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
78
|
+
{ label: connected ? "Reconnect (open login again)" : "Connect (open login window)", value: "connect" },
|
|
79
|
+
...(connected ? [{ label: "Test — send a quick 'hello'", value: "test" }] : []),
|
|
80
|
+
...(connected ? [{ label: "Disconnect (log out, wipe session)", value: "disconnect" }] : []),
|
|
81
|
+
{ label: "Back", value: "__back" },
|
|
82
|
+
], onSelect: (i) => {
|
|
83
|
+
if (i.value === "__back")
|
|
84
|
+
setView({ kind: "list" });
|
|
85
|
+
else if (i.value === "connect")
|
|
86
|
+
setView({ kind: "connecting", provider: p });
|
|
87
|
+
else if (i.value === "test")
|
|
88
|
+
setView({ kind: "testing", provider: p });
|
|
89
|
+
else if (i.value === "disconnect") {
|
|
90
|
+
disconnect(p);
|
|
91
|
+
setNotice(`Disconnected ${PROVIDERS[p].label}.`);
|
|
92
|
+
refresh();
|
|
93
|
+
setView({ kind: "list" });
|
|
94
|
+
}
|
|
95
|
+
} }) })] }));
|
|
96
|
+
}
|
|
97
|
+
// ---------- connecting (login window open) ----------
|
|
98
|
+
if (view.kind === "connecting") {
|
|
99
|
+
const p = view.provider;
|
|
100
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Connecting ", PROVIDERS[p].label] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { children: "A browser window opened. In it:" }), _jsxs(Text, { color: C.dim, children: [" 1. Log in to your ", PROVIDERS[p].label, " account (solve any captcha)."] }), _jsx(Text, { color: C.dim, children: " 2. Wait until the chat screen loads." }), _jsx(Text, { color: C.dim, children: " 3. Come back here and choose \u201CI'm logged in\u201D." })] }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
101
|
+
{ label: "I'm logged in — save the session", value: "done" },
|
|
102
|
+
{ label: "Cancel", value: "cancel" },
|
|
103
|
+
], onSelect: (i) => {
|
|
104
|
+
const h = loginRef.current;
|
|
105
|
+
loginRef.current = null;
|
|
106
|
+
if (i.value === "done") {
|
|
107
|
+
void (h?.finish() ?? Promise.resolve()).then(() => {
|
|
108
|
+
setNotice(`Connected ${PROVIDERS[p].label}.`);
|
|
109
|
+
refresh();
|
|
110
|
+
setView({ kind: "list" });
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
void (h?.cancel() ?? Promise.resolve()).then(() => setView({ kind: "list" }));
|
|
115
|
+
}
|
|
116
|
+
} }) })] }));
|
|
117
|
+
}
|
|
118
|
+
// ---------- testing ----------
|
|
119
|
+
if (view.kind === "testing") {
|
|
120
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Testing ", PROVIDERS[view.provider].label] }), _jsx(Spinner, { label: "Sending a prompt through your web session\u2026 (first run launches the browser)" })] }));
|
|
121
|
+
}
|
|
122
|
+
// ---------- result ----------
|
|
123
|
+
if (view.kind === "result") {
|
|
124
|
+
const p = view.provider;
|
|
125
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: [PROVIDERS[p].label, " \u2014 test ", view.ok ? "passed" : "failed"] }), _jsx(Box, { marginTop: 1, children: view.ok
|
|
126
|
+
? _jsxs(StatusMessage, { variant: "success", children: ["Reply: ", view.text] })
|
|
127
|
+
: _jsx(StatusMessage, { variant: "error", children: view.text }) }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [{ label: "Back", value: "back" }], onSelect: () => setView({ kind: "list" }) }) })] }));
|
|
128
|
+
}
|
|
129
|
+
return _jsx(Text, { children: "\u2026" });
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=WebAccounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebAccounts.js","sourceRoot":"","sources":["../../src/tui/WebAccounts.tsx"],"names":[],"mappings":"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"}
|