```python
def assign_berths(berths: list, quota: dict, requests: list) -> list:
    occupied = {}
    results = []

    for request in requests:
        if request["op"] == "dock":
            boat_id = request["boat"]
            owner = request["owner"]
            size = request["size"]

            if boat_id in occupied:
                results.append("rejected:already_docked")
                continue

            if owner in quota and len(occupied.get(owner, [])) >= quota[owner]:
                results.append("rejected:over_quota")
                continue

            for berth in berths:
                if berth["size"] >= size:
                    occupied[boat_id] = berth["id"]
                    results.append(str(berth["id"]))
                    break
            else:
                results.append("rejected:no_berth")

        elif request["op"] == "leave":
            boat_id = request["boat"]

            if boat_id not in occupied:
                results.append("rejected:not_docked")
                continue

            del occupied[boat_id]
            results.append("left")

        else:
            raise ValueError(f"Invalid operation: {request['op']}")

    return results
```