|
1 | 1 | # Changelog |
2 | 2 |
|
3 | | -## v0.34.0 (2026-05-23) — secrets.env Auto-Load + File Attachments |
| 3 | +## v0.36.1 (2026-05-23) — Phase 1.5: Batch Approval Gate |
| 4 | + |
| 5 | +### Parallel Approval Fix |
| 6 | +- When the LLM returns **multiple tool calls** in one iteration and an **approver is set**, the engine now shows a **single batch approval prompt** instead of N concurrent inline keyboards |
| 7 | +- If denied, all tools are rejected with `"error: batch approval denied"` without executing anything |
| 8 | +- If approved, `SetTrustAll(true)` is called on the approver so individual tool-level `PromptCommand` calls auto-pass during that iteration |
| 9 | +- Single tool calls (≤1 per iteration) skip the batch gate entirely — no behavior change |
| 10 | + |
| 11 | +### New Method: `SetTrustAll(bool)` |
| 12 | +Added to all three approver implementations: |
| 13 | +- **`TTYApprover`** — skips `/dev/tty` prompt when enabled |
| 14 | +- **`TelegramApprover`** — skips inline keyboard prompt when enabled |
| 15 | +- **`wsApprover`** — skips WebSocket approval when enabled |
| 16 | + |
| 17 | +### API: `Config.Approver` |
| 18 | +- New `Approver danger.Approver` field on `odek.Config` |
| 19 | +- Wired through `odek.New()` → `loop.Engine.SetApprover()` |
| 20 | +- Telegram handler passes per-chat `TelegramApprover` to the agent config |
| 21 | + |
| 22 | +### Test Coverage |
| 23 | +- 3 batch approval tests: denied, approved, single-tool skip |
| 24 | +- All tests pass with `-race` |
| 25 | + |
| 26 | +--- |
| 27 | + |
| 28 | +## v0.36.0 (2026-05-23) — Parallel Tool Execution |
| 29 | + |
| 30 | +### Parallel Execution |
| 31 | +- When the LLM returns multiple tool calls in one response, tools now execute **concurrently** in goroutines (was: sequential) |
| 32 | +- **Bounded semaphore** — at most `max_tool_parallel` goroutines run simultaneously (default: 4) |
| 33 | +- I/O-bound tools (read_file, search_files, shell, web_search) benefit most — latency drops from `sum(latencies)` to `max(latency)` |
| 34 | +- Configurable via `max_tool_parallel` in config or `ODEK_MAX_TOOL_PARALLEL` env var |
| 35 | + |
| 36 | +### Three-Phase Implementation |
| 37 | +1. **Phase 1 (sync)** — fire all `tool_call` events + narrator/rendering so the user sees progress immediately |
| 38 | +2. **Phase 2 (parallel)** — N goroutines execute tools concurrently via channel semaphore |
| 39 | +3. **Phase 3 (sync)** — drain semaphore, compress large outputs, append results in **original call order** |
| 40 | + |
| 41 | +### Config |
| 42 | +- `MaxToolParallel int` on `loop.Engine` and `odek.Config` (0 = default 4) |
| 43 | +- `max_tool_parallel` in FileConfig (`internal/config/loader.go`) |
| 44 | +- Wired through CLI, Telegram, and serve entry points |
| 45 | + |
| 46 | +### Test Coverage |
| 47 | +- 6 parallelism tests: latency (4×100ms → ~100ms vs 400ms), ordering, semaphore cap (6 tools, cap=2), default cap, error resilience, single tool |
| 48 | +- All tests pass with `-race` |
| 49 | + |
| 50 | +--- |
| 51 | + |
| 52 | +## v0.35.1 (2026-05-23) — secrets.env Auto-Load + File Attachments |
4 | 53 |
|
5 | 54 | ### Secrets Management |
6 | 55 | - **`~/.odek/secrets.env` auto-loaded** as Layer 0 in the config priority chain — parsed before any config file or env var lookup |
|
0 commit comments