@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.
Files changed (51) hide show
  1. package/dist/components/Footer.cjs +3 -2
  2. package/dist/components/Footer.d.ts.map +1 -1
  3. package/dist/components/Footer.js +2 -5
  4. package/dist/components/overlays/ApiKeyInput.d.ts +1 -1
  5. package/dist/components/overlays/ApiKeyInput.d.ts.map +1 -1
  6. package/dist/components/overlays/ConnectOverlay.cjs +423 -0
  7. package/dist/components/overlays/ConnectOverlay.d.ts +21 -0
  8. package/dist/components/overlays/ConnectOverlay.d.ts.map +1 -0
  9. package/dist/components/overlays/ConnectOverlay.js +412 -0
  10. package/dist/components/overlays/CustomModelWizard.d.ts.map +1 -1
  11. package/dist/components/overlays/ModelSelectorRefactored.cjs +4 -3
  12. package/dist/components/overlays/ModelSelectorRefactored.d.ts +1 -1
  13. package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  14. package/dist/components/overlays/ModelSelectorRefactored.js +1 -2
  15. package/dist/components/overlays/ReasoningOverlay.cjs +3 -3
  16. package/dist/components/overlays/ReasoningOverlay.js +1 -1
  17. package/dist/components/overlays/custom-model-wizard/provider-config.cjs +4 -3
  18. package/dist/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
  19. package/dist/components/overlays/custom-model-wizard/provider-config.js +2 -4
  20. package/dist/containers/InputContainer.cjs +2 -2
  21. package/dist/containers/InputContainer.js +1 -1
  22. package/dist/containers/OverlayContainer.cjs +64 -5
  23. package/dist/containers/OverlayContainer.d.ts.map +1 -1
  24. package/dist/containers/OverlayContainer.js +60 -7
  25. package/dist/hooks/useAgentEvents.cjs +2 -1
  26. package/dist/hooks/useAgentEvents.d.ts.map +1 -1
  27. package/dist/hooks/useAgentEvents.js +2 -4
  28. package/dist/hooks/useCLIState.cjs +2 -1
  29. package/dist/hooks/useCLIState.d.ts.map +1 -1
  30. package/dist/hooks/useCLIState.js +2 -1
  31. package/dist/host/index.d.ts +1 -1
  32. package/dist/host/index.d.ts.map +1 -1
  33. package/dist/index.d.cts +2 -1
  34. package/dist/interactive-commands/auth/index.cjs +9 -0
  35. package/dist/interactive-commands/auth/index.d.ts +1 -0
  36. package/dist/interactive-commands/auth/index.d.ts.map +1 -1
  37. package/dist/interactive-commands/auth/index.js +8 -0
  38. package/dist/interactive-commands/commands.cjs +3 -1
  39. package/dist/interactive-commands/commands.d.ts.map +1 -1
  40. package/dist/interactive-commands/commands.js +4 -2
  41. package/dist/state/types.d.ts +3 -2
  42. package/dist/state/types.d.ts.map +1 -1
  43. package/dist/utils/chatgpt-rate-limit.cjs +4 -4
  44. package/dist/utils/chatgpt-rate-limit.d.ts.map +1 -1
  45. package/dist/utils/chatgpt-rate-limit.js +1 -1
  46. package/dist/utils/commandOverlays.cjs +1 -0
  47. package/dist/utils/commandOverlays.d.ts.map +1 -1
  48. package/dist/utils/commandOverlays.js +1 -0
  49. package/dist/utils/llm-provider-display.d.ts +1 -1
  50. package/dist/utils/llm-provider-display.d.ts.map +1 -1
  51. 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;AAoBjC,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"}
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, import_core.getReasoningProfile)(
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, import_core.getModelDisplayName)(configured.model, "openai"),
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, import_core.getReasoningProfile)(item.provider, item.name);
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/core';
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;AAE/D,OAAO,KAAK,EAAkB,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAcjF,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"}
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 import_core = require("@dexto/core");
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, import_core.getReasoningProfile)(provider, model);
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, import_core.getModelDisplayName)(model);
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/core";
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, import_core.isReasoningCapableModel)(modelName);
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, import_core.getReasoningProfile)(provider, modelName);
83
+ const profile = (0, import_llm.getReasoningProfile)(provider, modelName);
83
84
  if (!profile.capable) return void 0;
84
- if (!(0, import_core.supportsReasoningVariant)(profile, variant)) return void 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;AAWhF,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
+ {"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/core";
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 import_core = require("@dexto/core");
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, import_core.getReasoningProfile)(current.provider, current.model);
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/core";
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";