Parallax

Tools

Built-in capabilities that Parallax uses to control your workspace.

Tooling Philosophy

If an AI just gives you text blocks to copy-paste, you're doing the heavy lifting. Parallax implements a strict reasoning layer that grants the model internal API access to traverse directories, build dependency chains, and patch code on disk autonomously.

You do not trigger these manually. They are executed asynchronously when the ToolLoopAgent decides they are needed.

The Toolkit

listDirectory

Scans immediate folder structure. Because Parallax forces Gemini to be concise, listDirectory returns a shallow tree rather than a recursive dump of node_modules which would instantly crater your context limits.

readFile / writeFile

Direct access to pull exact source code into the prompt, and overwrite it completely. These use raw string operations to circumvent typical LLM text truncation issues.

editFile

For precise changes, the model can apply localized patch diffs instead of completely regenerating a massive 1,500 line React component to fix a single typo.

runCommand

Grants the model the ability to execute bash commands. This is primarily intended for running type checks, spinning up linters, fetching git log context, or compiling output before verifying its own code. It runs directly natively over child_process.exec.

subagent

Parallax implements true concurrency. When breaking down a massive objective, the host LLM can pause, serialize the current task, and invoke a specialized subagent loop that runs in an isolated context to crunch background data without bloating the main UI console timeline.

MCP Integrations

Beyond its native file patching capabilities, Parallax acts as an MCP Client. It parses ~/.parallax/mcp-config.json on boot, spawns background standard I/O environments, and auto-discovers external tools. To the Gemini brain, these tools simply look like normal functions prepended with their MCP namespace. You never have to manually map them.

Tool Execution Loop

When tools are invoked, the model actually pauses.

  1. The ToolLoop intercepts the request.
  2. It fires a promise for readFile().
  3. It resolves the output string.
  4. It packages the raw string dynamically back into the previous schema request block.
  5. It tells Gemini to regenerate based on the newly discovered information.

This all happens in parallel in fractions of a second, resulting in a chat feed that casually reads: "Hold on, I need to check utils.ts... Ah, looks like you renamed parse() to serialize(). Let me fix your frontend."

On this page