Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,30 @@

## Unreleased

### Added

- Choose Keenable in `/search`, onboarding or settings with your own API key. Search results use the selected provider, and keys remain masked in the terminal.

### Fixed

- OpenAI-compatible fine-tuned and proxy models can recover once when their API requires a different completion-token parameter.
## 0.9.11 - 2026-11-12

### Added

- Configure delegated-agent request limits with `agent.subagentMaxIterations`; exhausted work returns partial findings and an explicit completion status.
- Answer ACP follow-up questions through capability-gated form elicitation, with cancellation and session-retirement cleanup.
- Choose Keenable in `/search`, onboarding or settings with your own API key. Search results use the selected provider, and keys remain masked in the terminal.
- Squad MCP now also manages agent profiles, abilities, extra project folders, skills, group chats, channel membership and scheduled routines.
- Squad is built in as an MCP connection. Select an agent in the running app with `/squad`, send it direct messages with `/message`, and read conversation history and delivery receipts. The connection also reads Squad artifacts and memories.

### Fixed

- Retain answer-only runtime commit identities when repository refs are packed, including worktree common-directory refs.
- Continue required completion review with disclosed session evidence when a large workspace diff exceeds its capture time budget.
- Apply supported anchored and numbered single-file patches, reject ambiguous or no-op changes, and authorize rewritten targets before editing.
- Preserve per-agent model, reasoning and explicit research-only scope; forward Code Mode image evidence once while retaining compact script-visible hints.
- Use compatible OpenAI endpoints, token limits, reasoning and sampling parameters; preserve configured reasoning on custom endpoints and bound token-parameter recovery to one resend.
- Keep malformed historical tool calls as readable context and enforce OpenRouter deadlines through complete response body reads.
- Use authoritative running llama.cpp context capacity without blocking composer startup or overriding explicit user limits.
- Send the Autohand identity and opaque per-conversation routing on official OpenCode Go endpoints, and avoid whole-turn replay after Managed Identity authentication failure.
- Stop automatic replay after storage-capacity failures, report unsaved-state risk, and recover valid project-history rows without rewriting original logs.
- Resolve built-in skills from encoded filesystem paths and preserve complete project associations for new Cursor imports containing spaces, percent signs or Unicode.
- Enforce bare all-tool denials for advertised and fabricated tools and automatic specialist preparation; ACP reports whether deny-all scope was activated.
- OpenAI-compatible fine-tuned and proxy models can recover once when their API requires a different completion-token parameter.
- Start chat and file work in ordinary folders without initializing Git or creating an ignore file. Existing repositories still show their branch; initialize Git only when you choose to use it.
- Keep the composer editable while restoring saved conversations, preserve drafts and early submissions, and wait for restored history before executing queued work.
- Prevent full-screen resize frames from accumulating in iTerm2 scrollback, preserve drafts and cursor edits, and relaunch compiled executables correctly inside tmux. Plain `--tmux` uses the current folder; `--worktree` and `--zit` request isolation explicitly.
Expand All @@ -32,6 +41,8 @@

- Exercise resize behavior through real tmux and native iTerm2, Ghostty, cmux, and VS Code windows in GitHub Actions, with the iTerm2 Python API disabled.

See [the 0.9.11 release notes](docs/changelog/whats-new-0.9.11.md) for details.

## 0.9.10 - 2026-11-04

### Added
Expand Down
31 changes: 23 additions & 8 deletions docs/autohand-orchestration.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,20 @@ keep their existing behavior.

The lead plans, edits code, runs tests, and integrates results. It can delegate
independent file discovery, symbol and AST summaries, and documentation lookup
to Fantail research workers. The default session limit is four threads: the
lead and three workers. Workers receive read-only inspection tools and return
to an explicit read-only research pool using `research_only: true`. The default
Cloud orchestration limit is four threads: the lead and three workers. Research
workers receive read-only inspection tools and return
compact findings with file references, contracts, documentation sources, and
uncertainties. Their private tool transcripts stay out of the lead's context.
Ordinary reviewer and implementer delegations retain their agent definitions,
tools, and reasoning settings; orchestration does not turn them into research
workers. Explicit research-only restrictions also apply outside Cloud mode.

