Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

LouiseLM

Chat with ACP Agents inside Neovim.

LouiseLM runs the Agent commands you configure and gives each one a streaming chat Session. Keep several Sessions open, attach editor context, review file edits and permissions, invoke Agent Skills, hand work to another Agent, and inspect raw tool activity or export the full transcript. Documented or tested paths include Codex, Claude, DeepSeek, OpenCode, and GitHub Copilot.

Try LouiseLM in your browser — no installation, Agent, Provider, credentials, or project files required. The guided Agent behavior is clearly labelled and scripted; the Neovim and LouiseLM UI are real.

Open the Tutor · Agents and adapters · Vim help · Headless API

LouiseLM's real Neovim chat in the scripted browser demo, showing attached file context and a rejected tool edit

The left pane is the scripted browser guide; the right pane is LouiseLM’s real Neovim UI. No Agent or Provider is connected.

Start here

Already configured? Open the in-editor Tutor:

:LouiselmTutor

The Tutor works even before an Agent is ready. It walks through the health check, a first prompt, permissions, context, cancellation, and Session controls.

For a first chat you need one installed and authenticated ACP Agent. Codex is the shortest documented path; install codex-acp using its official instructions.

Install sqlite3 3.38 or newer with JSON support on PATH (for example, sudo apt install sqlite3 on Debian/Ubuntu). Every Session records private turn metadata before sending a prompt. Recording failures hold new prompts; active work can finish. See durable turn recording for storage, recovery, and the asynchronous headless API contract. Shared state defaults to ~/.local/state/louiselm/ ($XDG_STATE_HOME/louiselm/ when set), independently of the Neovim profile.

The source is public, and the first alpha release is available as plugin-v0.1.0. Exact plugin pins are described in the release guide. Core chat requires no capture, trusted-tool or Android companion. If you have a checkout, replace the path below and save this as quickstart.lua:

vim.opt.runtimepath:prepend("/absolute/path/to/louiselm")

assert(require("louiselm").setup({
  agents = {
    codex = { command = "codex-acp", provider = "OpenAI" },
  },
}))

Start an isolated Neovim, then check the setup and chat:

nvim --clean -u quickstart.lua
:checkhealth louiselm
:LouiselmTutor
:LouiselmChat

The quickstart does not modify your normal Neovim configuration. Move the same setup block into your regular configuration when ready, or see the Agent table for other paths.

Direct Agent commands, including wrappers, have no LouiseLM Verified posture. For an explicit prospective artifact snapshot, use :LouiselmPreflight request.json manifest.json with skills.management.enabled = true and louiselm-skills on PATH. It reads asynchronously and opens health; it does not authorize or start an Agent. See artifact preflight for the input contract, prior comparison and evidence limits.

Optional integrations default to disabled. Run :checkhealth louiselm to discover the exact opt-ins for Attention, Beads, capture, workflow Runs, skill invocation and trusted skill management, plus their manual setup instructions. Availability never enables a feature. See :help louiselm-optional-capabilities; service-owned receiver, transcription and push choices are independent of editor settings.

Every Agent must declare its access/quota provider, independently of the Model manufacturer: a Model reached through GitHub Copilot has Provider GitHub Copilot. For an Agent whose advertised option values identify services by namespace, configure a literal prefix map (the option ID need not be model):

provider = {
  option = "model",
  prefixes = {
    ["opencode-go/"] = "OpenCode Go",
    ["opencode/"] = "OpenCode Zen",
    ["deepseek/"] = "DeepSeek",
  },
}

These mappings are explicit configuration, not built-in Agent-specific rules. New Models under a configured prefix need no config edit. Prefixes are nonempty, literal and case-sensitive: no patterns or longest-match precedence. Missing or non-string option values, no match, and multiple matches refuse attribution; even overlapping prefixes naming the same service are ambiguous.

When attribution depends on multiple options or exact values, use routes instead:

provider = {
  { provider = "OpenAI", options = { model = "openai/example-model" } },
  { provider = "GitHub Copilot", options = { model = "github-copilot/example-model" } },
}

Use the option IDs and values your Agent actually advertises, and map the service supplying your access. All entries in a route’s options must match, including boolean values. Exactly one route or prefix must match before either Chat or the headless Session API sends a prompt. Missing configuration fails setup; missing or ambiguous active routes leave the Session ready and report how to fix attribution. Session:inspect().turn_identity preserves Agent, Provider, advertised Model, and the complete supported option tuple at prompt start; later option changes do not rewrite it. Durable turn recording preserves this attribution with usage history.

