Skip to content

Commit 4d2448b

Browse files
committed
chore(release): version 20250103.1
**Release Date:** January 3, 2026 **Highlights:** - Claude model issues resolved (infinite loops fixed) - Simplified agent architecture (removed LoopDetector.swift) - Fine-grained CFG scale control (decimal values like 5.9, 7.5) - GitHub Copilot API bugs corrected - Smarter tool result previews (8KB immediate visibility) - HTML release notes format **Bug Fixes:** - Claude no longer loops infinitely on complex workflows - GitHub Copilot API errors eliminated - Tool results now show actual content - Auto-update version comparison corrected **Technical Changes:** - Decimal CFG scale: ConversationModel.sdGuidanceScale Int → Float - ImageGenerationTool accepts Int/Float/Double for backward compatibility - UI updated with 0.1 step increments and decimal display - ChatWidget.performMainChatViewAppear() extracted - Removed LoopDetector.swift (575 lines) - AgentOrchestrator simplified (-127 lines, -22%) **Files Modified:** - Info.plist: v20251230.1 → v20250103.1 - Resources/whats-new.json: User-friendly release notes - Sources/ConversationEngine/ConversationModel.swift - Sources/StableDiffusionIntegration/ImageGenerationTool.swift - Sources/UserInterface/Chat/ChatWidget.swift
1 parent 23c705d commit 4d2448b

5 files changed

Lines changed: 223 additions & 136 deletions

File tree

Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
<key>CFBundlePackageType</key>
2020
<string>APPL</string>
2121
<key>CFBundleShortVersionString</key>
22-
<string>20251230.1</string>
22+
<string>20250103.1</string>
2323
<key>CFBundleVersion</key>
24-
<string>20251230.1</string>
24+
<string>20250103.1</string>
2525
<key>LSApplicationCategoryType</key>
2626
<string>public.app-category.productivity</string>
2727
<key>LSMinimumSystemVersion</key>

