{"slug": "nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command", "title": "Nanocoder v1.28.0 - ACP for Zed, slimmer tool surface, session resume, copy command", "summary": "Nanocoder v1.28.0 introduces an Agent Client Protocol server enabling native integration with editors like Zed, consolidates its built-in tool surface from 33 to 19 tools with automatic profile selection, and adds session resume functionality. The update also includes structured tool-result validation, API-reported context usage, a skill linter, and new provider support, all developed by the non-profit Nano Collective community.", "body_md": "Nanocoder v1.28.0 is out. Headline additions: an Agent Client Protocol server so editors like Zed can drive Nanocoder natively, a consolidation of the built-in tool surface from 33 tools down to 19 with automatic profile selection, and session resume that replays the full message and tool-call history into the chat view. Underneath: structured tool-result validation, API-reported context usage, a skill linter, two new first-class providers, and a long list of fixes for local-model workflows.\n\nBuilt by the [Nano Collective](https://nanocollective.org) - a community collective building AI tooling not for profit, but for the community.\n\nFull changelog lives in the repo at [https://github.com/Nano-Collective/nanocoder](https://github.com/Nano-Collective/nanocoder).\n\n## Agent Client Protocol (ACP) for Zed and other editors\n\nNanocoder can now run as an [Agent Client Protocol](https://agentclientprotocol.com) agent:\n\n```\nnanocoder --acp\n```\n\nWhen launched with `--acp`\n\n, Nanocoder speaks JSON-RPC over stdin/stdout and the editor becomes the UI. Streaming text, tool cards, before/after diffs for `string_replace`\n\nand `write_file`\n\n, permission prompts, model switching, and `ask_user`\n\noptions all render in the editor instead of the terminal. The four development modes (`normal`\n\n, `auto-accept`\n\n, `yolo`\n\n, `plan`\n\n) are exposed as session modes selectable from the editor; sessions start in `auto-accept`\n\n.\n\nThe new module lives at `source/acp/`\n\nand covers the agent, server, session, conversation loop, content conversion, capability negotiation, and permission handling. Thanks to @Avtrkrb. Closes #529.\n\nFollow-up work added the missing ACP docs, kept the parallel tool-execution loop in sync with the plain shell, and made `NANOCODER_MAX_TURNS`\n\nconfigurable (with a raised default) so long ACP and plain-mode runs are not cut short mid-task.\n\nSetup in Zed is two lines in `settings.json`\n\n:\n\n```\n{\n  \"agent_servers\": {\n    \"Nanocoder\": {\n      \"command\": \"nanocoder\",\n      \"args\": [\"--acp\"]\n    }\n  }\n}\n```\n\nFull setup notes and limitations (in-memory session history across editor restarts, selection-only `ask_user`\n\n, no image or audio processing) are in the ACP docs at [https://github.com/Nano-Collective/nanocoder](https://github.com/Nano-Collective/nanocoder).\n\n## Tool surface consolidated: 33 down to 19\n\nThe built-in tool surface has been consolidated from 33 tools down to 19, with a new auto-detected tune profile as the default. The headline shape changes:\n\n**Tasks** collapse from four tools into a single`write_tasks`\n\nthat replaces the whole list. No IDs for the model to juggle, just a current state.**File ops** merge`delete`\n\n,`move`\n\n,`copy`\n\n, and`create_directory`\n\ninto one`file_op`\n\n.**Git** shrinks from eleven tools to six:`status`\n\n,`diff`\n\n,`log`\n\n,`add`\n\n,`commit`\n\n,`pr`\n\n. Rarer operations flow through`execute_bash`\n\n.\n\nOn top of the consolidation, the **auto** tune profile is now the default. It infers `full`\n\n, `minimal`\n\n, or `nano`\n\nfrom the active model's parameter count, so a small local model automatically gets the slim tool set and shortened prompt while a cloud model is unchanged. The profile re-resolves live on model switch and is surfaced in the input indicator (e.g. `tune: nano (auto)`\n\n). `/usage`\n\nand the context indicator rebuild from the live tune, mode, and model with the profile-filtered tool count, so the numbers reflect what is actually loaded.\n\nRoughly 6.3k lines were removed across this work.\n\n## Structured tool results and single-source validation\n\nTool arguments are now type-checked against each tool's JSON schema at the execution boundary (`schema-validate.ts`\n\n). A malformed model output returns a clear, field-level error the model can self-correct from instead of being coerced at the render layer. Validation runs through a single `withValidation`\n\nseam shared by both the native and XML-fallback execution paths, ahead of any per-tool validator.\n\nApproval policy is centralised the same way, and the old global mode context is removed. The current development mode (including a mid-run switch via Shift+Tab) is honoured consistently across the main loop and subagents. Subagents no longer capture `normal`\n\nonce at startup and silently ignore a later switch.\n\n## Session resume with full history replay\n\nResuming a saved session now replays the message and tool-call history into the chat view via a new `session-history-renderer`\n\n, so you pick up exactly where you left off with the conversation visible rather than an empty screen.\n\nCompanion fixes resolved an autosave race, a history-truncation edge case, and resume-after-save paths, all with regression coverage. Thanks to @akramcodez. Closes #545.\n\n`/copy`\n\nfor the last assistant response\n\nA new `/copy`\n\nslash command copies the most recent assistant response to the system clipboard. Cross-platform via `clipboardy`\n\n(pbcopy on macOS, xclip on Linux, clip.exe on Windows). Surfaces a clear warning when there is no assistant message and a real error when the clipboard write fails.\n\n## Safer local-model defaults\n\nTwo additions aimed squarely at smaller local models running unattended:\n\n**Read-before-edit guards.**`string_replace`\n\nand`write_file`\n\nnow require the file to have been read first. A blind edit to a never-read file is rejected at the tool boundary.**Tool-call loop detection.** A tool-signature tracker detects a model repeating the same tool call in a tight loop and breaks the cycle.\n\nBoth make local models materially safer to leave running on their own.\n\n## Skill linter and command template ergonomics\n\nA new skill linter - `/skills check <name>`\n\nplus a `check_skill`\n\ntool - validates a bundle from disk using the same parsers the loader uses. A PASS means it will load. It is wired into `/skills create`\n\nso the model verifies and self-corrects what it generates. The linter inspects member template bodies too (unsupported mustache tags, unbalanced or unclosed sections, placeholders referencing undeclared parameters), not just frontmatter.\n\nCustom-command bodies now support optional arguments with inline defaults (`name=default`\n\n) and conditional sections using mustache's section syntax (`# name`\n\nfor \"if name is set\" and `^ name`\n\nfor \"if name is empty\"). Inverted-section support in custom-tool templates goes through a shared section engine, so the same rules apply across primitives.\n\n## Two new providers\n\n**Atlas Cloud** is now a first-class provider and sponsor. Wizard onboarding template and a dedicated provider docs page ship with the release. Atlas Cloud is a full-modal inference platform that exposes LLM, image, and video generation APIs through a single endpoint.**Requesty**([https://requesty.ai](https://requesty.ai)) is added as a first-class OpenAI-compatible provider, mirroring the OpenRouter integration with a name matcher, app-attribution headers, a wizard onboarding template, and docs. Thanks to @Thibaultjaigu. Closes #589.\n\n## API-reported context usage\n\nThe `ctx: NN%`\n\nindicator now reflects provider-accurate token counts when the model reports them, captured from the final step's `usage`\n\nrather than the tool-loop-summed `totalUsage`\n\n. When the provider does not report, Nanocoder falls back to a client-side estimate, marked with a leading `~`\n\n(e.g. `ctx: ~42%`\n\n); API-reported figures render bare.\n\nFollow-up work anchored the API figure across turns, counted real tool definitions in the auto-compact gate, and added a tiktoken-based generic fallback tokenizer for more accurate counts on models without a native tokenizer. Thanks to @JimStenstrom. Refs #381.\n\n## Smaller things worth knowing\n\n**Git branch display** in the boot summary and`/status`\n\npanel, with narrower-terminal-friendly rendering. Thanks to @ragini-pandey. Closes #539.**Provider model discovery** in the wizard now surfaces real discovery errors instead of silently falling back, and shows model names with long labels truncated by ellipsis. Thanks to @akramcodez and @Dhirenderchoudhary. Closes #554.**Slash-command completion** supports arrow-key navigation and highlighting, with the double-submit-on-select bug fixed (`TextInput`\n\nignores Enter;`UserInput`\n\nhandles select-then-submit behind a guard flag) and`customCompletion`\n\nrestored. Thanks to @rakshith1928. Closes #578.**Force-compact-and-retry fallback.** When the LLM server rejects a request for exceeding its context window, Nanocoder now compacts and nudges the conversation to continue instead of failing outright. Thanks to @lordoski. Closes #546.**Bash executor** supports timeout, output limits, and abort, with regression tests covering the executor lifecycle. Thanks to @akramcodez. Closes #547.dropped the leading`ask_user`\n\nrendering`?`\n\n, fixed spacing and the hanging indent, added arrow-key navigation, and normalised object-shaped options to readable strings (preferring a label over a value id).keeps mention placeholders in the chat instead of expanding inline, and large-file inlining is capped to avoid blowing up the prompt.`@`\n\n-file-mention handling**Custom display:** failed tool results condense to a one-liner in compact mode (e.g.`write_file failed.`\n\n), while the model still receives the full error in history.\n\n## Fixes\n\n**Copilot GPT-5 reasoning streams** are now handled correctly via an`@ai-sdk/openai`\n\npatch and chat-handler changes, so reasoning content streams properly instead of breaking the response. Thanks to @EntropyParadigm. Closes #577.**Propagate** to streaming bash execution, so cancelling a turn actually stops a long-running streamed command. Thanks to @Dhirenderchoudhary. Closes #550.`AbortSignal`\n\n**Corrupted** The wizard now honours the`agents.config.json`\n\nis no longer silently overwritten.`projectDir`\n\nprop for config-path resolution and the infinite render loop on the`existingProviders`\n\ndefault param is resolved, all with regression coverage. Thanks to @Dhirenderchoudhary. Closes #551, #552.instead of throwing on empty files, including range and metadata-only reads. The marker constant is extracted (originally`read_file`\n\nreturns an empty marker`EMPTY_FILE_MARKER`\n\n, later renamed`EMPTY_CONTENT_MARKER`\n\n) with tests for files containing only a newline. Thanks to @ragini-pandey. Closes #530.**Compaction no longer splits recent tool-call groups**, which previously produced empty model output after compaction.during input. Thanks to @itsishant. Closes #590.`/`\n\nkey no longer scrolls the chat view to the bottom**Chokidar watcher is closed if daemon startup throws**, and the daemon stop-handler is set up before resources start so a failed lockfile write calls`stop()`\n\nand cleans up. Thanks to @OMEE-Y and @rakshith1928. Closes #553, #557.- A stray\n`console.log`\n\nin`message-queue.tsx`\n\nwas replaced with the structured logger. Thanks to @A-S-Manoj. Closes #588. - Subagent context window overrides so delegated agents can run with a different context limit than the main session, and provider names resolve case-insensitively with custom CA bundle support for provider TLS. Thanks to @zerone0x.\n- A\n`tmp >=0.2.6`\n\noverride resolves a path-traversal advisory in a transitive dependency. Thanks to @ragini-pandey.\n\n## Refactor and dead-code sweep\n\nBeyond the tool-surface consolidation above: unified tool-call ID generation, extracted a shared `useWizardForm`\n\nhook, consolidated session-override managers, added message-factory helpers, deduped config loaders, git exec, command dispatch, and conversation-loop flush, extracted `StyledSelectInput`\n\nand `makeSimpleToolFormatter`\n\n, and deleted several dead modules and orphaned exports (including `fetch-local-models`\n\n, orphaned by an earlier removal).\n\nThe **Nanocoder Battlemap** competitive comparison and the README and docs have been refreshed.\n\n## Dependency updates\n\n`ai`\n\n6.0.174 to 6.0.193, plus`@ai-sdk/openai`\n\n,`@ai-sdk/openai-compatible`\n\n,`@ai-sdk/anthropic`\n\n`@agentclientprotocol/sdk`\n\n0.22.1 to 0.25.0`undici`\n\n,`esbuild`\n\n`@biomejs/biome`\n\n2.5.0`lint-staged`\n\n17`@types/node`\n\n,`@types/vscode`\n\n, and other transitive bumps tracked through the lockfile`clipboardy ^5.3.1`\n\nfor`/copy`\n\nIf anything is broken or surprising, please open an issue or drop a note in Discord. Thank you for using Nanocoder.", "url": "https://wpnews.pro/news/nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command", "canonical_source": "https://nanocollective.org/blog/nanocoder-v1280-acp-for-zed-slimmer-tool-surface-session-resume-copy-command-66", "published_at": "2026-06-27 20:55:59+00:00", "updated_at": "2026-07-17 14:50:41.185491+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-agents"], "entities": ["Nano Collective", "Nanocoder", "Zed", "Agent Client Protocol"], "alternates": {"html": "https://wpnews.pro/news/nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command", "markdown": "https://wpnews.pro/news/nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command.md", "text": "https://wpnews.pro/news/nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command.txt", "jsonld": "https://wpnews.pro/news/nanocoder-v1-28-0-acp-for-zed-slimmer-tool-surface-session-resume-copy-command.jsonld"}}