diff --git a/src/extension-host/.DS_Store b/src/extension-host/.DS_Store deleted file mode 100644 index 96cd27f08b7..00000000000 Binary files a/src/extension-host/.DS_Store and /dev/null differ diff --git a/src/extension-host/contributions/service-lifecycle.test.ts b/src/extension-host/contributions/service-lifecycle.test.ts index 37b2da2f328..e4e1c4ff849 100644 --- a/src/extension-host/contributions/service-lifecycle.test.ts +++ b/src/extension-host/contributions/service-lifecycle.test.ts @@ -19,7 +19,12 @@ import { startExtensionHostServices } from "./service-lifecycle.js"; function createRegistry(services: OpenClawPluginService[]) { const registry = createEmptyPluginRegistry(); for (const service of services) { - registry.services.push({ pluginId: "plugin:test", service, source: "test" }); + registry.services.push({ + pluginId: "plugin:test", + service, + source: "test", + rootDir: "/plugins/test-plugin", + }); } return registry; } @@ -116,7 +121,9 @@ describe("startExtensionHostServices", () => { await handle.stop(); expect(mockedLogger.error).toHaveBeenCalledWith( - expect.stringContaining("plugin service failed (service-start-fail):"), + expect.stringContaining( + "plugin service failed (service-start-fail, plugin=plugin:test, root=/plugins/test-plugin):", + ), ); expect(mockedLogger.warn).toHaveBeenCalledWith( expect.stringContaining("plugin service stop failed (service-stop-fail):"), diff --git a/src/extension-host/contributions/service-lifecycle.ts b/src/extension-host/contributions/service-lifecycle.ts index 3c6d1ccf101..446f8167a9a 100644 --- a/src/extension-host/contributions/service-lifecycle.ts +++ b/src/extension-host/contributions/service-lifecycle.ts @@ -55,7 +55,11 @@ export async function startExtensionHostServices(params: { stop: service.stop ? () => service.stop?.(serviceContext) : undefined, }); } catch (err) { - log.error(`plugin service failed (${service.id}): ${String(err)}`); + const error = err as Error; + const stack = error?.stack?.trim(); + log.error( + `plugin service failed (${service.id}, plugin=${entry.pluginId}, root=${entry.rootDir ?? "unknown"}): ${error?.message ?? String(err)}${stack ? `\n${stack}` : ""}`, + ); } } diff --git a/src/plugins/services.ts b/src/plugins/services.ts index d0eeda11cb1..a653da9ad2d 100644 --- a/src/plugins/services.ts +++ b/src/plugins/services.ts @@ -1,6 +1,10 @@ import type { OpenClawConfig } from "../config/config.js"; -import type { ExtensionHostServicesHandle } from "../extension-host/contributions/service-lifecycle.js"; +import { + startExtensionHostServices, + type ExtensionHostServicesHandle, +} from "../extension-host/contributions/service-lifecycle.js"; import type { PluginRegistry } from "./registry.js"; + export type PluginServicesHandle = ExtensionHostServicesHandle; export async function startPluginServices(params: { @@ -8,44 +12,5 @@ export async function startPluginServices(params: { config: OpenClawConfig; workspaceDir?: string; }): Promise { - const running: Array<{ - id: string; - stop?: () => void | Promise; - }> = []; - const serviceContext = createServiceContext({ - config: params.config, - workspaceDir: params.workspaceDir, - }); - - for (const entry of params.registry.services) { - const service = entry.service; - try { - await service.start(serviceContext); - running.push({ - id: service.id, - stop: service.stop ? () => service.stop?.(serviceContext) : undefined, - }); - } catch (err) { - const error = err as Error; - const stack = error?.stack?.trim(); - log.error( - `plugin service failed (${service.id}, plugin=${entry.pluginId}, root=${entry.rootDir ?? "unknown"}): ${error?.message ?? String(err)}${stack ? `\n${stack}` : ""}`, - ); - } - } - - return { - stop: async () => { - for (const entry of running.toReversed()) { - if (!entry.stop) { - continue; - } - try { - await entry.stop(); - } catch (err) { - log.warn(`plugin service stop failed (${entry.id}): ${String(err)}`); - } - } - }, - }; + return startExtensionHostServices(params); }