{"record":{"id":"201f1b67e7c15083","repo":"linshenkx/prompt-optimizer","slug":"basicsystemsession-imagestorageservice-is-unavai","errorCode":null,"errorMessage":"[BasicSystemSession] ImageStorageService is unavailable; cannot save test image","messagePattern":"\\[BasicSystemSession\\] ImageStorageService is unavailable; cannot save test image","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ui/src/stores/session/useBasicSystemSession.ts","lineNumber":509,"sourceCode":"      assetId: testImageAssetId.value,\n    }\n\n    return await queueImageStorageMaintenance(async () => {\n      const $services = getPiniaServices()\n      if (!$services?.preferenceService) {\n        console.warn('[BasicSystemSession] PreferenceService is unavailable; cannot save session')\n        return\n      }\n\n      try {\n        let imageAssetIdToSave = imageSnapshot.assetId\n        const imageMimeTypeToSave = imageSnapshot.b64 || imageSnapshot.assetId\n          ? (imageSnapshot.mimeType || 'image/png')\n          : ''\n\n        if (imageSnapshot.b64 && !imageAssetIdToSave) {\n          if (!$services.imageStorageService) {\n            throw new Error(\n              '[BasicSystemSession] ImageStorageService is unavailable; cannot save test image',\n            )\n          }\n\n          imageAssetIdToSave = await persistImagePayloadAsAssetId({\n            payload: {\n              b64: imageSnapshot.b64,\n              mimeType: imageMimeTypeToSave,\n            },\n            storageService: $services.imageStorageService,\n            sourceType: 'uploaded',\n          })\n\n          if (!imageAssetIdToSave) {\n            throw new Error('[BasicSystemSession] Failed to persist test image')\n          }\n\n          if (","sourceCodeStart":491,"sourceCodeEnd":527,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/ui/src/stores/session/useBasicSystemSession.ts#L491-L527","documentation":"useBasicSystemSession.saveSession throws when the session snapshot contains a base64 test image (testImageB64 with no existing asset id) but the ImageStorageService is not registered on the Pinia services container. The image must be persisted as an asset before saving; without the service this is impossible, so the save aborts.","triggerScenarios":"Calling saveSession (directly or via updateTestImage/updateTemplate/updateOptimizeModel/updateTestModel/updateIterateTemplate/assetBindingState) when getPiniaServices().imageStorageService is falsy and the current session holds an unsaved b64 image.","commonSituations":"Running the store outside the app bootstrap that registers services (unit tests, SSR, storybook); initialization order bug where the session store is used before plugins install services; a build/config change that skips the image-storage plugin.","solutions":["Ensure the app initialization installs ImageStorageService on the Pinia services container before any session-saving action runs","In tests, register a mock imageStorageService in createPinia setup","Guard UI actions: disable save/image-upload until services are initialized","If the service is intentionally optional, clear the b64 image before saving or fall back to skipping image persistence"],"exampleFix":"// before\nconst $services = getPiniaServices()\nif (!$services.imageStorageService) throw new Error('...')\n\n// after (test setup)\nconst pinia = createPinia()\nsetActivePinia(pinia)\npinia.use(() => ({ imageStorageService: mockImageStorageService }))","handlingStrategy":"type-guard","validationCode":"const services = getPiniaServices()\nif (!services?.imageStorageService) {\n  // defer save, or block image upload in UI\n}","typeGuard":"const hasImageStorage = (): boolean =>\n  Boolean(getPiniaServices()?.imageStorageService)","tryCatchPattern":"try {\n  await session.saveSession()\n} catch (e) {\n  if (e instanceof Error && e.message.includes('ImageStorageService is unavailable')) {\n    // retry after bootstrap completes, or save without image\n  } else throw e\n}","preventionTips":["Install all service plugins synchronously in app entry before mounting","Register mocks in unit tests","Disable image upload UI until services are confirmed present"],"tags":["pinia","dependency-injection","image-storage","session"],"backgroundTag":"missing-service-dependency","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}