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.
Files changed (170) hide show
  1. package/README.md +30 -11
  2. package/bin/projectinator.mjs +56 -11
  3. package/dist/bakeoff.js +163 -0
  4. package/dist/bakeoff.js.map +1 -0
  5. package/dist/build-state.js +26 -0
  6. package/dist/build-state.js.map +1 -0
  7. package/dist/burndown.js +19 -0
  8. package/dist/burndown.js.map +1 -0
  9. package/dist/calibration.js +86 -0
  10. package/dist/calibration.js.map +1 -0
  11. package/dist/cli.js +289 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/cost.js +35 -0
  14. package/dist/cost.js.map +1 -0
  15. package/dist/council.js +147 -0
  16. package/dist/council.js.map +1 -0
  17. package/dist/demo.js +93 -0
  18. package/dist/demo.js.map +1 -0
  19. package/dist/estimate.js +98 -0
  20. package/dist/estimate.js.map +1 -0
  21. package/dist/executor.js +118 -0
  22. package/dist/executor.js.map +1 -0
  23. package/dist/git.js +82 -0
  24. package/dist/git.js.map +1 -0
  25. package/dist/intake.js +98 -0
  26. package/dist/intake.js.map +1 -0
  27. package/dist/models.js +171 -0
  28. package/dist/models.js.map +1 -0
  29. package/dist/narrate.js +76 -0
  30. package/dist/narrate.js.map +1 -0
  31. package/dist/openrouter.js +112 -0
  32. package/dist/openrouter.js.map +1 -0
  33. package/dist/orchestrator.js +273 -0
  34. package/dist/orchestrator.js.map +1 -0
  35. package/dist/pm.js +245 -0
  36. package/dist/pm.js.map +1 -0
  37. package/dist/preview.js +194 -0
  38. package/dist/preview.js.map +1 -0
  39. package/dist/registry-store.js +38 -0
  40. package/dist/registry-store.js.map +1 -0
  41. package/dist/registry.js +115 -0
  42. package/dist/registry.js.map +1 -0
  43. package/dist/research.js +98 -0
  44. package/dist/research.js.map +1 -0
  45. package/dist/retro.js +83 -0
  46. package/dist/retro.js.map +1 -0
  47. package/dist/roles.js +357 -0
  48. package/dist/roles.js.map +1 -0
  49. package/dist/router.js +95 -0
  50. package/dist/router.js.map +1 -0
  51. package/dist/run-bakeoff.js +68 -0
  52. package/dist/run-bakeoff.js.map +1 -0
  53. package/dist/run-build.js +193 -0
  54. package/dist/run-build.js.map +1 -0
  55. package/{src/run-dev.ts → dist/run-dev.js} +23 -39
  56. package/dist/run-dev.js.map +1 -0
  57. package/{src/run-pm.ts → dist/run-pm.js} +34 -46
  58. package/dist/run-pm.js.map +1 -0
  59. package/{src/run-research.ts → dist/run-research.js} +19 -30
  60. package/dist/run-research.js.map +1 -0
  61. package/{src/run-scout.ts → dist/run-scout.js} +17 -27
  62. package/dist/run-scout.js.map +1 -0
  63. package/dist/run-web.js +93 -0
  64. package/dist/run-web.js.map +1 -0
  65. package/dist/scout.js +81 -0
  66. package/dist/scout.js.map +1 -0
  67. package/dist/session-cost.js +15 -0
  68. package/dist/session-cost.js.map +1 -0
  69. package/dist/stack.js +34 -0
  70. package/dist/stack.js.map +1 -0
  71. package/dist/stuck.js +21 -0
  72. package/dist/stuck.js.map +1 -0
  73. package/dist/tui/App.js +1269 -0
  74. package/dist/tui/App.js.map +1 -0
  75. package/dist/tui/BakeOff.js +95 -0
  76. package/dist/tui/BakeOff.js.map +1 -0
  77. package/dist/tui/BoardEditor.js +183 -0
  78. package/dist/tui/BoardEditor.js.map +1 -0
  79. package/dist/tui/EditableBoard.js +140 -0
  80. package/dist/tui/EditableBoard.js.map +1 -0
  81. package/dist/tui/Frame.js +78 -0
  82. package/dist/tui/Frame.js.map +1 -0
  83. package/dist/tui/Intake.js +59 -0
  84. package/dist/tui/Intake.js.map +1 -0
  85. package/dist/tui/Kanban.js +75 -0
  86. package/dist/tui/Kanban.js.map +1 -0
  87. package/dist/tui/Settings.js +299 -0
  88. package/dist/tui/Settings.js.map +1 -0
  89. package/dist/tui/StackPick.js +44 -0
  90. package/dist/tui/StackPick.js.map +1 -0
  91. package/dist/tui/WebAccounts.js +131 -0
  92. package/dist/tui/WebAccounts.js.map +1 -0
  93. package/dist/tui/components.js +178 -0
  94. package/dist/tui/components.js.map +1 -0
  95. package/dist/tui/config.js +129 -0
  96. package/dist/tui/config.js.map +1 -0
  97. package/dist/tui/deploy.js +114 -0
  98. package/dist/tui/deploy.js.map +1 -0
  99. package/dist/tui/engine.js +710 -0
  100. package/dist/tui/engine.js.map +1 -0
  101. package/dist/tui/notify.js +47 -0
  102. package/dist/tui/notify.js.map +1 -0
  103. package/dist/tui/panels.js +42 -0
  104. package/dist/tui/panels.js.map +1 -0
  105. package/dist/tui/templates.js +106 -0
  106. package/dist/tui/templates.js.map +1 -0
  107. package/dist/tui/theme.js +42 -0
  108. package/dist/tui/theme.js.map +1 -0
  109. package/dist/tui/validate.js +51 -0
  110. package/dist/tui/validate.js.map +1 -0
  111. package/{src/tui.tsx → dist/tui.js} +23 -33
  112. package/dist/tui.js.map +1 -0
  113. package/dist/types.js +19 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/web/oauth-anthropic.js +179 -0
  116. package/dist/web/oauth-anthropic.js.map +1 -0
  117. package/dist/web/session.js +274 -0
  118. package/dist/web/session.js.map +1 -0
  119. package/package.json +5 -4
  120. package/src/bakeoff.ts +0 -214
  121. package/src/build-state.ts +0 -47
  122. package/src/burndown.ts +0 -35
  123. package/src/calibration.ts +0 -88
  124. package/src/cost.ts +0 -43
  125. package/src/council.ts +0 -175
  126. package/src/demo.ts +0 -106
  127. package/src/estimate.ts +0 -111
  128. package/src/executor.ts +0 -169
  129. package/src/git.ts +0 -72
  130. package/src/intake.ts +0 -125
  131. package/src/models.ts +0 -175
  132. package/src/narrate.ts +0 -87
  133. package/src/openrouter.ts +0 -119
  134. package/src/orchestrator.ts +0 -310
  135. package/src/pm.ts +0 -302
  136. package/src/preview.ts +0 -206
  137. package/src/registry-store.ts +0 -41
  138. package/src/registry.ts +0 -132
  139. package/src/research.ts +0 -123
  140. package/src/retro.ts +0 -99
  141. package/src/roles.ts +0 -401
  142. package/src/router.ts +0 -120
  143. package/src/run-bakeoff.ts +0 -77
  144. package/src/run-build.ts +0 -203
  145. package/src/run-web.ts +0 -87
  146. package/src/scout.ts +0 -121
  147. package/src/session-cost.ts +0 -17
  148. package/src/stack.ts +0 -46
  149. package/src/tui/App.tsx +0 -1760
  150. package/src/tui/BakeOff.tsx +0 -190
  151. package/src/tui/BoardEditor.tsx +0 -260
  152. package/src/tui/EditableBoard.tsx +0 -179
  153. package/src/tui/Frame.tsx +0 -142
  154. package/src/tui/Intake.tsx +0 -111
  155. package/src/tui/Kanban.tsx +0 -158
  156. package/src/tui/Settings.tsx +0 -513
  157. package/src/tui/StackPick.tsx +0 -79
  158. package/src/tui/WebAccounts.tsx +0 -197
  159. package/src/tui/components.tsx +0 -340
  160. package/src/tui/config.ts +0 -150
  161. package/src/tui/deploy.ts +0 -137
  162. package/src/tui/engine.ts +0 -749
  163. package/src/tui/notify.ts +0 -21
  164. package/src/tui/panels.tsx +0 -89
  165. package/src/tui/templates.ts +0 -119
  166. package/src/tui/theme.ts +0 -44
  167. package/src/tui/validate.ts +0 -53
  168. package/src/types.ts +0 -208
  169. package/src/web/oauth-anthropic.ts +0 -206
  170. 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":";AAAA,kFAAkF;AAClF,0EAA0E;AAE1E,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AACxI,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3G,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AAC1O,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAI7E,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAA0B;IACzD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAM,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAW,WAAW,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAA+D,IAAI,CAAC,CAAC;IACrG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC;IAC9E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE1C,6BAA6B;IAC7B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAgB;YAC1B,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE;oBACpC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;oBACpC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE;oBAClD,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE;oBAC/C,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE;iBAClD,EAAE;YACH,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;oBAChC,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE;oBAChD,EAAE,KAAK,EAAE,kBAAkB,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;oBAClE,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE;oBACnD,EAAE,KAAK,EAAE,mBAAmB,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;oBAC3E,EAAE,KAAK,EAAE,YAAY,aAAa,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;iBACpE,EAAE;YACH,oEAAoE;YACpE,4EAA4E;YAC5E,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG;gBACvC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;gBAClK,CAAC,CAAC,EAAE,CAAC;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;SACzD,CAAC;QACF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,MAAM,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAAE,KAAC,aAAa,IAAC,OAAO,EAAC,SAAS,YAAE,MAAM,GAAiB,GAAM,CAAC,CAAC,CAAC,IAAI,EACtG,KAAC,KAAK,IAAC,KAAK,EAAC,UAAU,YACrB,KAAC,WAAW,IACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,SAAS,CAAC,EAAE,CAAC,CAAC;4BACd,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;gCAAE,MAAM,EAAE,CAAC;iCAC5B,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gCAC9B,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gCAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;gCAChB,SAAS,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;4BACrD,CAAC;;gCAAM,MAAM,CAAC,CAAC,CAAC,KAAY,CAAC,CAAC;wBAChC,CAAC,GACD,GACI,IACJ,CACP,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9E,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,UAAU,aACrB,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,+FAAuF,EAC/G,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;gCACL,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCACvB,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE;oCACjG,KAAK,EAAE,CAAC;iCACT,CAAC,CAAC;gCACH,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;oCAAE,MAAM,CAAC,MAAM,CAAC,CAAC;qCACpC,CAAC;oCACJ,cAAc,CAAC,CAAC,CAAC,KAAiB,CAAC,CAAC;oCACpC,WAAW,CAAC,EAAE,CAAC,CAAC;oCAChB,WAAW,CAAC,EAAE,CAAC,CAAC;oCAChB,WAAW,CAAC,KAAK,CAAC,CAAC;oCACnB,MAAM,CAAC,UAAU,CAAC,CAAC;gCACrB,CAAC;4BACH,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,KAAC,KAAK,IAAC,KAAK,EAAE,iBAAiB,cAAc,CAAC,WAAW,CAAC,EAAE,YAC1D,KAAC,OAAO,IAAC,KAAK,EAAE,sBAAsB,cAAc,CAAC,WAAW,CAAC,GAAG,GAAI,GAClE,GACJ,CACP,CAAC;QACJ,CAAC;QACD,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAE,iBAAiB,cAAc,CAAC,WAAW,CAAC,EAAE,aAC5D,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,sBAAQ,OAAO,CAAC,WAAW,CAAC,4EAAuE,EAC1H,QAAQ,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,aAAa,IAAC,OAAO,EAAC,OAAO,YAAE,QAAQ,GAAiB,GAAM,CAAC,CAAC,CAAC,IAAI,EACrG,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,QAAQ,IACP,WAAW,EAAC,sBAAiB,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gCACzB,IAAI,CAAC,OAAO,EAAE,CAAC;oCACb,MAAM,CAAC,MAAM,CAAC,CAAC;oCACf,OAAO;gCACT,CAAC;gCACD,WAAW,CAAC,EAAE,CAAC,CAAC;gCAChB,WAAW,CAAC,IAAI,CAAC,CAAC;gCAClB,KAAK,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oCAClD,WAAW,CAAC,KAAK,CAAC,CAAC;oCACnB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;wCACX,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wCAC7B,SAAS,CAAC,SAAS,cAAc,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;wCACpE,MAAM,CAAC,MAAM,CAAC,CAAC;oCACjB,CAAC;yCAAM,CAAC;wCACN,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;oCAC5C,CAAC;gCACH,CAAC,CAAC,CAAC;4BACL,CAAC,GACD,GACE,IACE,GACJ,CACP,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,iBAAiB,CAAC;QAC5C,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,mBAAmB,aAC9B,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,8CAAgC,IAAI,CAAC,CAAC,CAAC,aAAa,cAAc,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,qBAAqB,IAAQ,EAC1J,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;gCACL,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCAClB,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,EAAE;oCAChD,KAAK,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE;iCACnC,CAAC,CAAC;gCACH,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;oCAAE,MAAM,CAAC,MAAM,CAAC,CAAC;qCACpC,CAAC;oCACJ,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;oCACpE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAE,CAAC;oCAC5E,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oCAC9C,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;wCAC1B,UAAU,CAAC,EAAE,CAAC,CAAC;wCACf,KAAK,uBAAuB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,oCAAoC;wCAC1F,MAAM,CAAC,UAAU,CAAC,CAAC;oCACrB,CAAC;;wCAAM,MAAM,CAAC,WAAW,CAAC,CAAC;gCAC7B,CAAC;4BACH,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,KAAK,WAAW,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,iBAAiB,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACnF,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAE,oBAAoB,IAAI,CAAC,KAAK,EAAE,aAC3C,IAAI,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,yBAAW,cAAc,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC,IAAI,EACpH,KAAC,GAAG,IAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAC1B,KAAC,WAAW,IACV,KAAK,EAAE,EAAE,EACT,KAAK,EAAE;gCACL,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC5E,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oCACzB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;oCAClD,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oCACxC,OAAO,EAAE,CAAC;gCACZ,CAAC;gCACD,MAAM,CAAC,QAAQ,CAAC,CAAC;4BACnB,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAChH,MAAM,KAAK,GAAG,CAAC,CAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAEhF,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAE,wBAAwB,IAAI,CAAC,KAAK,EAAE,aAChD,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,gCAAkB,GAAG,CAAC,MAAM,sGAAmE,EACvH,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,YAAG,WAAW,GAAQ,EAC3C,KAAC,SAAS,IACR,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,GAAG,EAAE;wCACb,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;4CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4CAAC,OAAO;wCAAC,CAAC;wCAClD,IAAI,OAAO,CAAC,MAAM;4CAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;oCACvC,CAAC,GACD,IACE,EACN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,aAAG,OAAO,CAAC,MAAM,YAAQ,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,IAAQ,EACtI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B,MAAC,IAAI,IAAY,IAAI,EAAC,cAAc,aAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,YAAG,CAAC,CAAC,IAAI,GAAQ,QAAE,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,aAAG,CAAC,CAAC,EAAE,QAAI,KAAK,CAAC,CAAC,CAAC,IAAQ,KAAzH,CAAC,CAAC,EAAE,CAA4H,CAC5I,CAAC,EACD,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,yCAA4B,CAAC,CAAC,CAAC,IAAI,IAC9E,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAI,GAAM,IACnH,GACJ,CACP,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,KAAC,KAAK,IAAC,KAAK,EAAE,qBAAqB,OAAO,OAAO,OAAO,CAAC,MAAM,GAAG,YAChE,KAAC,WAAW,IACV,KAAK,EAAE,EAAE,EACT,KAAK,EAAE;wBACL,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjG,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE;wBAC/C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;qBACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wBACd,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;4BAAC,MAAM,CAAC,UAAU,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBAC3D,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;4BAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACvD,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;wBAClD,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;wBACxC,OAAO,EAAE,CAAC;wBACV,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnB,CAAC,GACD,GACI,GACJ,CACP,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC,iBAAiB,CAAC;QAC/C,MAAM,SAAS,GAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9E,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,oBAAoB,aAC/B,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,8FAAgF,OAAO,IAAI,MAAM,SAAS,EAClI,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;gCACL,EAAE,KAAK,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;gCAC3E,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCACvB,KAAK,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oCAC3F,KAAK,EAAE,CAAC;iCACT,CAAC,CAAC;gCACH,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oCACzB,MAAM,CAAC,MAAM,CAAC,CAAC;oCACf,OAAO;gCACT,CAAC;gCACD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,KAAkB,CAAC;gCACxE,oBAAoB,CAAC,MAAM,CAAC,CAAC;gCAC7B,SAAS,CAAC,uBAAuB,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC;gCACtD,MAAM,CAAC,MAAM,CAAC,CAAC;4BACjB,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,iCAAiC,aAC5C,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,0BAAY,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,SAAS,EACnG,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;gCACL,EAAE,KAAK,EAAE,sCAAsC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;gCACjG,EAAE,KAAK,EAAE,iDAAiD,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;gCACpH,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oCACzB,cAAc,CAAC,CAAC,CAAC,KAA4B,CAAC,CAAC;oCAC/C,SAAS,CAAC,qBAAqB,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;gCAC5F,CAAC;gCACD,MAAM,CAAC,MAAM,CAAC,CAAC;4BACjB,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,OAAO,KAAC,WAAW,IAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAI,CAAC;IAC3J,CAAC;IAED,gCAAgC;IAChC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,oCAAoC,aAC/C,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,oGAA4F,EACpH,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,6GAAqG,EAC7H,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,sBAAc,EACnC,KAAC,SAAS,IACR,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,GAAG,EAAE;oCACb,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;oCAC7B,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wCAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;wCAAC,OAAO;oCAAC,CAAC;oCAC5G,aAAa,CAAC,GAAG,CAAC,CAAC;oCACnB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;oCACxD,MAAM,CAAC,MAAM,CAAC,CAAC;gCACjB,CAAC,GACD,IACE,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAI,GAAM,IACzG,GACJ,CACP,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,mBAAmB,aAChC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,6GAAgG,EACxH,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,mHAAiG,EACzH,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,8DAAsD,EAC9E,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACtC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACnB,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,sEAAyD,CAC5E,CAAC,CAAC,CAAC,CACF,8BACE,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,aAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAClI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oCACd,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACxG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;oCAC7E,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,YAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC5E,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC/B,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,YAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAQ,EAChE,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAQ,EACzG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EACrB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,uBAAU,KAN/D,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAOtD,CACR,CAAC;gCACJ,CAAC,CAAC,IACD,CACJ,GACG,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAI,GACtF,IACE,GACJ,CACP,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,kCAAkC,aAC7C,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,8FAAsE,OAAO,SAAS,EAC9G,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;gCACL,EAAE,KAAK,EAAE,gBAAgB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gCACzE,EAAE,KAAK,EAAE,sBAAsB,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gCACvF,EAAE,KAAK,EAAE,wBAAwB,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gCACrF,EAAE,KAAK,EAAE,oBAAoB,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;gCAC3E,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;6BACnC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oCACzB,iBAAiB,CAAC,CAAC,CAAC,KAA2C,CAAC,CAAC;oCACjE,SAAS,CAAC,kBAAkB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;gCAC1C,CAAC;gCACD,MAAM,CAAC,MAAM,CAAC,CAAC;4BACjB,CAAC,GACD,GACE,IACA,GACJ,CACP,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,OAAO,KAAC,WAAW,IAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAI,CAAC;IACvD,CAAC;IAED,OAAO,KAAC,IAAI,yBAAS,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,OAAO,EACP,MAAM,EACN,QAAQ,GAKT;IACC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0C,KAAK,CAAC,CAAC;IAEnF,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC3F,0EAA0E;QAC1E,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,QAAgB,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpI,MAAM,CAAC;YACL,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC;YACnD,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC;SACrD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,KAAK,IAAC,KAAK,EAAC,qCAAqC,aAClD,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,iCAAyB,GAAM,EAC9F,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CACjB,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAI,CAC9E,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,GAAG,GAAQ,CACnB,IACG,EACN,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,8BAAsB,GAAM,EAC5F,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAClB,KAAC,SAAS,IACR,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAC/B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,IAAI,GAAQ,CACpB,IACG,EACN,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,kCAA0B,GAAM,EAC/F,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CACjB,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAI,CAC7E,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,eAAE,GAAG,SAAS,CACpB,IACG,EACN,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,mCAA2B,GAAM,EAChG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CACjB,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAI,CAC9E,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAQ,CAC/C,IACG,EACN,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,oCAA4B,GAAM,EAClG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAClB,KAAC,SAAS,IAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAI,CAChE,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAQ,CACjD,IACG,IACF,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,4IAAoI,EAC7J,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAI,IAC9F,IACE,GACJ,CACP,CAAC;AACJ,CAAC"}
@@ -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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"}