{"record":{"id":"78d66ac6c5c719b5","repo":"linshenkx/prompt-optimizer","slug":"imageimage2imagesession-preferenceservice-is-una","errorCode":null,"errorMessage":"[ImageImage2ImageSession] PreferenceService is unavailable; cannot save session","messagePattern":"\\[ImageImage2ImageSession\\] PreferenceService is unavailable; cannot save session","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ui/src/stores/session/useImageImage2ImageSession.ts","lineNumber":610,"sourceCode":"          id: imageId,\n          mimeType: normalizedMime,\n          sizeBytes: Math.floor(b64.length * 0.75),\n          createdAt: Date.now(),\n          accessedAt: Date.now(),\n          source: 'uploaded'\n        },\n        data: b64\n      })\n    }\n\n    return imageId\n  }\n\n  const saveSession = async () => {\n    return await queueImageStorageMaintenance(async () => {\n      const $services = getPiniaServices()\n      if (!$services?.preferenceService) {\n        throw new Error('[ImageImage2ImageSession] PreferenceService is unavailable; cannot save session')\n      }\n      if (!$services?.imageStorageService) {\n        throw new Error('[ImageImage2ImageSession] ImageStorageService is unavailable; cannot save session')\n      }\n\n      // 准备保存的数据\n      let inputImageIdToSave = inputImageId.value\n      // v2: 多列 variants\n      const baseVariantResults: TestVariantResults = {\n        a: testVariantResults.value.a ?? originalImageResult.value,\n        b: testVariantResults.value.b ?? optimizedImageResult.value,\n        c: testVariantResults.value.c,\n        d: testVariantResults.value.d,\n      }\n\n      // 保存输入图像\n      if (inputImageB64.value && !inputImageId.value) {\n        inputImageIdToSave = await saveInputImage(","sourceCodeStart":592,"sourceCodeEnd":628,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/ui/src/stores/session/useImageImage2ImageSession.ts#L592-L628","documentation":"The image-to-image session's saveSession requires PreferenceService from the Pinia services container to persist session state; if it is missing, saving aborts immediately with this error. It reflects an incomplete dependency container rather than a user data problem.","triggerScenarios":"Invoking saveSession (image image 2 image session) when getPiniaServices()?.preferenceService is falsy. Note saveSession also runs inside queueImageStorageMaintenance, so queued maintenance tasks surface the same error.","commonSituations":"Unit tests creating the store with a bare createPinia() and no service plugins; plugin installation order bugs; SSR or edge runtimes where the preferences plugin isn't registered; refactors renaming preferenceService.","solutions":["Install the preferences service plugin on Pinia during app bootstrap before any session save can run","In tests, provide a stub preferenceService (getKey/setKey) on the services container","Debounce/guard save triggers (watchers) until services are ready"],"exampleFix":"// before\nconst pinia = createPinia()\nsetActivePinia(pinia) // no plugins -> saveSession throws\n\n// after\nconst pinia = createPinia()\npinia.use(() => ({ preferenceService: mockPreferenceService, imageStorageService: mockImageStorage }))\nsetActivePinia(pinia)","handlingStrategy":"type-guard","validationCode":"const services = getPiniaServices()\nif (!services?.preferenceService) {\n  // defer save until services ready\n}","typeGuard":"const hasPreferenceService = (): boolean =>\n  Boolean(getPiniaServices()?.preferenceService)","tryCatchPattern":"try {\n  await saveSession()\n} catch (e) {\n  if (e instanceof Error && e.message.includes('PreferenceService is unavailable')) return\n  throw e\n}","preventionTips":["Register preference service plugin during bootstrap","Stub preferenceService in tests","Queue saves until the services container is fully populated"],"tags":["pinia","dependency-injection","preferences","session"],"backgroundTag":"missing-service-dependency","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}