@@ -736,6 +736,30 @@ function renameMappedProfileIdKeys(
|
736 | 736 | return changed; |
737 | 737 | } |
738 | 738 | |
| 739 | +function canonicalizeOpenAILastGood( |
| 740 | +record: Record<string, unknown>, |
| 741 | +profileIdMap: Map<string, string>, |
| 742 | +): boolean { |
| 743 | +let changed = false; |
| 744 | +const legacyValue = record[LEGACY_OPENAI_CODEX_PROVIDER_ID]; |
| 745 | +const canonicalValue = record[OPENAI_PROVIDER_ID]; |
| 746 | +if (legacyValue !== undefined) { |
| 747 | +delete record[LEGACY_OPENAI_CODEX_PROVIDER_ID]; |
| 748 | +changed = true; |
| 749 | +if (canonicalValue === undefined && typeof legacyValue === "string") { |
| 750 | +record[OPENAI_PROVIDER_ID] = profileIdMap.get(legacyValue) ?? legacyValue; |
| 751 | +} |
| 752 | +} |
| 753 | +if (typeof record[OPENAI_PROVIDER_ID] === "string") { |
| 754 | +const mapped = profileIdMap.get(record[OPENAI_PROVIDER_ID]); |
| 755 | +if (mapped) { |
| 756 | +record[OPENAI_PROVIDER_ID] = mapped; |
| 757 | +changed = true; |
| 758 | +} |
| 759 | +} |
| 760 | +return changed; |
| 761 | +} |
| 762 | + |
739 | 763 | export function maybeRepairOpenAICodexAuthConfig( |
740 | 764 | cfg: OpenClawConfig, |
741 | 765 | options?: { profileIdMap?: ReadonlyMap<string, string> }, |
@@ -796,10 +820,13 @@ function resolveOpenAICodexAuthStoreRepair(
|
796 | 820 | const usageChanged = isRecord(raw.usageStats) |
797 | 821 | ? renameMappedProfileIdKeys(raw.usageStats, rewrite.profileIdMap) |
798 | 822 | : false; |
| 823 | +const lastGoodChanged = isRecord(raw.lastGood) |
| 824 | + ? canonicalizeOpenAILastGood(raw.lastGood, rewrite.profileIdMap) |
| 825 | + : false; |
799 | 826 | if (rewrite.profileIdMap.size > 0) { |
800 | 827 | replaceMappedProfileId(raw, rewrite.profileIdMap); |
801 | 828 | } |
802 | | -const changed = rewrite.changed || orderChanged || usageChanged; |
| 829 | +const changed = rewrite.changed || orderChanged || usageChanged || lastGoodChanged; |
803 | 830 | return changed |
804 | 831 | ? { |
805 | 832 | authPath: candidate.authPath, |
|