{
  "name": "AI Autonomous Bug-Fixing Pipeline",
  "nodes": [
    {
      "id": "6846ff97-3680-4ed8-808d-ec0f9b685a49",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        -1008
      ],
      "parameters": {
        "width": 480,
        "height": 1088,
        "content": "## AI Autonomous Bug-Fixing Pipeline\n\n### How it works\n\nThis workflow receives ClickUp bug reports through a webhook, normalizes the bug details, and uses an OpenAI-powered agent to identify the root cause and propose a fix plan. It scores whether the issue is safe for autonomous fixing, routes uncertain cases through Slack developer approval, then sends the approved fix task to a Cursor background agent. After Cursor completes the fix and tests, the workflow prepares follow-up payloads, creates a GitHub pull request, updates the ClickUp task, and returns a success response.\n\n### Setup steps\n\n- Configure the ClickUp webhook to send new bug reports to the n8n webhook URL, and ensure the incoming payload contains the bug ID, task name, description, and stack trace fields expected by the config node.\n- Add OpenAI credentials for the chat model used by the AI Agent node.\n- Configure Slack credentials and the target channel or user for manual review notifications.\n- Set the Cursor API URL and authentication details used by the HTTP Request node to trigger the Cursor background agent.\n- Configure the wait/resume URLs or callback handling so developer approvals and Cursor completion events can resume the workflow correctly.\n- Add GitHub credentials with permission to create pull requests in the target repository, and configure ClickUp credentials with permission to update bug task status.\n\n### Customization\n\nAdjust the auto-fix eligibility scoring logic, Slack approval message, Cursor task payload, target repository/branch, and ClickUp status values to match the team’s risk tolerance and development process."
      },
      "typeVersion": 1
    },
    {
      "id": "5682238f-00d3-44f3-9b49-23332145624c",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        -832
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 320,
        "content": "## Receive bug report\n\nStarts the workflow when ClickUp reports a bug and extracts the core bug fields into a normalized configuration object."
      },
      "typeVersion": 1
    },
    {
      "id": "743215d3-343b-462c-86a7-9821b72859c6",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1280,
        -832
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 528,
        "content": "## Analyze fix eligibility\n\nUses the OpenAI-backed AI agent to analyze the bug, then parses, validates, normalizes, and scores the proposed fix plan for autonomous handling."
      },
      "typeVersion": 1
    },
    {
      "id": "2a67064a-7a9d-493f-a73b-ab1efdbd0d4c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1792,
        -1008
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 496,
        "content": "## Review approval path\n\nBranches based on the auto-fix score; eligible items continue automatically while lower-confidence bugs notify a developer in Slack and wait for approval before proceeding."
      },
      "typeVersion": 1
    },
    {
      "id": "7674b3d6-ed94-4cb6-8f71-07c29d19da9c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2512,
        -800
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 304,
        "content": "## Run Cursor agent\n\nBuilds the Cursor background-agent task payload, triggers the Cursor API, and waits for the fix and test completion callback."
      },
      "typeVersion": 1
    },
    {
      "id": "8381296a-ed09-4807-9190-7a4647b1a63c",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3232,
        -800
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 304,
        "content": "## Publish fix results\n\nParses the Cursor completion result, prepares PR and ClickUp payloads, creates a GitHub pull request, updates the ClickUp bug task, and sends the final webhook response."
      },
      "typeVersion": 1
    },
    {
      "id": "1bd58144-5273-4bf1-b0f9-77b547cf9836",
      "name": "When Bug Reported in ClickUp",
      "type": "n8n-nodes-base.webhook",
      "position": [
        880,
        -672
      ],
      "parameters": {
        "path": "clickup-bug-autofix",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    },
    {
      "id": "eb13d203-8da8-49b8-90b6-47acc626c54a",
      "name": "Prepare Bug Report Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1104,
        -672
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "name": "bugId",
              "type": "string",
              "value": "={{ $json.body.taskId }}"
            },
            {
              "name": "taskName",
              "type": "string",
              "value": "={{ $json.body.taskName || $json.body.name || 'Untitled bug' }}"
            },
            {
              "name": "description",
              "type": "string",
              "value": "={{ $json.body.description || '' }}"
            },
            {
              "name": "stackTrace",
              "type": "string",
              "value": "={{ $json.body.stackTrace || '' }}"
            },
            {
              "name": "repoUrl",
              "type": "string",
              "value": "={{ $json.body.repoUrl }}"
            },
            {
              "name": "repoBranch",
              "type": "string",
              "value": "={{ $json.body.repoBranch || 'main' }}"
            },
            {
              "name": "priority",
              "type": "string",
              "value": "={{ $json.body.priority || 'normal' }}"
            },
            {
              "name": "reporter",
              "type": "string",
              "value": "={{ $json.body.reporter || 'unknown' }}"
            },
            {
              "name": "clickupListId",
              "type": "string",
              "value": "={{ $json.body.listId }}"
            },
            {
              "name": "llmModel",
              "type": "string",
              "value": "gpt-4.1"
            },
            {
              "name": "autoFixConfidenceThreshold",
              "type": "number",
              "value": 0.75
            },
            {
              "name": "cursorApiUrl",
              "type": "string",
              "value": "https://api.cursor.com/v0/background-agents"
            },
            {
              "name": "cursorApiModel",
              "type": "string",
              "value": "cursor-fast"
            },
            {
              "name": "cursorCallbackWebhookUrl",
              "type": "string",
              "value": "https://your-n8n-instance.example.com/webhook-waiting/REPLACE_WITH_WAIT2_RESUME_ID"
            },
            {
              "name": "githubOwner",
              "type": "string",
              "value": "your-org"
            },
            {
              "name": "githubRepo",
              "type": "string",
              "value": "your-repo"
            },
            {
              "name": "testCommand",
              "type": "string",
              "value": "npm test"
            },
            {
              "name": "slackChannel",
              "type": "string",
              "value": "#eng-bugfixes"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2a1cf18b-c87e-4fb4-9a0e-f422c28fe569",
      "name": "OpenAI Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1456,
        -448
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "={{ $json.llmModel }}"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "6941a444-dfe7-40ef-9a51-73a76b611e42",
      "name": "Bug Fix Planner Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1328,
        -672
      ],
      "parameters": {
        "text": "=You are a senior software engineer diagnosing a bug reported in ClickUp task {{ $json.bugId }} for repository {{ $json.repoUrl }} (branch {{ $json.repoBranch }}).\n\nBug title: {{ $json.taskName }}\nPriority: {{ $json.priority }}\n\nDescription:\n{{ $json.description }}\n\nStack trace / logs (if any):\n{{ $json.stackTrace }}\n\nAnalyze this bug and determine:\n- rootCause: the underlying cause of the bug, in plain language\n- affectedFiles: array of specific file paths in the repository most likely involved in the fix\n- fixApproach: a concrete description of the code change strategy to resolve it\n- fixComplexity: one of low, medium, high\n- confidence: a number from 0 to 1 estimating how confident you are that an automated coding agent could safely implement this fix without human intervention\n- testPlan: which existing tests should verify the fix, and any new test cases that should be added\n- riskFlags: array of short strings flagging any sensitive areas this fix touches (e.g. \"auth\", \"payment\", \"database migration\", \"encryption\", \"user permissions\") — empty array if none apply\n\nReturn ONLY a JSON object (no markdown fences, no commentary) with exactly these keys: rootCause, affectedFiles, fixApproach, fixComplexity, confidence, testPlan, riskFlags.",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "3831ea68-dc0d-4371-a938-6acd92e850b8",
      "name": "Analyze Auto-Fix Eligibility",
      "type": "n8n-nodes-base.code",
      "position": [
        1616,
        -672
      ],
      "parameters": {
        "jsCode": "// Parse the AI agent's bug-analysis output, validate it, normalize fields,\n// and compute a deterministic auto-fix eligibility score. No extra API calls.\nconst cfg = $('Prepare Bug Report Data').first().json;\nconst agentOutput = $input.first().json;\n\nlet raw = agentOutput.output || agentOutput.text || agentOutput.response || '{}';\nraw = String(raw).replace(/```json|```/g, '').trim();\n\nlet parsed;\ntry {\n  parsed = JSON.parse(raw);\n} catch (e) {\n  throw new Error('Failed to parse AI bug-analysis output as JSON: ' + e.message);\n}\n\nconst COMPLEXITY_RANK = { low: 1, medium: 2, high: 3 };\n\nfunction normalizeComplexity(value) {\n  const c = String(value || '').toLowerCase().trim();\n  return COMPLEXITY_RANK.hasOwnProperty(c) ? c : 'medium';\n}\n\nfunction normalizeConfidence(value) {\n  const n = parseFloat(value);\n  if (isNaN(n)) return 0;\n  return Math.min(1, Math.max(0, n));\n}\n\nconst affectedFiles = Array.isArray(parsed.affectedFiles) ? parsed.affectedFiles.filter(Boolean) : [];\nconst riskFlags = Array.isArray(parsed.riskFlags) ? parsed.riskFlags.map(f => String(f).toLowerCase()) : [];\n\nconst HIGH_RISK_KEYWORDS = ['auth', 'payment', 'billing', 'migration', 'schema', 'secret', 'encryption', 'permission'];\nconst touchesHighRiskArea = riskFlags.some(f => HIGH_RISK_KEYWORDS.some(k => f.includes(k)));\n\nconst rootCause = parsed.rootCause || parsed.cause || 'Root cause not clearly identified.';\nconst fixApproach = parsed.fixApproach || parsed.approach || 'No fix approach provided.';\nconst fixComplexity = normalizeComplexity(parsed.fixComplexity || parsed.complexity);\nconst confidence = normalizeConfidence(parsed.confidence);\nconst testPlan = parsed.testPlan || parsed.tests || 'No test plan provided.';\n\n// Deterministic eligibility gate: high confidence, low/medium complexity,\n// no high-risk area touched, and at least one affected file identified.\nconst autoFixEligible =\n  confidence >= cfg.autoFixConfidenceThreshold &&\n  fixComplexity !== 'high' &&\n  !touchesHighRiskArea &&\n  affectedFiles.length > 0;\n\nconst fixId = 'FIX-' + cfg.bugId + '-' + Date.now();\n\nreturn [{\n  json: {\n    ...cfg,\n    fixId,\n    rootCause,\n    fixApproach,\n    fixComplexity,\n    confidence,\n    affectedFiles,\n    riskFlags,\n    touchesHighRiskArea,\n    testPlan,\n    autoFixEligible\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "ff85240b-5235-4cd2-a3ad-c3e6e836dd68",
      "name": "If Eligible for Auto-Fix",
      "type": "n8n-nodes-base.if",
      "position": [
        1840,
        -672
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $json.autoFixEligible === true }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "294da419-7595-4a3d-82d8-35bab165f67f",
      "name": "Notify Dev on Slack for Review",
      "type": "n8n-nodes-base.slack",
      "position": [
        2080,
        -848
      ],
      "parameters": {
        "text": "=🛠️ *Bug needs manual review before auto-fix* — ClickUp task `{{ $json.bugId }}`: *{{ $json.taskName }}*\n\nConfidence: {{ $json.confidence }} | Complexity: {{ $json.fixComplexity }} | Risk flags: {{ $json.riskFlags.join(', ') || 'none' }}\n\n*Root cause:* {{ $json.rootCause }}\n*Proposed fix:* {{ $json.fixApproach }}\n*Affected files:* {{ $json.affectedFiles.join(', ') }}\n\nReply to acknowledge and let the pipeline continue to Cursor, or handle this one manually instead.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $json.slackChannel }}"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "6caeedbc-41ee-416f-bc2a-af9a1adbed18",
      "name": "Wait for Dev Approval",
      "type": "n8n-nodes-base.wait",
      "position": [
        2304,
        -848
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "2b4e975d-e12b-475f-9765-3949fb6c60e2",
      "name": "Create Fix Task Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        2560,
        -672
      ],
      "parameters": {
        "jsCode": "// Combine the validated bug analysis with the review context (auto-approved because\n// confidence was high, or acknowledged by a developer via the Wait node above) into\n// a Cursor background-agent task payload.\nconst analysis = $('Analyze Auto-Fix Eligibility').first().json;\nconst resumeInput = $input.first().json;\n\nlet reviewedBy = 'auto (confidence ' + analysis.confidence + ' >= threshold ' + analysis.autoFixConfidenceThreshold + ')';\nlet reviewerNotes = '';\n\nif (!analysis.autoFixEligible) {\n  const body = resumeInput.body || resumeInput;\n  reviewedBy = body.reviewedBy || body.approvedBy || 'developer (unspecified)';\n  reviewerNotes = body.notes || body.reviewerNotes || '';\n}\n\nconst branchName = 'autofix/' + analysis.fixId.toLowerCase();\n\nconst prompt = [\n  'You are fixing a bug in the repository ' + analysis.repoUrl + ' (base branch: ' + analysis.repoBranch + ').',\n  'Bug: ' + analysis.taskName,\n  'Root cause: ' + analysis.rootCause,\n  'Fix approach: ' + analysis.fixApproach,\n  'Affected files: ' + analysis.affectedFiles.join(', '),\n  'Test plan: ' + analysis.testPlan,\n  'Create a new branch \"' + branchName + '\" from ' + analysis.repoBranch + ', implement the fix, run \"' + analysis.testCommand + '\", commit the changes, and report back a diff summary, the list of files changed, and whether the tests passed.'\n].join('\\n');\n\nreturn [{\n  json: {\n    ...analysis,\n    reviewedBy,\n    reviewerNotes,\n    branchName,\n    cursorPrompt: prompt\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "b79f2d18-564b-4242-8724-3f5907349340",
      "name": "Trigger Cursor Background Agent",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2832,
        -672
      ],
      "parameters": {
        "url": "={{ $json.cursorApiUrl }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify({ repository: $json.repoUrl, baseBranch: $json.repoBranch, branch: $json.branchName, model: $json.cursorApiModel, prompt: $json.cursorPrompt, testCommand: $json.testCommand, callbackUrl: $json.cursorCallbackWebhookUrl, metadata: { bugId: $json.bugId, fixId: $json.fixId, reviewedBy: $json.reviewedBy } }) }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth"
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "c0dffc4e-b439-46db-a7d5-ca25beba68c5",
      "name": "Wait for Cursor Completion",
      "type": "n8n-nodes-base.wait",
      "position": [
        3056,
        -672
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "8f88e35c-90ba-42d0-bc73-7215d507f6df",
      "name": "Process Cursor Result for PR",
      "type": "n8n-nodes-base.code",
      "position": [
        3280,
        -672
      ],
      "parameters": {
        "jsCode": "// Parse the Cursor agent's completion payload delivered via the resume webhook,\n// validate the test results, and build the GitHub PR + ClickUp update payloads.\nconst ctx = $('Create Fix Task Payload').first().json;\nconst resume = $input.first().json;\nconst result = resume.body || resume;\n\nconst testsPassed = result.testsPassed === true || String(result.testsPassed).toLowerCase() === 'true';\nconst filesChanged = Array.isArray(result.filesChanged) && result.filesChanged.length ? result.filesChanged : ctx.affectedFiles;\nconst diffSummary = result.diffSummary || result.summary || 'No diff summary provided by the agent.';\nconst commitSha = result.commitSha || null;\nconst status = testsPassed ? 'ready_for_review' : 'tests_failed';\n\nconst prTitle = '[Auto-fix] ' + ctx.taskName + ' (' + ctx.fixId + ')';\nconst prBody = [\n  '### Root cause',\n  ctx.rootCause,\n  '',\n  '### Fix approach',\n  ctx.fixApproach,\n  '',\n  '### Files changed',\n  filesChanged.map(f => '- ' + f).join('\\n'),\n  '',\n  '### Reviewed by',\n  ctx.reviewedBy + (ctx.reviewerNotes ? (' — ' + ctx.reviewerNotes) : ''),\n  '',\n  '### Test results',\n  testsPassed ? ('Passed: ' + ctx.testCommand) : ('Failed: ' + ctx.testCommand + ' — needs manual attention.'),\n  '',\n  diffSummary,\n  '',\n  '_Generated automatically from ClickUp task ' + ctx.bugId + '._'\n].join('\\n');\n\nconst clickupComment = testsPassed\n  ? 'Auto-fix branch \"' + ctx.branchName + '\" passed tests. Pull request opened for review.'\n  : 'Auto-fix branch \"' + ctx.branchName + '\" was created but tests failed (' + ctx.testCommand + '). PR opened as draft for manual follow-up.';\n\nreturn [{\n  json: {\n    ...ctx,\n    status,\n    testsPassed,\n    filesChanged,\n    diffSummary,\n    commitSha,\n    prTitle,\n    prBody,\n    clickupComment,\n    clickupStatus: testsPassed ? 'in review' : 'needs manual fix'\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "369ed088-84a7-432d-9064-3e349557a79b",
      "name": "Create GitHub Pull Request",
      "type": "n8n-nodes-base.github",
      "position": [
        3504,
        -672
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "expression",
          "value": "={{ $json.githubOwner }}"
        },
        "title": "={{ $json.prTitle }}",
        "resource": "pullRequest",
        "repository": {
          "__rl": true,
          "mode": "expression",
          "value": "={{ $json.githubRepo }}"
        }
      },
      "typeVersion": 1,
      "continueOnFail": true
    },
    {
      "id": "9d494840-1d52-4677-996c-775c74d50977",
      "name": "Update Bug Status in ClickUp",
      "type": "n8n-nodes-base.clickUp",
      "position": [
        3728,
        -672
      ],
      "parameters": {
        "operation": "update",
        "updateFields": {
          "status": "={{ $('Process Cursor Result for PR').item.json.clickupStatus }}"
        }
      },
      "typeVersion": 1,
      "continueOnFail": true
    },
    {
      "id": "bb6668f5-43ed-4444-9fd9-cce152b8ee9b",
      "name": "Respond Success to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        3952,
        -672
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ bugId: $('Analyze Auto-Fix Eligibility').item.json.bugId, fixId: $('Analyze Auto-Fix Eligibility').item.json.fixId, taskName: $('Analyze Auto-Fix Eligibility').item.json.taskName, autoFixEligible: $('Analyze Auto-Fix Eligibility').item.json.autoFixEligible, reviewedBy: $('Create Fix Task Payload').item.json.reviewedBy, branchName: $('Create Fix Task Payload').item.json.branchName, status: $('Process Cursor Result for PR').item.json.status, testsPassed: $('Process Cursor Result for PR').item.json.testsPassed, prTitle: $('Create GitHub Pull Request').item.json.title, prUrl: $('Create GitHub Pull Request').item.json.html_url, clickupStatus: $('Process Cursor Result for PR').item.json.clickupStatus }) }}"
      },
      "typeVersion": 1.1
    }
  ],
  "connections": {
    "OpenAI Model": {
      "ai_languageModel": [
        [
          {
            "node": "Bug Fix Planner Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Bug Fix Planner Agent": {
      "main": [
        [
          {
            "node": "Analyze Auto-Fix Eligibility",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Dev Approval": {
      "main": [
        [
          {
            "node": "Create Fix Task Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Fix Task Payload": {
      "main": [
        [
          {
            "node": "Trigger Cursor Background Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Bug Report Data": {
      "main": [
        [
          {
            "node": "Bug Fix Planner Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Eligible for Auto-Fix": {
      "main": [
        [
          {
            "node": "Create Fix Task Payload",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Dev on Slack for Review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create GitHub Pull Request": {
      "main": [
        [
          {
            "node": "Update Bug Status in ClickUp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Cursor Completion": {
      "main": [
        [
          {
            "node": "Process Cursor Result for PR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Auto-Fix Eligibility": {
      "main": [
        [
          {
            "node": "If Eligible for Auto-Fix",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Cursor Result for PR": {
      "main": [
        [
          {
            "node": "Create GitHub Pull Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Bug Status in ClickUp": {
      "main": [
        [
          {
            "node": "Respond Success to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Bug Reported in ClickUp": {
      "main": [
        [
          {
            "node": "Prepare Bug Report Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Dev on Slack for Review": {
      "main": [
        [
          {
            "node": "Wait for Dev Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger Cursor Background Agent": {
      "main": [
        [
          {
            "node": "Wait for Cursor Completion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false
}
