```ts
export function dealPacket(items: string[], seats: number[], order: string): Record<string, unknown> {
  if (!Array.isArray(items) || items.some(item => typeof item !== 'string' || item.length === 0)) {
    throw new Error('Invalid packet');
  }
  if (new Set(items).size !== items.length) {
    throw new Error('Duplicate entries in packet');
  }
  if (!Array.isArray(seats) || seats.length === 0 || seats.some(limit => typeof limit !== 'number' || limit <= 0)) {
    throw new Error('Invalid limits');
  }
  if (order !== 'round' && order !== 'reverse' && order !== 'snake') {
    throw new Error('Invalid turn sequence');
  }

  const hands: string[][] = Array(seats.length).fill([]);
  let handIndex = 0;
  let direction = 1;

  const getNextHand = () => {
    if (order === 'round') {
      handIndex = (handIndex + 1) % seats.length;
    } else if (order === 'reverse') {
      handIndex = (handIndex + seats.length - 1) % seats.length;
    } else if (order === 'snake') {
      handIndex += direction;
      if (handIndex >= seats.length || handIndex < 0) {
        direction *= -1;
        handIndex += direction * 2;
      }
    }
    return handIndex;
  };

  for (const item of items) {
    let placed = false;
    while (!placed) {
      const currentHand = getNextHand();
      if (hands[currentHand].length < seats[currentHand]) {
        hands[currentHand].push(item);
        placed = true;
      }
    }
  }

  const leftOverItems = items.filter((_, index) => !hands.flat().includes(items[index]));

  return {
    hands,
    left: leftOverItems
  };
}
```