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
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,13 +33,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
33
33
-**Subagent tool inventory in prompt**: subagent system prompt now lists the actually-provisioned tools grouped by purpose (Workspace, Diffs, Git, Memory, Plans, Tasks, Rules & Skills, Web) — generated from `registry_filtered` so the prompt cannot drift from the schema. Adds an explicit anti-hallucination clause directing the subagent to attempt `list_workspace_files` / `read_workspace_file` before claiming a lack of tools. Stops weaker models from instantly returning `blocked`.
34
34
-**Timeline tool-call compaction**: consecutive identical tool calls in the chat timeline collapse into a single row with a live `×N` counter badge that grows as new calls stream in. Expand chevron reveals each invocation's args + detail in a sub-list. Single-call rows keep the prior layout; merged rows aggregate status (any pending → pending, any fail → fail, else ok).
35
35
-**Tool group horizontal wrap**: `.agent-tool-group` switched from vertical stack to `flex-direction: row` with `flex-wrap: wrap`, so consecutive tool-call chips sit side-by-side and only wrap when the chat column runs out of width.
36
+
-**Per-turn usage stats footer**: new `AgentEvent::TurnUsage { input_tokens, output_tokens, ttft_ms, elapsed_ms }` emitted at the end of each turn from both the OpenAI-compatible (`stream_options.include_usage`) and Anthropic (`message_start.usage` + `message_delta.usage`) paths. TTFT is measured from request send to first streamed content/reasoning delta. The frontend accumulates per-workspace totals in a new `ChatUsageStats` field on `WorkspaceEntry` (serde-default so old snapshots load) and renders a compact mono footer under the chat log: `N turns · in {tokens} · out {tokens} · {tok/s} · ttft {ms|s}`. Footer is hidden until the first turn produces data; resets on Reset Conversation.
37
+
-**Copy + Redo buttons on assistant answers**: each assistant chat bubble grew an action row with a Copy button (writes the markdown to the system clipboard via `navigator.clipboard`, switches to a check icon for 1.4 s) and a Redo button (re-submits the previous user-turn prompt). `DisplayTimelineItem::Assistant` carries the preceding user text so Redo knows what to replay; the Redo button is hidden for the welcome bubble. Actions fade up from `opacity: 0.55` to full on hover for visual restraint.
38
+
-**Subagent prompt hardening**: subagent system prompt restructured into `# Tools` / `# Required execution flow` / `# Forbidden behaviors` sections with a mandatory first `list_workspace_files {"path":"."}` call when `workspace_read` is provisioned. Explicit ban on `status:"blocked"` without a prior workspace probe and on paraphrasing tool errors as "tools unavailable".
39
+
-**Subagent server-side blocked-without-trying guard**: new `validate_submit` rejects a `submit_result` with `status:"blocked"` when the role had `workspace_read` but the agent never called `list_workspace_files`, `read_workspace_file`, or `workspace_search`. The rejection is fed back into the conversation as a tool response so the loop continues, forcing the model to actually probe access before re-submitting. `handle_tool_call` now returns a `ToolCallOutcome` enum (`SubmitAccepted` / `SubmitRejected(msg)` / `NotSubmit`) wired into both the OpenAI and Anthropic subagent loops. 4 unit tests pin the contract.
40
+
-**`allowedToolGroups` schema constrained**: `subagents.run` JSON schema now enums `allowedToolGroups.items` to the 9 valid group strings (`environment_read`, `workspace_read`, `diff_read`, `git_read`, `memory_read`, `plans_read`, `tasks_read`, `rules_skills_read`, `web_read`). Previously the array was `{type: string}` with no constraint, so the coordinator could invent names like `"file_access"` / `"files"` and silently end up with an empty subagent toolset.
41
+
-**Strict toolgroup parser + role-defaults fallback**: new `parse_allowed_groups_strict(names) → (valid, unknown)` separates parseable groups from typos. `subagents::run` surfaces the unknowns via a `SubagentStep` with `status:"warning"` listing the bad names and the valid alternatives, and falls back to the role's defaults instead of spawning a subagent with only `submit_result`. 2 new unit tests cover the path.
42
+
-**Subagent tool-roster diagnostic step**: every subagent emits a `SubagentStep` immediately after `SubagentStarted` listing the actual provisioned tools (`Provisioned N tool(s): list_workspace_files, read_workspace_file, …`). When a model claims "no tools" the operator can compare against this list in one glance and tell hallucination from real misprovisioning.
43
+
-**Subagent tools list `×N` compaction**: consecutive same-named tool calls inside a subagent card collapse into one row with a `×N` mint-green badge — same merge logic the main timeline uses. `Search workspace ×5` instead of five identical rows.
36
44
37
45
### Changed
38
46
39
47
-**Docs**: README, developer setup, build guide, and `.env.release.example` now document the setup and cross-platform release automation paths.
-**Command palette shortcut**: tmux-style chord moved from `Ctrl+B :` to `Ctrl+B p`. To free `p`, `ToggleRightPanel` (formerly `Ctrl+B p`) was reassigned to `Ctrl+B r`. Classic-mode shortcuts (`Ctrl+Shift+P` palette, `Ctrl+P` side panel) unchanged. Hint strings in `en_us.rs` / `de_de.rs` updated.
42
50
-**Subagent card polish**: dedicated CSS for the subagent timeline group — name and status now separated by a baseline-aligned `gap` (no more `scanblocked` run-together), font sizes shrunk (`0.7rem` name / `0.62rem` status / `0.68rem` summary / `0.64rem` tools), default `<details>` marker hidden in favour of the existing chevron pattern.
51
+
-**Tool-loop round budgets raised**: `MAX_ROUNDS` for both the OpenAI-compatible and Anthropic coordinator loops bumped from `12 → 36`; `MAX_SUBAGENT_ROUNDS` from `8 → 24`. The previous limits aborted long multi-step turns mid-investigation, especially in subagents that need several file-read rounds before they can synthesize findings.
52
+
-**Subagent skill doc — `allowedToolGroups` documented**: `harness_skills/subagents.md` now lists every valid `allowedToolGroups` string with its tool-coverage, recommends omitting the field entirely (defaults are sensible), and explicitly warns against invented names like `"file_access"` / `"files"` / `"shell_exec"`.
0 commit comments