Skip to content

Commit 00d4fbf

Browse files
lxrzlyrclaude
andcommitted
feat(provider): surface config errors + improve provider/log diagnostics
Help users (esp. on Windows) understand why a third-party provider was not imported, and make upstream/log diagnostics easier to collect. Provider config errors (stage 1): - Capture JsonError/InvalidError per global config file into a ConfigError collector instead of letting one bad file zero out the whole global config (orElseSucceed used to swallow it); expose via Config.getErrors(). - Add optional `errors` to Provider.ListResult + ProviderConfigError schema; provider list handler returns them. Regenerate SDK types. - Render config errors in Settings -> Providers -> Connected providers with a danger tag and JSON/schema reason + message. i18n across all locales. Upstream error logging (executor.ts): - providerMessage now includes host + requestId + original upstream body so relay-gateway errors (e.g. HTTP 429) are attributable at a glance. Log export diagnostics (CLI + desktop): - New `deepagent-code debug logs` command (--since, --out) bundling the real log dir (~/.deepagent/code/log) for CLI/WSL/headless users. - Fix serverLogRoots() so one-click export actually collects the real log dir (root cause of Windows users not finding logs); parameterize the time window and let users pick a save path. Add command-palette entries + i18n. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 32ae45d commit 00d4fbf

43 files changed

Lines changed: 1728 additions & 50 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/app/src/app.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ declare global {
7676
}
7777
api?: {
7878
setTitlebar?: (theme: { mode: "light" | "dark" }) => Promise<void>
79-
exportDebugLogs?: () => Promise<string>
79+
exportDebugLogs?: (options?: { windowMs?: number; pick?: boolean }) => Promise<string | null>
8080
}
8181
}
8282
}

packages/app/src/components/settings-v2/providers.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ export const SettingsProvidersV2: Component = () => {
4848
.filter((p) => popularProviders.includes(p.id) || isConfigCustom(p.id))
4949
})
5050

