FIX - LAUNCHER: sync Codex Agent API entitlement

This commit is contained in:
DCCONSTRUCTIONS 2026-05-16 14:22:19 +03:00
parent 2618e88e83
commit ec91821fdc
4 changed files with 11 additions and 28 deletions

View File

@ -168,7 +168,7 @@ export function createControlPlaneStore({ projectRoot }) {
async function updateClient(clientId, payload, identity) { async function updateClient(clientId, payload, identity) {
const data = readData(); const data = readData();
const actor = resolveActor(data, identity); const actor = resolveActor(data, identity);
const client = findById(data.clients, clientId, "client"); const client = findClientById(data, clientId);
client.type = pickEnum(payload?.type, clientTypes, client.type); client.type = pickEnum(payload?.type, clientTypes, client.type);
client.name = optionalString(payload?.name, client.name); client.name = optionalString(payload?.name, client.name);
@ -332,7 +332,7 @@ export function createControlPlaneStore({ projectRoot }) {
async function deleteClient(clientId, identity) { async function deleteClient(clientId, identity) {
const data = readData(); const data = readData();
const actor = resolveActor(data, identity); const actor = resolveActor(data, identity);
const client = findById(data.clients, clientId, "client"); const client = findClientById(data, clientId);
if (data.clients.length <= 1) { if (data.clients.length <= 1) {
throw new Error("Cannot delete the last client"); throw new Error("Cannot delete the last client");
@ -1564,16 +1564,12 @@ export function createControlPlaneStore({ projectRoot }) {
const serviceId = requireString(payload?.serviceId, "serviceId"); const serviceId = requireString(payload?.serviceId, "serviceId");
const moduleId = pickEnum(payload?.moduleId, serviceModuleIds, "codex_agents"); const moduleId = pickEnum(payload?.moduleId, serviceModuleIds, "codex_agents");
const enabled = payload?.enabled === true; const enabled = payload?.enabled === true;
const client = findById(data.clients, clientId, "client"); const client = findClientById(data, clientId);
const user = findById(data.users, userId, "user"); const user = findById(data.users, userId, "user");
const service = findById(data.services, serviceId, "service"); const service = findById(data.services, serviceId, "service");
const existingEntitlement = data.serviceModuleEntitlements.find( const existingEntitlement = data.serviceModuleEntitlements.find(
(entitlement) => (entitlement) => entitlement.userId === user.id && entitlement.serviceId === service.id && entitlement.moduleId === moduleId
entitlement.clientId === client.id &&
entitlement.userId === user.id &&
entitlement.serviceId === service.id &&
entitlement.moduleId === moduleId
); );
let entitlement = null; let entitlement = null;
@ -1583,13 +1579,13 @@ export function createControlPlaneStore({ projectRoot }) {
existingEntitlement ?? existingEntitlement ??
{ {
id: uniqueId(data.serviceModuleEntitlements, "svc_module", `${client.id}-${service.slug}-${user.email}-${moduleId}`), id: uniqueId(data.serviceModuleEntitlements, "svc_module", `${client.id}-${service.slug}-${user.email}-${moduleId}`),
clientId: client.id,
userId: user.id, userId: user.id,
serviceId: service.id, serviceId: service.id,
moduleId, moduleId,
createdByUserId: actor.id, createdByUserId: actor.id,
createdAt: now, createdAt: now,
}; };
entitlement.clientId = client.id;
entitlement.enabled = true; entitlement.enabled = true;
entitlement.updatedAt = now; entitlement.updatedAt = now;
@ -1598,13 +1594,7 @@ export function createControlPlaneStore({ projectRoot }) {
} }
} else { } else {
data.serviceModuleEntitlements = data.serviceModuleEntitlements.filter( data.serviceModuleEntitlements = data.serviceModuleEntitlements.filter(
(candidate) => (candidate) => !(candidate.userId === user.id && candidate.serviceId === service.id && candidate.moduleId === moduleId)
!(
candidate.clientId === client.id &&
candidate.userId === user.id &&
candidate.serviceId === service.id &&
candidate.moduleId === moduleId
)
); );
} }

View File

@ -2581,14 +2581,10 @@ function resolveUserServiceModules(data, user, serviceSlug, clientId) {
return { codex_agents: true }; return { codex_agents: true };
} }
const normalizedClientId = normalizeOptionalText(clientId);
if (!normalizedClientId) return {};
return Object.fromEntries( return Object.fromEntries(
(data.serviceModuleEntitlements ?? []) (data.serviceModuleEntitlements ?? [])
.filter( .filter(
(entitlement) => (entitlement) =>
entitlement.clientId === normalizedClientId &&
entitlement.userId === user.id && entitlement.userId === user.id &&
entitlement.serviceId === service.id && entitlement.serviceId === service.id &&
entitlement.enabled entitlement.enabled
@ -3287,9 +3283,7 @@ function scopeControlPlaneData(data, scope) {
return false; return false;
}), }),
exceptions: data.exceptions.filter((exception) => userIds.has(exception.userId)), exceptions: data.exceptions.filter((exception) => userIds.has(exception.userId)),
serviceModuleEntitlements: data.serviceModuleEntitlements.filter( serviceModuleEntitlements: data.serviceModuleEntitlements.filter((entitlement) => userIds.has(entitlement.userId)),
(entitlement) => clientIds.has(entitlement.clientId) && userIds.has(entitlement.userId)
),
taskManagerMemberships: data.taskManagerMemberships.filter( taskManagerMemberships: data.taskManagerMemberships.filter(
(membership) => clientIds.has(membership.clientId) && userIds.has(membership.userId) (membership) => clientIds.has(membership.clientId) && userIds.has(membership.userId)
), ),

View File

@ -520,7 +520,7 @@ export function LauncherApp() {
} }
function handleSetServiceModuleEntitlement(command: SetServiceModuleEntitlementCommand) { function handleSetServiceModuleEntitlement(command: SetServiceModuleEntitlementCommand) {
const entitlementKey = `${command.clientId}:${command.userId}:${command.serviceId}:${command.moduleId}`; const entitlementKey = `${command.userId}:${command.serviceId}:${command.moduleId}`;
if (pendingServiceModuleEntitlements[entitlementKey]) { if (pendingServiceModuleEntitlements[entitlementKey]) {
return; return;

View File

@ -4826,14 +4826,13 @@ function accessCellKey(userId: string, serviceId: string): string {
return `${userId}:${serviceId}`; return `${userId}:${serviceId}`;
} }
function serviceModuleEntitlementKey(clientId: string, userId: string, serviceId: string, moduleId: ServiceModuleId): string { function serviceModuleEntitlementKey(_clientId: string, userId: string, serviceId: string, moduleId: ServiceModuleId): string {
return `${clientId}:${userId}:${serviceId}:${moduleId}`; return `${userId}:${serviceId}:${moduleId}`;
} }
function hasServiceModuleEntitlement(data: LauncherData, clientId: string, userId: string, serviceId: string, moduleId: ServiceModuleId): boolean { function hasServiceModuleEntitlement(data: LauncherData, _clientId: string, userId: string, serviceId: string, moduleId: ServiceModuleId): boolean {
return data.serviceModuleEntitlements.some( return data.serviceModuleEntitlements.some(
(entitlement) => (entitlement) =>
entitlement.clientId === clientId &&
entitlement.userId === userId && entitlement.userId === userId &&
entitlement.serviceId === serviceId && entitlement.serviceId === serviceId &&
entitlement.moduleId === moduleId && entitlement.moduleId === moduleId &&