can1357/oh-my-pi · error · DestinationUnavailableError

the destination is classified as ${metadata.status}

Error message

the destination is classified as ${metadata.status}

What it means

createConfiguredUploader looks up BUILTIN_BLOB_DESTINATIONS metadata for the requested destination and refuses to build an uploader when the destination is marked "incompatible" or "defunct". The thrown DestinationUnavailableError carries the cataloged reason, or this default message when the catalog has none. It means the destination is intentionally unsupported, not misconfigured.

Source

Thrown at packages/coding-agent/src/blob-broker/uploaders.ts:136

	};
}

/**
 * Resolve one registry destination to its built-in uploader.
 *
 * Serving destinations deliberately return `null`; the broker selects those
 * through its separate serve-kind predicate. Registry entries known to be
 * unusable, and active entries without an implementation, fail explicitly
 * before an upload can issue a network request.
 */
export function createConfiguredUploader(
	destination: BlobDestinationId,
	config: DestinationRuntimeConfig,
): BlobUploader | null {
	const metadata: BlobDestinationMetadata = BUILTIN_BLOB_DESTINATIONS[destination];
	if (metadata.status === "incompatible" || metadata.status === "defunct") {
		const reason = metadata.reason ?? `the destination is classified as ${metadata.status}`;
		throw new DestinationUnavailableError(destination, reason);
	}

	if (destination === "command") {
		const command = optionString(config, "command");
		if (!command) {
			throw new DestinationUnavailableError(destination, "an upload command containing {file} is required");
		}
		return createCommandUploader(command);
	}

	const uploader =
		createAnonymousUploader(destination, config) ??
		createImageHostUploader(destination, config) ??
		createCloudDriveUploader(destination, config) ??
		createObjectStorageUploader(destination, config) ??
		createSelfHostedUploader(destination, config) ??
		createLegacyUploader(destination, config) ??
		createDiscordUploader(destination, config);

View on GitHub (pinned to 9690622007)

Solutions

  1. Switch config to a supported destination (e.g. another self-hosted uploader or the command destination)
  2. Check the destination's metadata.reason in BUILTIN_BLOB_DESTINATIONS for the official explanation
  3. Update or replace the discontinued server integration if a replacement exists
  4. Pin to a version where the destination was still supported only as a temporary measure

Example fix

// before
"images": { "urls": { "destination": "defunct-service" } }
// after
"images": { "urls": { "destination": "command", "command": "curl -sF 'file=@{file}' https://0x0.st" } }
Defensive patterns

Strategy: validation

Validate before calling

import { BUILTIN_BLOB_DESTINATIONS } from "...";
const meta = BUILTIN_BLOB_DESTINATIONS[destination];
if (meta.status === "incompatible" || meta.status === "defunct") {
	// choose another destination before configuring
}

Type guard

function isUsableDestination(id: string): boolean {
	const meta = BUILTIN_BLOB_DESTINATIONS[id as keyof typeof BUILTIN_BLOB_DESTINATIONS];
	return meta !== undefined && meta.status !== "incompatible" && meta.status !== "defunct";
}

Try / catch

try {
	const uploader = createConfiguredUploader(destination, config);
} catch (err) {
	if (err instanceof DestinationUnavailableError && /classified as (incompatible|defunct)/.test(err.message)) {
		// fall back to a supported destination per metadata.reason
	}
	throw err;
}

Prevention

When it happens

Trigger: Selecting a destination id (in config or via the uploader() helper) whose catalog entry has status "incompatible" or "defunct" — e.g. a service that shut down or a protocol version the broker dropped. Passing such an id to createConfiguredUploader at any time raises it.

Common situations: Upgrading the CLI to a version that marked a previously working self-hosted destination defunct; copying a config from an old setup referencing a retired service; typos are NOT the cause here (typo yields a different lookup error).

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/1629bc12f6d6d310. Report an issue: GitHub.