name: Issue Labeler

on:
  issues:
    types:
      - opened
      - labeled

jobs:
  gather-labels:
    name: Generate label suggestions
    # Prevent runs on forks (requires OpenAI API key, wastes Actions minutes)
    if: github.repository == 'openai/codex' && (github.event.action == 'opened' || (github.event.action == 'labeled' && github.event.label.name == 'codex-label'))
    runs-on: ubuntu-latest
    permissions:
      contents: read
    outputs:
      codex_output: ${{ steps.codex.outputs.final-message }}
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

      - id: codex
        uses: openai/codex-action@0b91f4a2703c23df3102c3f0967d3c6db34eedef # v1
        with:
          openai-api-key: ${{ secrets.CODEX_OPENAI_API_KEY }}
          allow-users: "*"
          prompt: |
            You are an assistant that reviews GitHub issues for the repository.

            Your job is to choose the most appropriate labels for the issue described later in this prompt.
            Follow these rules:

            - Add one (and only one) of the following three labels to distinguish the type of issue. Default to "bug" if unsure.
            1. bug — Reproducible defects in Codex products (CLI, VS Code extension, web, auth).
            2. enhancement — Feature requests or usability improvements that ask for new capabilities, better ergonomics, or quality-of-life tweaks.
            3. documentation — Updates or corrections needed in docs/README/config references (broken links, missing examples, outdated keys, clarification requests).

            - If applicable, add one of the following labels to specify which sub-product or product surface the issue relates to.
            1. CLI — the Codex command line interface.
            2. extension — VS Code (or other IDE) extension-specific issues.
            3. app - Issues related to the Codex desktop application.
            4. codex-web — Issues targeting the Codex web UI/Cloud experience.
            5. github-action — Issues with the Codex GitHub action.
            6. iOS — Issues with the Codex iOS app.

            - Additionally add zero or more of the following labels that are relevant to the issue content. Prefer a small set of precise labels over many broad ones.
            1. windows-os — Bugs or friction specific to Windows environments (always when PowerShell is mentioned, path handling, copy/paste, OS-specific auth or tooling failures).
            2. mcp — Topics involving Model Context Protocol servers/clients.
            3. mcp-server — Problems related to the codex mcp-server command, where codex runs as an MCP server.
            4. azure — Problems or requests tied to Azure OpenAI deployments.
            5. model-behavior — Undesirable LLM behavior: forgetting goals, refusing work, hallucinating environment details, quota misreports, or other reasoning/performance anomalies.
            6. code-review — Issues related to the code review feature or functionality.
            7. safety-check - Issues related to cyber risk detection or trusted access verification.
            8. auth - Problems related to authentication, login, or access tokens.
            9. codex-exec - Problems related to the "codex exec" command or functionality.
            10. context-management - Problems related to compaction, context windows, or available context reporting.
            11. custom-model - Problems that involve using custom model providers, local models, or OSS models.
            12. rate-limits - Problems related to token limits, rate limits, or token usage reporting.
            13. sandbox - Issues related to local sandbox environments or tool call approvals to override sandbox restrictions.
            14. tool-calls - Problems related to specific tool call invocations including unexpected errors, failures, or hangs.
            15. TUI - Problems with the terminal user interface (TUI) including keyboard shortcuts, copy & pasting, menus, or screen update issues.

            Issue number: ${{ github.event.issue.number }}

            Issue title:
            ${{ github.event.issue.title }}

            Issue body:
            ${{ github.event.issue.body }}

            Repository full name:
            ${{ github.repository }}

          output-schema: |
            {
              "type": "object",
              "properties": {
                "labels": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": ["labels"],
              "additionalProperties": false
            }

  apply-labels:
    name: Apply labels from Codex output
    needs: gather-labels
    if: ${{ needs.gather-labels.result != 'skipped' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write
    env:
      GH_TOKEN: ${{ github.token }}
      GH_REPO: ${{ github.repository }}
      ISSUE_NUMBER: ${{ github.event.issue.number }}
      CODEX_OUTPUT: ${{ needs.gather-labels.outputs.codex_output }}
    steps:
      - name: Apply labels
        run: |
          json=${CODEX_OUTPUT//$'\r'/}
          if [ -z "$json" ]; then
            echo "Codex produced no output. Skipping label application."
            exit 0
          fi

          if ! printf '%s' "$json" | jq -e 'type == "object" and (.labels | type == "array")' >/dev/null 2>&1; then
            echo "Codex output did not include a labels array. Raw output: $json"
            exit 0
          fi

          labels=$(printf '%s' "$json" | jq -r '.labels[] | tostring')
          if [ -z "$labels" ]; then
            echo "Codex returned an empty array. Nothing to do."
            exit 0
          fi

          cmd=(gh issue edit "$ISSUE_NUMBER")
          while IFS= read -r label; do
            cmd+=(--add-label "$label")
          done <<< "$labels"

          "${cmd[@]}" || true

      - name: Remove codex-label trigger
        if: ${{ always() && github.event.action == 'labeled' && github.event.label.name == 'codex-label' }}
        run: |
          gh issue edit "$ISSUE_NUMBER" --remove-label codex-label || true
          echo "Attempted to remove label: codex-label"
