diff --git a/Core/Sources/ChatService/ToolCalls/AutoApproval/FetchWebPageApprovalStorage.swift b/Core/Sources/ChatService/ToolCalls/AutoApproval/FetchWebPageApprovalStorage.swift new file mode 100644 index 00000000..a8216b79 --- /dev/null +++ b/Core/Sources/ChatService/ToolCalls/AutoApproval/FetchWebPageApprovalStorage.swift @@ -0,0 +1,33 @@ +import Foundation + +struct FetchWebPageApprovalStorage { + private var approvals: [ConversationID: Set] = [:] + + mutating func allowURLs(conversationId: ConversationID, urls: [String]) { + guard !conversationId.isEmpty else { return } + let normalizedURLs = Set(urls.compactMap(normalize)) + guard !normalizedURLs.isEmpty else { return } + approvals[conversationId, default: []].formUnion(normalizedURLs) + } + + func areAllowed(conversationId: ConversationID, urls: [String]) -> Bool { + guard !conversationId.isEmpty else { return false } + let normalizedURLs = Set(urls.compactMap(normalize)) + guard !normalizedURLs.isEmpty, + let approvedURLs = approvals[conversationId] + else { + return false + } + return normalizedURLs.isSubset(of: approvedURLs) + } + + mutating func clear(conversationId: ConversationID) { + guard !conversationId.isEmpty else { return } + approvals.removeValue(forKey: conversationId) + } + + private func normalize(_ url: String) -> String? { + let normalizedURL = url.trimmingCharacters(in: .whitespacesAndNewlines) + return normalizedURL.isEmpty ? nil : normalizedURL + } +} diff --git a/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalManager.swift b/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalManager.swift index 71757fa8..bc3de6f2 100644 --- a/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalManager.swift +++ b/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalManager.swift @@ -6,6 +6,7 @@ public actor ToolAutoApprovalManager { public enum AutoApproval: Equatable, Sendable { case mcpTool(scope: AutoApprovalScope, serverName: String, toolName: String) case mcpServer(scope: AutoApprovalScope, serverName: String) + case fetchWebPage(conversationId: ConversationID, urls: [String]) case sensitiveFile( scope: AutoApprovalScope, toolName: String, @@ -18,6 +19,7 @@ public actor ToolAutoApprovalManager { private var mcpStorage = MCPApprovalStorage() private var sensitiveFileStorage = SensitiveFileApprovalStorage() private var terminalStorage = TerminalApprovalStorage() + private var fetchWebPageStorage = FetchWebPageApprovalStorage() public init() {} @@ -39,6 +41,9 @@ public actor ToolAutoApprovalManager { allowMCPServerGlobally(serverName: serverName) } + case let .fetchWebPage(conversationId, urls): + allowFetchWebPage(conversationId: conversationId, urls: urls) + case let .sensitiveFile(scope, toolName, description, pattern): switch scope { case .session(let conversationId): @@ -66,6 +71,16 @@ public actor ToolAutoApprovalManager { } } + // MARK: - Fetch webpage approvals + + public func allowFetchWebPage(conversationId: ConversationID, urls: [String]) { + fetchWebPageStorage.allowURLs(conversationId: conversationId, urls: urls) + } + + public func isFetchWebPageAllowed(conversationId: ConversationID, urls: [String]) -> Bool { + fetchWebPageStorage.areAllowed(conversationId: conversationId, urls: urls) + } + // MARK: - MCP approvals public func allowMCPTool(conversationId: String, serverName: String, toolName: String) { @@ -168,6 +183,7 @@ public actor ToolAutoApprovalManager { mcpStorage.clear(scope: .session(conversationId)) sensitiveFileStorage.clear(scope: .session(conversationId)) terminalStorage.clear(scope: .session(conversationId)) + fetchWebPageStorage.clear(conversationId: conversationId) } public func clearGlobalData() { @@ -176,4 +192,3 @@ public actor ToolAutoApprovalManager { terminalStorage.clear(scope: .global) } } - diff --git a/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalParsingHelpers.swift b/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalParsingHelpers.swift index 3b8f97f5..8d3413c1 100644 --- a/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalParsingHelpers.swift +++ b/Core/Sources/ChatService/ToolCalls/AutoApproval/ToolAutoApprovalParsingHelpers.swift @@ -57,6 +57,26 @@ extension ToolAutoApprovalManager { name == ToolName.runInTerminal.rawValue } + public nonisolated static func isFetchWebPageOperation(name: String) -> Bool { + name == ToolName.fetchWebPage.rawValue + } + + public nonisolated static func extractFetchWebPageURLs( + from input: [String: AnyCodable]? + ) -> [String] { + guard let urls = input?["urls"]?.value as? [String] else { return [] } + return normalizeFetchWebPageURLs(urls) + } + + public nonisolated static func normalizeFetchWebPageURLs(_ urls: [String]) -> [String] { + var seen = Set() + return urls.compactMap { url in + let normalizedURL = url.trimmingCharacters(in: .whitespacesAndNewlines) + guard !normalizedURL.isEmpty, seen.insert(normalizedURL).inserted else { return nil } + return normalizedURL + } + } + public nonisolated static func extractSensitiveFileConfirmationInfo(from message: String) -> SensitiveFileConfirmationInfo { let fullRange = NSRange(message.startIndex ..< message.endIndex, in: message) diff --git a/Core/Sources/ChatService/ToolCalls/ClientToolConfirmationEventHandler.swift b/Core/Sources/ChatService/ToolCalls/ClientToolConfirmationEventHandler.swift index 262bd3f6..d9d687d0 100644 --- a/Core/Sources/ChatService/ToolCalls/ClientToolConfirmationEventHandler.swift +++ b/Core/Sources/ChatService/ToolCalls/ClientToolConfirmationEventHandler.swift @@ -58,6 +58,17 @@ extension ChatService { } } + if ToolAutoApprovalManager.isFetchWebPageOperation(name: params.name) { + let urls = ToolAutoApprovalManager.extractFetchWebPageURLs(from: params.input) + let allowed = await ToolAutoApprovalManager.shared.isFetchWebPageAllowed( + conversationId: params.conversationId, + urls: urls + ) + if allowed { + return true + } + } + if let mcpServerName { let allowed = await ToolAutoApprovalManager.shared.isMCPAllowed( conversationId: params.conversationId, diff --git a/Core/Sources/ConversationTab/Views/ConversationAgentProgressView/ConversationAgentProgressView.swift b/Core/Sources/ConversationTab/Views/ConversationAgentProgressView/ConversationAgentProgressView.swift index f002f643..c38d2f94 100644 --- a/Core/Sources/ConversationTab/Views/ConversationAgentProgressView/ConversationAgentProgressView.swift +++ b/Core/Sources/ConversationTab/Views/ConversationAgentProgressView/ConversationAgentProgressView.swift @@ -108,6 +108,9 @@ struct ToolConfirmationView: View { private var mcpServerName: String? { ToolAutoApprovalManager.extractMCPServerName(from: titleText) } private var conversationId: String { tool.invokeParams?.conversationId ?? "" } private var invokeMessage: String { tool.invokeParams?.message ?? "" } + private var fetchWebPageURLs: [String] { + ToolAutoApprovalManager.extractFetchWebPageURLs(from: tool.invokeParams?.input) + } private var isSensitiveFileOperation: Bool { ToolAutoApprovalManager.isSensitiveFileOperation(message: invokeMessage) } private var sensitiveFileInfo: ToolAutoApprovalManager.SensitiveFileConfirmationInfo { ToolAutoApprovalManager.extractSensitiveFileConfirmationInfo(from: invokeMessage) @@ -117,6 +120,11 @@ struct ToolConfirmationView: View { private var shouldShowSensitiveFileSplitButton: Bool { mcpServerName == nil && isSensitiveFileOperation && !conversationId.isEmpty } + private var shouldShowFetchWebPageSplitButton: Bool { + ToolAutoApprovalManager.isFetchWebPageOperation(name: toolName) + && !conversationId.isEmpty + && !fetchWebPageURLs.isEmpty + } @ViewBuilder private var confirmationActionView: some View { @@ -124,6 +132,8 @@ struct ToolConfirmationView: View { CopilotPolicyNotifierImpl.shared.copilotPolicy.agentModeAutoApprovalEnabled { if tool.isToolcallingLoopContinueTool { continueButton + } else if shouldShowFetchWebPageSplitButton { + fetchWebPageSplitButton } else if shouldShowSensitiveFileSplitButton { sensitiveFileSplitButton } else if shouldShowMCPSplitButton, let serverName = mcpServerName { @@ -166,6 +176,38 @@ struct ToolConfirmationView: View { .buttonStyle(.borderedProminent) } + private var fetchWebPageMenuItems: [SplitButtonMenuItem] { + [ + SplitButtonMenuItem( + title: fetchWebPageURLs.count == 1 + ? "Allow this URL in this Session" + : "Allow these URLs in this Session" + ) { + chat.send( + .toolCallAcceptedWithApproval( + tool.id, + .fetchWebPage( + conversationId: conversationId, + urls: fetchWebPageURLs + ) + ) + ) + }, + ] + } + + private var fetchWebPageSplitButton: some View { + SplitButton( + title: "Allow Once", + isDisabled: false, + primaryAction: { + chat.send(.toolCallAccepted(tool.id)) + }, + menuItems: fetchWebPageMenuItems, + style: .prominent + ) + } + private var sensitiveFileMenuItems: [SplitButtonMenuItem] { var items: [SplitButtonMenuItem] = [] @@ -325,6 +367,23 @@ struct ToolConfirmationView: View { ThemedMarkdownText(text: tool.invokeParams?.message ?? "", chat: chat) .frame(maxWidth: .infinity, alignment: .leading) + if ToolAutoApprovalManager.isFetchWebPageOperation(name: toolName), + !fetchWebPageURLs.isEmpty { + VStack(alignment: .leading, spacing: 4) { + Text(fetchWebPageURLs.count == 1 ? "URL" : "URLs") + .scaledFont(size: chatFontSize - 1, weight: .semibold) + .foregroundStyle(.primary) + + ForEach(fetchWebPageURLs, id: \.self) { url in + Text(url) + .textSelection(.enabled) + .scaledFont(size: chatFontSize - 1) + .foregroundStyle(.primary) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + HStack { Button(action: { chat.send(.toolCallCancelled(tool.id)) diff --git a/Core/Tests/ChatServiceTests/ToolAutoApprovalParsingHelpersTests.swift b/Core/Tests/ChatServiceTests/ToolAutoApprovalParsingHelpersTests.swift index 486b018f..1c5347c8 100644 --- a/Core/Tests/ChatServiceTests/ToolAutoApprovalParsingHelpersTests.swift +++ b/Core/Tests/ChatServiceTests/ToolAutoApprovalParsingHelpersTests.swift @@ -39,4 +39,71 @@ class ToolAutoApprovalParsingHelpersTests: XCTestCase { XCTAssertEqual(ToolAutoApprovalManager.extractTerminalCommandNames(from: "ls | grep match"), ["ls", "grep"]) XCTAssertEqual(ToolAutoApprovalManager.extractTerminalCommandNames(from: "ls &> out.txt"), ["ls"]) } + + func testIsFetchWebPageOperation() { + XCTAssertTrue(ToolAutoApprovalManager.isFetchWebPageOperation(name: "fetch_webpage")) + XCTAssertFalse(ToolAutoApprovalManager.isFetchWebPageOperation(name: "run_in_terminal")) + } + + func testNormalizeFetchWebPageURLs() { + XCTAssertEqual( + ToolAutoApprovalManager.normalizeFetchWebPageURLs( + [ + " https://example.com/one ", + "", + "https://example.com/two", + "https://example.com/one", + ] + ), + ["https://example.com/one", "https://example.com/two"] + ) + } + + func testFetchWebPageApprovalIsScopedToConversationAndURL() async { + let manager = ToolAutoApprovalManager() + let firstURL = "https://example.com/one" + let secondURL = "https://example.com/two" + + let initiallyAllowed = await manager.isFetchWebPageAllowed( + conversationId: "conversation-1", + urls: [firstURL] + ) + XCTAssertFalse(initiallyAllowed) + + await manager.approve( + .fetchWebPage( + conversationId: "conversation-1", + urls: [" \(firstURL) "] + ) + ) + + let allowedInApprovedConversation = await manager.isFetchWebPageAllowed( + conversationId: "conversation-1", + urls: [firstURL] + ) + let allowedInOtherConversation = await manager.isFetchWebPageAllowed( + conversationId: "conversation-2", + urls: [firstURL] + ) + let allowedForOtherURL = await manager.isFetchWebPageAllowed( + conversationId: "conversation-1", + urls: [secondURL] + ) + let allowedForMixedURLs = await manager.isFetchWebPageAllowed( + conversationId: "conversation-1", + urls: [firstURL, secondURL] + ) + XCTAssertTrue(allowedInApprovedConversation) + XCTAssertFalse(allowedInOtherConversation) + XCTAssertFalse(allowedForOtherURL) + XCTAssertFalse(allowedForMixedURLs) + + await manager.clearConversationData(conversationId: "conversation-1") + + let allowedAfterClearing = await manager.isFetchWebPageAllowed( + conversationId: "conversation-1", + urls: [firstURL] + ) + XCTAssertFalse(allowedAfterClearing) + } } diff --git a/Server/package-lock.json b/Server/package-lock.json index 5a375b85..c9eb0479 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -8,9 +8,9 @@ "name": "@github/copilot-xcode", "version": "0.0.1", "dependencies": { - "@github/copilot-language-server": "1.523.3", - "@github/copilot-language-server-darwin-arm64": "1.523.3", - "@github/copilot-language-server-darwin-x64": "1.523.3", + "@github/copilot-language-server": "1.537.0", + "@github/copilot-language-server-darwin-arm64": "1.537.0", + "@github/copilot-language-server-darwin-x64": "1.537.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", "monaco-editor": "0.52.2" @@ -37,10 +37,42 @@ "node": ">=14.17.0" } }, + "node_modules/@github/copilot-darwin-arm64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.79.tgz", + "integrity": "sha512-rsw7JoMvlcxXb0yx08oIeEc0x2hUEwKSfhX9ESKfdMVt0Ckrzm4OEvNUyzOpOnLJ9+l3h/aI+u1w5g2ZU2K7UA==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-arm64": "copilot" + } + }, + "node_modules/@github/copilot-darwin-x64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.79.tgz", + "integrity": "sha512-D983e2lXYnq+KhjA8mTZXonY1+LGfJN9BM195J73shUvx49nRJmibDHWLvVtGeYc+43evGUOAQrOqOspAhhWPQ==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-x64": "copilot" + } + }, "node_modules/@github/copilot-language-server": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.523.3.tgz", - "integrity": "sha512-beEj0Mvw6hZSqYyj+7vvtkZ8s9G8IHI4D95HhCHYAk68LGhMBm2lri0WQ9if7NQPZa0fhEkNhlF6SEFTgqiPFw==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.537.0.tgz", + "integrity": "sha512-CEu2bAl6kCLZfX2XZIGiTt54aoyGby30jAB2eB7+4e/K/Lgz78a/mXPyGW55yvA8nbrbf36we5NVxeZm6wkq8Q==", "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "^3.17.5" @@ -49,18 +81,24 @@ "copilot-language-server": "dist/language-server.js" }, "optionalDependencies": { - "@github/copilot-language-server-darwin-arm64": "1.523.3", - "@github/copilot-language-server-darwin-x64": "1.523.3", - "@github/copilot-language-server-linux-arm64": "1.523.3", - "@github/copilot-language-server-linux-x64": "1.523.3", - "@github/copilot-language-server-win32-arm64": "1.523.3", - "@github/copilot-language-server-win32-x64": "1.523.3" + "@github/copilot-darwin-arm64": "1.0.79", + "@github/copilot-darwin-x64": "1.0.79", + "@github/copilot-language-server-darwin-arm64": "1.537.0", + "@github/copilot-language-server-darwin-x64": "1.537.0", + "@github/copilot-language-server-linux-arm64": "1.537.0", + "@github/copilot-language-server-linux-x64": "1.537.0", + "@github/copilot-language-server-win32-arm64": "1.537.0", + "@github/copilot-language-server-win32-x64": "1.537.0", + "@github/copilot-linux-arm64": "1.0.79", + "@github/copilot-linux-x64": "1.0.79", + "@github/copilot-win32-arm64": "1.0.79", + "@github/copilot-win32-x64": "1.0.79" } }, "node_modules/@github/copilot-language-server-darwin-arm64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.523.3.tgz", - "integrity": "sha512-RllQkKiU4Tw3ag9sv1KNE3s97ZYjvbPjnMr0D7RCINq875/rHfdCEY+H1q42YgafZF+gGilHIW12HpA2iW6NUQ==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.537.0.tgz", + "integrity": "sha512-KYiD6G2cqOctCfWv6bkBWP43fI0YmvBW1VikXUudrVOdIUekSxV1EWk2elz1SYNOT+p9i4DJfIvJ8larnny4EQ==", "cpu": [ "arm64" ], @@ -70,9 +108,9 @@ ] }, "node_modules/@github/copilot-language-server-darwin-x64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.523.3.tgz", - "integrity": "sha512-c1L9Auej3jlIR2CilLsXchIEFleS158v5HtrRdyzXytPwQsrG+Wvf7e7vC5L8jTTLhAitCm9o/VqeaUAs2FGMQ==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.537.0.tgz", + "integrity": "sha512-CXlg3sIqm3Jo2U+CQDLOWvGHiWgaJrxRF1r0bRGIC+bh+lLUeq4idgBjeckroFszaurKbkt9+FwLpQ7tqsQFpA==", "cpu": [ "x64" ], @@ -82,9 +120,9 @@ ] }, "node_modules/@github/copilot-language-server-linux-arm64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.523.3.tgz", - "integrity": "sha512-JSWwX8CJ1mGBTfcLS+vB4q7DUCVDqi2AzFPYGGBHXYnRGa77X75gDdai1/kIO5OO12S2FqyjIPr7j9wY4Zas5w==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.537.0.tgz", + "integrity": "sha512-48gkdSSR2CQoYIb+pDzXbpc5eIC0Ac9IkyEZJ8JJFUZV/gfYH3NICaUauqOgXRkfJV7MeyZcmNUovmUzx75W2Q==", "cpu": [ "arm64" ], @@ -95,9 +133,9 @@ ] }, "node_modules/@github/copilot-language-server-linux-x64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.523.3.tgz", - "integrity": "sha512-/NVKbSkdsTt11i2CYWcgBZAVTYHk0bCrb9tmwbBDRGPeZd+qyiWWv7roVOh6Ocu9ofX/BDCTUW8nZ2hOt3MKvQ==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.537.0.tgz", + "integrity": "sha512-9514CfEr7joC5makmx+GDhNeFXG5cTafVs+/5KjhL9v2i/l+oSI1DAcy7SKtijB9AuPCw3sZd4hTYLnDzUH8Mg==", "cpu": [ "x64" ], @@ -108,9 +146,9 @@ ] }, "node_modules/@github/copilot-language-server-win32-arm64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.523.3.tgz", - "integrity": "sha512-o5GC4Gutkkw1Fz00h7Q2vB6/u93vjfYOjzvYJ1XaXGUTczUeFdgiwn6b7+snp4Gpy5ad20Sqk03Zd/KeOVz8KQ==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.537.0.tgz", + "integrity": "sha512-EOm3uHfN/T4t/TRVz3Z+8HVwe+0yiqA2qOumJfFVGBsEdjfRxY6YcnKzFJrmK6JMf+1E+LImKYPJtPLNY77C2A==", "cpu": [ "arm64" ], @@ -121,9 +159,9 @@ ] }, "node_modules/@github/copilot-language-server-win32-x64": { - "version": "1.523.3", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.523.3.tgz", - "integrity": "sha512-q+B6QzV/fzeqIKwqwj1yoBnHKgcnMsOrrcx0JiCPTB29iN2AMcvjdR1Er933VRF1UYyr/NZSEgU25xQQGDyV8A==", + "version": "1.537.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.537.0.tgz", + "integrity": "sha512-PKWXk1fuAhGmg+t7sn/7YfTQPufIBSUjgFY7Ft/ZGxR0GIergGaaKdV4rqjeQQ2B2yYakLjHVbRk2OkiQtCbNA==", "cpu": [ "x64" ], @@ -133,6 +171,76 @@ "win32" ] }, + "node_modules/@github/copilot-linux-arm64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.79.tgz", + "integrity": "sha512-qqaNkvi92Wg+4OZk/kTWC2nUG72G0vV6eRAo5+PnKaPmjdX1GsI0a+lPxXPEbzX0zYLi/8yrUyANwyyNEsGgXA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-arm64": "copilot" + } + }, + "node_modules/@github/copilot-linux-x64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.79.tgz", + "integrity": "sha512-wzotZfvHkItutciLFMXZT2k9Qiii4Ta8tsVDCMQ7CP8hPxV91FyJ1yf3+FFSSfPvWrfYM6BOAiqIuX+LjgRuiw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-x64": "copilot" + } + }, + "node_modules/@github/copilot-win32-arm64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.79.tgz", + "integrity": "sha512-5wg/ayCBTVy4g4FdO/9BJZRVARY0sgjAn9rBkw5BSJMv4u7Mvxg5Sftlift+V5UWxTyCSHAELZ5IHKvox4Yi8w==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-arm64": "copilot.exe" + } + }, + "node_modules/@github/copilot-win32-x64": { + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.79.tgz", + "integrity": "sha512-FTpThWwwCDYnLdE0pfdo5zpAQLLVg36kmC2IKyVMuCYv9iPe7rE1mz7ng/UITN9M3TAMBrwHSvCV3pITvw4W8Q==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-x64": "copilot.exe" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -924,9 +1032,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, "funding": [ { @@ -1310,9 +1418,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -1452,9 +1560,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -1472,7 +1580,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, diff --git a/Server/package.json b/Server/package.json index bd713687..fc952180 100644 --- a/Server/package.json +++ b/Server/package.json @@ -7,9 +7,9 @@ "build": "webpack" }, "dependencies": { - "@github/copilot-language-server": "1.523.3", - "@github/copilot-language-server-darwin-arm64": "1.523.3", - "@github/copilot-language-server-darwin-x64": "1.523.3", + "@github/copilot-language-server": "1.537.0", + "@github/copilot-language-server-darwin-arm64": "1.537.0", + "@github/copilot-language-server-darwin-x64": "1.537.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", "monaco-editor": "0.52.2"