{"record":{"id":"71869d1dfca5ec06","repo":"jlcodes99/cockpit-tools","slug":"no-update-available-from-updater-plugin","errorCode":null,"errorMessage":"No update available from updater plugin","messagePattern":"No update available from updater plugin","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/App.tsx","lineNumber":1791,"sourceCode":"      progress: 0,\n      requiresInstall: true,\n    });\n    writeUpdateLog('info', `统一更新任务开始下载: version=${expectedVersion}`);\n\n    let usedAttempts = 0;\n    try {\n      const downloadedUpdate = await retryWithBackoff(\n        async (attempt) => {\n          usedAttempts = attempt;\n          if (updateCancelRequestedRef.current || updateDownloadTaskIdRef.current !== taskId) {\n            throw createUpdaterCanceledError();\n          }\n\n          let candidate: UpdaterUpdate | null = null;\n          try {\n            candidate = await runUpdaterCheck();\n            if (!candidate) {\n              throw new Error('No update available from updater plugin');\n            }\n            activeUpdateDownloadRef.current = candidate;\n\n            const candidateVersion = candidate.version;\n            const { releaseNotes, releaseNotesZh } = parseUpdaterReleaseNotes(candidate.body);\n            await invoke('save_pending_update_notes', {\n              version: candidateVersion,\n              releaseNotes,\n              releaseNotesZh,\n            }).catch((error) => {\n              console.error('[App] Failed to cache shared update notes:', error);\n              writeUpdateLog(\n                'warn',\n                `缓存统一更新说明失败: version=${candidateVersion}, error=${sanitizeUpdaterErrorMessage(error)}`,\n              );\n            });\n\n            let downloaded = 0;","sourceCodeStart":1773,"sourceCodeEnd":1809,"githubUrl":"https://github.com/jlcodes99/cockpit-tools/blob/1ed8b77992d62ca81fabf744deb0839ad361d5bf/src/App.tsx#L1773-L1809","documentation":"Sentinel thrown in MainApp's unified update downloader: runUpdaterCheck() completed without error but returned null, meaning the updater plugin reports no installable update for the expected version. The retryWithBackoff wrapper then aborts instead of looping on an update that will never appear.","triggerScenarios":"Thrown at src/App.tsx:1791 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Confirm the expected version matches what the update feed actually publishes","Re-check later; the feed may not have propagated the release yet","Inspect updater plugin configuration (channel, mirror) if the release is known to exist"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1ed8b77992d62ca81fabf744deb0839ad361d5bf","analyzedAt":"2026-09-05T09:51:41.178Z","contentChangedAt":"2026-09-05T09:51:41.178Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}