jackwener/OpenCLI · error · CommandExecutionError

Gmail ${label} had an invalid timestamp

Error message

Gmail ${label} had an invalid timestamp

What it means

gmailDate converts Gmail's numeric timestamps into ISO strings. If the value cannot be coerced into a finite positive number (NaN, 0, negative, or a garbage string), the library throws CommandExecutionError because a valid timestamp is required to build the date. This is the pre-normalization branch of the check.

Source

Thrown at clis/gmail/utils.js:55

}

export function parseAccount(raw) {
  const value = raw ?? 0;
  const account = Number(value);
  if (!Number.isInteger(account) || account < 0 || account > 20) {
    throw new ArgumentError('account must be an integer between 0 and 20');
  }
  return account;
}

function cleanString(value) {
  return typeof value === 'string' ? value.trim() : '';
}

function gmailDate(value, label) {
  let timestamp = Number(value);
  if (!Number.isFinite(timestamp) || timestamp <= 0) {
    throw new CommandExecutionError(`Gmail ${label} had an invalid timestamp`);
  }
  if (timestamp < 10_000_000_000) timestamp *= 1000;
  if (timestamp > 10_000_000_000_000) timestamp /= 1000;
  const date = new Date(timestamp);
  if (Number.isNaN(date.getTime())) {
    throw new CommandExecutionError(`Gmail ${label} had an invalid timestamp`);
  }
  return date.toISOString();
}

function decodeEntities(value) {
  return String(value || '')
    .replace(/&nbsp;/gi, ' ')
    .replace(/&amp;/gi, '&')
    .replace(/&lt;/gi, '<')
    .replace(/&gt;/gi, '>')
    .replace(/&quot;/gi, '"')
    .replace(/&#39;|&apos;/gi, "'")

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Inspect the capture payload (entry.responsePreview) to see what timestamp value was actually received.
  2. Update the scraper/bridge if Gmail's DOM changed and the wrong element is being captured.
  3. Ensure timestamps are supplied as epoch seconds or milliseconds, not preformatted date strings.
  4. Retry the fetch; a truncated or partial capture may be the cause.

Example fix

// before
{ date: '2024-06-01 12:00' } // string, not epoch
// after
{ date: 1717243200 } // epoch seconds
Defensive patterns

Strategy: type-guard

Validate before calling

const ts = Number(value);
if (!Number.isFinite(ts) || ts <= 0) {
  throw new Error(`expected epoch seconds/millis, got ${JSON.stringify(value)}`);
}

Type guard

function isEpochTimestamp(v) {
  const n = Number(v);
  return Number.isFinite(n) && n > 0;
}

Try / catch

try {
  const iso = gmailDate(value, 'search');
} catch (e) {
  if (/invalid timestamp/.test(e.message)) {
    console.warn('Skipping row with bad timestamp:', value);
    return null; // skip instead of failing the batch
  }
  throw e;
}

Prevention

When it happens

Trigger: The browser capture returns a missing/empty date field, a string like 'N/A' or an already-formatted date string ('2024-01-01T...'), or 0/negative epoch values from a malformed batch view or fetch payload.

Common situations: Gmail DOM changes altering what the bridge scrapes; truncated captures dropping the timestamp field; callers feeding preformatted date strings where epoch millis are expected; new/unread items with placeholder timestamps.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/94a677057109ab01. Report an issue: GitHub.