Features

The chat winbar shows turn state, a useful Session name, Agent, and current Model and effort while you scroll. The example below includes Account limits from an adapter advertising the extension; Agents without support, including the stock Codex quickstart, show limits n/a:

Your turn · Review · codex · limits 98%/7d ↻7d · GPT-6 e=high +2 · ctx 53%

+N counts hidden options, including model or effort when they no longer fit. The options block folds to opts in narrow windows; Agents without supported options have no block. Click the whole block or use :LouiselmSessionOptions (<leader>lso) to inspect every value. During a response the overview is read-only; changes require an idle Session. Summaries reflect current settings, with no comparison to defaults or the start of the Session.

Context percentage (including stale indication) and cost follow those fields. Full ACP identity and raw telemetry remain in the transcript header. Redundant default quota labels are omitted; distinct quota buckets keep their names. The neutral limits n/a marker is clickable: it opens the same inspector as :LouiselmLimits, which explains when an Agent does not advertise support. Agents not yet observed have no limits marker; their inspector explains that a Session must first be started to check support. As windows narrow, cost and context disappear, then effort and model fold, then limits, Agent, and name give way. At extreme widths even opts yields to turn state. Background attention has reserved space before optional detail.

Background Sessions that do not fit collapse into counts with the same status colors and glyphs: blue +2… for two working Sessions, yellow +1● for an unseen completed response, and green +1● for a ready Session already seen. Permission requests and errors keep their labelled entries. Click any count to open the Session picker, or use :LouiselmSessionSwitch. Counts update as Sessions change state and when windows resize.

The Session picker aligns fields in columns, leaving blank cells for missing names or metadata. Agent and options precede the full Agent/ACP Session ID. Effort aligns by its ACP category; model settings such as Fast mode align by label. Ambiguous matches retain separate columns so no option disappears. Rows are a snapshot; reopen the picker to refresh their values and column widths.

:LouiselmSessionRename changes the human-readable name (Review above). session-7 is an internal handle and the initial default name; it stays stable after renaming. codex/<uuid> identifies the Agent conversation and can be copied with :LouiselmSessionId. The statusline’s louiselm://session-7 is a virtual buffer name, with Neovim filetype louiselm-session, rather than a file on disk. The transcript heading includes these diagnostic identifiers; the winbar omits names that merely repeat an identifier.

The complete command list is in :help louiselm. Common entry points are grouped by purpose:

Agents and adapters

LouiseLM starts named stdio ACP commands; the UI is not tied to one Provider or Model. Configure several commands at once and choose an Agent when creating a Session. Capabilities and authentication still depend on each Agent.

AgentACP entrypointSetup support
Codexcodex-acpDocumented recipe and local quickstart profile
Claude Agent ACPclaude-agent-acpDocumented API-key recipe
DeepSeek through acp-llm-adapteracp-llm-adapter serve --backend deepseekDocumented recipe
Google Antigravityagy_acp_server.par --uid= (Linux)Official ACP server; documented setup recipe
OpenCodeopencode acpCaptured ACP behavior; use upstream setup
GitHub Copilot CLIcopilot --acp --stdioTested transcript layout; use upstream setup

The table links to each upstream installation source. LouiseLM gives stdio ACP commands the same command, args, and env configuration shape; that does not imply identical capabilities across Agents.

Account limits require the accountLimits v1 ACP extension. The maintainer’s patched Codex and Claude adapters emit it; the stock adapters linked above do not provide those patches. The Codex fork and Claude fork are unsupported reference implementations, with no compatibility promise or supported distribution. A separate local Copilot adapter also emits the extension but is not published; it is not the stock Copilot CLI listed above. OpenCode does not emit it, and Account limits support has not been established for the listed DeepSeek or Antigravity entrypoints. Without the extension, LouiseLM reports Account limits as unsupported; ordinary chat remains available.

Optional components

Scope

The features above exist today. LouiseLM does not claim to turn every idea into a finished result, autonomously triage a backlog, or execute an entire task graph without operator decisions.

Documentation and development

Build the checked documentation site with npm ci && npm run site:build. Local builds must set LOUISELM_DEMO_PACKAGE_TOKEN to a GitLab token with package-read access; CI uses its same-project job token.

License and project policies

LouiseLM is available under the MIT License. Use of its name and marks is covered by the trademark policy. The project’s political position is documented separately in the political statement.