{"record":{"id":"c8cd7b76c7e030f8","repo":"continuedev/continue","slug":"multiediteditsarrayrequired","errorCode":"MultiEditEditsArrayRequired","errorMessage":"invalid multi-edit args","messagePattern":"invalid multi-edit args","errorType":"validation","errorClass":"ContinueError","httpStatus":null,"severity":"error","filePath":"core/edit/searchAndReplace/multiEditValidation.ts","lineNumber":15,"sourceCode":"import { EditOperation } from \"../../tools/definitions/multiEdit\";\nimport { ContinueError, ContinueErrorReason } from \"../../util/errors\";\nimport { validateSingleEdit } from \"./findAndReplaceUtils\";\n\n/**\n * Validates multi-edit arguments and all edits in a single pass\n * @param args - The arguments object containing the edits array\n * @returns Validated edits array\n * @throws ContinueError if validation fails\n */\nexport function validateMultiEdit(args: unknown): {\n  edits: EditOperation[];\n} {\n  if (typeof args !== \"object\" || !args || !(\"edits\" in args)) {\n    throw new ContinueError(\n      ContinueErrorReason.MultiEditEditsArrayRequired,\n      \"invalid multi-edit args\",\n    );\n  }\n\n  // Validate that edits is a non-empty array\n  if (!Array.isArray(args.edits)) {\n    throw new ContinueError(\n      ContinueErrorReason.MultiEditEditsArrayRequired,\n      \"edits array is required\",\n    );\n  }\n  const { edits } = args;\n\n  if (edits.length === 0) {\n    throw new ContinueError(\n      ContinueErrorReason.MultiEditEditsArrayEmpty,\n      \"edits array must contain at least one edit\",","sourceCodeStart":1,"sourceCodeEnd":33,"githubUrl":"https://github.com/continuedev/continue/blob/5522c6f44ca0ac3528b37244818fbfa39b5af470/core/edit/searchAndReplace/multiEditValidation.ts#L1-L33","documentation":"Thrown by validateMultiEdit when the multi-edit arguments are not a non-null object containing an 'edits' property. This is the outermost shape check before any edit is inspected individually, guarding against completely malformed input.","triggerScenarios":"Calling multi-edit with null, undefined, a string, an array, or an object without an 'edits' key, e.g. passing the edits array directly instead of wrapping it in { edits: [...] }.","commonSituations":"LLM tool-call JSON that forgot the wrapper object; callers spreading the wrong variable; passing { edit: [...] } (singular) by typo.","solutions":["Wrap the array: call with { edits: [...] }","Check the key name is exactly 'edits' (plural)","If building the payload dynamically, assert Object.prototype.hasOwnProperty.call(args, 'edits') first"],"exampleFix":"// before\nawait multiEdit([{ old_string: \"a\", new_string: \"b\" }]);\n// after\nawait multiEdit({ edits: [{ old_string: \"a\", new_string: \"b\" }] });","handlingStrategy":"validation","validationCode":"if (typeof args !== 'object' || args === null || !('edits' in args)) throw new TypeError('expected { edits: [...] }');","typeGuard":"const isMultiEditArgs = (a: unknown): a is { edits: unknown[] } => typeof a === 'object' && a !== null && Array.isArray((a as any).edits);","tryCatchPattern":"catch (e) { if (e.message.includes('invalid multi-edit args')) fixPayloadShape(); else throw e; }","preventionTips":["Always wrap the array in { edits: [...] }","Type the tool input as { edits: Edit[] }","Add a JSON-schema 'required: [edits]' to tool definitions"],"tags":["multi-edit","validation","args","shape"],"backgroundTag":"schema-validation-failed","analyzedSha":"5522c6f44ca0ac3528b37244818fbfa39b5af470","analyzedAt":"2026-08-27T11:28:54.683Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}