diff --git a/extensions/acpx/src/acpx-runtime-compat.d.ts b/extensions/acpx/src/acpx-runtime-compat.d.ts index 646871b5888..a7d97fad294 100644 --- a/extensions/acpx/src/acpx-runtime-compat.d.ts +++ b/extensions/acpx/src/acpx-runtime-compat.d.ts @@ -30,6 +30,7 @@ declare module "acpx/runtime" { permissionMode?: unknown; nonInteractivePermissions?: unknown; timeoutMs?: number; + probeAgent?: string; }; export class AcpxRuntime { diff --git a/extensions/acpx/src/config-schema.ts b/extensions/acpx/src/config-schema.ts index 306f58f0cc7..0b390363d51 100644 --- a/extensions/acpx/src/config-schema.ts +++ b/extensions/acpx/src/config-schema.ts @@ -34,7 +34,6 @@ export type AcpxPluginConfig = { strictWindowsCmdWrapper?: boolean; timeoutSeconds?: number; queueOwnerTtlSeconds?: number; - probeAgent?: string; mcpServers?: Record; agents?: Record; }; @@ -50,7 +49,6 @@ export type ResolvedAcpxPluginConfig = { strictWindowsCmdWrapper: boolean; timeoutSeconds?: number; queueOwnerTtlSeconds: number; - probeAgent?: string; legacyCompatibilityConfig: { strictWindowsCmdWrapper?: boolean; queueOwnerTtlSeconds?: number; @@ -109,7 +107,6 @@ export const AcpxPluginConfigSchema = z.strictObject({ .number({ error: "queueOwnerTtlSeconds must be a number >= 0" }) .min(0, { error: "queueOwnerTtlSeconds must be a number >= 0" }) .optional(), - probeAgent: nonEmptyTrimmedString("probeAgent must be a non-empty string").optional(), mcpServers: z.record(z.string(), McpServerConfigSchema).optional(), agents: z .record( diff --git a/extensions/acpx/src/config.ts b/extensions/acpx/src/config.ts index a77a36e117c..76e26cef430 100644 --- a/extensions/acpx/src/config.ts +++ b/extensions/acpx/src/config.ts @@ -260,12 +260,16 @@ export function resolveAcpxPluginConfig(params: { ]), ); - const probeAgent = normalized.probeAgent?.trim(); + // Lowercase probeAgent so lookups match the registry keys built above, which + // also go through normalizeLowercaseStringOrEmpty. Without this, a user who + // writes `probeAgent: "OpenCode"` would silently miss the stored "opencode" + // key. + const probeAgent = normalizeLowercaseStringOrEmpty(normalized.probeAgent) || undefined; return { cwd, stateDir, - probeAgent: normalized.probeAgent, + probeAgent, permissionMode: normalized.permissionMode ?? DEFAULT_PERMISSION_MODE, nonInteractivePermissions: normalized.nonInteractivePermissions ?? DEFAULT_NON_INTERACTIVE_POLICY, @@ -275,7 +279,6 @@ export function resolveAcpxPluginConfig(params: { normalized.strictWindowsCmdWrapper ?? DEFAULT_STRICT_WINDOWS_CMD_WRAPPER, timeoutSeconds: normalized.timeoutSeconds ?? DEFAULT_ACPX_TIMEOUT_SECONDS, queueOwnerTtlSeconds: normalized.queueOwnerTtlSeconds ?? DEFAULT_QUEUE_OWNER_TTL_SECONDS, - probeAgent: probeAgent && probeAgent.length > 0 ? probeAgent : undefined, legacyCompatibilityConfig: { strictWindowsCmdWrapper: normalized.strictWindowsCmdWrapper, queueOwnerTtlSeconds: normalized.queueOwnerTtlSeconds, diff --git a/extensions/acpx/src/service.ts b/extensions/acpx/src/service.ts index 576e4072f19..27175434b9a 100644 --- a/extensions/acpx/src/service.ts +++ b/extensions/acpx/src/service.ts @@ -53,7 +53,6 @@ function createDefaultRuntime(params: AcpxRuntimeFactoryParams): AcpxRuntimeLike mcpServers: toAcpMcpServers(params.pluginConfig.mcpServers), permissionMode: params.pluginConfig.permissionMode, nonInteractivePermissions: params.pluginConfig.nonInteractivePermissions, - probeAgent: params.pluginConfig.probeAgent, timeoutMs: params.pluginConfig.timeoutSeconds != null ? params.pluginConfig.timeoutSeconds * 1_000