New version v2.3.6

This commit is contained in:
2026-03-04 10:19:16 +01:00
parent 65a35cd508
commit 49f842f119
52 changed files with 14034 additions and 358 deletions

View File

@@ -640,7 +640,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
case "/memory":
if let arg = args.first?.lowercased() {
memoryEnabled = arg == "on"
showSystemMessage("Memory \(memoryEnabled ? "enabled" : "disabled")")
showSystemMessage(memoryEnabled ? "Memory enabled" : "Memory disabled")
} else {
showSystemMessage("Usage: /memory on|off")
}
@@ -648,7 +648,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
case "/online":
if let arg = args.first?.lowercased() {
onlineMode = arg == "on"
showSystemMessage("Online mode \(onlineMode ? "enabled" : "disabled")")
showSystemMessage(onlineMode ? "Online mode enabled" : "Online mode disabled")
} else {
showSystemMessage("Usage: /online on|off")
}
@@ -881,6 +881,13 @@ Don't narrate future actions ("Let me...") - just use the tools.
finalSystemPrompt = summariesText + "\n\n---\n\n" + effectiveSystemPrompt
}
let reasoningConfig: ReasoningConfig? = {
guard settings.reasoningEnabled,
selectedModel?.capabilities.thinking == true,
!isImageGen else { return nil }
return ReasoningConfig(effort: settings.reasoningEffort, exclude: settings.reasoningExclude)
}()
let chatRequest = ChatRequest(
messages: contextWindow.messages,
model: modelId,
@@ -891,7 +898,8 @@ Don't narrate future actions ("Let me...") - just use the tools.
systemPrompt: finalSystemPrompt,
tools: nil,
onlineMode: onlineMode,
imageGeneration: isImageGen
imageGeneration: isImageGen,
reasoning: reasoningConfig
)
if isImageGen {
@@ -934,6 +942,8 @@ Don't narrate future actions ("Let me...") - just use the tools.
} else {
// Regular text: stream response
var fullContent = ""
var fullThinking = ""
var collectedImages: [Data] = []
var totalTokens: ChatResponse.Usage? = nil
var wasCancelled = false
@@ -943,6 +953,13 @@ Don't narrate future actions ("Let me...") - just use the tools.
break
}
if let thinking = chunk.delta.thinking {
fullThinking += thinking
if let index = messages.firstIndex(where: { $0.id == messageId }) {
messages[index].thinkingContent = fullThinking
}
}
if let content = chunk.deltaContent {
fullContent += content
if let index = messages.firstIndex(where: { $0.id == messageId }) {
@@ -950,6 +967,10 @@ Don't narrate future actions ("Let me...") - just use the tools.
}
}
if let images = chunk.delta.images {
collectedImages.append(contentsOf: images)
}
if let usage = chunk.usage {
totalTokens = usage
}
@@ -968,6 +989,9 @@ Don't narrate future actions ("Let me...") - just use the tools.
messages[index].isStreaming = false
messages[index].responseTime = responseTime
messages[index].wasInterrupted = wasCancelled
if !collectedImages.isEmpty {
messages[index].generatedImages = collectedImages
}
if let usage = totalTokens {
messages[index].tokens = usage.completionTokens
@@ -1151,7 +1175,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
mcpEnabled = true
settings.mcpEnabled = true
mcpStatus = "MCP"
showSystemMessage("MCP enabled (\(mcp.allowedFolders.count) folder\(mcp.allowedFolders.count == 1 ? "" : "s") registered)")
showSystemMessage("MCP enabled (^[\(mcp.allowedFolders.count) folder](inflect: true) registered)")
case "off":
mcpEnabled = false
@@ -1165,7 +1189,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
if let error = mcp.addFolder(path) {
showSystemMessage("MCP: \(error)")
} else {
showSystemMessage("MCP: Added folder — \(mcp.allowedFolders.count) folder\(mcp.allowedFolders.count == 1 ? "" : "s") registered")
showSystemMessage("MCP: Added folder — ^[\(mcp.allowedFolders.count) folder](inflect: true) registered")
}
} else {
showSystemMessage("Usage: /mcp add <path>")
@@ -1230,7 +1254,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
if settings.mcpCanCreateDirectories { perms.append("mkdir") }
if settings.mcpCanMoveFiles { perms.append("move/copy") }
let permStr = perms.isEmpty ? "read-only" : "read + \(perms.joined(separator: ", "))"
showSystemMessage("MCP: \(enabled), \(folders) folder\(folders == 1 ? "" : "s"), \(permStr), gitignore: \(settings.mcpRespectGitignore ? "on" : "off")")
showSystemMessage("MCP: \(enabled), ^[\(folders) folder](inflect: true), \(permStr), gitignore: \(settings.mcpRespectGitignore ? "on" : "off")")
default:
showSystemMessage("MCP subcommands: on, off, status, add, remove, list, write")
@@ -1525,10 +1549,10 @@ Don't narrate future actions ("Let me...") - just use the tools.
}
@discardableResult
private func showSystemMessage(_ text: String) -> UUID {
private func showSystemMessage(_ text: String.LocalizationValue) -> UUID {
let message = Message(
role: .system,
content: text,
content: String(localized: text),
tokens: nil,
cost: nil,
timestamp: Date(),