refactor: convert desktop v1 and goose-server extensions to ACP+ (#9448)

This commit is contained in:
Alex Hancock
2026-05-27 16:59:48 -04:00
committed by GitHub
parent c9945bca5d
commit 9c403b1560
13 changed files with 124 additions and 826 deletions
+9 -18
View File
@@ -1,21 +1,16 @@
import React, { createContext, useContext, useState, useEffect, useMemo, useCallback } from 'react';
import { readAllConfig, readConfig, removeConfig, upsertConfig, providers } from '../api';
import {
readAllConfig,
readConfig,
removeConfig,
upsertConfig,
addExtension as apiAddExtension,
removeExtension as apiRemoveExtension,
providers,
} from '../api';
import { getConfiguredExtensions } from '../acp/extensions';
getConfiguredExtensions,
addConfiguredExtension,
removeConfiguredExtension,
} from '../acp/extensions';
import { pruneDeprecatedBundledExtensions, syncBundledExtensions } from './settings/extensions';
import type {
ConfigResponse,
UpsertConfigQuery,
ConfigKeyQuery,
ProviderDetails,
ExtensionQuery,
ExtensionConfig,
} from '../api';
@@ -113,10 +108,7 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
const addExtension = useCallback(
async (name: string, config: ExtensionConfig, enabled: boolean) => {
const query: ExtensionQuery = { name, config, enabled };
await apiAddExtension({
body: query,
});
await addConfiguredExtension(name, config, enabled);
await reloadConfig();
// Refresh extensions list after successful addition
await refreshExtensions();
@@ -126,7 +118,7 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
const removeExtension = useCallback(
async (name: string) => {
await apiRemoveExtension({ path: { name: name } });
await removeConfiguredExtension(name);
await reloadConfig();
// Refresh extensions list after successful removal
await refreshExtensions();
@@ -206,11 +198,10 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
config: ExtensionConfig,
enabled: boolean
) => {
const query: ExtensionQuery = { name, config, enabled };
await apiAddExtension({ body: query });
await addConfiguredExtension(name, config, enabled);
};
const removeExtensionForSync = async (name: string) => {
await apiRemoveExtension({ path: { name } });
await removeConfiguredExtension(name);
};
extensions = await pruneDeprecatedBundledExtensions(extensions, removeExtensionForSync);
await syncBundledExtensions(extensions, addExtensionForSync);
@@ -8,7 +8,8 @@ import { FixedExtensionEntry, useConfig } from '../ConfigContext';
import { toastService } from '../../toasts';
import { formatExtensionName } from '../settings/extensions/subcomponents/ExtensionList';
import { nameToKey } from '../settings/extensions/utils';
import { ExtensionConfig, getSessionExtensions } from '../../api';
import { ExtensionConfig } from '../../api';
import { getSessionExtensions } from '../../acp/extensions';
import { addToAgent, removeFromAgent } from '../settings/extensions/agent-api';
import {
setExtensionOverride,
@@ -119,14 +120,9 @@ export const BottomMenuExtensionSelection = ({ sessionId }: BottomMenuExtensionS
}
try {
const response = await getSessionExtensions({
path: { session_id: sessionId },
});
if (response.data?.extensions) {
setSessionExtensions(response.data.extensions);
setIsSessionExtensionsLoaded(true);
}
const extensions = await getSessionExtensions(sessionId);
setSessionExtensions(extensions);
setIsSessionExtensionsLoaded(true);
} catch (error) {
console.error('Failed to fetch session extensions:', error);
setIsSessionExtensionsLoaded(true);
@@ -197,13 +193,8 @@ export const BottomMenuExtensionSelection = ({ sessionId }: BottomMenuExtensionS
}
sortTimeoutRef.current = setTimeout(async () => {
const response = await getSessionExtensions({
path: { session_id: sessionId },
});
if (response.data?.extensions) {
setSessionExtensions(response.data.extensions);
}
const extensions = await getSessionExtensions(sessionId);
setSessionExtensions(extensions);
setPendingSort(false);
setIsTransitioning(false);
setTogglingExtension(null);
@@ -1,5 +1,6 @@
import { toastService } from '../../../toasts';
import { agentAddExtension, ExtensionConfig, agentRemoveExtension } from '../../../api';
import { ExtensionConfig } from '../../../api';
import { addSessionExtension, removeSessionExtension } from '../../../acp/extensions';
import { errorMessage } from '../../../utils/conversionUtils';
import {
createExtensionRecoverHints,
@@ -20,10 +21,7 @@ export async function addToAgent(
: 0;
try {
await agentAddExtension({
body: { session_id: sessionId, config: extensionConfig },
throwOnError: true,
});
await addSessionExtension(sessionId, extensionConfig);
if (showToast) {
toastService.dismiss(toastId);
toastService.success({
@@ -61,10 +59,7 @@ export async function removeFromAgent(
: 0;
try {
await agentRemoveExtension({
body: { session_id: sessionId, name: extensionName },
throwOnError: true,
});
await removeSessionExtension(sessionId, extensionName);
if (showToast) {
toastService.dismiss(toastId);
toastService.success({