{"record":{"id":"e5a64909bc1535ba","repo":"linshenkx/prompt-optimizer","slug":"generation-failed-e5a649","errorCode":"GENERATION_FAILED","errorMessage":"ElectronImageServiceProxy can only be used in Electron renderer process","messagePattern":"ElectronImageServiceProxy can only be used in Electron renderer process","errorType":"exception","errorClass":"BaseError","httpStatus":null,"severity":"error","filePath":"packages/core/src/services/image/electron-proxy.ts","lineNumber":52,"sourceCode":"    addConfig: (config: ImageModelConfigInput) => Promise<void>\n    updateConfig: (id: string, updates: Partial<ImageModelConfigInput>) => Promise<void>\n    deleteConfig: (id: string) => Promise<void>\n    getConfig: (id: string) => Promise<ImageModelConfig | null>\n    getAllConfigs: () => Promise<ImageModelConfig[]>\n    getEnabledConfigs: () => Promise<ImageModelConfig[]>\n    exportData: () => Promise<unknown>\n    importData: (data: unknown) => Promise<void>\n    getDataType: () => Promise<string>\n    validateData: (data: unknown) => Promise<boolean>\n  }\n}\n\nexport class ElectronImageServiceProxy implements IImageService {\n  private electronAPI: ElectronAPI\n\n  constructor() {\n    if (typeof window === 'undefined' || !window.electronAPI) {\n      throw new BaseError(IMAGE_ERROR_CODES.GENERATION_FAILED, 'ElectronImageServiceProxy can only be used in Electron renderer process')\n    }\n    this.electronAPI = (window as unknown as { electronAPI: ElectronAPI }).electronAPI\n  }\n\n  async generate(request: ImageRequest): Promise<ImageResult> {\n    const safeReq = safeSerializeForIPC(request)\n    return await this.electronAPI.image.generate(safeReq)\n  }\n\n  async generateText2Image(request: Text2ImageRequest): Promise<ImageResult> {\n    const safeReq = safeSerializeForIPC(request)\n    return await this.electronAPI.image.generateText2Image(safeReq)\n  }\n\n  async generateImage2Image(request: Image2ImageRequest): Promise<ImageResult> {\n    const safeReq = safeSerializeForIPC(request)\n    return await this.electronAPI.image.generateImage2Image(safeReq)\n  }","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/image/electron-proxy.ts#L34-L70","documentation":"ElectronImageServiceProxy is a renderer-side IPC shim that requires the preload bridge exposed as `window.electronAPI`. Its constructor throws immediately (as GENERATION_FAILED) when instantiated outside an Electron renderer process or when the preload script did not expose the API.","triggerScenarios":"Constructing ElectronImageServiceProxy in a plain browser tab, in a Node/main process, in tests/jsdom, or in an Electron renderer where contextIsolation settings prevent window.electronAPI from being set.","commonSituations":"Unit tests importing the proxy without mocking window.electronAPI; preload script missing contextBridge.exposeInMainWorld('electronAPI', ...); sandbox or nodeIntegration misconfiguration; code shared between web and Electron builds.","solutions":["Only instantiate the proxy inside the Electron renderer after DOM load","Ensure the preload script calls contextBridge.exposeInMainWorld('electronAPI', {...})","In tests, mock window.electronAPI before constructing: (window as any).electronAPI = mockAPI","In shared code, feature-detect: if (!window.electronAPI) use the direct service instead"],"exampleFix":"// before\nconst svc = new ElectronImageServiceProxy()\n\n// after\nfunction createImageService(): IImageService {\n  if (typeof window !== 'undefined' && window.electronAPI) {\n    return new ElectronImageServiceProxy()\n  }\n  return new ImageService(/* ... */)\n}","handlingStrategy":"type-guard","validationCode":"const canUseElectronProxy = typeof window !== 'undefined' && !!(window as any).electronAPI?.imageService","typeGuard":"function isElectronRenderer(w: unknown): w is Window & { electronAPI: ElectronAPI } {\n  return typeof w !== 'undefined' && !!(w as any)?.electronAPI\n}","tryCatchPattern":null,"preventionTips":["Feature-detect window.electronAPI before constructing any Electron proxy","Expose the bridge via contextBridge in preload on day one","Mock window.electronAPI in unit-test setup files"],"tags":["electron","ipc","preload","environment","renderer-process"],"backgroundTag":"electron-preload-api-missing","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}