aaif-goose/goose · error
Unsupported extension type for ACP: ${config.type}
Error message
Unsupported extension type for ACP: ${config.type} What it means
Thrown by addSessionExtension (and identically by addConfigExtension) when extensionConfigToGooseExtension(config) returns null. Inspecting that mapper in extensions.ts: only types 'builtin', 'platform', 'stdio', and 'streamable_http' convert to a GooseExtension; types 'sse', 'frontend', and 'inline_python' explicitly return null because the ACP wire format has no representation for them. So the error means the UI/caller tried to attach an extension kind that cannot be sent over ACP.
Source
Thrown at ui/desktop/src/acp/session-extensions.ts:19
import type { ExtensionConfig } from '../types/extensions';
import { getAcpClient } from './acpConnection';
import { extensionConfigToGooseExtension, gooseExtensionToExtensionConfig } from './extensions';
export async function getSessionExtensions(sessionId: string): Promise<ExtensionConfig[]> {
const client = await getAcpClient();
const response = await client.goose.sessionExtensionsList_unstable({ sessionId });
return response.extensions
.map(gooseExtensionToExtensionConfig)
.filter((config): config is ExtensionConfig => config !== null);
}
export async function addSessionExtension(
sessionId: string,
config: ExtensionConfig
): Promise<void> {
const extension = extensionConfigToGooseExtension(config);
if (!extension) {
throw new Error(`Unsupported extension type for ACP: ${config.type}`);
}
const client = await getAcpClient();
await client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });
}
export async function removeSessionExtension(sessionId: string, name: string): Promise<void> {
const client = await getAcpClient();
await client.goose.sessionExtensionsRemove_unstable({ sessionId, name });
}
View on GitHub (pinned to 3810898a74)
Solutions
- Filter before adding: only call addSessionExtension for type in ['builtin','platform','stdio','streamable_http'].
- Convert SSE servers to 'streamable_http' entries (uri + headers) — SSE is not transportable over ACP.
- If you hit it from UI code, hide or disable session-add for 'sse'/'frontend'/'inline_python' extension kinds.
Example fix
// before
const extension = extensionConfigToGooseExtension(config);
if (!extension) {
throw new Error(`Unsupported extension type for ACP: ${config.type}`);
}
await client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });
// after (caller filters unsupported kinds up front)
const ACP_SUPPORTED = new Set(['builtin', 'platform', 'stdio', 'streamable_http']);
if (!ACP_SUPPORTED.has(config.type)) {
throw new Error(`Unsupported extension type for ACP: ${config.type}`);
}
const extension = extensionConfigToGooseExtension(config);
if (extension) {
await client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });
} Defensive patterns
Strategy: type-guard
Validate before calling
// Filter to ACP-transportable kinds before calling add
const ACP_EXTENSION_TYPES = new Set(['builtin', 'platform', 'stdio', 'streamable_http']);
if (!ACP_EXTENSION_TYPES.has(config.type)) {
throw new Error(`Extension type '${config.type}' cannot be added over ACP`);
} Type guard
type AcpExtensionConfig = Extract<ExtensionConfig, { type: 'builtin' | 'platform' | 'stdio' | 'streamable_http' }>;
function isAcpExtensionConfig(config: ExtensionConfig): config is AcpExtensionConfig {
return config.type === 'builtin' || config.type === 'platform' ||
config.type === 'stdio' || config.type === 'streamable_http';
} Try / catch
try {
await addSessionExtension(sessionId, config);
} catch (error) {
if (/Unsupported extension type for ACP/.test(String(error))) {
skipAndReport(config); // drop sse/frontend/inline_python entries from the batch
return;
}
throw error;
} Prevention
- Filter extension lists with isAcpExtensionConfig before forwarding to ACP.
- Migrate SSE server configs to streamable_http when moving to ACP-based flows.
- Keep the supported-type set in one shared constant next to the UI picker.
When it happens
Trigger: addSessionExtension(sessionId, {type: 'sse', ...}) or {type: 'frontend'} / {type: 'inline_python'}; generic UI code that iterates all ExtensionConfig entries from config and forwards each to sessionExtensionsAdd_unstable without filtering; importing an old config containing SSE servers.
Common situations: Migrating configs that used SSE MCP servers (must become 'streamable_http'); an extension picker showing all configured extensions including frontend-only ones for session-level add; plugins assuming every ExtensionConfig round-trips.
Related errors
- Resource '${fallbackUri}' returned no contents
- Unknown provider: ${providerId}
- External ACP backend URL is required
- Failed to list prompts: {}
- Failed to get prompt: {}
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/e08c09b8de432476.
Report an issue: GitHub.