@dexto/tui 1.8.0 → 1.8.2
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/dist/components/Footer.cjs +3 -2
- package/dist/components/Footer.d.ts.map +1 -1
- package/dist/components/Footer.js +2 -5
- package/dist/components/overlays/ApiKeyInput.d.ts +1 -1
- package/dist/components/overlays/ApiKeyInput.d.ts.map +1 -1
- package/dist/components/overlays/ConnectOverlay.cjs +423 -0
- package/dist/components/overlays/ConnectOverlay.d.ts +21 -0
- package/dist/components/overlays/ConnectOverlay.d.ts.map +1 -0
- package/dist/components/overlays/ConnectOverlay.js +412 -0
- package/dist/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/components/overlays/ModelSelectorRefactored.cjs +4 -3
- package/dist/components/overlays/ModelSelectorRefactored.d.ts +1 -1
- package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/components/overlays/ModelSelectorRefactored.js +1 -2
- package/dist/components/overlays/ReasoningOverlay.cjs +3 -3
- package/dist/components/overlays/ReasoningOverlay.js +1 -1
- package/dist/components/overlays/custom-model-wizard/provider-config.cjs +4 -3
- package/dist/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
- package/dist/components/overlays/custom-model-wizard/provider-config.js +2 -4
- package/dist/containers/InputContainer.cjs +2 -2
- package/dist/containers/InputContainer.js +1 -1
- package/dist/containers/OverlayContainer.cjs +64 -5
- package/dist/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/containers/OverlayContainer.js +60 -7
- package/dist/hooks/useAgentEvents.cjs +2 -1
- package/dist/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/hooks/useAgentEvents.js +2 -4
- package/dist/hooks/useCLIState.cjs +2 -1
- package/dist/hooks/useCLIState.d.ts.map +1 -1
- package/dist/hooks/useCLIState.js +2 -1
- package/dist/host/index.d.ts +1 -1
- package/dist/host/index.d.ts.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/interactive-commands/auth/index.cjs +9 -0
- package/dist/interactive-commands/auth/index.d.ts +1 -0
- package/dist/interactive-commands/auth/index.d.ts.map +1 -1
- package/dist/interactive-commands/auth/index.js +8 -0
- package/dist/interactive-commands/commands.cjs +3 -1
- package/dist/interactive-commands/commands.d.ts.map +1 -1
- package/dist/interactive-commands/commands.js +4 -2
- package/dist/state/types.d.ts +3 -2
- package/dist/state/types.d.ts.map +1 -1
- package/dist/utils/chatgpt-rate-limit.cjs +4 -4
- package/dist/utils/chatgpt-rate-limit.d.ts.map +1 -1
- package/dist/utils/chatgpt-rate-limit.js +1 -1
- package/dist/utils/commandOverlays.cjs +1 -0
- package/dist/utils/commandOverlays.d.ts.map +1 -1
- package/dist/utils/commandOverlays.js +1 -0
- package/dist/utils/llm-provider-display.d.ts +1 -1
- package/dist/utils/llm-provider-display.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
forwardRef,
|
|
4
|
+
useCallback,
|
|
5
|
+
useEffect,
|
|
6
|
+
useImperativeHandle,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useState
|
|
10
|
+
} from "react";
|
|
11
|
+
import { Box, Text } from "ink";
|
|
12
|
+
import open from "open";
|
|
13
|
+
import { BaseSelector } from "../base/BaseSelector.js";
|
|
14
|
+
import {
|
|
15
|
+
deleteModelAuthProfile,
|
|
16
|
+
getDefaultModelAuthProfileIdForProvider,
|
|
17
|
+
getModelAuthProfileId,
|
|
18
|
+
getProviderAuthDefinitions,
|
|
19
|
+
listSavedModelAuthProfiles,
|
|
20
|
+
markModelAuthProviderConnected,
|
|
21
|
+
saveApiKeyModelAuthProfile,
|
|
22
|
+
saveProviderApiKey,
|
|
23
|
+
setDefaultModelAuthProfile,
|
|
24
|
+
startModelAuthBrowserLogin
|
|
25
|
+
} from "@dexto/agent-management";
|
|
26
|
+
import { LLM_PROVIDERS } from "@dexto/llm";
|
|
27
|
+
import { applyLayeredEnvironmentLoading, isValidApiKeyFormat } from "../../host/index.js";
|
|
28
|
+
function methodHint(method, profile, defaultProfileId) {
|
|
29
|
+
const parts = [
|
|
30
|
+
profile ? profile.id === defaultProfileId ? "Connected (default)" : "Connected" : void 0,
|
|
31
|
+
method.hint
|
|
32
|
+
].filter((part) => Boolean(part));
|
|
33
|
+
return parts.length ? parts.join(" - ") : void 0;
|
|
34
|
+
}
|
|
35
|
+
function maskSecret(secret) {
|
|
36
|
+
if (secret.length <= 8) {
|
|
37
|
+
return "*".repeat(secret.length);
|
|
38
|
+
}
|
|
39
|
+
return `${secret.slice(0, 4)}${"*".repeat(Math.min(secret.length - 8, 24))}${secret.slice(-4)}`;
|
|
40
|
+
}
|
|
41
|
+
function toLlmProvider(providerId) {
|
|
42
|
+
const provider = LLM_PROVIDERS.find((candidate) => candidate === providerId);
|
|
43
|
+
if (!provider) {
|
|
44
|
+
throw new Error(`API-key auth is not implemented for provider: ${providerId}`);
|
|
45
|
+
}
|
|
46
|
+
return provider;
|
|
47
|
+
}
|
|
48
|
+
const ConnectOverlay = forwardRef(
|
|
49
|
+
function ConnectOverlay2({ isVisible, onDone }, ref) {
|
|
50
|
+
const selectorRef = useRef(null);
|
|
51
|
+
const loginCancelRef = useRef(null);
|
|
52
|
+
const [step, setStep] = useState("provider");
|
|
53
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
54
|
+
const [provider, setProvider] = useState(null);
|
|
55
|
+
const [method, setMethod] = useState(null);
|
|
56
|
+
const [profiles, setProfiles] = useState([]);
|
|
57
|
+
const [defaultProfileId, setDefaultProfileId] = useState(null);
|
|
58
|
+
const [apiKey, setApiKey] = useState("");
|
|
59
|
+
const [status, setStatus] = useState("Choose a provider to connect.");
|
|
60
|
+
const [error, setError] = useState(null);
|
|
61
|
+
const currentProfileId = provider && method ? getModelAuthProfileId(provider.providerId, method.id) : null;
|
|
62
|
+
const existingProfile = currentProfileId ? profiles.find((profile) => profile.id === currentProfileId) ?? null : null;
|
|
63
|
+
const close = useCallback(
|
|
64
|
+
(outcome) => {
|
|
65
|
+
void loginCancelRef.current?.();
|
|
66
|
+
loginCancelRef.current = null;
|
|
67
|
+
onDone(outcome);
|
|
68
|
+
},
|
|
69
|
+
[onDone]
|
|
70
|
+
);
|
|
71
|
+
const handleActionError = useCallback((err) => {
|
|
72
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
73
|
+
setStep("error");
|
|
74
|
+
}, []);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (!isVisible) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
setStep("provider");
|
|
80
|
+
setSelectedIndex(0);
|
|
81
|
+
setProvider(null);
|
|
82
|
+
setMethod(null);
|
|
83
|
+
setProfiles([]);
|
|
84
|
+
setDefaultProfileId(null);
|
|
85
|
+
setApiKey("");
|
|
86
|
+
setStatus("Choose a provider to connect.");
|
|
87
|
+
setError(null);
|
|
88
|
+
}, [isVisible]);
|
|
89
|
+
const providerOptions = useMemo(
|
|
90
|
+
() => getProviderAuthDefinitions().map((item) => ({
|
|
91
|
+
value: item.providerId,
|
|
92
|
+
label: item.label,
|
|
93
|
+
hint: `${item.methods.length} method${item.methods.length === 1 ? "" : "s"}`
|
|
94
|
+
})),
|
|
95
|
+
[]
|
|
96
|
+
);
|
|
97
|
+
const methodOptions = useMemo(() => {
|
|
98
|
+
if (!provider) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
return provider.methods.map((item) => {
|
|
102
|
+
const profile = profiles.find(
|
|
103
|
+
(candidate) => candidate.id === getModelAuthProfileId(provider.providerId, item.id)
|
|
104
|
+
);
|
|
105
|
+
return {
|
|
106
|
+
value: item.id,
|
|
107
|
+
label: item.label,
|
|
108
|
+
hint: methodHint(item, profile, defaultProfileId)
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
}, [defaultProfileId, profiles, provider]);
|
|
112
|
+
const existingActionOptions = useMemo(() => {
|
|
113
|
+
if (!existingProfile) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
return [
|
|
117
|
+
{
|
|
118
|
+
value: "use",
|
|
119
|
+
label: existingProfile.id === defaultProfileId ? "Keep as default" : "Use existing",
|
|
120
|
+
hint: existingProfile.id === defaultProfileId ? "No changes" : "Set this method as provider default"
|
|
121
|
+
},
|
|
122
|
+
{ value: "replace", label: "Replace credentials", hint: "Reconnect this method" },
|
|
123
|
+
{
|
|
124
|
+
value: "delete",
|
|
125
|
+
label: "Delete credentials",
|
|
126
|
+
...existingProfile.id === defaultProfileId ? { hint: "Also clears default" } : {}
|
|
127
|
+
}
|
|
128
|
+
];
|
|
129
|
+
}, [defaultProfileId, existingProfile]);
|
|
130
|
+
const activeItems = step === "provider" ? providerOptions : step === "method" ? methodOptions : step === "existing-action" ? existingActionOptions : [];
|
|
131
|
+
const loadProvider = useCallback(async (nextProvider) => {
|
|
132
|
+
setProvider(nextProvider);
|
|
133
|
+
setMethod(null);
|
|
134
|
+
setStatus(`Loading saved ${nextProvider.label} profiles...`);
|
|
135
|
+
const [savedProfiles, savedDefaultProfileId] = await Promise.all([
|
|
136
|
+
listSavedModelAuthProfiles(nextProvider.providerId),
|
|
137
|
+
getDefaultModelAuthProfileIdForProvider(nextProvider.providerId)
|
|
138
|
+
]);
|
|
139
|
+
setProfiles(savedProfiles);
|
|
140
|
+
setDefaultProfileId(savedDefaultProfileId);
|
|
141
|
+
setSelectedIndex(0);
|
|
142
|
+
setStatus(`Choose how to connect ${nextProvider.label}.`);
|
|
143
|
+
setStep("method");
|
|
144
|
+
}, []);
|
|
145
|
+
const saveApiKey = useCallback(async () => {
|
|
146
|
+
if (!provider || !method) {
|
|
147
|
+
close({ outcome: "cancelled" });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const trimmed = apiKey.trim();
|
|
151
|
+
if (!trimmed) {
|
|
152
|
+
setError("API key is required");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const llmProvider = toLlmProvider(provider.providerId);
|
|
156
|
+
if (!isValidApiKeyFormat(trimmed, llmProvider)) {
|
|
157
|
+
setError(`${provider.label} API key format is invalid`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
setError(null);
|
|
161
|
+
try {
|
|
162
|
+
setStatus(`Saving ${provider.label} API key...`);
|
|
163
|
+
await saveProviderApiKey(llmProvider, trimmed, process.cwd());
|
|
164
|
+
await applyLayeredEnvironmentLoading();
|
|
165
|
+
await saveApiKeyModelAuthProfile(llmProvider);
|
|
166
|
+
await markModelAuthProviderConnected(provider.providerId);
|
|
167
|
+
close({
|
|
168
|
+
outcome: "success",
|
|
169
|
+
providerId: provider.providerId,
|
|
170
|
+
message: `Connected ${provider.label} (${method.label})`
|
|
171
|
+
});
|
|
172
|
+
} catch (err) {
|
|
173
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
174
|
+
}
|
|
175
|
+
}, [apiKey, close, method, provider]);
|
|
176
|
+
const connectOAuth = useCallback(
|
|
177
|
+
async (nextProvider, nextMethod) => {
|
|
178
|
+
setStep("oauth-progress");
|
|
179
|
+
setStatus(`Starting ${nextMethod.label}...`);
|
|
180
|
+
let timeout = null;
|
|
181
|
+
try {
|
|
182
|
+
const login = await startModelAuthBrowserLogin({
|
|
183
|
+
providerId: nextProvider.providerId,
|
|
184
|
+
methodId: nextMethod.id
|
|
185
|
+
});
|
|
186
|
+
loginCancelRef.current = login.cancel;
|
|
187
|
+
setStatus(`Opening browser for ${nextMethod.label}...`);
|
|
188
|
+
await open(login.authUrl).catch(() => void 0);
|
|
189
|
+
setStatus("Waiting for browser authorization...");
|
|
190
|
+
await Promise.race([
|
|
191
|
+
login.waitForProfile(),
|
|
192
|
+
new Promise((_, reject) => {
|
|
193
|
+
timeout = setTimeout(
|
|
194
|
+
() => reject(new Error(`${nextMethod.label} timed out`)),
|
|
195
|
+
5 * 60 * 1e3
|
|
196
|
+
);
|
|
197
|
+
})
|
|
198
|
+
]);
|
|
199
|
+
await markModelAuthProviderConnected(nextProvider.providerId);
|
|
200
|
+
close({
|
|
201
|
+
outcome: "success",
|
|
202
|
+
providerId: nextProvider.providerId,
|
|
203
|
+
message: `Connected ${nextProvider.label} (${nextMethod.label})`
|
|
204
|
+
});
|
|
205
|
+
} catch (err) {
|
|
206
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
207
|
+
setStep("error");
|
|
208
|
+
} finally {
|
|
209
|
+
if (timeout) {
|
|
210
|
+
clearTimeout(timeout);
|
|
211
|
+
}
|
|
212
|
+
await loginCancelRef.current?.();
|
|
213
|
+
loginCancelRef.current = null;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
[close]
|
|
217
|
+
);
|
|
218
|
+
const startConnect = useCallback(async () => {
|
|
219
|
+
if (!provider || !method) {
|
|
220
|
+
close({ outcome: "cancelled" });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (method.kind === "api_key") {
|
|
224
|
+
setApiKey("");
|
|
225
|
+
setError(null);
|
|
226
|
+
setStatus(`Enter your ${provider.label} API key.`);
|
|
227
|
+
setStep("api-key");
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (method.kind === "oauth") {
|
|
231
|
+
await connectOAuth(provider, method);
|
|
232
|
+
}
|
|
233
|
+
}, [close, connectOAuth, method, provider]);
|
|
234
|
+
const handleSelect = useCallback(
|
|
235
|
+
async (option) => {
|
|
236
|
+
if (step === "provider") {
|
|
237
|
+
const nextProvider = getProviderAuthDefinitions().find(
|
|
238
|
+
(candidate) => candidate.providerId === option.value
|
|
239
|
+
);
|
|
240
|
+
if (nextProvider) {
|
|
241
|
+
await loadProvider(nextProvider);
|
|
242
|
+
}
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (step === "method" && provider) {
|
|
246
|
+
const nextMethod = provider.methods.find(
|
|
247
|
+
(candidate) => candidate.id === option.value
|
|
248
|
+
);
|
|
249
|
+
if (nextMethod) {
|
|
250
|
+
setMethod(nextMethod);
|
|
251
|
+
const profileId = getModelAuthProfileId(provider.providerId, nextMethod.id);
|
|
252
|
+
if (profiles.some((item) => item.id === profileId)) {
|
|
253
|
+
setStatus(`Manage ${provider.label} ${nextMethod.label}.`);
|
|
254
|
+
setStep("existing-action");
|
|
255
|
+
setSelectedIndex(0);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (nextMethod.kind === "api_key") {
|
|
259
|
+
setApiKey("");
|
|
260
|
+
setError(null);
|
|
261
|
+
setStatus(`Enter your ${provider.label} API key.`);
|
|
262
|
+
setStep("api-key");
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (nextMethod.kind === "oauth") {
|
|
266
|
+
await connectOAuth(provider, nextMethod);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (step === "existing-action" && provider && method && currentProfileId) {
|
|
272
|
+
if (option.value === "use") {
|
|
273
|
+
await setDefaultModelAuthProfile({
|
|
274
|
+
providerId: provider.providerId,
|
|
275
|
+
profileId: currentProfileId
|
|
276
|
+
});
|
|
277
|
+
close({
|
|
278
|
+
outcome: "success",
|
|
279
|
+
providerId: provider.providerId,
|
|
280
|
+
message: `Using ${provider.label} ${method.label}`
|
|
281
|
+
});
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (option.value === "replace") {
|
|
285
|
+
await startConnect();
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (option.value === "delete") {
|
|
289
|
+
setStatus(`Press Enter to delete ${provider.label} ${method.label}.`);
|
|
290
|
+
setStep("delete-confirm");
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
[
|
|
295
|
+
close,
|
|
296
|
+
connectOAuth,
|
|
297
|
+
currentProfileId,
|
|
298
|
+
loadProvider,
|
|
299
|
+
method,
|
|
300
|
+
profiles,
|
|
301
|
+
provider,
|
|
302
|
+
startConnect,
|
|
303
|
+
step
|
|
304
|
+
]
|
|
305
|
+
);
|
|
306
|
+
useImperativeHandle(
|
|
307
|
+
ref,
|
|
308
|
+
() => ({
|
|
309
|
+
handleInput: (input, key) => {
|
|
310
|
+
if (!isVisible) return false;
|
|
311
|
+
if (step === "api-key") {
|
|
312
|
+
if (key.escape) {
|
|
313
|
+
close({ outcome: "cancelled" });
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
if (key.return) {
|
|
317
|
+
void saveApiKey().catch(handleActionError);
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
if (key.backspace || key.delete) {
|
|
321
|
+
setApiKey((prev) => prev.slice(0, -1));
|
|
322
|
+
setError(null);
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
if (input && !key.ctrl && !key.meta) {
|
|
326
|
+
setApiKey((prev) => prev + input);
|
|
327
|
+
setError(null);
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
if (step === "delete-confirm") {
|
|
333
|
+
if (key.escape) {
|
|
334
|
+
close({ outcome: "cancelled" });
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
if (key.return && provider && method && currentProfileId) {
|
|
338
|
+
void deleteModelAuthProfile(currentProfileId).then(
|
|
339
|
+
() => close({
|
|
340
|
+
outcome: "success",
|
|
341
|
+
providerId: provider.providerId,
|
|
342
|
+
message: `Deleted ${provider.label} ${method.label}`
|
|
343
|
+
})
|
|
344
|
+
).catch(handleActionError);
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
if (step === "oauth-progress") {
|
|
350
|
+
if (key.escape) {
|
|
351
|
+
close({ outcome: "cancelled" });
|
|
352
|
+
}
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
if (step === "error") {
|
|
356
|
+
if (key.escape || key.return) {
|
|
357
|
+
close({ outcome: "closed" });
|
|
358
|
+
}
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
return selectorRef.current?.handleInput(input, key) ?? false;
|
|
362
|
+
}
|
|
363
|
+
}),
|
|
364
|
+
[
|
|
365
|
+
close,
|
|
366
|
+
currentProfileId,
|
|
367
|
+
handleActionError,
|
|
368
|
+
isVisible,
|
|
369
|
+
method,
|
|
370
|
+
provider,
|
|
371
|
+
saveApiKey,
|
|
372
|
+
step
|
|
373
|
+
]
|
|
374
|
+
);
|
|
375
|
+
if (!isVisible) return null;
|
|
376
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [
|
|
377
|
+
/* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "Connect Model Provider" }) }),
|
|
378
|
+
/* @__PURE__ */ jsx(Text, { color: error ? "red" : "gray", children: error ?? status }),
|
|
379
|
+
step === "api-key" ? /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
380
|
+
/* @__PURE__ */ jsx(Text, { children: maskSecret(apiKey) }),
|
|
381
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "Enter save \u2022 Esc cancel" })
|
|
382
|
+
] }) : step === "delete-confirm" ? /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
383
|
+
/* @__PURE__ */ jsx(Text, { color: "red", children: "This removes saved credentials for this method." }),
|
|
384
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "Enter delete \u2022 Esc cancel" })
|
|
385
|
+
] }) : step === "oauth-progress" ? /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: "gray", children: "Esc cancel" }) }) : step === "error" ? /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: "gray", children: "Enter close \u2022 Esc close" }) }) : /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(
|
|
386
|
+
BaseSelector,
|
|
387
|
+
{
|
|
388
|
+
ref: selectorRef,
|
|
389
|
+
items: activeItems,
|
|
390
|
+
isVisible: true,
|
|
391
|
+
selectedIndex,
|
|
392
|
+
onSelectIndex: setSelectedIndex,
|
|
393
|
+
onSelect: (item) => void handleSelect(item).catch(handleActionError),
|
|
394
|
+
onClose: () => close({ outcome: "cancelled" }),
|
|
395
|
+
title: step === "provider" ? "Providers" : step === "method" ? `${provider?.label ?? "Provider"} methods` : "Existing profile",
|
|
396
|
+
formatItem: (item, selected) => /* @__PURE__ */ jsxs(Text, { ...selected ? { color: "cyan" } : {}, children: [
|
|
397
|
+
selected ? "\u203A " : " ",
|
|
398
|
+
item.label,
|
|
399
|
+
item.hint ? /* @__PURE__ */ jsxs(Text, { color: "gray", children: [
|
|
400
|
+
" \u2014 ",
|
|
401
|
+
item.hint
|
|
402
|
+
] }) : null
|
|
403
|
+
] })
|
|
404
|
+
}
|
|
405
|
+
) })
|
|
406
|
+
] });
|
|
407
|
+
}
|
|
408
|
+
);
|
|
409
|
+
var ConnectOverlay_default = ConnectOverlay;
|
|
410
|
+
export {
|
|
411
|
+
ConnectOverlay_default as default
|
|
412
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomModelWizard.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/CustomModelWizard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAGH,KAAK,WAAW,EAMnB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomModelWizard.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/CustomModelWizard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAGH,KAAK,WAAW,EAMnB,MAAM,yBAAyB,CAAC;AAqBjC,UAAU,sBAAsB;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uEAAuE;IACvE,YAAY,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED;;;GAGG;AACH,QAAA,MAAM,iBAAiB,wGA4YtB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -25,6 +25,7 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
25
25
|
var import_react = require("react");
|
|
26
26
|
var import_ink = require("ink");
|
|
27
27
|
var import_useTerminalSize = require("../../hooks/useTerminalSize.js");
|
|
28
|
+
var import_llm = require("@dexto/llm");
|
|
28
29
|
var import_core = require("@dexto/core");
|
|
29
30
|
var import_agent_management = require("@dexto/agent-management");
|
|
30
31
|
var import_llm_provider_display = require("../../utils/llm-provider-display.js");
|
|
@@ -368,7 +369,7 @@ const ModelSelector = (0, import_react.forwardRef)(function ModelSelector2({
|
|
|
368
369
|
const [refreshVersion, setRefreshVersion] = (0, import_react.useState)(0);
|
|
369
370
|
const reasoningVariantOptions = (0, import_react.useMemo)(() => {
|
|
370
371
|
if (!pendingReasoningModel) return [];
|
|
371
|
-
const support = (0,
|
|
372
|
+
const support = (0, import_llm.getReasoningProfile)(
|
|
372
373
|
pendingReasoningModel.provider,
|
|
373
374
|
pendingReasoningModel.name
|
|
374
375
|
);
|
|
@@ -584,7 +585,7 @@ const ModelSelector = (0, import_react.forwardRef)(function ModelSelector2({
|
|
|
584
585
|
const releaseDate = resolveReleaseDate("openai", configured.model) ?? resolveReleaseDate("openrouter", configured.model);
|
|
585
586
|
addChatGPTCodexModel({
|
|
586
587
|
model: configured.model,
|
|
587
|
-
displayName: (0,
|
|
588
|
+
displayName: (0, import_llm.getModelDisplayName)(configured.model, "openai"),
|
|
588
589
|
isDefault: defaultConfig ? matchesConfiguredModel(
|
|
589
590
|
{
|
|
590
591
|
provider: "openai-compatible",
|
|
@@ -897,7 +898,7 @@ const ModelSelector = (0, import_react.forwardRef)(function ModelSelector2({
|
|
|
897
898
|
}
|
|
898
899
|
};
|
|
899
900
|
const beginReasoningVariantSelection = (item, settingDefault) => {
|
|
900
|
-
const support = (0,
|
|
901
|
+
const support = (0, import_llm.getReasoningProfile)(item.provider, item.name);
|
|
901
902
|
if (!support.capable) {
|
|
902
903
|
return false;
|
|
903
904
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Custom models support (add/edit/delete via arrow navigation)
|
|
6
6
|
*/
|
|
7
7
|
import type { Key } from '../../hooks/useInputOrchestrator.js';
|
|
8
|
-
import type { LLMProvider, ReasoningVariant } from '@dexto/
|
|
8
|
+
import type { LLMProvider, ReasoningVariant } from '@dexto/llm';
|
|
9
9
|
import { type CustomModel } from '@dexto/agent-management';
|
|
10
10
|
import type { TuiAgentBackend } from '../../agent-backend.js';
|
|
11
11
|
interface ModelSelectorProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAahE,OAAO,EASH,KAAK,WAAW,EAEnB,MAAM,yBAAyB,CAAC;AAUjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA2S9D,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,gBAAgB,KAClC,IAAI,CAAC;IACV,iBAAiB,EAAE,CACf,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,gBAAgB,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAgJD;;GAEG;AACH,QAAA,MAAM,aAAa,oHAy2CjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from "react";
|
|
11
11
|
import { Box, Text } from "ink";
|
|
12
12
|
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
13
|
+
import { getModelDisplayName, getReasoningProfile } from "@dexto/llm";
|
|
13
14
|
import {
|
|
14
15
|
CodexAppServerClient,
|
|
15
16
|
createCodexBaseURL,
|
|
@@ -17,9 +18,7 @@ import {
|
|
|
17
18
|
DEFAULT_OLLAMA_URL,
|
|
18
19
|
getLocalModelById,
|
|
19
20
|
getCuratedModelRefsForProviders,
|
|
20
|
-
getModelDisplayName,
|
|
21
21
|
getOpenRouterModelCacheInfo,
|
|
22
|
-
getReasoningProfile,
|
|
23
22
|
parseCodexBaseURL,
|
|
24
23
|
refreshOpenRouterModelCache
|
|
25
24
|
} from "@dexto/core";
|
|
@@ -34,7 +34,7 @@ module.exports = __toCommonJS(ReasoningOverlay_exports);
|
|
|
34
34
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
35
35
|
var import_react = __toESM(require("react"), 1);
|
|
36
36
|
var import_ink = require("ink");
|
|
37
|
-
var
|
|
37
|
+
var import_llm = require("@dexto/llm");
|
|
38
38
|
var import_llm_provider_display = require("../../utils/llm-provider-display.js");
|
|
39
39
|
const ReasoningOverlay = import_react.default.forwardRef(
|
|
40
40
|
function ReasoningOverlay2({
|
|
@@ -55,7 +55,7 @@ const ReasoningOverlay = import_react.default.forwardRef(
|
|
|
55
55
|
const llmConfig = agent.getCurrentLLMConfig(sessionId || void 0);
|
|
56
56
|
const provider = llmConfig.provider;
|
|
57
57
|
const model = llmConfig.model;
|
|
58
|
-
const support = (0,
|
|
58
|
+
const support = (0, import_llm.getReasoningProfile)(provider, model);
|
|
59
59
|
const currentVariant = llmConfig.reasoning?.variant ?? support.defaultVariant ?? "default";
|
|
60
60
|
const currentBudgetTokens = llmConfig.reasoning?.budgetTokens;
|
|
61
61
|
const menuItems = (0, import_react.useMemo)(() => {
|
|
@@ -216,7 +216,7 @@ const ReasoningOverlay = import_react.default.forwardRef(
|
|
|
216
216
|
);
|
|
217
217
|
if (!isVisible) return null;
|
|
218
218
|
const providerLabel = (0, import_llm_provider_display.getLLMProviderDisplayName)(provider, llmConfig.baseURL);
|
|
219
|
-
const modelLabel = (0,
|
|
219
|
+
const modelLabel = (0, import_llm.getModelDisplayName)(model);
|
|
220
220
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
221
221
|
import_ink.Box,
|
|
222
222
|
{
|
|
@@ -8,7 +8,7 @@ import React, {
|
|
|
8
8
|
useState
|
|
9
9
|
} from "react";
|
|
10
10
|
import { Box, Text } from "ink";
|
|
11
|
-
import { getModelDisplayName, getReasoningProfile } from "@dexto/
|
|
11
|
+
import { getModelDisplayName, getReasoningProfile } from "@dexto/llm";
|
|
12
12
|
import { getLLMProviderDisplayName } from "../../utils/llm-provider-display.js";
|
|
13
13
|
const ReasoningOverlay = React.forwardRef(
|
|
14
14
|
function ReasoningOverlay2({
|
|
@@ -38,6 +38,7 @@ __export(provider_config_exports, {
|
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(provider_config_exports);
|
|
40
40
|
var import_agent_management = require("@dexto/agent-management");
|
|
41
|
+
var import_llm = require("@dexto/llm");
|
|
41
42
|
var import_core = require("@dexto/core");
|
|
42
43
|
var import_types = require("./types.js");
|
|
43
44
|
var fs = __toESM(require("fs"), 1);
|
|
@@ -69,7 +70,7 @@ const REASONING_PRESET_STEP = {
|
|
|
69
70
|
required: false,
|
|
70
71
|
condition: (values) => {
|
|
71
72
|
const modelName = values.name || "";
|
|
72
|
-
return (0,
|
|
73
|
+
return (0, import_llm.isReasoningCapableModel)(modelName);
|
|
73
74
|
}
|
|
74
75
|
};
|
|
75
76
|
function parseReasoningVariant(value) {
|
|
@@ -79,9 +80,9 @@ function parseReasoningVariant(value) {
|
|
|
79
80
|
function resolveReasoningOverride(provider, modelName, rawVariant) {
|
|
80
81
|
const variant = parseReasoningVariant(rawVariant);
|
|
81
82
|
if (!variant) return void 0;
|
|
82
|
-
const profile = (0,
|
|
83
|
+
const profile = (0, import_llm.getReasoningProfile)(provider, modelName);
|
|
83
84
|
if (!profile.capable) return void 0;
|
|
84
|
-
if (!(0,
|
|
85
|
+
if (!(0, import_llm.supportsReasoningVariant)(profile, variant)) return void 0;
|
|
85
86
|
if (variant === profile.defaultVariant) return void 0;
|
|
86
87
|
return { variant };
|
|
87
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-config.d.ts","sourceRoot":"","sources":["../../../../src/components/overlays/custom-model-wizard/provider-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-config.d.ts","sourceRoot":"","sources":["../../../../src/components/overlays/custom-model-wizard/provider-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAShF,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAyE7D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,mBAAmB,EAAE,cAAc,CA2cxE,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,cAAc,CAE/E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAGtE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,mBAAmB,EAAE,CAW7D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAIrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { CUSTOM_MODEL_PROVIDERS, isDextoAuthEnabled } from "@dexto/agent-management";
|
|
2
2
|
import {
|
|
3
|
-
lookupOpenRouterModel,
|
|
4
|
-
refreshOpenRouterModelCache,
|
|
5
|
-
getLocalModelById,
|
|
6
3
|
isReasoningCapableModel,
|
|
7
4
|
getReasoningProfile,
|
|
8
5
|
supportsReasoningVariant
|
|
9
|
-
} from "@dexto/
|
|
6
|
+
} from "@dexto/llm";
|
|
7
|
+
import { lookupOpenRouterModel, refreshOpenRouterModelCache, getLocalModelById } from "@dexto/core";
|
|
10
8
|
import { validators } from "./types.js";
|
|
11
9
|
import * as fs from "fs";
|
|
12
10
|
import * as os from "os";
|
|
@@ -33,7 +33,7 @@ __export(InputContainer_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(InputContainer_exports);
|
|
34
34
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
35
35
|
var import_react = __toESM(require("react"), 1);
|
|
36
|
-
var
|
|
36
|
+
var import_llm = require("@dexto/llm");
|
|
37
37
|
var import_InputArea = require("../components/input/InputArea.js");
|
|
38
38
|
var import_services = require("../services/index.js");
|
|
39
39
|
var import_contexts = require("../contexts/index.js");
|
|
@@ -274,7 +274,7 @@ const InputContainer = (0, import_react.forwardRef)(
|
|
|
274
274
|
if (ui.isProcessing) return;
|
|
275
275
|
const sessionId = session.id || void 0;
|
|
276
276
|
const current = agent.getCurrentLLMConfig(sessionId);
|
|
277
|
-
const support = (0,
|
|
277
|
+
const support = (0, import_llm.getReasoningProfile)(current.provider, current.model);
|
|
278
278
|
if (!support.capable || support.supportedVariants.length === 0) {
|
|
279
279
|
setMessages((prev) => [
|
|
280
280
|
...prev,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import React, { useCallback, useRef, useEffect, useImperativeHandle, forwardRef } from "react";
|
|
3
|
-
import { getReasoningProfile } from "@dexto/
|
|
3
|
+
import { getReasoningProfile } from "@dexto/llm";
|
|
4
4
|
import { InputArea } from "../components/input/InputArea.js";
|
|
5
5
|
import { processStream } from "../services/index.js";
|
|
6
6
|
import { useSoundService } from "../contexts/index.js";
|