NousResearch/hermes-agent · error
Preview mode — launching is disabled.
Error message
Preview mode — launching is disabled.
What it means
Raised by the schedule parser in cron/jobs.py when a schedule string starts with something that looks like an ISO timestamp (e.g. begins with a digit and contains 'T'/'-') but datetime.fromisoformat() rejects it. It is a ValueError wrapping the underlying parse failure, thrown before any job is created. The full schedule-format dispatch continues to duration/interval/cron parsing afterwards, so this error alone does not abandon the parse.
Source
Thrown at apps/bootstrap-installer/src/store.ts:351
// there's no welcome click. Reset + jump straight to progress, then let the
// Rust side stream the synthetic update manifest.
$bootstrap.set(INITIAL)
$route.set('progress')
await invoke('start_update')
}
export async function cancelInstall(): Promise<void> {
if (fakeMode()) {
fakeCancelled = true
return
}
await invoke('cancel_bootstrap')
}
export async function launchHermesDesktop(): Promise<void> {
if (fakeMode()) {throw new Error('Preview mode — launching is disabled.')}
const installRoot = $bootstrap.get().installRoot
if (!installRoot) {throw new Error('no install root')}
await invoke('launch_hermes_desktop', { installRoot })
}
export async function openLogDir(): Promise<void> {
if (fakeMode()) {return}
await invoke('open_log_dir')
}
// ---------------------------------------------------------------------------
// Dev-only isolated preview ("fake boot")
//
// Synthesises the manifest + stage/log events Rust normally streams, so the
// whole reskin can be reviewed in a plain browser (`npm run dev`):
// ?fake=install welcome → [ INSTALL ] → success
// ?fake=update auto-runs the granular update flowView on GitHub (pinned to c896c09c42)
Solutions
- Correct the timestamp to a valid ISO 8601 local form such as '2026-02-03T14:00:00'.
- If you wanted a relative one-shot, use a duration like '30m', '2h', '1d' instead.
- Read the wrapped {e} message — it names the exact reason fromisoformat rejected the value.
- Validate candidate timestamps with datetime.fromisoformat() before submitting if generating schedules programmatically.
Example fix
# before create_job(prompt="report", schedule="2026-02-30T14:00") # after create_job(prompt="report", schedule="2026-03-02T14:00")
Defensive patterns
Strategy: validation
Validate before calling
from datetime import datetime
def valid_timestamp(s: str) -> bool:
try:
datetime.fromisoformat(s)
return True
except ValueError:
return False
# before create_job(..., schedule="2026-02-30T14:00")
assert valid_timestamp("2026-02-30T14:00") is False Try / catch
from cron.jobs import create_job
try:
job = create_job(prompt=p, schedule="2026-02-30T14:00")
except ValueError as e:
if "Invalid timestamp" in str(e):
# surface to user / re-ask model for a corrected ISO string
raise Prevention
- Generate timestamps with datetime.now() + timedelta and .isoformat(), never by string concatenation.
- If schedules come from LLM output, pre-validate against all four accepted forms before calling create_job.
When it happens
Trigger: Calling create_job/update_job (or the cronjob tool / `hermes cron add`) with a schedule like '2026-13-45T99:00' (invalid month/hour), '2026-02-30T14:00' (nonexistent day), or a malformed timestamp with stray characters that still routes into the timestamp branch of the parser.
Common situations: Typos in one-shot timestamps, copy-pasting timestamps with a trailing 'Z' variant the parser's branch does not accept, or a model/agent composing the schedule string dynamically and getting the date arithmetic wrong (e.g. month 13).
Related errors
- no install root
- Remote gateway URL is not valid: ${error.message}
- Timed out connecting to Hermes backend after ${timeoutMs}ms
- Desktop installation ID is invalid.
- Unknown uninstall mode: ${mode}
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/bb268f170f506b2a.
Report an issue: GitHub.