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

  1. Filter before adding: only call addSessionExtension for type in ['builtin','platform','stdio','streamable_http'].
  2. Convert SSE servers to 'streamable_http' entries (uri + headers) — SSE is not transportable over ACP.
  3. 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

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


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/e08c09b8de432476. Report an issue: GitHub.