Enlay
One conversation. Any coding agent.
Enlay is a local-only VS Code extension for continuing one development task across independently authenticated Codex, Google Antigravity, and Claude Code CLI sessions.
It is an orchestration layer, not an AI model. The workspace remains the source of truth. The extension does not extract hidden reasoning, combine accounts, manage billing, collect telemetry, upload files, or store credentials.
What it does
- Maintains an inspectable
.ai/agent-handoff/ directory per workspace.
- Provides one shared chat panel with a per-message Codex/Antigravity/Claude selector.
- Provides a persistent Activity Bar chat view that can be moved to VS Code's Secondary Side Bar.
- Automatically initializes private handoff context when the sidebar view first opens in an uninitialized workspace.
- Keeps a per-workspace conversation history with automatic titles, timestamps, and one-click reopening.
- Streams responses, reasoning status, tool calls, commands, and file changes directly into the chat.
- Shows provider-reported usage limits plus per-turn token and cost data when available.
- Offers per-turn model and reasoning controls for Codex, Claude, and Antigravity.
- Persists the visible conversation locally as JSON and Markdown.
- Sends a bounded, redacted recent transcript to the selected agent for continuity.
- Captures redacted Git status and bounded staged/unstaged diffs when Git is available.
- Falls back to safe file modification timestamps when Git is missing.
- Generates an agent-neutral continuation prompt.
- Starts Codex, Antigravity, or Claude Code as a local child process with
shell: false.
- Sends prompts through stdin rather than interpolating handoff content into a shell command.
- Captures stdout and stderr in the Enlay output channel.
- Supports process cancellation and configurable timeouts.
- Offers to save a handoff when an agent is cancelled, times out, or exits unsuccessfully.
The CLI integration follows the documented non-interactive interfaces:
No API key is needed. Each CLI uses its own existing local authentication.
Requirements
- VS Code 1.100.0 or newer.
- A trusted local workspace. Virtual and untrusted workspaces are not supported.
- At least one supported agent CLI installed and authenticated: Codex, Google Antigravity, or Claude Code.
No API key is stored by Enlay. Each CLI uses its own existing local authentication and provider account.
Install
Install Enlay from the VS Code Marketplace, then reload VS Code if prompted.
To install a development build manually:
- Install and authenticate the agent CLIs you intend to use:
- Run
codex --version, then authenticate with the normal Codex flow if needed.
- Run
agy --version, then launch agy once to complete Antigravity authentication if needed.
- Run
claude --version, then claude auth login if Claude Code is not already authenticated. If only the official Claude Code VS Code extension is installed, Enlay automatically uses its bundled executable.
- In VS Code, open Extensions (
Ctrl+Shift+X).
- Select the
... menu in the Extensions view.
- Choose Install from VSIX....
- Select
enlay-0.6.0.vsix from this project directory.
- Reload VS Code when prompted.
Command-line alternative:
code --install-extension .\enlay-0.6.0.vsix
First use
- Open the project folder in a trusted VS Code window.
- Select the Enlay icon in the Activity Bar. The view automatically creates private handoff context if the workspace is not initialized yet.
- Choose an agent, model, and reasoning effort at the bottom, type a message, and press Enter. Change any selector before a later message to hand the visible conversation to another configuration.
- To place it beside your other agent views, right-click the Enlay Activity Bar icon and choose Move To → Secondary Side Bar. VS Code remembers the placement.
- Use the history button to reopen saved conversations, the usage button to inspect provider limits and observed turn consumption, or the plus button to start a new one.
You can still run Enlay: Initialize Project Context when you want to enter a specific original task or explicitly choose whether the handoff files are tracked in Git.
The project context contains:
.ai/agent-handoff/
|-- context.md
|-- conversation.json
|-- conversation.md
|-- conversations.json
|-- conversations/
| `-- <conversation-id>.json
|-- progress.md
|-- decisions.md
|-- errors.md
`-- session.json
You can edit the Markdown lists manually. Save Current State synchronizes those lists into session.json, refreshes Git/file state, and regenerates context.md.
conversation.json and conversation.md mirror the currently open thread. conversations.json indexes the full history, while each thread is stored separately under conversations/. Existing single-thread conversations are migrated automatically when next saved.
Models and reasoning
The composer shows model and effort choices supported by each installed CLI. Choosing Default leaves that value under the CLI or account configuration. Enlay passes explicit choices directly as argument-array values without invoking a shell and records them beside both sides of the turn.
- Codex: GPT-5.6 Luna, Terra, Sol, and GPT-6 Astra; effort from low through max.
- Claude: Sonnet, Opus, and Fable aliases; effort from low through max.
- Antigravity: the model IDs reported by the installed
agy models command; low, medium, or high effort.
Commands
- Enlay: Open Shared Chat
- Enlay: Open Sidebar Chat
- Enlay: Switch to Codex
- Enlay: Switch to Antigravity
- Enlay: Switch to Claude
- Enlay: Save Current State
- Enlay: View Current Context
- Enlay: Show Git Diff
- Enlay: Initialize Project Context
- Enlay: Open Handoff Folder
- Enlay: Set Current Agent
- Enlay: Stop Running Agent
- Enlay: Check Agent Availability
Settings
| Setting |
Default |
Purpose |
agentHandoff.codexCommand |
codex |
Codex executable name or full path |
agentHandoff.antigravityCommand |
agy |
Antigravity executable name or full path |
agentHandoff.claudeCommand |
claude |
Claude executable name or full path |
agentHandoff.gitCommand |
git |
Git executable name or full path |
agentHandoff.maxDiffCharacters |
20000 |
Largest redacted diff included in context |
agentHandoff.processTimeoutMinutes |
120 |
Agent run timeout |
agentHandoff.recentFileLimit |
30 |
Timestamp-based recent file limit |
When the Codex or Claude command remains at its default, Enlay also discovers the executable bundled with the corresponding official VS Code extension. An explicitly configured command always takes precedence.
Executable settings accept a command name or an absolute path, including Windows paths with spaces. Enter only an executable; arguments are intentionally controlled by the extension.
Example settings.json:
{
"agentHandoff.codexCommand": "C:\\Tools\\Codex\\codex.exe",
"agentHandoff.antigravityCommand": "C:\\Users\\me\\AppData\\Local\\agy\\bin\\agy.exe",
"agentHandoff.claudeCommand": "C:\\Tools\\Claude\\claude.exe"
}
Shared chat test
Use a disposable Git project for this verification.
- Open the test project in VS Code and initialize Enlay with a small multi-file task.
- Open Enlay: Open Shared Chat, select Codex, and send the first instruction.
- Confirm the reply appears in the panel and
.ai/agent-handoff/conversation.json and conversation.md are updated.
- Select Antigravity or Claude in the same panel and send a follow-up referring to the earlier Codex turn.
- Confirm the selected agent continues from the shared transcript and current workspace instead of starting a separate visible thread.
- Use Stop to cancel a long run or Save handoff to refresh the recorded project state.
- Run the project's relevant tests/build and inspect the final diff yourself.
Enlay uses non-interactive runs so output can be captured. Antigravity headless mode may soft-deny commands that require approval under your Antigravity permission policy; configure narrowly scoped permissions in Antigravity itself rather than enabling blanket permission bypasses.
Privacy and security
- Everything except the explicitly launched agent CLI stays local.
- The chat webview has no network or filesystem access; it uses a restrictive content security policy and validated messages to the extension host.
- No telemetry, remote service, analytics, API-key storage, or cloud synchronization is present.
.env*, private-key files, .ssh, node_modules, .git, build outputs, and the handoff directory are excluded from timestamp scanning.
- Diffs for sensitive file paths are omitted completely.
- Common API keys, tokens, passwords, private keys, JWTs, and credential-bearing connection strings are redacted before persisted context is written.
- Large diffs are replaced with a size notice and Git stat summary.
- Configured executables are spawned directly with argument arrays and no shell.
- The extension is disabled in untrusted and virtual workspaces.
Redaction is defense in depth, not a guarantee against every secret format. Review handoff files before choosing to commit them.
Build and test
npm install
npm test
npm run package
npm test covers context and conversation persistence, Markdown synchronization, bounded transcripts, Git status and diff handling, large-diff fallback, secret redaction, prompt generation, safe agent invocations, process timeouts, missing Git and agent CLIs, bundled executable discovery, and Windows executable paths.
Boundaries
- Agent-native or hidden conversation histories are not merged. The panel shares only its visible, locally persisted transcript plus neutral project state.
- Untracked file contents are never inserted into prompts. Agents are directed to inspect those files in the workspace.
- This extension does not alter Codex, Antigravity, or Claude permission settings.
- Usage cards show values reported by each installed CLI at refresh time; they are not a billing ledger, and older CLI versions may not expose every limit.
- Multi-root workspaces prompt for a target folder; the status bar reflects the first folder.
Third-party services
Enlay is an independent project. It is not affiliated with, sponsored by, or endorsed by OpenAI, Anthropic, or Google. Codex, Claude, Claude Code, Antigravity, and related names are trademarks of their respective owners.
Use of each agent CLI is governed by that provider's terms, privacy policy, account limits, and billing arrangements. The extension launches only the agent you select for a turn.
Support
See SUPPORT.md for support and diagnostic guidance.