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"