{"record":{"id":"d48d07bdafaa1a17","repo":"jlcodes99/cockpit-tools","slug":"externalimport-app-d48d07","errorCode":null,"errorMessage":"[ExternalImport][App] 当前版本不支持外部导入方式，已终止导入","messagePattern":"\\[ExternalImport\\]\\[App\\] 当前版本不支持外部导入方式，已终止导入","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/App.tsx","lineNumber":959,"sourceCode":"            id: 'check-update',\n            label: t('common.shared.externalImport.checkUpdate', '检查更新'),\n            variant: 'primary',\n            onClick: () => {\n              window.dispatchEvent(\n                new CustomEvent('update-check-requested', {\n                  detail: { source: 'manual' satisfies UpdateCheckSource },\n                }),\n              );\n            },\n          },\n          {\n            id: 'close',\n            label: t('common.close', '关闭'),\n            variant: 'secondary',\n          },\n        ],\n      });\n      console.warn('[ExternalImport][App] 当前版本不支持外部导入方式，已终止导入', {\n        currentVersion: currentVersion || null,\n        requiredVersion,\n        providerId: payload.providerId,\n      });\n      return false;\n    },\n    [showModal, t],\n  );\n\n  const handleExternalProviderImportRawPayload = useCallback(async (rawPayload: unknown) => {\n    console.info('[ExternalImport][App] 收到原始 payload:', rawPayload);\n    const normalized = normalizeExternalProviderImportPayload(rawPayload);\n    if (!normalized) {\n      console.warn('[ExternalImport][App] payload 归一化失败，已忽略');\n      return;\n    }\n    if (!(await ensureExternalImportVersionCompatible(normalized))) {\n      return;","sourceCodeStart":941,"sourceCodeEnd":977,"githubUrl":"https://github.com/jlcodes99/cockpit-tools/blob/1ed8b77992d62ca81fabf744deb0839ad361d5bf/src/App.tsx#L941-L977","documentation":"App.tsx's external provider-import entrypoint first checks that the incoming import payload's requiredVersion is compatible with the current app version (ensureExternalImportVersionCompatible). When the check fails (required version higher than the running app, or no supported version at all), it shows a close-only dialog and logs this warning, then aborts the import by returning false.","triggerScenarios":"An external import payload (e.g. from a shared link/file carrying providerId and requiredVersion) is received whose requiredVersion exceeds currentVersion, so handleExternalProviderImportRawPayload bails out before importing.","commonSituations":"Trying to import a provider configuration exported from a newer app version; version string mismatches (e.g. '1.2' vs '1.2.0'); payload hand-edited with an unsupported version field.","solutions":["Upgrade Cockpit Tools to at least the requiredVersion reported in the warning payload.","Ask the exporter to re-export using an app version compatible with yours (lower requiredVersion).","If versions look compatible, check version comparison logic for formatting mismatches (semver normalization).","Manually recreate the provider in CodexModelProviderManager as a workaround."],"exampleFix":"null","handlingStrategy":"validation","validationCode":"function isVersionCompatible(current: string, required: string): boolean {\n  const cmp = (s: string) => s.split('.').map(Number);\n  const [c, r] = [cmp(current), cmp(required)];\n  for (let i = 0; i < 3; i++) {\n    if ((r[i] ?? 0) > (c[i] ?? 0)) return false;\n  }\n  return true;\n}\nif (!isVersionCompatible(currentVersion, payload.requiredVersion)) return false;\n","typeGuard":"function hasRequiredVersion(p: unknown): p is { requiredVersion: string } {\n  return !!p && typeof p === 'object' &&\n    typeof (p as any).requiredVersion === 'string' &&\n    /^\\d+(\\.\\d+)*$/.test((p as any).requiredVersion);\n}\n","tryCatchPattern":"// version gate is pre-checked; wrap import for residual errors\nif (!(await ensureExternalImportVersionCompatible(normalized))) return false;\ntry {\n  await importProvider(normalized);\n} catch (e) {\n  console.warn('[ExternalImport][App] 导入失败', e);\n  return false;\n}","preventionTips":["Check app version before sharing export files between machines","Normalize version strings (semver) before comparison","Show the required version in the error dialog so users know what to upgrade to"],"tags":["version-compatibility","import","validation"],"backgroundTag":"version-not-supported","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"}