ego-jev
Small bounded loop joining ego-lite snapshots with Jev choices over a fixed action space mapped back to observed refs.
Overview
This ego-jev is deliberately not a general-purpose browser agent. It joins ego-lite browser control with Jev decisions in a small bounded loop: snapshot, build a canonical state and candidate set, ask Jev for a choice, optionally ask a text model for input, perform the action, and take a new snapshot.
Jev can choose only a supported operation (CLICK, TYPE_TEXT, SELECT, SCROLL_UP, SCROLL_DOWN, WAIT, DONE, BLOCKED) and a target from the current snapshot. It never receives or emits JavaScript, CSS selectors, coordinates or refs; the executor maps the opaque candidate back to a ref observed in the same snapshot and discards it after use. Text for TYPE_TEXT is requested only after the choice. The README documents ego-lite API details and fallbacks precisely.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Choice | Which operation and candidate from the current snapshot should be used? | CLICK · TYPE_TEXT · SELECT · SCROLL_UP · SCROLL_DOWN · WAIT · DONE · BLOCKED |
How it works
- Take an ego-lite snapshot
- Build canonical state and candidates
- Jev picks an operation and candidate; text model fills text if needed
- Executor maps the candidate to a fresh ref and acts
Strengths
- Model never sees selectors or coordinates
- Refs valid only for one snapshot
- Clear, bounded action space
Caveats
- Intentionally limited scope
- Specific Node version baseline
Getting started
Use Node per .nvmrc, install dependencies and run the CLI with a goal; see the README options.At a glance
- Type
- Project
- Status
- prototype
- Language
- TypeScript
- Runtime
- Node CLI with ego-lite
- Has code
- yes
- License
- MIT
Use cases and integrations
How curated lists describe it
Connects Ego Lite snapshots and browser actions to a bounded Jev decision loop.
logicrw/awesome-jev-projects
Frequently asked questions
Can Jev run arbitrary scripts?
No, it only picks a supported operation and an opaque candidate.
How is text entered?
A text model is asked for text only after Jev chooses TYPE_TEXT.
Is it a general agent?
No, it is deliberately a small bounded loop.
Related projects
RAM-efficient Rust coding-agent harness, listed as using Jev decisions for memory pruning, browser navigation and voice routing.
ServiceproductionRustMCP server and libraries that drive Chrome over CDP and hand a decision model like Jev a bounded menu of page actions.
ProjectproductionTypeScript- Jev Browser★ 335
Headless browser automation via MCP server, CLI or library: Jev picks one action per step and scores goal-met and stuck probabilities.
MCP serverbetaTypeScript Local browser agent that picks each step's operation and element with a Jev-shaped model such as a fine-tuned Laya, no cloud needed.
MCP serverbetaPythonClaude Desktop MCP extension that drives Brave or Chrome with Jev choosing on-page actions and a guard freezing irreversible clicks.
MCP serverbetaTypeScriptBrowser-agent benchmark with five timed events from one prompt, plus a ~200-line DevTools agent where Jev picks each action.
ProjectbetaJavaScript