First public release v2.3.1
This commit is contained in:
@@ -418,6 +418,40 @@ final class DatabaseService: Sendable {
|
||||
)
|
||||
}
|
||||
|
||||
/// Update an existing conversation in-place: rename it, replace all its messages.
|
||||
nonisolated func updateConversation(id: UUID, name: String, messages: [Message], primaryModel: String?) throws {
|
||||
let nowString = isoFormatter.string(from: Date())
|
||||
|
||||
let messageRecords = messages.enumerated().compactMap { index, msg -> MessageRecord? in
|
||||
guard msg.role != .system else { return nil }
|
||||
return MessageRecord(
|
||||
id: UUID().uuidString,
|
||||
conversationId: id.uuidString,
|
||||
role: msg.role.rawValue,
|
||||
content: msg.content,
|
||||
tokens: msg.tokens,
|
||||
cost: msg.cost,
|
||||
timestamp: isoFormatter.string(from: msg.timestamp),
|
||||
sortOrder: index,
|
||||
modelId: msg.modelId
|
||||
)
|
||||
}
|
||||
|
||||
try dbQueue.write { db in
|
||||
try db.execute(
|
||||
sql: "UPDATE conversations SET name = ?, updatedAt = ?, primaryModel = ? WHERE id = ?",
|
||||
arguments: [name, nowString, primaryModel, id.uuidString]
|
||||
)
|
||||
try db.execute(
|
||||
sql: "DELETE FROM messages WHERE conversationId = ?",
|
||||
arguments: [id.uuidString]
|
||||
)
|
||||
for record in messageRecords {
|
||||
try record.insert(db)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nonisolated func loadConversation(id: UUID) throws -> (Conversation, [Message])? {
|
||||
try dbQueue.read { db in
|
||||
guard let convRecord = try ConversationRecord.fetchOne(db, key: id.uuidString) else {
|
||||
@@ -435,7 +469,8 @@ final class DatabaseService: Sendable {
|
||||
let timestamp = self.isoFormatter.date(from: record.timestamp)
|
||||
else { return nil }
|
||||
|
||||
return Message(
|
||||
let starred = (try? MessageMetadataRecord.fetchOne(db, key: record.id))?.user_starred == 1
|
||||
var message = Message(
|
||||
id: msgId,
|
||||
role: role,
|
||||
content: record.content,
|
||||
@@ -444,6 +479,8 @@ final class DatabaseService: Sendable {
|
||||
timestamp: timestamp,
|
||||
modelId: record.modelId
|
||||
)
|
||||
message.isStarred = starred
|
||||
return message
|
||||
}
|
||||
|
||||
guard let convId = UUID(uuidString: convRecord.id),
|
||||
|
||||
@@ -147,7 +147,7 @@ class MCPService {
|
||||
if canWriteFiles {
|
||||
tools.append(makeTool(
|
||||
name: "write_file",
|
||||
description: "Create or overwrite a file with the given content. Parent directories are created automatically.",
|
||||
description: "Create or overwrite a file with the given content. Parent directories are created automatically. WARNING: For existing files larger than ~200 lines, use edit_file instead — writing very large files in a single call may exceed output token limits and fail.",
|
||||
properties: [
|
||||
"file_path": prop("string", "The absolute path to the file to write"),
|
||||
"content": prop("string", "The text content to write to the file")
|
||||
|
||||
Reference in New Issue
Block a user