mount acp in the goosed server to migrate using acp protocols iteratively (#9097)

This commit is contained in:
Lifei Zhou
2026-05-18 09:43:30 +10:00
committed by GitHub
parent d04c882388
commit 1fafd74413
17 changed files with 1430 additions and 61 deletions
+11 -31
View File
@@ -4,17 +4,16 @@ import {
readConfig,
removeConfig,
upsertConfig,
getExtensions as apiGetExtensions,
addExtension as apiAddExtension,
removeExtension as apiRemoveExtension,
providers,
} from '../api';
import { getConfiguredExtensions } from '../acp/extensions';
import { pruneDeprecatedBundledExtensions, syncBundledExtensions } from './settings/extensions';
import type {
ConfigResponse,
UpsertConfigQuery,
ConfigKeyQuery,
ExtensionResponse,
ProviderDetails,
ExtensionQuery,
ExtensionConfig,
@@ -48,14 +47,6 @@ interface ConfigProviderProps {
children: React.ReactNode;
}
export class MalformedConfigError extends Error {
constructor() {
super('Check contents of ~/.config/goose/config.yaml');
this.name = 'MalformedConfigError';
Object.setPrototypeOf(this, MalformedConfigError.prototype);
}
}
const ConfigContext = createContext<ConfigContextType | undefined>(undefined);
export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
@@ -114,22 +105,11 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
);
const refreshExtensions = useCallback(async () => {
const result = await apiGetExtensions();
if (result.response.status === 422) {
throw new MalformedConfigError();
}
if (result.error && !result.data) {
console.error(result.error);
return extensionsList;
}
const extensionResponse: ExtensionResponse = result.data!;
setExtensionsList(extensionResponse.extensions);
setExtensionWarnings(extensionResponse.warnings || []);
return extensionResponse.extensions;
}, [extensionsList]);
const { extensions, warnings } = await getConfiguredExtensions();
setExtensionsList(extensions);
setExtensionWarnings(warnings || []);
return extensions;
}, []);
const addExtension = useCallback(
async (name: string, config: ExtensionConfig, enabled: boolean) => {
@@ -212,8 +192,8 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
// Load extensions
try {
const extensionsResponse = await apiGetExtensions();
let extensions = extensionsResponse.data?.extensions || [];
const extensionsResponse = await getConfiguredExtensions();
let extensions = extensionsResponse.extensions;
// Always sync bundled extensions from bundled-extensions.json
// This ensures:
@@ -235,11 +215,11 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
extensions = await pruneDeprecatedBundledExtensions(extensions, removeExtensionForSync);
await syncBundledExtensions(extensions, addExtensionForSync);
// Reload extensions after sync
const refreshedResponse = await apiGetExtensions();
extensions = refreshedResponse.data?.extensions || [];
const refreshedResponse = await getConfiguredExtensions();
extensions = refreshedResponse.extensions;
setExtensionsList(extensions);
setExtensionWarnings(extensionsResponse.data?.warnings || []);
setExtensionWarnings(extensionsResponse.warnings || []);
} catch (error) {
console.error('Failed to load extensions:', error);
}