51+
const configErrors = createMemo(() => providers.errors())
52+
53+
const errorKindLabel = (kind: string) =>
54+
kind === "json"
55+
? language.t("settings.providers.error.json")
56+
: language.t("settings.providers.error.schema")
57+
5158
const popular = createMemo(() => {
5259
const connectedIDs = new Set(connected().map((p) => p.id))
5360
const items = providers
@@ -141,11 +148,36 @@ export const SettingsProvidersV2: Component = () => {
141148
<h3 class="settings-v2-section-title">{language.t("settings.providers.section.connected")}</h3>
142149
<SettingsListV2>
143150
<Show
144-
when={connected().length > 0}
151+
when={connected().length > 0 || configErrors().length > 0}
145152
fallback={
146153
<div class="settings-v2-provider-empty">{language.t("settings.providers.connected.empty")}</div>
147154
}
148155
>
156+
<For each={configErrors()}>
157+
{(error) => (
158+
<div class="settings-v2-provider-row" data-component="provider-config-error">
159+
<div class="settings-v2-provider-lead">
160+
<ProviderIcon
161+
id="synthetic"
162+
width={PROVIDER_ICON_SIZE}
163+
height={PROVIDER_ICON_SIZE}
164+
class="settings-v2-provider-icon shrink-0"
165+
/>
166+
<div class="settings-v2-provider-copy">
167+
<div class="settings-v2-provider-main">
168+
<span class="settings-v2-provider-name truncate">{error.source}</span>
169+
<Tag class="settings-v2-provider-error-tag">
170+
{language.t("settings.providers.tag.configError")}
171+
</Tag>
172+
</div>
173+
<p class="settings-v2-provider-description">
174+
{errorKindLabel(error.kind)}: {error.message}
175+
</p>
176+
</div>
177+
</div>
178+
</div>
179+
)}
180+
</For>
149181
<For each={connected()}>
150182
{(item) => (
151183
<div

packages/app/src/components/settings-v2/settings-v2.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,17 @@
277277
color: var(--v2-text-text-muted);
278278
}
279279

280+
.settings-v2-provider-error-tag {
281+
border-color: var(--v2-state-border-danger);
282+
color: var(--v2-state-fg-danger);
283+
}
284+
285+
[data-component="provider-config-error"] .settings-v2-provider-description {
286+
color: var(--v2-state-fg-danger);
287+
line-height: 1.35;
288+
word-break: break-word;
289+
}
290+
280291
.settings-v2-provider-empty {
281292
padding-block: 20px;
282293
font-size: 13px;

packages/app/src/context/platform.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ type PlatformBase = {
104104
readClipboardImage?(): Promise<File | null>
105105

106106
/** Export collected diagnostic logs (desktop only) */
107-
exportDebugLogs?(): Promise<string>
107+
exportDebugLogs?(options?: { windowMs?: number; pick?: boolean }): Promise<string | null>
108108

109109
/** Record a fatal renderer error in platform logs (desktop only) */
110110
recordFatalRendererError?(error: FatalRendererErrorLog): Promise<void>

packages/app/src/hooks/use-providers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export function useProviders() {
2828
return {
2929
all: () => providers().all,
3030
default: () => providers().default,
31+
errors: () => providers().errors ?? [],
3132
popular: () =>
3233
pipe(
3334
providers().all,

packages/app/src/i18n/ar.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,9 @@ export const dict = {
677677
"settings.providers.tag.config": "التكوين",
678678
"settings.providers.tag.custom": "مخصص",
679679
"settings.providers.tag.other": "أخرى",
680+
"settings.providers.tag.configError": "خطأ في الإعداد",
681+
"settings.providers.error.json": "خطأ في بناء JSON",
682+
"settings.providers.error.schema": "حقول غير صالحة",
680683
"settings.models.title": "النماذج",
681684
"settings.models.description": "ستكون إعدادات النموذج قابلة للتكوين هنا.",
682685
"settings.agents.title": "الوكلاء",

packages/app/src/i18n/br.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,9 @@ export const dict = {
689689
"settings.providers.tag.config": "Configuração",
690690
"settings.providers.tag.custom": "Personalizado",
691691
"settings.providers.tag.other": "Outro",
692+
"settings.providers.tag.configError": "Erro de configuração",
693+
"settings.providers.error.json": "Erro de sintaxe JSON",
694+
"settings.providers.error.schema": "Campo(s) inválido(s)",
692695
"settings.models.title": "Modelos",
693696
"settings.models.description": "Configurações de modelos estarão disponíveis aqui.",
694697
"settings.agents.title": "Agentes",

packages/app/src/i18n/bs.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,9 @@ export const dict = {
761761
"settings.providers.tag.config": "Konfiguracija",
762762
"settings.providers.tag.custom": "Prilagođeno",
763763
"settings.providers.tag.other": "Ostalo",
764+
"settings.providers.tag.configError": "Greška u konfiguraciji",
765+
"settings.providers.error.json": "Greška u JSON sintaksi",
766+
"settings.providers.error.schema": "Nevažeća polja",
764767
"settings.models.title": "Modeli",
765768
"settings.models.description": "Postavke modela će se ovdje moći podešavati.",
766769
"settings.agents.title": "Agenti",

packages/app/src/i18n/da.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,9 @@ export const dict = {
754754
"settings.providers.tag.config": "Konfiguration",
755755
"settings.providers.tag.custom": "Brugerdefineret",
756756
"settings.providers.tag.other": "Andet",
757+
"settings.providers.tag.configError": "Konfigurationsfejl",
758+
"settings.providers.error.json": "JSON-syntaksfejl",
759+
"settings.providers.error.schema": "Ugyldige felter",
757760
"settings.models.title": "Modeller",
758761
"settings.models.description": "Modelindstillinger vil kunne konfigureres her.",
759762
"settings.agents.title": "Agenter",

packages/app/src/i18n/de.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,9 @@ export const dict = {
699699
"settings.providers.tag.config": "Konfiguration",
700700
"settings.providers.tag.custom": "Benutzerdefiniert",
701701
"settings.providers.tag.other": "Andere",
702+
"settings.providers.tag.configError": "Konfigurationsfehler",
703+
"settings.providers.error.json": "JSON-Syntaxfehler",
704+
"settings.providers.error.schema": "Ungültige Felder",
702705
"settings.models.title": "Modelle",
703706
"settings.models.description": "Modelleinstellungen können hier konfiguriert werden.",
704707
"settings.agents.title": "Agenten",

0 commit comments

Comments
 (0)