koala73/worldmonitor · warning · Error
Webhook URL DNS resolution returned no addresses
Error message
Webhook URL DNS resolution returned no addresses
What it means
saveImportedFramework() rejects a framework whose name collides with any entry in loadFrameworkLibrary(), which merges BUILT_IN_FRAMEWORKS plus the imported list, so both built-in names (e.g., 'Ray Dalio Macroeconomic Cycles') and previously imported names are reserved. The comparison is exact equality on f.name. The store has no rename operation, only delete and re-add.
Solutions
- Rename the incoming framework before importing; the error message names the conflicting name
- Or delete the existing framework with that name via deleteImportedFramework(id), then import
- For UI authors: pre-check availability with loadFrameworkLibrary().some(f => f.name === name) and disable submit
Example fix
// before
saveImportedFramework({ id, name: 'Ray Dalio Macroeconomic Cycles', description, systemPromptAppend });
// throws: collides with the built-in framework
// after
const taken = loadFrameworkLibrary().some(f => f.name === name);
if (taken) {
showWarning(`Name '${name}' is taken. Choose another.`);
return;
}
saveImportedFramework({ id, name, description, systemPromptAppend }); Defensive patterns
Strategy: validation
Validate before calling
const taken = loadFrameworkLibrary().some(f => f.name === fw.name);
if (taken) { suggestAlternativeName(fw.name); return; }
saveImportedFramework(fw); Try / catch
try {
saveImportedFramework(fw);
} catch (e) {
if (e instanceof Error && e.message.includes('already exists')) promptRename(fw);
else throw e;
} Prevention
- Reserve built-in framework names in the import UI before submit
- Disable the submit button on duplicate names with instant feedback
- Remember there is no rename API: delete then re-add
When it happens
Trigger: Importing a framework whose name equals a built-in framework's name; re-importing a framework already in the library; double-submitting an import form so the second call sees the first save.
Common situations: Re-running an import that partially succeeded before; sharing framework JSON between team members who already imported it; expecting a rename that the API does not provide.
Understand the failure class
- DNS resolution errors: ENOTFOUND and getaddrinfo failures — how hostname lookups fail and how to debug them.
Related errors
- Webhook URL DNS resolution failed
- Webhook URL must not point to a metadata endpoint
- a pull_request payload is required
- A valid country code is required for a resilience score…
- Aircraft identifier is too long
AI-assisted analysis of koala73/worldmonitor@7d06c8633d (2026-08-21).
Data as JSON: /api/errors/f0f7f8da7244c3b2.
Report an issue: GitHub.
Appendix: source
Thrown at api/_notification-webhook-ssrf.ts:250
* connection) because DNS can change after registration.
*/
export async function assertNotificationWebhookRegistrationUrlSafe(
rawUrl: string,
resolveHostname: ResolveHostname = defaultResolveHostname,
): Promise<void> {
const staticError = blockedNotificationWebhookUrlReason(rawUrl);
if (staticError) throw new Error(staticError);
const hostname = new URL(rawUrl).hostname.toLowerCase();
if (isIpLiteral(hostname)) return;
let resolvedAddresses: string[];
try {
resolvedAddresses = await resolveHostname(hostname);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new Error(`Webhook URL DNS resolution failed: ${message}`);
}
if (!resolvedAddresses.length) throw new Error('Webhook URL DNS resolution returned no addresses');
if (resolvedAddresses.some(isBlockedNotificationResolvedAddress)) {
throw new Error('Webhook URL must not point to a private/local address');
}
}
View on GitHub (pinned to 7d06c8633d)