deepseek-ai/deepseek-harness · error · PresetExistsError
agent-presets: preset "${presetId}" already exists — a copy
Error message
agent-presets: preset "${presetId}" already exists — a copy never overwrites; delete the existing preset first or choose another id What it means
Error "agent-presets: preset "${presetId}" already exists — a copy never overwrites; delete the existing preset first or choose another id" thrown in deepseek-ai/deepseek-harness.
Source
Thrown at packages/preset/agent-presets/src/authoring.ts:147
* @param source - the resolved preset the copy starts from.
* @param id - the new preset's id, which becomes its directory name.
* @param name - display name for the copy; omitted falls back to the id.
* @returns the absolute path of the new preset directory.
* @throws when the id is unusable or already occupied on disk, or the
* deployment configures no writable root.
*/
export async function copyComposition(
roots: readonly PresetRoot[],
source: AgentPreset,
id: string,
name?: string,
): Promise<string> {
if (!PRESET_ID.test(id)) throw new InvalidPresetIdError(id)
const dir = join(writableRoot(roots), id)
// The roster check upstream only sees discovered presets; a directory with
// no composition file still occupies the name and deserves a readable
// refusal rather than a filesystem error code.
if (await occupied(dir)) throw new PresetExistsError(id)
try {
await cp(dirname(source.path), dir, {
recursive: true, dereference: true, force: false, errorOnExist: true,
})
await tightenModes(dir)
const rendered = renderPresetMetadata({
...name === undefined ? {} : { name },
...source.description === undefined ? {} : { description: source.description },
})
const metadataPath = join(dir, METADATA_FILE)
if (rendered === undefined) {
await rm(metadataPath, { force: true })
} else {
await writeFileAtomic(metadataPath, rendered, { mode: 0o600, dirMode: 0o700 })
}
} catch (error) {
// A half-copied directory would be invisible to discovery at best and a
// mountable-but-incomplete preset at worst; a failed copy leaves nothing.View on GitHub (pinned to b150a551b8)
Solutions
- Delete the existing preset first, or choose another id.
When it happens
Trigger: Thrown at packages/preset/agent-presets/src/authoring.ts:147 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of deepseek-ai/deepseek-harness@b150a551b8 (2026-08-24).
Data as JSON: /api/errors/0503188821119f9e.
Report an issue: GitHub.