Private local-model chat for macOS and Windows. Electron shell over the shared brain: @elyxndra/engine (models, downloads, MTPLX/llama.cpp), @elyxndra/chat (threads, prompt, tools, streaming loop), @elyxndra/agent and the @elyxndra/ui panel.
Six well-named computer-control tools with clear, detailed descriptions (150 - 250 chars each). All tools have explicit JSON Schema input definitions with typed properties and descriptions. Tool names follow verb_noun pattern (computer_observe, computer_click, etc.). Descriptions explain WHAT, WHEN, and WHAT-RETURNS. However, output schemas are not formally documented, responses are inferred as {output: string} or {output: string, error: string}. No parameter validation constraints (e.g., enum for button types, min/max for coordinates). Error handling is basic (guard wrapper catches exceptions but does not categorize or guide recovery). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear mutates flags in definitions.
Click a UI element. Give it `ref` (the number from a [eN] in the last observation) or `target` (the element's visible name, e.g. "Sign in") — either invokes the control directly and needs no coordinates. Use `x`/`y` only for something with neither. `button` defaults to left; `clicks` = 2 for a double-click. Returns the updated screen state.
Press and drag from a starting point to a destination — for sliders, reordering, selecting a region, or drag-and-drop. Start from `fromRef` (an [eN]) or `fromX`/`fromY`; end at `toX`/`toY`. Returns the updated screen state.
Press a single key or a modifier combo. Join modifiers with '+': e.g. `enter`, `tab`, `escape`, `ctrl+c`, `ctrl+shift+t`, `alt+f4`, `cmd+space`. Use this for shortcuts, navigation and submitting. Returns the updated screen state.
Read a window's accessibility tree as a compact list of [eN] elements to act on
Scroll the view. `direction` is up, down, left or right; `amount` is the number of wheel steps (default 3). Pass `ref` (or `x`/`y`) to scroll while hovering a particular area. Returns the updated screen state.
Output schemas not formally documented. Tools return {output: string} or {error: ...} but no structured response schema is declared. LLMs cannot plan downstream tool calls or extract typed fields.
Parameter constraints missing. 'button' enum is declared in schema but 'keys' (computer_key) accepts free-form strings with no validation. 'direction' (computer_scroll) is enum-constrained but 'amount' lacks min/max bounds. Unbounded numeric params invite invalid LLM calls.
Error handling is generic. Guard wrapper catches exceptions and returns {error: ...} but does not categorize errors (retryable vs fatal) or guide recovery. LLM receives no actionable next steps on failure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Type text into the focused control, or into the field given by `ref` or `target` (its visible name, e.g. "Search") — that field is focused first. Set `clear` to replace what is already there, and `enter` to press Enter afterwards (to submit a form or search). Returns the updated screen state, including which control the characters actually went into.
Tool annotations missing. Definitions include 'mutates' flags but do not expose readOnlyHint/destructiveHint/idempotentHint in the MCP tool definition. UI and agents cannot reliably detect which tools are safe to retry.
Parameter descriptions lack format/constraint details. E.g., 'x' and 'y' are integers but no min/max or screen bounds documented. 'ref' is integer but no explanation of valid range or how refs expire after next observation.