ob-system1

General-purpose access to the System 1 decision model behind ob-nav — Laya, Clef, or Jev, whichever the Config page configures. Implementation: apps/control/src/nav/ob-system1.ts, shim at /usr/local/bin/ob-system1. Reuses ~/.config/open-bot/system1.json + system1-auth.json — no new config.

Usage

ob-system1 --state TEXT --choice "Which design?" a b [c...]
ob-system1 --state TEXT --score "Rate the layout" [--score levels...]
ob-system1 --state TEXT --noul "Any blockers?"
ob-system1 --state TEXT --choice "..." a b --image shot.png --image shot2.png
cat state.md | ob-system1 --choice "Ship it?" yes no
FlagMeaning
--state TEXTDecision context. Piped stdin becomes the state when missing. --state twice is a usage error.
--choice "Q?" a bMultiple-choice question; needs ≥2 options.
--score "Q?" [LEVEL...]Likert-style scoring; optional 2–10 level labels (default 5-point); the returned level index maps back to a label.
--noul QYes/no question without ULF framing.
--image FILE|- / --image-base64 B64|-jpeg/png/webp, max 4, magic-byte sniffed; vision providers only (Jev/Laya hard-error otherwise).
--model XOverride the model.
--timeout MS8 s text / 20 s vision defaults.
--helpPlain text, exit 0.

Output and exit codes

One JSON line on success:

{"ok":true,"provider":"laya","model":"...","answers":{"...":""},"ms":812}

Out-of-list picks come back as valid:false. Exit codes: 0 ok (incl. --help), 1 error, 2 usage, 3 unconfigured. One retry after 1 s on 429/5xx/network only; other 4xx fail fast with the server body redacted into detail (240-char cap).

Logging

Every run appends {cli:true} rows with per-attempt milliseconds to ~/.open-bot/system1.log. Never image bytes; the .open-bot dir is created if missing.

Stress-tested via desktop-agent threads (7 ob-report findings, six fixed, one wontfix). See the Config page's System1 tab for provider setup.