```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>();

    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] {
    if (delta < 0) {
        for (let i = position; i >= 0 && delta < 0; i--) {
            if (i === 0) return [i, true];
            delta++;
        }
        return [position + delta + 1, false];
    } else {
        for (let i = position; i < width && delta > 0; i++) {
            if (i === width - 1) return [i, true];
            delta--;
        }
        return [position + delta - 1, false];
    }
}
```