You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+17Lines changed: 17 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [0.14.1] - 2026-04-11
9
+
10
+
### Fixed
11
+
12
+
-**`/api/overview` endpoint** — dropped from ~16s to ~29ms (≈500× faster). `_recent_reports` was rglob'ing the entire `workspace/` tree, which on an active install holds vendored third-party repos under `workspace/projects/` (mcp-dev-brasil, oh-my-claudecode, evoai-services, etc.) — 16.853 of 17.116 MD/HTML files (98.5%) lived there and had nothing to do with "recent reports". The scan now skips top-level `projects/` (vendored repos) and `meetings/` (raw Fathom transcripts), iterates remaining areas, and formats the `date` field from the actual `mtime` instead of `path.split("/")[-1][:10]` (which was returning garbage like `"README.md"`).
13
+
-**Site typecheck errors** — `site/src/pages/Home.tsx` had 3 lucide icons (`MessageSquare`, `GitBranch`, `Database`) passing an invalid `title` prop. Wrapped them in `<span title="...">` to keep the hover tooltip and pass `tsc --noEmit`.
14
+
-**Dashboard frontend build** — `dashboard/frontend/src/pages/Providers.tsx` was importing `type LucideIcon` without using it, which caused `make dashboard-app` to fail with `TS6133`. Unused import removed.
15
+
- **Terminal startup garbage (WIP, 2 attempts included)** — on starting any agent terminal from the dashboard, bytes like `0?1;2c` / `000000` / `^[[0^[[0...` showed up in the prompt and status bar. Root cause is xterm.js auto-replying to terminal queries (DA1 `\x1b[c`, DA2 `\x1b[>c`, DSR `\x1b[5n`/`\x1b[6n`, window ops `\x1b[...t`) via `term.onData`, which the frontend was forwarding to the pty as if it were keyboard input. This release ships two defensive layers — passing `cols`/`rows` upfront on `start_claude` so the pty is born at the right size, and registering CSI handlers via `term.parser.registerCsiHandler({ final: 'c' | 'n' | 't' }, () => true)` to intercept queries at the parser level — plus a regex filter on `onData` as a second line of defense. **The bug is not fully resolved in this release.** Some payloads still slip through (likely via a non-CSI `triggerDataEvent` path that hasn't been pinned down yet). A debug log was added to `AgentTerminal.tsx` to capture the exact bytes in the next iteration.
16
+
17
+
### Changed
18
+
19
+
-**Feature folder convention** — `workspace/features/{slug}/` is now `workspace/development/features/{slug}/` across all engineering layer prompts (`.claude/rules/dev-phases.md`, `.claude/agents/compass-planner.md`, `.claude/agents/helm-conductor.md`, `.claude/commands/helm-conductor.md`, `.claude/agents/mirror-retro.md`, `docs/agents/engineering-layer.md`). Keeps all engineering artifacts (features, plans, architecture, reviews, verifications, retros) grouped under one development/ root.
20
+
21
+
### Docs
22
+
23
+
-**Multi-provider documentation** — README, `docs/introduction.md`, `docs/getting-started.md`, `docs/reference/env-variables.md`, `docs/dashboard/overview.md` updated with the OpenClaude-based multi-provider story introduced in v0.14.0. New `docs/dashboard/providers.md` documents the Providers page (supported providers, activation flow, security model with CLI + env var allowlists, logout warning). Site landing page replaces the "Full Control" feature card with "Multi-Provider, No Lock-In" highlighting the new capability.
**Cycle orchestration** — `@helm-conductor` sits above the phases and answers "what next?", "who does it?", and "what's blocked?". Call Helm when you have multiple active features or need sprint sequencing.
502
502
503
-
**Feature folders** — non-trivial work lives in `workspace/features/{feature-slug}/` where all artifacts of one feature are grouped together. Standalone artifacts continue to live in `workspace/development/{type}/`.
503
+
**Feature folders** — non-trivial work lives in `workspace/development/features/{feature-slug}/` where all artifacts of one feature are grouped together. Standalone artifacts continue to live in `workspace/development/{type}/`.
504
504
505
505
## The 25 `dev-*` Skills
506
506
@@ -1971,6 +1971,10 @@ Status board for all 18 integrations. Shows which are connected (green), which n
1971
1971
1972
1972

1973
1973
1974
+
### Providers
1975
+
1976
+
Pick and configure which LLM backend powers EvoNexus — Anthropic (default), or any of 6 alternates via [OpenClaude](https://www.npmjs.com/package/@gitlawb/openclaude): OpenRouter, OpenAI, Gemini, Codex Auth, AWS Bedrock, Vertex AI. Each provider card shows install status (claude vs openclaude), configured/unconfigured flags, and a Test button that runs `<binary> --version` with the merged env. Switching provider takes effect immediately — both the terminal-server and the ADW runner re-read `config/providers.json` on every session spawn, no restart needed. Secrets are masked in the UI and in every API response. See [providers.md](providers.md) for the full reference.
1977
+
1974
1978
### Chat
1975
1979
1976
1980
Embedded Claude Code terminal powered by xterm.js + WebSocket. Run Claude Code commands, invoke agents with slash commands, and see output in real time -- all from the browser.
@@ -2028,6 +2032,83 @@ View and edit workspace configuration:
2028
2032
- **Commands** -- slash command definitions from `.claude/commands/`
2029
2033
2030
2034
2035
+
---
2036
+
2037
+
# AI Providers
2038
+
2039
+
The **Providers** page lets you choose which LLM backend powers EvoNexus, configure its credentials, and test the connection — all from the dashboard. It lives under **System → Providers** in the sidebar and requires the `config:manage` permission.
2040
+
2041
+
EvoNexus uses Anthropic's `claude` CLI by default. To run on any other backend (OpenRouter, OpenAI, Gemini, AWS Bedrock, Google Vertex AI, Codex Auth), it switches to [OpenClaude](https://www.npmjs.com/package/@gitlawb/openclaude) — a drop-in binary that speaks the same CLI protocol but dispatches to the provider of your choice via environment variables.
2042
+
2043
+
## Supported Providers
2044
+
2045
+
| Provider | Binary | Notes |
2046
+
|---|---|---|
2047
+
| **Anthropic** (default) | `claude` | Native Anthropic auth, no extra config |
2048
+
| **OpenRouter** | `openclaude` | 200+ models via one API — Claude, GPT, Gemini, Llama, etc. |
2049
+
| **OpenAI** | `openclaude` | GPT-4o, GPT-4.1, o3 via OpenAI API |
2050
+
| **Google Gemini** | `openclaude` | Gemini 2.5 Pro/Flash via Google AI |
| **AWS Bedrock** | `openclaude` | Claude via AWS Bedrock |
2053
+
| **Google Vertex AI** | `openclaude` | Claude via GCP Vertex AI |
2054
+
2055
+
## Install OpenClaude (one-time)
2056
+
2057
+
If you plan to use any non-Anthropic provider, install OpenClaude globally:
2058
+
2059
+
```bash
2060
+
npm install -g @gitlawb/openclaude
2061
+
```
2062
+
2063
+
The Providers page shows a banner at the top indicating whether `claude` and `openclaude` are installed and in `$PATH`. If `openclaude` is missing, the banner shows the install command.
2064
+
2065
+
## Activating a Provider
2066
+
2067
+
1. Open **System → Providers** in the sidebar
2068
+
2. Click **Configure** on the provider you want to use
2069
+
3. Fill in the required fields (API key, base URL, model, region — depending on provider). Secrets are masked in the form and in every API response; placeholders like `sk-...` guide the format
2070
+
4. Click **Save & Activate**
2071
+
2072
+
The active provider is stored in `config/providers.json`. Both the terminal-server and the ADW runner re-read this file on every session spawn, so switching takes effect **immediately** — no restart needed.
2073
+
2074
+
A green "Active" badge marks the currently selected provider. Every other provider can still be configured and tested without affecting the active one.
2075
+
2076
+
## Testing a Provider
2077
+
2078
+
Each provider card has a **Test** button that runs `<binary> --version` with the configured env vars merged into the environment, then reports success or failure inline. This is a sanity check — it verifies that the binary is installed, in `$PATH`, and that the env var injection works. It does **not** validate that your API key actually authenticates against the remote service (use the terminal after activating for that).
2079
+
2080
+
## Security: Allowlists and Secret Masking
2081
+
2082
+
Both the Python runner (`ADWs/runner.py`) and the JS terminal bridge (`dashboard/terminal-server/src/claude-bridge.js`) enforce two allowlists when reading `config/providers.json`:
2083
+
2084
+
- **CLI allowlist** — only `claude` and `openclaude` are accepted as spawn targets. Any other value falls back to `claude`.
2085
+
- **Env var allowlist** — only the 13 variables listed in [env-variables.md](../reference/env-variables.md#ai-provider-configuration) are injected. Anything else is silently dropped.
2086
+
2087
+
The REST API that backs the Providers page masks secrets (`*_KEY`, `*_SECRET`, `*_TOKEN`) as `first6****last4` on every response. When you open the config modal, the form starts empty for those fields — type a new value to replace, or leave empty to keep the current one. Values containing `****` are treated as masked placeholders and skipped on save (so a round-trip through the UI doesn't accidentally overwrite a real secret with the mask string).
2088
+
2089
+
The backend also rejects any env var value containing shell metacharacters (`;`, `&`, `|`, backtick, `$`, newlines) — defense in depth against injection if someone points EvoNexus at a compromised `providers.json`.
2090
+
2091
+
## Logout Warning
2092
+
2093
+
When you switch away from Anthropic to any other provider, OpenClaude inherits your Anthropic Claude Code login state. To avoid confusion, run `/logout` inside Claude Code **once** after activating a non-Anthropic provider if you were previously logged in. The dashboard surfaces this warning on any provider marked `requires_logout`.
2094
+
2095
+
## Where It's Stored
2096
+
2097
+
- `config/providers.json` — active provider + per-provider CLI + env vars (**gitignored**, contains secrets)
2098
+
- `config/providers.example.json` — template copied on first boot if no real file exists (checked into git)
2099
+
- `.env` — unchanged by this feature. AI provider env vars live in `providers.json`, not `.env`
2100
+
2101
+
## Configuring at Install Time
2102
+
2103
+
The interactive setup wizard (`make setup`) asks which provider to use as step 3. If you pick anything other than Anthropic, it checks whether OpenClaude is installed, offers to install it, then prompts for the provider-specific keys and saves them to `config/providers.json`. You can re-run the wizard or use the dashboard to change providers later.
- [OpenClaude on npm](https://www.npmjs.com/package/@gitlawb/openclaude)
2110
+
2111
+
2031
2112
---
2032
2113
2033
2114
# Users and Roles
@@ -2193,16 +2274,32 @@ make setup
2193
2274
The wizard asks for:
2194
2275
- Your name and company
2195
2276
- Timezone and language
2277
+
- **Which AI provider to use** (Anthropic by default; alternatives via OpenClaude)
2196
2278
- Which agents to enable
2197
2279
- Which integrations to configure
2198
2280
2199
2281
It generates:
2200
2282
- `config/workspace.yaml` — central config
2201
2283
- `config/routines.yaml` — routine schedules
2284
+
- `config/providers.json` — active AI provider + backend CLI config
2202
2285
- `.env` — API keys (fill in after setup)
2203
2286
- `CLAUDE.md` — context file for Claude
2204
2287
2205
-
### 2. Configure API Keys
2288
+
### 2. Choose Your AI Provider
2289
+
2290
+
The wizard asks which backend should power EvoNexus. **Anthropic is the default** — if you already have Claude Code authenticated, you don't need to do anything else.
2291
+
2292
+
For any other provider (OpenRouter, OpenAI, Gemini, AWS Bedrock, Vertex AI, Codex Auth), EvoNexus uses [OpenClaude](https://www.npmjs.com/package/@gitlawb/openclaude), a drop-in binary compatible with the Claude CLI protocol. Install it once:
2293
+
2294
+
```bash
2295
+
npm install -g @gitlawb/openclaude
2296
+
```
2297
+
2298
+
Then select the provider in the wizard (or later from the **Providers** page in the dashboard) and fill in the keys. The active provider is stored in `config/providers.json` and both the terminal-server and the ADW runner re-read it on every session spawn — no restart required when switching.
2299
+
2300
+
See [docs/dashboard/providers.md](dashboard/providers.md) for the full provider reference and [docs/reference/env-variables.md](reference/env-variables.md#ai-provider-configuration) for all provider-related env vars.
2301
+
2302
+
### 3. Configure API Keys
2206
2303
2207
2304
Edit `.env` with your keys:
2208
2305
@@ -2216,7 +2313,7 @@ At minimum, you need:
2216
2313
- `STRIPE_SECRET_KEY` — for financial routines
2217
2314
- Social OAuth keys — via the dashboard Integrations page
2218
2315
2219
-
### 3. Start the Dashboard
2316
+
### 4. Start the Dashboard
2220
2317
2221
2318
```bash
2222
2319
make dashboard-app
@@ -2226,15 +2323,15 @@ Open http://localhost:8080 — the first run shows a setup wizard where you crea
2226
2323
2227
2324

2228
2325
2229
-
### 4. Start Automated Routines
2326
+
### 5. Start Automated Routines
2230
2327
2231
2328
```bash
2232
2329
make scheduler
2233
2330
```
2234
2331
2235
2332
This starts the scheduler that runs routines at their configured times (see `config/routines.yaml`).
2236
2333
2237
-
### 5. Use Claude Code — start with `/oracle`
2334
+
### 6. Use Claude Code — start with `/oracle`
2238
2335
2239
2336
Open Claude Code in this directory. It reads `CLAUDE.md` automatically and has access to all agents and skills.
2240
2337
@@ -5603,6 +5700,10 @@ Optional semantic search powered by [MemPalace](https://github.com/milla-jovovic
5603
5700
5604
5701
Two-tier persistence. `CLAUDE.md` holds working memory (who you are, active projects, key people). The `memory/` directory stores deeper context (people profiles, glossary, project history). Both survive across sessions.
5605
5702
5703
+
### AI Providers
5704
+
5705
+
EvoNexus runs on Anthropic's `claude` CLI by default, but can switch to any of 6 alternate LLM backends (OpenRouter, OpenAI, Gemini, AWS Bedrock, Google Vertex AI, Codex Auth) via [OpenClaude](https://www.npmjs.com/package/@gitlawb/openclaude). The active provider is stored in `config/providers.json` and can be changed from the Providers page in the dashboard — both the terminal-server and the ADW runner re-read the config on every session spawn, so switching takes effect immediately. No vendor lock-in, your choice of model, your keys. See [docs/dashboard/providers.md](dashboard/providers.md) for the full reference.
5706
+
5606
5707
## Open Source
5607
5708
5608
5709
EvoNexus is MIT-licensed, built by [Evolution Foundation](https://evolutionfoundation.com.br). The source is at [github.com/EvolutionAPI/evo-nexus](https://github.com/EvolutionAPI/evo-nexus). This is an unofficial community project — not affiliated with or endorsed by Anthropic.
@@ -5915,6 +6016,34 @@ The wizard runs `setup.py`, which generates CLAUDE.md inline from `config/worksp
5915
6016
5916
6017
All environment variables are defined in `.env` (generated by `make setup`). See `.env.example` for the template.
5917
6018
6019
+
## AI Provider Configuration
6020
+
6021
+
EvoNexus uses the `claude` CLI by default (Anthropic native auth). To switch to any other backend, the active provider is read from `config/providers.json` — **not from `.env`** directly. The dashboard's Providers page and `make setup` both write to that file.
6022
+
6023
+
The env vars below are the ones EvoNexus injects into the spawned CLI process based on the active provider. You don't set them in `.env` yourself — they live inside `config/providers.json` under each provider's `env_vars` key, and the terminal-server / ADW runner merge them into the subprocess environment at spawn time. Only the variable names in this allowlist are accepted (both the Python runner and the JS bridge enforce the same list):
6024
+
6025
+
| Variable | Used by | Description |
6026
+
|----------|---------|-------------|
6027
+
| `CLAUDE_CODE_USE_OPENAI` | OpenRouter, OpenAI, Codex Auth | Flag telling OpenClaude to dispatch to the OpenAI-compatible protocol |
6028
+
| `CLAUDE_CODE_USE_GEMINI` | Gemini | Flag telling OpenClaude to dispatch to Gemini |
6029
+
| `CLAUDE_CODE_USE_BEDROCK` | AWS Bedrock | Flag telling OpenClaude to dispatch to Bedrock |
6030
+
| `CLAUDE_CODE_USE_VERTEX` | Google Vertex AI | Flag telling OpenClaude to dispatch to Vertex |
6031
+
| `OPENAI_BASE_URL` | OpenRouter | Override the API base URL (e.g. `https://openrouter.ai/api/v1`) |
6032
+
| `OPENAI_API_KEY` | OpenRouter, OpenAI, Codex Auth | API key for the OpenAI-compatible provider |
| `GEMINI_MODEL` | Gemini | Model identifier (e.g. `gemini-2.5-pro`) |
6036
+
| `AWS_REGION` | Bedrock | AWS region (e.g. `us-east-1`) |
6037
+
| `AWS_BEARER_TOKEN_BEDROCK` | Bedrock | Bedrock bearer token (not the standard IAM access key) |
6038
+
| `ANTHROPIC_VERTEX_PROJECT_ID` | Vertex AI | GCP project ID |
6039
+
| `CLOUD_ML_REGION` | Vertex AI | GCP region (e.g. `us-east5`) |
6040
+
6041
+
**How to configure**: use the **Providers** page in the dashboard — it reads/writes `config/providers.json` for you, masks secrets in API responses, and has a "Test connection" button that runs `<provider-cli> --version` with the merged env. Alternatively, edit `config/providers.json` directly (it starts as a copy of `config/providers.example.json` on first run).
6042
+
6043
+
**Anthropic is the default** — when the active provider is `anthropic`, no env vars are injected and the spawned CLI is the native `claude` binary with its own auth. You don't need any of the variables above for the default path.
6044
+
6045
+
See [docs/dashboard/providers.md](../dashboard/providers.md) for the full provider setup flow.
0 commit comments