```ts
export function runPatrol(width: number, start: number, moves: number[]): Record<string, number> {
    if (!Number.isInteger(width) || width <= 0) {
        throw new Error("Width must be a positive integer.");
    }
    if (!Number.isInteger(start) || start < 0 || start >= width) {
        throw new Error("Start position must be an integer inside the corridor.");
    }
    if (!Array.isArray(moves)) {
        throw new Error("Moves must be a list of numbers.");
    }

    let position = start;
    let bumps = 0;
    const visited = new Set<number>([start]);

    for (const move of moves) {
        if (!Number.isInteger(move) || move === 0) {
            throw new Error("Move must be a non-zero integer.");
        }
        [position, bumps] = clampMove(position, move, width);
        visited.add(position);
    }

    return { position, bumps, visited: visited.size };
}

export function clampMove(position: number, delta: number, width: number): [number, boolean] {
    const newPosition = position + delta;
    if (newPosition < 0 || newPosition >= width) {
        return [position, true];
    }
    return [newPosition, false];
}
```