{
  "$schema": "https://schema.spbx.tel/v1/structs.realm.lib",
  "description": "Call queue: answer, hold audio, ring a target with retries, no-agent fallback. Instantiate once per queue.",
  "params": {
    "extension": {
      "type": "string",
      "description": "Extension number the queue rings (the internal dial target)."
    },
    "ring_timeout": {
      "type": "number",
      "description": "Seconds each ring attempt waits before giving up.",
      "default": 20
    },
    "retries": {
      "type": "number",
      "description": "Additional ring attempts after the first one.",
      "default": 2
    },
    "retry_wait": {
      "type": "number",
      "description": "Seconds between ring attempts.",
      "default": 5
    },
    "unanswered_seconds": {
      "type": "number",
      "description": "Total seconds before the queue gives up and runs the on_no_agent slot.",
      "default": 120
    }
  },
  "slots": {
    "on_no_agent": {
      "description": "Runs when no agent answered within unanswered_seconds.",
      "default": [
        "flows/hangup/no_agent"
      ]
    }
  },
  "exports": {
    "enter": {
      "description": "Answer, start hold audio and ring the queue.",
      "flow": "flows/sub_flow/enter"
    }
  },
  "uses": {
    "std": {
      "preset": "stdlib"
    }
  },
  "flows": {
    "dial": {
      "target": {
        "internal_target": [
          "extensions/${extension}"
        ],
        "timeout_seconds": "${ring_timeout}",
        "dial_plan": [
          "presets/std/connect"
        ]
      }
    },
    "queue": {
      "ring": {
        "targets": [
          "flows/dial/target"
        ],
        "retry": "${retries}",
        "retry_wait_seconds": "${retry_wait}",
        "unanswered_seconds": "${unanswered_seconds}",
        "unanswered_flow": [
          "slots/on_no_agent"
        ]
      }
    },
    "silence_player": {
      "hold": {}
    },
    "hangup": {
      "no_agent": {
        "reason": "queue: no agent answered"
      }
    },
    "sub_flow": {
      "enter": {
        "dial_plan": [
          "presets/std/answer",
          "flows/silence_player/hold",
          "flows/queue/ring",
          "presets/std/stop_silence",
          "presets/std/wait_for_listener_start",
          "presets/std/wait_for_listener_stop",
          "presets/std/hangup"
        ]
      }
    }
  }
}
