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

  1. Rename the incoming framework before importing; the error message names the conflicting name
  2. Or delete the existing framework with that name via deleteImportedFramework(id), then import
  3. 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

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

Related errors


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)