fix(auth): scope km alias mapping to settings profiles

- prevent km continuity mappings from affecting kimi cliproxy executions

- apply canonical alias fallback only for settings profile lookups

- add regression test for cross-type alias isolation
This commit is contained in:
Tam Nhu Tran
2026-03-03 02:58:49 +07:00
parent 1eb41cc4e2
commit d827c3ab0b
2 changed files with 33 additions and 6 deletions
+11 -6
View File
@@ -65,12 +65,13 @@ function loadLegacyContinuityInheritanceMap(): Record<string, string> {
function resolveMappedAccount(
profileName: string,
profileType: ProfileType,
inheritFromAccount: Record<string, string>
): string | undefined {
const candidates = new Set<string>([
...getProfileLookupCandidates(profileName),
resolveAliasToCanonical(profileName),
]);
const candidates = new Set<string>(getProfileLookupCandidates(profileName));
if (profileType === 'settings') {
candidates.add(resolveAliasToCanonical(profileName));
}
for (const candidate of candidates) {
const mapped = inheritFromAccount[candidate];
@@ -118,9 +119,13 @@ export async function resolveProfileContinuityInheritance(
const inheritFromAccount = getContinuityInheritanceMap();
const sourceAccount =
resolveMappedAccount(input.profileName, inheritFromAccount) ??
resolveMappedAccount(input.profileName, input.profileType, inheritFromAccount) ??
(!isUnifiedMode()
? resolveMappedAccount(input.profileName, loadLegacyContinuityInheritanceMap())
? resolveMappedAccount(
input.profileName,
input.profileType,
loadLegacyContinuityInheritanceMap()
)
: undefined);
if (!sourceAccount) {
return {};
@@ -258,6 +258,28 @@ describe('resolveProfileContinuityInheritance', () => {
});
});
it('does not apply km settings alias mapping to kimi cliproxy profile', async () => {
spyOn(configLoader, 'loadOrCreateUnifiedConfig').mockReturnValue({
version: 8,
continuity: {
inherit_from_account: {
km: 'pro',
},
},
} as ReturnType<typeof configLoader.loadOrCreateUnifiedConfig>);
const ensureInstanceSpy = spyOn(InstanceManager.prototype, 'ensureInstance');
const result = await resolveProfileContinuityInheritance({
profileName: 'kimi',
profileType: 'cliproxy',
target: 'claude',
});
expect(result).toEqual({});
expect(ensureInstanceSpy).not.toHaveBeenCalled();
});
it('fails open when source account instance initialization throws', async () => {
spyOn(configLoader, 'loadOrCreateUnifiedConfig').mockReturnValue({
version: 8,