Prepare v1.7.0 and document the ACP v1 surface

Bump the version to 1.7.0 and write its changelog section. Besides the three changes below this one in the stack, it lists seven features already on development that never got an entry (#192 to #195 and #197 to #199). The bare sigit.exe exit fix is not among them: it shipped in 1.6.8 and stays under that heading. v1.6.7 shipped as a scoped patch, and seven bullets under its heading on development were never in that tag. They move to 1.7.0, so the 1.6.7 section matches what was released. The README gets a table of what the agent supports in ACP v1. The PyPI README linked a personal repo as the protocol's home and now links agentclientprotocol.com. AGENTS.md and the ACP skill describe $/cancel_request, the session/list cursor and the replay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: siGit Code v1.6.7-acp <noreply@sigit.si>

Seto Elkahfi committed Oct 12, 2026 at 09:48 UTC 925ad3496e46d17ee4d2f60944b9bde1c9112b32
7 files changed +111 -32
.agents/AGENTS.md
+11 -1
@@ -118,6 +118,14 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
118 `SessionState::remote`), so its turn can wait on the endpoint while another thread is
119 installed. Unknown session ids are rejected instead of silently borrowing the active thread's
120 cwd. Prompt cancellation takes no lock, which lets a client cancel a turn whatever it holds.
121 + `$/cancel_request` is the other way to stop a request, naming it by JSON-RPC id. The SDK only
122 + records it; a handler has to read `responder.cancellation()`. The prompt handler does and calls
123 + `cancel_turn`, the same path `session/cancel` takes, so the prompt still answers with a
124 + `cancelled` stop reason. `authenticate` is dropped instead and answers `-32800`. The other
125 + handlers ignore it, which the spec allows.
126 + `session/load` replays the saved history as `session/update` (`history_replay_updates`):
127 + user text and its image and audio parts, reasoning as a thought chunk under the reply's id,
128 + and each tool call folded together with its result.
129 Message chunks carry a `messageId`: each inference round is one message, so every chunk of
130 it, reasoning included, shares `StreamedReply::message_id` and a tool round starts a new id.
131 A standalone notice (`send_assistant_message`) gets an id of its own, and replayed messages
@@ -427,7 +435,9 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
435 (advertised as `sessionCapabilities.list`, handled by `handle_list_sessions` in `main.rs` — the
436 editor's "Import Threads" picker) must report an absolute `cwd` per session and may filter on
437 it, so a session without one is skipped there while still reopening by id through
430 - `session/load`. Sidecars are written at save time, not at session start, so a thread nobody
438 + `session/load`. A reply holds `SESSION_LIST_PAGE_SIZE` threads; `nextCursor` names the last
439 + one on the page (`SessionListCursor`, modified time plus id) so a save or delete between two
440 + requests cannot shift the next page, and an unparseable cursor is `-32602`. Sidecars are written at save time, not at session start, so a thread nobody
441 spoke in leaves nothing behind. Each ACP save (`persist_session` in `main.rs`) is also sent to
442 the client as a `session_info_update` carrying a fresh `updatedAt`, plus the title when it
443 differs from the last one sent (`announced_titles`), so a new thread gets its title in the
.agents/skills/agent-client-protocol/SKILL.md
+2 -1
@@ -202,11 +202,12 @@ the connection and the agent anymore. Don't reintroduce the mpsc forwarder patte
202 | `NewSessionRequest` | `handle_new_session` | sets cwd, resets history, advertises commands + config options |
203 | `LoadSessionRequest` | `handle_load_session` | like new_session; gated by `load_session(true)` capability |
204 | `ForkSessionRequest` | `handle_fork_session` | gated by `unstable_session_fork` + `SessionForkCapabilities` |
205 -| `ListSessionsRequest` | `handle_list_sessions` | the editor's "Import Threads" picker; gated by `SessionListCapabilities` |
205 +| `ListSessionsRequest` | `handle_list_sessions` | the editor's "Import Threads" picker; gated by `SessionListCapabilities`; paged with `cursor` / `nextCursor` |
206 | `PromptRequest` | `handle_prompt` | the turn: parse blocks → slash commands or tool-calling loop |
207 | `SetSessionConfigOptionRequest` | `handle_set_session_config_option` | the Zed model picker — switches/downloads models |
208 | `SetSessionModeRequest` | `handle_set_session_mode` | legacy mode selector; same Manual/Auto/Plan state as the Permissions config option |
209 | `CancelNotification` | `handle_cancel` | notification, no response |
210 +| `$/cancel_request` | `responder.cancellation()` | not a registered handler: the SDK tracks it per request, and the prompt and `authenticate` closures read the marker |
211
212 Everything else is left to the SDK default (method not found).
213
CHANGELOG.md
+77 -27
@@ -1,38 +1,54 @@
1 # Changelog
2
3 -## 1.6.8
4 -
5 -### Fixed
6 -
7 -- **A bare launch of `sigit.exe` on Windows exits 0 instead of bailing.** A
8 - no-argument launch with a TTY stdin falls through to the non-Unix branch,
9 - which has no TUI to start (the interactive client needs Unix-only fd
10 - redirection). It now prints a short usage message pointing at ACP and
11 - headless modes and exits 0, so winget's installer validator no longer reports
12 - a `Validation-Executable-Error`.
3 +## 1.7.0
4
14 -### Changed
5 +Finishes the Agent Client Protocol v1 surface. An editor can now delete a
6 +thread, show a context meter, tell one message from the next, cancel a request
7 +by its id and page through a long thread list, and a reopened thread comes back
8 +with its reasoning and attachments.
9
16 -- **winget submissions link back to their Package Request issue.** The release
17 - workflow scrapes the winget-pkgs PR URL from wingetcreate, opens a Package
18 - Request issue on first submission, and rewrites the PR body to fill the
19 - Description, tick the issue checkbox, and add `Resolves #NNN` — replacing the
20 - manual per-PR edit that used to follow each release.
21 -- **The winget release workflow files its Package Request issue first and uses
22 - two scoped tokens.** The Package Request issue is opened before the
23 - winget-pkgs PR so the PR can reference it immediately, and issue creation and
24 - PR submission now use separate tokens (`WINGET_ISSUE_TOKEN` and
25 - `WINGET_PR_TOKEN`) rather than one shared token.
10 +### Added
11
27 -## 1.6.7
12 +- **`session/delete`.** A thread removed in the editor is removed from disk, so
13 + it no longer comes back in "Import Threads". A turn still running on it is
14 + stopped first, and deleting an id that is already gone succeeds (#192).
15 +- **A saved thread reports its title and time as they change.** Each save sends
16 + a `session_info_update` with a fresh `updatedAt`, and the title the first time
17 + there is one. A new thread used to stay untitled in the sidebar until the next
18 + `session/list` (#193).
19 +- **Context usage.** A `usage_update` follows every model response, so an editor
20 + can show how full the context window is. `used` is the endpoint's own token
21 + count when it gives one and an estimate otherwise, which is always the case
22 + on-device (#194).
23 +- **Message ids.** Every message chunk carries a `messageId`. An inference round
24 + is one message, so its reply and its reasoning share an id and the round after
25 + a tool call starts a new one (#195).
26 +- **Sign-in through the editor.** For a client that advertises URL-mode
27 + elicitation, `authenticate` hands it the sign-in page instead of launching a
28 + browser from the agent. The user sees where they are being sent, and sign-in
29 + works where siGit Code has no browser to open (#197).
30 +- **The Inference switch is a toggle** for a client that renders boolean config
31 + options. Other clients keep the two-value select (#198).
32 +- **Deny for the session.** A permission prompt offers "deny for this session"
33 + next to "allow for this session", so a tool the user does not want is not
34 + asked about again in that thread (#199).
35 +- **`$/cancel_request`.** A client can cancel a request by its JSON-RPC id. For
36 + `session/prompt` that stops the turn and the command it is running exactly as
37 + `session/cancel` does, and the prompt is answered with the `cancelled` stop
38 + reason. For `authenticate` it ends the wait on the browser and the request is
39 + answered `-32800`. The notification used to be ignored.
40 +- **`session/list` is paged.** A reply holds at most 100 threads and a
41 + `nextCursor` when there are more. The cursor names the last thread on the
42 + page instead of counting an offset, so the next page is right when a thread is
43 + saved or deleted in between. A cursor the agent did not hand out is rejected
44 + with `-32602`; `cursor` used to be ignored.
45
46 ### Fixed
47
31 -- **A cancel that arrives before the turn starts is no longer lost.** A prompt
32 - now registers for `session/cancel` as soon as it begins, not once it reaches
33 - inference. A cancel that lands while the turn is queued on the workspace,
34 - switching threads, loading a model, or running a slash command ends it with
35 - `cancelled` instead of `end_turn`.
48 +- **A reopened thread shows its reasoning and attachments.** `session/load`
49 + replayed only the text of each message. The model's reasoning now comes back
50 + as `agent_thought_chunk` under the reply's `messageId`, and the images and
51 + audio clips of a user message come back as `image` and `audio` blocks.
52 - **Cancelling a turn stops the command it is running.** A foreground
53 `run_command` used to run to its own end (up to two minutes) before the turn
54 noticed the cancel. A cancel or `session/close` now kills the process tree, or
@@ -62,6 +78,40 @@
78 - **An embedded binary resource is read when the model can read it.** An image
79 blob becomes an image input and an audio blob an audio input. Any other blob
80 keeps its placeholder, now with its MIME type.
81 +
82 +## 1.6.8
83 +
84 +### Fixed
85 +
86 +- **A bare launch of `sigit.exe` on Windows exits 0 instead of bailing.** A
87 + no-argument launch with a TTY stdin falls through to the non-Unix branch,
88 + which has no TUI to start (the interactive client needs Unix-only fd
89 + redirection). It now prints a short usage message pointing at ACP and
90 + headless modes and exits 0, so winget's installer validator no longer reports
91 + a `Validation-Executable-Error`.
92 +
93 +### Changed
94 +
95 +- **winget submissions link back to their Package Request issue.** The release
96 + workflow scrapes the winget-pkgs PR URL from wingetcreate, opens a Package
97 + Request issue on first submission, and rewrites the PR body to fill the
98 + Description, tick the issue checkbox, and add `Resolves #NNN` — replacing the
99 + manual per-PR edit that used to follow each release.
100 +- **The winget release workflow files its Package Request issue first and uses
101 + two scoped tokens.** The Package Request issue is opened before the
102 + winget-pkgs PR so the PR can reference it immediately, and issue creation and
103 + PR submission now use separate tokens (`WINGET_ISSUE_TOKEN` and
104 + `WINGET_PR_TOKEN`) rather than one shared token.
105 +
106 +## 1.6.7
107 +
108 +### Fixed
109 +
110 +- **A cancel that arrives before the turn starts is no longer lost.** A prompt
111 + now registers for `session/cancel` as soon as it begins, not once it reaches
112 + inference. A cancel that lands while the turn is queued on the workspace,
113 + switching threads, loading a model, or running a slash command ends it with
114 + `cancelled` instead of `end_turn`.
115 - **A prompt that is only audio is answered.** A clip with no text or image used
116 to end the turn at once with nothing sent to the model, even though the agent
117 advertises audio.
Cargo.lock
+1 -1
@@ -5901,7 +5901,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
5901
5902 [[package]]
5903 name = "sigit"
5904 -version = "1.6.8"
5904 +version = "1.7.0"
5905 dependencies = [
5906 "agent-client-protocol",
5907 "anyhow",
Cargo.toml
+1 -1
@@ -1,6 +1,6 @@
1 [package]
2 name = "sigit"
3 -version = "1.6.8"
3 +version = "1.7.0"
4 edition = "2024"
5 description = "siGit Code — ACP-compatible AI coding agent. Sí, git."
6 documentation = "https://github.com/getsigit/sigit"
README.md
+18
@@ -130,6 +130,24 @@ Install [ACP Client](https://marketplace.visualstudio.com/items?itemName=formula
130 }
131 ```
132
133 +## ACP support
134 +
135 +siGit Code speaks [Agent Client Protocol](https://agentclientprotocol.com) v1 over stdio.
136 +As of 1.7.0 it implements the whole stable v1 surface an agent can offer:
137 +
138 +| Area | What is supported |
139 +|------|-------------------|
140 +| Sessions | `session/new`, `load`, `resume`, `fork`, `list` (paged, with a `cwd` filter), `close`, `delete`, and multi-root projects through `additionalDirectories` |
141 +| Prompts | Text, images, audio, embedded resources and resource links. Stop reasons `end_turn`, `max_tokens`, `max_turn_requests`, `refusal` and `cancelled` |
142 +| Updates | Message and thought chunks with a `messageId`, tool calls with diffs, locations and embedded terminals, plans, `usage_update`, `session_info_update`, slash commands |
143 +| Cancellation | `session/cancel`, and `$/cancel_request` for a prompt or a sign-in |
144 +| Permissions | `session/request_permission` with allow or deny, once or for the session. Manual, Auto and Plan as config options and as session modes |
145 +| Client features | `fs/read_text_file` and `fs/write_text_file`, `terminal/*`, URL-mode elicitation and boolean config options, each used only when the client advertises it |
146 +| MCP | stdio and Streamable HTTP servers passed in `mcpServers` |
147 +| Auth | `authenticate` (browser sign-in) and `logout` |
148 +
149 +`session/fork` is still marked unstable in the protocol. Draft v2 is not enabled.
150 +
151 ## Terminal mode
152
153 Run `sigit` in a terminal and you get the same model and system prompt as the editor integration, just in a full-screen chat UI.
pypi/README.md
+1 -1
@@ -35,7 +35,7 @@ needs the `--acp` argument.
35
36 ### Zed
37
38 -siGit Code works as an [ACP-compatible](https://github.com/nicobailon/agent-client-protocol) agent in [Zed](https://zed.dev). Add this to your Zed settings:
38 +siGit Code works as an [ACP-compatible](https://agentclientprotocol.com) agent in [Zed](https://zed.dev). Add this to your Zed settings:
39
40 ```json
41 {