Delegated agents have an independent default limit of 30 model requests. Use
`agent.subagentMaxIterations`, agent-definition `maxIterations`, or a lower
per-call `maxIterations` to control it. The final request asks for a summary
without tools. Available work returns as an explicit partial result when the
limit is reached, including through Code Mode; it is not reported as completed.

Moa also provides independent, tool-free advice at three checkpoints:

Expand All @@ -24,15 +34,19 @@ Each review receives the current session conversation, including any earlier
context compaction, and the checkpoint evidence. Commit and completion reviews
also receive the workspace diff against HEAD, including staged and untracked
files, without changing the real Git index. Oversized or failed diff captures
are reported as unavailable, not approved. Non-Git workspaces are identified
are reported as unavailable, not approved. A completion-only capture that
exceeds its time budget can instead be reviewed using session evidence, with
the missing diff explicitly disclosed. Approval still requires the advisor's
verdict; commit capture failures remain blocking. Non-Git workspaces are identified
explicitly in the review evidence. Arbitrary scripts that stage or commit
internally cannot be detected as Git checkpoints; the final review still runs.

The lead addresses requested changes before proceeding. An unavailable review
or three rejected checkpoints ends the turn as incomplete with the reason
visible. When a final answer is ready, it remains visible as an unreviewed or
unapproved draft alongside the review feedback. The turn retains a failed
footer and a prepared goal stays active with its successor queued. Goal
visible. An approved answer is delivered after review. A rejected or unavailable
candidate may be shown as an explicitly unreviewed or unapproved draft alongside
the feedback. In that case the turn retains a failed footer and a prepared goal
stays active with its successor queued. Goal
completion is persisted only after approval and final answer delivery succeed.
Resolve the review feedback and ask to continue; a visible draft is not proof
of approval. Simple chat and routine shell steps do not call the advisor. Advisor
Expand Down Expand Up @@ -63,7 +77,8 @@ replayed by the transport. A late or malformed answer never counts as approval.

The orchestration setting is saved as `autohandai.orchestration`. Explicit
`features.multi_agent_v2.max_concurrent_threads_per_session` values override the
four-thread default. Worker model overrides remain supported; model suggestions
in agent definitions do not override Fantail while orchestration is enabled.
four-thread Cloud default. Worker model overrides remain supported. Agent
definitions and their reasoning requirements are respected subject to account
entitlements, rather than being replaced by a blanket Fantail assignment.
Moa reasoning effort is high for advisor requests. Fantail requests do not send
a reasoning-effort parameter.
35 changes: 35 additions & 0 deletions docs/changelog/whats-new-0.9.11.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Autohand Code 0.9.11

### More reliable long-running work

- Delegated agents have a configurable 30-request default through `agent.subagentMaxIterations`. Per-agent limits and lower per-call limits remain available. Exhausted agents return their partial findings with an explicit status instead of losing completed work.
- Code Mode preserves image evidence for the model while keeping script-visible image hints compact. Agent model and reasoning choices are respected, and research-only restrictions apply when explicitly requested.
- Completion review can continue with disclosed session evidence when capturing a large workspace diff exceeds its time budget. Required review and commit guards remain in place.
- ACP clients that support form elicitation can answer follow-up questions. Cancellations and retired sessions release the pending question safely.

### A steadier terminal and recoverable sessions

- Reduce duplicated resize frames and scrollback growth in iTerm2, keep drafts and cursor edits intact, and launch compiled executables correctly inside tmux. Plain `--tmux` uses the current folder; `--worktree` and `--zit` request isolation explicitly.
- Keep the composer editable while restoring a saved conversation, preserve early submissions, and wait for restored history before executing queued work.
- Recover usable project-history entries around malformed log rows. Storage-capacity errors stop automatic replay and explain that recent data may be unsaved.
- Start ordinary folder work without creating a Git repository. Initialize Git only when you choose to use it.

### Provider compatibility and local models

