Release notes
Nanocoder v1.32.0
What's Changed
Nanocoder's ACP agent now honours the
mcpServersan editor sends onsession/new,session/loadandsession/resume. Stdio and HTTP servers are connected for that session only, so their tools exist in that session (and in subagents it starts) and in no other, and your own MCP configuration is never read or changed. Loading or resuming a session replaces its previous servers, and closing it, or deleting it, disconnects them. A server that fails to connect, or uses SSE, is logged and skipped and the request still succeeds.initializenow reportsmcpCapabilities(http). A tool whose name an existing tool already has is skipped, and these tools follow the usual approval rules. Sessions with no servers behave as before.ACP extension requests now use the
_prefix ACP reserves for custom methods:_nanocoder/renameSession,_nanocoder/timeline/list,_nanocoder/timeline/revertand_nanocoder/retryTurn. The bare names still work as deprecated aliases and log a one-time notice, and will be removed in a later release.initializenow lists the exact method and notification names underagentCapabilities._meta.nanocoder, so a client can detect support instead of guessing from the version. A custom request the agent doesn't recognise now fails with the standard "Method not found" (-32601) instead of a plain error. The VS Code extension uses the advertised names and falls back to the bare ones for an older agent.ACP sessions now keep their own provider and model. Changing them with
session/set_config_optionaffects only that session (a running turn finishes on the model it started with), its subagents use the model it is on, the config options returned for a session are its own, and saved sessions record their own provider and model.session/resumeandsession/loadrestore the saved provider and model when they are still available, and otherwise stay on the default and report the saved choice in_meta["nanocoder/modelFallback"]. The agent advertisesagentCapabilities._meta.nanocoder.perSessionModel.ACP clients can now exempt a session from retention with the new
_nanocoder/pinSessionextension method (sessionId,pinned). NeitherretentionDaysnormaxSessionsdeletes a pinned session, and pinned sessions do not count towardmaxSessions;session/deletestill removes them.session/listentries report the mark as_meta["nanocoder/pinned"], andinitializereports the effectiveretentionDaysandmaxSessionsas_meta["nanocoder/retention"].ACP clients can now turn tools off for a single session. Send
_meta: {"nanocoder/disabledTools": ["browser"]}onsession/new,session/loadorsession/resume, for example to stop Nanocoder's built-in browser when the editor provides its own. The names are added to the user's owndisabledTools, never replacing it, and apply to that session only: the tools are left out of the tool list and the prompt, a call the model makes to one anyway is refused and nothing runs, and subagents the session starts respect the same list. The response_metareports the list in effect under the same key so a client can verify it. The list is not saved with the session and the user's config files are never read or changed for this. The approval policy the response reports no longer lists a tool the session has turned off. Sessions that send nothing are unchanged.ACP clients can now follow each subagent run on its own. Nanocoder sends a
_nanocoder/subagentnotification as every run starts, progresses and ends (completed,failedorcancelled), with a stablechildRunId, theparentRunId(empty for a child of the turn), the parentagenttool call, the subagent's name, progress counts and its result or error. A new_nanocoder/cancelSubagentrequest cancels one run bychildRunIdwithout ending the turn: the run reportscancelled, the parentagentcall gets a "Subagent was cancelled" result and carries on, and cancelling the whole turn still cancels every run. The permission request for a subagent's tool call now names its run under_metaasnanocoder/childRunId. Both are listed inagentCapabilities._meta.nanocoder. Clients that ignore the new notification see the same behaviour as before.Add a read-only
_nanocoder/timeline/readACP method that returns a file's before-image for a timeline checkpoint (text,createdorunavailable), and reportcreatedFilesand a per-promptturnIdin_nanocoder/timeline/listentries.truncateToMessageIndexchanges with every model round-trip, soturnIdis what groups the checkpoints of one prompt; checkpoints recorded before this change have noturnId.Clients can now check and grant directory trust without
--trust-directory.nanocoder trust --status [--json]reports whether the folder is trusted (trusted,not-trusted,changedorneeds-re-approval), what it will run and its fingerprint, and loads nothing from the folder, including its.envand any preferences file in it.nanocoder trust --grant <fingerprint>saves the folder only if its fingerprint still matches, so a client can save exactly what it showed the user.nanocoder --acpnow exits with code3when it refuses an untrusted folder, instead of1, which other startup failures still use. Each trust entry also records a fingerprint version, so an entry saved by another version reads as needing re-approval instead of changed. A project.envcan no longer setXDG_CONFIG_HOMEorAPPDATA, which decide where the trust record is stored. Failures to read or save preferences are now written to the log instead of being shown in the chat.Added a first-class provider template for FutureInfra, an OpenAI-compatible AI API router, to the
/settings providerswizard. Selecting it fills in the base URL (https://futureinfra.ai/v1/ai) so only an API key and a model name (for exampleopenai/gpt-4o-mini) are needed.Added an agent evaluation harness under
benchmarks/agent/, run withpnpm run test:agent-eval. It measures pass/fail, steps, tokens and cost per task by shelling out tonanocoder --plain --json run, so a released tag can be measured with the same harness as the working tree. Six vendored task fixtures each carry machine-checkable assertions and distractor files, so a run working from degraded context fails rather than merely finishing cheaper; every result records the fixture-set id and a content hash of the fixtures. It is deliberately outsidepnpm run test:all, since it needs real model calls. Phase 0 of #1197.Added the Agentic CI/CD Gate: Nanocoder can now review pull requests and investigate (and optionally fix) CI failures without an interactive session.
git_prgainsdiff,comment,review,checksandlogsactions (CI run logs support search and pagination).nanocoder verify --pr <n> [--post-review]runs a headless, read-only review with a semgrep pass over the PR's changed files, printing it or posting it as a PR comment. It refuses an untrusted directory (--trust-directorybypasses this for one run), and its reviewer can never comment, review or open PRs itself, whateveralwaysAllowsays.The per-project daemon can watch GitHub Actions for failures (
ciWatchin your global preferences, requires theghCLI), run a read-onlyverify-ci-investigatorsubagent, post the diagnosis to the branch's PR, and send OS notifications. Skills can react to failures too with a newci.job.failedtrigger (optionalbranchesfilter).nanocoder daemon start --trust <comment-only|auto-fix|full-commit>(ornanocoder.verify.trustLevel
…