{"version":3,"sources":["../src/cli/commands/model-defaults/unset.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\n\nimport {\n  type ModelDefaultScopeType,\n  ModelDefaultsApiService,\n} from \"@/client-sdk/services/model-defaults/model-defaults-api.service\";\n\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { failSpinner } from \"../../utils/spinnerError\";\n\ntype ScopeKind = \"project\" | \"team\" | \"organization\";\n\nexport interface UnsetModelDefaultOptions {\n  scope?: ScopeKind;\n  scopeId?: string;\n  format?: string;\n}\n\nfunction resolveScope(\n  options: UnsetModelDefaultOptions,\n  snapshotScope: {\n    projectId: string;\n    teamId: string | null;\n    organizationId: string | null;\n  },\n): { scopeType: ModelDefaultScopeType; scopeId: string } {\n  const kind: ScopeKind = options.scope ?? \"project\";\n\n  if (options.scopeId) {\n    return { scopeType: kind.toUpperCase() as ModelDefaultScopeType, scopeId: options.scopeId };\n  }\n  if (kind === \"project\") {\n    return { scopeType: \"PROJECT\", scopeId: snapshotScope.projectId };\n  }\n  if (kind === \"team\") {\n    if (!snapshotScope.teamId) {\n      throw new Error(\n        \"No team scope available for this API key. Pass --scope-id <teamId> explicitly.\",\n      );\n    }\n    return { scopeType: \"TEAM\", scopeId: snapshotScope.teamId };\n  }\n  if (!snapshotScope.organizationId) {\n    throw new Error(\n      \"No organization scope available for this API key. Pass --scope-id <organizationId> explicitly.\",\n    );\n  }\n  return { scopeType: \"ORGANIZATION\", scopeId: snapshotScope.organizationId };\n}\n\n/**\n * Remove a single key from the config attached at the target scope.\n * If the config has no other keys left, deletes it outright — an empty\n * config doesn't carry any cascade signal and occupies the same-scope\n * tiebreak slot.\n */\nexport const unsetModelDefaultCommand = async (\n  key: string,\n  options: UnsetModelDefaultOptions,\n): Promise<void> => {\n  checkApiKey();\n\n  const service = new ModelDefaultsApiService();\n  const spinner = ora(`Unsetting ${chalk.cyan(key)}...`).start();\n\n  try {\n    const snapshot = await service.getSnapshot();\n    const target = resolveScope(options, snapshot.scope);\n\n    const existing = snapshot.configs.filter((c) =>\n      c.scopes.some(\n        (s) => s.type === target.scopeType && s.id === target.scopeId,\n      ),\n    );\n\n    if (existing.length === 0 || !existing.some((c) => key in c.config)) {\n      spinner.succeed(\n        `No ${chalk.cyan(key)} entry at ${target.scopeType.toLowerCase()}:${target.scopeId}; nothing to do.`,\n      );\n      return;\n    }\n\n    const sorted = [...existing].sort((a, b) =>\n      a.createdAt > b.createdAt ? -1 : 1,\n    );\n    const current = sorted[0]!;\n    const nextPayload: Record<string, string> = { ...current.config };\n    delete nextPayload[key];\n\n    if (Object.keys(nextPayload).length === 0) {\n      await service.deleteConfig(current.id);\n      spinner.succeed(\n        `Deleted config ${chalk.green(current.id)} (no keys left) at ${target.scopeType.toLowerCase()}:${target.scopeId}`,\n      );\n      if (options.format === \"json\") {\n        console.log(\n          JSON.stringify(\n            { id: current.id, key, scope: target, deleted: true },\n            null,\n            2,\n          ),\n        );\n      }\n      return;\n    }\n\n    await service.updateConfig(current.id, { config: nextPayload });\n    spinner.succeed(\n      `Removed ${chalk.cyan(key)} from config ${chalk.green(current.id)} at ${target.scopeType.toLowerCase()}:${target.scopeId}`,\n    );\n    if (options.format === \"json\") {\n      console.log(\n        JSON.stringify(\n          { id: current.id, key, scope: target, deleted: false },\n          null,\n          2,\n        ),\n      );\n    }\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"unset default model\" });\n    process.exit(1);\n  }\n};\n"],"mappings":"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","names":[]}