Release v1.5.8

Bump the crate to 1.5.8 and write the changelog entry. The permission mode selector was filed under 1.5.7 by a commit that landed after the tag, so it was documented as shipped when it had not been. Moved to 1.5.8, where it actually goes out. Co-Authored-By: siGit Code <noreply@sigit.si>

Seto Elkahfi committed Sep 10, 2026 at 19:26 UTC bc268d44626bd0fd50de70755fe409a044959937
3 files changed +71 -3
CHANGELOG.md
+69 -1
@@ -1,6 +1,6 @@
1 # Changelog
2
3 -## 1.5.7
3 +## 1.5.8
4
5 ### What changed
6
@@ -12,6 +12,74 @@
12 agent in research-only mode. The selector follows `/plan` and `/clear`, and
13 it is deliberately session-scoped so a risky Auto choice does not persist
14 into the next task
15 +- **Tool calls in the editor are worth opening now.** Zed only drew the
16 + disclosure arrow on the handful of cards siGit set `content` on — the model
17 + download and switch spinners — because everything else carried nothing but
18 + `rawInput` and `rawOutput`, fields ACP gives clients no display guidance for.
19 + Every tool call now gets a fenced content block: the pretty-printed arguments
20 + while it runs, then the tool's output once it finishes, with a `(no output)`
21 + placeholder for a silent command like `git add`. Cards are titled
22 + `<tool> · <arg>` rather than the bare tool name, path-bearing tools set
23 + `locations` so the editor can follow along, and a replayed session gets the
24 + same treatment as a live one
25 +- **The context window is visible before compaction fires.** Both model pickers
26 + show each model's window, and the TUI title bar has a gauge for how much of
27 + it the conversation is using. Cloud tiers report their own window instead of
28 + the compaction budget — the budget is when siGit Code summarizes history, not
29 + how much the model can hold, and labelling one with the other understated the
30 + window by an order of magnitude
31 +- **`write_todos` renders as a plan, not a tool card.** Zed and other clients
32 + have real progress UI for `session/update` plans, so the model's todo list
33 + goes there
34 +- **Picker changes read as status rather than chat.** Switching model or
35 + inference backend is UI state, so it renders as a completed think-kind tool
36 + call. The sign-in prompt stays an assistant message, since it needs the user
37 + to act on it
38 +
39 +### Fixed
40 +
41 +- **A reopened thread comes back with its history.** Clicking a saved thread in
42 + Zed sends `session/load`, and the client draws the thread purely from the
43 + `session/update` notifications the agent streams while that request is in
44 + flight. siGit restored the saved history into the backend, which is what
45 + makes the model remember, but sent the client nothing — so the thread opened
46 + empty and looked like a brand new conversation. The snapshot is now turned
47 + into updates before it is restored: user and assistant text as message chunks
48 + with reasoning stripped, each tool call completed with its result folded in,
49 + and `write_todos` as a plan the way it renders live. System messages stay
50 + out, since they seeded the model and were never on screen
51 +- **Compaction no longer fails in every session that ran a tool.**
52 + `compact_history` asked for the summary through `complete(None, None)`, which
53 + sends no tools array but left the live history in place. That history is
54 + thick with assistant `tool_calls` and `role: "tool"` messages, and an
55 + endpoint handed tool shapes with no schema to check them against rejects the
56 + request — Anthropic answers 400. So compaction failed on every attempt in any
57 + session that had run a single tool, however small the history was, and then
58 + retried on every prompt and tool round while that history kept growing. The
59 + conversation now goes as a flattened transcript in one user message, which
60 + keeps what the summary needs and drops the shapes that only mean anything
61 + next to a tool schema
62 +- **A tool call emitted as text is no longer dropped.** Qwen 3, GLM and
63 + DeepSeek write a call as `<tool_call>NAME<arg_key>…` in their chat template
64 + and rely on the serving stack to parse it back into `tool_calls`. When that
65 + doesn't happen the tag arrives as ordinary content, so it was rendered
66 + verbatim in the editor and the turn ended as though the model had chosen to
67 + answer in prose. Both the streaming and non-streaming paths now scan content
68 + for those blocks and turn well-formed ones back into real calls, typing
69 + argument values from the turn's own tool schemas. The streaming scanner holds
70 + back only enough text to catch a tag straddling a chunk boundary, so ordinary
71 + answers still stream token by token. A block that doesn't match the expected
72 + shape is left in the text untouched: reissuing a `run_command` is cheap, but
73 + guessing wrong at a half-parsed `edit_file` would write the wrong change to a
74 + file
75 +- **Tool-call content survives awkward output.** Whitespace-only output is
76 + preserved rather than collapsed, malformed arguments no longer get a
77 + misleading JSON fence, and fence language identifiers are sanitized
78 +
79 +## 1.5.7
80 +
81 +### What changed
82 +
83 - **`@smbcloud/sigit` gets releases again.** The npm scope moved to
84 `@getsigit` in 1.5.5 and the old package was left sitting on the registry at
85 1.5.2, so an install made before the rename went quiet — `npm update` had
Cargo.lock
+1 -1
@@ -5778,7 +5778,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
5778
5779 [[package]]
5780 name = "sigit"
5781 -version = "1.5.7"
5781 +version = "1.5.8"
5782 dependencies = [
5783 "agent-client-protocol",
5784 "anyhow",
Cargo.toml
+1 -1
@@ -1,6 +1,6 @@
1 [package]
2 name = "sigit"
3 -version = "1.5.7"
3 +version = "1.5.8"
4 edition = "2024"
5 description = "siGit Code — ACP-compatible AI coding agent. Sí, git."
6 documentation = "https://github.com/getsigit/sigit"