Skip to content

Commit 24b2ed8

Browse files
committed
Release 0.34.0
1 parent b2189de commit 24b2ed8

File tree

9 files changed

+47
-22
lines changed

9 files changed

+47
-22
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 0.34.0 - April 29, 2025
9+
### Added
10+
- Added support for new models in Chat: OpenAI GPT-4.1, o3 and o4-mini, Gemini 2.5 Pro
11+
12+
### Changed
13+
- Switched default model to GPT-4.1 for new installations
14+
- Enhanced model selection interface
15+
16+
### Fixed
17+
- Resolved critical error handling issues
18+
819
## 0.33.0 - April 17, 2025
920
### Added
1021
- Added support for new models in Chat: Claude 3.7 Sonnet and GPT 4.5

Core/Sources/ChatService/ChatService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
8888

8989
private func subscribeToWatchedFilesHandler() {
9090
self.watchedFilesHandler.onWatchedFiles.sink(receiveValue: { [weak self] (request, completion) in
91-
guard let self, request.params!.workspaceUri != "/" else { return }
91+
guard let self, request.params!.workspaceFolder.uri != "/" else { return }
9292
self.startFileChangeWatcher()
9393
}).store(in: &cancellables)
9494
}

Core/Sources/ChatService/Skills/ProjectContextSkill.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import XcodeInspector
1111
*/
1212
public class ProjectContextSkill {
1313
public static let ID = "project-context"
14+
public static let ProgressID = "collect-project-context"
1415

1516
public static var resolvedWorkspace: Set<String> = Set()
1617

@@ -33,7 +34,7 @@ public class ProjectContextSkill {
3334

3435
let params = request.params!
3536

36-
guard params.workspaceUri != "/" else { return }
37+
guard params.workspaceFolder.uri != "/" else { return }
3738

3839
/// build workspace URL
3940
let workspaceURL = URL(fileURLWithPath: workspacePath)
@@ -44,7 +45,7 @@ public class ProjectContextSkill {
4445
) ?? workspaceURL
4546

4647
/// ignore invalid resolve request
47-
guard projectURL.path == params.workspaceUri else { return }
48+
guard projectURL.absoluteString == params.workspaceFolder.uri else { return }
4849

4950
let files = WorkspaceFile.getWatchedFiles(
5051
workspaceURL: workspaceURL,

Core/Sources/ConversationTab/Views/ConversationProgressStepView.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import SwiftUI
22
import ConversationServiceProvider
33
import ComposableArchitecture
44
import Combine
5+
import ChatService
56

67
struct ProgressStep: View {
78
let steps: [ConversationProgressStep]
@@ -33,24 +34,32 @@ struct StatusItemView: View {
3334
.scaleEffect(0.7)
3435
case .completed:
3536
Image(systemName: "checkmark")
36-
.foregroundColor(.green.opacity(0.5))
37+
.foregroundColor(.green)
3738
case .failed:
3839
Image(systemName: "xmark.circle")
39-
.foregroundColor(.red.opacity(0.5))
40+
.foregroundColor(.red)
4041
case .cancelled:
4142
Image(systemName: "slash.circle")
42-
.foregroundColor(.gray.opacity(0.5))
43+
.foregroundColor(.gray)
4344
}
4445
}
4546
}
4647

48+
var statusTitle: some View {
49+
var title = step.title
50+
if step.id == ProjectContextSkill.ProgressID && step.status == .failed {
51+
title = step.error?.message ?? step.title
52+
}
53+
return Text(title)
54+
}
55+
4756
var body: some View {
4857
WithPerceptionTracking {
4958
HStack(spacing: 4) {
5059
statusIcon
5160
.frame(width: 16, height: 16)
5261

53-
Text(step.title)
62+
statusTitle
5463
.font(.system(size: chatFontSize))
5564
.lineLimit(1)
5665

ReleaseNotes.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
### GitHub Copilot for Xcode 0.33.0
1+
### GitHub Copilot for Xcode 0.34.0
22

33
**🚀 Highlights**
44

5-
* **New Models**: Claude 3.7 Sonnet and GPT 4.5 are now available in the Copilot Chat model selector.
6-
* **@workspace Context**: Ask questions about your entire codebase by referencing `@workspace` in Copilot Chat.
5+
* **New Models**: OpenAI GPT-4.1, o3 and o4-mini, Gemini 2.5 Pro are now available in the Copilot Chat model selector.
76

87
**💪 Improvements**
98

10-
* Open Copilot Chat with a single click from the Copilot for Xcode app
11-
* Clearer instructions for granting background permissions
9+
* Switched default model to GPT-4.1 for new installations
10+
* Enhanced model selection interface
1211

1312
**🛠️ Bug Fixes**
1413

15-
* Resolved false alarms for sign-in and free plan limit notifications
16-
* Improved app launch performance
17-
* Fixed workspace and context update issues
14+
* Resolved critical error handling issues

Tool/Sources/GitHubCopilotService/Conversation/WatchedFilesHandler.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public final class WatchedFilesHandlerImpl: WatchedFilesHandler {
1515
public let onWatchedFiles: PassthroughSubject<(WatchedFilesRequest, (AnyJSONRPCResponse) -> Void), Never> = .init()
1616

1717
public func handleWatchedFiles(_ request: WatchedFilesRequest, workspaceURL: URL, completion: @escaping (AnyJSONRPCResponse) -> Void, service: GitHubCopilotService?) {
18-
guard let params = request.params, params.workspaceUri != "/" else { return }
18+
guard let params = request.params, params.workspaceFolder.uri != "/" else { return }
1919

2020
let projectURL = WorkspaceXcodeWindowInspector.extractProjectURL(workspaceURL: workspaceURL, documentURL: nil) ?? workspaceURL
2121

@@ -28,7 +28,7 @@ public final class WatchedFilesHandlerImpl: WatchedFilesHandler {
2828

2929
let batchSize = BatchingFileChangeWatcher.maxEventPublishSize
3030
/// only `batchSize`(100) files to complete this event for setup watching workspace in CLS side
31-
let jsonResult: JSONValue = .array(files.prefix(batchSize).map { .string($0) })
31+
let jsonResult: JSONValue = .array(files.prefix(batchSize).map { .hash(["uri": .string($0)]) })
3232
let jsonValue: JSONValue = .hash(["files": jsonResult])
3333

3434
completion(AnyJSONRPCResponse(id: request.id, result: jsonValue))
@@ -39,7 +39,7 @@ public final class WatchedFilesHandlerImpl: WatchedFilesHandler {
3939
let endIndex = min(startIndex + batchSize, files.count)
4040
let batch = Array(files[startIndex..<endIndex])
4141
try? await service?.notifyDidChangeWatchedFiles(.init(
42-
workspaceUri: params.workspaceUri,
42+
workspaceUri: params.workspaceFolder.uri,
4343
changes: batch.map { .init(uri: $0, type: .created)}
4444
))
4545

Tool/Sources/GitHubCopilotService/LanguageServer/GitHubCopilotRequest+Conversation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public typealias ConversationContextRequest = JSONRPCRequest<ConversationContext
167167
// MARK: Watched Files
168168

169169
public struct WatchedFilesParams: Codable {
170-
public var workspaceUri: String
170+
public var workspaceFolder: WorkspaceFolder
171171
public var excludeGitignoredFiles: Bool
172172
public var excludeIDEIgnoredFiles: Bool
173173
}

Tool/Sources/GitHubCopilotService/LanguageServer/GitHubCopilotService.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public class GitHubCopilotBaseService {
247247
capabilities: capabilities,
248248
trace: .off,
249249
workspaceFolders: [WorkspaceFolder(
250-
uri: projectRootURL.path,
250+
uri: projectRootURL.absoluteString,
251251
name: projectRootURL.lastPathComponent
252252
)]
253253
)
@@ -262,6 +262,13 @@ public class GitHubCopilotBaseService {
262262
let notifications = NotificationCenter.default
263263
.notifications(named: .gitHubCopilotShouldRefreshEditorInformation)
264264
Task { [weak self] in
265+
if projectRootURL.path != "/" {
266+
try? await server.sendNotification(
267+
.workspaceDidChangeWorkspaceFolders(
268+
.init(event: .init(added: [.init(uri: projectRootURL.absoluteString, name: projectRootURL.lastPathComponent)], removed: []))
269+
)
270+
)
271+
}
265272
// Send workspace/didChangeConfiguration once after initalize
266273
_ = try? await server.sendNotification(
267274
.workspaceDidChangeConfiguration(

Tool/Sources/GitHubCopilotService/Services/GitHubCopilotConversationService.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public final class GitHubCopilotConversationService: ConversationServiceType {
1616

1717
return try await service.createConversation(request.content,
1818
workDoneToken: request.workDoneToken,
19-
workspaceFolder: workspace.projectURL.path,
19+
workspaceFolder: workspace.projectURL.absoluteString,
2020
doc: nil,
2121
skills: request.skills,
2222
ignoredSkills: request.ignoredSkills,
@@ -35,7 +35,7 @@ public final class GitHubCopilotConversationService: ConversationServiceType {
3535
ignoredSkills: request.ignoredSkills,
3636
references: request.references ?? [],
3737
model: request.model,
38-
workspaceFolder: workspace.projectURL.path)
38+
workspaceFolder: workspace.projectURL.absoluteString)
3939
}
4040

4141
public func cancelProgress(_ workDoneToken: String, workspace: WorkspaceInfo) async throws {

0 commit comments

Comments
 (0)