)]}'
{
  "commit": "022ec60f69932cbb358d7561977d69341bdfe612",
  "tree": "d764762ddbbf381c321095a9a7f23eec9fbed13f",
  "parents": [
    "1b00c2c3c7819abe09898e6fe0da2e7f1fb65944"
  ],
  "author": {
    "name": "Jacek Centkowski",
    "email": "geminica.programs@gmail.com",
    "time": "Fri May 22 08:41:35 2026 +0200"
  },
  "committer": {
    "name": "Jacek Centkowski",
    "email": "geminica.programs@gmail.com",
    "time": "Fri May 22 08:41:35 2026 +0200"
  },
  "message": "Preserve upstream provider detail in OpenRouter errors\n\nOpenRouter wraps the real upstream failure under `error.metadata`\n(`provider_name`, `raw`). The previous `extractErrorMessage` only\ntook `error.message`, leaving users with the generic\n`Provider returned error` whenever the upstream model returned a\nnon-2xx (rate limits, quota exhaustion, model-side failures).\n\nAppend the metadata when present so the surfaced message looks\nlike:\n\n  Provider returned error: provider\u003dVenice, qwen/qwen3-coder:free\n  is temporarily rate-limited upstream. Please retry shortly, ...\n\nDrop the `[${code}]` prefix from the formatted message: the HTTP\nstatus is already logged by `AiHttpClientImpl` and exposed\nseparately on `AiCodeReviewOutput.error.status_code`.\n\nChange-Id: I7e4075a209d1062bc2149b96f8c2c67e3c820738\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7cf579d9d9d4324dca012e7e2294d8f444007ea6",
      "old_mode": 33188,
      "old_path": "ai/ai-review-agent-openrouter-1.0.groovy",
      "new_id": "4b504eddc78fc12be2f8ac5b39cafb1cbc94d87e",
      "new_mode": 33188,
      "new_path": "ai/ai-review-agent-openrouter-1.0.groovy"
    }
  ]
}
