Skip to content

Commit 3404070

Browse files
committed
Pre-release 0.27.92
1 parent a9ad824 commit 3404070

File tree

24 files changed

+310
-66
lines changed

24 files changed

+310
-66
lines changed

Copilot for Xcode.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Core/Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ let package = Package(
5050
// quick hack to support custom UserDefaults
5151
// https://github.com/sindresorhus/KeyboardShortcuts
5252
.package(url: "https://github.com/devm33/KeyboardShortcuts", branch: "main"),
53-
.package(url: "https://github.com/devm33/CGEventOverride", from: "1.2.1"),
53+
.package(url: "https://github.com/devm33/CGEventOverride", branch: "devm33/fix-stale-AXIsProcessTrusted"),
5454
.package(url: "https://github.com/devm33/Highlightr", branch: "master"),
5555
],
5656
targets: [
@@ -83,6 +83,7 @@ let package = Package(
8383
.product(name: "UserDefaultsObserver", package: "Tool"),
8484
.product(name: "AppMonitoring", package: "Tool"),
8585
.product(name: "SuggestionBasic", package: "Tool"),
86+
.product(name: "Status", package: "Tool"),
8687
.product(name: "ChatTab", package: "Tool"),
8788
.product(name: "Logger", package: "Tool"),
8889
.product(name: "ChatAPIService", package: "Tool"),

Core/Sources/HostApp/General.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Client
22
import ComposableArchitecture
33
import Foundation
44
import LaunchAgentManager
5+
import Status
56
import SwiftUI
67
import XPCShared
78
import Logger
@@ -11,7 +12,7 @@ struct General {
1112
@ObservableState
1213
struct State: Equatable {
1314
var xpcServiceVersion: String?
14-
var isAccessibilityPermissionGranted: Bool?
15+
var isAccessibilityPermissionGranted: ObservedAXStatus = .unknown
1516
var isReloading = false
1617
}
1718

@@ -20,7 +21,7 @@ struct General {
2021
case setupLaunchAgentIfNeeded
2122
case openExtensionManager
2223
case reloadStatus
23-
case finishReloading(xpcServiceVersion: String, permissionGranted: Bool)
24+
case finishReloading(xpcServiceVersion: String, permissionGranted: ObservedAXStatus)
2425
case failedReloading
2526
case retryReloading
2627
}
@@ -35,7 +36,7 @@ struct General {
3536
case .appear:
3637
return .run { send in
3738
await send(.setupLaunchAgentIfNeeded)
38-
for await _ in DistributedNotificationCenter.default().notifications(named: NSNotification.Name("com.apple.accessibility.api")) {
39+
for await _ in DistributedNotificationCenter.default().notifications(named: .serviceStatusDidChange) {
3940
await send(.reloadStatus)
4041
}
4142
}

Core/Sources/HostApp/GeneralSettings/CopilotConnectionView.swift

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,6 @@
11
import ComposableArchitecture
22
import SwiftUI
33

4-
struct ActivityIndicatorView: NSViewRepresentable {
5-
func makeNSView(context _: Context) -> NSProgressIndicator {
6-
let progressIndicator = NSProgressIndicator()
7-
progressIndicator.style = .spinning
8-
progressIndicator.controlSize = .small
9-
progressIndicator.startAnimation(nil)
10-
return progressIndicator
11-
}
12-
13-
func updateNSView(_: NSProgressIndicator, context _: Context) {
14-
// No-op
15-
}
16-
}
17-
184
struct CopilotConnectionView: View {
195
@AppStorage("username") var username: String = ""
206
@Environment(\.toast) var toast
@@ -38,6 +24,9 @@ struct CopilotConnectionView: View {
3824
title: "GitHub Account Status Permissions",
3925
subtitle: "GitHub Connection: \(viewModel.status?.description ?? "Loading...")"
4026
) {
27+
if viewModel.isRunningAction || waitingForSignIn {
28+
ProgressView().controlSize(.small)
29+
}
4130
Button("Refresh Connection") {
4231
viewModel.checkStatus()
4332
}
@@ -72,9 +61,6 @@ struct CopilotConnectionView: View {
7261
viewModel.isSignInAlertPresented = false
7362
}
7463
}
75-
if viewModel.isRunningAction || waitingForSignIn {
76-
ActivityIndicatorView()
77-
}
7864
}
7965
}
8066

Core/Sources/HostApp/GeneralSettings/GeneralSettingsView.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ struct GeneralSettingsView: View {
99
let store: StoreOf<General>
1010

1111
var accessibilityPermissionSubtitle: String {
12-
guard let granted = store.isAccessibilityPermissionGranted else { return "Loading..." }
13-
return granted ? "Granted" : "Not Granted. Required to run. Click to open System Preferences."
12+
switch store.isAccessibilityPermissionGranted {
13+
case .granted:
14+
return "Granted"
15+
case .notGranted:
16+
return "Not Granted. Required to run. Click to open System Preferences."
17+
case .unknown:
18+
return ""
19+
}
1420
}
1521

1622
var body: some View {

Core/Sources/Service/RealtimeSuggestionController.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Combine
66
import Foundation
77
import Logger
88
import Preferences
9+
import Status
910
import QuartzCore
1011
import Workspace
1112
import XcodeInspector
@@ -124,10 +125,12 @@ public actor RealtimeSuggestionController {
124125
do {
125126
try await XcodeInspector.shared.safe.latestActiveXcode?
126127
.triggerCopilotCommand(name: "Sync Text Settings")
128+
await Status.shared.updateExtensionStatus(.succeeded)
127129
} catch {
128130
if filespace.codeMetadata.uti?.isEmpty ?? true {
129131
filespace.codeMetadata.uti = nil
130132
}
133+
await Status.shared.updateExtensionStatus(.failed)
131134
}
132135
}
133136
}

Core/Sources/Service/Service.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public final class Service {
3232
let globalShortcutManager: GlobalShortcutManager
3333
let keyBindingManager: KeyBindingManager
3434
let xcodeThemeController: XcodeThemeController = .init()
35+
public var markAsProcessing: (Bool) -> Void = { _ in }
3536

3637
@Dependency(\.toast) var toast
3738
var cancellable = Set<AnyCancellable>()

Core/Sources/Service/SuggestionPresenter/PresentInWindowSuggestionPresenter.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ struct PresentInWindowSuggestionPresenter {
3030
Task { @MainActor in
3131
let controller = Service.shared.guiController.widgetController
3232
controller.markAsProcessing(isProcessing)
33+
Service.shared.markAsProcessing(isProcessing)
3334
}
3435
}
3536

Core/Sources/Service/XPCService.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import GitHubCopilotService
44
import LanguageServerProtocol
55
import Logger
66
import Preferences
7+
import Status
78
import XPCShared
89

910
public class XPCService: NSObject, XPCServiceProtocol {
@@ -16,8 +17,10 @@ public class XPCService: NSObject, XPCServiceProtocol {
1617
)
1718
}
1819

19-
public func getXPCServiceAccessibilityPermission(withReply reply: @escaping (Bool) -> Void) {
20-
reply(AXIsProcessTrusted())
20+
public func getXPCServiceAccessibilityPermission(withReply reply: @escaping (ObservedAXStatus) -> Void) {
21+
Task {
22+
reply(await Status.shared.getAXStatus())
23+
}
2124
}
2225

2326
// MARK: - Suggestion

ExtensionService/AppDelegate+Menu.swift

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import AppKit
22
import Foundation
33
import Preferences
4+
import Status
45
import SuggestionBasic
56
import XcodeInspector
67
import Logger
@@ -14,10 +15,6 @@ extension AppDelegate {
1415
.init("xcodeInspectorDebugMenu")
1516
}
1617

17-
fileprivate var accessibilityAPIPermissionMenuItemIdentifier: NSUserInterfaceItemIdentifier {
18-
.init("accessibilityAPIPermissionMenuItem")
19-
}
20-
2118
fileprivate var sourceEditorDebugMenu: NSUserInterfaceItemIdentifier {
2219
.init("sourceEditorDebugMenu")
2320
}
@@ -72,12 +69,12 @@ extension AppDelegate {
7269
xcodeInspectorDebug.submenu = xcodeInspectorDebugMenu
7370
xcodeInspectorDebug.isHidden = false
7471

75-
let accessibilityAPIPermission = NSMenuItem(
76-
title: "Accessibility Permission: N/A",
77-
action: nil,
72+
statusMenuItem = NSMenuItem(
73+
title: "",
74+
action: #selector(openStatusLink),
7875
keyEquivalent: ""
7976
)
80-
accessibilityAPIPermission.identifier = accessibilityAPIPermissionMenuItemIdentifier
77+
statusMenuItem.isHidden = true
8178

8279
let quitItem = NSMenuItem(
8380
title: "Quit",
@@ -126,7 +123,7 @@ extension AppDelegate {
126123
statusBarMenu.addItem(toggleIgnoreLanguage)
127124
statusBarMenu.addItem(.separator())
128125
statusBarMenu.addItem(copilotStatus)
129-
statusBarMenu.addItem(accessibilityAPIPermission)
126+
statusBarMenu.addItem(statusMenuItem)
130127
statusBarMenu.addItem(.separator())
131128
statusBarMenu.addItem(openDocs)
132129
statusBarMenu.addItem(openForum)
@@ -160,22 +157,14 @@ extension AppDelegate: NSMenuDelegate {
160157
item.identifier == toggleIgnoreLanguageMenuItemIdentifier
161158
}) {
162159
if let lang = DisabledLanguageList.shared.activeDocumentLanguage {
163-
toggleLanguage.title = "\(DisabledLanguageList.shared.isEnabled(lang) ? "Disable" : "Enable") Completions For \(lang.rawValue)"
160+
toggleLanguage.title = "\(DisabledLanguageList.shared.isEnabled(lang) ? "Disable" : "Enable") Completions for \(lang.rawValue)"
164161
toggleLanguage.action = #selector(toggleIgnoreLanguage)
165162
} else {
166163
toggleLanguage.title = "No Active Document"
167164
toggleLanguage.action = nil
168165
}
169166
}
170167

171-
if let accessibilityAPIPermission = menu.items.first(where: { item in
172-
item.identifier == accessibilityAPIPermissionMenuItemIdentifier
173-
}) {
174-
AXIsProcessTrusted()
175-
accessibilityAPIPermission.title =
176-
"Accessibility Permission: \(AXIsProcessTrusted() ? "Granted" : "Not Granted")"
177-
}
178-
179168
statusChecker.updateStatusInBackground(notify: { (status: String, isOk: Bool) in
180169
if let statusItem = menu.items.first(where: { item in
181170
item.identifier == self.copilotStatusMenuItemIdentifier
@@ -321,6 +310,15 @@ private extension AppDelegate {
321310
}
322311
}
323312
}
313+
314+
@objc func openStatusLink() {
315+
Task {
316+
let status = await Status.shared.getStatus()
317+
if let s = status.url, let url = URL(string: s) {
318+
NSWorkspace.shared.open(url)
319+
}
320+
}
321+
}
324322
}
325323

326324
private extension NSMenuItem {

0 commit comments

Comments
 (0)