Release v1.5.9

Bump version to 1.5.9 and add the changelog entry covering the two inline tool-call parsing fixes: Kimi K3 XTML recovery (PR #92) and malformed GLM legacy-tag recovery with tool-name validation (PR #95). Co-Authored-By: siGit Code <noreply@sigit.si>

Seto Elkahfi committed Sep 13, 2026 at 16:36 UTC a6a9b6ffad5cc937b0e6eaf4521f653cf6dbbab7
3 files changed +30 -2
CHANGELOG.md
+28
@@ -1,5 +1,33 @@
1 # Changelog
2
3 +## 1.5.9
4 +
5 +### Fixed
6 +
7 +- **Kimi K3 tool calls no longer arrive as raw protocol text.** Kimi K3 renders
8 + a call in Moonshot's XTML protocol — pipe-delimited open/sep/close tokens
9 + wrapping named blocks — and when the serving stack doesn't parse that back
10 + into structured tool calls, the whole block surfaced in the editor as literal
11 + text and the turn ended as though the model had answered in prose. The
12 + inline-call recovery now speaks that protocol alongside the legacy XML tags:
13 + tools blocks are parsed into real calls (several per block, argument values
14 + decoded and typed from the block's own type attribute or, when it is
15 + missing, the turn's tool schemas), response blocks are unwrapped so their
16 + text still renders, and think blocks are dropped as private reasoning rather
17 + than shown. The streaming scanner watches all the opening markers, so a
18 + block split across chunk boundaries still recovers
19 +- **GLM's mis-tagged calls recover too.** GLM sometimes precedes the legacy
20 + block's first argument key with another tool-call opening tag instead of the
21 + arg-key opening tag the format calls for, and the recovery rejected the
22 + whole block when it did — the call surfaced as text and whatever it was
23 + trying to do was dropped. The parser now accepts that alias for the first
24 + argument only — later arguments stay strict, so text that merely resembles a
25 + call cannot be recovered as one — in both the whole-blob and streaming
26 + paths, and the scanner tolerates the malformed marker split across chunk
27 + boundaries. Recovery in both protocols also checks the call's name against
28 + the tools actually offered in the turn: a tag naming a tool that was never
29 + in the turn's spec stays on screen instead of being executed
30 +
31 ## 1.5.8
32
33 ### What changed
Cargo.lock
+1 -1
@@ -5778,7 +5778,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
5778
5779 [[package]]
5780 name = "sigit"
5781 -version = "1.5.8"
5781 +version = "1.5.9"
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.8"
3 +version = "1.5.9"
4 edition = "2024"
5 description = "siGit Code — ACP-compatible AI coding agent. Sí, git."
6 documentation = "https://github.com/getsigit/sigit"