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"