- OpenAI requests use compatible endpoints, completion limits, sampling and reasoning settings, preserve configured reasoning on custom endpoints, and recover once from an explicitly rejected token parameter.
- OpenRouter deadlines cover complete response bodies. Malformed historical tool calls remain available as readable context instead of being sent back as invalid native arguments.
- Use the context capacity reported by the running llama.cpp server while retaining explicit user limits and responsive startup.
- Avoid replaying an entire turn after a pre-request Azure Managed Identity failure. Official OpenCode Go endpoints receive the Autohand identity and an opaque per-conversation routing key.

### Safer tools and project paths

- Answer-only clients retain the development runtime commit identity in ordinary and worktree checkouts after Git packs its refs.
- Apply supported single-file anchored and numbered patches with clearer rejection diagnostics. Rewritten targets are checked again before authorization; ambiguous and no-op changes fail explicitly.
- A bare `--disallowed-tools '*'` blocks every tool, including automatic specialist dispatch. ACP reports whether the process activated this denial so constrained teaching clients can verify the boundary.
- Find built-in skills reliably from paths containing spaces or encoded characters. New Cursor imports retain complete encoded project paths and project-index associations; existing imported history remains untouched.

### Squad, search and skills

- Built-in Squad MCP supports direct agent messages, history and delivery receipts, agent profiles and abilities, project folders, skills, group chats, channel membership and scheduled routines.
- Choose the opt-in Keenable search provider in `/search`, onboarding or settings with your own API key. Keys stay masked in terminal settings.
- Discover installed skills through a compact name index and load descriptions on demand. Keep background sync off until explicitly enabled, and cancel queued and active sync work immediately when it is disabled.
20 changes: 20 additions & 0 deletions docs/config-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -1173,6 +1173,7 @@ Control agent behavior and iteration limits.
{
"agent": {
"maxIterations": 100,
"subagentMaxIterations": 30,
"enableRequestQueue": true,
"toolSelectionCache": true,
"autoMemory": true,
Expand All @@ -1187,6 +1188,7 @@ Control agent behavior and iteration limits.
| Field | Type | Default | Description |
| -------------------- | ------- | ------- | ------------------------------------------------------------------------------ |
| `maxIterations` | number | `100` | Maximum tool iterations per user request before stopping |
| `subagentMaxIterations` | number | `30` | Default delegated-agent model-request limit; integer from `1` to `1000`, independent of the main agent limit. Agent-definition `maxIterations` overrides the default; a delegation call may lower its effective limit. The final request is reserved for a summary without tools. |
| `enableRequestQueue` | boolean | `true` | Allow users to type and queue requests while agent is working |
| `toolSelectionCache` | boolean | `true` | Cache local per-turn tool schema selection for equivalent tool-selection input |
| `autoMemory` | boolean | `true` | Extract and save durable user/project memories after completed interactive turns, including evidence-backed lessons from failures and cancellations |
Expand All @@ -1198,6 +1200,24 @@ Control agent behavior and iteration limits.
| `sessionRetryDelay` | number | unset | Milliseconds before the first re-run, growing 1.5× per attempt. When unset, provider outages (5xx, network, timeout) wait 5 s, 15 s, 45 s and other errors 1 s, 1.5 s, 2.25 s; a provider retry-after always wins |
| `debug` | boolean | `false` | Enable verbose debug output (logs agent internal state to stderr) |

`/settings` exposes the delegated-agent limit. Agent-definition frontmatter can override the default:

```yaml
---
name: reviewer
maxIterations: 50
---
```

`delegate_task` and `delegate_parallel` accept an optional `maxIterations`; individual parallel entries may lower it further. Reaching the limit returns available work with `status: "partial"` and `reason: "iteration_limit"`, rather than discarding the findings. The final summary request counts toward the limit. If that summary fails, recorded observations and the failure remain available; cancellation, approval stops, and shared run budgets still take precedence. Partial status is available to Code Mode scripts as well as ordinary tool callers and does not mark the delegated task complete.

Disk-capacity errors (`ENOSPC` and `EDQUOT`) stop automatic session replay. The
error explains that recent data may not have been saved; free space before
retrying. A persistence failure can occur after a transcript or tool change has
already been written, so automatically rerunning the turn would risk repeating
work. Existing session files are retained and the error path does not delete
caches or conversations.

## Concurrent Session Awareness

```json
Expand Down
Loading
Loading