Portal Community

When Manual Resolution is Triggered

Manual Resolution API Flow

1

Import Pauses

When conflicts are found and no default strategy is configured, the import returns 202 Accepted with the ConflictReport and a resumeUrl.

2

Get Conflict Diff

For each conflict, retrieve the full side-by-side diff to understand what would change.

GET /api/installhub/packages/{importId}/conflicts/{conflictId}/diff
3

Choose Resolution

For each conflict, choose Replace, Merge, or Skip.

POST /api/installhub/packages/{importId}/resume
{
  "resolutions": [
    { "conflictId": "conf-001", "strategy": "Replace" },
    { "conflictId": "conf-002", "strategy": "Skip"    }
  ]
}
4

Import Resumes

The import continues with the chosen strategies applied and completes normally.

Conflict Diff Response

GET /api/installhub/packages/{importId}/conflicts/conf-001/diff

{
  "conflictId":    "conf-001",
  "artifactType":  "RuleSet",
  "artifactName":  "ApprovalRules",
  "existing": {
    "version": "1.1.0",
    "content": { "rules": [{ "ruleId": "r1", "condition": "amount < 750" }] }
  },
  "package": {
    "version": "1.2.0",
    "content": { "rules": [{ "ruleId": "r1", "condition": "amount < 1000" }, { "ruleId": "r3", "name": "HighValueAlert" }] }
  },
  "diff": {
    "changed": [{ "path": "rules[0].condition", "existing": "amount < 750", "package": "amount < 1000" }],
    "added":   [{ "path": "rules[1]", "package": { "ruleId": "r3", "name": "HighValueAlert" } }],
    "removed": []
  },
  "suggestedStrategies": ["Replace", "Merge", "Skip"]
}

Import Expiry

A paused import (waiting for conflict resolution) is held in memory for 24 hours. If the resumeUrl is not called within that time, the import is automatically cancelled and must be re-initiated.

CI/CD Pipelines Should Not Use Manual Resolution Manual resolution requires a human in the loop. For automated pipelines, always set a defaultConflictStrategy to prevent the import from pausing. Use dry-run mode first to preview conflicts before the real import.