diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fa75d9fb..d2ff8c9b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,21 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This eliminates redundant Alembic migrations across all test suites and reduces total test suite wall-clock time. (#2334) +- **CI — Nox output captured as CI artifacts**: All 8 nox-running CI jobs + (`lint`, `typecheck`, `security`, `quality`, `unit_tests`, `integration_tests`, + `e2e_tests`, `coverage`) now pipe their output through `tee` to named log files + and upload them as Forgejo artifacts (`ci-logs-`) with `if: always()` so + logs are available even on failure. Multi-session jobs append to a single combined + log. Artifacts are retained for 30 days. Seven agent definition files updated to + reference the artifact download API for CI diagnostics. (#2782) + +- **Benchmarks — ASV performance benchmark suite for providers module**: Added 5 + new ASV benchmark files under `benchmarks/` covering all performance-sensitive + paths in the `providers` module: `ProviderCostTable` construction and iteration, + `CostTracker` accumulation, `FallbackSelector` selection, `ProviderRegistry` + enumeration and lookup, and LLM adapter instantiation for all 5 built-in + providers. 68 benchmark methods total. (#3022) + ### Fixed - Fixed session leak in all `AutomationProfileRepository` public methods @@ -160,6 +175,24 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). - `ThoughtBlockWidget` background corrected from `$primary 20%` to `$primary-muted 20%`, making thought blocks visually lighter and more subtle per spec §29811. (#1448) +- **CLI — `agents plan list` gains `--namespace`/`-n` filter**: The `plan list` + command now accepts `--namespace`/`-n` to filter plans by namespace, bringing it + into alignment with the specification and achieving parity with `agents action list`. + The service layer already supported namespace filtering; only the CLI layer was + missing the option. The Filters panel in rich output displays `Namespace: ` + when the flag is active. (#2616) + +- **MCP — Error message extraction corrected for MCP 1.4.0**: `MCPToolAdapter.invoke()` + now reads error messages from `content[0].text` per the MCP 1.4.0 protocol + specification, replacing the previous non-standard `error` key lookup that silently + returned `"unknown error"` for all real MCP 1.4.0 servers. Safe guards prevent + `IndexError` on absent or malformed `content` arrays. (#2600) + +- **CI — All quality gates restored to passing on master**: Resolved format + violations, incomplete A2A JSON-RPC 2.0 migration in test step files, stale + session CLI output format assertions, plan list output format regressions, and + stale plan apply test data. No quality gates were suppressed or bypassed. (#2629) + ## [3.7.0] — 2026-04-02 ### Added diff --git a/docs/api/mcp.md b/docs/api/mcp.md index ec333db87..3e03bff01 100644 --- a/docs/api/mcp.md +++ b/docs/api/mcp.md @@ -68,6 +68,27 @@ await adapter.disconnect() | `invoke(name, arguments)` | Call a tool with input validation | | `register_tools(registry)` | Bulk-register discovered tools | +### Error Handling in `invoke()` + +`MCPToolAdapter.invoke()` complies with the **MCP 1.4.0** protocol for error +responses. When a tool call returns `isError: true`, the error message is +extracted from `content[0].text`: + +```python +# MCP 1.4.0 error response shape +{ + "isError": True, + "content": [{"type": "text", "text": "Tool execution failed: ..."}] +} +``` + +Safe guards prevent `IndexError` when `content` is absent or empty — the +adapter falls back to `"unknown error"` in those cases. + +> **Note (v3.7.0+):** Prior to this fix, `invoke()` read from a non-standard +> `error` key that no real MCP 1.4.0 server populates, causing all error +> messages to silently appear as `"unknown error"`. (#2600) + --- ## `MCPToolDescriptor` diff --git a/docs/reference/plan_cli.md b/docs/reference/plan_cli.md index 17c7e5d83..3fbcd3a88 100644 --- a/docs/reference/plan_cli.md +++ b/docs/reference/plan_cli.md @@ -109,6 +109,7 @@ agents plan list [REGEX] [OPTIONS] | Flag | Description | |-------------------------|--------------------------------------------------| +| `--namespace`, `-n` | Filter by namespace | | `--phase` | Filter by phase (strategize, execute, apply) | | `--state` | Filter by processing state | | `--processing-state` | Alias for `--state` | @@ -116,6 +117,22 @@ agents plan list [REGEX] [OPTIONS] | `--action` | Filter by action name | | `--format`, `-f` | Output format | +### Examples + +```bash +# Filter by namespace +agents plan list --namespace myteam + +# Short form +agents plan list -n myteam + +# Combined namespace + state filter +agents plan list --namespace myteam --state processing + +# Namespace filter with no results +agents plan list --namespace nonexistent +``` + ### Rich Output The `rich` format renders a **Plans** table with columns: @@ -131,8 +148,9 @@ The `rich` format renders a **Plans** table with columns: After the table: -- **Filters** panel — shown only when at least one filter (`--phase`, `--state`, - `--project`, `--action`) is active. Lists the active filter values. +- **Filters** panel — shown only when at least one filter (`--namespace`, `--phase`, + `--state`, `--project`, `--action`) is active. Lists the active filter values, + with `Namespace: ` displayed first when `--namespace` is provided. - **Summary** panel — total plans, processing count, completed count, and errored count. Followed by a `✓ OK N plan(s) listed` success message.