import Combine import SwiftUI import JSONRPC public extension Notification.Name { static let gitHubCopilotPolicyDidChange = Notification .Name("com.github.CopilotForXcode.CopilotPolicyDidChange") } public struct CopilotPolicy: Hashable, Codable { public var mcpContributionPointEnabled: Bool = true public var customAgentEnabled: Bool = true public var subagentEnabled: Bool = true public var cveRemediatorAgentEnabled: Bool = true public var agentModeAutoApprovalEnabled: Bool = false enum CodingKeys: String, CodingKey { case mcpContributionPointEnabled = "mcp.contributionPoint.enabled" case customAgentEnabled = "customAgent.enabled" case subagentEnabled = "subagent.enabled" case cveRemediatorAgentEnabled = "cveRemediatorAgent.enabled" case agentModeAutoApprovalEnabled = "agentMode.autoApproval.enabled" } } public protocol CopilotPolicyNotifier { var copilotPolicy: CopilotPolicy { get } var policyDidChange: PassthroughSubject { get } func handleCopilotPolicyNotification(_ policy: CopilotPolicy) } public class CopilotPolicyNotifierImpl: CopilotPolicyNotifier { public private(set) var copilotPolicy: CopilotPolicy public static let shared = CopilotPolicyNotifierImpl() public var policyDidChange: PassthroughSubject init( copilotPolicy: CopilotPolicy = CopilotPolicy(), policyDidChange: PassthroughSubject = PassthroughSubject() ) { self.copilotPolicy = copilotPolicy self.policyDidChange = policyDidChange } public func handleCopilotPolicyNotification(_ policy: CopilotPolicy) { self.copilotPolicy = policy DispatchQueue.main.async { [weak self] in guard let self else { return } self.policyDidChange.send(self.copilotPolicy) DistributedNotificationCenter.default().post(name: .gitHubCopilotPolicyDidChange, object: nil) } } }