{"record":{"id":"e08c09b8de432476","repo":"aaif-goose/goose","slug":"unsupported-extension-type-for-acp-config-type","errorCode":null,"errorMessage":"Unsupported extension type for ACP: ${config.type}","messagePattern":"Unsupported extension type for ACP: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ui/desktop/src/acp/session-extensions.ts","lineNumber":19,"sourceCode":"import type { ExtensionConfig } from '../types/extensions';\nimport { getAcpClient } from './acpConnection';\nimport { extensionConfigToGooseExtension, gooseExtensionToExtensionConfig } from './extensions';\n\nexport async function getSessionExtensions(sessionId: string): Promise<ExtensionConfig[]> {\n  const client = await getAcpClient();\n  const response = await client.goose.sessionExtensionsList_unstable({ sessionId });\n  return response.extensions\n    .map(gooseExtensionToExtensionConfig)\n    .filter((config): config is ExtensionConfig => config !== null);\n}\n\nexport async function addSessionExtension(\n  sessionId: string,\n  config: ExtensionConfig\n): Promise<void> {\n  const extension = extensionConfigToGooseExtension(config);\n  if (!extension) {\n    throw new Error(`Unsupported extension type for ACP: ${config.type}`);\n  }\n  const client = await getAcpClient();\n  await client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });\n}\n\nexport async function removeSessionExtension(sessionId: string, name: string): Promise<void> {\n  const client = await getAcpClient();\n  await client.goose.sessionExtensionsRemove_unstable({ sessionId, name });\n}\n","sourceCodeStart":1,"sourceCodeEnd":29,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/ui/desktop/src/acp/session-extensions.ts#L1-L29","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nconst extension = extensionConfigToGooseExtension(config);\nif (!extension) {\n  throw new Error(`Unsupported extension type for ACP: ${config.type}`);\n}\nawait client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });\n\n// after (caller filters unsupported kinds up front)\nconst ACP_SUPPORTED = new Set(['builtin', 'platform', 'stdio', 'streamable_http']);\nif (!ACP_SUPPORTED.has(config.type)) {\n  throw new Error(`Unsupported extension type for ACP: ${config.type}`);\n}\nconst extension = extensionConfigToGooseExtension(config);\nif (extension) {\n  await client.goose.sessionExtensionsAdd_unstable({ sessionId, extension });\n}","handlingStrategy":"type-guard","validationCode":"// Filter to ACP-transportable kinds before calling add\nconst ACP_EXTENSION_TYPES = new Set(['builtin', 'platform', 'stdio', 'streamable_http']);\nif (!ACP_EXTENSION_TYPES.has(config.type)) {\n  throw new Error(`Extension type '${config.type}' cannot be added over ACP`);\n}","typeGuard":"type AcpExtensionConfig = Extract<ExtensionConfig, { type: 'builtin' | 'platform' | 'stdio' | 'streamable_http' }>;\n\nfunction isAcpExtensionConfig(config: ExtensionConfig): config is AcpExtensionConfig {\n  return config.type === 'builtin' || config.type === 'platform' ||\n         config.type === 'stdio' || config.type === 'streamable_http';\n}","tryCatchPattern":"try {\n  await addSessionExtension(sessionId, config);\n} catch (error) {\n  if (/Unsupported extension type for ACP/.test(String(error))) {\n    skipAndReport(config); // drop sse/frontend/inline_python entries from the batch\n    return;\n  }\n  throw error;\n}","preventionTips":["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."],"tags":["acp","extensions","mcp","validation","type-mapping"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}