Resources/whats-new.json

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,74 @@
11
{
22
"releases": [
3+
{
4+
"version": "20250103.1",
5+
"release_date": "January 3, 2026",
6+
"introduction": "This release resolves bugs with Claude models, simplifies agent workflows, and improves image generation by adding fine grained config scale control.",
7+
"highlights": [
8+
{
9+
"id": "claude-production-ready",
10+
"icon": "checkmark.seal.fill",
11+
"title": "Claude Model Issues Resolved",
12+
"description": "Claude models now complete complex multi-tool workflows. Fixed infinite loops, tool result handling, and context management."
13+
},
14+
{
15+
"id": "simplified-architecture",
16+
"icon": "gearshape.2.fill",
17+
"title": "Simplified Agent Architecture",
18+
"description": "Completely removed the old LoopDetector system and simplified AgentOrchestrator workflow. Agents now work more reliably with cleaner, more maintainable code. No more mysterious edge cases or complex loop detection needed."
19+
},
20+
{
21+
"id": "decimal-cfg-scale",
22+
"icon": "slider.horizontal.3",
23+
"title": "Fine-Grained Image Generation Control",
24+
"description": "CFG scale now accepts decimal values like 5.9 or 7.5 for precise control over how closely images follow your prompts. Perfect for finding the sweet spot between creativity and adherence. Use the stepper for 0.1 increments or type exact values."
25+
},
26+
{
27+
"id": "github-copilot-stability",
28+
"icon": "bolt.shield.fill",
29+
"title": "Corrected GitHub Copilot Integration Bugs",
30+
"description": "Eliminated all known GitHub Copilot API errors through careful message formatting, role ordering, and delta mode fixes. Conversations now flow smoothly without unexpected 400 errors or message slicing issues."
31+
},
32+
{
33+
"id": "consistent-tool-results",
34+
"icon": "doc.plaintext.fill",
35+
"title": "Smarter Tool Result Previews",
36+
"description": "All tools now show you the first 8KB of results immediately, so models can see actual content before deciding whether to read more. Prevents unnecessary read_tool_result calls and makes workflows more efficient."
37+
},
38+
{
39+
"id": "better-release-notes",
40+
"icon": "doc.richtext.fill",
41+
"title": "Better Release Notes",
42+
"description": "Release notes now display in HTML format through the Sparkle updater. See what's new in an easier-to-read format with proper formatting and organization."
43+
}
44+
],
45+
"bugfixes": [
46+
{
47+
"id": "claude-no-more-loops",
48+
"icon": "arrow.triangle.2.circlepath.circle.badge.checkmark.fill",
49+
"title": "Claude No Longer Loops Infinitely",
50+
"description": "Fixed the frustrating issue where Claude would call the same tool 25+ times. Root causes were: missing context re-injection, seeing preview markers without actual data, and choosing the wrong web search tool. All fixed."
51+
},
52+
{
53+
"id": "api-errors-gone",
54+
"icon": "xmark.seal.fill",
55+
"title": "GitHub Copilot API Errors Eliminated",
56+
"description": "No more 'at least one message required' or role validation errors. Fixed message slicing edge cases, proper role ordering, delta mode activation logic, and whitespace handling."
57+
},
58+
{
59+
"id": "tools-show-real-data",
60+
"icon": "doc.text.magnifyingglass",
61+
"title": "Tool Results Show Actual Content",
62+
"description": "Web operations and other tools now use the standard preview system that shows the first 8KB of actual content. Previously some tools only showed storage markers, causing models to call read_tool_result unnecessarily."
63+
},
64+
{
65+
"id": "auto-update-version-logic",
66+
"icon": "arrow.clockwise.circle.fill",
67+
"title": "Auto-Update Version Comparison Fixed",
68+
"description": "Sparkle updater now correctly compares date-based versions (YYYYMMDD.N format). Previously it compared them as strings which could miss updates."
69+
}
70+
]
71+
},
372
{
473
"version": "20251230.1",
574
"release_date": "December 30, 2025",

Sources/ConversationEngine/ConversationModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public struct ConversationSettings: Codable, Sendable {
6464
/// Stable Diffusion parameters
6565
public var sdNegativePrompt: String
6666
public var sdSteps: Int
67-
public var sdGuidanceScale: Int
67+
public var sdGuidanceScale: Float
6868
public var sdScheduler: String
6969
public var sdSeed: Int
7070
public var sdUseKarras: Bool /// Karras sigma schedule for DPM++
@@ -106,7 +106,7 @@ public struct ConversationSettings: Codable, Sendable {
106106
draftMessage: String = "",
107107
sdNegativePrompt: String = "",
108108
sdSteps: Int = 25,
109-
sdGuidanceScale: Int = 8,
109+
sdGuidanceScale: Float = 8.0,
110110
sdScheduler: String = "dpm++",
111111
sdSeed: Int = -1,
112112
sdUseKarras: Bool = true,
@@ -228,7 +228,7 @@ public struct ConversationSettings: Codable, Sendable {
228228
/// Stable Diffusion parameters with defaults for backward compatibility.
229229
sdNegativePrompt = try container.decodeIfPresent(String.self, forKey: .sdNegativePrompt) ?? ""
230230
sdSteps = try container.decodeIfPresent(Int.self, forKey: .sdSteps) ?? 25
231-
sdGuidanceScale = try container.decodeIfPresent(Int.self, forKey: .sdGuidanceScale) ?? 8
231+
sdGuidanceScale = try container.decodeIfPresent(Float.self, forKey: .sdGuidanceScale) ?? 8.0
232232
sdScheduler = try container.decodeIfPresent(String.self, forKey: .sdScheduler) ?? "dpm++"
233233
sdSeed = try container.decodeIfPresent(Int.self, forKey: .sdSeed) ?? -1
234234
sdUseKarras = try container.decodeIfPresent(Bool.self, forKey: .sdUseKarras) ?? true

Sources/StableDiffusionIntegration/ImageGenerationTool.swift

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public class ImageGenerationTool: MCPTool, @unchecked Sendable {
166166
),
167167
"guidance_scale": MCPToolParameter(
168168
type: .integer,
169-
description: "How closely to follow the prompt. Z-Image models: must be 0 (no CFG). Standard SD models: 1-20 (default: 8). Higher values stick closer to prompt. Example: 0 for z-image, 8 for SD models",
169+
description: "How closely to follow the prompt (CFG scale). Z-Image models: must be 0.0 (no CFG). Standard SD models: 1.0-20.0 (default: 8.0). Supports decimal values like 7.5 or 5.9 - pass as number. Higher values stick closer to prompt. Example: 7.5 for SD, 0.0 for z-image",
170170
required: false
171171
),
172172
"seed": MCPToolParameter(
@@ -704,8 +704,16 @@ public class ImageGenerationTool: MCPTool, @unchecked Sendable {
704704
if isZImage {
705705
/// Z-Image defaults: 8 steps, 0 guidance (no CFG)
706706
steps = (parameters["steps"] as? Int) ?? 8
707-
let guidanceScaleInt = (parameters["guidance_scale"] as? Int) ?? 0
708-
guidanceScale = Float(guidanceScaleInt)
707+
/// Accept both Float and Int for guidance_scale
708+
if let floatVal = parameters["guidance_scale"] as? Float {
709+
guidanceScale = floatVal
710+
} else if let doubleVal = parameters["guidance_scale"] as? Double {
711+
guidanceScale = Float(doubleVal)
712+
} else if let intVal = parameters["guidance_scale"] as? Int {
713+
guidanceScale = Float(intVal)
714+
} else {
715+
guidanceScale = 0.0
716+
}
709717

710718
/// Validate z-image constraints
711719
guard (4...50).contains(steps) else {
@@ -724,10 +732,18 @@ public class ImageGenerationTool: MCPTool, @unchecked Sendable {
724732
)
725733
}
726734
} else {
727-
/// Standard SD defaults: 25 steps, 8 guidance
735+
/// Standard SD defaults: 25 steps, 8.0 guidance
728736
steps = (parameters["steps"] as? Int) ?? 25
729-
let guidanceScaleInt = (parameters["guidance_scale"] as? Int) ?? 8
730-
guidanceScale = Float(guidanceScaleInt)
737+
/// Accept both Float and Int for guidance_scale
738+
if let floatVal = parameters["guidance_scale"] as? Float {
739+
guidanceScale = floatVal
740+
} else if let doubleVal = parameters["guidance_scale"] as? Double {
741+
guidanceScale = Float(doubleVal)
742+
} else if let intVal = parameters["guidance_scale"] as? Int {
743+
guidanceScale = Float(intVal)
744+
} else {
745+
guidanceScale = 8.0
746+
}
731747

732748
/// Validate standard SD constraints
733749
guard (20...100).contains(steps) else {

0 commit comments

Comments
 (0)