From 279d95d12c6e05cfaf68e24a3f6aec97378c280d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 00:42:55 +0700 Subject: [PATCH 01/83] feat(integrations): UUID-keyed deep links and external access foundation --- TablePro/AppDelegate+FileOpen.swift | 51 ++++--- TablePro/Core/MCP/MCPAuthGuard.swift | 71 +++++++-- TablePro/Core/MCP/MCPPortAllocator.swift | 61 ++++++++ TablePro/Core/MCP/MCPServerManager.swift | 23 +++ .../Infrastructure/DeeplinkHandler.swift | 141 +++++++++++++++--- .../Connection/DatabaseConnection.swift | 25 +++- ...atabaseConnectionExternalAccessTests.swift | 90 +++++++++++ .../Core/MCP/MCPAuthGuardTests.swift | 128 ++++++++++++++++ .../Core/Services/DeeplinkHandlerTests.swift | 140 ++++++++++++++--- 9 files changed, 660 insertions(+), 70 deletions(-) create mode 100644 TablePro/Core/MCP/MCPPortAllocator.swift create mode 100644 TableProTests/Core/Database/DatabaseConnectionExternalAccessTests.swift create mode 100644 TableProTests/Core/MCP/MCPAuthGuardTests.swift diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index a80c733c8..3a9097053 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -169,19 +169,23 @@ extension AppDelegate { guard let action = DeeplinkHandler.parse(url) else { return } switch action { - case .connect(let name): - connectViaDeeplink(connectionName: name) + case .connect(let connectionId): + connectViaDeeplink(connectionId: connectionId) - case .openTable(let name, let table, let database): - connectViaDeeplink(connectionName: name) { connectionId in - EditorTabPayload(connectionId: connectionId, tabType: .table, + case .openTable(let connectionId, let table, let database): + connectViaDeeplink(connectionId: connectionId) { resolvedId in + EditorTabPayload(connectionId: resolvedId, tabType: .table, tableName: table, databaseName: database) } - case .openQuery(let name, let sql): + case .openQuery(let connectionId, let sql): let maxDeeplinkSQLLength = 51_200 let sqlLength = (sql as NSString).length guard sqlLength <= maxDeeplinkSQLLength else { return } + guard let connection = DeeplinkHandler.resolveConnection(byId: connectionId) else { + showConnectionNotFoundAlert(connectionId: connectionId) + return + } let preview: String if sqlLength > 300 { let hiddenCount = sqlLength - 300 @@ -192,14 +196,14 @@ extension AppDelegate { } let confirmed = await AlertHelper.confirmDestructive( title: String(localized: "Open Query from Link"), - message: String(format: String(localized: "An external link wants to open a query on connection \"%@\":\n\n%@"), name, preview), + message: String(format: String(localized: "An external link wants to open a query on connection \"%@\":\n\n%@"), connection.name, preview), confirmButton: String(localized: "Open Query"), cancelButton: String(localized: "Cancel"), window: NSApp.keyWindow ) guard confirmed else { return } - connectViaDeeplink(connectionName: name) { connectionId in - EditorTabPayload(connectionId: connectionId, tabType: .query, + connectViaDeeplink(connectionId: connectionId) { resolvedId in + EditorTabPayload(connectionId: resolvedId, tabType: .query, initialQuery: sql) } @@ -207,20 +211,33 @@ extension AppDelegate { openWelcomeWindow() PendingActionStore.shared.deeplinkImport = exportable NotificationCenter.default.post(name: .deeplinkImportRequested, object: exportable) + + case .pairIntegration: + fileOpenLogger.info("Pair integration deep link received; Stream B will implement") + + case .exchangePairing: + fileOpenLogger.info("Exchange pairing deep link received; Stream B will implement") + + case .startMCP: + await MCPServerManager.shared.lazyStart() } } + private func showConnectionNotFoundAlert(connectionId: UUID) { + fileOpenLogger.error("Deep link: no connection with ID '\(connectionId.uuidString, privacy: .public)'") + AlertHelper.showErrorSheet( + title: String(localized: "Connection Not Found"), + message: String(format: String(localized: "No saved connection with ID \"%@\"."), connectionId.uuidString), + window: NSApp.keyWindow + ) + } + private func connectViaDeeplink( - connectionName: String, + connectionId: UUID, makePayload: (@Sendable (UUID) -> EditorTabPayload)? = nil ) { - guard let connection = DeeplinkHandler.resolveConnection(named: connectionName) else { - fileOpenLogger.error("Deep link: no connection named '\(connectionName, privacy: .public)'") - AlertHelper.showErrorSheet( - title: String(localized: "Connection Not Found"), - message: String(format: String(localized: "No saved connection named \"%@\"."), connectionName), - window: NSApp.keyWindow - ) + guard let connection = DeeplinkHandler.resolveConnection(byId: connectionId) else { + showConnectionNotFoundAlert(connectionId: connectionId) return } diff --git a/TablePro/Core/MCP/MCPAuthGuard.swift b/TablePro/Core/MCP/MCPAuthGuard.swift index 049c9d2b1..deaac12c7 100644 --- a/TablePro/Core/MCP/MCPAuthGuard.swift +++ b/TablePro/Core/MCP/MCPAuthGuard.swift @@ -18,18 +18,28 @@ actor MCPAuthGuard { // MARK: - Connection Access Check func checkConnectionAccess(connectionId: UUID, sessionId: String) async throws { - let (policy, connectionName, databaseType) = await MainActor.run { + let snapshot: ConnectionAccessSnapshot? = await MainActor.run { let conns = ConnectionStorage.shared.loadConnections() guard let conn = conns.first(where: { $0.id == connectionId }) else { - return (AIConnectionPolicy.never, "", "") + return nil } - let effective = conn.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy - return (effective, conn.name, conn.type.rawValue) + return ConnectionAccessSnapshot( + policy: conn.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy, + externalAccess: conn.externalAccess, + name: conn.name, + databaseType: conn.type.rawValue + ) + } + + guard let snapshot else { + throw MCPError.forbidden( + String(localized: "Connection not found") + ) } - switch policy { + switch snapshot.policy { case .alwaysAllow: - return + break case .never: throw MCPError.forbidden( @@ -38,12 +48,12 @@ actor MCPAuthGuard { case .askEachTime: if let approved = sessionApprovals[sessionId], approved.contains(connectionId) { - return + break } let userApproved = try await promptUserApproval( - connectionName: connectionName, - databaseType: databaseType + connectionName: snapshot.name, + databaseType: snapshot.databaseType ) if userApproved { @@ -54,6 +64,43 @@ actor MCPAuthGuard { ) } } + + if snapshot.externalAccess == .blocked { + throw MCPError.forbidden( + String(localized: "External access is disabled for this connection") + ) + } + } + + func checkExternalWritePermission( + connectionId: UUID, + sql: String, + databaseType: DatabaseType + ) async throws { + guard QueryClassifier.isWriteQuery(sql, databaseType: databaseType) else { return } + + let externalAccess: ExternalAccessLevel? = await MainActor.run { + ConnectionStorage.shared.loadConnections().first { $0.id == connectionId }?.externalAccess + } + + guard let externalAccess else { + throw MCPError.forbidden( + String(localized: "Connection not found") + ) + } + + if externalAccess != .readWrite { + throw MCPError.forbidden( + String(localized: "Connection is read-only for external clients") + ) + } + } + + private struct ConnectionAccessSnapshot: Sendable { + let policy: AIConnectionPolicy + let externalAccess: ExternalAccessLevel + let name: String + let databaseType: String } // MARK: - Query Permission Check @@ -64,6 +111,12 @@ actor MCPAuthGuard { databaseType: DatabaseType, safeModeLevel: SafeModeLevel ) async throws { + try await checkExternalWritePermission( + connectionId: connectionId, + sql: sql, + databaseType: databaseType + ) + let isWrite = QueryClassifier.isWriteQuery(sql, databaseType: databaseType) let needsDialog = safeModeLevel != .silent && (isWrite || safeModeLevel == .alertFull || safeModeLevel == .safeModeFull) diff --git a/TablePro/Core/MCP/MCPPortAllocator.swift b/TablePro/Core/MCP/MCPPortAllocator.swift new file mode 100644 index 000000000..9a354665a --- /dev/null +++ b/TablePro/Core/MCP/MCPPortAllocator.swift @@ -0,0 +1,61 @@ +// +// MCPPortAllocator.swift +// TablePro +// + +import Darwin +import Foundation +import os + +enum MCPPortAllocatorError: Error, LocalizedError { + case rangeExhausted(ClosedRange) + + var errorDescription: String? { + switch self { + case .rangeExhausted(let range): + return String( + format: String(localized: "No free port in range %d-%d"), + Int(range.lowerBound), + Int(range.upperBound) + ) + } + } +} + +enum MCPPortAllocator { + private static let logger = Logger(subsystem: "com.TablePro", category: "MCPPortAllocator") + + static func findFreePort(in range: ClosedRange) throws -> UInt16 { + for port in range where probe(port: port) { + return port + } + logger.error("Port allocator exhausted range \(range.lowerBound)-\(range.upperBound)") + throw MCPPortAllocatorError.rangeExhausted(range) + } + + static func isFree(port: UInt16) -> Bool { + probe(port: port) + } + + private static func probe(port: UInt16) -> Bool { + let fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + guard fd >= 0 else { return false } + defer { close(fd) } + + var reuse: Int32 = 1 + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, socklen_t(MemoryLayout.size)) + + var addr = sockaddr_in() + addr.sin_family = sa_family_t(AF_INET) + addr.sin_port = port.bigEndian + addr.sin_addr.s_addr = INADDR_LOOPBACK.bigEndian + addr.sin_len = UInt8(MemoryLayout.size) + + let bindResult = withUnsafePointer(to: &addr) { addrPtr -> Int32 in + addrPtr.withMemoryRebound(to: sockaddr.self, capacity: 1) { sockPtr in + bind(fd, sockPtr, socklen_t(MemoryLayout.size)) + } + } + return bindResult == 0 + } +} diff --git a/TablePro/Core/MCP/MCPServerManager.swift b/TablePro/Core/MCP/MCPServerManager.swift index ddbbc437a..b7576b920 100644 --- a/TablePro/Core/MCP/MCPServerManager.swift +++ b/TablePro/Core/MCP/MCPServerManager.swift @@ -150,6 +150,29 @@ final class MCPServerManager { await start(port: port) } + func lazyStart() async { + if case .running = state { return } + if case .starting = state { return } + + let settings = AppSettingsManager.shared.mcp + let preferredPort = UInt16(clamping: settings.port) + + let chosenPort: UInt16 + if preferredPort > 0, MCPPortAllocator.isFree(port: preferredPort) { + chosenPort = preferredPort + } else { + do { + chosenPort = try MCPPortAllocator.findFreePort(in: 51_000...52_000) + } catch { + Self.logger.error("Lazy start failed to allocate port: \(error.localizedDescription)") + state = .failed(error.localizedDescription) + return + } + } + + await start(port: chosenPort) + } + func disconnectClient(_ sessionId: String) async { await server?.removeSession(sessionId) await refreshClients() diff --git a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift b/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift index 6dfecf7b4..83f89e9d1 100644 --- a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift +++ b/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift @@ -6,11 +6,27 @@ import Foundation import os +struct PairingRequest: Sendable, Equatable { + let clientName: String + let challenge: String + let redirectURL: URL + let requestedScopes: String? + let requestedConnectionIds: Set? +} + +struct PairingExchange: Sendable, Equatable { + let code: String + let verifier: String +} + enum DeeplinkAction { - case connect(connectionName: String) - case openTable(connectionName: String, tableName: String, databaseName: String?) - case openQuery(connectionName: String, sql: String) + case connect(connectionId: UUID) + case openTable(connectionId: UUID, tableName: String, databaseName: String?) + case openQuery(connectionId: UUID, sql: String) case importConnection(ExportableConnection) + case pairIntegration(PairingRequest) + case exchangePairing(PairingExchange) + case startMCP } @MainActor @@ -26,6 +42,8 @@ enum DeeplinkHandler { return parseConnect(url) case "import": return parseImport(url) + case "integrations": + return parseIntegrations(url) default: logger.warning("Unknown deep link host: \(host ?? "nil", privacy: .public)") return nil @@ -36,43 +54,123 @@ enum DeeplinkHandler { private static func parseConnect(_ url: URL) -> DeeplinkAction? { let components = url.pathComponents.filter { $0 != "/" } - guard let connectionName = components.first?.removingPercentEncoding, - !connectionName.isEmpty else { return nil } + guard let firstRaw = components.first?.removingPercentEncoding, + !firstRaw.isEmpty else { return nil } + + guard let connectionId = UUID(uuidString: firstRaw) else { + logger.warning("Connect deep link missing valid UUID: \(firstRaw, privacy: .public)") + return nil + } - // /connect/{name}/query?sql=... if components.count >= 2, components[1] == "query" { let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems guard let sql = queryItems?.first(where: { $0.name == "sql" })?.value, !sql.isEmpty else { return nil } - return .openQuery(connectionName: connectionName, sql: sql) + return .openQuery(connectionId: connectionId, sql: sql) } - // /connect/{name}/database/{db}/table/{table} if components.count == 5, components[1] == "database", components[3] == "table", let dbName = components[2].removingPercentEncoding, let tableName = components[4].removingPercentEncoding { - return .openTable(connectionName: connectionName, tableName: tableName, - databaseName: dbName) + return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName) } - // /connect/{name}/table/{table} if components.count >= 3, components[1] == "table", let tableName = components[2].removingPercentEncoding { - return .openTable(connectionName: connectionName, tableName: tableName, - databaseName: nil) + return .openTable(connectionId: connectionId, tableName: tableName, databaseName: nil) } - // /connect/{name} if components.count == 1 { - return .connect(connectionName: connectionName) + return .connect(connectionId: connectionId) } logger.warning("Unrecognized connect deep link path: \(url.path, privacy: .public)") return nil } + // MARK: - Integrations parsing + + private static func parseIntegrations(_ url: URL) -> DeeplinkAction? { + let components = url.pathComponents.filter { $0 != "/" } + guard let action = components.first else { + logger.warning("Integrations deep link missing action") + return nil + } + + switch action { + case "pair": + return parsePair(url) + case "exchange": + return parseExchange(url) + case "start-mcp": + return .startMCP + default: + logger.warning("Unknown integrations action: \(action, privacy: .public)") + return nil + } + } + + private static func parsePair(_ url: URL) -> DeeplinkAction? { + guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems + else { + logger.warning("Pair deep link missing query items") + return nil + } + + func value(_ key: String) -> String? { + queryItems.first(where: { $0.name == key })?.value + } + + guard let clientName = value("client"), !clientName.isEmpty, + let challenge = value("challenge"), !challenge.isEmpty, + let redirectRaw = value("redirect"), !redirectRaw.isEmpty, + let redirectURL = URL(string: redirectRaw) else { + logger.warning("Pair deep link missing required params") + return nil + } + + let scopes = value("scopes")?.nilIfEmpty + let connectionIds: Set? + if let csv = value("connection-ids")?.nilIfEmpty { + let parsed = csv.split(separator: ",").compactMap { UUID(uuidString: String($0)) } + connectionIds = parsed.isEmpty ? nil : Set(parsed) + } else { + connectionIds = nil + } + + return .pairIntegration( + PairingRequest( + clientName: clientName, + challenge: challenge, + redirectURL: redirectURL, + requestedScopes: scopes, + requestedConnectionIds: connectionIds + ) + ) + } + + private static func parseExchange(_ url: URL) -> DeeplinkAction? { + guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems + else { + logger.warning("Exchange deep link missing query items") + return nil + } + + func value(_ key: String) -> String? { + queryItems.first(where: { $0.name == key })?.value + } + + guard let code = value("code"), !code.isEmpty, + let verifier = value("verifier"), !verifier.isEmpty else { + logger.warning("Exchange deep link missing code or verifier") + return nil + } + + return .exchangePairing(PairingExchange(code: code, verifier: verifier)) + } + // MARK: - Import parsing private static func parseImport(_ url: URL) -> DeeplinkAction? { @@ -180,10 +278,13 @@ enum DeeplinkHandler { // MARK: - Resolution - static func resolveConnection(named name: String) -> DatabaseConnection? { - let connections = ConnectionStorage.shared.loadConnections() - return connections.first { - $0.name.localizedCaseInsensitiveCompare(name) == .orderedSame - } + static func resolveConnection(byId id: UUID) -> DatabaseConnection? { + ConnectionStorage.shared.loadConnections().first { $0.id == id } + } +} + +private extension String { + var nilIfEmpty: String? { + isEmpty ? nil : self } } diff --git a/TablePro/Models/Connection/DatabaseConnection.swift b/TablePro/Models/Connection/DatabaseConnection.swift index 7b47fb7cc..8924a79f6 100644 --- a/TablePro/Models/Connection/DatabaseConnection.swift +++ b/TablePro/Models/Connection/DatabaseConnection.swift @@ -144,6 +144,24 @@ extension DatabaseType { } } +// MARK: - External Access + +enum ExternalAccessLevel: String, Codable, Sendable, CaseIterable, Identifiable { + case blocked + case readOnly + case readWrite + + var id: String { rawValue } + + var displayName: String { + switch self { + case .blocked: return String(localized: "Blocked") + case .readOnly: return String(localized: "Read-Only") + case .readWrite: return String(localized: "Read-Write") + } + } +} + // MARK: - Connection Color /// Preset colors for connection status indicators @@ -213,6 +231,7 @@ struct DatabaseConnection: Identifiable, Hashable { var sshTunnelMode: SSHTunnelMode var safeModeLevel: SafeModeLevel var aiPolicy: AIConnectionPolicy? + var externalAccess: ExternalAccessLevel = .readOnly var additionalFields: [String: String] = [:] var redisDatabase: Int? var startupCommands: String? @@ -291,6 +310,7 @@ struct DatabaseConnection: Identifiable, Hashable { sshTunnelMode: SSHTunnelMode = .disabled, safeModeLevel: SafeModeLevel = .silent, aiPolicy: AIConnectionPolicy? = nil, + externalAccess: ExternalAccessLevel = .readOnly, mongoAuthSource: String? = nil, mongoReadPreference: String? = nil, mongoWriteConcern: String? = nil, @@ -335,6 +355,7 @@ struct DatabaseConnection: Identifiable, Hashable { self.sshTunnelMode = sshTunnelMode } self.aiPolicy = aiPolicy + self.externalAccess = externalAccess self.redisDatabase = redisDatabase self.startupCommands = startupCommands self.sortOrder = sortOrder @@ -385,7 +406,7 @@ extension DatabaseConnection: Codable { private enum CodingKeys: String, CodingKey { case id, name, host, port, database, username, type case sshConfig, sslConfig, color, tagId, groupId, sshProfileId - case sshTunnelMode, safeModeLevel, aiPolicy, additionalFields + case sshTunnelMode, safeModeLevel, aiPolicy, externalAccess, additionalFields case redisDatabase, startupCommands, sortOrder, localOnly } @@ -406,6 +427,7 @@ extension DatabaseConnection: Codable { sshProfileId = try container.decodeIfPresent(UUID.self, forKey: .sshProfileId) safeModeLevel = try container.decodeIfPresent(SafeModeLevel.self, forKey: .safeModeLevel) ?? .silent aiPolicy = try container.decodeIfPresent(AIConnectionPolicy.self, forKey: .aiPolicy) + externalAccess = try container.decodeIfPresent(ExternalAccessLevel.self, forKey: .externalAccess) ?? .readOnly additionalFields = try container.decodeIfPresent([String: String].self, forKey: .additionalFields) ?? [:] redisDatabase = try container.decodeIfPresent(Int.self, forKey: .redisDatabase) startupCommands = try container.decodeIfPresent(String.self, forKey: .startupCommands) @@ -446,6 +468,7 @@ extension DatabaseConnection: Codable { try container.encode(sshTunnelMode, forKey: .sshTunnelMode) try container.encode(safeModeLevel, forKey: .safeModeLevel) try container.encodeIfPresent(aiPolicy, forKey: .aiPolicy) + try container.encode(externalAccess, forKey: .externalAccess) try container.encode(additionalFields, forKey: .additionalFields) try container.encodeIfPresent(redisDatabase, forKey: .redisDatabase) try container.encodeIfPresent(startupCommands, forKey: .startupCommands) diff --git a/TableProTests/Core/Database/DatabaseConnectionExternalAccessTests.swift b/TableProTests/Core/Database/DatabaseConnectionExternalAccessTests.swift new file mode 100644 index 000000000..48d86a8e9 --- /dev/null +++ b/TableProTests/Core/Database/DatabaseConnectionExternalAccessTests.swift @@ -0,0 +1,90 @@ +// +// DatabaseConnectionExternalAccessTests.swift +// TableProTests +// + +import Foundation +import Testing + +@testable import TablePro + +@Suite("DatabaseConnection externalAccess") +struct DatabaseConnectionExternalAccessTests { + @Test("Default value is readOnly") + func defaultValueIsReadOnly() { + let connection = DatabaseConnection(name: "Test") + #expect(connection.externalAccess == .readOnly) + } + + @Test("Decoding legacy JSON without externalAccess defaults to readOnly") + func decodeLegacyJSONDefaultsToReadOnly() throws { + let json = """ + { + "id": "11111111-2222-3333-4444-555555555555", + "name": "Legacy", + "host": "localhost", + "port": 3306, + "database": "test", + "username": "root", + "type": "MySQL", + "sshConfig": { "enabled": false, "host": "", "port": 22, "username": "", "authMethod": "password", "privateKeyPath": "" }, + "sslConfig": { "mode": "preferred" }, + "color": "None", + "sshTunnelMode": { "kind": "disabled" }, + "safeModeLevel": "silent", + "additionalFields": {}, + "sortOrder": 0, + "localOnly": false + } + """ + let data = Data(json.utf8) + let connection = try JSONDecoder().decode(DatabaseConnection.self, from: data) + #expect(connection.externalAccess == .readOnly) + } + + @Test("Decoding JSON with explicit externalAccess preserves value") + func decodeJSONWithExplicitValue() throws { + let json = """ + { + "id": "11111111-2222-3333-4444-555555555555", + "name": "Test", + "host": "localhost", + "port": 3306, + "database": "", + "username": "", + "type": "MySQL", + "sshConfig": { "enabled": false, "host": "", "port": 22, "username": "", "authMethod": "password", "privateKeyPath": "" }, + "sslConfig": { "mode": "preferred" }, + "color": "None", + "sshTunnelMode": { "kind": "disabled" }, + "safeModeLevel": "silent", + "externalAccess": "blocked", + "additionalFields": {}, + "sortOrder": 0, + "localOnly": false + } + """ + let data = Data(json.utf8) + let connection = try JSONDecoder().decode(DatabaseConnection.self, from: data) + #expect(connection.externalAccess == .blocked) + } + + @Test("Encoding round-trips externalAccess") + func encodeRoundTrip() throws { + let original = DatabaseConnection( + name: "Test", + externalAccess: .readWrite + ) + let data = try JSONEncoder().encode(original) + let decoded = try JSONDecoder().decode(DatabaseConnection.self, from: data) + #expect(decoded.externalAccess == .readWrite) + } + + @Test("All cases are CaseIterable") + func allCasesIterable() { + #expect(ExternalAccessLevel.allCases.count == 3) + #expect(ExternalAccessLevel.allCases.contains(.blocked)) + #expect(ExternalAccessLevel.allCases.contains(.readOnly)) + #expect(ExternalAccessLevel.allCases.contains(.readWrite)) + } +} diff --git a/TableProTests/Core/MCP/MCPAuthGuardTests.swift b/TableProTests/Core/MCP/MCPAuthGuardTests.swift new file mode 100644 index 000000000..be9540422 --- /dev/null +++ b/TableProTests/Core/MCP/MCPAuthGuardTests.swift @@ -0,0 +1,128 @@ +// +// MCPAuthGuardTests.swift +// TableProTests +// + +import Foundation +import Testing + +@testable import TablePro + +@Suite("MCP Auth Guard external access", .serialized) +@MainActor +struct MCPAuthGuardTests { + private let storage = ConnectionStorage.shared + + private func withConnection( + externalAccess: ExternalAccessLevel, + aiPolicy: AIConnectionPolicy = .alwaysAllow, + body: (UUID) async throws -> Void + ) async throws { + let original = storage.loadConnections() + defer { storage.saveConnections(original) } + + let connection = DatabaseConnection( + name: "MCP Test", + type: .mysql, + aiPolicy: aiPolicy, + externalAccess: externalAccess + ) + storage.saveConnections([connection]) + try await body(connection.id) + } + + @Test("Read query passes when externalAccess is readOnly") + func readQueryReadOnly() async throws { + try await withConnection(externalAccess: .readOnly) { connectionId in + let guardian = MCPAuthGuard() + try await guardian.checkExternalWritePermission( + connectionId: connectionId, + sql: "SELECT * FROM users", + databaseType: .mysql + ) + } + } + + @Test("Write query is blocked when externalAccess is readOnly") + func writeQueryBlockedReadOnly() async throws { + try await withConnection(externalAccess: .readOnly) { connectionId in + let guardian = MCPAuthGuard() + do { + try await guardian.checkExternalWritePermission( + connectionId: connectionId, + sql: "UPDATE users SET name='x' WHERE id=1", + databaseType: .mysql + ) + Issue.record("Expected MCPError.forbidden for write on read-only connection") + } catch let error as MCPError { + if case .forbidden = error { + return + } + Issue.record("Expected forbidden, got \(error)") + } + } + } + + @Test("Write query passes when externalAccess is readWrite") + func writeQueryAllowedReadWrite() async throws { + try await withConnection(externalAccess: .readWrite) { connectionId in + let guardian = MCPAuthGuard() + try await guardian.checkExternalWritePermission( + connectionId: connectionId, + sql: "INSERT INTO users (id) VALUES (1)", + databaseType: .mysql + ) + } + } + + @Test("Connection access blocked when externalAccess is blocked") + func connectionAccessBlocked() async throws { + try await withConnection(externalAccess: .blocked) { connectionId in + let guardian = MCPAuthGuard() + do { + try await guardian.checkConnectionAccess( + connectionId: connectionId, + sessionId: "session-1" + ) + Issue.record("Expected MCPError.forbidden for blocked connection") + } catch let error as MCPError { + if case .forbidden = error { + return + } + Issue.record("Expected forbidden, got \(error)") + } + } + } + + @Test("Connection access allowed when externalAccess is readOnly") + func connectionAccessAllowedReadOnly() async throws { + try await withConnection(externalAccess: .readOnly) { connectionId in + let guardian = MCPAuthGuard() + try await guardian.checkConnectionAccess( + connectionId: connectionId, + sessionId: "session-1" + ) + } + } + + @Test("Missing connection rejects external write check") + func missingConnectionRejectsExternalWrite() async { + let guardian = MCPAuthGuard() + let unknownId = UUID() + do { + try await guardian.checkExternalWritePermission( + connectionId: unknownId, + sql: "UPDATE foo SET bar=1", + databaseType: .mysql + ) + Issue.record("Expected MCPError.forbidden for missing connection") + } catch let error as MCPError { + if case .forbidden = error { + return + } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Unexpected error type: \(error)") + } + } +} diff --git a/TableProTests/Core/Services/DeeplinkHandlerTests.swift b/TableProTests/Core/Services/DeeplinkHandlerTests.swift index 894e5ae5c..c336353d2 100644 --- a/TableProTests/Core/Services/DeeplinkHandlerTests.swift +++ b/TableProTests/Core/Services/DeeplinkHandlerTests.swift @@ -13,34 +13,48 @@ struct DeeplinkHandlerTests { // MARK: - Connect Actions - @Test("Connect action with simple name") - func testConnectSimpleName() { - let url = URL(string: "tablepro://connect/Production")! + private static let sampleId = UUID(uuidString: "11111111-2222-3333-4444-555555555555")! + + @Test("Connect action with UUID") + func testConnectByUUID() { + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)")! let action = DeeplinkHandler.parse(url) - if case .connect(let name) = action { - #expect(name == "Production") + if case .connect(let connectionId) = action { + #expect(connectionId == Self.sampleId) } else { Issue.record("Expected .connect, got \(String(describing: action))") } } - @Test("Connect action with percent-encoded name") - func testConnectPercentEncodedName() { - let url = URL(string: "tablepro://connect/My%20DB")! - let action = DeeplinkHandler.parse(url) - if case .connect(let name) = action { - #expect(name == "My DB") + @Test("Connect action with non-UUID first segment returns nil") + func testConnectNonUUIDReturnsNil() { + let url = URL(string: "tablepro://connect/Production")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + @Test("Connect action with empty path returns nil") + func testConnectEmptyPathReturnsNil() { + let url = URL(string: "tablepro://connect/")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + @Test("Connect action accepts lowercase UUID") + func testConnectLowercaseUUID() { + let id = UUID() + let url = URL(string: "tablepro://connect/\(id.uuidString.lowercased())")! + if case .connect(let parsed) = DeeplinkHandler.parse(url) { + #expect(parsed == id) } else { - Issue.record("Expected .connect, got \(String(describing: action))") + Issue.record("Expected .connect for lowercase UUID") } } @Test("Open table without database") func testOpenTableWithoutDatabase() { - let url = URL(string: "tablepro://connect/Prod/table/users")! + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)/table/users")! let action = DeeplinkHandler.parse(url) - if case .openTable(let connectionName, let tableName, let databaseName) = action { - #expect(connectionName == "Prod") + if case .openTable(let connectionId, let tableName, let databaseName) = action { + #expect(connectionId == Self.sampleId) #expect(tableName == "users") #expect(databaseName == nil) } else { @@ -50,10 +64,10 @@ struct DeeplinkHandlerTests { @Test("Open table with database") func testOpenTableWithDatabase() { - let url = URL(string: "tablepro://connect/Prod/database/analytics/table/events")! + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)/database/analytics/table/events")! let action = DeeplinkHandler.parse(url) - if case .openTable(let connectionName, let tableName, let databaseName) = action { - #expect(connectionName == "Prod") + if case .openTable(let connectionId, let tableName, let databaseName) = action { + #expect(connectionId == Self.sampleId) #expect(tableName == "events") #expect(databaseName == "analytics") } else { @@ -63,10 +77,10 @@ struct DeeplinkHandlerTests { @Test("Open query with decoded SQL") func testOpenQueryDecodedSQL() { - let url = URL(string: "tablepro://connect/Prod/query?sql=SELECT%20*%20FROM%20users")! + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)/query?sql=SELECT%20*%20FROM%20users")! let action = DeeplinkHandler.parse(url) - if case .openQuery(let connectionName, let sql) = action { - #expect(connectionName == "Prod") + if case .openQuery(let connectionId, let sql) = action { + #expect(connectionId == Self.sampleId) #expect(sql == "SELECT * FROM users") } else { Issue.record("Expected .openQuery, got \(String(describing: action))") @@ -75,14 +89,14 @@ struct DeeplinkHandlerTests { @Test("Open query with empty SQL returns nil") func testOpenQueryEmptySQLReturnsNil() { - let url = URL(string: "tablepro://connect/Prod/query?sql=")! + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)/query?sql=")! let action = DeeplinkHandler.parse(url) #expect(action == nil) } @Test("Unrecognized path returns nil") func testUnrecognizedPathReturnsNil() { - let url = URL(string: "tablepro://connect/Prod/unknown/path")! + let url = URL(string: "tablepro://connect/\(Self.sampleId.uuidString)/unknown/path")! let action = DeeplinkHandler.parse(url) #expect(action == nil) } @@ -101,6 +115,86 @@ struct DeeplinkHandlerTests { #expect(action == nil) } + @Test("Malformed UUID with extra characters returns nil") + func testMalformedUUIDReturnsNil() { + let url = URL(string: "tablepro://connect/not-a-real-uuid-1234")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + // MARK: - Integrations Actions + + @Test("Pair action parses required params") + func testPairAction() { + let url = URL(string: "tablepro://integrations/pair?client=Raycast&challenge=abc123&redirect=raycast://callback&scopes=readOnly")! + if case .pairIntegration(let request) = DeeplinkHandler.parse(url) { + #expect(request.clientName == "Raycast") + #expect(request.challenge == "abc123") + #expect(request.redirectURL.absoluteString == "raycast://callback") + #expect(request.requestedScopes == "readOnly") + #expect(request.requestedConnectionIds == nil) + } else { + Issue.record("Expected .pairIntegration") + } + } + + @Test("Pair action parses connection-ids CSV") + func testPairActionConnectionIds() { + let id1 = UUID() + let id2 = UUID() + let csv = "\(id1.uuidString),\(id2.uuidString)" + let url = URL(string: "tablepro://integrations/pair?client=Raycast&challenge=abc&redirect=raycast://cb&connection-ids=\(csv)")! + if case .pairIntegration(let request) = DeeplinkHandler.parse(url) { + #expect(request.requestedConnectionIds == Set([id1, id2])) + } else { + Issue.record("Expected .pairIntegration with parsed UUIDs") + } + } + + @Test("Pair missing client returns nil") + func testPairMissingClientReturnsNil() { + let url = URL(string: "tablepro://integrations/pair?challenge=abc&redirect=raycast://cb")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + @Test("Pair missing challenge returns nil") + func testPairMissingChallengeReturnsNil() { + let url = URL(string: "tablepro://integrations/pair?client=Raycast&redirect=raycast://cb")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + @Test("Exchange action parses code and verifier") + func testExchangeAction() { + let url = URL(string: "tablepro://integrations/exchange?code=abc-123&verifier=xyz-456")! + if case .exchangePairing(let exchange) = DeeplinkHandler.parse(url) { + #expect(exchange.code == "abc-123") + #expect(exchange.verifier == "xyz-456") + } else { + Issue.record("Expected .exchangePairing") + } + } + + @Test("Exchange missing verifier returns nil") + func testExchangeMissingVerifierReturnsNil() { + let url = URL(string: "tablepro://integrations/exchange?code=abc")! + #expect(DeeplinkHandler.parse(url) == nil) + } + + @Test("Start MCP action parses without params") + func testStartMCPAction() { + let url = URL(string: "tablepro://integrations/start-mcp")! + if case .startMCP = DeeplinkHandler.parse(url) { + // matched + } else { + Issue.record("Expected .startMCP") + } + } + + @Test("Unknown integrations action returns nil") + func testUnknownIntegrationsAction() { + let url = URL(string: "tablepro://integrations/unknown")! + #expect(DeeplinkHandler.parse(url) == nil) + } + // MARK: - Import — Basic Fields @Test("Import with all basic params") From 4c5945068338a2e21921fa6a23361477ba26e30c Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 00:50:26 +0700 Subject: [PATCH 02/83] feat(integrations): per-connection external access setting UI --- .../Views/Connection/ConnectionAdvancedView.swift | 15 +++++++++++++++ .../Connection/ConnectionFormView+Helpers.swift | 2 ++ .../Views/Connection/ConnectionFormView.swift | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/TablePro/Views/Connection/ConnectionAdvancedView.swift b/TablePro/Views/Connection/ConnectionAdvancedView.swift index 6e48c6552..738581024 100644 --- a/TablePro/Views/Connection/ConnectionAdvancedView.swift +++ b/TablePro/Views/Connection/ConnectionAdvancedView.swift @@ -13,6 +13,7 @@ struct ConnectionAdvancedView: View { @Binding var startupCommands: String @Binding var preConnectScript: String @Binding var aiPolicy: AIConnectionPolicy? + @Binding var externalAccess: ExternalAccessLevel @Binding var localOnly: Bool let databaseType: DatabaseType @@ -85,6 +86,20 @@ struct ConnectionAdvancedView: View { } } + Section(String(localized: "External Access")) { + Picker(String(localized: "Access Level"), selection: $externalAccess) { + ForEach(ExternalAccessLevel.allCases) { level in + Text(level.displayName).tag(level) + } + } + .pickerStyle(.menu) + Text( + "Controls how external clients (Raycast, Cursor, Claude Desktop) access this connection. Tokens cannot exceed this level even with full-access scope." + ) + .font(.caption) + .foregroundStyle(.secondary) + } + if AppSettingsManager.shared.sync.enabled { Section(String(localized: "iCloud Sync")) { Toggle(String(localized: "Local only"), isOn: $localOnly) diff --git a/TablePro/Views/Connection/ConnectionFormView+Helpers.swift b/TablePro/Views/Connection/ConnectionFormView+Helpers.swift index ae0446c7f..96ff405e3 100644 --- a/TablePro/Views/Connection/ConnectionFormView+Helpers.swift +++ b/TablePro/Views/Connection/ConnectionFormView+Helpers.swift @@ -119,6 +119,7 @@ extension ConnectionFormView { selectedGroupId = existing.groupId safeModeLevel = existing.safeModeLevel aiPolicy = existing.aiPolicy + externalAccess = existing.externalAccess localOnly = existing.localOnly // Load additional fields from connection @@ -235,6 +236,7 @@ extension ConnectionFormView { sshTunnelMode: sshTunnelMode, safeModeLevel: safeModeLevel, aiPolicy: aiPolicy, + externalAccess: externalAccess, redisDatabase: additionalFieldValues["redisDatabase"].map { Int($0) ?? 0 }, startupCommands: startupCommands.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? nil : startupCommands, diff --git a/TablePro/Views/Connection/ConnectionFormView.swift b/TablePro/Views/Connection/ConnectionFormView.swift index 408999e79..a3d6140e3 100644 --- a/TablePro/Views/Connection/ConnectionFormView.swift +++ b/TablePro/Views/Connection/ConnectionFormView.swift @@ -102,6 +102,9 @@ struct ConnectionFormView: View { // AI policy @State var aiPolicy: AIConnectionPolicy? + // External access (Raycast / Cursor / Claude Desktop) + @State var externalAccess: ExternalAccessLevel = .readOnly + // Plugin-driven additional connection fields @State var additionalFieldValues: [String: String] = [:] @@ -240,6 +243,7 @@ struct ConnectionFormView: View { startupCommands: $startupCommands, preConnectScript: $preConnectScript, aiPolicy: $aiPolicy, + externalAccess: $externalAccess, localOnly: $localOnly, databaseType: type, additionalConnectionFields: additionalConnectionFields From a6246bfef922bc2730e43bd2ead0267e6891ec8f Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 00:59:17 +0700 Subject: [PATCH 03/83] docs(integrations): external API documentation and CHANGELOG --- CHANGELOG.md | 13 + docs/docs.json | 14 + docs/external-api/cursor-claude.mdx | 109 ++++++++ docs/external-api/index.mdx | 73 +++++ docs/external-api/mcp-resources.mdx | 121 ++++++++ docs/external-api/mcp-tools.mdx | 412 ++++++++++++++++++++++++++++ docs/external-api/pairing.mdx | 164 +++++++++++ docs/external-api/raycast.mdx | 97 +++++++ docs/external-api/tokens.mdx | 137 +++++++++ docs/external-api/url-scheme.mdx | 154 +++++++++++ docs/external-api/versioning.mdx | 66 +++++ 11 files changed, 1360 insertions(+) create mode 100644 docs/external-api/cursor-claude.mdx create mode 100644 docs/external-api/index.mdx create mode 100644 docs/external-api/mcp-resources.mdx create mode 100644 docs/external-api/mcp-tools.mdx create mode 100644 docs/external-api/pairing.mdx create mode 100644 docs/external-api/raycast.mdx create mode 100644 docs/external-api/tokens.mdx create mode 100644 docs/external-api/url-scheme.mdx create mode 100644 docs/external-api/versioning.mdx diff --git a/CHANGELOG.md b/CHANGELOG.md index dd074f5f3..67dc11732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- External API for Raycast, Cursor, Claude Desktop, and other MCP clients: URL scheme, stdio MCP transport, pairing flow, activity log +- UUID-keyed deep links: `tablepro://connect/`, `.../table/`, `.../query?sql=...`, `tablepro://integrations/pair?...`, `tablepro://integrations/start-mcp` +- stdio MCP transport via bundled `tablepro-mcp` CLI at `Contents/MacOS/tablepro-mcp`. Reads handshake file, no token needed +- Per-connection `External Access` setting (`blocked`, `readOnly`, `readWrite`). Defaults to `readOnly`. Bounds token reach via `MIN(token.scope, connection.externalAccess)` +- Pairing flow with PKCE code exchange. One-click token issuance for Raycast and other extensions +- Activity log at `~/Library/Application Support/com.TablePro/mcp-audit.db`. Viewable in Settings > Integrations > Activity Log. 90-day retention +- New MCP tools: `list_recent_tabs`, `search_query_history`, `open_connection_window`, `open_table_tab`, `focus_query_tab` - PostgreSQL ICU collation provider in Create Database (PG 15+). Provider picker is added when the server reports PG 15 or newer. ICU locale list comes from `pg_collation`. SQL emission is version-aware: PG 16+ uses unified `LOCALE`, PG 15 uses `ICU_LOCALE` with `LC_COLLATE 'C' LC_CTYPE 'C'`. - Connection URL parsing: SSH `user:password@host` split, `safeModeLevel` from TablePlus URLs, case-insensitive query params - Connection URL export: SSH password, Redis database index, MongoDB auth params (`authSource`, `authMechanism`, `replicaSet`), and multi-host @@ -25,6 +32,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- MCP server lazy-starts on first external request. Manual enable in Settings is no longer required +- Settings tab renamed from "MCP" to "Integrations" with new sections for connected clients, activity log, and pairing - Create Database dialog is now driver-driven. Each driver discovers its own valid options (PostgreSQL queries `pg_collation` and `pg_database`, MySQL/MariaDB query `information_schema.character_sets`/`collations`). The hardcoded macOS-flavored locale list is gone. Engines that don't support creation hide the Create button instead of failing on click. - Introduced TableRows, Row, and Delta value types in TablePro/Models/Query/ as the foundation for the data grid row model rewrite. No callers migrated yet (Phase C.1 of the DataGrid refactor). - DataGrid columns and cells refactored to use a persistent column pool and typed cell view hierarchy. CPU usage on table switch reduced significantly through proper NSTableView reuse pool retention. @@ -64,6 +73,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Data grid keeps sortedIDs and cachedRowCount paired by calling updateCache() immediately after the SwiftUI bridge writes new sortedIDs to the coordinator, removing a window where the cached count and the sort permutation could disagree - Display formats memoized per tab on MainContentCoordinator keyed by schema version, smart-detection setting, and format-overrides version, so ValueDisplayDetector.detect runs once per result schema instead of on every SwiftUI body evaluation +### Removed (BREAKING) + +- `tablepro://connect//...` deep links. Replace with UUID-keyed paths from "Copy Connection Deep Link" in the sidebar context menu. User-saved bookmarks must be regenerated + ### Fixed - Crash on macOS 26 when opening SQL Preview (NSColor.cgColor calls deprecated colorSpaceName) diff --git a/docs/docs.json b/docs/docs.json index 2b09be7a1..9a45b2af4 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -155,6 +155,20 @@ "customization/appearance", "customization/editor-settings" ] + }, + { + "group": "External API", + "pages": [ + "external-api/index", + "external-api/url-scheme", + "external-api/mcp-tools", + "external-api/mcp-resources", + "external-api/pairing", + "external-api/tokens", + "external-api/raycast", + "external-api/cursor-claude", + "external-api/versioning" + ] } ] }, diff --git a/docs/external-api/cursor-claude.mdx b/docs/external-api/cursor-claude.mdx new file mode 100644 index 000000000..d99a957e3 --- /dev/null +++ b/docs/external-api/cursor-claude.mdx @@ -0,0 +1,109 @@ +--- +title: Cursor and Claude Desktop +description: Wire stdio MCP into Cursor or Claude Desktop using the bundled tablepro-mcp CLI +--- + +# Cursor and Claude Desktop + +TablePro ships a stdio MCP bridge at `/Applications/TablePro.app/Contents/MacOS/tablepro-mcp`. Any MCP-aware client that supports the stdio transport can use it with no extension and no token. + +The bridge: + +1. Reads `~/Library/Application Support/com.TablePro/mcp-handshake.json` for the local port and bridge token. +2. If the file is missing, fires `tablepro://integrations/start-mcp` to lazy-start the server, then waits up to 10 seconds for the handshake. +3. Streams JSON-RPC over stdio and forwards each message to localhost HTTP with a bridge-specific bearer. + +Because the bridge reuses the in-app handshake, you do not need to mint a token for stdio. The TablePro app must be running. You can keep it minimized. + +## Cursor + +Edit `~/.cursor/mcp.json`: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +Restart Cursor. The TablePro tools appear under `@mcp` and are callable from chat. + +## Claude Desktop + +Edit `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +Restart Claude Desktop. TablePro tools show up in the tool picker. + +## Claude Code + +Use the `claude mcp add` CLI: + +```bash +claude mcp add tablepro -- /Applications/TablePro.app/Contents/MacOS/tablepro-mcp +``` + +This writes the same stdio config under the hood. + +## One-click setup + +TablePro can write these config files for you. Open **Settings > Integrations > Setup**: + +- **Setup for Cursor** writes `~/.cursor/mcp.json`. +- **Setup for Claude Desktop** writes `claude_desktop_config.json`. +- **Setup for Claude Code** runs the equivalent `claude mcp add` for the current user. + +If a config already exists, TablePro merges the `tablepro` entry into the existing `mcpServers` map. + +## HTTP instead of stdio + +If you prefer HTTP, mint a token in **Settings > Integrations > Tokens** and configure: + +```json +{ + "mcpServers": { + "tablepro": { + "url": "http://127.0.0.1:23508/mcp", + "headers": { + "Authorization": "Bearer tp_your_token_here" + } + } + } +} +``` + +Replace `23508` with the port shown in **Settings > Integrations > Server**. HTTP is the right choice when: + +- The client and TablePro run on different machines (with TLS, see [MCP Server](/features/mcp#remote-access)). +- You want a token with a tighter scope than the bridge token. +- The client does not support stdio. + +The handshake-based stdio bridge is the better default on the same machine. + +## What the AI sees + +AI clients see the full [tool catalog](/external-api/mcp-tools). For an unfamiliar schema, the AI is expected to call `describe_table` before generating SQL. For mutating SQL, the AI must request user confirmation through the host's tool-confirmation mechanism. Cursor surfaces this as a "Run tool?" prompt. Claude Desktop and Claude Code use their own confirmation UI. + +The connection's `externalAccess` setting and the token scope still apply on top. A read-only connection rejects writes regardless of what the AI tries. + +## Troubleshooting + +**`tablepro-mcp` exits immediately.** TablePro is not running or the build is older than 0.37. Open TablePro and re-launch the client. + +**Bridge says "handshake timeout".** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > Integrations > Server** and click **Start Server**, then re-launch the client. + +**Tool calls return `403`.** The connection's `externalAccess` is `blocked` or `readOnly`. Open the connection editor in TablePro and adjust under **External Access**. + +**Tool calls return `401`.** The bridge token is stale (TablePro was reinstalled or the Application Support data was wiped). Quit and reopen TablePro to regenerate the handshake. diff --git a/docs/external-api/index.mdx b/docs/external-api/index.mdx new file mode 100644 index 000000000..8ba2e9f4f --- /dev/null +++ b/docs/external-api/index.mdx @@ -0,0 +1,73 @@ +--- +title: External API +description: URL scheme, MCP server, and pairing flow for Raycast, Cursor, Claude Desktop, and other external clients +--- + +# External API + +The TablePro External API is the public contract that lets other apps drive TablePro. Raycast, Cursor, Claude Desktop, and custom scripts all use the same surface. This page is the entry point. Pick the subpage that matches what you want to do. + +## Three pillars + +The External API has three independent layers. Most clients use a mix of all three. + + + + `tablepro://` deep links open connections, tables, and queries in the GUI. + + + JSON-RPC tools and resources for AI clients. HTTP and stdio transports. + + + One-click flow to issue a scoped token to an extension. + + + +## When to use which + +| Goal | Use | +|------|-----| +| Open a connection from a script or other app | URL scheme | +| Run a query and read rows back | MCP `execute_query` | +| Browse schema for an AI model | MCP `list_tables`, `describe_table` | +| Issue a token to a Raycast or Cursor extension | Pairing | +| Navigate to a tab the user already has open | MCP `list_recent_tabs` + `focus_query_tab` | + +URL scheme drives the GUI. MCP exchanges data. Pairing bootstraps trust. + +## Security model + +The External API is gated by three independent layers. A request must clear all three. + +1. **Per-connection external access.** Each connection has an `externalAccess` setting: `blocked`, `readOnly` (default), or `readWrite`. Set per connection in the connection editor. Tokens cannot exceed this level. +2. **Token scope.** Tokens are issued with `readOnly`, `readWrite`, or `fullAccess` scope and an optional per-connection allowlist. See [Tokens](/external-api/tokens). +3. **AI policy and Safe Mode.** The connection's AI policy (`alwaysAllow` / `askEachTime` / `never`) and Safe Mode rules apply on top. Destructive operations require an explicit confirmation phrase. + +The effective permission for any request is `MIN(token.scope, connection.externalAccess)`. A token with `fullAccess` against a connection with `readOnly` cannot mutate. + +Every request is recorded in the activity log. Open **Settings > Integrations > Activity Log** to inspect. + +## Quick start + +- Install the [Raycast extension](/external-api/raycast) and run `Pair with TablePro`. +- Or wire stdio MCP into [Cursor or Claude Desktop](/external-api/cursor-claude) without an extension. +- Or open a deep link from your shell: + +```bash +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1" +``` + +## Versioning + +The External API follows TablePro's semver. Paths and tools are additive within a major version. See [Versioning](/external-api/versioning) for the deprecation policy. + +## Subpages + +- [URL Scheme](/external-api/url-scheme): every `tablepro://` action and parameter. +- [MCP Tools](/external-api/mcp-tools): JSON-RPC tool catalog with input and output schemas. +- [MCP Resources](/external-api/mcp-resources): resources you can read. +- [Pairing](/external-api/pairing): sequence diagram and PKCE flow. +- [Tokens](/external-api/tokens): scope model, allowlists, revocation. +- [Raycast](/external-api/raycast): extension install and command list. +- [Cursor and Claude Desktop](/external-api/cursor-claude): stdio MCP setup. +- [Versioning](/external-api/versioning): stability policy. diff --git a/docs/external-api/mcp-resources.mdx b/docs/external-api/mcp-resources.mdx new file mode 100644 index 000000000..f7aa93b97 --- /dev/null +++ b/docs/external-api/mcp-resources.mdx @@ -0,0 +1,121 @@ +--- +title: MCP Resources +description: Read-only resources exposed by the MCP server +--- + +# MCP Resources + +Resources are read-only views of TablePro state. AI clients use them to discover what is available before calling tools. Every resource is scope-gated the same way as tools and respects the per-connection allowlist. + +URIs use the `tablepro://` scheme inside the MCP transport. Do not confuse them with shell-level [URL scheme deep links](/external-api/url-scheme). + +## `tablepro://connections` + +All saved connections with metadata. + +**Returns**: + +```json +{ + "connections": [ + { + "id": "9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1", + "name": "Production", + "type": "PostgreSQL", + "host": "db.example.com", + "port": 5432, + "database": "app", + "isConnected": false, + "externalAccess": "readOnly", + "color": "blue", + "tagName": null, + "groupName": "Servers" + } + ] +} +``` + +Connections with `externalAccess: blocked` are omitted. Connections outside the token's allowlist are omitted. + +**Scope**: `readOnly`. + +## `tablepro://connections/{id}/schema` + +Schema for a connection. Returns all databases, schemas, and tables visible to the user. + +**Path parameter**: `id` is the connection UUID. + +**Returns**: + +```json +{ + "connectionId": "9f1f...", + "databases": [ + { + "name": "app", + "schemas": [ + { + "name": "public", + "tables": [ + { + "name": "users", + "type": "table", + "columns": [ + { "name": "id", "type": "uuid", "nullable": false, "isPrimaryKey": true }, + { "name": "email", "type": "text", "nullable": false } + ] + } + ] + } + ] + } + ] +} +``` + +Capped at 100 tables per schema. For larger schemas, call `list_tables` with paging. + +**Scope**: `readOnly`. + +## `tablepro://connections/{id}/history` + +Recent query history for a connection. + +**Path parameter**: `id` is the connection UUID. + +**Query parameters**: + +| Parameter | Description | +|-----------|-------------| +| `limit` | 1-500. Default 50. | +| `search` | Full-text query string. | +| `date_filter` | `today`, `thisWeek`, or `thisMonth`. | + +**Returns**: + +```json +{ + "connectionId": "9f1f...", + "entries": [ + { + "id": "...", + "sql": "SELECT * FROM users WHERE active = true", + "executedAt": "2026-04-26T10:14:22Z", + "rowCount": 142, + "executionTimeMs": 18, + "source": "editor" + } + ] +} +``` + +`source` is `editor`, `mcp`, or `terminal`. + +**Scope**: `readOnly`. + +## Errors + +| Code | Meaning | +|------|---------| +| `403` | Token allowlist rejects the connection, or `externalAccess` is `blocked`. | +| `404` | Connection not found. | diff --git a/docs/external-api/mcp-tools.mdx b/docs/external-api/mcp-tools.mdx new file mode 100644 index 000000000..eca3afb7a --- /dev/null +++ b/docs/external-api/mcp-tools.mdx @@ -0,0 +1,412 @@ +--- +title: MCP Tools +description: JSON-RPC tool catalog with input schemas, output schemas, scope requirements, and examples +--- + +# MCP Tools + +The MCP server exposes tools and resources over JSON-RPC. The tools are grouped by category below. Every tool is scope-gated: a request must come with a token whose scope and connection allowlist permit the call. + +## Transports + +The same tool catalog is available over two transports: + +- **HTTP**: `http://127.0.0.1:/mcp` (port from the handshake file). Bearer token in `Authorization` header. +- **stdio**: bundled `tablepro-mcp` CLI bridges stdio JSON-RPC to localhost HTTP. No token needed because the bridge reuses the in-app handshake. + +See [Cursor and Claude Desktop](/external-api/cursor-claude) for stdio config snippets. + +## Scope and access matrix + +Every tool requires one of these scopes. The scope is the token's; the connection's `externalAccess` setting can downgrade it further. + +| Scope | Read schema | Run SELECT | Run INSERT/UPDATE/DELETE | Confirm DROP/TRUNCATE | +|-------|:-----------:|:----------:|:------------------------:|:--------------------:| +| `readOnly` | yes | yes | no | no | +| `readWrite` | yes | yes | yes | no | +| `fullAccess` | yes | yes | yes | yes (with phrase) | + +If `connection.externalAccess` is `blocked`, every tool that targets that connection returns `403 forbidden`. If `readOnly`, write tools return `403` even with a `readWrite` token. + +## Connection tools + +### `list_connections` + +List all saved connections. + +**Input**: none. + +**Output**: + +```json +{ + "connections": [ + { + "id": "9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1", + "name": "Production", + "type": "PostgreSQL", + "host": "db.example.com", + "port": 5432, + "database": "app", + "isConnected": false, + "externalAccess": "readOnly" + } + ] +} +``` + +**Scope**: `readOnly`. Connections with `externalAccess: blocked` are omitted from the list. + +### `connect` + +Open a database connection. + +**Input**: + +```json +{ "connection_id": "9f1f0c3e-..." } +``` + +**Output**: + +```json +{ "connected": true, "version": "PostgreSQL 16.2" } +``` + +**Scope**: `readOnly`. + +### `disconnect` + +Close a connection. + +**Input**: `{ "connection_id": "..." }` + +**Output**: `{ "disconnected": true }` + +**Scope**: `readOnly`. + +### `get_connection_status` + +Return version, uptime, and active database for a connection. + +**Input**: `{ "connection_id": "..." }` + +**Output**: + +```json +{ + "isConnected": true, + "version": "PostgreSQL 16.2", + "currentDatabase": "app", + "currentSchema": "public" +} +``` + +**Scope**: `readOnly`. + +## Schema tools + +### `list_databases` + +**Input**: `{ "connection_id": "..." }` + +**Output**: `{ "databases": ["app", "analytics"] }` + +**Scope**: `readOnly`. + +### `list_schemas` + +**Input**: `{ "connection_id": "...", "database": "app" }` (database optional) + +**Output**: `{ "schemas": ["public", "reporting"] }` + +**Scope**: `readOnly`. + +### `list_tables` + +**Input**: + +```json +{ + "connection_id": "...", + "database": "app", + "schema": "public", + "include_row_counts": false +} +``` + +**Output**: + +```json +{ + "tables": [ + { "name": "users", "type": "table", "rowCount": null }, + { "name": "orders_view", "type": "view" } + ] +} +``` + +**Scope**: `readOnly`. + +### `describe_table` + +Columns, indexes, foreign keys, primary key, DDL. + +**Input**: + +```json +{ + "connection_id": "...", + "table_name": "users", + "database": "app", + "schema": "public" +} +``` + +**Output**: + +```json +{ + "columns": [ + { "name": "id", "type": "uuid", "nullable": false, "isPrimaryKey": true }, + { "name": "email", "type": "text", "nullable": false } + ], + "indexes": [{ "name": "users_email_idx", "columns": ["email"], "unique": true }], + "foreignKeys": [], + "ddl": "CREATE TABLE users (...)" +} +``` + +**Scope**: `readOnly`. + +### `get_table_ddl` + +Just the `CREATE TABLE` statement. + +**Input**: same as `describe_table`. + +**Output**: `{ "ddl": "CREATE TABLE ..." }` + +**Scope**: `readOnly`. + +## Query tools + +### `execute_query` + +Run a SQL query. + +**Input**: + +```json +{ + "connection_id": "...", + "query": "SELECT id, email FROM users WHERE active = true LIMIT 100", + "max_rows": 500, + "timeout_seconds": 30, + "database": "app", + "schema": "public" +} +``` + +`max_rows` defaults to 500, max 10,000. `timeout_seconds` defaults to 30, max 300. Single-statement queries only. Query size cap is 100 KB. + +**Output**: + +```json +{ + "columns": [{ "name": "id", "type": "uuid" }, { "name": "email", "type": "text" }], + "rows": [["9f1f...", "alice@example.com"]], + "rowCount": 1, + "executionTimeMs": 14, + "truncated": false +} +``` + +**Scope**: + +- `readOnly` for SELECT, SHOW, EXPLAIN. +- `readWrite` for INSERT, UPDATE, DELETE. +- DROP, TRUNCATE, ALTER...DROP are rejected. Use `confirm_destructive_operation`. + +Safe Mode rules apply on top. A connection in Safe Mode `readOnly` returns `403` for any write SQL. + +### `confirm_destructive_operation` + +Run a DROP, TRUNCATE, or ALTER...DROP after a typed confirmation. + +**Input**: + +```json +{ + "connection_id": "...", + "query": "DROP TABLE legacy_events", + "confirmation_phrase": "I understand this is irreversible" +} +``` + +The confirmation phrase is fixed: `I understand this is irreversible`. Anything else returns `400 invalid confirmation`. + +**Output**: same shape as `execute_query`. + +**Scope**: `fullAccess`. + +### `export_data` + +Export query or table data as CSV, JSON, or SQL. + +**Input**: + +```json +{ + "connection_id": "...", + "format": "csv", + "tables": ["users", "orders"], + "query": null, + "max_rows": 50000 +} +``` + +`format` is one of `csv`, `json`, `sql`. `max_rows` defaults to 50,000, max 100,000. Provide either `tables` or `query`, not both. + +**Output**: `{ "data": "", "byteCount": 12345 }` for small payloads, or `{ "filePath": "/tmp/...", "byteCount": ... }` for larger ones. + +**Scope**: `readOnly`. + +### `switch_database` / `switch_schema` + +**Input**: `{ "connection_id": "...", "database": "analytics" }` or `{ "connection_id": "...", "schema": "reporting" }` + +**Output**: `{ "currentDatabase": "analytics" }` or `{ "currentSchema": "reporting" }` + +**Scope**: `readOnly`. + +## Navigation tools + +These mutate UI state in the running TablePro app: opening tabs, focusing windows. They require `readWrite` scope because the user sees the result. + +### `open_connection_window` + +Open a connection in TablePro and bring its window to front. + +**Input**: `{ "connection_id": "..." }` + +**Output**: `{ "windowId": "..." }` + +**Scope**: `readWrite`. + +### `open_table_tab` + +Open a table tab. + +**Input**: + +```json +{ + "connection_id": "...", + "table_name": "users", + "database": "app", + "schema": "public" +} +``` + +**Output**: `{ "tabId": "..." }` + +**Scope**: `readWrite`. + +### `focus_query_tab` + +Bring an existing tab to front. + +**Input**: `{ "tab_id": "..." }` + +**Output**: `{ "focused": true }` + +**Scope**: `readWrite`. + +### `list_recent_tabs` + +Read the cross-window tab registry. + +**Input**: none. + +**Output**: + +```json +{ + "tabs": [ + { + "id": "...", + "connectionId": "9f1f...", + "connectionName": "Production", + "tabType": "query", + "displayTitle": "users by signup date", + "tableName": null + } + ] +} +``` + +**Scope**: `readOnly`. + +## History tools + +### `search_query_history` + +Full-text search over the query history database. + +**Input**: + +```json +{ + "query": "users active", + "connection_id": "9f1f...", + "limit": 50, + "date_filter": "thisWeek" +} +``` + +`connection_id` and `date_filter` are optional. `date_filter` is one of `today`, `thisWeek`, `thisMonth`. `limit` is 1-500, default 50. + +**Output**: + +```json +{ + "results": [ + { + "id": "...", + "connectionId": "9f1f...", + "sql": "SELECT * FROM users WHERE active = true", + "executedAt": "2026-04-26T10:14:22Z", + "rowCount": 142, + "executionTimeMs": 18 + } + ] +} +``` + +**Scope**: `readOnly`. + +## Errors + +All tools return JSON-RPC errors with these codes: + +| Code | Meaning | +|------|---------| +| `400` | Invalid input | +| `401` | Missing or invalid bearer token | +| `403` | Token scope or `externalAccess` rejects the request | +| `404` | Connection, table, or tab not found | +| `408` | Query timeout | +| `429` | Rate limit | +| `500` | Server error | + +Error responses include a `message` field. Example: + +```json +{ + "error": { + "code": 403, + "message": "Connection is read-only for external clients" + } +} +``` diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx new file mode 100644 index 000000000..d8d3d9a67 --- /dev/null +++ b/docs/external-api/pairing.mdx @@ -0,0 +1,164 @@ +--- +title: Pairing +description: One-click flow that issues a scoped MCP token to an extension using a PKCE-flavored code exchange +--- + +# Pairing + +Pairing is how an extension gets a TablePro token without the user copying and pasting one. The user runs a `Pair with TablePro` command in the extension, picks scopes and connections inside TablePro, and the extension receives a token over a Raycast deep link callback. + +The flow is PKCE-flavored: the extension generates a verifier, hashes it into a challenge, and the token is only released after the verifier is presented. This prevents another app on the same machine from intercepting the redirect and stealing the token. + +## Sequence + +```mermaid +sequenceDiagram + participant E as Extension + participant T as TablePro app + participant U as User + participant M as MCP server (HTTP) + + E->>E: verifier = randomBytes(32).base64url + E->>E: challenge = base64url(SHA-256(verifier)) + E->>T: open tablepro://integrations/pair
?client=...&challenge=...&redirect=...&scopes=... + T->>M: lazyStart() + T->>U: Approval sheet (client, scopes, connections, expiry) + U->>T: Approve + T->>T: tokenStore.generate(...) -> { plaintext, prefix } + T->>T: store pending exchange { code, plaintext, challenge }
expires in 5 min + T->>E: open redirect URL with ?code= + E->>M: POST /v1/integrations/exchange
{ code, code_verifier: verifier } + M->>M: SHA-256(verifier) == challenge ? + M->>E: 200 { token: "tp_..." } + E->>E: store token in Keychain (Raycast password preference) +``` + +## Step by step + +### 1. Extension generates a verifier and challenge + +```ts +import { randomBytes, createHash } from "node:crypto"; + +function base64url(buffer: Buffer): string { + return buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +const verifier = base64url(randomBytes(32)); +const challenge = base64url(createHash("sha256").update(verifier).digest()); +``` + +The verifier is 32 random bytes, base64url-encoded. Keep it in memory until the exchange step. Do not log it. + +### 2. Extension opens the pair deep link + +```ts +import { open } from "@raycast/api"; + +const params = new URLSearchParams({ + client: `Raycast on ${require("os").hostname()}`, + challenge, + redirect: "raycast://extensions/datlechin/tablepro/pair-callback", + scopes: "readOnly,readWrite", +}); +await open(`tablepro://integrations/pair?${params}`); +``` + +See the [URL scheme reference](/external-api/url-scheme#start-pairing) for parameters. + +### 3. TablePro shows the approval sheet + +The user sees: + +- The client name from the request. +- A scopes radio (defaults to the requested scope, downgradeable). +- A connections multi-select (defaults to all unless `connection-ids` was provided). +- An expiry picker (defaults to never). + +The user can change any of these before approving. The query parameters are a request, not a grant. + +### 4. TablePro generates a token and a one-time code + +On approval, TablePro calls `MCPTokenStore.generate(...)` to mint a token, then stores a pending exchange: + +```swift +struct PendingExchange { + let plaintextToken: String + let challenge: String + let expiresAt: Date // now + 5 min +} +``` + +The plaintext token is held in memory only. The token store keeps the hashed form on disk (SHA-256 + salt). + +### 5. TablePro redirects with the code + +TablePro appends `?code=` to the `redirect` URL and opens it with `NSWorkspace.shared.open(...)`. Raycast routes the callback to the extension's `pair-callback` handler. + +### 6. Extension exchanges the code + +The extension reads the MCP port from `~/Library/Application Support/com.TablePro/mcp-handshake.json`, then: + +```ts +const port = await readHandshakePort(); +const res = await fetch(`http://127.0.0.1:${port}/v1/integrations/exchange`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ code, code_verifier: verifier }), +}); +const { token } = await res.json(); +``` + +The exchange endpoint requires no bearer auth. The single-use code is the auth. + +### 7. TablePro validates and returns the token + +Server-side check: + +``` +SHA-256(code_verifier) == challenge +``` + +If equal, return the plaintext token and delete the pending exchange. If the code has expired (5 minutes) or the verifier does not match, return `403`. + +### 8. Extension stores the token + +```ts +import { LocalStorage } from "@raycast/api"; +await LocalStorage.setItem("apiToken", token); +``` + +For preferences-backed storage, use `updateCommandMetadata` or write to the password preference. Tokens stored in Raycast preferences live in the macOS Keychain. + +## Security properties + +| Property | How | +|----------|-----| +| Token is never in the URL | The token is fetched over localhost HTTP, not embedded in a deep link. | +| Redirect interception is harmless | A malicious app that intercepts the `code` cannot exchange it without the verifier. | +| Code is single-use | Successful exchange or 5-minute expiry deletes the pending exchange. | +| Plaintext token is not persisted by TablePro | Only the SHA-256 hash plus salt is saved to `mcp-tokens.json`. | +| User sees and approves scopes | The sheet shows what was requested, what is granted, and which connections. | +| User can revoke any time | **Settings > Integrations > Tokens > Revoke**. | + +## Errors + +| Code | Meaning | +|------|---------| +| `403 challenge mismatch` | The verifier does not hash to the stored challenge. | +| `404 pairing code` | The code does not exist or has already been exchanged. | +| `410 expired` | The pending exchange is older than 5 minutes. | + +A failed exchange is recorded in the activity log under the `auth` category with outcome `denied`. + +## Implementing pairing in another extension + +The flow is not Raycast-specific. Cursor, Claude Desktop, or any custom client can use it. Requirements: + +1. Generate a verifier and challenge. +2. Open `tablepro://integrations/pair?...` with a deep link callback URL the OS can route back to the extension. +3. Read the MCP port from the handshake file. +4. POST `{ code, code_verifier }` to `/v1/integrations/exchange`. +5. Store the returned token in OS Keychain. + +If the extension cannot register a custom URL scheme, open a localhost HTTP server on a chosen port and pass `http://127.0.0.1:/callback` as the `redirect`. diff --git a/docs/external-api/raycast.mdx b/docs/external-api/raycast.mdx new file mode 100644 index 000000000..fba74e5ab --- /dev/null +++ b/docs/external-api/raycast.mdx @@ -0,0 +1,97 @@ +--- +title: Raycast Extension +description: Install the TablePro Raycast extension, pair it, and use the command and AI tool catalog +--- + +# Raycast Extension + +The TablePro Raycast extension is the reference consumer of the External API. It uses the URL scheme to open the GUI and the MCP server to read schema, run queries, and search history. AI tools let Raycast Pro and Quick AI call TablePro tools directly with `@tablepro` mentions. + +## Install + +1. Open Raycast. +2. Search for **Store**, then search **TablePro**. +3. Click **Install**. + +The extension is open-source under MIT, hosted at [github.com/raycast/extensions/extensions/tablepro](https://github.com/raycast/extensions). Source contributions are welcome via the Raycast extensions monorepo. + +## Pair + +After install, run **Pair with TablePro**. A form appears: + +- **Client name** defaults to `Raycast on `. +- **Scope**: `readOnly`, `readWrite`, or `fullAccess`. Default `readOnly`. +- **Allowed connections**: defaults to all. Pick a subset to restrict. +- **Expiry**: defaults to never. Pick a date for rotating tokens. + +On submit, TablePro opens with an approval sheet. Adjust and approve. The extension stores the returned token in the macOS Keychain via Raycast's password preference. + +The flow is detailed in [Pairing](/external-api/pairing). + +## Commands + +| Command | Mode | Description | +|---------|------|-------------| +| Search Connections | view | Fuzzy search over saved connections, open the selected one. | +| Open Connection | no-view | Argument-driven open, e.g. `Open Connection prod`. | +| TablePro Menu Bar | menu-bar | Menu-bar item showing connection status, refresh interval 10 minutes. | +| Search Schema | view | Browse databases, schemas, and tables for a connection. | +| Search Tables | view | Quick table picker, opens the table in TablePro. | +| Recent Tabs | view | Cross-window tab list, focus or open. | +| Run Query | view | Type SQL, run via MCP, see row count and first rows in a Detail view. | +| Search Query History | view | Full-text search over query history. | +| Pair with TablePro | view | Pairing form. Re-run any time to issue a new token. | + +Every command falls back to a clear empty state when TablePro is not running or paired. See [Troubleshooting](#troubleshooting). + +## AI tools + +If you have Raycast Pro, the extension exposes its tools to Quick AI and Raycast Chat. Mention `@tablepro` in a chat: + +> @tablepro show me users that signed up this week from production + +Raycast picks the right tools, calls the MCP server, and returns the result. The catalog: + +| Tool | Description | +|------|-------------| +| List Connections | Calls `list_connections`. | +| List Databases | Calls `list_databases`. | +| List Schemas | Calls `list_schemas`. | +| List Tables | Calls `list_tables`. | +| Describe Table | Calls `describe_table`. | +| Get Table DDL | Calls `get_table_ddl`. | +| Run Query | Calls `execute_query`. Mutating SQL prompts a `Tool.Confirmation`. | +| Explain Query | Runs `EXPLAIN` (or the dialect equivalent). | +| Open Connection in TablePro | Calls `open_connection_window`. | +| Search Query History | Calls `search_query_history`. | + +The extension's AI instructions tell the model to always `describe-table` before generating queries against an unknown schema, and to use `Tool.Confirmation` for any INSERT, UPDATE, DELETE, DROP, ALTER, or TRUNCATE. + +## Preferences + +| Preference | Type | Description | +|------------|------|-------------| +| TablePro App | App picker | Path to TablePro. Default `/Applications/TablePro.app`. | +| API Token | Password | Bearer token. Filled by the pairing command, editable manually. | + +The token is stored in the Keychain via Raycast's password preference type. + +## Troubleshooting + +**TablePro not installed.** The extension shows an "Install TablePro" link to [tablepro.app](https://tablepro.app). + +**TablePro running but MCP not started.** The extension fires `tablepro://integrations/start-mcp` and retries. If it still fails, the message asks you to update TablePro to the latest version. + +**No token paired.** A "Pair with TablePro" call-to-action runs the `pair` command. + +**Token revoked (`401`).** The extension clears the stored token and shows the pair CTA. + +**Connection rejected (`403`).** The connection's `externalAccess` is `blocked` or the token's allowlist excludes it. Open **Settings > Integrations** in TablePro to inspect. + +**Read-only error (`403 Connection is read-only for external clients`).** The connection's `externalAccess` is `readOnly` and the SQL is a write. Either change the connection's external access in TablePro, or run the query in TablePro's editor. + +## Privacy + +The extension reads connection metadata from `~/Library/Application Support/com.TablePro/connections.json` to build the connection picker without an MCP roundtrip. Passwords are not in that file (they live in the Keychain). The extension never reads or transmits passwords. + +Query results returned by `Run Query` stay in Raycast's process. Raycast does not send them to a server. AI tool calls go through Raycast's AI provider per Raycast's [privacy policy](https://www.raycast.com/privacy). diff --git a/docs/external-api/tokens.mdx b/docs/external-api/tokens.mdx new file mode 100644 index 000000000..0460cdafb --- /dev/null +++ b/docs/external-api/tokens.mdx @@ -0,0 +1,137 @@ +--- +title: Tokens +description: Token model, scopes, per-connection allowlists, expiry, and revocation +--- + +# Tokens + +Every external request needs a bearer token. Tokens carry a scope, an optional connection allowlist, and an optional expiry. Tokens are stored hashed (SHA-256 + salt) at `~/Library/Application Support/com.TablePro/mcp-tokens.json` with `0600` permissions. The plaintext is shown once at creation and never again. + +## Token shape + +```swift +struct MCPAuthToken { + let id: UUID + var name: String + let prefix: String // First 8 chars of plaintext, e.g. "tp_a1b2c3" + let hashedToken: String // SHA-256 + salt of the plaintext + var permissions: TokenPermissions // readOnly, readWrite, fullAccess + var allowedConnectionIds: Set? // nil means all connections + var expiresAt: Date? // nil means never + var isActive: Bool + let createdAt: Date + var lastUsedAt: Date? +} +``` + +The `prefix` is shown in the token list so the user can identify a token without revealing the secret. + +## Scopes + +| Scope | Read schema | SELECT | INSERT/UPDATE/DELETE | DROP/TRUNCATE | UI mutation | +|-------|:-----------:|:------:|:--------------------:|:-------------:|:-----------:| +| `readOnly` | yes | yes | no | no | no | +| `readWrite` | yes | yes | yes | no | yes | +| `fullAccess` | yes | yes | yes | yes (with phrase) | yes | + +UI mutation covers `open_connection_window`, `open_table_tab`, `focus_query_tab`. These open windows and tabs in the running app. + +DROP and TRUNCATE always require an explicit confirmation phrase via `confirm_destructive_operation`, even with `fullAccess`. There is no token scope that bypasses the phrase. + +## Connection allowlist + +Each token can be limited to a subset of connections. + +- `allowedConnectionIds = nil` means all connections. +- `allowedConnectionIds = { uuid1, uuid2 }` means only those. + +A request that targets a connection outside the allowlist returns `403 forbidden` before any per-connection check runs. + +## External access combination + +The effective permission is `MIN(token.scope, connection.externalAccess)`. + +| Token scope | Connection access | Effective | +|-------------|------------------|-----------| +| `readOnly` | `readWrite` | `readOnly` | +| `readWrite` | `readOnly` | `readOnly` | +| `fullAccess` | `readOnly` | `readOnly` | +| `fullAccess` | `readWrite` | `readWrite` (no destructive) | +| `fullAccess` | `blocked` | denied | +| any | `blocked` | denied | + +A `fullAccess` token cannot mutate data on a `readOnly` connection. A token's reach is bounded by both itself and the connection. + +## Creation + +Tokens are created in three ways: + +1. **Pairing flow** (most common). See [Pairing](/external-api/pairing). +2. **Settings UI**. **Settings > Integrations > Tokens > New Token**. Pick name, scope, allowlist, expiry. The plaintext is shown once in a reveal sheet. +3. **AppleScript-style URL** is not supported. Tokens are not exposed as a URL scheme action. + +The plaintext format is `tp_`. The first 8 chars are the prefix. + +## Expiry + +Optional. If set, the token stops authenticating at the expiry time. Expired requests return `401 unauthorized` with `message: "Token expired"`. + +Recommended values: + +- `readWrite` and `fullAccess` for human-driven extensions: 90 days. +- `readOnly` for personal use: never. +- CI or automation: 30 days, rotated. + +## Revocation + +**Settings > Integrations > Tokens** lists all tokens with prefix, name, scope, allowlist, last-used time, and expiry. Each row has: + +- **Revoke**: marks the token inactive. Stays in the list with status `Revoked`. Cannot be reactivated. +- **Delete**: removes the row entirely. + +A revoked token returns `401 unauthorized` immediately. The MCP server invalidates any cached session for the token within one second. + +After revoking a token used by an extension, the extension shows an "unauthorized" state on the next call. The user runs the pairing command again to mint a new token. + +## Audit log + +Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > Integrations > Activity Log** shows: + +| Field | Example | +|-------|---------| +| Timestamp | 2026-04-26 10:14:22 | +| Token | Raycast on macbook-pro (`tp_a1b2c3`) | +| Category | `query`, `auth`, `access`, `admin` | +| Action | `execute_query`, `pair`, `revoke` | +| Connection | Production (or `-`) | +| Outcome | `success`, `denied`, `error` | + +Entries are kept for 90 days, auto-pruned on app launch. + +## Rate limits + +Per-IP, on failed auth: + +| Failures | Lockout | +|----------|---------| +| 2 | 1 second | +| 3 | 5 seconds | +| 4 | 30 seconds | +| 5+ | 5 minutes | + +A successful auth resets the counter. During lockout the server returns `429 Too Many Requests`. + +## What tokens cannot do + +| Capability | State | +|-----------|------| +| Read connection passwords | no | +| Read SSH keys | no | +| Read license data | no | +| Read app settings | no | +| Read local files outside `~/Library/Application Support/com.TablePro/` | no | +| Mutate Safe Mode rules | no | +| Mutate other tokens | no | +| Mutate connection records | no | + +The token surface is the MCP tool catalog and the URL scheme. Anything not on those lists is not reachable. diff --git a/docs/external-api/url-scheme.mdx b/docs/external-api/url-scheme.mdx new file mode 100644 index 000000000..57907a14c --- /dev/null +++ b/docs/external-api/url-scheme.mdx @@ -0,0 +1,154 @@ +--- +title: URL Scheme +description: Every tablepro:// deep link action with parameters and examples +--- + +# URL Scheme + +The `tablepro://` URL scheme drives the TablePro GUI from outside the app. Use it from the shell with `open`, from another app with `NSWorkspace.shared.open(url:)`, or from a Raycast extension with `open()` from `@raycast/api`. + +The scheme covers two kinds of actions: + +- **Navigate**: open a connection, table, or query tab. +- **Pair**: bootstrap an MCP token for an extension. + +Data exchange is not part of the URL scheme. For that, use [MCP](/external-api/mcp-tools). + +## Connection IDs are UUIDs + +Connection paths use the connection's UUID, not its display name. + +``` +tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1 +``` + +You can copy the URL for any connection from the sidebar context menu: right-click the connection, **Copy Connection Deep Link**. + + +Pre-0.37 builds accepted `tablepro://connect//...` paths. Those paths were removed in 0.37. Bookmarks built against old TablePro versions must be regenerated. Use **Copy Connection Deep Link** to get the new UUID-keyed URL. + + +## Open a connection + +``` +tablepro://connect/ +``` + +Opens the saved connection. If the connection is already open in a window, that window comes to front. If the UUID does not match a saved connection, an error alert appears. + +```bash +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1" +``` + +## Open a table + +``` +tablepro://connect//table/ +tablepro://connect//database//table/ +tablepro://connect//database//schema//table/ +``` + +The first form opens the table in the connection's current database and schema. The second selects a database first. The third (Postgres-style) selects both. + +Table and schema names with spaces or special characters must be percent-encoded. + +```bash +# Open a table in the current database +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1/table/users" + +# Open a table in a specific database +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1/database/analytics/table/events" + +# Postgres: select database and schema +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1/database/app/schema/reporting/table/daily_events" +``` + +## Run a query + +``` +tablepro://connect//query?sql= +tablepro://connect//query?sql=&token= +``` + +Opens a new query tab with the SQL pre-filled. Without a `token`, TablePro shows a confirmation dialog with the SQL before opening, so the user can verify the query is safe. + +If a valid `token` is provided and the token has `query.write` scope (i.e. `readWrite` or `fullAccess`), the confirmation is skipped. The token is matched against the active connection's `externalAccess` level. A read-only connection rejects any write SQL regardless of token scope. + +```bash +# With confirmation +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1/query?sql=SELECT%20*%20FROM%20users%20LIMIT%2010" + +# With token, no confirmation +open "tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1/query?sql=SELECT%20*%20FROM%20users%20LIMIT%2010&token=tp_abc123..." +``` + +| Parameter | Required | Description | +|-----------|----------|-------------| +| `sql` | yes | Percent-encoded SQL. | +| `token` | no | Bearer token. Skips the confirmation dialog when present and valid. | + +## Start pairing + +``` +tablepro://integrations/pair?client=&challenge=&redirect=&scopes=&connection-ids= +``` + +Starts a pairing flow. TablePro presents an approval sheet, the user picks scopes and connections, and TablePro returns a one-time code via the `redirect` URL. + +| Parameter | Required | Description | +|-----------|----------|-------------| +| `client` | yes | Display name shown in the approval sheet, e.g. `Raycast on macbook-pro`. | +| `challenge` | yes | Base64url-encoded SHA-256 hash of the verifier (PKCE). | +| `redirect` | yes | URL to receive the `code` query parameter on success. | +| `scopes` | no | Comma-separated requested scopes: `readOnly`, `readWrite`, `fullAccess`. Defaults to `readOnly`. | +| `connection-ids` | no | Comma-separated UUIDs to preselect in the allowlist. Defaults to all. | + +The user can change scopes and connections in the approval sheet. The query parameters are a request, not a grant. + +Example invocation from a Raycast extension: + +```ts +import { open } from "@raycast/api"; + +const params = new URLSearchParams({ + client: "Raycast on macbook-pro", + challenge: challengeB64Url, + redirect: "raycast://extensions/datlechin/tablepro/pair-callback", + scopes: "readOnly,readWrite", +}); +await open(`tablepro://integrations/pair?${params}`); +``` + +See [Pairing](/external-api/pairing) for the full sequence and the exchange step. + +## Lazy-start the MCP server + +``` +tablepro://integrations/start-mcp +``` + +Starts the MCP server if it is not already running, then returns. Used by the bundled `tablepro-mcp` CLI to bootstrap on cold launch. + +The user does not need to enable MCP in Settings beforehand. The first call starts the server on a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. + +```bash +open "tablepro://integrations/start-mcp" +``` + +## Import a connection + +``` +tablepro://import?name=&host=&port=

&type=&username=&database= +``` + +Creates a saved connection from query parameters and opens the connection editor for review. See [Deep Links](/features/deep-links#import-a-connection) for the full parameter list. This action is unchanged by the External API rework. + +## Errors + +Invalid UUIDs, missing connections, or malformed query parameters surface as error alerts. The error message names the failing field. Examples: + +- `Connection not found: 9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1` +- `Invalid connection ID format` +- `Missing required parameter: client` + +URL scheme errors are also written to the activity log under the `admin` category with outcome `error`. diff --git a/docs/external-api/versioning.mdx b/docs/external-api/versioning.mdx new file mode 100644 index 000000000..1d067e125 --- /dev/null +++ b/docs/external-api/versioning.mdx @@ -0,0 +1,66 @@ +--- +title: Versioning +description: Stability policy for the URL scheme, MCP tools, and resource catalog +--- + +# Versioning + +The External API follows TablePro's semver. The contract is the URL scheme, the MCP tool catalog, the resource list, and the pairing flow. + +## Stability rules + +Within a major version, the External API is **additive only**: + +- New URL scheme actions can be added. +- New MCP tools can be added. +- New tool input fields can be added if they are optional with a sensible default. +- New tool output fields can be added. +- New resources can be added. +- New error codes can be added. + +Within a major version, none of the following will happen: + +- A URL scheme path will not be removed or change meaning. +- A tool will not be removed or renamed. +- A required input field will not be added to an existing tool. +- An output field will not be removed or change type. +- A resource will not be removed. + +## Breaking changes + +Breaking changes ship only at major TablePro version bumps (e.g. 1.x to 2.x). The 0.x series is pre-1.0; we treat minor versions as the release boundary, but only break with explicit notice. + +When a breaking change ships: + +- The next previous version emits a deprecation warning in the activity log on every use of the affected surface. +- The release notes call it out under the `BREAKING` heading in CHANGELOG. +- The deprecated surface continues to work for at least one minor version after the warning is introduced. + +## Deprecation lifecycle + +1. **Announce.** A `Deprecated` note is added to the docs. CHANGELOG mentions the affected surface. +2. **Warn.** The next version logs a deprecation warning to the activity log when the surface is used. The warning names the replacement. +3. **Remove.** A later version removes the surface. CHANGELOG marks it `BREAKING`. + +The warn-to-remove gap is at least one minor version. + +## What is not under the contract + +The following are not part of the External API contract and can change at any time without notice: + +- Internal MCP message routing details, transport framing, and HTTP path layout under `/v1/internal/*`. +- The handshake file format at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. Use the bundled `tablepro-mcp` CLI rather than parsing it yourself. +- The tokens file format at `~/Library/Application Support/com.TablePro/mcp-tokens.json`. Tokens are managed via Settings, not the file. +- Audit log file format at `~/Library/Application Support/com.TablePro/mcp-audit.db`. Read via the activity log view. +- The connections file format at `~/Library/Application Support/com.TablePro/connections.json`. Treat as best-effort. Schema can shift between minor versions; integrations should fall back to MCP `list_connections`. + +## Past breaking changes + +| Version | Change | +|---------|--------| +| 0.37 | `tablepro://connect//...` deep links removed. Use UUID-keyed paths. Bookmarks must be regenerated. | +| 0.37 | The MCP server lazy-starts on first external request. Manual enable in Settings is no longer required. | + +## Reporting issues + +If you find a behavior that contradicts these rules, file an issue at [github.com/TableProApp/TablePro](https://github.com/TableProApp/TablePro/issues). Include the TablePro version, the URL or MCP call, expected and actual behavior, and a snippet of the activity log row if relevant. From eb44e891811d99a8f5cc3e0984b3672f4a3a83b7 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:04:32 +0700 Subject: [PATCH 04/83] feat(integrations): tablepro-mcp stdio CLI binary Renames the existing mcp-server target's product to tablepro-mcp and moves source from TablePro/MCPBridge to TablePro/CLI per plan. Adds auto-launch of TablePro via tablepro://integrations/start-mcp with a 10-second poll for the handshake file, plus stale-PID detection that relaunches the host. Bridges SSE responses by emitting each data: line as a separate JSON-RPC message on stdout. Adds an explicit TablePro -> mcp-server target dependency so the helper binary always builds before the app embed step. Sets PRODUCT_BUNDLE_IDENTIFIER=com.TablePro.tablepro-mcp. Verification: xcodebuild -scheme mcp-server -configuration Debug build succeeds; tablepro-mcp ends up at TablePro.app/Contents/MacOS/tablepro-mcp, executable, codesigned, hardened runtime on. swiftlint --strict clean on TablePro/CLI/. build-release.sh now fails fast if the embedded helper is missing from the release bundle. The internal Xcode target name stays "mcp-server" to keep the pbxproj diff minimal; only the product name, bundle id, and source path change. --- TablePro.xcodeproj/project.pbxproj | 37 +++-- .../{MCPBridge => CLI}/MCPBridgeProxy.swift | 147 +++++++++++++----- TablePro/{MCPBridge => CLI}/main.swift | 0 scripts/build-release.sh | 8 + 4 files changed, 139 insertions(+), 53 deletions(-) rename TablePro/{MCPBridge => CLI}/MCPBridgeProxy.swift (64%) rename TablePro/{MCPBridge => CLI}/main.swift (100%) diff --git a/TablePro.xcodeproj/project.pbxproj b/TablePro.xcodeproj/project.pbxproj index 8ac2acb00..a5749a98c 100644 --- a/TablePro.xcodeproj/project.pbxproj +++ b/TablePro.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 5A32BBFB2F9D5EAB00BAEB5F /* X509 in Frameworks */ = {isa = PBXBuildFile; productRef = 5A32BBFA2F9D5EAB00BAEB5F /* X509 */; }; - 5A32BC0B2F9D659100BAEB5F /* mcp-server in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5A32BC002F9D5F1300BAEB5F /* mcp-server */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 5A32BC0B2F9D659100BAEB5F /* tablepro-mcp in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5A32BC002F9D5F1300BAEB5F /* tablepro-mcp */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 5A3A69B82F976F38000AC5B2 /* GhosttyTerminal in Frameworks */ = {isa = PBXBuildFile; productRef = 5A3A69B72F976F38000AC5B2 /* GhosttyTerminal */; }; 5A3A69BA2F976F38000AC5B2 /* GhosttyTheme in Frameworks */ = {isa = PBXBuildFile; productRef = 5A3A69B92F976F38000AC5B2 /* GhosttyTheme */; }; 5A3BE6FC2F97DB0000611C1F /* TableProPluginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A860000100000000 /* TableProPluginKit.framework */; }; @@ -75,6 +75,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 5A32BC0C2F9D659200BAEB5F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5A1091BF2EF17EDC0055EA7C /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5A32BBFF2F9D5F1300BAEB5F; + remoteInfo = "tablepro-mcp"; + }; 5A860000B00000000 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5A1091BF2EF17EDC0055EA7C /* Project object */; @@ -219,7 +226,7 @@ dstPath = ""; dstSubfolderSpec = 6; files = ( - 5A32BC0B2F9D659100BAEB5F /* mcp-server in CopyFiles */, + 5A32BC0B2F9D659100BAEB5F /* tablepro-mcp in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -259,7 +266,7 @@ /* Begin PBXFileReference section */ 5A1091C72EF17EDC0055EA7C /* TablePro.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TablePro.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A32BC002F9D5F1300BAEB5F /* mcp-server */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "mcp-server"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A32BC002F9D5F1300BAEB5F /* tablepro-mcp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "tablepro-mcp"; sourceTree = BUILT_PRODUCTS_DIR; }; 5A3BE6F82F97DA8100611C1F /* LibSQLDriverPlugin.tableplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LibSQLDriverPlugin.tableplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 5A860000100000000 /* TableProPluginKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TableProPluginKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5A861000100000000 /* OracleDriver.tableplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OracleDriver.tableplugin; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -311,8 +318,8 @@ 5A32BC082F9D5FC900BAEB5F /* Exceptions for "TablePro" folder in "mcp-server" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - MCPBridge/main.swift, - MCPBridge/MCPBridgeProxy.swift, + CLI/main.swift, + CLI/MCPBridgeProxy.swift, ); target = 5A32BBFF2F9D5F1300BAEB5F /* mcp-server */; }; @@ -453,8 +460,8 @@ isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( Info.plist, - MCPBridge/main.swift, - MCPBridge/MCPBridgeProxy.swift, + CLI/main.swift, + CLI/MCPBridgeProxy.swift, ); target = 5A1091C62EF17EDC0055EA7C /* TablePro */; }; @@ -913,7 +920,7 @@ 5ABQR00300000000000000A0 /* BigQueryDriverPlugin.tableplugin */, 5AE4F4742F6BC0640097AC5B /* CloudflareD1DriverPlugin.tableplugin */, 5A3BE6F82F97DA8100611C1F /* LibSQLDriverPlugin.tableplugin */, - 5A32BC002F9D5F1300BAEB5F /* mcp-server */, + 5A32BC002F9D5F1300BAEB5F /* tablepro-mcp */, ); name = Products; sourceTree = ""; @@ -994,6 +1001,7 @@ buildRules = ( ); dependencies = ( + 5A32BC0D2F9D659200BAEB5F /* PBXTargetDependency */, 5A860000C00000000 /* PBXTargetDependency */, 5A861000C00000000 /* PBXTargetDependency */, 5A862000C00000000 /* PBXTargetDependency */, @@ -1050,7 +1058,7 @@ packageProductDependencies = ( ); productName = "mcp-server"; - productReference = 5A32BC002F9D5F1300BAEB5F /* mcp-server */; + productReference = 5A32BC002F9D5F1300BAEB5F /* tablepro-mcp */; productType = "com.apple.product-type.tool"; }; 5A3BE6F72F97DA8100611C1F /* LibSQLDriverPlugin */ = { @@ -2024,6 +2032,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 5A32BC0D2F9D659200BAEB5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5A32BBFF2F9D5F1300BAEB5F /* mcp-server */; + targetProxy = 5A32BC0C2F9D659200BAEB5F /* PBXContainerItemProxy */; + }; 5A860000C00000000 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 5A860000000000000 /* TableProPluginKit */; @@ -2402,7 +2415,8 @@ DEVELOPMENT_TEAM = D7HJ5TFYCU; ENABLE_HARDENED_RUNTIME = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "com.TablePro.tablepro-mcp"; + PRODUCT_NAME = "tablepro-mcp"; SDKROOT = macosx; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; @@ -2417,7 +2431,8 @@ DEVELOPMENT_TEAM = D7HJ5TFYCU; ENABLE_HARDENED_RUNTIME = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "com.TablePro.tablepro-mcp"; + PRODUCT_NAME = "tablepro-mcp"; SDKROOT = macosx; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; diff --git a/TablePro/MCPBridge/MCPBridgeProxy.swift b/TablePro/CLI/MCPBridgeProxy.swift similarity index 64% rename from TablePro/MCPBridge/MCPBridgeProxy.swift rename to TablePro/CLI/MCPBridgeProxy.swift index a74bde5ad..567a782ba 100644 --- a/TablePro/MCPBridge/MCPBridgeProxy.swift +++ b/TablePro/CLI/MCPBridgeProxy.swift @@ -49,6 +49,10 @@ private final class CertificatePinningDelegate: NSObject, URLSessionDelegate { } final class MCPBridgeProxy { + private static let pollInterval: TimeInterval = 0.2 + private static let pollTimeout: TimeInterval = 10.0 + private static let launchURL = "tablepro://integrations/start-mcp" + private let handshakePath: String private var sessionId: String? @@ -59,9 +63,8 @@ final class MCPBridgeProxy { func run() async { let handshake: MCPHandshake - do { - handshake = try loadHandshake() + handshake = try await acquireHandshake() } catch { writeStderr("Error: \(error.localizedDescription)\n") writeJsonRpcError( @@ -72,33 +75,24 @@ final class MCPBridgeProxy { exit(1) } - guard isProcessRunning(pid: handshake.pid) else { - writeStderr("Error: TablePro process \(handshake.pid) is not running\n") - writeJsonRpcError( - id: .null, - code: -32_000, - message: "TablePro is not running. Launch the app and enable the MCP server." - ) - exit(1) - } - - let config = URLSessionConfiguration.ephemeral - config.timeoutIntervalForRequest = 60 - config.timeoutIntervalForResource = 60 + let urlSession = makeSession(handshake: handshake) + let scheme = (handshake.tls ?? false) ? "https" : "http" + let baseUrl = "\(scheme)://127.0.0.1:\(handshake.port)/mcp" + await readLoop(baseUrl: baseUrl, bearerToken: handshake.token, urlSession: urlSession) + } - let delegate: URLSessionDelegate? - if handshake.tls ?? false, let fingerprint = handshake.tlsCertFingerprint { - delegate = CertificatePinningDelegate(expectedFingerprint: fingerprint) - } else { - delegate = nil + private func acquireHandshake() async throws -> MCPHandshake { + if let handshake = try? loadHandshake(), isProcessRunning(pid: handshake.pid) { + return handshake } - let urlSession = URLSession(configuration: config, delegate: delegate, delegateQueue: nil) - let scheme = (handshake.tls ?? false) ? "https" : "http" - let baseUrl = "\(scheme)://127.0.0.1:\(handshake.port)/mcp" - let bearerToken = handshake.token + if (try? loadHandshake()) != nil { + writeStderr("Stale handshake detected; relaunching TablePro\n") + removeHandshake() + } - await readLoop(baseUrl: baseUrl, bearerToken: bearerToken, urlSession: urlSession) + try launchHostApp() + return try await pollForHandshake() } private func loadHandshake() throws -> MCPHandshake { @@ -106,10 +100,51 @@ final class MCPBridgeProxy { return try JSONDecoder().decode(MCPHandshake.self, from: data) } + private func removeHandshake() { + try? FileManager.default.removeItem(atPath: handshakePath) + } + private func isProcessRunning(pid: Int32) -> Bool { kill(pid, 0) == 0 } + private func launchHostApp() throws { + writeStderr("TablePro not running; launching via \(Self.launchURL)\n") + let process = Process() + process.executableURL = URL(fileURLWithPath: "/usr/bin/open") + process.arguments = ["-g", Self.launchURL] + try process.run() + process.waitUntilExit() + if process.terminationStatus != 0 { + throw BridgeError.launchFailed(status: process.terminationStatus) + } + } + + private func pollForHandshake() async throws -> MCPHandshake { + let deadline = Date().addingTimeInterval(Self.pollTimeout) + while Date() < deadline { + if let handshake = try? loadHandshake(), isProcessRunning(pid: handshake.pid) { + return handshake + } + try? await Task.sleep(nanoseconds: UInt64(Self.pollInterval * 1_000_000_000)) + } + throw BridgeError.handshakeTimeout + } + + private func makeSession(handshake: MCPHandshake) -> URLSession { + let config = URLSessionConfiguration.ephemeral + config.timeoutIntervalForRequest = 60 + config.timeoutIntervalForResource = 60 + + let delegate: URLSessionDelegate? + if handshake.tls ?? false, let fingerprint = handshake.tlsCertFingerprint { + delegate = CertificatePinningDelegate(expectedFingerprint: fingerprint) + } else { + delegate = nil + } + return URLSession(configuration: config, delegate: delegate, delegateQueue: nil) + } + private func readLoop(baseUrl: String, bearerToken: String, urlSession: URLSession) async { let stdin = FileHandle.standardInput var buffer = Data() @@ -132,14 +167,12 @@ final class MCPBridgeProxy { let requestId = extractRequestId(from: lineDataCopy) do { - let responseData = try await forwardRequest( + try await forwardAndEmit( lineDataCopy, baseUrl: baseUrl, bearerToken: bearerToken, urlSession: urlSession ) - writeStdout(responseData) - writeStdout(Data([0x0A])) } catch { writeStderr("Request failed: \(error.localizedDescription)\n") writeJsonRpcError( @@ -152,12 +185,12 @@ final class MCPBridgeProxy { } } - private func forwardRequest( + private func forwardAndEmit( _ body: Data, baseUrl: String, bearerToken: String, urlSession: URLSession - ) async throws -> Data { + ) async throws { guard let url = URL(string: baseUrl) else { throw BridgeError.invalidUrl } @@ -166,9 +199,8 @@ final class MCPBridgeProxy { request.httpMethod = "POST" request.httpBody = body request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json", forHTTPHeaderField: "Accept") + request.setValue("application/json, text/event-stream", forHTTPHeaderField: "Accept") request.setValue("Bearer \(bearerToken)", forHTTPHeaderField: "Authorization") - if let sessionId { request.setValue(sessionId, forHTTPHeaderField: "Mcp-Session-Id") } @@ -177,22 +209,47 @@ final class MCPBridgeProxy { if let httpResponse = response as? HTTPURLResponse { captureSessionId(from: httpResponse) + let contentType = headerValue(httpResponse, forKey: "content-type")?.lowercased() ?? "" + if contentType.contains("text/event-stream") { + emitSSE(data) + return + } + } + + writeStdout(data) + writeStdout(Data([0x0A])) + } + + private func emitSSE(_ data: Data) { + guard let raw = String(data: data, encoding: .utf8) else { return } + for line in raw.split(omittingEmptySubsequences: false, whereSeparator: { $0 == "\n" }) { + guard line.hasPrefix("data:") else { continue } + let payload = line.dropFirst("data:".count) + let trimmed = payload.drop(while: { $0 == " " }) + guard !trimmed.isEmpty else { continue } + if let payloadData = String(trimmed).data(using: .utf8) { + writeStdout(payloadData) + writeStdout(Data([0x0A])) + } } + } - return data + private func headerValue(_ response: HTTPURLResponse, forKey key: String) -> String? { + for (rawKey, rawValue) in response.allHeaderFields { + guard let keyString = rawKey as? String, + keyString.lowercased() == key.lowercased(), + let valueString = rawValue as? String else { continue } + return valueString + } + return nil } private func captureSessionId(from response: HTTPURLResponse) { - let headerFields = response.allHeaderFields - for (key, value) in headerFields { - guard let keyString = key as? String else { continue } - guard keyString.lowercased() == "mcp-session-id" else { continue } - guard let valueString = value as? String else { continue } - - sessionId = valueString - writeStderr("Session established: \(valueString)\n") - return + guard let value = headerValue(response, forKey: "mcp-session-id") else { return } + if sessionId == nil { + writeStderr("Session established: \(value)\n") } + sessionId = value } private func extractRequestId(from data: Data) -> JsonRpcId { @@ -255,11 +312,17 @@ private enum JsonRpcId { private enum BridgeError: LocalizedError { case invalidUrl + case launchFailed(status: Int32) + case handshakeTimeout var errorDescription: String? { switch self { case .invalidUrl: "Invalid MCP server URL" + case .launchFailed(let status): + "Failed to launch TablePro (open exit \(status))" + case .handshakeTimeout: + "Timed out waiting for TablePro MCP server to start" } } } diff --git a/TablePro/MCPBridge/main.swift b/TablePro/CLI/main.swift similarity index 100% rename from TablePro/MCPBridge/main.swift rename to TablePro/CLI/main.swift diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 7fe23e013..c1b4a6a94 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -598,6 +598,14 @@ build_for_arch() { exit 1 fi + # Verify embedded MCP stdio bridge made it into the bundle + MCP_CLI_PATH="$BUILD_DIR/$OUTPUT_NAME/Contents/MacOS/tablepro-mcp" + if [ ! -x "$MCP_CLI_PATH" ]; then + echo "❌ FATAL: tablepro-mcp helper missing from $MCP_CLI_PATH" + echo "Check the mcp-server target's Copy Files build phase on the TablePro target." + exit 1 + fi + # Get size SIZE=$(ls -lh "$BINARY_PATH" 2>/dev/null | awk '{print $5}') if [ -z "$SIZE" ]; then From fdca4dae966fddc3ce91465a18c9db38f180bec5 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:05:04 +0700 Subject: [PATCH 05/83] feat(integrations): pairing flow with PKCE-flavored exchange --- TablePro/AppDelegate+FileOpen.swift | 17 +- TablePro/Core/MCP/MCPMessageTypes.swift | 21 ++ TablePro/Core/MCP/MCPPairingService.swift | 175 +++++++++++ TablePro/Core/MCP/MCPRouter.swift | 80 ++++- .../Sections/PairingApprovalSheet.swift | 277 ++++++++++++++++++ .../Core/MCP/MCPPairingServiceTests.swift | 193 ++++++++++++ 6 files changed, 759 insertions(+), 4 deletions(-) create mode 100644 TablePro/Core/MCP/MCPPairingService.swift create mode 100644 TablePro/Views/Settings/Sections/PairingApprovalSheet.swift create mode 100644 TableProTests/Core/MCP/MCPPairingServiceTests.swift diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index 3a9097053..64d7505ea 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -212,11 +212,22 @@ extension AppDelegate { PendingActionStore.shared.deeplinkImport = exportable NotificationCenter.default.post(name: .deeplinkImportRequested, object: exportable) - case .pairIntegration: - fileOpenLogger.info("Pair integration deep link received; Stream B will implement") + case .pairIntegration(let request): + do { + try await MCPPairingService.shared.startPairing(request) + } catch let error as MCPError where error.isUserCancelled { + fileOpenLogger.info("Pairing cancelled by user") + } catch { + fileOpenLogger.error("Pairing failed: \(error.localizedDescription)") + AlertHelper.showErrorSheet( + title: String(localized: "Pairing Failed"), + message: error.localizedDescription, + window: NSApp.keyWindow + ) + } case .exchangePairing: - fileOpenLogger.info("Exchange pairing deep link received; Stream B will implement") + fileOpenLogger.warning("Exchange pairing received via URL scheme; ignored (use HTTP endpoint)") case .startMCP: await MCPServerManager.shared.lazyStart() diff --git a/TablePro/Core/MCP/MCPMessageTypes.swift b/TablePro/Core/MCP/MCPMessageTypes.swift index 118c3faa7..8775c23ed 100644 --- a/TablePro/Core/MCP/MCPMessageTypes.swift +++ b/TablePro/Core/MCP/MCPMessageTypes.swift @@ -286,6 +286,9 @@ enum MCPError: Error, Sendable { case timeout(String, context: [String: String]? = nil) case resultTooLarge case serverDisabled + case notFound(String) + case expired(String) + case userCancelled var code: Int { switch self { @@ -299,6 +302,9 @@ enum MCPError: Error, Sendable { case .timeout: -32_002 case .resultTooLarge: -32_003 case .serverDisabled: -32_004 + case .notFound: -32_005 + case .expired: -32_006 + case .userCancelled: -32_007 } } @@ -324,6 +330,12 @@ enum MCPError: Error, Sendable { "Result too large" case .serverDisabled: "MCP server is disabled" + case .notFound(let detail): + "Not found: \(detail)" + case .expired(let detail): + "Expired: \(detail)" + case .userCancelled: + "User cancelled" } } @@ -349,6 +361,15 @@ enum MCPError: Error, Sendable { error: JSONRPCErrorDetail(code: code, message: message, data: contextData) ) } + + var isUserCancelled: Bool { + if case .userCancelled = self { return true } + return false + } +} + +extension MCPError: LocalizedError { + var errorDescription: String? { message } } // MARK: - MCP Initialize diff --git a/TablePro/Core/MCP/MCPPairingService.swift b/TablePro/Core/MCP/MCPPairingService.swift new file mode 100644 index 000000000..71bde51d7 --- /dev/null +++ b/TablePro/Core/MCP/MCPPairingService.swift @@ -0,0 +1,175 @@ +// +// MCPPairingService.swift +// TablePro +// + +import AppKit +import CryptoKit +import Foundation +import os + +struct PairingExchangeRecord: Sendable, Equatable { + let plaintextToken: String + let challenge: String + let expiresAt: Date +} + +final class PairingExchangeStore: @unchecked Sendable { + static let exchangeWindow: TimeInterval = 300 + + private let lock = NSLock() + private var pending: [String: PairingExchangeRecord] = [:] + + func insert(code: String, record: PairingExchangeRecord) { + lock.lock() + defer { lock.unlock() } + prune(now: Date.now) + pending[code] = record + } + + func consume(code: String, verifier: String, now: Date = .now) throws -> String { + lock.lock() + defer { lock.unlock() } + prune(now: now) + + guard let entry = pending[code] else { + throw MCPError.notFound("pairing code") + } + + guard entry.expiresAt > now else { + pending.removeValue(forKey: code) + throw MCPError.expired("pairing code") + } + + let computed = Self.sha256Base64Url(of: verifier) + guard Self.constantTimeEqual(entry.challenge, computed) else { + throw MCPError.forbidden("challenge mismatch") + } + + let token = entry.plaintextToken + pending.removeValue(forKey: code) + return token + } + + func pruneExpired(now: Date = .now) { + lock.lock() + defer { lock.unlock() } + prune(now: now) + } + + func count() -> Int { + lock.lock() + defer { lock.unlock() } + return pending.count + } + + func contains(code: String) -> Bool { + lock.lock() + defer { lock.unlock() } + return pending[code] != nil + } + + private func prune(now: Date) { + let stale = pending.filter { $0.value.expiresAt <= now }.keys + for key in stale { + pending.removeValue(forKey: key) + } + } + + static func sha256Base64Url(of value: String) -> String { + let digest = SHA256.hash(data: Data(value.utf8)) + let data = Data(digest) + return data.base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + } + + static func constantTimeEqual(_ lhs: String, _ rhs: String) -> Bool { + let lhsBytes = Array(lhs.utf8) + let rhsBytes = Array(rhs.utf8) + guard lhsBytes.count == rhsBytes.count else { return false } + var result: UInt8 = 0 + for index in 0..? + + init(store: PairingExchangeStore = PairingExchangeStore()) { + self.store = store + startPruneLoop() + } + + func startPairing(_ request: PairingRequest) async throws { + await MCPServerManager.shared.lazyStart() + + guard let tokenStore = MCPServerManager.shared.tokenStore else { + Self.logger.error("Token store unavailable after lazyStart") + throw MCPError.internalError("Token store unavailable") + } + + let approval = try await PairingApprovalPresenter.present(request: request) + + let result = await tokenStore.generate( + name: request.clientName, + permissions: approval.grantedPermissions, + allowedConnectionIds: approval.allowedConnectionIds, + expiresAt: approval.expiresAt + ) + + let code = UUID().uuidString + store.insert( + code: code, + record: PairingExchangeRecord( + plaintextToken: result.plaintext, + challenge: request.challenge, + expiresAt: Date.now.addingTimeInterval(PairingExchangeStore.exchangeWindow) + ) + ) + + guard let redirect = buildRedirectURL(base: request.redirectURL, code: code) else { + Self.logger.error("Failed to build pairing redirect URL") + await tokenStore.delete(tokenId: result.token.id) + throw MCPError.invalidParams("redirect URL") + } + + Self.logger.info("Pairing approved for client '\(request.clientName, privacy: .public)'") + NSWorkspace.shared.open(redirect) + } + + func exchange(_ exchange: PairingExchange) throws -> String { + try store.consume(code: exchange.code, verifier: exchange.verifier) + } + + private func startPruneLoop() { + pruneTask = Task { [store] in + while !Task.isCancelled { + try? await Task.sleep(for: Self.pruneInterval) + guard !Task.isCancelled else { return } + store.pruneExpired() + } + } + } + + private func buildRedirectURL(base: URL, code: String) -> URL? { + guard var components = URLComponents(url: base, resolvingAgainstBaseURL: false) else { + return nil + } + var items = components.queryItems ?? [] + items.append(URLQueryItem(name: "code", value: code)) + components.queryItems = items + return components.url + } +} diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index c00e10f63..eccbf9829 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -34,6 +34,12 @@ final class MCPRouter: Sendable { return .httpError(status: 404, message: "Not found") } + if request.path == "/v1/integrations/exchange" + || request.path.hasPrefix("/v1/integrations/exchange?") + { + return await handleIntegrationsExchange(request) + } + guard request.path == "/mcp" || request.path.hasPrefix("/mcp?") else { return .httpError(status: 404, message: "Not found") } @@ -551,7 +557,7 @@ final class MCPRouter: Sendable { extension MCPRouter { static func toolDefinitions() -> [MCPToolDefinition] { - connectionTools() + schemaTools() + queryAndExportTools() + connectionTools() + schemaTools() + queryAndExportTools() + integrationTools() } private static func connectionTools() -> [MCPToolDefinition] { @@ -856,6 +862,78 @@ extension MCPRouter { } } +extension MCPRouter { + private struct ExchangeRequestBody: Decodable { + let code: String + let codeVerifier: String + + enum CodingKeys: String, CodingKey { + case code + case codeVerifier = "code_verifier" + } + } + + private struct ExchangeResponseBody: Encodable { + let token: String + } + + func handleIntegrationsExchange(_ request: HTTPRequest) async -> RouteResult { + guard request.method == .post else { + return .httpError(status: 405, message: "Method not allowed") + } + + guard let body = request.body else { + return .httpError(status: 400, message: "Missing request body") + } + + let parsed: ExchangeRequestBody + do { + parsed = try decoder.decode(ExchangeRequestBody.self, from: body) + } catch { + return .httpError(status: 400, message: "Invalid JSON body") + } + + guard !parsed.code.isEmpty, !parsed.codeVerifier.isEmpty else { + return .httpError(status: 400, message: "Missing code or code_verifier") + } + + let token: String + do { + token = try await MainActor.run { + try MCPPairingService.shared.exchange( + PairingExchange(code: parsed.code, verifier: parsed.codeVerifier) + ) + } + } catch let mcpError as MCPError { + return mapExchangeError(mcpError) + } catch { + Self.logger.error("Pairing exchange failed: \(error.localizedDescription)") + return .httpError(status: 500, message: "Internal error") + } + + do { + let data = try encoder.encode(ExchangeResponseBody(token: token)) + return .json(data, sessionId: nil) + } catch { + Self.logger.error("Failed to encode exchange response: \(error.localizedDescription)") + return .httpError(status: 500, message: "Internal error") + } + } + + private func mapExchangeError(_ error: MCPError) -> RouteResult { + switch error { + case .notFound: + return .httpError(status: 404, message: "Pairing code not found") + case .expired: + return .httpError(status: 410, message: "Pairing code expired") + case .forbidden: + return .httpError(status: 403, message: "Challenge mismatch") + default: + return .httpError(status: 500, message: "Internal error") + } + } +} + extension MCPRouter { static func resourceDefinitions() -> [MCPResourceDefinition] { [ diff --git a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift new file mode 100644 index 000000000..dd9d65b4e --- /dev/null +++ b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift @@ -0,0 +1,277 @@ +// +// PairingApprovalSheet.swift +// TablePro +// + +import AppKit +import SwiftUI + +struct PairingApproval: Sendable { + let grantedPermissions: TokenPermissions + let allowedConnectionIds: Set? + let expiresAt: Date? +} + +@MainActor +enum PairingApprovalPresenter { + static func present(request: PairingRequest) async throws -> PairingApproval { + try await withCheckedThrowingContinuation { continuation in + let host = NSHostingController( + rootView: PairingApprovalSheet( + request: request, + onComplete: { result in + continuation.resume(with: result) + } + ) + ) + host.view.frame = NSRect(x: 0, y: 0, width: 520, height: 560) + + let parent = AlertHelper.resolveWindow(nil) + let sheetWindow = NSWindow(contentViewController: host) + sheetWindow.styleMask = [.titled] + sheetWindow.title = String(localized: "Approve Integration") + sheetWindow.isReleasedWhenClosed = false + + host.rootView = PairingApprovalSheet( + request: request, + onComplete: { result in + if let parent { + parent.endSheet(sheetWindow) + } else { + sheetWindow.close() + } + continuation.resume(with: result) + } + ) + + if let parent { + parent.beginSheet(sheetWindow, completionHandler: nil) + } else { + NSApp.activate(ignoringOtherApps: true) + sheetWindow.center() + sheetWindow.makeKeyAndOrderFront(nil) + } + } + } +} + +struct PairingApprovalSheet: View { + let request: PairingRequest + let onComplete: (Result) -> Void + + @State private var permissions: TokenPermissions + @State private var connectionAccess: ConnectionAccessMode = .all + @State private var selectedConnectionIds: Set = [] + @State private var expiry: ExpiryOption = .never + @State private var connections: [DatabaseConnection] = [] + + init(request: PairingRequest, onComplete: @escaping (Result) -> Void) { + self.request = request + self.onComplete = onComplete + let initialPermissions = Self.initialPermissions(from: request) + _permissions = State(initialValue: initialPermissions) + if let requested = request.requestedConnectionIds, !requested.isEmpty { + _connectionAccess = State(initialValue: .selected) + _selectedConnectionIds = State(initialValue: requested) + } + } + + var body: some View { + VStack(spacing: 0) { + header + Divider() + Form { + permissionsSection + connectionAccessSection + expirySection + } + .formStyle(.grouped) + .scrollContentBackground(.hidden) + + Divider() + actionBar.padding() + } + .frame(width: 520, height: 560) + .task { + connections = ConnectionStorage.shared.loadConnections() + if connectionAccess == .all { + selectedConnectionIds = Set(connections.map(\.id)) + } + } + } + + private var header: some View { + VStack(alignment: .leading, spacing: 6) { + Text(String(format: String(localized: "Allow %@ to access TablePro?"), request.clientName)) + .font(.headline) + Text(String(localized: "An external app is asking for an API token. Review the permissions before approving.")) + .font(.callout) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding() + } + + private var permissionsSection: some View { + Section(String(localized: "Permission Level")) { + Picker(String(localized: "Permission"), selection: $permissions) { + ForEach(TokenPermissions.allCases) { permission in + Text(permission.displayName).tag(permission) + } + } + .pickerStyle(.segmented) + .labelsHidden() + + Text(permissionsDescription) + .font(.caption) + .foregroundStyle(.secondary) + } + } + + private var connectionAccessSection: some View { + Section(String(localized: "Allowed Connections")) { + Picker(String(localized: "Access"), selection: $connectionAccess) { + Text(String(localized: "All Connections")).tag(ConnectionAccessMode.all) + Text(String(localized: "Select Connections")).tag(ConnectionAccessMode.selected) + } + .labelsHidden() + .onChange(of: connectionAccess) { _, newValue in + if newValue == .all { + selectedConnectionIds = Set(connections.map(\.id)) + } else if selectedConnectionIds.isEmpty { + selectedConnectionIds = Set(connections.map(\.id)) + } + } + + if connectionAccess == .selected { + connectionList + } + } + } + + @ViewBuilder + private var connectionList: some View { + if connections.isEmpty { + Text(String(localized: "No saved connections")) + .foregroundStyle(.secondary) + } else { + ForEach(connections) { connection in + Toggle(isOn: connectionBinding(for: connection.id)) { + HStack(spacing: 6) { + Text(connection.name) + Text(connection.type.displayName) + .font(.caption) + .foregroundStyle(.secondary) + } + } + .toggleStyle(.checkbox) + } + } + } + + private var expirySection: some View { + Section(String(localized: "Expiration")) { + Picker(String(localized: "Expires"), selection: $expiry) { + ForEach(ExpiryOption.allCases) { option in + Text(option.displayName).tag(option) + } + } + .labelsHidden() + } + } + + private var actionBar: some View { + HStack { + Button(String(localized: "Deny"), role: .cancel) { + onComplete(.failure(MCPError.userCancelled)) + } + .keyboardShortcut(.cancelAction) + + Spacer() + + Button(String(localized: "Approve")) { + let approval = PairingApproval( + grantedPermissions: permissions, + allowedConnectionIds: connectionAccess == .selected ? selectedConnectionIds : nil, + expiresAt: expiry.resolvedDate + ) + onComplete(.success(approval)) + } + .keyboardShortcut(.defaultAction) + .disabled(connectionAccess == .selected && selectedConnectionIds.isEmpty) + } + } + + private func connectionBinding(for id: UUID) -> Binding { + Binding( + get: { selectedConnectionIds.contains(id) }, + set: { isSelected in + if isSelected { + selectedConnectionIds.insert(id) + } else { + selectedConnectionIds.remove(id) + } + } + ) + } + + private var permissionsDescription: String { + switch permissions { + case .readOnly: + String(localized: "Read schema and run SELECT queries.") + case .readWrite: + String(localized: "Read schema and run any non-destructive query, including INSERT, UPDATE, and DELETE.") + case .fullAccess: + String(localized: "Full access including destructive DDL after explicit confirmation.") + } + } + + private static func initialPermissions(from request: PairingRequest) -> TokenPermissions { + guard let raw = request.requestedScopes?.lowercased() else { return .readOnly } + switch raw { + case "readwrite", "read_write", "read-write": + return .readWrite + case "fullaccess", "full_access", "full-access", "full": + return .fullAccess + default: + return .readOnly + } + } +} + +private enum ConnectionAccessMode: String, Identifiable, Sendable { + case all + case selected + + var id: String { rawValue } +} + +private enum ExpiryOption: String, CaseIterable, Identifiable, Sendable { + case never + case oneDay + case sevenDays + case thirtyDays + case ninetyDays + + var id: String { rawValue } + + var displayName: String { + switch self { + case .never: String(localized: "Never") + case .oneDay: String(localized: "1 day") + case .sevenDays: String(localized: "7 days") + case .thirtyDays: String(localized: "30 days") + case .ninetyDays: String(localized: "90 days") + } + } + + var resolvedDate: Date? { + switch self { + case .never: nil + case .oneDay: Calendar.current.date(byAdding: .day, value: 1, to: .now) + case .sevenDays: Calendar.current.date(byAdding: .day, value: 7, to: .now) + case .thirtyDays: Calendar.current.date(byAdding: .day, value: 30, to: .now) + case .ninetyDays: Calendar.current.date(byAdding: .day, value: 90, to: .now) + } + } +} diff --git a/TableProTests/Core/MCP/MCPPairingServiceTests.swift b/TableProTests/Core/MCP/MCPPairingServiceTests.swift new file mode 100644 index 000000000..eb3f2335f --- /dev/null +++ b/TableProTests/Core/MCP/MCPPairingServiceTests.swift @@ -0,0 +1,193 @@ +import CryptoKit +import Foundation +import Testing + +@testable import TablePro + +@Suite("MCP Pairing Exchange Store") +struct MCPPairingServiceTests { + // MARK: - Helpers + + private func base64UrlSha256(of value: String) -> String { + PairingExchangeStore.sha256Base64Url(of: value) + } + + private func makeStore() -> PairingExchangeStore { + PairingExchangeStore() + } + + private func record(plaintext: String, challenge: String, expiresIn: TimeInterval) -> PairingExchangeRecord { + PairingExchangeRecord( + plaintextToken: plaintext, + challenge: challenge, + expiresAt: Date.now.addingTimeInterval(expiresIn) + ) + } + + // MARK: - Happy path + + @Test("consume returns stored token when challenge and verifier match") + func consumeReturnsTokenForValidVerifier() throws { + let verifier = "test-verifier-1" + let challenge = base64UrlSha256(of: verifier) + let store = makeStore() + store.insert(code: "code-1", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + + let token = try store.consume(code: "code-1", verifier: verifier) + + #expect(token == "tp_secret") + } + + @Test("consume removes the entry after success (single-use)") + func consumeIsSingleUse() throws { + let verifier = "test-verifier-2" + let challenge = base64UrlSha256(of: verifier) + let store = makeStore() + store.insert(code: "code-2", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + + _ = try store.consume(code: "code-2", verifier: verifier) + + #expect(store.contains(code: "code-2") == false) + } + + @Test("second consume of the same code returns notFound") + func duplicateConsumeReturnsNotFound() throws { + let verifier = "test-verifier-3" + let challenge = base64UrlSha256(of: verifier) + let store = makeStore() + store.insert(code: "code-3", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + + _ = try store.consume(code: "code-3", verifier: verifier) + + #expect(throws: MCPError.self) { + try store.consume(code: "code-3", verifier: verifier) + } + } + + // MARK: - Failure modes + + @Test("consume returns notFound for unknown code") + func consumeUnknownCodeReturnsNotFound() { + let store = makeStore() + + do { + _ = try store.consume(code: "missing", verifier: "any") + Issue.record("Expected notFound error") + } catch let error as MCPError { + guard case .notFound = error else { + Issue.record("Expected notFound, got \(error)") + return + } + } catch { + Issue.record("Unexpected error: \(error)") + } + } + + @Test("consume returns expired when entry has expired") + func consumeExpiredEntryReturnsExpired() { + let verifier = "test-verifier-4" + let challenge = base64UrlSha256(of: verifier) + let store = makeStore() + store.insert(code: "code-4", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) + + do { + _ = try store.consume(code: "code-4", verifier: verifier, now: Date.now) + Issue.record("Expected expired error") + } catch let error as MCPError { + guard case .expired = error else { + Issue.record("Expected expired, got \(error)") + return + } + } catch { + Issue.record("Unexpected error: \(error)") + } + } + + @Test("consume returns forbidden when challenge does not match the verifier") + func consumeMismatchedChallengeReturnsForbidden() { + let store = makeStore() + let challenge = base64UrlSha256(of: "intended-verifier") + store.insert(code: "code-5", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + + do { + _ = try store.consume(code: "code-5", verifier: "attacker-verifier") + Issue.record("Expected forbidden error") + } catch let error as MCPError { + guard case .forbidden = error else { + Issue.record("Expected forbidden, got \(error)") + return + } + } catch { + Issue.record("Unexpected error: \(error)") + } + } + + @Test("consume on expired code removes the entry") + func consumeOnExpiredCodeRemovesEntry() { + let verifier = "test-verifier-6" + let challenge = base64UrlSha256(of: verifier) + let store = makeStore() + store.insert(code: "code-6", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) + + _ = try? store.consume(code: "code-6", verifier: verifier) + + #expect(store.contains(code: "code-6") == false) + } + + // MARK: - Pruning + + @Test("pruneExpired removes only expired entries") + func pruneRemovesOnlyExpiredEntries() { + let store = makeStore() + store.insert( + code: "alive", + record: record(plaintext: "tp_a", challenge: "challenge", expiresIn: 60) + ) + store.insert( + code: "stale-1", + record: record(plaintext: "tp_b", challenge: "challenge", expiresIn: -1) + ) + store.insert( + code: "stale-2", + record: record(plaintext: "tp_c", challenge: "challenge", expiresIn: -10) + ) + + store.pruneExpired() + + #expect(store.count() == 1) + #expect(store.contains(code: "alive")) + #expect(store.contains(code: "stale-1") == false) + #expect(store.contains(code: "stale-2") == false) + } + + // MARK: - SHA256 helper + + @Test("sha256Base64Url matches CryptoKit output without padding") + func sha256Base64UrlMatchesCryptoKit() { + let value = "verifier-string" + let digest = SHA256.hash(data: Data(value.utf8)) + let expected = Data(digest).base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + + #expect(PairingExchangeStore.sha256Base64Url(of: value) == expected) + } + + // MARK: - constantTimeEqual + + @Test("constantTimeEqual returns true for identical strings") + func constantTimeEqualIdentical() { + #expect(PairingExchangeStore.constantTimeEqual("abc", "abc")) + } + + @Test("constantTimeEqual returns false for different strings") + func constantTimeEqualDifferent() { + #expect(PairingExchangeStore.constantTimeEqual("abc", "abd") == false) + } + + @Test("constantTimeEqual returns false for different lengths") + func constantTimeEqualLengthMismatch() { + #expect(PairingExchangeStore.constantTimeEqual("abc", "abcd") == false) + } +} From b80c4ab53b836f92e9363f4a860011670a5a61b8 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:05:25 +0700 Subject: [PATCH 06/83] feat(integrations): Raycast extension --- extensions/tablepro/.eslintrc.json | 4 + extensions/tablepro/.gitignore | 5 + extensions/tablepro/CHANGELOG.md | 10 + extensions/tablepro/README.md | 67 + extensions/tablepro/assets/icon.png | Bin 0 -> 527921 bytes extensions/tablepro/assets/icon@dark.png | Bin 0 -> 613508 bytes extensions/tablepro/metadata/.gitkeep | 0 extensions/tablepro/package-lock.json | 3568 +++++++++++++++++ extensions/tablepro/package.json | 267 ++ extensions/tablepro/src/lib/connections.ts | 99 + extensions/tablepro/src/lib/deeplink.ts | 64 + extensions/tablepro/src/lib/empty-state.tsx | 123 + extensions/tablepro/src/lib/errors.ts | 73 + extensions/tablepro/src/lib/mcp.ts | 315 ++ extensions/tablepro/src/lib/pairing.ts | 31 + extensions/tablepro/src/lib/paths.ts | 35 + extensions/tablepro/src/lib/sql.ts | 13 + extensions/tablepro/src/lib/types.ts | 122 + .../tablepro/src/menu-bar-connections.tsx | 104 + extensions/tablepro/src/open-connection.tsx | 46 + extensions/tablepro/src/pair.tsx | 342 ++ extensions/tablepro/src/recent-tabs.tsx | 111 + extensions/tablepro/src/run-query.tsx | 335 ++ .../tablepro/src/search-connections.tsx | 147 + extensions/tablepro/src/search-history.tsx | 102 + extensions/tablepro/src/search-schema.tsx | 224 ++ extensions/tablepro/src/search-tables.tsx | 221 + .../tablepro/src/tools/describe-table.ts | 22 + .../tablepro/src/tools/explain-query.ts | 20 + .../tablepro/src/tools/get-table-ddl.ts | 19 + .../tablepro/src/tools/list-connections.ts | 15 + .../tablepro/src/tools/list-databases.ts | 11 + extensions/tablepro/src/tools/list-schemas.ts | 13 + extensions/tablepro/src/tools/list-tables.ts | 18 + .../src/tools/open-connection-window.ts | 16 + extensions/tablepro/src/tools/run-query.ts | 63 + .../tablepro/src/tools/search-history.ts | 13 + extensions/tablepro/tsconfig.json | 17 + 38 files changed, 6655 insertions(+) create mode 100644 extensions/tablepro/.eslintrc.json create mode 100644 extensions/tablepro/.gitignore create mode 100644 extensions/tablepro/CHANGELOG.md create mode 100644 extensions/tablepro/README.md create mode 100644 extensions/tablepro/assets/icon.png create mode 100644 extensions/tablepro/assets/icon@dark.png create mode 100644 extensions/tablepro/metadata/.gitkeep create mode 100644 extensions/tablepro/package-lock.json create mode 100644 extensions/tablepro/package.json create mode 100644 extensions/tablepro/src/lib/connections.ts create mode 100644 extensions/tablepro/src/lib/deeplink.ts create mode 100644 extensions/tablepro/src/lib/empty-state.tsx create mode 100644 extensions/tablepro/src/lib/errors.ts create mode 100644 extensions/tablepro/src/lib/mcp.ts create mode 100644 extensions/tablepro/src/lib/pairing.ts create mode 100644 extensions/tablepro/src/lib/paths.ts create mode 100644 extensions/tablepro/src/lib/sql.ts create mode 100644 extensions/tablepro/src/lib/types.ts create mode 100644 extensions/tablepro/src/menu-bar-connections.tsx create mode 100644 extensions/tablepro/src/open-connection.tsx create mode 100644 extensions/tablepro/src/pair.tsx create mode 100644 extensions/tablepro/src/recent-tabs.tsx create mode 100644 extensions/tablepro/src/run-query.tsx create mode 100644 extensions/tablepro/src/search-connections.tsx create mode 100644 extensions/tablepro/src/search-history.tsx create mode 100644 extensions/tablepro/src/search-schema.tsx create mode 100644 extensions/tablepro/src/search-tables.tsx create mode 100644 extensions/tablepro/src/tools/describe-table.ts create mode 100644 extensions/tablepro/src/tools/explain-query.ts create mode 100644 extensions/tablepro/src/tools/get-table-ddl.ts create mode 100644 extensions/tablepro/src/tools/list-connections.ts create mode 100644 extensions/tablepro/src/tools/list-databases.ts create mode 100644 extensions/tablepro/src/tools/list-schemas.ts create mode 100644 extensions/tablepro/src/tools/list-tables.ts create mode 100644 extensions/tablepro/src/tools/open-connection-window.ts create mode 100644 extensions/tablepro/src/tools/run-query.ts create mode 100644 extensions/tablepro/src/tools/search-history.ts create mode 100644 extensions/tablepro/tsconfig.json diff --git a/extensions/tablepro/.eslintrc.json b/extensions/tablepro/.eslintrc.json new file mode 100644 index 000000000..e6258e11d --- /dev/null +++ b/extensions/tablepro/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": ["@raycast"] +} diff --git a/extensions/tablepro/.gitignore b/extensions/tablepro/.gitignore new file mode 100644 index 000000000..349b2d696 --- /dev/null +++ b/extensions/tablepro/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.DS_Store +*.log +raycast-env.d.ts diff --git a/extensions/tablepro/CHANGELOG.md b/extensions/tablepro/CHANGELOG.md new file mode 100644 index 000000000..6a4d5b352 --- /dev/null +++ b/extensions/tablepro/CHANGELOG.md @@ -0,0 +1,10 @@ +# TablePro Changelog + +## [Initial Version] - {PR_MERGE_DATE} + +- Search Connections, Open Connection, and TablePro Menu Bar commands. +- Search Schema, Search Tables, Recent Tabs, Run Query, and Search Query History commands. +- Pair with TablePro command for PKCE-based token issuance. +- 10 AI tools (list-connections, list-databases, list-schemas, list-tables, describe-table, get-table-ddl, run-query, explain-query, open-connection-window, search-history). +- Tool.Confirmation prompt for mutating SQL with connection name and SQL preview. +- Empty states for missing TablePro install, MCP not running, no token paired, and revoked tokens. diff --git a/extensions/tablepro/README.md b/extensions/tablepro/README.md new file mode 100644 index 000000000..08c1639b8 --- /dev/null +++ b/extensions/tablepro/README.md @@ -0,0 +1,67 @@ +# TablePro + +Open and search your TablePro database connections from Raycast. Browse schema, run queries, and let Raycast AI use TablePro tools. + +TablePro is a native macOS database client. This extension talks to a running TablePro app over a local MCP server. No credentials are passed through Raycast. + +## Setup + +1. Install TablePro 0.6 or later from [tablepro.app](https://tablepro.app). +2. Run the **Pair with TablePro** command in Raycast. +3. TablePro shows an approval sheet. Choose the scope (read-only by default), pick which connections this token can reach, and approve. +4. The token lands in this extension's preferences. You're done. + +The MCP server starts on demand. You don't need to enable it manually. + +## Commands + +- **Search Connections** — list saved connections, open one in TablePro, copy a deep link. +- **Open Connection** — `Open Connection prod` from the Raycast root. +- **TablePro Menu Bar** — show recent connections and quick actions in the menu bar. +- **Search Schema** — drill into databases and schemas across connections. +- **Search Tables** — pick a connection, list tables, copy DDL, open a table tab. +- **Recent Tabs** — show tabs currently open in TablePro and reopen one. +- **Run Query** — paste SQL, pick a connection, see the first 50 rows in Raycast or open the full grid in TablePro. Mutating queries ask before running. +- **Search Query History** — full-text search across the TablePro query history. +- **Pair with TablePro** — issue or refresh the API token. + +## AI tools + +The extension exposes 10 tools to Raycast AI: + +- `list-connections`, `list-databases`, `list-schemas`, `list-tables`, `describe-table`, `get-table-ddl` +- `run-query` — mutating SQL goes through `Tool.Confirmation` with the connection name and SQL preview +- `explain-query`, `open-connection-window`, `search-history` + +Try `@tablepro show me users in prod` or `@tablepro how big is the orders table on staging`. + +## Permissions and access control + +Each TablePro connection has an external-access setting (Blocked, Read-only, Read & Write). Tokens are issued with their own scope. The actual permission is the minimum of the two. A full-access token against a read-only connection cannot mutate. + +If TablePro returns 403 for a write query, the extension surfaces the error verbatim. Change the connection's external access in TablePro under the connection editor. + +## Pairing flow + +The pairing flow uses PKCE so the local TablePro app and the extension agree on a token without ever sharing it through a URL. + +1. Raycast generates a verifier (32 random bytes) and a SHA-256 challenge. +2. Raycast opens `tablepro://integrations/pair?...` with the challenge and a `raycast://` callback. +3. TablePro shows the approval sheet. On approve, TablePro mints a one-time code and opens the callback. +4. The extension exchanges code plus verifier for the token at `POST http://127.0.0.1:/v1/integrations/exchange`. +5. The token is stored in the extension's preferences (Keychain-backed). + +The exchange endpoint takes no auth. The single-use code is the auth. + +## Privacy + +- Connection metadata (`name`, `host`, `port`, `type`) is read from `~/Library/Application Support/com.TablePro/connections.json`. +- Passwords are never read by the extension. They live in the TablePro Keychain. +- Query results are fetched on demand from the local MCP server. Nothing leaves your machine. + +## Troubleshooting + +- **TablePro is not installed** — install from tablepro.app or set the path in extension preferences. +- **TablePro is not running** — open TablePro. The MCP server starts on first request. +- **API token was revoked** — run Pair with TablePro again. +- **Pairing got stuck** — close the Pair window and start the command again. The pending verifier is cleared each run. diff --git a/extensions/tablepro/assets/icon.png b/extensions/tablepro/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..214a776787a59aa7c5a667845a40fcb55eda507b GIT binary patch literal 527921 zcmYIv2QXZ3)V^LKx^^cE5=EFnrl^j=o) z%W8|QpWpY*fBtvooqO)Rb7$_{^FHT2=Q+^NrwUKOU8-cqlE2?`J-FnzJFx!lGhb>>z|)g zmbph^^SyPIBVtlFyZU*=jG284#fN2+kslVruB+%>Wf_!6?}9+eBZ@XjUe%=N9d5Hz zarqwDL3uPyc87#Wd>UE4Gyq_Hj}6xSB% z_29T3*Ul;;`+s-HNQ%h+zy04s5t&Rl35gnszLxs4K+=N_x)u+8Q=zP&8x0vVI?R<} zYGNNgd;HZ=+ud^b#J84iq~KVQD8S%6_pmL&zx)@~;4f;nrge3v92Qd+>o4|AikC&q z?s`mZ%%%(`f-)z1Y`0uK()%2#IDw{fh{^t77@H)wgwOVDw3*!5M{|=k%RJWRr z<^Z!CWtkxRldi;#2ybO za^`0Om{RC`Gu*XR7VCJG8izB8CZ^ec bCZ^}o7IH(#3^WmmxUVis~{l!6B0GPoi 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 z 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ეulydb#o@!lmT?ueT50QR#GPC?(4S0!Q+p0@*kJ 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਑if=z(-DZYFVGaxt`RSdeP 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�#3!@FcG_ZU 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 Bg4qB7 literal 0 HcmV?d00001 diff --git a/extensions/tablepro/assets/icon@dark.png b/extensions/tablepro/assets/icon@dark.png new file mode 100644 index 0000000000000000000000000000000000000000..237edc57d66d870f81663edd2d5109f12d3b24ae GIT binary patch literal 613508 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

03G{jn2*>fYlQ97K|jnMn3Y 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 pYpI+Zb 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
)xSEYa%u@xw|}&aWx6wr~-SY$**l5f19PabbpG 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 literal 0 HcmV?d00001 diff --git a/extensions/tablepro/metadata/.gitkeep b/extensions/tablepro/metadata/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/tablepro/package-lock.json b/extensions/tablepro/package-lock.json new file mode 100644 index 000000000..81e768ffb --- /dev/null +++ b/extensions/tablepro/package-lock.json @@ -0,0 +1,3568 @@ +{ + "name": "tablepro", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tablepro", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@raycast/api": "^1.83.0", + "@raycast/utils": "^1.18.1" + }, + "devDependencies": { + "@raycast/eslint-config": "^1.0.11", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "eslint": "^8.57.0", + "prettier": "^3.3.3", + "typescript": "~5.6.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oclif/core": { + "version": "4.10.6", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.6.tgz", + "integrity": "sha512-ySCOYnPKZE3KACT1V9It99hWG9b8E5MpagbRdWxPNRO3beMqmbr4SLUQoFtZ9XRtW++kks1ZVwZOdpnR8rpb9A==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.3", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^10.2.5", + "semver": "^7.7.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.14", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.46", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.46.tgz", + "integrity": "sha512-TFvuD6JlmqEVsEvMqunyj3cyCz/l2Q4MqCjp/XtlSLS9x3xTlam7PGlqWi4WAhxl/K8CtpYqVlMYFEnlLTHspw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.1", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.2.45", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.45.tgz", + "integrity": "sha512-avWOKYmjANtyu8ipju/kopIIrSrbS/scJjiZTpBp/HKEHNm46v5riOo5LQj6MZ4bYJVQEoyHPg/2Seig5Ilkjw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.81", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.81.tgz", + "integrity": "sha512-M88tLONBH36hLAbkFbmCo1hoZPSdU5l8Px1xEIlIgSmGMam+CoAzx4kGqpLbokgfpaHeP8/Jx3QJ18u9ef/2Qw==", + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.10.1", + "@oclif/core": "^4.10.6", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@raycast/api": { + "version": "1.104.12", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.104.12.tgz", + "integrity": "sha512-DdrtoksnzLw4q60BgFr/H+PIvIObOfJrW15duTFH7QXVx/0Vxzw9fY7wo+H2gQ2JDDAh9sEMCpc5akP3UxKjTw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4.8.4", + "@oclif/plugin-autocomplete": "^3.2.40", + "@oclif/plugin-help": "^6.2.37", + "@oclif/plugin-not-found": "^3.2.74", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "esbuild": "^0.27.3", + "react": "19.0.0" + }, + "bin": { + "ray": "bin/run.js" + }, + "engines": { + "node": ">=22.14.0" + }, + "peerDependencies": { + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "react-devtools": "6.1.1" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "react-devtools": { + "optional": true + } + } + }, + "node_modules/@raycast/eslint-config": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@raycast/eslint-config/-/eslint-config-1.0.11.tgz", + "integrity": "sha512-I0Lt8bwahVGkANUBxripIxKptMBz1Ou+UXGwfqgFvKwo1gVLrnlEngxaspQJA8L5pvzQkQMwizVCSgNC3bddWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@raycast/eslint-plugin": "^1.0.11", + "@rushstack/eslint-patch": "^1.10.4", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", + "eslint-config-prettier": "^9.1.0" + }, + "peerDependencies": { + "eslint": ">=7", + "prettier": ">=2", + "typescript": ">=4" + } + }, + "node_modules/@raycast/eslint-plugin": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@raycast/eslint-plugin/-/eslint-plugin-1.0.16.tgz", + "integrity": "sha512-OyFL/W75/4hlgdUUI80Eoes0HjpVrJ8I1kB/PBH2RLjbcK22TC6IwZPXvhBZ5jF962O1TqtOuHrTjySwDaa/cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.62.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/@raycast/utils": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.19.1.tgz", + "integrity": "sha512-/udUGcTZCgZZwzesmjBkqG5naQZTD/ZLHbqRwkWcF+W97vf9tr9raxKyQjKsdZ17OVllw2T3sHBQsVUdEmCm2g==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.6", + "dequal": "^2.0.3", + "object-hash": "^3.0.0", + "signal-exit": "^4.0.2", + "stream-chain": "^2.2.5", + "stream-json": "^1.8.0" + }, + "peerDependencies": { + "@raycast/api": ">=1.69.0" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/extensions/tablepro/package.json b/extensions/tablepro/package.json new file mode 100644 index 000000000..866b7ee4d --- /dev/null +++ b/extensions/tablepro/package.json @@ -0,0 +1,267 @@ +{ + "$schema": "https://www.raycast.com/schemas/extension.json", + "name": "tablepro", + "title": "TablePro", + "description": "Open and search your TablePro database connections, browse schema, and run queries.", + "icon": "icon.png", + "author": "datlechin", + "categories": ["Developer Tools", "Productivity"], + "platforms": ["macOS"], + "license": "MIT", + "version": "0.1.0", + "commands": [ + { + "name": "search-connections", + "title": "Search Connections", + "subtitle": "TablePro", + "description": "Search and open saved TablePro connections.", + "mode": "view" + }, + { + "name": "open-connection", + "title": "Open Connection", + "subtitle": "TablePro", + "description": "Open a connection by name.", + "mode": "no-view", + "arguments": [ + { + "name": "connection", + "placeholder": "Connection name", + "type": "text", + "required": true + } + ] + }, + { + "name": "menu-bar-connections", + "title": "TablePro Menu Bar", + "subtitle": "TablePro", + "description": "Show connections in the menu bar.", + "mode": "menu-bar", + "interval": "10m" + }, + { + "name": "search-schema", + "title": "Search Schema", + "subtitle": "TablePro", + "description": "Search databases and schemas across your connections.", + "mode": "view" + }, + { + "name": "search-tables", + "title": "Search Tables", + "subtitle": "TablePro", + "description": "Search tables in a connection.", + "mode": "view" + }, + { + "name": "recent-tabs", + "title": "Recent Tabs", + "subtitle": "TablePro", + "description": "Show recently opened tabs in TablePro.", + "mode": "view" + }, + { + "name": "run-query", + "title": "Run Query", + "subtitle": "TablePro", + "description": "Run a SQL query against a connection.", + "mode": "view" + }, + { + "name": "search-history", + "title": "Search Query History", + "subtitle": "TablePro", + "description": "Search the TablePro query history.", + "mode": "view" + }, + { + "name": "pair", + "title": "Pair with TablePro", + "subtitle": "TablePro", + "description": "Pair this extension with TablePro.", + "mode": "view" + } + ], + "tools": [ + { + "name": "list-connections", + "title": "List Connections", + "description": "List all saved TablePro database connections." + }, + { + "name": "list-databases", + "title": "List Databases", + "description": "List databases on a TablePro connection." + }, + { + "name": "list-schemas", + "title": "List Schemas", + "description": "List schemas in a database on a TablePro connection." + }, + { + "name": "list-tables", + "title": "List Tables", + "description": "List tables in a database or schema." + }, + { + "name": "describe-table", + "title": "Describe Table", + "description": "Return the column list, types, and constraints for a table." + }, + { + "name": "get-table-ddl", + "title": "Get Table DDL", + "description": "Return the CREATE TABLE statement for a table." + }, + { + "name": "run-query", + "title": "Run Query", + "description": "Run a read or write SQL query. Mutating queries require user confirmation." + }, + { + "name": "explain-query", + "title": "Explain Query", + "description": "Run EXPLAIN on a query and return the plan." + }, + { + "name": "open-connection-window", + "title": "Open Connection in TablePro", + "description": "Open a TablePro connection window so the user can continue work in the GUI." + }, + { + "name": "search-history", + "title": "Search Query History", + "description": "Search the saved TablePro query history by text." + } + ], + "ai": { + "instructions": "TablePro is a native macOS database client. Use list-connections to find a connection by user description, then pass its UUID to other tools. Always describe-table before generating queries against an unknown schema. For mutating SQL (INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, MERGE) the run-query tool will require user confirmation, never bypass that. The connection's external-access setting may reject your query as read-only, surface that error to the user verbatim. Prefer open-connection-window when the user wants to inspect or edit data interactively rather than streaming rows in chat.", + "evals": [ + { + "input": "@tablepro list my connections", + "expected": [ + { + "callsTool": { + "name": "list-connections" + } + } + ], + "mocks": { + "list-connections": [ + { + "id": "3823CB84-BB87-457E-8930-6DB35E210228", + "name": "prod", + "type": "postgresql", + "host": "db.example.com", + "port": 5432 + } + ] + } + }, + { + "input": "@tablepro show me the columns of the users table on my prod connection", + "expected": [ + { + "callsTool": { + "name": "list-connections" + } + }, + { + "callsTool": { + "name": "describe-table", + "arguments": { + "connectionId": "3823CB84-BB87-457E-8930-6DB35E210228", + "table": "users" + } + } + } + ], + "mocks": { + "list-connections": [ + { + "id": "3823CB84-BB87-457E-8930-6DB35E210228", + "name": "prod", + "type": "postgresql", + "host": "db.example.com", + "port": 5432 + } + ], + "describe-table": { + "columns": [ + { "name": "id", "type": "uuid", "nullable": false, "primaryKey": true }, + { "name": "email", "type": "text", "nullable": false } + ] + } + } + }, + { + "input": "@tablepro open my prod connection in TablePro", + "expected": [ + { + "callsTool": { + "name": "list-connections" + } + }, + { + "callsTool": { + "name": "open-connection-window", + "arguments": { + "connectionId": "3823CB84-BB87-457E-8930-6DB35E210228" + } + } + } + ], + "mocks": { + "list-connections": [ + { + "id": "3823CB84-BB87-457E-8930-6DB35E210228", + "name": "prod", + "type": "postgresql", + "host": "db.example.com", + "port": 5432 + } + ], + "open-connection-window": "Opened connection prod in TablePro" + } + } + ] + }, + "preferences": [ + { + "name": "tableProAppPath", + "title": "TablePro App", + "description": "Path to the TablePro app. Used to detect installation and open the app on demand.", + "type": "appPicker", + "required": false, + "default": "/Applications/TablePro.app" + }, + { + "name": "apiToken", + "title": "API Token", + "description": "Token issued by TablePro after pairing. Run the Pair with TablePro command to fill this in.", + "type": "password", + "required": false, + "placeholder": "tp_..." + } + ], + "dependencies": { + "@raycast/api": "^1.83.0", + "@raycast/utils": "^1.18.1" + }, + "devDependencies": { + "@raycast/eslint-config": "^1.0.11", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "eslint": "^8.57.0", + "prettier": "^3.3.3", + "typescript": "~5.6.2" + }, + "scripts": { + "build": "ray build -e dist", + "dev": "ray develop", + "fix-lint": "ray lint --fix", + "lint": "ray lint", + "publish": "npx @raycast/api@latest publish" + } +} diff --git a/extensions/tablepro/src/lib/connections.ts b/extensions/tablepro/src/lib/connections.ts new file mode 100644 index 000000000..37b01f2a6 --- /dev/null +++ b/extensions/tablepro/src/lib/connections.ts @@ -0,0 +1,99 @@ +import { promises as fs } from "fs"; +import { Connection } from "./types"; +import { connectionsFilePath } from "./paths"; + +interface RawConnection { + id?: string; + name?: string; + type?: string; + host?: string; + port?: number; + color?: string; + groupId?: string; + database?: string; + schema?: string; +} + +function isENOENT(error: unknown): boolean { + return ( + typeof error === "object" && + error !== null && + "code" in error && + (error as { code: string }).code === "ENOENT" + ); +} + +function normalize(raw: RawConnection): Connection | null { + if (!raw.id || !raw.name || !raw.type) { + return null; + } + return { + id: raw.id, + name: raw.name, + type: raw.type, + host: raw.host, + port: raw.port, + color: raw.color, + groupId: raw.groupId, + database: raw.database, + schema: raw.schema, + }; +} + +export async function loadConnections(): Promise { + try { + const raw = await fs.readFile(connectionsFilePath(), "utf8"); + const parsed: unknown = JSON.parse(raw); + if (!Array.isArray(parsed)) { + return []; + } + const result: Connection[] = []; + for (const item of parsed) { + const conn = normalize(item as RawConnection); + if (conn) { + result.push(conn); + } + } + return result; + } catch (error) { + if (isENOENT(error)) { + return []; + } + throw error; + } +} + +export async function findConnection( + idOrName: string, +): Promise { + const list = await loadConnections(); + const byId = list.find((c) => c.id === idOrName); + if (byId) return byId; + const lower = idOrName.toLowerCase(); + return list.find((c) => c.name.toLowerCase() === lower); +} + +export function databaseTypeLabel(type: string): string { + const known: Record = { + mysql: "MySQL", + mariadb: "MariaDB", + postgresql: "PostgreSQL", + redshift: "Redshift", + sqlite: "SQLite", + clickhouse: "ClickHouse", + redis: "Redis", + mongodb: "MongoDB", + oracle: "Oracle", + duckdb: "DuckDB", + mssql: "MS SQL", + cassandra: "Cassandra", + etcd: "etcd", + cloudflareD1: "Cloudflare D1", + dynamodb: "DynamoDB", + bigquery: "BigQuery", + libsql: "libSQL", + csv: "CSV", + json: "JSON", + }; + return known[type] ?? type; +} diff --git a/extensions/tablepro/src/lib/deeplink.ts b/extensions/tablepro/src/lib/deeplink.ts new file mode 100644 index 000000000..f06d8cf61 --- /dev/null +++ b/extensions/tablepro/src/lib/deeplink.ts @@ -0,0 +1,64 @@ +import { open } from "@raycast/api"; + +const SCHEME = "tablepro"; + +export async function openConnectionDeeplink( + connectionId: string, +): Promise { + await open(`${SCHEME}://connect/${connectionId}`); +} + +export async function openTableDeeplink( + connectionId: string, + tableName: string, + databaseName?: string, + schemaName?: string, +): Promise { + const encodedTable = encodeURIComponent(tableName); + let url: string; + if (databaseName && schemaName) { + url = `${SCHEME}://connect/${connectionId}/database/${encodeURIComponent(databaseName)}/schema/${encodeURIComponent(schemaName)}/table/${encodedTable}`; + } else if (databaseName) { + url = `${SCHEME}://connect/${connectionId}/database/${encodeURIComponent(databaseName)}/table/${encodedTable}`; + } else { + url = `${SCHEME}://connect/${connectionId}/table/${encodedTable}`; + } + await open(url); +} + +export async function openQueryDeeplink( + connectionId: string, + sql: string, + token?: string, +): Promise { + const params = new URLSearchParams({ sql }); + if (token) { + params.set("token", token); + } + await open( + `${SCHEME}://connect/${connectionId}/query?${params.toString()}`, + ); +} + +export async function startMCPDeeplink(): Promise { + await open(`${SCHEME}://integrations/start-mcp`); +} + +export async function pairDeeplink(params: { + client: string; + challenge: string; + redirect: string; + scopes: string[]; + connectionIds?: string[]; +}): Promise { + const search = new URLSearchParams({ + client: params.client, + challenge: params.challenge, + redirect: params.redirect, + scopes: params.scopes.join(","), + }); + if (params.connectionIds && params.connectionIds.length > 0) { + search.set("connection-ids", params.connectionIds.join(",")); + } + await open(`${SCHEME}://integrations/pair?${search.toString()}`); +} diff --git a/extensions/tablepro/src/lib/empty-state.tsx b/extensions/tablepro/src/lib/empty-state.tsx new file mode 100644 index 000000000..bd5e6c449 --- /dev/null +++ b/extensions/tablepro/src/lib/empty-state.tsx @@ -0,0 +1,123 @@ +import { + Action, + ActionPanel, + Icon, + List, + launchCommand, + LaunchType, + openExtensionPreferences, + open, +} from "@raycast/api"; +import { ErrorScenario, describeScenario } from "./errors"; + +interface Props { + scenario: ErrorScenario; +} + +export function ScenarioEmptyView({ scenario }: Props) { + const { title, description } = describeScenario(scenario); + + switch (scenario.kind) { + case "not-installed": + return ( + + open("https://tablepro.app")} + /> + + } + /> + ); + case "mcp-not-running": + return ( + + + open("tablepro://integrations/start-mcp") + } + /> + + } + /> + ); + case "no-token": + return ( + + { + await launchCommand({ + name: "pair", + type: LaunchType.UserInitiated, + }); + }} + /> + + + } + /> + ); + case "token-revoked": + return ( + + { + await launchCommand({ + name: "pair", + type: LaunchType.UserInitiated, + }); + }} + /> + + } + /> + ); + case "access-denied": + return ( + + ); + case "other": + return ( + + ); + } +} diff --git a/extensions/tablepro/src/lib/errors.ts b/extensions/tablepro/src/lib/errors.ts new file mode 100644 index 000000000..4760d72f7 --- /dev/null +++ b/extensions/tablepro/src/lib/errors.ts @@ -0,0 +1,73 @@ +import { + ExternalAccessDeniedError, + MCPNotRunningError, + TableProNotInstalledError, + TokenMissingError, + TokenRevokedError, +} from "./types"; + +export type ErrorScenario = + | { kind: "not-installed" } + | { kind: "mcp-not-running" } + | { kind: "no-token" } + | { kind: "token-revoked" } + | { kind: "access-denied"; message: string } + | { kind: "other"; message: string }; + +export function classifyError(error: unknown): ErrorScenario { + if (error instanceof TableProNotInstalledError) { + return { kind: "not-installed" }; + } + if (error instanceof MCPNotRunningError) { + return { kind: "mcp-not-running" }; + } + if (error instanceof TokenMissingError) { + return { kind: "no-token" }; + } + if (error instanceof TokenRevokedError) { + return { kind: "token-revoked" }; + } + if (error instanceof ExternalAccessDeniedError) { + return { kind: "access-denied", message: error.message }; + } + if (error instanceof Error) { + return { kind: "other", message: error.message }; + } + return { kind: "other", message: String(error) }; +} + +export function describeScenario(scenario: ErrorScenario): { + title: string; + description: string; +} { + switch (scenario.kind) { + case "not-installed": + return { + title: "TablePro is not installed", + description: + "Install TablePro from tablepro.app to use this extension.", + }; + case "mcp-not-running": + return { + title: "TablePro is not running", + description: + "Open TablePro and try again. The local MCP server starts on demand.", + }; + case "no-token": + return { + title: "Pair with TablePro", + description: + "Run the Pair with TablePro command to issue an API token.", + }; + case "token-revoked": + return { + title: "API token was revoked", + description: + "Run Pair with TablePro again to issue a new token.", + }; + case "access-denied": + return { title: "Access denied", description: scenario.message }; + case "other": + return { title: "TablePro error", description: scenario.message }; + } +} diff --git a/extensions/tablepro/src/lib/mcp.ts b/extensions/tablepro/src/lib/mcp.ts new file mode 100644 index 000000000..24f23bc13 --- /dev/null +++ b/extensions/tablepro/src/lib/mcp.ts @@ -0,0 +1,315 @@ +import { promises as fs } from "fs"; +import { + ColumnInfo, + Connection, + DatabaseInfo, + MCPHandshake, + MCPNotRunningError, + QueryHistoryEntry, + QueryResult, + RecentTab, + SchemaInfo, + TableInfo, + TableProNotInstalledError, + TokenMissingError, + TokenRevokedError, + ExternalAccessDeniedError, + Preferences, +} from "./types"; +import { handshakeFilePath, tableProInstalled } from "./paths"; +import { startMCPDeeplink } from "./deeplink"; +import { getPreferenceValues } from "@raycast/api"; + +interface JsonRpcRequest { + jsonrpc: "2.0"; + id: string; + method: string; + params?: unknown; +} + +interface JsonRpcSuccess { + jsonrpc: "2.0"; + id: string; + result: T; +} + +interface JsonRpcError { + jsonrpc: "2.0"; + id: string; + error: { + code: number; + message: string; + data?: unknown; + }; +} + +type JsonRpcResponse = JsonRpcSuccess | JsonRpcError; + +async function readHandshake(): Promise { + try { + const raw = await fs.readFile(handshakeFilePath(), "utf8"); + const parsed = JSON.parse(raw) as MCPHandshake; + if ( + typeof parsed.port !== "number" || + typeof parsed.token !== "string" + ) { + return null; + } + return parsed; + } catch { + return null; + } +} + +const HANDSHAKE_RETRY_DELAY_MS = 600; +const HANDSHAKE_MAX_RETRIES = 12; + +async function ensureHandshake(allowAutoStart: boolean): Promise { + if (!tableProInstalled()) { + throw new TableProNotInstalledError(); + } + let handshake = await readHandshake(); + if (handshake) return handshake; + if (!allowAutoStart) { + throw new MCPNotRunningError(); + } + await startMCPDeeplink(); + for (let attempt = 0; attempt < HANDSHAKE_MAX_RETRIES; attempt += 1) { + await new Promise((resolve) => + setTimeout(resolve, HANDSHAKE_RETRY_DELAY_MS), + ); + handshake = await readHandshake(); + if (handshake) return handshake; + } + throw new MCPNotRunningError(); +} + +function getApiToken(): string { + const prefs = getPreferenceValues(); + if (!prefs.apiToken || prefs.apiToken.trim() === "") { + throw new TokenMissingError(); + } + return prefs.apiToken.trim(); +} + +let requestCounter = 0; +function nextRequestId(): string { + requestCounter += 1; + return `tp-${Date.now()}-${requestCounter}`; +} + +async function rpc( + method: string, + params: Record = {}, +): Promise { + const handshake = await ensureHandshake(true); + const token = getApiToken(); + const url = `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/v1/mcp`; + const body: JsonRpcRequest = { + jsonrpc: "2.0", + id: nextRequestId(), + method, + params, + }; + let response: Response; + try { + response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(body), + }); + } catch { + throw new MCPNotRunningError(); + } + if (response.status === 401) { + throw new TokenRevokedError(); + } + if (response.status === 403) { + const message = await safeReadError(response); + throw new ExternalAccessDeniedError(message); + } + if (!response.ok) { + throw new Error(`TablePro MCP returned HTTP ${response.status}`); + } + const json = (await response.json()) as JsonRpcResponse; + if ("error" in json) { + const message = json.error.message; + if ( + message.toLowerCase().includes("read-only") || + message.toLowerCase().includes("read only") + ) { + throw new ExternalAccessDeniedError(message); + } + throw new Error(message); + } + return json.result; +} + +async function safeReadError(response: Response): Promise { + try { + const text = await response.text(); + return text || `HTTP ${response.status}`; + } catch { + return `HTTP ${response.status}`; + } +} + +export async function callTool( + name: string, + args: Record = {}, +): Promise { + const result = await rpc<{ + content: Array<{ type: string; text?: string; data?: unknown }>; + }>("tools/call", { + name, + arguments: args, + }); + const first = result.content?.[0]; + if (!first) { + return undefined as T; + } + if (first.data !== undefined) { + return first.data as T; + } + if (first.text !== undefined) { + try { + return JSON.parse(first.text) as T; + } catch { + return first.text as unknown as T; + } + } + return undefined as T; +} + +export async function listConnections(): Promise { + return callTool("list_connections"); +} + +export async function listDatabases( + connectionId: string, +): Promise { + return callTool("list_databases", { + connection_id: connectionId, + }); +} + +export async function listSchemas( + connectionId: string, + database?: string, +): Promise { + return callTool("list_schemas", { + connection_id: connectionId, + database, + }); +} + +export async function listTables( + connectionId: string, + options: { database?: string; schema?: string } = {}, +): Promise { + return callTool("list_tables", { + connection_id: connectionId, + database: options.database, + schema: options.schema, + }); +} + +export async function describeTable( + connectionId: string, + table: string, + options: { database?: string; schema?: string } = {}, +): Promise<{ columns: ColumnInfo[] }> { + return callTool<{ columns: ColumnInfo[] }>("describe_table", { + connection_id: connectionId, + table, + database: options.database, + schema: options.schema, + }); +} + +export async function getTableDDL( + connectionId: string, + table: string, + options: { database?: string; schema?: string } = {}, +): Promise<{ ddl: string }> { + return callTool<{ ddl: string }>("get_table_ddl", { + connection_id: connectionId, + table, + database: options.database, + schema: options.schema, + }); +} + +export async function executeQuery( + connectionId: string, + sql: string, + options: { database?: string; schema?: string; rowLimit?: number } = {}, +): Promise { + return callTool("execute_query", { + connection_id: connectionId, + sql, + database: options.database, + schema: options.schema, + row_limit: options.rowLimit, + }); +} + +export async function explainQuery( + connectionId: string, + sql: string, + options: { database?: string; schema?: string } = {}, +): Promise { + return callTool("execute_query", { + connection_id: connectionId, + sql: `EXPLAIN ${sql}`, + database: options.database, + schema: options.schema, + }); +} + +export async function listRecentTabs(): Promise { + return callTool("list_recent_tabs"); +} + +export async function searchHistory( + query: string, + limit = 50, +): Promise { + return callTool("search_query_history", { + query, + limit, + }); +} + +export async function openConnectionWindow( + connectionId: string, +): Promise { + await callTool("open_connection_window", { + connection_id: connectionId, + }); +} + +export async function exchangePairingCode( + code: string, + codeVerifier: string, +): Promise<{ token: string }> { + const handshake = await ensureHandshake(false); + const url = `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/v1/integrations/exchange`; + const response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ code, code_verifier: codeVerifier }), + }); + if (!response.ok) { + const text = await safeReadError(response); + throw new Error(`Pairing exchange failed: ${text}`); + } + const json = (await response.json()) as { token?: string }; + if (!json.token) { + throw new Error("Pairing exchange returned no token"); + } + return { token: json.token }; +} diff --git a/extensions/tablepro/src/lib/pairing.ts b/extensions/tablepro/src/lib/pairing.ts new file mode 100644 index 000000000..54ce15cc0 --- /dev/null +++ b/extensions/tablepro/src/lib/pairing.ts @@ -0,0 +1,31 @@ +import { randomBytes, createHash } from "crypto"; + +export interface PKCEPair { + verifier: string; + challenge: string; +} + +function base64UrlEncode(buffer: Buffer): string { + return buffer + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, ""); +} + +export function generatePKCE(): PKCEPair { + const verifier = base64UrlEncode(randomBytes(32)); + const challenge = base64UrlEncode( + createHash("sha256").update(verifier).digest(), + ); + return { verifier, challenge }; +} + +export const PAIR_CALLBACK_URL = + "raycast://extensions/datlechin/tablepro/pair-callback"; + +export const STORAGE_KEYS = { + pendingVerifier: "pairing.pendingVerifier", + pendingClient: "pairing.pendingClient", + callbackCode: "pairing.callbackCode", +}; diff --git a/extensions/tablepro/src/lib/paths.ts b/extensions/tablepro/src/lib/paths.ts new file mode 100644 index 000000000..99c9d4493 --- /dev/null +++ b/extensions/tablepro/src/lib/paths.ts @@ -0,0 +1,35 @@ +import { homedir } from "os"; +import { join } from "path"; +import { getPreferenceValues } from "@raycast/api"; +import { existsSync } from "fs"; +import { Preferences } from "./types"; + +const APP_SUPPORT_RELATIVE = "Library/Application Support/com.TablePro"; + +export function appSupportDir(): string { + return join(homedir(), APP_SUPPORT_RELATIVE); +} + +export function connectionsFilePath(): string { + return join(appSupportDir(), "connections.json"); +} + +export function handshakeFilePath(): string { + return join(appSupportDir(), "mcp-handshake.json"); +} + +export function tableProAppPath(): string { + const prefs = getPreferenceValues(); + const value = prefs.tableProAppPath; + if (!value) { + return "/Applications/TablePro.app"; + } + if (typeof value === "string") { + return value; + } + return value.path ?? "/Applications/TablePro.app"; +} + +export function tableProInstalled(): boolean { + return existsSync(tableProAppPath()); +} diff --git a/extensions/tablepro/src/lib/sql.ts b/extensions/tablepro/src/lib/sql.ts new file mode 100644 index 000000000..a449369bd --- /dev/null +++ b/extensions/tablepro/src/lib/sql.ts @@ -0,0 +1,13 @@ +const MUTATING_PATTERN = + /^\s*(?:WITH\s+[\s\S]+?\)\s*)?(?:INSERT|UPDATE|DELETE|DROP|ALTER|TRUNCATE|MERGE|CREATE|REPLACE|GRANT|REVOKE)\b/i; + +export function isMutatingSQL(sql: string): boolean { + if (!sql) return false; + return MUTATING_PATTERN.test(sql); +} + +export function summarizeSQL(sql: string, max = 240): string { + const cleaned = sql.replace(/\s+/g, " ").trim(); + if (cleaned.length <= max) return cleaned; + return cleaned.slice(0, max - 1) + "…"; +} diff --git a/extensions/tablepro/src/lib/types.ts b/extensions/tablepro/src/lib/types.ts new file mode 100644 index 000000000..739b88d60 --- /dev/null +++ b/extensions/tablepro/src/lib/types.ts @@ -0,0 +1,122 @@ +export type DatabaseType = string; + +export interface Connection { + id: string; + name: string; + type: DatabaseType; + host?: string; + port?: number; + color?: string; + groupId?: string; + database?: string; + schema?: string; +} + +export interface ConnectionGroup { + id: string; + name: string; + color?: string; +} + +export interface MCPHandshake { + port: number; + token: string; + pid: number; + protocolVersion: string; + tls: boolean; +} + +export interface DatabaseInfo { + name: string; +} + +export interface SchemaInfo { + name: string; + database?: string; +} + +export interface TableInfo { + name: string; + schema?: string; + database?: string; + rowCount?: number; + type?: string; +} + +export interface ColumnInfo { + name: string; + type: string; + nullable: boolean; + primaryKey?: boolean; + defaultValue?: string | null; + comment?: string | null; +} + +export interface QueryResult { + columns: string[]; + rows: Array>; + affectedRows?: number; + durationMs?: number; + error?: string; +} + +export interface RecentTab { + id: string; + connectionId: string; + connectionName: string; + tabType: "query" | "table" | "structure"; + title: string; + tableName?: string; + databaseName?: string; + updatedAt?: string; +} + +export interface QueryHistoryEntry { + id: string; + connectionId?: string; + connectionName?: string; + query: string; + executedAt: string; + durationMs?: number; + rowCount?: number; +} + +export interface Preferences { + tableProAppPath?: { path: string; bundleId: string; name: string } | string; + apiToken?: string; +} + +export class TableProNotInstalledError extends Error { + constructor() { + super("TablePro is not installed"); + this.name = "TableProNotInstalledError"; + } +} + +export class MCPNotRunningError extends Error { + constructor() { + super("TablePro MCP server is not running"); + this.name = "MCPNotRunningError"; + } +} + +export class TokenMissingError extends Error { + constructor() { + super("No API token. Run the Pair with TablePro command first."); + this.name = "TokenMissingError"; + } +} + +export class TokenRevokedError extends Error { + constructor() { + super("API token was revoked. Pair with TablePro again."); + this.name = "TokenRevokedError"; + } +} + +export class ExternalAccessDeniedError extends Error { + constructor(message: string) { + super(message); + this.name = "ExternalAccessDeniedError"; + } +} diff --git a/extensions/tablepro/src/menu-bar-connections.tsx b/extensions/tablepro/src/menu-bar-connections.tsx new file mode 100644 index 000000000..79b5551d9 --- /dev/null +++ b/extensions/tablepro/src/menu-bar-connections.tsx @@ -0,0 +1,104 @@ +import { + Icon, + MenuBarExtra, + launchCommand, + LaunchType, + open, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { Connection } from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { tableProInstalled } from "./lib/paths"; +import { openConnectionDeeplink } from "./lib/deeplink"; + +const MAX_RECENT = 12; + +export default function MenuBarConnections() { + const [connections, setConnections] = useState(null); + const [installed, setInstalled] = useState(true); + + useEffect(() => { + (async () => { + const present = tableProInstalled(); + setInstalled(present); + if (!present) { + setConnections([]); + return; + } + try { + const list = await loadConnections(); + setConnections(list); + } catch { + setConnections([]); + } + })(); + }, []); + + const isLoading = connections === null; + const recent = (connections ?? []).slice(0, MAX_RECENT); + + return ( + + {!installed ? ( + open("https://tablepro.app")} + /> + ) : null} + {installed && recent.length > 0 ? ( + + {recent.map((connection) => ( + + openConnectionDeeplink(connection.id) + } + /> + ))} + + ) : null} + {installed && recent.length === 0 ? ( + + ) : null} + + + launchCommand({ + name: "search-connections", + type: LaunchType.UserInitiated, + }) + } + /> + + launchCommand({ + name: "recent-tabs", + type: LaunchType.UserInitiated, + }) + } + /> + + launchCommand({ + name: "run-query", + type: LaunchType.UserInitiated, + }) + } + /> + + + ); +} diff --git a/extensions/tablepro/src/open-connection.tsx b/extensions/tablepro/src/open-connection.tsx new file mode 100644 index 000000000..d68236707 --- /dev/null +++ b/extensions/tablepro/src/open-connection.tsx @@ -0,0 +1,46 @@ +import { LaunchProps, showHUD, showToast, Toast, open } from "@raycast/api"; +import { findConnection } from "./lib/connections"; +import { openConnectionDeeplink } from "./lib/deeplink"; +import { tableProInstalled } from "./lib/paths"; + +interface Args { + connection: string; +} + +export default async function OpenConnection( + props: LaunchProps<{ arguments: Args }>, +) { + const query = props.arguments.connection.trim(); + if (!query) { + await showToast({ + style: Toast.Style.Failure, + title: "Connection name required", + }); + return; + } + if (!tableProInstalled()) { + await showToast({ + style: Toast.Style.Failure, + title: "TablePro is not installed", + message: "Install from tablepro.app", + primaryAction: { + title: "Open Website", + onAction: () => { + open("https://tablepro.app"); + }, + }, + }); + return; + } + const match = await findConnection(query); + if (!match) { + await showToast({ + style: Toast.Style.Failure, + title: "Connection not found", + message: query, + }); + return; + } + await openConnectionDeeplink(match.id); + await showHUD(`Opening ${match.name}`); +} diff --git a/extensions/tablepro/src/pair.tsx b/extensions/tablepro/src/pair.tsx new file mode 100644 index 000000000..4479113d9 --- /dev/null +++ b/extensions/tablepro/src/pair.tsx @@ -0,0 +1,342 @@ +import { + Action, + ActionPanel, + Detail, + Form, + Icon, + LaunchProps, + LocalStorage, + Toast, + showToast, + showHUD, + useNavigation, + open, + openExtensionPreferences, + popToRoot, + updateCommandMetadata, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { hostname } from "os"; +import { Connection, TableProNotInstalledError } from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { tableProInstalled } from "./lib/paths"; +import { pairDeeplink } from "./lib/deeplink"; +import { exchangePairingCode } from "./lib/mcp"; +import { generatePKCE, PAIR_CALLBACK_URL, STORAGE_KEYS } from "./lib/pairing"; +import { classifyError } from "./lib/errors"; + +interface LaunchContext { + code?: string; +} + +const SCOPE_OPTIONS = [ + { value: "read", label: "Read-only" }, + { value: "read-write", label: "Read & write" }, + { value: "full", label: "Full access" }, +]; + +export default function PairCommand( + props: LaunchProps<{ launchContext: LaunchContext }>, +) { + const incomingCode = props.launchContext?.code; + if (incomingCode) { + return ; + } + return ; +} + +function PairForm() { + const [connections, setConnections] = useState(null); + const [error, setError] = useState(null); + const [selectedConnections, setSelectedConnections] = useState( + [], + ); + const { push } = useNavigation(); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + const list = await loadConnections(); + if (!cancelled) setConnections(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + } + /> + ); + } + + return ( +
+ { + try { + const { verifier, challenge } = generatePKCE(); + await LocalStorage.setItem( + STORAGE_KEYS.pendingVerifier, + verifier, + ); + await LocalStorage.setItem( + STORAGE_KEYS.pendingClient, + values.client, + ); + await pairDeeplink({ + client: values.client, + challenge, + redirect: PAIR_CALLBACK_URL, + scopes: scopeToList(values.scope), + connectionIds: + values.connections.length > 0 + ? values.connections + : undefined, + }); + push(); + } catch (err) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to start pairing", + message: + err instanceof Error + ? err.message + : String(err), + }); + } + }} + /> + + } + > + + + {SCOPE_OPTIONS.map((option) => ( + + ))} + + + {(connections ?? []).map((connection) => ( + + ))} + + + + ); +} + +function WaitingView() { + const [error, setError] = useState(null); + const [completed, setCompleted] = useState(false); + const { pop } = useNavigation(); + + useEffect(() => { + let cancelled = false; + const handle = setInterval(async () => { + try { + const code = await LocalStorage.getItem( + STORAGE_KEYS.callbackCode, + ); + if (!code) return; + await LocalStorage.removeItem(STORAGE_KEYS.callbackCode); + clearInterval(handle); + const verifier = await LocalStorage.getItem( + STORAGE_KEYS.pendingVerifier, + ); + if (!verifier) { + throw new Error( + "Pairing verifier missing. Restart the pairing flow.", + ); + } + const exchange = await exchangePairingCode(code, verifier); + await persistToken(exchange.token); + await LocalStorage.removeItem(STORAGE_KEYS.pendingVerifier); + await LocalStorage.removeItem(STORAGE_KEYS.pendingClient); + if (cancelled) return; + setCompleted(true); + await showHUD("Paired with TablePro"); + await popToRoot({ clearSearchBar: true }); + } catch (err) { + if (cancelled) return; + setError(err); + clearInterval(handle); + } + }, 1000); + return () => { + cancelled = true; + clearInterval(handle); + }; + }, []); + + if (error) { + return ( + + + + } + /> + ); + } + + const message = completed + ? "Paired. You can close this window." + : "Approve the pairing in TablePro. Come back here once you have approved it."; + + return ( + + ); +} + +function ExchangeView({ code }: { code: string }) { + const [error, setError] = useState(null); + const [done, setDone] = useState(false); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + await LocalStorage.setItem(STORAGE_KEYS.callbackCode, code); + if (!cancelled) setDone(true); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, [code]); + + if (error) { + return ; + } + + return ( + + ); +} + +function scopeToList(scope: string): string[] { + switch (scope) { + case "read": + return ["connections.read", "schema.read", "query.read"]; + case "read-write": + return [ + "connections.read", + "schema.read", + "query.read", + "query.write", + ]; + case "full": + return [ + "connections.read", + "schema.read", + "query.read", + "query.write", + "admin", + ]; + default: + return ["connections.read", "schema.read", "query.read"]; + } +} + +async function persistToken(token: string): Promise { + await LocalStorage.setItem("apiToken", token); + try { + await updateCommandMetadata({ subtitle: "Paired" }); + } catch { + // updateCommandMetadata is best-effort; ignore failures + } + await showToast({ + style: Toast.Style.Success, + title: "Token issued", + message: + "Open extension preferences to paste it into the API Token field.", + primaryAction: { + title: "Open Preferences", + onAction: () => { + openExtensionPreferences(); + }, + }, + }); + await open( + `raycast://extensions/datlechin/tablepro?token=${encodeURIComponent(token)}`, + ).catch(() => undefined); +} + +function renderErrorMarkdown(err: unknown): string { + const scenario = classifyError(err); + switch (scenario.kind) { + case "not-installed": + return "# TablePro is not installed\n\nInstall TablePro from [tablepro.app](https://tablepro.app), then run this command again."; + case "mcp-not-running": + return "# TablePro is not running\n\nOpen TablePro and try again. The MCP server starts on demand."; + case "no-token": + return "# No token yet\n\nFinish the pairing flow to issue one."; + case "token-revoked": + return "# Token was revoked\n\nRun this command to issue a new one."; + case "access-denied": + return `# Access denied\n\n${scenario.message}`; + case "other": + return `# Pairing failed\n\n${scenario.message}`; + } +} diff --git a/extensions/tablepro/src/recent-tabs.tsx b/extensions/tablepro/src/recent-tabs.tsx new file mode 100644 index 000000000..2ad9ed22a --- /dev/null +++ b/extensions/tablepro/src/recent-tabs.tsx @@ -0,0 +1,111 @@ +import { + Action, + ActionPanel, + Icon, + List, + showToast, + Toast, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { RecentTab } from "./lib/types"; +import { listRecentTabs, openConnectionWindow } from "./lib/mcp"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; +import { openTableDeeplink } from "./lib/deeplink"; + +export default function RecentTabsCommand() { + const [tabs, setTabs] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + const list = await listRecentTabs(); + if (!cancelled) setTabs(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + ); + } + + return ( + + {tabs !== null && tabs.length === 0 ? ( + + ) : null} + {(tabs ?? []).map((tab) => ( + + { + try { + if (tab.tableName) { + await openTableDeeplink( + tab.connectionId, + tab.tableName, + tab.databaseName, + ); + } else { + await openConnectionWindow( + tab.connectionId, + ); + } + } catch (err) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to open tab", + message: + err instanceof Error + ? err.message + : String(err), + }); + } + }} + /> + + } + /> + ))} + + ); +} + +function tabIcon(tab: RecentTab): Icon { + switch (tab.tabType) { + case "query": + return Icon.Terminal; + case "table": + return Icon.List; + case "structure": + return Icon.Code; + default: + return Icon.Document; + } +} diff --git a/extensions/tablepro/src/run-query.tsx b/extensions/tablepro/src/run-query.tsx new file mode 100644 index 000000000..75e20cc57 --- /dev/null +++ b/extensions/tablepro/src/run-query.tsx @@ -0,0 +1,335 @@ +import { + Action, + ActionPanel, + Form, + Icon, + List, + Detail, + useNavigation, + showToast, + Toast, + confirmAlert, + Alert, + getPreferenceValues, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { + Connection, + Preferences, + QueryResult, + TableProNotInstalledError, +} from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { tableProInstalled } from "./lib/paths"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; +import { executeQuery } from "./lib/mcp"; +import { openQueryDeeplink } from "./lib/deeplink"; +import { isMutatingSQL, summarizeSQL } from "./lib/sql"; + +export default function RunQueryCommand() { + const [connections, setConnections] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + const list = await loadConnections(); + if (!cancelled) setConnections(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + ); + } + + if (connections === null) { + return ; + } + + if (connections.length === 0) { + return ( + + + + ); + } + + return ; +} + +function QueryForm({ connections }: { connections: Connection[] }) { + const initialId = connections[0]?.id ?? ""; + const [connectionId, setConnectionId] = useState(initialId); + const [sql, setSql] = useState(""); + const { push } = useNavigation(); + + return ( +
+ { + const trimmed = values.sql.trim(); + if (!trimmed) { + await showToast({ + style: Toast.Style.Failure, + title: "SQL is empty", + }); + return; + } + const target = connections.find( + (c) => c.id === values.connection, + ); + if (!target) { + await showToast({ + style: Toast.Style.Failure, + title: "Pick a connection", + }); + return; + } + if (isMutatingSQL(trimmed)) { + const confirmed = await confirmAlert({ + title: "Run mutating query?", + message: summarizeSQL(trimmed), + primaryAction: { + title: "Run", + style: Alert.ActionStyle.Destructive, + }, + }); + if (!confirmed) return; + } + push( + , + ); + }} + /> + { + const target = connections.find( + (c) => c.id === values.connection, + ); + if (!target) return; + const prefs = getPreferenceValues(); + await openQueryDeeplink( + target.id, + values.sql, + prefs.apiToken, + ); + }} + /> + + } + > + + {connections.map((connection) => ( + + ))} + + + + + ); +} + +function RunningView({ + connection, + sql, +}: { + connection: Connection; + sql: string; +}) { + const [result, setResult] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + const data = await executeQuery(connection.id, sql, { + rowLimit: 200, + }); + if (!cancelled) setResult(data); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, [connection.id, sql]); + + if (error) { + return ( + + + + ); + } + + if (!result) { + return ( + + ); + } + + return ; +} + +function ResultView({ + connection, + sql, + result, +}: { + connection: Connection; + sql: string; + result: QueryResult; +}) { + if (result.error) { + return ( + + + openQueryDeeplink(connection.id, sql) + } + /> + + } + /> + ); + } + + if (!result.rows || result.rows.length === 0) { + const summary = + result.affectedRows !== undefined + ? `${result.affectedRows} rows affected` + : "Query returned no rows"; + return ( + + + openQueryDeeplink(connection.id, sql) + } + /> + + } + /> + ); + } + + const markdown = renderResultMarkdown(connection.name, sql, result); + return ( + + openQueryDeeplink(connection.id, sql)} + /> + + + } + /> + ); +} + +function renderResultMarkdown( + connectionName: string, + sql: string, + result: QueryResult, +): string { + const headerRow = `| ${result.columns.join(" | ")} |`; + const separator = `| ${result.columns.map(() => "---").join(" | ")} |`; + const dataRows = result.rows.slice(0, 50).map((row) => { + return `| ${result.columns.map((col) => formatCell(row[col])).join(" | ")} |`; + }); + const previewNote = + result.rows.length > 50 + ? `\n\n_Showing 50 of ${result.rows.length} rows. Open in TablePro for the full grid._` + : ""; + return [ + `# ${connectionName}`, + `${result.rows.length} rows in ${result.durationMs ?? 0} ms`, + "", + "```sql", + sql, + "```", + "", + headerRow, + separator, + ...dataRows, + previewNote, + ].join("\n"); +} + +function formatCell(value: unknown): string { + if (value === null || value === undefined) return "_null_"; + if (typeof value === "string") + return value.replace(/\|/g, "\\|").slice(0, 120); + if (typeof value === "number" || typeof value === "boolean") + return String(value); + try { + return JSON.stringify(value).slice(0, 120); + } catch { + return "_unprintable_"; + } +} diff --git a/extensions/tablepro/src/search-connections.tsx b/extensions/tablepro/src/search-connections.tsx new file mode 100644 index 000000000..c79595bc7 --- /dev/null +++ b/extensions/tablepro/src/search-connections.tsx @@ -0,0 +1,147 @@ +import { + Action, + ActionPanel, + Icon, + List, + showToast, + Toast, + Clipboard, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { Connection, TableProNotInstalledError } from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { tableProInstalled } from "./lib/paths"; +import { openConnectionDeeplink } from "./lib/deeplink"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; + +export default function SearchConnections() { + const [connections, setConnections] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + if (!tableProInstalled()) { + throw new TableProNotInstalledError(); + } + const list = await loadConnections(); + if (!cancelled) setConnections(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + ); + } + + const grouped = groupByType(connections ?? []); + + return ( + + {connections !== null && connections.length === 0 ? ( + + ) : null} + {Object.entries(grouped).map(([type, items]) => ( + + {items.map((connection) => ( + + ))} + + ))} + + ); +} + +function ConnectionRow({ connection }: { connection: Connection }) { + const subtitle = formatSubtitle(connection); + return ( + + { + try { + await openConnectionDeeplink(connection.id); + } catch (err) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to open connection", + message: + err instanceof Error + ? err.message + : String(err), + }); + } + }} + /> + { + await Clipboard.copy( + `tablepro://connect/${connection.id}`, + ); + await showToast({ + style: Toast.Style.Success, + title: "Deep link copied", + }); + }} + /> + + + } + /> + ); +} + +function formatSubtitle(connection: Connection): string { + if (!connection.host) return ""; + if (connection.port) return `${connection.host}:${connection.port}`; + return connection.host; +} + +function groupByType(list: Connection[]): Record { + const map: Record = {}; + for (const conn of list) { + const bucket = map[conn.type] ?? []; + bucket.push(conn); + map[conn.type] = bucket; + } + return map; +} diff --git a/extensions/tablepro/src/search-history.tsx b/extensions/tablepro/src/search-history.tsx new file mode 100644 index 000000000..66ab18410 --- /dev/null +++ b/extensions/tablepro/src/search-history.tsx @@ -0,0 +1,102 @@ +import { + Action, + ActionPanel, + Clipboard, + Icon, + List, + showToast, + Toast, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { QueryHistoryEntry } from "./lib/types"; +import { searchHistory } from "./lib/mcp"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; +import { summarizeSQL } from "./lib/sql"; + +export default function SearchHistoryCommand() { + const [query, setQuery] = useState(""); + const [results, setResults] = useState(null); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + let cancelled = false; + setIsLoading(true); + const handle = setTimeout(async () => { + try { + const data = await searchHistory(query, 100); + if (!cancelled) { + setResults(data); + setError(null); + } + } catch (err) { + if (!cancelled) setError(err); + } finally { + if (!cancelled) setIsLoading(false); + } + }, 200); + return () => { + cancelled = true; + clearTimeout(handle); + }; + }, [query]); + + if (error) { + return ( + + + + ); + } + + return ( + + {results !== null && results.length === 0 ? ( + + ) : null} + {(results ?? []).map((entry) => ( + + { + await Clipboard.copy(entry.query); + await showToast({ + style: Toast.Style.Success, + title: "SQL copied", + }); + }} + /> + + } + /> + ))} + + ); +} diff --git a/extensions/tablepro/src/search-schema.tsx b/extensions/tablepro/src/search-schema.tsx new file mode 100644 index 000000000..eaaf321f0 --- /dev/null +++ b/extensions/tablepro/src/search-schema.tsx @@ -0,0 +1,224 @@ +import { Action, ActionPanel, Icon, List, useNavigation } from "@raycast/api"; +import { useEffect, useState } from "react"; +import { Connection, DatabaseInfo, SchemaInfo } from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { listDatabases, listSchemas, listTables } from "./lib/mcp"; +import { tableProInstalled } from "./lib/paths"; +import { TableProNotInstalledError } from "./lib/types"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; +import SearchTablesView from "./search-tables"; + +export default function SearchSchema() { + const [connections, setConnections] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + const list = await loadConnections(); + if (!cancelled) setConnections(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + ); + } + + return ( + + {connections !== null && connections.length === 0 ? ( + + ) : null} + {(connections ?? []).map((connection) => ( + + + } + /> + + } + /> + ))} + + ); +} + +function DatabasesView({ connection }: { connection: Connection }) { + const [databases, setDatabases] = useState(null); + const [error, setError] = useState(null); + const { push } = useNavigation(); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + const list = await listDatabases(connection.id); + if (!cancelled) setDatabases(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, [connection.id]); + + if (error) { + return ( + + + + ); + } + + return ( + + {databases !== null && databases.length === 0 ? ( + + ) : null} + {(databases ?? []).map((db) => ( + + + push( + , + ) + } + /> + + push( + , + ) + } + /> + + } + /> + ))} + + ); +} + +function SchemasView({ + connection, + database, +}: { + connection: Connection; + database: string; +}) { + const [schemas, setSchemas] = useState(null); + const [error, setError] = useState(null); + const { push } = useNavigation(); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + const list = await listSchemas(connection.id, database); + if (!cancelled) setSchemas(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, [connection.id, database]); + + if (error) { + return ( + + + + ); + } + + return ( + + {schemas !== null && schemas.length === 0 ? ( + + ) : null} + {(schemas ?? []).map((schema) => ( + + { + await listTables(connection.id, { + database, + schema: schema.name, + }); + push( + , + ); + }} + /> + + } + /> + ))} + + ); +} diff --git a/extensions/tablepro/src/search-tables.tsx b/extensions/tablepro/src/search-tables.tsx new file mode 100644 index 000000000..37ec573b8 --- /dev/null +++ b/extensions/tablepro/src/search-tables.tsx @@ -0,0 +1,221 @@ +import { + Action, + ActionPanel, + Clipboard, + Icon, + List, + showToast, + Toast, + useNavigation, +} from "@raycast/api"; +import { useEffect, useState } from "react"; +import { Connection, TableInfo } from "./lib/types"; +import { databaseTypeLabel, loadConnections } from "./lib/connections"; +import { listTables, getTableDDL } from "./lib/mcp"; +import { tableProInstalled } from "./lib/paths"; +import { TableProNotInstalledError } from "./lib/types"; +import { ScenarioEmptyView } from "./lib/empty-state"; +import { classifyError } from "./lib/errors"; +import { openTableDeeplink } from "./lib/deeplink"; + +interface Props { + connection?: Connection; + database?: string; + schema?: string; +} + +export default function SearchTables(props: Props) { + if (!props.connection) { + return ; + } + return ( + + ); +} + +function ConnectionPicker() { + const [connections, setConnections] = useState(null); + const [error, setError] = useState(null); + const { push } = useNavigation(); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + const list = await loadConnections(); + if (!cancelled) setConnections(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, []); + + if (error) { + return ( + + + + ); + } + + return ( + + {connections !== null && connections.length === 0 ? ( + + ) : null} + {(connections ?? []).map((connection) => ( + + + push() + } + /> + + } + /> + ))} + + ); +} + +function TablesList({ + connection, + database, + schema, +}: { + connection: Connection; + database?: string; + schema?: string; +}) { + const [tables, setTables] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + (async () => { + try { + const list = await listTables(connection.id, { + database, + schema, + }); + if (!cancelled) setTables(list); + } catch (err) { + if (!cancelled) setError(err); + } + })(); + return () => { + cancelled = true; + }; + }, [connection.id, database, schema]); + + if (error) { + return ( + + + + ); + } + + const navTitle = [connection.name, database, schema] + .filter(Boolean) + .join(" / "); + + return ( + + {tables !== null && tables.length === 0 ? ( + + ) : null} + {(tables ?? []).map((table) => ( + + { + await openTableDeeplink( + connection.id, + table.name, + database, + table.schema ?? schema, + ); + }} + /> + { + try { + const result = await getTableDDL( + connection.id, + table.name, + { + database, + schema: table.schema ?? schema, + }, + ); + await Clipboard.copy(result.ddl); + await showToast({ + style: Toast.Style.Success, + title: "DDL copied", + }); + } catch (err) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to fetch DDL", + message: + err instanceof Error + ? err.message + : String(err), + }); + } + }} + /> + + + } + /> + ))} + + ); +} diff --git a/extensions/tablepro/src/tools/describe-table.ts b/extensions/tablepro/src/tools/describe-table.ts new file mode 100644 index 000000000..6832864b7 --- /dev/null +++ b/extensions/tablepro/src/tools/describe-table.ts @@ -0,0 +1,22 @@ +import { ColumnInfo } from "../lib/types"; +import { describeTable } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** Table name. */ + table: string; + /** Database name. Optional. */ + database?: string; + /** Schema name. Optional. */ + schema?: string; +}; + +export default async function tool( + input: Input, +): Promise<{ columns: ColumnInfo[] }> { + return describeTable(input.connectionId, input.table, { + database: input.database, + schema: input.schema, + }); +} diff --git a/extensions/tablepro/src/tools/explain-query.ts b/extensions/tablepro/src/tools/explain-query.ts new file mode 100644 index 000000000..f4bcd93d8 --- /dev/null +++ b/extensions/tablepro/src/tools/explain-query.ts @@ -0,0 +1,20 @@ +import { QueryResult } from "../lib/types"; +import { explainQuery } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** SQL to explain. The tool wraps it with EXPLAIN before running. */ + sql: string; + /** Database to scope the query to. Optional. */ + database?: string; + /** Schema to scope the query to. Optional. */ + schema?: string; +}; + +export default async function tool(input: Input): Promise { + return explainQuery(input.connectionId, input.sql, { + database: input.database, + schema: input.schema, + }); +} diff --git a/extensions/tablepro/src/tools/get-table-ddl.ts b/extensions/tablepro/src/tools/get-table-ddl.ts new file mode 100644 index 000000000..d5322a1bf --- /dev/null +++ b/extensions/tablepro/src/tools/get-table-ddl.ts @@ -0,0 +1,19 @@ +import { getTableDDL } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** Table name. */ + table: string; + /** Database name. Optional. */ + database?: string; + /** Schema name. Optional. */ + schema?: string; +}; + +export default async function tool(input: Input): Promise<{ ddl: string }> { + return getTableDDL(input.connectionId, input.table, { + database: input.database, + schema: input.schema, + }); +} diff --git a/extensions/tablepro/src/tools/list-connections.ts b/extensions/tablepro/src/tools/list-connections.ts new file mode 100644 index 000000000..7c90cfbd3 --- /dev/null +++ b/extensions/tablepro/src/tools/list-connections.ts @@ -0,0 +1,15 @@ +import { Connection } from "../lib/types"; +import { loadConnections } from "../lib/connections"; +import { listConnections } from "../lib/mcp"; + +/** + * List all saved TablePro connections. Reads connections.json directly when no + * token is paired so the model can still discover what is available. + */ +export default async function tool(): Promise { + try { + return await listConnections(); + } catch { + return loadConnections(); + } +} diff --git a/extensions/tablepro/src/tools/list-databases.ts b/extensions/tablepro/src/tools/list-databases.ts new file mode 100644 index 000000000..592ae492d --- /dev/null +++ b/extensions/tablepro/src/tools/list-databases.ts @@ -0,0 +1,11 @@ +import { DatabaseInfo } from "../lib/types"; +import { listDatabases } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. Get this from list-connections. */ + connectionId: string; +}; + +export default async function tool(input: Input): Promise { + return listDatabases(input.connectionId); +} diff --git a/extensions/tablepro/src/tools/list-schemas.ts b/extensions/tablepro/src/tools/list-schemas.ts new file mode 100644 index 000000000..fe9bd4896 --- /dev/null +++ b/extensions/tablepro/src/tools/list-schemas.ts @@ -0,0 +1,13 @@ +import { SchemaInfo } from "../lib/types"; +import { listSchemas } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** Database to list schemas for. Optional for engines that don't separate databases and schemas. */ + database?: string; +}; + +export default async function tool(input: Input): Promise { + return listSchemas(input.connectionId, input.database); +} diff --git a/extensions/tablepro/src/tools/list-tables.ts b/extensions/tablepro/src/tools/list-tables.ts new file mode 100644 index 000000000..5eed8a4db --- /dev/null +++ b/extensions/tablepro/src/tools/list-tables.ts @@ -0,0 +1,18 @@ +import { TableInfo } from "../lib/types"; +import { listTables } from "../lib/mcp"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** Database name. Optional. */ + database?: string; + /** Schema name. Optional. */ + schema?: string; +}; + +export default async function tool(input: Input): Promise { + return listTables(input.connectionId, { + database: input.database, + schema: input.schema, + }); +} diff --git a/extensions/tablepro/src/tools/open-connection-window.ts b/extensions/tablepro/src/tools/open-connection-window.ts new file mode 100644 index 000000000..a7c43bb93 --- /dev/null +++ b/extensions/tablepro/src/tools/open-connection-window.ts @@ -0,0 +1,16 @@ +import { openConnectionWindow } from "../lib/mcp"; +import { openConnectionDeeplink } from "../lib/deeplink"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; +}; + +export default async function tool(input: Input): Promise<{ opened: true }> { + try { + await openConnectionWindow(input.connectionId); + } catch { + await openConnectionDeeplink(input.connectionId); + } + return { opened: true }; +} diff --git a/extensions/tablepro/src/tools/run-query.ts b/extensions/tablepro/src/tools/run-query.ts new file mode 100644 index 000000000..409ec0bf1 --- /dev/null +++ b/extensions/tablepro/src/tools/run-query.ts @@ -0,0 +1,63 @@ +import { Action, Tool } from "@raycast/api"; +import { QueryResult } from "../lib/types"; +import { executeQuery } from "../lib/mcp"; +import { listConnections } from "../lib/mcp"; +import { loadConnections } from "../lib/connections"; +import { isMutatingSQL, summarizeSQL } from "../lib/sql"; + +type Input = { + /** UUID of the TablePro connection. */ + connectionId: string; + /** SQL to run. Mutating statements ask for explicit user approval before running. */ + sql: string; + /** Database to scope the query to. Optional. */ + database?: string; + /** Schema to scope the query to. Optional. */ + schema?: string; + /** Maximum rows to return. Defaults to 200. */ + rowLimit?: number; +}; + +export default async function tool(input: Input): Promise { + return executeQuery(input.connectionId, input.sql, { + database: input.database, + schema: input.schema, + rowLimit: input.rowLimit ?? 200, + }); +} + +export const confirmation: Tool.Confirmation = async (input) => { + if (!isMutatingSQL(input.sql)) { + return undefined; + } + const connectionName = await resolveConnectionName(input.connectionId); + const info: { name: string; value?: string }[] = [ + { name: "Connection", value: connectionName }, + { name: "SQL", value: summarizeSQL(input.sql) }, + ]; + if (input.database) info.push({ name: "Database", value: input.database }); + if (input.schema) info.push({ name: "Schema", value: input.schema }); + return { + style: Action.Style.Destructive, + message: `This query mutates data. Run it on ${connectionName}?`, + info, + }; +}; + +async function resolveConnectionName(connectionId: string): Promise { + try { + const list = await listConnections(); + const match = list.find((c) => c.id === connectionId); + if (match) return match.name; + } catch { + // fall through to local file + } + try { + const list = await loadConnections(); + const match = list.find((c) => c.id === connectionId); + if (match) return match.name; + } catch { + // ignore + } + return connectionId; +} diff --git a/extensions/tablepro/src/tools/search-history.ts b/extensions/tablepro/src/tools/search-history.ts new file mode 100644 index 000000000..d5af46228 --- /dev/null +++ b/extensions/tablepro/src/tools/search-history.ts @@ -0,0 +1,13 @@ +import { QueryHistoryEntry } from "../lib/types"; +import { searchHistory } from "../lib/mcp"; + +type Input = { + /** Free-text search across query bodies and connection names. */ + query: string; + /** Maximum results to return. Defaults to 50. */ + limit?: number; +}; + +export default async function tool(input: Input): Promise { + return searchHistory(input.query, input.limit ?? 50); +} diff --git a/extensions/tablepro/tsconfig.json b/extensions/tablepro/tsconfig.json new file mode 100644 index 000000000..13451feb4 --- /dev/null +++ b/extensions/tablepro/tsconfig.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "include": ["src/**/*", "raycast-env.d.ts"], + "compilerOptions": { + "lib": ["es2022"], + "module": "commonjs", + "target": "ES2022", + "strict": true, + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "resolveJsonModule": true, + "noUncheckedIndexedAccess": true + } +} From 54ca4f275876e72d0fc59492f219ffe2e43bf541 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:06:35 +0700 Subject: [PATCH 07/83] feat(integrations): audit log storage and new MCP tools --- TablePro/Core/MCP/MCPAuditLogStorage.swift | 296 +++++++++++++++++ TablePro/Core/MCP/MCPAuditLogger.swift | 193 +++++++++++ TablePro/Core/MCP/MCPRouter.swift | 97 ++++++ .../MCP/MCPToolHandler+Integrations.swift | 271 +++++++++++++++ TablePro/Core/MCP/MCPToolHandler.swift | 104 +++++- TablePro/Models/AuditEntry.swift | 112 +++++++ .../Views/Main/MainContentCoordinator.swift | 5 + .../Settings/Sections/MCPAuditLogView.swift | 209 ++++++++++++ .../Views/Settings/Sections/MCPSection.swift | 9 + .../Core/MCP/MCPAuditLogStorageTests.swift | 210 ++++++++++++ .../MCP/MCPToolHandlerIntegrationTests.swift | 308 ++++++++++++++++++ 11 files changed, 1803 insertions(+), 11 deletions(-) create mode 100644 TablePro/Core/MCP/MCPAuditLogStorage.swift create mode 100644 TablePro/Core/MCP/MCPToolHandler+Integrations.swift create mode 100644 TablePro/Models/AuditEntry.swift create mode 100644 TablePro/Views/Settings/Sections/MCPAuditLogView.swift create mode 100644 TableProTests/Core/MCP/MCPAuditLogStorageTests.swift create mode 100644 TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift diff --git a/TablePro/Core/MCP/MCPAuditLogStorage.swift b/TablePro/Core/MCP/MCPAuditLogStorage.swift new file mode 100644 index 000000000..5d296107e --- /dev/null +++ b/TablePro/Core/MCP/MCPAuditLogStorage.swift @@ -0,0 +1,296 @@ +// +// MCPAuditLogStorage.swift +// TablePro +// + +import Foundation +import os +import SQLite3 + +actor MCPAuditLogStorage { + static let shared = MCPAuditLogStorage() + private static let logger = Logger(subsystem: "com.TablePro", category: "MCPAuditLogStorage") + + private static let retentionDays: Int = 90 + + private static let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) + + private static var isRunningTests: Bool { + NSClassFromString("XCTestCase") != nil + } + + private var db: OpaquePointer? + private var dbPath: String? + private let testDatabaseSuffix: String? + + enum TimeRange: Equatable { + case lastHours(Int) + case lastDays(Int) + case all + } + + init() { + self.testDatabaseSuffix = nil + setupDatabase() + prune(olderThan: Self.retentionDays) + } + + #if DEBUG + init(isolatedForTesting: Bool) { + self.testDatabaseSuffix = isolatedForTesting ? "_\(UUID().uuidString)" : nil + setupDatabase() + prune(olderThan: Self.retentionDays) + } + #endif + + deinit { + if let db { + sqlite3_close(db) + } + if Self.isRunningTests, let dbPath { + try? FileManager.default.removeItem(atPath: dbPath) + for suffix in ["-wal", "-shm"] { + try? FileManager.default.removeItem(atPath: dbPath + suffix) + } + } + } + + // MARK: - Database Setup + + private func setupDatabase() { + let fileManager = FileManager.default + guard + let appSupport = fileManager.urls( + for: .applicationSupportDirectory, in: .userDomainMask + ).first + else { + Self.logger.error("Unable to access application support directory") + return + } + let directory = appSupport.appendingPathComponent("com.TablePro") + try? fileManager.createDirectory(at: directory, withIntermediateDirectories: true) + + let suffix = testDatabaseSuffix ?? "" + let fileName = Self.isRunningTests + ? "mcp-audit-test_\(ProcessInfo.processInfo.processIdentifier)\(suffix).db" + : "mcp-audit.db" + let path = directory.appendingPathComponent(fileName).path(percentEncoded: false) + self.dbPath = path + + if sqlite3_open(path, &db) != SQLITE_OK { + Self.logger.error("Error opening MCP audit database") + return + } + + execute("PRAGMA journal_mode=WAL;") + execute("PRAGMA synchronous=NORMAL;") + + createTables() + } + + private func createTables() { + execute(""" + CREATE TABLE IF NOT EXISTS audit_entries ( + id TEXT PRIMARY KEY, + timestamp REAL NOT NULL, + category TEXT NOT NULL, + token_id TEXT, + token_name TEXT, + connection_id TEXT, + action TEXT NOT NULL, + outcome TEXT NOT NULL, + details TEXT + ); + """) + execute("CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_entries(timestamp DESC);") + execute("CREATE INDEX IF NOT EXISTS idx_audit_token ON audit_entries(token_id, timestamp DESC);") + } + + private func execute(_ sql: String) { + var statement: OpaquePointer? + if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK { + sqlite3_step(statement) + } + sqlite3_finalize(statement) + } + + // MARK: - Insert + + @discardableResult + func addEntry(_ entry: AuditEntry) -> Bool { + let sql = """ + INSERT OR REPLACE INTO audit_entries + (id, timestamp, category, token_id, token_name, connection_id, action, outcome, details) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); + """ + + var statement: OpaquePointer? + guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { + Self.logger.warning("Failed to prepare audit insert statement") + return false + } + defer { sqlite3_finalize(statement) } + + sqlite3_bind_text(statement, 1, entry.id.uuidString, -1, Self.SQLITE_TRANSIENT) + sqlite3_bind_double(statement, 2, entry.timestamp.timeIntervalSince1970) + sqlite3_bind_text(statement, 3, entry.category.rawValue, -1, Self.SQLITE_TRANSIENT) + + if let tokenId = entry.tokenId?.uuidString { + sqlite3_bind_text(statement, 4, tokenId, -1, Self.SQLITE_TRANSIENT) + } else { + sqlite3_bind_null(statement, 4) + } + + if let tokenName = entry.tokenName { + sqlite3_bind_text(statement, 5, tokenName, -1, Self.SQLITE_TRANSIENT) + } else { + sqlite3_bind_null(statement, 5) + } + + if let connectionId = entry.connectionId?.uuidString { + sqlite3_bind_text(statement, 6, connectionId, -1, Self.SQLITE_TRANSIENT) + } else { + sqlite3_bind_null(statement, 6) + } + + sqlite3_bind_text(statement, 7, entry.action, -1, Self.SQLITE_TRANSIENT) + sqlite3_bind_text(statement, 8, entry.outcome, -1, Self.SQLITE_TRANSIENT) + + if let details = entry.details { + sqlite3_bind_text(statement, 9, details, -1, Self.SQLITE_TRANSIENT) + } else { + sqlite3_bind_null(statement, 9) + } + + return sqlite3_step(statement) == SQLITE_DONE + } + + // MARK: - Query + + func query( + category: AuditCategory? = nil, + tokenId: UUID? = nil, + since: Date? = nil, + limit: Int = 500 + ) -> [AuditEntry] { + var conditions: [String] = [] + if category != nil { conditions.append("category = ?") } + if tokenId != nil { conditions.append("token_id = ?") } + if since != nil { conditions.append("timestamp >= ?") } + + var sql = """ + SELECT id, timestamp, category, token_id, token_name, connection_id, action, outcome, details + FROM audit_entries + """ + if !conditions.isEmpty { + sql += " WHERE " + conditions.joined(separator: " AND ") + } + sql += " ORDER BY timestamp DESC LIMIT ?;" + + var statement: OpaquePointer? + guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { + Self.logger.warning("Failed to prepare audit query statement") + return [] + } + defer { sqlite3_finalize(statement) } + + var bindIndex: Int32 = 1 + if let category { + sqlite3_bind_text(statement, bindIndex, category.rawValue, -1, Self.SQLITE_TRANSIENT) + bindIndex += 1 + } + if let tokenId { + sqlite3_bind_text(statement, bindIndex, tokenId.uuidString, -1, Self.SQLITE_TRANSIENT) + bindIndex += 1 + } + if let since { + sqlite3_bind_double(statement, bindIndex, since.timeIntervalSince1970) + bindIndex += 1 + } + sqlite3_bind_int(statement, bindIndex, Int32(limit)) + + var entries: [AuditEntry] = [] + while sqlite3_step(statement) == SQLITE_ROW { + if let entry = parseEntry(statement) { + entries.append(entry) + } + } + return entries + } + + func count() -> Int { + var statement: OpaquePointer? + guard sqlite3_prepare_v2(db, "SELECT COUNT(*) FROM audit_entries;", -1, &statement, nil) == SQLITE_OK else { + return 0 + } + defer { sqlite3_finalize(statement) } + if sqlite3_step(statement) == SQLITE_ROW { + return Int(sqlite3_column_int(statement, 0)) + } + return 0 + } + + // MARK: - Prune + + @discardableResult + func prune(olderThan days: Int) -> Int { + guard days > 0 else { return 0 } + let cutoff = Date().addingTimeInterval(-Double(days) * 86_400) + let sql = "DELETE FROM audit_entries WHERE timestamp < ?;" + + var statement: OpaquePointer? + guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { + return 0 + } + defer { sqlite3_finalize(statement) } + + sqlite3_bind_double(statement, 1, cutoff.timeIntervalSince1970) + guard sqlite3_step(statement) == SQLITE_DONE else { return 0 } + return Int(sqlite3_changes(db)) + } + + @discardableResult + func deleteAll() -> Bool { + var statement: OpaquePointer? + guard sqlite3_prepare_v2(db, "DELETE FROM audit_entries;", -1, &statement, nil) == SQLITE_OK else { + return false + } + defer { sqlite3_finalize(statement) } + return sqlite3_step(statement) == SQLITE_DONE + } + + // MARK: - Parsing + + private func parseEntry(_ statement: OpaquePointer?) -> AuditEntry? { + guard let statement, + let idCString = sqlite3_column_text(statement, 0), + let id = UUID(uuidString: String(cString: idCString)), + let categoryCString = sqlite3_column_text(statement, 2), + let category = AuditCategory(rawValue: String(cString: categoryCString)), + let actionCString = sqlite3_column_text(statement, 6), + let outcomeCString = sqlite3_column_text(statement, 7) + else { + return nil + } + + let timestamp = Date(timeIntervalSince1970: sqlite3_column_double(statement, 1)) + let tokenId = sqlite3_column_text(statement, 3).flatMap { UUID(uuidString: String(cString: $0)) } + let tokenName = sqlite3_column_text(statement, 4).map { String(cString: $0) } + let connectionId = sqlite3_column_text(statement, 5).flatMap { UUID(uuidString: String(cString: $0)) } + let action = String(cString: actionCString) + let outcome = String(cString: outcomeCString) + let details = sqlite3_column_text(statement, 8).map { String(cString: $0) } + + return AuditEntry( + id: id, + timestamp: timestamp, + category: category, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: action, + outcome: outcome, + details: details + ) + } +} diff --git a/TablePro/Core/MCP/MCPAuditLogger.swift b/TablePro/Core/MCP/MCPAuditLogger.swift index 250c2999e..4d82f2ec4 100644 --- a/TablePro/Core/MCP/MCPAuditLogger.swift +++ b/TablePro/Core/MCP/MCPAuditLogger.swift @@ -5,36 +5,229 @@ enum MCPAuditLogger { private static let serverAuth = Logger(subsystem: "com.TablePro", category: "MCPAuth") private static let serverAccess = Logger(subsystem: "com.TablePro", category: "MCPAccess") private static let serverAdmin = Logger(subsystem: "com.TablePro", category: "MCPAdmin") + private static let serverQuery = Logger(subsystem: "com.TablePro", category: "MCPQuery") + private static let serverTool = Logger(subsystem: "com.TablePro", category: "MCPTool") + private static let serverResource = Logger(subsystem: "com.TablePro", category: "MCPResource") + + private static let sqlExcerptLimit = 256 + + // MARK: - Auth static func logAuthSuccess(tokenName: String, ip: String) { serverAuth.info("Auth success: token=\(tokenName, privacy: .public) ip=\(ip, privacy: .public)") + record( + category: .auth, + tokenName: tokenName, + action: "auth.success", + outcome: .success, + details: "ip=\(ip)" + ) } static func logAuthFailure(reason: String, ip: String) { serverAuth.warning("Auth failure: reason=\(reason, privacy: .public) ip=\(ip, privacy: .public)") + record( + category: .auth, + action: "auth.failure", + outcome: .denied, + details: "ip=\(ip) reason=\(reason)" + ) } static func logRateLimited(ip: String, retryAfterSeconds: Int) { serverAuth.warning( "Rate limited: ip=\(ip, privacy: .public) retryAfter=\(retryAfterSeconds, privacy: .public)s" ) + record( + category: .auth, + action: "auth.rateLimited", + outcome: .rateLimited, + details: "ip=\(ip) retryAfter=\(retryAfterSeconds)s" + ) } + // MARK: - Admin + static func logTokenCreated(tokenName: String) { serverAdmin.info("Token created: \(tokenName, privacy: .public)") + record( + category: .admin, + tokenName: tokenName, + action: "token.created", + outcome: .success + ) } static func logTokenRevoked(tokenName: String) { serverAdmin.info("Token revoked: \(tokenName, privacy: .public)") + record( + category: .admin, + tokenName: tokenName, + action: "token.revoked", + outcome: .success + ) } static func logServerStarted(port: UInt16, remoteAccess: Bool, tlsEnabled: Bool) { serverAdmin.info( "MCP server started: port=\(port, privacy: .public) remote=\(remoteAccess, privacy: .public) tls=\(tlsEnabled, privacy: .public)" ) + record( + category: .admin, + action: "server.started", + outcome: .success, + details: "port=\(port) remote=\(remoteAccess) tls=\(tlsEnabled)" + ) } static func logServerStopped() { serverAdmin.info("MCP server stopped") + record( + category: .admin, + action: "server.stopped", + outcome: .success + ) + } + + // MARK: - Query + + static func logQueryExecuted( + tokenId: UUID?, + tokenName: String?, + connectionId: UUID, + sql: String, + durationMs: Int, + rowCount: Int, + outcome: AuditOutcome, + errorMessage: String? = nil + ) { + serverQuery.info( + """ + Query: token=\(tokenName ?? "-", privacy: .public) \ + connection=\(connectionId, privacy: .public) \ + duration=\(durationMs, privacy: .public)ms \ + rows=\(rowCount, privacy: .public) \ + outcome=\(outcome.rawValue, privacy: .public) \ + sql=\(sql, privacy: .private) + """ + ) + + var detailParts: [String] = [ + "duration=\(durationMs)ms", + "rows=\(rowCount)", + "sql=\(truncate(sql, to: sqlExcerptLimit))" + ] + if let errorMessage { + detailParts.append("error=\(truncate(errorMessage, to: 256))") + } + + record( + category: .query, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: "query.executed", + outcome: outcome, + details: detailParts.joined(separator: " ") + ) + } + + // MARK: - Tool + + static func logToolCalled( + tokenId: UUID?, + tokenName: String?, + toolName: String, + connectionId: UUID? = nil, + outcome: AuditOutcome, + errorMessage: String? = nil + ) { + serverTool.info( + """ + Tool: token=\(tokenName ?? "-", privacy: .public) \ + tool=\(toolName, privacy: .public) \ + connection=\(connectionId?.uuidString ?? "-", privacy: .public) \ + outcome=\(outcome.rawValue, privacy: .public) + """ + ) + + var detailParts: [String] = ["tool=\(toolName)"] + if let errorMessage { + detailParts.append("error=\(truncate(errorMessage, to: 256))") + } + + record( + category: .tool, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: "tool.\(toolName)", + outcome: outcome, + details: detailParts.joined(separator: " ") + ) + } + + // MARK: - Resource + + static func logResourceRead( + tokenId: UUID?, + tokenName: String?, + uri: String, + outcome: AuditOutcome, + errorMessage: String? = nil + ) { + serverResource.info( + """ + Resource: token=\(tokenName ?? "-", privacy: .public) \ + uri=\(uri, privacy: .public) \ + outcome=\(outcome.rawValue, privacy: .public) + """ + ) + + var detailParts: [String] = ["uri=\(uri)"] + if let errorMessage { + detailParts.append("error=\(truncate(errorMessage, to: 256))") + } + + record( + category: .resource, + tokenId: tokenId, + tokenName: tokenName, + action: "resource.read", + outcome: outcome, + details: detailParts.joined(separator: " ") + ) + } + + // MARK: - Storage Bridge + + private static func record( + category: AuditCategory, + tokenId: UUID? = nil, + tokenName: String? = nil, + connectionId: UUID? = nil, + action: String, + outcome: AuditOutcome, + details: String? = nil + ) { + let entry = AuditEntry( + category: category, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: action, + outcome: outcome, + details: details + ) + Task { + await MCPAuditLogStorage.shared.addEntry(entry) + } + } + + private static func truncate(_ text: String, to limit: Int) -> String { + let nsText = text as NSString + guard nsText.length > limit else { return text } + let prefix = nsText.substring(to: limit) + return prefix + "..." } } diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index eccbf9829..8caf1fae2 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -860,6 +860,103 @@ extension MCPRouter { ) ] } + + private static func integrationTools() -> [MCPToolDefinition] { + [ + MCPToolDefinition( + name: "list_recent_tabs", + description: "List currently open tabs across all TablePro windows. " + + "Returns connection, tab type, table name, and titles for each tab.", + inputSchema: .object([ + "type": "object", + "properties": .object([ + "limit": .object([ + "type": "integer", + "description": "Maximum number of tabs to return (default 20, max 500)" + ]) + ]), + "required": .array([]) + ]) + ), + MCPToolDefinition( + name: "search_query_history", + description: "Search saved query history. " + + "Returns matching entries with execution time, row count, and outcome.", + inputSchema: .object([ + "type": "object", + "properties": .object([ + "query": .object([ + "type": "string", + "description": "Search text (full-text matched against the query column)" + ]), + "connection_id": .object([ + "type": "string", + "description": "Restrict to a specific connection (UUID, optional)" + ]), + "limit": .object([ + "type": "integer", + "description": "Maximum number of entries to return (default 50, max 500)" + ]) + ]), + "required": .array([.string("query")]) + ]) + ), + MCPToolDefinition( + name: "open_connection_window", + description: "Open a TablePro window for a saved connection (focuses if already open).", + inputSchema: .object([ + "type": "object", + "properties": .object([ + "connection_id": .object([ + "type": "string", + "description": "UUID of the saved connection" + ]) + ]), + "required": .array([.string("connection_id")]) + ]) + ), + MCPToolDefinition( + name: "open_table_tab", + description: "Open a table tab in TablePro for the given connection.", + inputSchema: .object([ + "type": "object", + "properties": .object([ + "connection_id": .object([ + "type": "string", + "description": "UUID of the connection" + ]), + "table_name": .object([ + "type": "string", + "description": "Table name to open" + ]), + "database_name": .object([ + "type": "string", + "description": "Database name (uses connection's current database if omitted)" + ]), + "schema_name": .object([ + "type": "string", + "description": "Schema name (for multi-schema databases)" + ]) + ]), + "required": .array([.string("connection_id"), .string("table_name")]) + ]) + ), + MCPToolDefinition( + name: "focus_query_tab", + description: "Focus an already-open tab by id (returned from list_recent_tabs).", + inputSchema: .object([ + "type": "object", + "properties": .object([ + "tab_id": .object([ + "type": "string", + "description": "UUID of the tab to focus" + ]) + ]), + "required": .array([.string("tab_id")]) + ]) + ) + ] + } } extension MCPRouter { diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift new file mode 100644 index 000000000..17e858688 --- /dev/null +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -0,0 +1,271 @@ +// +// MCPToolHandler+Integrations.swift +// TablePro +// + +import AppKit +import Foundation + +extension MCPToolHandler { + // MARK: - list_recent_tabs + + func handleListRecentTabs(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + let limit = optionalInt(args, key: "limit", default: 20, clamp: 1...500) + + let snapshots = await MainActor.run { Self.collectTabSnapshots() } + let allowed = token?.allowedConnectionIds + let filtered: [TabSnapshot] + if let allowed { + filtered = snapshots.filter { allowed.contains($0.connectionId) } + } else { + filtered = snapshots + } + + let trimmed = Array(filtered.prefix(limit)) + let payload = trimmed.map { snapshot -> JSONValue in + var dict: [String: JSONValue] = [ + "connection_id": .string(snapshot.connectionId.uuidString), + "connection_name": .string(snapshot.connectionName), + "tab_id": .string(snapshot.tabId.uuidString), + "tab_type": .string(snapshot.tabType), + "display_title": .string(snapshot.displayTitle), + "is_active": .bool(snapshot.isActive) + ] + if let table = snapshot.tableName { + dict["table_name"] = .string(table) + } + if let database = snapshot.databaseName { + dict["database_name"] = .string(database) + } + if let schema = snapshot.schemaName { + dict["schema_name"] = .string(schema) + } + if let windowId = snapshot.windowId { + dict["window_id"] = .string(windowId.uuidString) + } + return .object(dict) + } + + return MCPToolResult(content: [.text(encodeJSON(.object(["tabs": .array(payload)])))], isError: nil) + } + + // MARK: - search_query_history + + func handleSearchQueryHistory(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + let query = try requireString(args, key: "query") + let connectionIdString = optionalString(args, key: "connection_id") + let limit = optionalInt(args, key: "limit", default: 50, clamp: 1...500) + + let connectionId: UUID? + if let connectionIdString { + guard let parsed = UUID(uuidString: connectionIdString) else { + throw MCPError.invalidParams("Invalid UUID for parameter: connection_id") + } + if let token { try checkTokenConnectionAccess(token, connectionId: parsed) } + connectionId = parsed + } else { + connectionId = nil + } + + let entries = await QueryHistoryStorage.shared.fetchHistory( + limit: limit, + offset: 0, + connectionId: connectionId, + searchText: query.isEmpty ? nil : query, + dateFilter: .all + ) + + let allowed = token?.allowedConnectionIds + let filtered: [QueryHistoryEntry] + if let allowed { + filtered = entries.filter { allowed.contains($0.connectionId) } + } else { + filtered = entries + } + + let payload = filtered.map { entry -> JSONValue in + var dict: [String: JSONValue] = [ + "id": .string(entry.id.uuidString), + "query": .string(entry.query), + "connection_id": .string(entry.connectionId.uuidString), + "database_name": .string(entry.databaseName), + "executed_at": .double(entry.executedAt.timeIntervalSince1970), + "execution_time_ms": .double(entry.executionTime * 1_000), + "row_count": .int(entry.rowCount), + "was_successful": .bool(entry.wasSuccessful) + ] + if let error = entry.errorMessage { + dict["error_message"] = .string(error) + } + return .object(dict) + } + + return MCPToolResult(content: [.text(encodeJSON(.object(["entries": .array(payload)])))], isError: nil) + } + + // MARK: - open_connection_window + + func handleOpenConnectionWindow(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + let connectionId = try requireUUID(args, key: "connection_id") + if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await ensureConnectionExists(connectionId) + + let windowId = await MainActor.run { () -> UUID in + let payload = EditorTabPayload( + connectionId: connectionId, + tabType: .query, + intent: .restoreOrDefault + ) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + return payload.id + } + + let result: JSONValue = .object([ + "status": "opened", + "connection_id": .string(connectionId.uuidString), + "window_id": .string(windowId.uuidString) + ]) + return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) + } + + // MARK: - open_table_tab + + func handleOpenTableTab(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + let connectionId = try requireUUID(args, key: "connection_id") + let tableName = try requireString(args, key: "table_name") + let databaseName = optionalString(args, key: "database_name") + let schemaName = optionalString(args, key: "schema_name") + + if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await ensureConnectionExists(connectionId) + + let windowId = await MainActor.run { () -> UUID in + let payload = EditorTabPayload( + connectionId: connectionId, + tabType: .table, + tableName: tableName, + databaseName: databaseName, + schemaName: schemaName, + intent: .openContent + ) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + return payload.id + } + + let result: JSONValue = .object([ + "status": "opened", + "connection_id": .string(connectionId.uuidString), + "table_name": .string(tableName), + "window_id": .string(windowId.uuidString) + ]) + return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) + } + + // MARK: - focus_query_tab + + func handleFocusQueryTab(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + let tabId = try requireUUID(args, key: "tab_id") + + let outcome = await MainActor.run { () -> (Bool, UUID?, UUID?) in + for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { + if let window = snapshot.window { + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + return (true, snapshot.windowId, snapshot.connectionId) + } + return (false, snapshot.windowId, snapshot.connectionId) + } + return (false, nil, nil) + } + + guard outcome.0 else { + throw MCPError.notFound("tab") + } + + if let connectionId = outcome.2, let token { + try checkTokenConnectionAccess(token, connectionId: connectionId) + } + + var dict: [String: JSONValue] = [ + "status": "focused", + "tab_id": .string(tabId.uuidString) + ] + if let windowId = outcome.1 { + dict["window_id"] = .string(windowId.uuidString) + } + if let connectionId = outcome.2 { + dict["connection_id"] = .string(connectionId.uuidString) + } + + return MCPToolResult(content: [.text(encodeJSON(.object(dict)))], isError: nil) + } + + // MARK: - Helpers + + private func ensureConnectionExists(_ connectionId: UUID) async throws { + let exists = await MainActor.run { + ConnectionStorage.shared.loadConnections().contains { $0.id == connectionId } + } + guard exists else { + throw MCPError.notFound("connection") + } + } + + @MainActor + static func collectTabSnapshots() -> [TabSnapshot] { + let connections = ConnectionStorage.shared.loadConnections() + let connectionsById = Dictionary(uniqueKeysWithValues: connections.map { ($0.id, $0) }) + + var snapshots: [TabSnapshot] = [] + for coordinator in MainContentCoordinator.allActiveCoordinators() { + let connectionName = connectionsById[coordinator.connectionId]?.name + ?? coordinator.connection.name + let selectedId = coordinator.tabManager.selectedTabId + for tab in coordinator.tabManager.tabs { + snapshots.append(TabSnapshot( + tabId: tab.id, + connectionId: coordinator.connectionId, + connectionName: connectionName, + tabType: tab.tabType.snapshotName, + tableName: tab.tableContext.tableName, + databaseName: tab.tableContext.databaseName, + schemaName: tab.tableContext.schemaName, + displayTitle: tab.title, + windowId: coordinator.windowId, + isActive: tab.id == selectedId, + window: coordinator.contentWindow + )) + } + } + return snapshots + } +} + +struct TabSnapshot { + let tabId: UUID + let connectionId: UUID + let connectionName: String + let tabType: String + let tableName: String? + let databaseName: String? + let schemaName: String? + let displayTitle: String + let windowId: UUID? + let isActive: Bool + weak var window: NSWindow? +} + +private extension TabType { + var snapshotName: String { + switch self { + case .query: "query" + case .table: "table" + case .createTable: "createTable" + case .erDiagram: "erDiagram" + case .serverDashboard: "serverDashboard" + case .terminal: "terminal" + } + } +} diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 3b1e55150..074ba0fce 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -22,6 +22,36 @@ final class MCPToolHandler: Sendable { try checkTokenToolPermission(token, toolName: name) } + do { + let result = try await dispatchTool( + name: name, + arguments: arguments, + sessionId: sessionId, + token: token + ) + logToolOutcome(name: name, token: token, arguments: arguments, outcome: .success, error: nil) + return result + } catch let error as MCPError { + let outcome: AuditOutcome + if case .forbidden = error { + outcome = .denied + } else { + outcome = .error + } + logToolOutcome(name: name, token: token, arguments: arguments, outcome: outcome, error: error.message) + throw error + } catch { + logToolOutcome(name: name, token: token, arguments: arguments, outcome: .error, error: error.localizedDescription) + throw error + } + } + + private func dispatchTool( + name: String, + arguments: JSONValue?, + sessionId: String, + token: MCPAuthToken? + ) async throws -> MCPToolResult { switch name { case "list_connections": return try await handleListConnections() @@ -51,11 +81,39 @@ final class MCPToolHandler: Sendable { return try await handleSwitchDatabase(arguments, sessionId: sessionId, token: token) case "switch_schema": return try await handleSwitchSchema(arguments, sessionId: sessionId, token: token) + case "list_recent_tabs": + return try await handleListRecentTabs(arguments, token: token) + case "search_query_history": + return try await handleSearchQueryHistory(arguments, token: token) + case "open_connection_window": + return try await handleOpenConnectionWindow(arguments, token: token) + case "open_table_tab": + return try await handleOpenTableTab(arguments, token: token) + case "focus_query_tab": + return try await handleFocusQueryTab(arguments, token: token) default: throw MCPError.methodNotFound(name) } } + private func logToolOutcome( + name: String, + token: MCPAuthToken?, + arguments: JSONValue?, + outcome: AuditOutcome, + error: String? + ) { + let connectionId = arguments?["connection_id"]?.stringValue.flatMap(UUID.init(uuidString:)) + MCPAuditLogger.logToolCalled( + tokenId: token?.id, + tokenName: token?.name, + toolName: name, + connectionId: connectionId, + outcome: outcome, + errorMessage: error + ) + } + private func checkTokenToolPermission(_ token: MCPAuthToken, toolName: String) throws { let required = minimumPermission(for: toolName) guard token.permissions.satisfies(required) else { @@ -70,14 +128,15 @@ final class MCPToolHandler: Sendable { switch toolName { case "confirm_destructive_operation": return .fullAccess - case "switch_database", "switch_schema", "export_data": + case "switch_database", "switch_schema", "export_data", + "open_connection_window", "open_table_tab", "focus_query_tab": return .readWrite default: return .readOnly } } - private func checkTokenConnectionAccess(_ token: MCPAuthToken, connectionId: UUID) throws { + func checkTokenConnectionAccess(_ token: MCPAuthToken, connectionId: UUID) throws { guard let allowed = token.allowedConnectionIds else { return } guard allowed.contains(connectionId) else { throw MCPError.forbidden("Token does not have access to this connection") @@ -167,7 +226,8 @@ final class MCPToolHandler: Sendable { connectionId: connectionId, databaseName: databaseName, maxRows: maxRows, - timeoutSeconds: timeoutSeconds + timeoutSeconds: timeoutSeconds, + token: token ) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -241,7 +301,8 @@ final class MCPToolHandler: Sendable { connectionId: connectionId, databaseName: databaseName, maxRows: 0, - timeoutSeconds: timeoutSeconds + timeoutSeconds: timeoutSeconds, + token: token ) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -448,7 +509,8 @@ final class MCPToolHandler: Sendable { connectionId: UUID, databaseName: String, maxRows: Int, - timeoutSeconds: Int + timeoutSeconds: Int, + token: MCPAuthToken? = nil ) async throws -> JSONValue { let startTime = Date() do { @@ -459,15 +521,25 @@ final class MCPToolHandler: Sendable { timeoutSeconds: timeoutSeconds ) let elapsed = Date().timeIntervalSince(startTime) + let rowCount = result["row_count"]?.intValue ?? 0 await authGuard.logQuery( sql: query, connectionId: connectionId, databaseName: databaseName, executionTime: elapsed, - rowCount: result["row_count"]?.intValue ?? 0, + rowCount: rowCount, wasSuccessful: true, errorMessage: nil ) + MCPAuditLogger.logQueryExecuted( + tokenId: token?.id, + tokenName: token?.name, + connectionId: connectionId, + sql: query, + durationMs: Int(elapsed * 1_000), + rowCount: rowCount, + outcome: .success + ) return result } catch { let elapsed = Date().timeIntervalSince(startTime) @@ -480,11 +552,21 @@ final class MCPToolHandler: Sendable { wasSuccessful: false, errorMessage: error.localizedDescription ) + MCPAuditLogger.logQueryExecuted( + tokenId: token?.id, + tokenName: token?.name, + connectionId: connectionId, + sql: query, + durationMs: Int(elapsed * 1_000), + rowCount: 0, + outcome: .error, + errorMessage: error.localizedDescription + ) throw error } } - private func requireUUID(_ args: JSONValue?, key: String) throws -> UUID { + func requireUUID(_ args: JSONValue?, key: String) throws -> UUID { guard let value = args?[key]?.stringValue else { throw MCPError.invalidParams("Missing required parameter: \(key)") } @@ -494,18 +576,18 @@ final class MCPToolHandler: Sendable { return uuid } - private func requireString(_ args: JSONValue?, key: String) throws -> String { + func requireString(_ args: JSONValue?, key: String) throws -> String { guard let value = args?[key]?.stringValue else { throw MCPError.invalidParams("Missing required parameter: \(key)") } return value } - private func optionalString(_ args: JSONValue?, key: String) -> String? { + func optionalString(_ args: JSONValue?, key: String) -> String? { args?[key]?.stringValue } - private func optionalInt(_ args: JSONValue?, key: String, default defaultValue: Int, clamp range: ClosedRange) -> Int { + func optionalInt(_ args: JSONValue?, key: String, default defaultValue: Int, clamp range: ClosedRange) -> Int { guard let value = args?[key]?.intValue else { return defaultValue } return min(max(value, range.lowerBound), range.upperBound) } @@ -529,7 +611,7 @@ final class MCPToolHandler: Sendable { } } - private func encodeJSON(_ value: JSONValue) -> String { + func encodeJSON(_ value: JSONValue) -> String { let encoder = JSONEncoder() encoder.outputFormatting = [.sortedKeys] guard let data = try? encoder.encode(value), diff --git a/TablePro/Models/AuditEntry.swift b/TablePro/Models/AuditEntry.swift new file mode 100644 index 000000000..8b09a5f2f --- /dev/null +++ b/TablePro/Models/AuditEntry.swift @@ -0,0 +1,112 @@ +// +// AuditEntry.swift +// TablePro +// + +import Foundation + +enum AuditCategory: String, Codable, CaseIterable, Sendable, Identifiable { + case auth + case access + case admin + case query + case tool + case resource + + var id: String { rawValue } + + var displayName: String { + switch self { + case .auth: + String(localized: "Authentication") + case .access: + String(localized: "Access") + case .admin: + String(localized: "Administration") + case .query: + String(localized: "Query") + case .tool: + String(localized: "Tool") + case .resource: + String(localized: "Resource") + } + } +} + +enum AuditOutcome: String, Codable, Sendable { + case success + case denied + case error + case rateLimited + + var displayName: String { + switch self { + case .success: + String(localized: "Success") + case .denied: + String(localized: "Denied") + case .error: + String(localized: "Error") + case .rateLimited: + String(localized: "Rate limited") + } + } +} + +struct AuditEntry: Codable, Identifiable, Sendable, Equatable, Hashable { + let id: UUID + let timestamp: Date + let category: AuditCategory + let tokenId: UUID? + let tokenName: String? + let connectionId: UUID? + let action: String + let outcome: String + let details: String? + + init( + id: UUID = UUID(), + timestamp: Date = Date(), + category: AuditCategory, + tokenId: UUID? = nil, + tokenName: String? = nil, + connectionId: UUID? = nil, + action: String, + outcome: String, + details: String? = nil + ) { + self.id = id + self.timestamp = timestamp + self.category = category + self.tokenId = tokenId + self.tokenName = tokenName + self.connectionId = connectionId + self.action = action + self.outcome = outcome + self.details = details + } + + init( + id: UUID = UUID(), + timestamp: Date = Date(), + category: AuditCategory, + tokenId: UUID? = nil, + tokenName: String? = nil, + connectionId: UUID? = nil, + action: String, + outcome: AuditOutcome, + details: String? = nil + ) { + self.init( + id: id, + timestamp: timestamp, + category: category, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: action, + outcome: outcome.rawValue, + details: details + ) + } +} diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 49cc252c5..674ee2419 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -282,6 +282,11 @@ final class MainContentCoordinator { .flatMap { $0.tabManager.tabs } } + /// All currently active coordinators across windows. + static func allActiveCoordinators() -> [MainContentCoordinator] { + Array(activeCoordinators.values) + } + /// Find the first coordinator for `connectionId` that owns a tab matching `predicate`. /// Used to dedup cross-window tabs (Server Dashboard singleton, ER Diagram reuse). static func coordinator( diff --git a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift new file mode 100644 index 000000000..04b8f12e0 --- /dev/null +++ b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift @@ -0,0 +1,209 @@ +// +// MCPAuditLogView.swift +// TablePro +// + +import SwiftUI + +struct MCPAuditLogView: View { + @State private var entries: [AuditEntry] = [] + @State private var tokens: [MCPAuthToken] = [] + @State private var selectedTokenId: UUID? + @State private var selectedCategory: AuditCategory? + @State private var selectedRange: TimeRangeOption = .last7Days + @State private var isLoading = false + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + filterBar + + if isLoading { + ProgressView() + .frame(maxWidth: .infinity) + .padding(.vertical, 24) + } else if entries.isEmpty { + emptyState + } else { + entryList + } + } + .task { await reload() } + } + + private var filterBar: some View { + HStack(spacing: 12) { + Picker(selection: $selectedTokenId) { + Text(String(localized: "All tokens")).tag(UUID?.none) + ForEach(tokens) { token in + Text(token.name).tag(Optional(token.id)) + } + } label: { + Text(String(localized: "Token")) + } + .frame(maxWidth: 220) + + Picker(selection: $selectedCategory) { + Text(String(localized: "All categories")).tag(AuditCategory?.none) + ForEach(AuditCategory.allCases) { category in + Text(category.displayName).tag(Optional(category)) + } + } label: { + Text(String(localized: "Category")) + } + .frame(maxWidth: 200) + + Picker(selection: $selectedRange) { + ForEach(TimeRangeOption.allCases) { option in + Text(option.displayName).tag(option) + } + } label: { + Text(String(localized: "Range")) + } + .frame(maxWidth: 180) + + Spacer() + + Button { + Task { await reload() } + } label: { + Image(systemName: "arrow.clockwise") + } + .help(String(localized: "Refresh")) + } + .onChange(of: selectedTokenId) { _, _ in Task { await reload() } } + .onChange(of: selectedCategory) { _, _ in Task { await reload() } } + .onChange(of: selectedRange) { _, _ in Task { await reload() } } + } + + private var emptyState: some View { + VStack(spacing: 8) { + Image(systemName: "tray") + .font(.system(size: 32)) + .foregroundStyle(.tertiary) + Text(String(localized: "No activity yet")) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 24) + } + + private var entryList: some View { + List(entries) { entry in + MCPAuditLogRow(entry: entry) + } + .listStyle(.inset) + .frame(minHeight: 240) + } + + private func reload() async { + isLoading = true + defer { isLoading = false } + + let store = MCPServerManager.shared.tokenStore + if let store { + tokens = await store.list().filter { $0.name != "__stdio_bridge__" } + } + + let since = selectedRange.startDate + let category = selectedCategory + let tokenId = selectedTokenId + let result = await MCPAuditLogStorage.shared.query( + category: category, + tokenId: tokenId, + since: since, + limit: 1_000 + ) + entries = result + } +} + +private struct MCPAuditLogRow: View { + let entry: AuditEntry + + var body: some View { + HStack(alignment: .top, spacing: 10) { + outcomeBadge + VStack(alignment: .leading, spacing: 4) { + HStack(spacing: 6) { + Text(entry.action) + .font(.callout.weight(.medium)) + Text(entry.category.displayName) + .font(.caption) + .foregroundStyle(.secondary) + } + if let tokenName = entry.tokenName { + Text(tokenName) + .font(.caption) + .foregroundStyle(.secondary) + } + if let connectionId = entry.connectionId { + Text(String(format: String(localized: "Connection: %@"), connectionId.uuidString.prefix(8) + "…")) + .font(.caption) + .foregroundStyle(.secondary) + } + if let details = entry.details { + Text(details) + .font(.caption2) + .foregroundStyle(.tertiary) + .lineLimit(2) + } + } + Spacer() + VStack(alignment: .trailing, spacing: 2) { + Text(entry.timestamp, style: .relative) + .font(.caption) + .foregroundStyle(.secondary) + Text(entry.timestamp.formatted(date: .numeric, time: .standard)) + .font(.caption2) + .foregroundStyle(.tertiary) + } + } + .padding(.vertical, 4) + .help(entry.details ?? entry.action) + } + + private var outcomeBadge: some View { + Circle() + .fill(outcomeColor) + .frame(width: 8, height: 8) + .padding(.top, 6) + } + + private var outcomeColor: Color { + switch entry.outcome { + case AuditOutcome.success.rawValue: .green + case AuditOutcome.denied.rawValue: .orange + case AuditOutcome.rateLimited.rawValue: .orange + case AuditOutcome.error.rawValue: .red + default: .secondary + } + } +} + +enum TimeRangeOption: String, CaseIterable, Identifiable { + case last24Hours + case last7Days + case last30Days + case all + + var id: String { rawValue } + + var displayName: String { + switch self { + case .last24Hours: String(localized: "Last 24 hours") + case .last7Days: String(localized: "Last 7 days") + case .last30Days: String(localized: "Last 30 days") + case .all: String(localized: "All time") + } + } + + var startDate: Date? { + let now = Date() + switch self { + case .last24Hours: return now.addingTimeInterval(-86_400) + case .last7Days: return now.addingTimeInterval(-7 * 86_400) + case .last30Days: return now.addingTimeInterval(-30 * 86_400) + case .all: return nil + } + } +} diff --git a/TablePro/Views/Settings/Sections/MCPSection.swift b/TablePro/Views/Settings/Sections/MCPSection.swift index 6e178d0ee..fbcd8f3d0 100644 --- a/TablePro/Views/Settings/Sections/MCPSection.swift +++ b/TablePro/Views/Settings/Sections/MCPSection.swift @@ -30,6 +30,7 @@ struct MCPSection: View { if settings.enabled { configurationSection authenticationSection + activityLogSection networkSection setupSection connectedClientsSection @@ -42,6 +43,14 @@ struct MCPSection: View { } } + // MARK: - Activity Log + + private var activityLogSection: some View { + Section("Activity Log") { + MCPAuditLogView() + } + } + // MARK: - Configuration private var configurationSection: some View { diff --git a/TableProTests/Core/MCP/MCPAuditLogStorageTests.swift b/TableProTests/Core/MCP/MCPAuditLogStorageTests.swift new file mode 100644 index 000000000..2901eedbd --- /dev/null +++ b/TableProTests/Core/MCP/MCPAuditLogStorageTests.swift @@ -0,0 +1,210 @@ +// +// MCPAuditLogStorageTests.swift +// TableProTests +// + +import Foundation +import Testing + +@testable import TablePro + +@Suite("MCP Audit Log Storage") +struct MCPAuditLogStorageTests { + private func makeStorage() -> MCPAuditLogStorage { + MCPAuditLogStorage(isolatedForTesting: true) + } + + private func makeEntry( + category: AuditCategory = .tool, + tokenId: UUID? = nil, + tokenName: String? = nil, + connectionId: UUID? = nil, + timestamp: Date = Date(), + action: String = "tool.test", + outcome: AuditOutcome = .success, + details: String? = nil + ) -> AuditEntry { + AuditEntry( + timestamp: timestamp, + category: category, + tokenId: tokenId, + tokenName: tokenName, + connectionId: connectionId, + action: action, + outcome: outcome, + details: details + ) + } + + @Test("Insert and read single entry") + func insertAndRead() async { + let storage = makeStorage() + let entry = makeEntry(action: "auth.success", outcome: .success) + let inserted = await storage.addEntry(entry) + #expect(inserted == true) + + let entries = await storage.query() + #expect(entries.count == 1) + #expect(entries.first?.action == "auth.success") + #expect(entries.first?.outcome == AuditOutcome.success.rawValue) + } + + @Test("Query filters by category") + func filterByCategory() async { + let storage = makeStorage() + await storage.addEntry(makeEntry(category: .auth, action: "auth.success")) + await storage.addEntry(makeEntry(category: .tool, action: "tool.run")) + await storage.addEntry(makeEntry(category: .query, action: "query.executed")) + + let toolEntries = await storage.query(category: .tool) + #expect(toolEntries.count == 1) + #expect(toolEntries.first?.category == .tool) + + let authEntries = await storage.query(category: .auth) + #expect(authEntries.count == 1) + #expect(authEntries.first?.category == .auth) + } + + @Test("Query filters by token") + func filterByToken() async { + let storage = makeStorage() + let tokenA = UUID() + let tokenB = UUID() + await storage.addEntry(makeEntry(tokenId: tokenA, action: "tool.a")) + await storage.addEntry(makeEntry(tokenId: tokenB, action: "tool.b")) + await storage.addEntry(makeEntry(tokenId: tokenA, action: "tool.a2")) + + let aEntries = await storage.query(tokenId: tokenA) + #expect(aEntries.count == 2) + #expect(aEntries.allSatisfy { $0.tokenId == tokenA }) + + let bEntries = await storage.query(tokenId: tokenB) + #expect(bEntries.count == 1) + } + + @Test("Query filters by since date") + func filterBySince() async { + let storage = makeStorage() + let now = Date() + let oneHourAgo = now.addingTimeInterval(-3_600) + let threeHoursAgo = now.addingTimeInterval(-3 * 3_600) + + await storage.addEntry(makeEntry(timestamp: threeHoursAgo, action: "old")) + await storage.addEntry(makeEntry(timestamp: oneHourAgo, action: "recent")) + await storage.addEntry(makeEntry(timestamp: now, action: "now")) + + let twoHoursAgo = now.addingTimeInterval(-2 * 3_600) + let recent = await storage.query(since: twoHoursAgo) + #expect(recent.count == 2) + #expect(recent.allSatisfy { $0.timestamp >= twoHoursAgo }) + } + + @Test("Results sorted newest first") + func sortedNewestFirst() async { + let storage = makeStorage() + let now = Date() + await storage.addEntry(makeEntry(timestamp: now.addingTimeInterval(-300), action: "older")) + await storage.addEntry(makeEntry(timestamp: now, action: "newer")) + + let entries = await storage.query() + #expect(entries.count == 2) + #expect(entries[0].action == "newer") + #expect(entries[1].action == "older") + } + + @Test("Limit clamps result size") + func limitClampsResultSize() async { + let storage = makeStorage() + for index in 0..<10 { + await storage.addEntry(makeEntry(action: "tool.\(index)")) + } + + let limited = await storage.query(limit: 3) + #expect(limited.count == 3) + } + + @Test("Prune removes entries older than the cutoff") + func pruneRemovesOldEntries() async { + let storage = makeStorage() + let now = Date() + await storage.addEntry(makeEntry(timestamp: now.addingTimeInterval(-100 * 86_400), action: "ancient")) + await storage.addEntry(makeEntry(timestamp: now, action: "fresh")) + + let removed = await storage.prune(olderThan: 90) + #expect(removed == 1) + + let remaining = await storage.query() + #expect(remaining.count == 1) + #expect(remaining.first?.action == "fresh") + } + + @Test("Prune with negative or zero days is a no-op") + func pruneNoOpForZeroDays() async { + let storage = makeStorage() + await storage.addEntry(makeEntry(action: "fresh")) + + let removed = await storage.prune(olderThan: 0) + #expect(removed == 0) + + let entries = await storage.query() + #expect(entries.count == 1) + } + + @Test("Concurrent writes preserve all entries") + func concurrentWrites() async { + let storage = makeStorage() + + await withTaskGroup(of: Void.self) { group in + for index in 0..<50 { + group.addTask { + await storage.addEntry( + AuditEntry( + timestamp: Date(), + category: .tool, + action: "tool.\(index)", + outcome: AuditOutcome.success.rawValue + ) + ) + } + } + } + + let count = await storage.count() + #expect(count == 50) + } + + @Test("Outcome convenience initializer stores raw value") + func outcomeInitializerStoresRawValue() async { + let storage = makeStorage() + await storage.addEntry(makeEntry(outcome: .denied)) + + let entries = await storage.query() + #expect(entries.first?.outcome == AuditOutcome.denied.rawValue) + } + + @Test("Insert with same id replaces previous entry") + func insertOrReplacePreservesUniqueness() async { + let storage = makeStorage() + let id = UUID() + let first = AuditEntry( + id: id, + timestamp: Date(), + category: .tool, + action: "first", + outcome: AuditOutcome.success + ) + let second = AuditEntry( + id: id, + timestamp: Date(), + category: .tool, + action: "second", + outcome: AuditOutcome.success + ) + await storage.addEntry(first) + await storage.addEntry(second) + + let entries = await storage.query() + #expect(entries.count == 1) + #expect(entries.first?.action == "second") + } +} diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift new file mode 100644 index 000000000..0f7d2856c --- /dev/null +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -0,0 +1,308 @@ +// +// MCPToolHandlerIntegrationTests.swift +// TableProTests +// + +import Foundation +import Testing + +@testable import TablePro + +@Suite("MCP Tool Handler — integration tools", .serialized) +@MainActor +struct MCPToolHandlerIntegrationTests { + private let storage = ConnectionStorage.shared + + private func makeHandler() -> MCPToolHandler { + MCPToolHandler(bridge: MCPConnectionBridge(), authGuard: MCPAuthGuard()) + } + + private func makeToken( + permissions: TokenPermissions = .readWrite, + allowedConnectionIds: Set? = nil + ) -> MCPAuthToken { + MCPAuthToken( + id: UUID(), + name: "test-token", + prefix: "tp_test1", + tokenHash: "fakehash", + salt: "fakesalt", + permissions: permissions, + allowedConnectionIds: allowedConnectionIds, + createdAt: Date.now, + lastUsedAt: nil, + expiresAt: nil, + isActive: true + ) + } + + private func withConnections( + _ connections: [DatabaseConnection], + body: () async throws -> Void + ) async throws { + let original = storage.loadConnections() + defer { storage.saveConnections(original) } + storage.saveConnections(connections) + try await body() + } + + // MARK: - list_recent_tabs + + @Test("list_recent_tabs returns tabs JSON object") + func listRecentTabsShape() async throws { + let handler = makeHandler() + let result = try await handler.handleToolCall( + name: "list_recent_tabs", + arguments: .object(["limit": .int(5)]), + sessionId: "test-session", + token: nil + ) + #expect(result.isError == nil) + #expect(result.content.first?.type == "text") + let payload = result.content.first?.text ?? "" + #expect(payload.contains("\"tabs\"")) + } + + @Test("list_recent_tabs requires read scope only") + func listRecentTabsScope() async throws { + let handler = makeHandler() + let token = makeToken(permissions: .readOnly) + let result = try await handler.handleToolCall( + name: "list_recent_tabs", + arguments: nil, + sessionId: "test-session", + token: token + ) + #expect(result.isError == nil) + } + + // MARK: - search_query_history + + @Test("search_query_history rejects missing query parameter") + func searchQueryHistoryRequiresQuery() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "search_query_history", + arguments: nil, + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams when query is missing") + } catch let error as MCPError { + if case .invalidParams = error { + return + } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("search_query_history rejects invalid connection_id UUID") + func searchQueryHistoryRejectsInvalidUUID() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object([ + "query": .string("SELECT"), + "connection_id": .string("not-a-uuid") + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams for malformed UUID") + } catch let error as MCPError { + if case .invalidParams = error { + return + } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("search_query_history with empty query returns entries object") + func searchQueryHistoryEmptyQuery() async throws { + let handler = makeHandler() + let result = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object(["query": .string(""), "limit": .int(1)]), + sessionId: "test-session", + token: nil + ) + #expect(result.isError == nil) + let payload = result.content.first?.text ?? "" + #expect(payload.contains("\"entries\"")) + } + + // MARK: - open_connection_window + + @Test("open_connection_window rejects missing connection_id") + func openConnectionWindowRequiresConnectionId() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "open_connection_window", + arguments: nil, + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("open_connection_window rejects unknown connection") + func openConnectionWindowRejectsUnknown() async throws { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "open_connection_window", + arguments: .object(["connection_id": .string(UUID().uuidString)]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.notFound for unknown connection") + } catch let error as MCPError { + if case .notFound = error { return } + Issue.record("Expected notFound, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("open_connection_window denies read-only token") + func openConnectionWindowReadOnlyDenied() async throws { + let handler = makeHandler() + let token = makeToken(permissions: .readOnly) + do { + _ = try await handler.handleToolCall( + name: "open_connection_window", + arguments: .object(["connection_id": .string(UUID().uuidString)]), + sessionId: "test-session", + token: token + ) + Issue.record("Expected MCPError.forbidden for read-only token") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("open_connection_window respects token connection allowlist") + func openConnectionWindowAllowlist() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "Test", type: .mysql) + try await withConnections([connection]) { + let token = makeToken( + permissions: .readWrite, + allowedConnectionIds: [UUID()] + ) + do { + _ = try await handler.handleToolCall( + name: "open_connection_window", + arguments: .object(["connection_id": .string(connection.id.uuidString)]), + sessionId: "test-session", + token: token + ) + Issue.record("Expected MCPError.forbidden for disallowed connection") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + // MARK: - open_table_tab + + @Test("open_table_tab requires table_name") + func openTableTabRequiresTableName() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "open_table_tab", + arguments: .object(["connection_id": .string(UUID().uuidString)]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + // MARK: - focus_query_tab + + @Test("focus_query_tab returns notFound when tab is not open") + func focusQueryTabNotFound() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "focus_query_tab", + arguments: .object(["tab_id": .string(UUID().uuidString)]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.notFound") + } catch let error as MCPError { + if case .notFound = error { return } + Issue.record("Expected notFound, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("focus_query_tab requires read-write token") + func focusQueryTabRequiresWriteScope() async { + let handler = makeHandler() + let token = makeToken(permissions: .readOnly) + do { + _ = try await handler.handleToolCall( + name: "focus_query_tab", + arguments: .object(["tab_id": .string(UUID().uuidString)]), + sessionId: "test-session", + token: token + ) + Issue.record("Expected MCPError.forbidden for read-only token") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + // MARK: - Unknown tool + + @Test("Unknown tool name throws methodNotFound") + func unknownToolThrows() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "totally_made_up_tool", + arguments: nil, + sessionId: "test-session", + token: nil + ) + Issue.record("Expected methodNotFound") + } catch let error as MCPError { + if case .methodNotFound = error { return } + Issue.record("Expected methodNotFound, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } +} From f8ff86dab6d14df7efc2ef5bad67d8a0e3b1d093 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:18:25 +0700 Subject: [PATCH 08/83] docs: fix mintlify parse errors in plugin-registry and ai-assistant --- docs/development/plugin-registry.mdx | 2 +- docs/features/ai-assistant.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/plugin-registry.mdx b/docs/development/plugin-registry.mdx index cb8cf3a2f..c8d554aa9 100644 --- a/docs/development/plugin-registry.mdx +++ b/docs/development/plugin-registry.mdx @@ -34,7 +34,7 @@ The registry file (`plugins.json`): | `databaseTypeIds` | [string] | No | Maps to `DatabaseType.pluginTypeId`. Used for auto-install. | | `downloadURL` | string | No* | Direct URL to `.zip` | | `sha256` | string | No* | SHA-256 hex of ZIP | -| `binaries` | [object] | No | Per-arch: `[{ "architecture": "arm64"|"x86_64", "downloadURL": "...", "sha256": "..." }]` | +| `binaries` | [object] | No | Per-arch entries with `architecture` (`arm64` or `x86_64`), `downloadURL`, and `sha256`. See example below. | | `minAppVersion` | string | No | Minimum TablePro version | | `minPluginKitVersion` | int | No | Minimum PluginKit version (currently 2) | | `iconName` | string | No | SF Symbol name | diff --git a/docs/features/ai-assistant.mdx b/docs/features/ai-assistant.mdx index b5d43de8b..a4cd1671f 100644 --- a/docs/features/ai-assistant.mdx +++ b/docs/features/ai-assistant.mdx @@ -1,6 +1,6 @@ --- title: AI Assistant -description: Built-in AI for SQL: chat, inline suggestions, explain, optimize, fix-error. Multi-provider. +description: "Built-in AI for SQL: chat, inline suggestions, explain, optimize, fix-error. Multi-provider." --- # AI Assistant From 97987621f8d138a02958671c08dac812976ca703 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:27:18 +0700 Subject: [PATCH 09/83] docs(integrations): align with shipped contract --- docs/external-api/cursor-claude.mdx | 16 +-- docs/external-api/index.mdx | 2 +- docs/external-api/mcp-tools.mdx | 173 ++++++++++++++++++++-------- docs/external-api/pairing.mdx | 2 +- docs/external-api/raycast.mdx | 2 +- docs/external-api/tokens.mdx | 6 +- 6 files changed, 135 insertions(+), 66 deletions(-) diff --git a/docs/external-api/cursor-claude.mdx b/docs/external-api/cursor-claude.mdx index d99a957e3..79012a2f6 100644 --- a/docs/external-api/cursor-claude.mdx +++ b/docs/external-api/cursor-claude.mdx @@ -57,19 +57,13 @@ claude mcp add tablepro -- /Applications/TablePro.app/Contents/MacOS/tablepro-mc This writes the same stdio config under the hood. -## One-click setup +## Setup snippets in TablePro -TablePro can write these config files for you. Open **Settings > Integrations > Setup**: - -- **Setup for Cursor** writes `~/.cursor/mcp.json`. -- **Setup for Claude Desktop** writes `claude_desktop_config.json`. -- **Setup for Claude Code** runs the equivalent `claude mcp add` for the current user. - -If a config already exists, TablePro merges the `tablepro` entry into the existing `mcpServers` map. +Open **Settings > MCP > MCP Setup** and pick a client. TablePro shows the exact JSON or shell command to paste into the client's config. ## HTTP instead of stdio -If you prefer HTTP, mint a token in **Settings > Integrations > Tokens** and configure: +If you prefer HTTP, mint a token in **Settings > MCP > Authentication** and configure: ```json { @@ -84,7 +78,7 @@ If you prefer HTTP, mint a token in **Settings > Integrations > Tokens** and con } ``` -Replace `23508` with the port shown in **Settings > Integrations > Server**. HTTP is the right choice when: +Replace `23508` with the port shown in **Settings > MCP > MCP Configuration**. HTTP is the right choice when: - The client and TablePro run on different machines (with TLS, see [MCP Server](/features/mcp#remote-access)). - You want a token with a tighter scope than the bridge token. @@ -102,7 +96,7 @@ The connection's `externalAccess` setting and the token scope still apply on top **`tablepro-mcp` exits immediately.** TablePro is not running or the build is older than 0.37. Open TablePro and re-launch the client. -**Bridge says "handshake timeout".** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > Integrations > Server** and click **Start Server**, then re-launch the client. +**Bridge says "handshake timeout".** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > MCP** and toggle **Enable MCP Server** off and on, then re-launch the client. **Tool calls return `403`.** The connection's `externalAccess` is `blocked` or `readOnly`. Open the connection editor in TablePro and adjust under **External Access**. diff --git a/docs/external-api/index.mdx b/docs/external-api/index.mdx index 8ba2e9f4f..1448e446d 100644 --- a/docs/external-api/index.mdx +++ b/docs/external-api/index.mdx @@ -45,7 +45,7 @@ The External API is gated by three independent layers. A request must clear all The effective permission for any request is `MIN(token.scope, connection.externalAccess)`. A token with `fullAccess` against a connection with `readOnly` cannot mutate. -Every request is recorded in the activity log. Open **Settings > Integrations > Activity Log** to inspect. +Every request is recorded in the activity log. Open **Settings > MCP > Activity Log** to inspect. ## Quick start diff --git a/docs/external-api/mcp-tools.mdx b/docs/external-api/mcp-tools.mdx index eca3afb7a..28b8a166a 100644 --- a/docs/external-api/mcp-tools.mdx +++ b/docs/external-api/mcp-tools.mdx @@ -48,14 +48,16 @@ List all saved connections. "host": "db.example.com", "port": 5432, "database": "app", - "isConnected": false, - "externalAccess": "readOnly" + "username": "app", + "is_connected": false, + "ai_policy": "askEachTime", + "safe_mode": "silent" } ] } ``` -**Scope**: `readOnly`. Connections with `externalAccess: blocked` are omitted from the list. +**Scope**: `readOnly`. ### `connect` @@ -70,9 +72,16 @@ Open a database connection. **Output**: ```json -{ "connected": true, "version": "PostgreSQL 16.2" } +{ + "status": "connected", + "current_database": "app", + "current_schema": "public", + "server_version": "PostgreSQL 16.2" +} ``` +`current_schema` and `server_version` are present when known. + **Scope**: `readOnly`. ### `disconnect` @@ -81,7 +90,7 @@ Close a connection. **Input**: `{ "connection_id": "..." }` -**Output**: `{ "disconnected": true }` +**Output**: empty object on success. **Scope**: `readOnly`. @@ -95,13 +104,17 @@ Return version, uptime, and active database for a connection. ```json { - "isConnected": true, - "version": "PostgreSQL 16.2", - "currentDatabase": "app", - "currentSchema": "public" + "status": "connected", + "current_database": "app", + "current_schema": "public", + "server_version": "PostgreSQL 16.2", + "connected_at": "2026-04-26T10:14:22Z", + "last_active_at": "2026-04-26T10:14:22Z" } ``` +`status` is one of `connected`, `connecting`, `disconnected`, `error`. When `error`, an `error` object with a `message` field is included. + **Scope**: `readOnly`. ## Schema tools @@ -110,7 +123,7 @@ Return version, uptime, and active database for a connection. **Input**: `{ "connection_id": "..." }` -**Output**: `{ "databases": ["app", "analytics"] }` +**Output**: `{ "databases": ["app", "analytics"] }` (array of database names) **Scope**: `readOnly`. @@ -118,7 +131,7 @@ Return version, uptime, and active database for a connection. **Input**: `{ "connection_id": "...", "database": "app" }` (database optional) -**Output**: `{ "schemas": ["public", "reporting"] }` +**Output**: `{ "schemas": ["public", "reporting"] }` (array of schema names) **Scope**: `readOnly`. @@ -140,12 +153,14 @@ Return version, uptime, and active database for a connection. ```json { "tables": [ - { "name": "users", "type": "table", "rowCount": null }, + { "name": "users", "type": "table" }, { "name": "orders_view", "type": "view" } ] } ``` +When `include_row_counts` is true and the driver supports it, each entry also includes `row_count`. + **Scope**: `readOnly`. ### `describe_table` @@ -157,33 +172,54 @@ Columns, indexes, foreign keys, primary key, DDL. ```json { "connection_id": "...", - "table_name": "users", - "database": "app", + "table": "users", "schema": "public" } ``` +`schema` is optional. The current database is used unless the connection was first switched with `switch_database`. + **Output**: ```json { "columns": [ - { "name": "id", "type": "uuid", "nullable": false, "isPrimaryKey": true }, - { "name": "email", "type": "text", "nullable": false } + { + "name": "id", + "data_type": "uuid", + "is_nullable": false, + "is_primary_key": true + }, + { + "name": "email", + "data_type": "text", + "is_nullable": false + } ], - "indexes": [{ "name": "users_email_idx", "columns": ["email"], "unique": true }], - "foreignKeys": [], - "ddl": "CREATE TABLE users (...)" + "indexes": [ + { + "name": "users_email_idx", + "columns": ["email"], + "is_unique": true, + "is_primary": false, + "type": "btree" + } + ], + "foreign_keys": [], + "ddl": "CREATE TABLE users (...)", + "approximate_row_count": 12345 } ``` +`default_value`, `extra`, and `comment` are present on a column when set. `ddl` and `approximate_row_count` are present when the driver supports them. + **Scope**: `readOnly`. ### `get_table_ddl` Just the `CREATE TABLE` statement. -**Input**: same as `describe_table`. +**Input**: same as `describe_table` (`connection_id`, `table`, `schema`). **Output**: `{ "ddl": "CREATE TABLE ..." }` @@ -214,14 +250,17 @@ Run a SQL query. ```json { - "columns": [{ "name": "id", "type": "uuid" }, { "name": "email", "type": "text" }], + "columns": ["id", "email"], "rows": [["9f1f...", "alice@example.com"]], - "rowCount": 1, - "executionTimeMs": 14, - "truncated": false + "row_count": 1, + "rows_affected": 0, + "execution_time_ms": 14, + "is_truncated": false } ``` +`columns` is an array of column-name strings. `rows` is an array of rows, where each row is an array of strings (or `null`) aligned to the `columns` order. `status_message` is added when the driver returns one. + **Scope**: - `readOnly` for SELECT, SHOW, EXPLAIN. @@ -261,14 +300,13 @@ Export query or table data as CSV, JSON, or SQL. "connection_id": "...", "format": "csv", "tables": ["users", "orders"], - "query": null, "max_rows": 50000 } ``` -`format` is one of `csv`, `json`, `sql`. `max_rows` defaults to 50,000, max 100,000. Provide either `tables` or `query`, not both. +`format` is one of `csv`, `json`, `sql`. `max_rows` defaults to 50,000, max 100,000. Provide either `tables` or `query`. Pass `output_path` to write to disk instead of returning data inline. -**Output**: `{ "data": "", "byteCount": 12345 }` for small payloads, or `{ "filePath": "/tmp/...", "byteCount": ... }` for larger ones. +**Output**: an envelope with one entry per query/table exported. Each entry has the export label and either inline data or the file path. Provide `output_path` in the request to receive a file-path response. **Scope**: `readOnly`. @@ -276,7 +314,7 @@ Export query or table data as CSV, JSON, or SQL. **Input**: `{ "connection_id": "...", "database": "analytics" }` or `{ "connection_id": "...", "schema": "reporting" }` -**Output**: `{ "currentDatabase": "analytics" }` or `{ "currentSchema": "reporting" }` +**Output**: `{ "status": "switched", "current_database": "analytics" }` or `{ "status": "switched", "current_schema": "reporting" }` **Scope**: `readOnly`. @@ -290,7 +328,15 @@ Open a connection in TablePro and bring its window to front. **Input**: `{ "connection_id": "..." }` -**Output**: `{ "windowId": "..." }` +**Output**: + +```json +{ + "status": "opened", + "connection_id": "9f1f...", + "window_id": "..." +} +``` **Scope**: `readWrite`. @@ -304,12 +350,23 @@ Open a table tab. { "connection_id": "...", "table_name": "users", - "database": "app", - "schema": "public" + "database_name": "app", + "schema_name": "public" } ``` -**Output**: `{ "tabId": "..." }` +`database_name` and `schema_name` are optional. If omitted, the connection's current database/schema is used. + +**Output**: + +```json +{ + "status": "opened", + "connection_id": "9f1f...", + "table_name": "users", + "window_id": "..." +} +``` **Scope**: `readWrite`. @@ -319,7 +376,16 @@ Bring an existing tab to front. **Input**: `{ "tab_id": "..." }` -**Output**: `{ "focused": true }` +**Output**: + +```json +{ + "status": "focused", + "tab_id": "...", + "window_id": "...", + "connection_id": "9f1f..." +} +``` **Scope**: `readWrite`. @@ -327,7 +393,7 @@ Bring an existing tab to front. Read the cross-window tab registry. -**Input**: none. +**Input**: `{ "limit": 20 }` (optional, 1-500, default 20). **Output**: @@ -335,17 +401,23 @@ Read the cross-window tab registry. { "tabs": [ { - "id": "...", - "connectionId": "9f1f...", - "connectionName": "Production", - "tabType": "query", - "displayTitle": "users by signup date", - "tableName": null + "tab_id": "...", + "connection_id": "9f1f...", + "connection_name": "Production", + "tab_type": "query", + "display_title": "users by signup date", + "is_active": true, + "table_name": "users", + "database_name": "app", + "schema_name": "public", + "window_id": "..." } ] } ``` +`tab_type` is one of `query`, `table`, `createTable`, `erDiagram`, `serverDashboard`, `terminal`. `table_name`, `database_name`, `schema_name`, and `window_id` are present when known. + **Scope**: `readOnly`. ## History tools @@ -360,30 +432,33 @@ Full-text search over the query history database. { "query": "users active", "connection_id": "9f1f...", - "limit": 50, - "date_filter": "thisWeek" + "limit": 50 } ``` -`connection_id` and `date_filter` are optional. `date_filter` is one of `today`, `thisWeek`, `thisMonth`. `limit` is 1-500, default 50. +`connection_id` is optional. `limit` is 1-500, default 50. **Output**: ```json { - "results": [ + "entries": [ { "id": "...", - "connectionId": "9f1f...", - "sql": "SELECT * FROM users WHERE active = true", - "executedAt": "2026-04-26T10:14:22Z", - "rowCount": 142, - "executionTimeMs": 18 + "connection_id": "9f1f...", + "database_name": "app", + "query": "SELECT * FROM users WHERE active = true", + "executed_at": 1745663662.0, + "execution_time_ms": 18, + "row_count": 142, + "was_successful": true } ] } ``` +`executed_at` is a Unix timestamp in seconds. `error_message` is included when `was_successful` is false. + **Scope**: `readOnly`. ## Errors diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index d8d3d9a67..30fa857fe 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -139,7 +139,7 @@ For preferences-backed storage, use `updateCommandMetadata` or write to the pass | Code is single-use | Successful exchange or 5-minute expiry deletes the pending exchange. | | Plaintext token is not persisted by TablePro | Only the SHA-256 hash plus salt is saved to `mcp-tokens.json`. | | User sees and approves scopes | The sheet shows what was requested, what is granted, and which connections. | -| User can revoke any time | **Settings > Integrations > Tokens > Revoke**. | +| User can revoke any time | **Settings > MCP > Authentication > Revoke**. | ## Errors diff --git a/docs/external-api/raycast.mdx b/docs/external-api/raycast.mdx index fba74e5ab..e64eaa175 100644 --- a/docs/external-api/raycast.mdx +++ b/docs/external-api/raycast.mdx @@ -86,7 +86,7 @@ The token is stored in the Keychain via Raycast's password preference type. **Token revoked (`401`).** The extension clears the stored token and shows the pair CTA. -**Connection rejected (`403`).** The connection's `externalAccess` is `blocked` or the token's allowlist excludes it. Open **Settings > Integrations** in TablePro to inspect. +**Connection rejected (`403`).** The connection's `externalAccess` is `blocked` or the token's allowlist excludes it. Open **Settings > MCP** in TablePro to inspect. **Read-only error (`403 Connection is read-only for external clients`).** The connection's `externalAccess` is `readOnly` and the SQL is a write. Either change the connection's external access in TablePro, or run the query in TablePro's editor. diff --git a/docs/external-api/tokens.mdx b/docs/external-api/tokens.mdx index 0460cdafb..79e84f1df 100644 --- a/docs/external-api/tokens.mdx +++ b/docs/external-api/tokens.mdx @@ -67,7 +67,7 @@ A `fullAccess` token cannot mutate data on a `readOnly` connection. A token's re Tokens are created in three ways: 1. **Pairing flow** (most common). See [Pairing](/external-api/pairing). -2. **Settings UI**. **Settings > Integrations > Tokens > New Token**. Pick name, scope, allowlist, expiry. The plaintext is shown once in a reveal sheet. +2. **Settings UI**. **Settings > MCP > Authentication**, then **Generate Token**. Pick name, scope, allowlist, expiry. The plaintext is shown once in a reveal sheet. 3. **AppleScript-style URL** is not supported. Tokens are not exposed as a URL scheme action. The plaintext format is `tp_`. The first 8 chars are the prefix. @@ -84,7 +84,7 @@ Recommended values: ## Revocation -**Settings > Integrations > Tokens** lists all tokens with prefix, name, scope, allowlist, last-used time, and expiry. Each row has: +**Settings > MCP > Authentication** lists all tokens with prefix, name, scope, allowlist, last-used time, and expiry. Each row has: - **Revoke**: marks the token inactive. Stays in the list with status `Revoked`. Cannot be reactivated. - **Delete**: removes the row entirely. @@ -95,7 +95,7 @@ After revoking a token used by an extension, the extension shows an "unauthorize ## Audit log -Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > Integrations > Activity Log** shows: +Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > MCP > Activity Log** shows: | Field | Example | |-------|---------| From 06deeb64cfb0bb81fb19acd14475e27e529e915f Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:27:25 +0700 Subject: [PATCH 10/83] feat(extension): align wire shapes with shipped contract --- extensions/tablepro/src/lib/mcp.ts | 310 ++++++++++++++++-- extensions/tablepro/src/search-tables.tsx | 1 - .../tablepro/src/tools/describe-table.ts | 3 - .../tablepro/src/tools/get-table-ddl.ts | 3 - 4 files changed, 278 insertions(+), 39 deletions(-) diff --git a/extensions/tablepro/src/lib/mcp.ts b/extensions/tablepro/src/lib/mcp.ts index 24f23bc13..bbc023ad2 100644 --- a/extensions/tablepro/src/lib/mcp.ts +++ b/extensions/tablepro/src/lib/mcp.ts @@ -45,6 +45,10 @@ interface JsonRpcError { type JsonRpcResponse = JsonRpcSuccess | JsonRpcError; +interface InitializeResult { + protocolVersion: string; +} + async function readHandshake(): Promise { try { const raw = await fs.readFile(handshakeFilePath(), "utf8"); @@ -98,42 +102,64 @@ function nextRequestId(): string { return `tp-${Date.now()}-${requestCounter}`; } -async function rpc( +interface SessionState { + sessionId: string; + initialized: boolean; +} + +let sessionState: SessionState | null = null; + +function mcpUrl(handshake: MCPHandshake): string { + return `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/mcp`; +} + +async function postJsonRpc( method: string, - params: Record = {}, -): Promise { - const handshake = await ensureHandshake(true); - const token = getApiToken(); - const url = `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/v1/mcp`; + params: Record | undefined, + handshake: MCPHandshake, + token: string, + sessionId: string | null, +): Promise<{ result: T; sessionId: string | null }> { const body: JsonRpcRequest = { jsonrpc: "2.0", id: nextRequestId(), method, params, }; + const headers: Record = { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }; + if (sessionId) { + headers["Mcp-Session-Id"] = sessionId; + } let response: Response; try { - response = await fetch(url, { + response = await fetch(mcpUrl(handshake), { method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, + headers, body: JSON.stringify(body), }); } catch { throw new MCPNotRunningError(); } if (response.status === 401) { + sessionState = null; throw new TokenRevokedError(); } if (response.status === 403) { const message = await safeReadError(response); throw new ExternalAccessDeniedError(message); } + if (response.status === 404) { + sessionState = null; + throw new Error(`TablePro MCP returned HTTP 404`); + } if (!response.ok) { throw new Error(`TablePro MCP returned HTTP ${response.status}`); } + const responseSessionId = response.headers.get("mcp-session-id"); const json = (await response.json()) as JsonRpcResponse; if ("error" in json) { const message = json.error.message; @@ -145,7 +171,80 @@ async function rpc( } throw new Error(message); } - return json.result; + return { result: json.result, sessionId: responseSessionId }; +} + +async function ensureSession( + handshake: MCPHandshake, + token: string, +): Promise { + if (sessionState && sessionState.initialized) { + return sessionState.sessionId; + } + const initParams = { + protocolVersion: "2025-03-26", + capabilities: {}, + clientInfo: { name: "raycast-tablepro", version: "0.1.0" }, + }; + const init = await postJsonRpc( + "initialize", + initParams, + handshake, + token, + null, + ); + if (!init.sessionId) { + throw new Error("MCP initialize did not return a session id"); + } + sessionState = { sessionId: init.sessionId, initialized: false }; + await postJsonRpc( + "notifications/initialized", + {}, + handshake, + token, + init.sessionId, + ); + sessionState.initialized = true; + return init.sessionId; +} + +async function rpc( + method: string, + params: Record = {}, +): Promise { + const handshake = await ensureHandshake(true); + const token = getApiToken(); + let sessionId: string; + try { + sessionId = await ensureSession(handshake, token); + } catch (err) { + sessionState = null; + throw err; + } + try { + const { result } = await postJsonRpc( + method, + params, + handshake, + token, + sessionId, + ); + return result; + } catch (err) { + if (err instanceof Error && /HTTP 404/.test(err.message)) { + sessionState = null; + const fresh = await ensureSession(handshake, token); + const { result } = await postJsonRpc( + method, + params, + handshake, + token, + fresh, + ); + return result; + } + throw err; + } } async function safeReadError(response: Response): Promise { @@ -184,77 +283,170 @@ export async function callTool( return undefined as T; } +interface RawConnectionRow { + id: string; + name: string; + type: string; + host?: string; + port?: number; + database?: string; + username?: string; + is_connected?: boolean; + ai_policy?: string; + safe_mode?: string; +} + export async function listConnections(): Promise { - return callTool("list_connections"); + const envelope = await callTool<{ connections: RawConnectionRow[] }>( + "list_connections", + ); + return (envelope.connections ?? []).map((row) => ({ + id: row.id, + name: row.name, + type: row.type, + host: row.host, + port: row.port, + database: row.database, + })); } export async function listDatabases( connectionId: string, ): Promise { - return callTool("list_databases", { + const envelope = await callTool<{ databases: string[] }>("list_databases", { connection_id: connectionId, }); + return (envelope.databases ?? []).map((name) => ({ name })); } export async function listSchemas( connectionId: string, database?: string, ): Promise { - return callTool("list_schemas", { + const envelope = await callTool<{ schemas: string[] }>("list_schemas", { connection_id: connectionId, database, }); + return (envelope.schemas ?? []).map((name) => ({ name, database })); +} + +interface RawTableRow { + name: string; + type?: string; + schema?: string; + database?: string; + row_count?: number; } export async function listTables( connectionId: string, options: { database?: string; schema?: string } = {}, ): Promise { - return callTool("list_tables", { + const envelope = await callTool<{ tables: RawTableRow[] }>("list_tables", { connection_id: connectionId, database: options.database, schema: options.schema, + include_row_counts: true, }); + return (envelope.tables ?? []).map((row) => ({ + name: row.name, + type: row.type, + schema: row.schema, + database: row.database, + rowCount: row.row_count, + })); +} + +interface RawColumn { + name: string; + data_type: string; + is_nullable: boolean; + is_primary_key: boolean; + default_value?: string | null; + extra?: string | null; + comment?: string | null; +} + +interface RawDescribeTable { + columns: RawColumn[]; + indexes?: unknown[]; + foreign_keys?: unknown[]; + ddl?: string; + approximate_row_count?: number; } export async function describeTable( connectionId: string, table: string, - options: { database?: string; schema?: string } = {}, + options: { schema?: string } = {}, ): Promise<{ columns: ColumnInfo[] }> { - return callTool<{ columns: ColumnInfo[] }>("describe_table", { + const envelope = await callTool("describe_table", { connection_id: connectionId, table, - database: options.database, schema: options.schema, }); + const columns: ColumnInfo[] = (envelope.columns ?? []).map((col) => ({ + name: col.name, + type: col.data_type, + nullable: col.is_nullable, + primaryKey: col.is_primary_key, + defaultValue: col.default_value ?? undefined, + comment: col.comment ?? undefined, + })); + return { columns }; } export async function getTableDDL( connectionId: string, table: string, - options: { database?: string; schema?: string } = {}, + options: { schema?: string } = {}, ): Promise<{ ddl: string }> { return callTool<{ ddl: string }>("get_table_ddl", { connection_id: connectionId, table, - database: options.database, schema: options.schema, }); } +interface RawQueryResult { + columns: string[]; + rows: Array>; + row_count: number; + rows_affected: number; + execution_time_ms: number; + is_truncated: boolean; + status_message?: string; +} + +function adaptQueryResult(raw: RawQueryResult): QueryResult { + const rows: Array> = (raw.rows ?? []).map((row) => { + const obj: Record = {}; + raw.columns.forEach((col, idx) => { + obj[col] = row[idx] ?? null; + }); + return obj; + }); + return { + columns: raw.columns ?? [], + rows, + affectedRows: raw.rows_affected, + durationMs: raw.execution_time_ms, + }; +} + export async function executeQuery( connectionId: string, sql: string, options: { database?: string; schema?: string; rowLimit?: number } = {}, ): Promise { - return callTool("execute_query", { + const raw = await callTool("execute_query", { connection_id: connectionId, - sql, + query: sql, database: options.database, schema: options.schema, - row_limit: options.rowLimit, + max_rows: options.rowLimit, }); + return adaptQueryResult(raw); } export async function explainQuery( @@ -262,32 +454,86 @@ export async function explainQuery( sql: string, options: { database?: string; schema?: string } = {}, ): Promise { - return callTool("execute_query", { + const raw = await callTool("execute_query", { connection_id: connectionId, - sql: `EXPLAIN ${sql}`, + query: `EXPLAIN ${sql}`, database: options.database, schema: options.schema, }); + return adaptQueryResult(raw); +} + +interface RawRecentTab { + tab_id: string; + connection_id: string; + connection_name: string; + tab_type: string; + display_title: string; + is_active: boolean; + table_name?: string; + database_name?: string; + schema_name?: string; + window_id?: string; +} + +function tabTypeFromRaw(raw: string): RecentTab["tabType"] { + if (raw === "table") return "table"; + if (raw === "createTable") return "structure"; + return "query"; } export async function listRecentTabs(): Promise { - return callTool("list_recent_tabs"); + const envelope = await callTool<{ tabs: RawRecentTab[] }>( + "list_recent_tabs", + ); + return (envelope.tabs ?? []).map((tab) => ({ + id: tab.tab_id, + connectionId: tab.connection_id, + connectionName: tab.connection_name, + tabType: tabTypeFromRaw(tab.tab_type), + title: tab.display_title, + tableName: tab.table_name, + databaseName: tab.database_name, + })); +} + +interface RawHistoryEntry { + id: string; + query: string; + connection_id: string; + database_name?: string; + executed_at: number; + execution_time_ms: number; + row_count: number; + was_successful: boolean; + error_message?: string; } export async function searchHistory( query: string, limit = 50, ): Promise { - return callTool("search_query_history", { - query, - limit, - }); + const envelope = await callTool<{ entries: RawHistoryEntry[] }>( + "search_query_history", + { + query, + limit, + }, + ); + return (envelope.entries ?? []).map((entry) => ({ + id: entry.id, + query: entry.query, + connectionId: entry.connection_id, + executedAt: new Date(entry.executed_at * 1000).toISOString(), + durationMs: entry.execution_time_ms, + rowCount: entry.row_count, + })); } export async function openConnectionWindow( connectionId: string, ): Promise { - await callTool("open_connection_window", { + await callTool("open_connection_window", { connection_id: connectionId, }); } diff --git a/extensions/tablepro/src/search-tables.tsx b/extensions/tablepro/src/search-tables.tsx index 37ec573b8..4f1bc37f0 100644 --- a/extensions/tablepro/src/search-tables.tsx +++ b/extensions/tablepro/src/search-tables.tsx @@ -183,7 +183,6 @@ function TablesList({ connection.id, table.name, { - database, schema: table.schema ?? schema, }, ); diff --git a/extensions/tablepro/src/tools/describe-table.ts b/extensions/tablepro/src/tools/describe-table.ts index 6832864b7..1352ac4ee 100644 --- a/extensions/tablepro/src/tools/describe-table.ts +++ b/extensions/tablepro/src/tools/describe-table.ts @@ -6,8 +6,6 @@ type Input = { connectionId: string; /** Table name. */ table: string; - /** Database name. Optional. */ - database?: string; /** Schema name. Optional. */ schema?: string; }; @@ -16,7 +14,6 @@ export default async function tool( input: Input, ): Promise<{ columns: ColumnInfo[] }> { return describeTable(input.connectionId, input.table, { - database: input.database, schema: input.schema, }); } diff --git a/extensions/tablepro/src/tools/get-table-ddl.ts b/extensions/tablepro/src/tools/get-table-ddl.ts index d5322a1bf..6c6af582c 100644 --- a/extensions/tablepro/src/tools/get-table-ddl.ts +++ b/extensions/tablepro/src/tools/get-table-ddl.ts @@ -5,15 +5,12 @@ type Input = { connectionId: string; /** Table name. */ table: string; - /** Database name. Optional. */ - database?: string; /** Schema name. Optional. */ schema?: string; }; export default async function tool(input: Input): Promise<{ ddl: string }> { return getTableDDL(input.connectionId, input.table, { - database: input.database, schema: input.schema, }); } From 1d6237feb919276afb7201e974f332a2938151c5 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:31:09 +0700 Subject: [PATCH 11/83] docs: fold tablepro://import params into external-api/url-scheme Move the full parameter list (core, SSH, SSL, plugin-specific af_* fields) from features/deep-links into external-api/url-scheme. The url-scheme page previously punted to deep-links via 'See Deep Links for the full parameter list', which becomes a dangling link once deep-links is removed. --- docs/external-api/url-scheme.mdx | 52 +++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/docs/external-api/url-scheme.mdx b/docs/external-api/url-scheme.mdx index 57907a14c..00b07aca5 100644 --- a/docs/external-api/url-scheme.mdx +++ b/docs/external-api/url-scheme.mdx @@ -141,7 +141,57 @@ open "tablepro://integrations/start-mcp" tablepro://import?name=&host=&port=

&type=&username=&database= ``` -Creates a saved connection from query parameters and opens the connection editor for review. See [Deep Links](/features/deep-links#import-a-connection) for the full parameter list. This action is unchanged by the External API rework. +Creates a saved connection from query parameters and opens the connection editor for review. A confirmation dialog shows the connection details before adding, so you can reject unexpected imports. The user adds a password before connecting; passwords are never accepted in the URL. + +Required parameters: `name`, `host`, `type`. + +`type` accepts any registered database type name (case-insensitive). Examples: `MySQL`, `PostgreSQL`, `MongoDB`, `Redis`, `ClickHouse`, `Oracle`, `DuckDB`, `Cassandra`. + +```bash +open "tablepro://import?name=Staging&host=db.example.com&port=5432&type=postgresql&username=admin&database=mydb" +``` + +### Core parameters + +| Parameter | Description | +|-----------|-------------| +| `port` | Server port. Defaults to the database type's standard port. | +| `username` | Database username. | +| `database` | Default database name. | +| `color` | Connection color in the sidebar. | +| `tagName` | Tag to assign. | +| `groupName` | Group to place the connection in. | +| `safeModeLevel` | Safe Mode level: `silent`, `alert`, `alertFull`, `safeMode`, `safeModeFull`, or `readOnly`. | +| `aiPolicy` | AI access policy: `useDefault`, `alwaysAllow`, `askEachTime`, or `never`. | + +### SSH parameters + +Set `ssh=1` to enable SSH tunneling. + +| Parameter | Description | +|-----------|-------------| +| `sshHost` | SSH server hostname. | +| `sshPort` | SSH port. Default `22`. | +| `sshUsername` | SSH username. | +| `sshAuthMethod` | `password`, `privateKey`, `agent`, or `keyboardInteractive`. | +| `sshPrivateKeyPath` | Path to private key file. | +| `sshUseSSHConfig` | Set to `1` to read `~/.ssh/config`. | +| `sshAgentSocketPath` | Custom SSH agent socket path. | +| `sshJumpHosts` | JSON array of jump hosts. | +| `sshTotpMode` | TOTP mode for two-factor SSH auth. | + +### SSL parameters + +| Parameter | Description | +|-----------|-------------| +| `sslMode` | `disabled`, `preferred`, `required`, `verify-ca`, or `verify-full`. | +| `sslCaCertPath` | CA certificate file path. | +| `sslClientCertPath` | Client certificate file path. | +| `sslClientKeyPath` | Client key file path. | + +### Plugin-specific fields + +Use the `af_` prefix to pass driver-specific fields. For example, `af_replicaSet=myrs` passes `replicaSet` to the MongoDB plugin. ## Errors From 9a988151304aa1c709310176cd0e5e2e122525f2 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:32:35 +0700 Subject: [PATCH 12/83] docs: rewrite features/mcp as orientation page that links to external-api The previous page duplicated the External API tool catalog, token model, and stdio bridge config in less detail. It also hardcoded a stale default port (23508) and the internal Xcode target name (mcp-server) instead of the shipped binary name (tablepro-mcp). Replace with a focused page that covers the in-app Settings > MCP UI: enable toggle, lazy-start, remote access, TLS, audit log. Link to the canonical external-api pages for protocol details, the tool catalog, tokens, pairing, and client setup. Section anchors #enabling-the-server and #remote-access are preserved so existing cross-references from customization/settings.mdx and external-api/cursor-claude.mdx still resolve. --- docs/features/mcp.mdx | 307 +++++++++++------------------------------- 1 file changed, 81 insertions(+), 226 deletions(-) diff --git a/docs/features/mcp.mdx b/docs/features/mcp.mdx index 8e24e5ed4..bc8e62824 100644 --- a/docs/features/mcp.mdx +++ b/docs/features/mcp.mdx @@ -1,15 +1,42 @@ --- title: MCP Server -description: Built-in Model Context Protocol server for AI tool integration +description: Built-in Model Context Protocol server that exposes TablePro to AI clients --- # MCP Server -TablePro includes a built-in [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that lets AI tools query your databases through TablePro's saved connections. Runs locally by default. Supports remote access with token auth and TLS. +TablePro includes a built-in [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that lets AI clients query your databases through TablePro's saved connections. The MCP server is one of three pillars of the [External API](/external-api), alongside the URL scheme and the pairing flow. -## Enabling the Server +This page covers the in-app **Settings > MCP** UI. For protocol details, see the External API section. -Open **Settings > MCP** and toggle **Enable MCP Server**. Default port is `23508`. + + + JSON-RPC tools, input and output schemas. + + + Read-only resources for connection metadata, schema, and history. + + + Scopes, allowlists, expiry, revocation. + + + One-click flow to issue a token to an extension. + + + Stdio MCP setup using the bundled `tablepro-mcp` CLI. + + + Reference extension that uses URL scheme, MCP, and pairing. + + + +## Enabling the server + +Open **Settings > MCP** and toggle **Enable MCP Server**. + +The server starts on a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. The bundled `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. + +The server can also lazy-start. The first call to `tablepro://integrations/start-mcp` enables it on demand, so users do not have to flip the toggle before pairing an extension. MCP** and toggle **Enable MCP Server**. Default port is `23508 /> -Settings: - -- **Port** - default 23508 -- **Default row limit** - default 500 -- **Maximum row limit** - default 10,000 -- **Query timeout** - default 30 seconds -- **Log MCP queries in history** - show MCP queries in Query History -- **Authentication** - token auth with permission tiers -- **Remote access** - accept connections from other machines - -## Client Configuration - -### Auto-Setup (recommended) - -In **Settings > MCP**, click the setup button for your client. TablePro writes the config for you: +Settings on the same tab: -- **Setup for Claude Code** - uses the stdio bridge, no token needed -- **Setup for Claude Desktop** - writes to `claude_desktop_config.json` -- **Setup for Cursor** - writes to `~/.cursor/mcp.json` +- **Default row limit** (default 500) +- **Maximum row limit** (default 10,000) +- **Query timeout** (default 30 seconds) +- **Log MCP queries in history** (show MCP queries in Query History) -### Manual Setup +## MCP setup snippets -Add to your client's MCP config: +**Settings > MCP > MCP Setup** writes the config for popular clients in one click: -```json -{ - "mcpServers": { - "tablepro": { - "url": "http://127.0.0.1:23508/mcp" - } - } -} -``` - -With authentication: - -```json -{ - "mcpServers": { - "tablepro": { - "url": "http://127.0.0.1:23508/mcp", - "headers": { - "Authorization": "Bearer tp_your_token_here" - } - } - } -} -``` - -**Claude Code** (HTTP): +- **Setup for Claude Code** uses the stdio bridge, no token needed. +- **Setup for Claude Desktop** writes to `~/Library/Application Support/Claude/claude_desktop_config.json`. +- **Setup for Cursor** writes to `~/.cursor/mcp.json`. -```bash -claude mcp add tablepro --transport http http://127.0.0.1:23508/mcp -``` - -With auth: - -```bash -claude mcp add tablepro --transport http --header "Authorization: Bearer tp_your_token" https://192.168.1.x:23508/mcp -``` - -## Local Setup (Stdio Bridge) - -TablePro bundles a CLI at `Contents/MacOS/mcp-server` that connects to the running app via a local handshake file. No tokens or network config needed. - -Click **Setup for Claude Code** in Settings, or configure manually: - -```json -{ - "mcpServers": { - "tablepro": { - "command": "/Applications/TablePro.app/Contents/MacOS/mcp-server" - } - } -} -``` - -```bash -claude mcp add tablepro -- /Applications/TablePro.app/Contents/MacOS/mcp-server -``` - -TablePro must be running for the bridge to work. +For manual configuration, see [Cursor and Claude Desktop](/external-api/cursor-claude). The HTTP transport requires a token; see [Tokens](/external-api/tokens). ## Authentication -When enabled, every request needs a `Authorization: Bearer ` header. - -### Generating Tokens - -**Settings > MCP > Authentication > Generate Token**. Each token has: - -- **Name** - label like "Claude Code on VPS" or "CI server" -- **Permission tier** - Read Only, Read & Write, or Full Access -- **Connection access** - all connections or a specific allowlist -- **Expiry** - optional, default never - -You can create multiple tokens with different permissions. +Tokens are managed under **Settings > MCP > Authentication**. The pairing flow, scopes, allowlists, expiry, and revocation are documented in [Tokens](/external-api/tokens). -### Permission Tiers +The activity log under **Settings > MCP > Activity Log** shows every authentication, tool call, and resource read with the token id, category, action, connection, and outcome. Entries are kept for 90 days. -| Tier | What it can do | -|------|----------------| -| Read Only | Schema browsing, SELECT, SHOW, EXPLAIN, query history | -| Read & Write | Above + INSERT, UPDATE, DELETE, data export | -| Full Access | Above + DROP, TRUNCATE via `confirm_destructive_operation` | +## Remote access -Wrong tier returns 403. +The MCP server is localhost-only by default. Toggle **Remote access** under **Settings > MCP > Network** to accept connections from other machines. -### Connection Allowlist +Enabling remote access automatically requires authentication and TLS. -Each token can be restricted to specific connections. Requests to connections outside the allowlist get 403. +### Connection options -### Rate Limiting - -Failed auth triggers escalating lockouts per IP: - -| Failures | Lockout | -|----------|---------| -| 2 | 1 second | -| 3 | 5 seconds | -| 4 | 30 seconds | -| 5+ | 5 minutes | - -Success resets the counter. During lockout: 429 Too Many Requests. - -## Remote Access - -Default: localhost only. Enable remote access in **Settings > MCP > Network** to accept connections from other machines. - -This automatically enables TLS and requires authentication. - -### How to Connect - -**Tailscale** (easiest): install on both machines, connect via Tailscale IP: +**Tailscale** (recommended): install on both machines and connect via the Tailscale IP. ``` -https://100.x.y.z:23508/mcp +https://100.x.y.z:/mcp ``` -**SSH tunnel**: forward the port, no TLS trust needed: +**SSH tunnel**: forward the port. No TLS trust setup needed because the connection stays local on the remote side. ```bash -ssh -R 23508:127.0.0.1:23508 user@remote-server +ssh -R :127.0.0.1: user@remote-server ``` -Remote side connects to `http://127.0.0.1:23508/mcp` through the tunnel. +The remote side connects to `http://127.0.0.1:/mcp` through the tunnel. -**Direct LAN**: connect using the Mac's IP: +**Direct LAN**: connect using the Mac's IP. The client must trust the TLS certificate (see below). ``` -https://192.168.1.x:23508/mcp +https://192.168.1.x:/mcp ``` -Client must trust the TLS certificate (see below). - macOS firewall allows TablePro automatically (Developer ID signed). ## TLS -Auto-generated self-signed certificate when remote access is enabled. Valid 1 year. +When remote access is enabled, TablePro generates a self-signed certificate valid for 1 year. -- SHA-256 fingerprint shown in **Settings > MCP > Network** -- **Copy Certificate (PEM)** exports the cert for client trust stores -- **Regenerate** creates a new cert (invalidates existing trust) +- The SHA-256 fingerprint shows in **Settings > MCP > Network**. +- **Copy Certificate (PEM)** exports the certificate for client trust stores. +- **Regenerate** creates a new certificate (invalidates existing trust). Connect with PEM: ```bash -curl --cacert tablepro-mcp.pem https://192.168.1.x:23508/mcp +curl --cacert tablepro-mcp.pem https://192.168.1.x:/mcp ``` Connect with fingerprint pinning: ```bash -curl --pinnedpubkey "sha256//FINGERPRINT" https://192.168.1.x:23508/mcp +curl --pinnedpubkey "sha256//FINGERPRINT" https://192.168.1.x:/mcp ``` -## Available Tools - -### Connection tools - -| Tool | Description | -|------|-------------| -| `list_connections` | List all saved connections with status | -| `connect` | Connect to a saved database | -| `disconnect` | Disconnect from a database | -| `get_connection_status` | Connection details (version, uptime) | - -### Schema tools - -| Tool | Parameters | Description | -|------|-----------|-------------| -| `list_databases` | `connection_id` | List databases | -| `list_schemas` | `connection_id`, `database`? | List schemas | -| `list_tables` | `connection_id`, `database`?, `schema`?, `include_row_counts`? | List tables and views | -| `describe_table` | `connection_id`, `table_name`, `schema`? | Columns, indexes, foreign keys, DDL | -| `get_table_ddl` | `connection_id`, `table_name`, `schema`? | CREATE TABLE statement | - -### Query tools - -| Tool | Parameters | Description | -|------|-----------|-------------| -| `execute_query` | `connection_id`, `query`, `max_rows`?, `timeout_seconds`?, `database`?, `schema`? | Run a query (Safe Mode applies) | -| `confirm_destructive_operation` | `connection_id`, `query`, `confirmation_phrase` | Run DROP/TRUNCATE after confirmation | -| `export_data` | `connection_id`, `format` (csv/json/sql), `tables`?, `query`?, `max_rows`? | Export data. Default 50,000 rows, max 100,000. | -| `switch_database` | `connection_id`, `database` | Switch active database | -| `switch_schema` | `connection_id`, `schema` | Switch active schema | - -`?` = optional. - -### Resources - -| Resource | Description | -|----------|-------------| -| `tablepro://connections` | All saved connections with metadata | -| `tablepro://connections/{id}/schema` | Schema for a connected database (max 100 tables) | -| `tablepro://connections/{id}/history` | Recent query history | - -History parameters: `?limit=N` (1-500), `?search=text`, `?date_filter=today|thisWeek|thisMonth`. - -Resources respect token connection allowlists. - -## Security - -All safety controls run server-side. AI clients cannot bypass them. - -### Network - -- Localhost only by default -- Remote access requires both auth and TLS -- Origin validation prevents DNS rebinding (localhost, 127.0.0.1, ::1) - -### Connection Access - -Each connection has an AI Policy (Always Allow / Ask Each Time / Never). Set per connection or change the default in **Settings > AI**. - -Token allowlist is checked before AI Policy. Blocked at token level = rejected before the dialog. - -### Query Safety - -| Tier | Examples | Behavior | -|------|----------|----------| -| Safe | SELECT, SHOW, EXPLAIN | Runs immediately | -| Write | INSERT, UPDATE, DELETE | Subject to [Safe Mode](/features/safe-mode) | -| Destructive | DROP, TRUNCATE, ALTER...DROP | Blocked. Use `confirm_destructive_operation` with phrase "I understand this is irreversible" | - -### Limits +## Origin and DNS rebinding protection -- Rows: 500 default, 10,000 max per query -- Export: 50,000 default, 100,000 max -- Timeout: 30s default, 300s max -- Single statements only -- Query size: 100 KB -- HTTP body: 10 MB -- Sessions: 10 max, 5 min idle timeout +The server validates the `Origin` header against `localhost`, `127.0.0.1`, and `::1`. Browsers and DNS-rebinding tricks cannot reach the API even when remote access is off. -### Data Access +## What the server cannot access -Can access: connection metadata, schemas, query results, history. +| Capability | State | +|-----------|-------| +| Read connection passwords | no | +| Read SSH keys | no | +| Read license data | no | +| Read app settings | no | +| Read local files outside `~/Library/Application Support/com.TablePro/` | no | +| Mutate Safe Mode rules | no | -Cannot access: passwords, SSH keys, license data, app settings, local files. +The reachable surface is the [tool catalog](/external-api/mcp-tools) and the [URL scheme](/external-api/url-scheme). ## Troubleshooting -**Port conflict**: Change port in **Settings > MCP**. +**Port conflict**: the server picks a different free port from the `51000-52000` range on next launch. The handshake file is rewritten. -**"Server not fully initialized"**: Restart MCP server from Settings. If it persists, relaunch TablePro. +**"Server not fully initialized"**: restart the MCP server from Settings. If it persists, relaunch TablePro. -**App must be running**: MCP server only runs while TablePro is open. +**App must be running**: the MCP server only runs while TablePro is open. The stdio bridge fires `tablepro://integrations/start-mcp` to launch the app on cold start. -**Connection refused**: Check server is running (green indicator). Verify the URL and port match. +**Connection refused**: check the green status indicator in **Settings > MCP**. Verify the URL and port match the handshake file. -**401 Unauthorized**: Auth is enabled. Add a Bearer token to your config. Generate one in **Settings > MCP > Authentication**. +**`401 Unauthorized`**: the token is missing, expired, or revoked. Generate a new one in **Settings > MCP > Authentication**, or run the pair command in your extension. -**403 Forbidden**: Token lacks permission for this operation, or connection not in the token's allowlist. +**`403 Forbidden`**: the token's allowlist excludes the connection, the connection's `externalAccess` is `blocked`, or the SQL is a write against a `readOnly` connection. -**Certificate trust error**: Export the PEM from **Settings > MCP > Network** and add it to your client's trust store. Or use fingerprint pinning. +**Certificate trust error**: export the PEM from **Settings > MCP > Network** and add it to your client's trust store, or use fingerprint pinning. -**429 Too Many Requests**: Too many failed auth attempts. Wait up to 5 minutes. The lockout resets after a successful auth. +**`429 Too Many Requests`**: too many failed auth attempts. The lockout escalates to 5 minutes and resets on the next successful auth. From 6f5437eb6a204172fdde7d4405bbf5f9c0384282 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:33:10 +0700 Subject: [PATCH 13/83] docs: remove stale features/deep-links page, update nav and cards The page documented the pre-0.37 'tablepro://connect/' syntax, which contradicts external-api/url-scheme.mdx (UUID-keyed paths only). Database URL schemes (mysql://, postgresql://, etc.) are already canonical in databases/connection-urls.mdx, and the tablepro://import parameter table now lives in external-api/url-scheme.mdx. - Delete docs/features/deep-links.mdx - Update features/overview.mdx Workflow card to point to external-api/url-scheme - Remove features/deep-links from docs.json Workflow group --- docs/docs.json | 3 +- docs/features/deep-links.mdx | 183 ----------------------------------- docs/features/overview.mdx | 4 +- 3 files changed, 3 insertions(+), 187 deletions(-) delete mode 100644 docs/features/deep-links.mdx diff --git a/docs/docs.json b/docs/docs.json index 9a45b2af4..4f3320fdb 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -121,8 +121,7 @@ "features/tabs", "features/query-history", "features/sql-favorites", - "features/keyboard-shortcuts", - "features/deep-links" + "features/keyboard-shortcuts" ] }, { diff --git a/docs/features/deep-links.mdx b/docs/features/deep-links.mdx deleted file mode 100644 index 2588988f8..000000000 --- a/docs/features/deep-links.mdx +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: Deep Links -description: Open connections, tables, and queries from the terminal or other apps using database URLs or tablepro:// links ---- - -# Deep Links - -TablePro supports two URL-based entry points: standard database URLs (`mysql://`, `postgresql://`, etc.) and the custom `tablepro://` scheme. - -## Database URLs - -Open any database connection directly using its standard URL. Works from the terminal, scripts, Alfred, Raycast, or any app that can open URLs. - -### Supported Schemes - -| Scheme | Database | -|--------|----------| -| `mysql://` | MySQL / MariaDB | -| `postgresql://`, `postgres://` | PostgreSQL | -| `mongodb://`, `mongodb+srv://` | MongoDB | -| `redis://`, `rediss://` | Redis | -| `mssql://`, `sqlserver://` | SQL Server | -| `sqlite://` | SQLite (local file path) | -| `redshift://` | Amazon Redshift | -| `oracle://` | Oracle | -| `clickhouse://` | ClickHouse | -| `cassandra://` | Cassandra | -| `scylladb://` | ScyllaDB | -| `duckdb://` | DuckDB | -| `etcd://` | etcd | -| `d1://` | Cloudflare D1 | -| `libsql://` | libSQL / Turso | - -### URL Format - -``` -scheme://[username[:password]@]host[:port][/database][?param=value] -``` - -### Examples - -```bash -# MySQL -open "mysql://root@localhost/mydb" -a TablePro - -# PostgreSQL with port and database -open "postgresql://admin@db.example.com:5432/analytics" -a TablePro - -# MongoDB -open "mongodb://localhost:27017/mydb" -a TablePro - -# Redis -open "redis://localhost:6379" -a TablePro - -# SQLite (local file) -open "sqlite:///Users/me/data/app.db" -a TablePro -``` - -TablePro checks if a saved connection matches the URL. If found, it reuses that connection. If the connection is already open, the existing window comes to front. Otherwise, a temporary connection is created. - -### Query Parameters - -Pass additional options as query parameters: - -| Parameter | Description | -|-----------|-------------| -| `table` | Open a specific table after connecting | -| `column`, `operation`, `value` | Apply a filter on the opened table | -| `condition` | Apply a raw SQL WHERE condition | -| `schema` | Switch to a specific schema (PostgreSQL) or database (MySQL) after connecting | - -```bash -# Open a table with a filter -open "mysql://root@localhost/mydb?table=users&column=status&operation==&value=active" -a TablePro - -# Open with a raw SQL condition -open "postgresql://admin@localhost/mydb?table=orders&condition=total%20%3E%20100" -a TablePro - -# Switch schema on connect -open "postgresql://admin@localhost/mydb?schema=reporting" -a TablePro -``` - - -Passwords can be included in URLs (`mysql://user:pass@host/db`), but avoid sharing URLs that contain passwords. Prefer saved connections with Keychain-stored passwords. - - -## Custom Deep Links (tablepro://) - -## URL Patterns - -### Open a Connection - -``` -tablepro://connect/{name} -``` - -Opens the saved connection matching `{name}`. If no match is found, an error alert appears. - -```bash -open "tablepro://connect/Production" -``` - -### Open a Table - -``` -tablepro://connect/{name}/table/{table} -tablepro://connect/{name}/database/{db}/table/{table} -``` - -Connects and opens the specified table. The second form targets a specific database on the connection. - -```bash -open "tablepro://connect/Production/table/users" -open "tablepro://connect/Production/database/analytics/table/events" -``` - -### Open a Query - -``` -tablepro://connect/{name}/query?sql={encoded_sql} -``` - -Connects and opens a new query tab with the SQL pre-filled. The SQL must be percent-encoded. A confirmation dialog shows the SQL before opening, so you can verify the query is safe. - -```bash -open "tablepro://connect/Production/query?sql=SELECT%20*%20FROM%20users%20LIMIT%2010" -``` - -### Import a Connection - -``` -tablepro://import?name={n}&host={h}&port={p}&type={t}&username={u}&database={db} -``` - -Creates a new saved connection and opens the connection form for review. A confirmation dialog shows the connection details before adding, so you can reject unexpected imports. You can add a password before connecting. - -```bash -open "tablepro://import?name=Staging&host=db.example.com&port=5432&type=postgresql&username=admin&database=mydb" -``` - -**Required parameters:** `name`, `host`, `type` - -**Core parameters:** - -| Parameter | Description | -|-----------|-------------| -| `port` | Server port (defaults to the database type's standard port) | -| `username` | Database username | -| `database` | Default database name | -| `color` | Connection color in the sidebar | -| `tagName` | Tag to assign | -| `groupName` | Group to place the connection in | -| `safeModeLevel` | Safe mode level (e.g., `silent`, `alert`, `readOnly`) | -| `aiPolicy` | MCP AI access policy | - -**SSH parameters** (set `ssh=1` to enable): - -| Parameter | Description | -|-----------|-------------| -| `sshHost` | SSH server hostname | -| `sshPort` | SSH port (default 22) | -| `sshUsername` | SSH username | -| `sshAuthMethod` | `password`, `privateKey`, `agent`, or `keyboardInteractive` | -| `sshPrivateKeyPath` | Path to private key file | -| `sshUseSSHConfig` | Set to `1` to read `~/.ssh/config` | -| `sshAgentSocketPath` | Custom SSH agent socket path | -| `sshJumpHosts` | JSON array of jump hosts | -| `sshTotpMode` | TOTP mode for two-factor SSH auth | - -**SSL parameters:** - -| Parameter | Description | -|-----------|-------------| -| `sslMode` | SSL mode (e.g., `require`, `verify-ca`, `verify-full`) | -| `sslCaCertPath` | CA certificate file path | -| `sslClientCertPath` | Client certificate file path | -| `sslClientKeyPath` | Client key file path | - -**Plugin-specific fields:** Use the `af_` prefix for additional fields specific to a database plugin. For example, `af_replicaSet=myrs` passes `replicaSet` to the plugin. - -Supported `type` values: any registered database type name (case-insensitive). Examples: `MySQL`, `PostgreSQL`, `MongoDB`, `Redis`, `ClickHouse`, `Oracle`, `DuckDB`, `Cassandra`. - - diff --git a/docs/features/overview.mdx b/docs/features/overview.mdx index 78ff446fd..0360ac303 100644 --- a/docs/features/overview.mdx +++ b/docs/features/overview.mdx @@ -90,8 +90,8 @@ Every feature in TablePro, grouped so you can jump straight to what you need. Full shortcut reference. - - `tablepro://` URLs to open connections and tables. + + `tablepro://` URLs to open connections, tables, and queries. From 34f79dd942e28b3f81d2a5865f86817bdcec86ab Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:46:16 +0700 Subject: [PATCH 14/83] docs: rename cursor-claude to mcp-clients with generic guide and 9 client sections --- docs/docs.json | 2 +- docs/external-api/cursor-claude.mdx | 103 ------------- docs/external-api/index.mdx | 4 +- docs/external-api/mcp-clients.mdx | 216 ++++++++++++++++++++++++++++ docs/external-api/mcp-tools.mdx | 2 +- docs/features/mcp.mdx | 6 +- 6 files changed, 223 insertions(+), 110 deletions(-) delete mode 100644 docs/external-api/cursor-claude.mdx create mode 100644 docs/external-api/mcp-clients.mdx diff --git a/docs/docs.json b/docs/docs.json index 4f3320fdb..07261caf5 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -165,7 +165,7 @@ "external-api/pairing", "external-api/tokens", "external-api/raycast", - "external-api/cursor-claude", + "external-api/mcp-clients", "external-api/versioning" ] } diff --git a/docs/external-api/cursor-claude.mdx b/docs/external-api/cursor-claude.mdx deleted file mode 100644 index 79012a2f6..000000000 --- a/docs/external-api/cursor-claude.mdx +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Cursor and Claude Desktop -description: Wire stdio MCP into Cursor or Claude Desktop using the bundled tablepro-mcp CLI ---- - -# Cursor and Claude Desktop - -TablePro ships a stdio MCP bridge at `/Applications/TablePro.app/Contents/MacOS/tablepro-mcp`. Any MCP-aware client that supports the stdio transport can use it with no extension and no token. - -The bridge: - -1. Reads `~/Library/Application Support/com.TablePro/mcp-handshake.json` for the local port and bridge token. -2. If the file is missing, fires `tablepro://integrations/start-mcp` to lazy-start the server, then waits up to 10 seconds for the handshake. -3. Streams JSON-RPC over stdio and forwards each message to localhost HTTP with a bridge-specific bearer. - -Because the bridge reuses the in-app handshake, you do not need to mint a token for stdio. The TablePro app must be running. You can keep it minimized. - -## Cursor - -Edit `~/.cursor/mcp.json`: - -```json -{ - "mcpServers": { - "tablepro": { - "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" - } - } -} -``` - -Restart Cursor. The TablePro tools appear under `@mcp` and are callable from chat. - -## Claude Desktop - -Edit `~/Library/Application Support/Claude/claude_desktop_config.json`: - -```json -{ - "mcpServers": { - "tablepro": { - "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" - } - } -} -``` - -Restart Claude Desktop. TablePro tools show up in the tool picker. - -## Claude Code - -Use the `claude mcp add` CLI: - -```bash -claude mcp add tablepro -- /Applications/TablePro.app/Contents/MacOS/tablepro-mcp -``` - -This writes the same stdio config under the hood. - -## Setup snippets in TablePro - -Open **Settings > MCP > MCP Setup** and pick a client. TablePro shows the exact JSON or shell command to paste into the client's config. - -## HTTP instead of stdio - -If you prefer HTTP, mint a token in **Settings > MCP > Authentication** and configure: - -```json -{ - "mcpServers": { - "tablepro": { - "url": "http://127.0.0.1:23508/mcp", - "headers": { - "Authorization": "Bearer tp_your_token_here" - } - } - } -} -``` - -Replace `23508` with the port shown in **Settings > MCP > MCP Configuration**. HTTP is the right choice when: - -- The client and TablePro run on different machines (with TLS, see [MCP Server](/features/mcp#remote-access)). -- You want a token with a tighter scope than the bridge token. -- The client does not support stdio. - -The handshake-based stdio bridge is the better default on the same machine. - -## What the AI sees - -AI clients see the full [tool catalog](/external-api/mcp-tools). For an unfamiliar schema, the AI is expected to call `describe_table` before generating SQL. For mutating SQL, the AI must request user confirmation through the host's tool-confirmation mechanism. Cursor surfaces this as a "Run tool?" prompt. Claude Desktop and Claude Code use their own confirmation UI. - -The connection's `externalAccess` setting and the token scope still apply on top. A read-only connection rejects writes regardless of what the AI tries. - -## Troubleshooting - -**`tablepro-mcp` exits immediately.** TablePro is not running or the build is older than 0.37. Open TablePro and re-launch the client. - -**Bridge says "handshake timeout".** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > MCP** and toggle **Enable MCP Server** off and on, then re-launch the client. - -**Tool calls return `403`.** The connection's `externalAccess` is `blocked` or `readOnly`. Open the connection editor in TablePro and adjust under **External Access**. - -**Tool calls return `401`.** The bridge token is stale (TablePro was reinstalled or the Application Support data was wiped). Quit and reopen TablePro to regenerate the handshake. diff --git a/docs/external-api/index.mdx b/docs/external-api/index.mdx index 1448e446d..4c77a2520 100644 --- a/docs/external-api/index.mdx +++ b/docs/external-api/index.mdx @@ -50,7 +50,7 @@ Every request is recorded in the activity log. Open **Settings > MCP > Activity ## Quick start - Install the [Raycast extension](/external-api/raycast) and run `Pair with TablePro`. -- Or wire stdio MCP into [Cursor or Claude Desktop](/external-api/cursor-claude) without an extension. +- Or wire stdio MCP into your [MCP client](/external-api/mcp-clients) without an extension. - Or open a deep link from your shell: ```bash @@ -69,5 +69,5 @@ The External API follows TablePro's semver. Paths and tools are additive within - [Pairing](/external-api/pairing): sequence diagram and PKCE flow. - [Tokens](/external-api/tokens): scope model, allowlists, revocation. - [Raycast](/external-api/raycast): extension install and command list. -- [Cursor and Claude Desktop](/external-api/cursor-claude): stdio MCP setup. +- [MCP Clients](/external-api/mcp-clients): stdio MCP setup for Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed, Windsurf, Goose, and custom clients. - [Versioning](/external-api/versioning): stability policy. diff --git a/docs/external-api/mcp-clients.mdx b/docs/external-api/mcp-clients.mdx new file mode 100644 index 000000000..79c421be0 --- /dev/null +++ b/docs/external-api/mcp-clients.mdx @@ -0,0 +1,216 @@ +--- +title: MCP Clients +description: Connect Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed, Windsurf, Goose, and custom clients to TablePro over stdio +--- + +# MCP Clients + +Any MCP client that supports the stdio transport and lets you point it at a command on disk can connect to TablePro. The pattern is the same across every client: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +The `tablepro-mcp` CLI ships inside the app bundle. It reads `~/Library/Application Support/com.TablePro/mcp-handshake.json` for the local port and a bridge token, then forwards stdio JSON-RPC to the running app's HTTP MCP server. If the handshake file is missing, the CLI fires `tablepro://integrations/start-mcp` to lazy-start the server and waits up to 10 seconds for the handshake to appear. The TablePro app must be running; you can keep it minimized. + +You do not pass a token in the client config. The bridge reuses the in-app handshake, so the token issued during pairing stays inside TablePro. The Raycast extension or any `tablepro://integrations/pair?...` link triggers the one-time pairing flow that puts a token on disk; clients launched via stdio inherit that trust automatically. + +If TablePro is installed somewhere other than `/Applications` (for example, Setapp or a custom path), replace the `command` value with the absolute path to your bundle's `tablepro-mcp` binary. + +## Claude Desktop + +Edit `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +Restart Claude Desktop. Open a new chat, click the connectors icon below the input, and confirm `tablepro` is listed with its tools enabled. + +## Claude Code + +Use the `claude mcp add` CLI: + +```bash +claude mcp add --transport stdio tablepro -- /Applications/TablePro.app/Contents/MacOS/tablepro-mcp +``` + +The double dash separates Claude Code's flags from the command it runs. Verify with `claude mcp list`. + +## Cursor + +Edit `~/.cursor/mcp.json` for global access, or `.cursor/mcp.json` in the project root for per-project access: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +Restart Cursor. The TablePro tools appear under `@mcp` in chat. + +## Cline + +Cline is a VS Code extension. Open the Cline panel, click the MCP Servers icon in its top nav, and choose **Configure MCP Servers** to open `cline_mcp_settings.json`: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp", + "disabled": false, + "alwaysAllow": [] + } + } +} +``` + +Reload the Cline panel. The server status indicator should turn green. + +## Continue + +Continue (`continue.dev`) reads MCP configs from `.continue/mcpServers/` in your workspace. Create `.continue/mcpServers/tablepro.yaml`: + +```yaml +mcpServers: + - name: tablepro + type: stdio + command: /Applications/TablePro.app/Contents/MacOS/tablepro-mcp +``` + +If you prefer JSON, drop the same shape into `.continue/mcpServers/tablepro.json` using the standard `mcpServers` object form. Reload Continue's config from the gear menu. + +## Zed + +Zed keys MCP servers under `context_servers`, not `mcpServers`. Edit `~/.config/zed/settings.json` (or open it via **Zed > Settings**): + +```json +{ + "context_servers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp", + "args": [], + "env": {} + } + } +} +``` + +Open the Agent Panel; the TablePro entry should show a green status dot. + +## Windsurf + +Edit `~/.codeium/windsurf/mcp_config.json`. From inside Windsurf, click the MCP icon in the Cascade panel and choose **Configure** to open this file: + +```json +{ + "mcpServers": { + "tablepro": { + "command": "/Applications/TablePro.app/Contents/MacOS/tablepro-mcp" + } + } +} +``` + +Restart the Cascade panel. TablePro's tools appear in the tool picker. + +## Goose + +Goose is the Block CLI agent (now hosted at the Agentic AI Foundation). Run `goose configure`, choose **Add Extension > Command-line Extension**, and enter: + +- **Name**: `tablepro` +- **Command**: `/Applications/TablePro.app/Contents/MacOS/tablepro-mcp` +- **Timeout**: `300` + +The wizard writes the entry to `~/.config/goose/config.yaml`. To edit by hand, add an entry under `extensions`: + +```yaml +extensions: + tablepro: + type: stdio + cmd: /Applications/TablePro.app/Contents/MacOS/tablepro-mcp + args: [] + enabled: true + timeout: 300 +``` + +Run `goose session` and ask for the tool list to confirm. + +## Generic or custom client + +If you are building a client against the [MCP specification](https://modelcontextprotocol.io), TablePro speaks two transports: + +- **stdio**: spawn `/Applications/TablePro.app/Contents/MacOS/tablepro-mcp` with no arguments. The CLI handles the handshake and forwards JSON-RPC over its stdin and stdout. No token, no environment variables. +- **HTTP**: connect to `http://127.0.0.1:/mcp` using the port from `~/Library/Application Support/com.TablePro/mcp-handshake.json` and a bearer token issued via [Pairing](/external-api/pairing). See [Tokens](/external-api/tokens) for scope rules. + +For most desktop clients, stdio is the right default. Use HTTP when the client lives on a different machine, when you need a tighter token scope than the bridge token, or when the client cannot spawn a local process. See [MCP Server](/features/mcp#remote-access) for remote setup. + +## HTTP transport + +If your client cannot use stdio, mint a token in **Settings > MCP > Authentication** and configure HTTP directly. The shape varies by client; here is the Cursor form: + +```json +{ + "mcpServers": { + "tablepro": { + "url": "http://127.0.0.1:23508/mcp", + "headers": { + "Authorization": "Bearer tp_your_token_here" + } + } + } +} +``` + +Replace `23508` with the port shown in **Settings > MCP > MCP Configuration**. Other clients use the same `url` plus `headers` shape, sometimes under `type: streamable-http`. Check the client's docs. + +## Setup snippets in TablePro + +Open **Settings > MCP > MCP Setup** and pick a client. TablePro shows the exact JSON or shell command to paste into the client's config, with the correct paths for your install. + +## What the AI sees + +AI clients see the full [tool catalog](/external-api/mcp-tools). For an unfamiliar schema, the AI is expected to call `describe_table` before generating SQL. For mutating SQL, the AI must request user confirmation through the host's tool-confirmation mechanism. Hosts like Cursor, Claude Desktop, Claude Code, Cline, and Windsurf each surface this with their own UI. + +The connection's `externalAccess` setting and the token scope still apply. A read-only connection rejects writes regardless of what the AI tries. + +## Verify the connection + +After configuring a client, the fastest check is to ask it to list TablePro tools or call `list_connections`. Success looks like: + +- The client lists tools such as `list_connections`, `list_tables`, `describe_table`, and `execute_query`. +- A `list_connections` call returns the connections you have saved in TablePro (id, name, type). + +If the call fails, the response code tells you which layer rejected it: + +- **stdio process exits immediately**: TablePro is not running, or you are on a build older than 0.37. Open TablePro and re-launch the client. +- **`401 Unauthorized`**: the bridge token is stale. Quit and reopen TablePro to regenerate the handshake. +- **`403 Forbidden`**: the connection's `externalAccess` is `blocked` or `readOnly`, or the token's allowlist excludes it. Open the connection editor in TablePro and adjust under **External Access**. + +## Troubleshooting + +**Handshake timeout.** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > MCP** and toggle **Enable MCP Server** off and on, then re-launch the client. + +**Stale handshake file.** Delete `~/Library/Application Support/com.TablePro/mcp-handshake.json` and reopen TablePro. The app rewrites the file on launch. + +**Setapp or non-default install path.** Replace `/Applications/TablePro.app` in the `command` with the absolute path to your install. For Setapp the bundle lives under `~/Applications/Setapp/TablePro.app`. + +**Port conflict.** TablePro picks a different free port from the `51000-52000` range on next launch and rewrites the handshake file. The stdio bridge re-reads it automatically. + +**Tool calls return `403 Connection is read-only for external clients`.** The connection's external access is `readOnly` and the SQL is a write. Either change external access in TablePro, or run the query in TablePro's editor. diff --git a/docs/external-api/mcp-tools.mdx b/docs/external-api/mcp-tools.mdx index 28b8a166a..fb360ca26 100644 --- a/docs/external-api/mcp-tools.mdx +++ b/docs/external-api/mcp-tools.mdx @@ -14,7 +14,7 @@ The same tool catalog is available over two transports: - **HTTP**: `http://127.0.0.1:/mcp` (port from the handshake file). Bearer token in `Authorization` header. - **stdio**: bundled `tablepro-mcp` CLI bridges stdio JSON-RPC to localhost HTTP. No token needed because the bridge reuses the in-app handshake. -See [Cursor and Claude Desktop](/external-api/cursor-claude) for stdio config snippets. +See [MCP Clients](/external-api/mcp-clients) for stdio config snippets. ## Scope and access matrix diff --git a/docs/features/mcp.mdx b/docs/features/mcp.mdx index bc8e62824..3f3573cb8 100644 --- a/docs/features/mcp.mdx +++ b/docs/features/mcp.mdx @@ -22,8 +22,8 @@ This page covers the in-app **Settings > MCP** UI. For protocol details, see the One-click flow to issue a token to an extension. - - Stdio MCP setup using the bundled `tablepro-mcp` CLI. + + Stdio MCP setup for Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed, Windsurf, Goose, and custom clients. Reference extension that uses URL scheme, MCP, and pairing. @@ -66,7 +66,7 @@ Settings on the same tab: - **Setup for Claude Desktop** writes to `~/Library/Application Support/Claude/claude_desktop_config.json`. - **Setup for Cursor** writes to `~/.cursor/mcp.json`. -For manual configuration, see [Cursor and Claude Desktop](/external-api/cursor-claude). The HTTP transport requires a token; see [Tokens](/external-api/tokens). +For manual configuration, see [MCP Clients](/external-api/mcp-clients). The HTTP transport requires a token; see [Tokens](/external-api/tokens). ## Authentication From 24d8203281c4f75bb241546fe62c3926d519929d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:54:11 +0700 Subject: [PATCH 15/83] docs: surface External API in landing page and features overview --- docs/features/overview.mdx | 6 ++++++ docs/index.mdx | 1 + 2 files changed, 7 insertions(+) diff --git a/docs/features/overview.mdx b/docs/features/overview.mdx index 0360ac303..6041c2fef 100644 --- a/docs/features/overview.mdx +++ b/docs/features/overview.mdx @@ -36,6 +36,12 @@ Every feature in TablePro, grouped so you can jump straight to what you need. Expose TablePro to Claude and other MCP clients. + + URL scheme, MCP, and pairing for Raycast, Cursor, Claude Desktop. + + + Search connections, run queries, focus tabs from Raycast. + ## Views diff --git a/docs/index.mdx b/docs/index.mdx index de7130abc..4d851a42d 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -49,6 +49,7 @@ Native macOS client for every database. Built on SwiftUI and AppKit. Ships under **AI Assistant**: Chat, inline suggestions, and Explain/Optimize via GitHub Copilot, Claude, OpenAI, or Ollama. **Terminal**: Built-in database CLI (mysql, psql, redis-cli, mongosh, etc.) with SSH and Docker support. **MCP Server**: Expose your connections to AI tools via the Model Context Protocol. +**External API**: Drive TablePro from Raycast, Cursor, Claude Desktop, and other MCP clients. URL scheme, MCP, and one-click pairing. **Plugin System**: 8 built-in drivers, 10 more via the plugin registry. Third-party plugins supported. **iCloud Sync**: Sync connections, groups, tags, settings, and SSH profiles across Macs. **Safe Mode**: 6 per-connection protection levels from silent alerts to Touch ID and read-only. From e7080918693954cc7f15d3070300166950c0abdd Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:55:08 +0700 Subject: [PATCH 16/83] docs: add External Access and external client notes to connection-related pages --- docs/databases/overview.mdx | 11 +++++++++++ docs/features/ai-assistant.mdx | 9 +++++++++ docs/features/connection-sharing.mdx | 16 +++++++++++++++- docs/features/safe-mode.mdx | 12 ++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/docs/databases/overview.mdx b/docs/databases/overview.mdx index 586511210..bf0a7a8f0 100644 --- a/docs/databases/overview.mdx +++ b/docs/databases/overview.mdx @@ -243,6 +243,17 @@ SSL/TLS is not available for SQLite connections (file-based, no network involved /> +#### Advanced Section + +Open the **Advanced** tab on the connection form for the following settings: + +| Field | Description | +|-------|-------------| +| **Startup Commands** | SQL statements that run automatically on every connection. See [Startup Commands](#startup-commands). | +| **External Access** | Controls how external clients (Raycast, Cursor, Claude Desktop) reach this connection: `blocked`, `readOnly` (default), or `readWrite`. Tokens cannot exceed this level. See [External API](/external-api). | +| **Local only** | Excludes this connection from iCloud Sync. See [iCloud Sync](/features/icloud-sync). | +| **Plugin fields** | Driver-specific options (for example, MongoDB `replicaSet`, ClickHouse `Secure`). | + ## Organizing Connections Colors tint the toolbar when you connect (red for production, green for development). Tags group connections in the sidebar. diff --git a/docs/features/ai-assistant.mdx b/docs/features/ai-assistant.mdx index a4cd1671f..fb773b2d8 100644 --- a/docs/features/ai-assistant.mdx +++ b/docs/features/ai-assistant.mdx @@ -191,3 +191,12 @@ Set a per-connection AI policy in the connection form: **Use Default**, **Always alt="Per-connection AI policy" /> + +### External AI clients + +External clients (Raycast, Cursor, Claude Desktop, and other MCP clients) call the same AI tools through the [External API](/external-api). Two per-connection settings gate them: + +- **AI policy** decides whether the connection is reachable by AI clients at all. `Never` blocks every external AI tool call against this connection. +- **External Access** caps the level: `blocked`, `readOnly` (default), or `readWrite`. A token's effective permission is `MIN(token.scope, connection.externalAccess)`. Set this in the connection form's **Advanced** tab. + +See [Tokens](/external-api/tokens) for the scope model. diff --git a/docs/features/connection-sharing.mdx b/docs/features/connection-sharing.mdx index 65c16aeab..9e017f330 100644 --- a/docs/features/connection-sharing.mdx +++ b/docs/features/connection-sharing.mdx @@ -87,12 +87,26 @@ Groups and folders carry over. ## Share via Link -Right-click > **Copy as Import Link**. Paste in Slack, a wiki, or a README. +Two link forms ship with TablePro. Pick the one that matches what you want to share. + +### Copy as Import Link + +Right-click > **Copy as Import Link**. Produces a `tablepro://import?...` URL with host, port, type, and username (no password). Paste in Slack, a wiki, or a README. The recipient opens the link, reviews the prefilled form, adds their own password, and saves. ``` tablepro://import?name=Staging&host=db.example.com&port=5432&type=PostgreSQL&username=admin ``` +### Copy Connection Deep Link + +Right-click > **Copy Connection Deep Link**. Produces a `tablepro://connect/` URL that opens the connection you already have saved. The link refers to your local connection record by UUID, so it only works on a Mac that already has the same connection saved (for example, your other Mac with iCloud Sync, or a teammate who imported the connection). Use this form for bookmarks, Raycast Quicklinks, or shell aliases. + +``` +tablepro://connect/9f1f0c3e-2e3d-4b14-9c3a-1d2f4ad1f6f1 +``` + +See [URL Scheme](/external-api/url-scheme#open-a-connection) for the full path syntax (table targets, query parameters, percent-encoding). + ## Encrypted Export Pro Include passwords in the export, protected by a passphrase (AES-256-GCM). diff --git a/docs/features/safe-mode.mdx b/docs/features/safe-mode.mdx index 31591bb8e..28db4e788 100644 --- a/docs/features/safe-mode.mdx +++ b/docs/features/safe-mode.mdx @@ -71,3 +71,15 @@ The current Safe Mode level appears as a badge in the toolbar (orange for Alert Safe Mode gates apply to query execution, saving cell edits, table operations, and sidebar changes. +## External Clients + +Safe Mode runs inside the app on every query you execute. External clients (Raycast, Cursor, Claude Desktop, and other MCP clients) hit a separate gate first. + +A write request from an external client clears three locks in this order: + +1. **External Access** (per-connection, `blocked` / `readOnly` / `readWrite`). Set in the connection form's **Advanced** tab. A `readOnly` connection rejects any write before the request reaches the database. +2. **Token scope** (per-integration, `readOnly` / `readWrite` / `fullAccess`). Issued by the [pairing flow](/external-api/pairing) and bounded by External Access: effective permission is `MIN(token.scope, connection.externalAccess)`. +3. **Safe Mode** (per-query). The same rules on this page apply once the request has been routed to the connection. Touch ID prompts and confirmation dialogs still appear, even for queries originating from an external client. + +DROP and TRUNCATE always need an explicit confirmation phrase via the `confirm_destructive_operation` tool, regardless of token scope. See [External API security model](/external-api#security-model). + From a149cca29d49f62eeaa2ee814eed73d5093ab715 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:55:45 +0700 Subject: [PATCH 17/83] docs: cross-link External API from tabs, query history, and keyboard shortcuts --- docs/features/keyboard-shortcuts.mdx | 10 ++++++++++ docs/features/query-history.mdx | 6 ++++++ docs/features/tabs.mdx | 11 +++++++++++ 3 files changed, 27 insertions(+) diff --git a/docs/features/keyboard-shortcuts.mdx b/docs/features/keyboard-shortcuts.mdx index fdddcbeed..b4877fc81 100644 --- a/docs/features/keyboard-shortcuts.mdx +++ b/docs/features/keyboard-shortcuts.mdx @@ -382,3 +382,13 @@ Click **Reset to Defaults** to restore all shortcuts to their original values. Tab switching shortcuts (`Cmd+1` through `Cmd+9`) follow standard macOS convention and cannot be customized. +## Outside The App + +TablePro can also be driven from outside the running app. None of these are macOS keyboard shortcuts in the strict sense, but they cover the same fast-navigation use cases. + +| Entry point | Use | +|-------------|-----| +| [Raycast extension](/external-api/raycast) | Trigger commands from Raycast's own hotkey: search connections, open tables, run queries, search query history, focus tabs. | +| [`tablepro://` URL scheme](/external-api/url-scheme) | `open tablepro://...` from the terminal, browser, or another app to open a connection, table, or query tab. Bind in Raycast Quicklinks, Alfred, or Shortcuts.app. | +| [MCP clients](/external-api/mcp-clients) | Claude Desktop, Cursor, Claude Code, Cline, Continue, Zed, Windsurf, Goose. Each client decides its own hotkey for invoking AI; tools call back into TablePro. | + diff --git a/docs/features/query-history.mdx b/docs/features/query-history.mdx index 98897a0ee..3da9e7a8a 100644 --- a/docs/features/query-history.mdx +++ b/docs/features/query-history.mdx @@ -143,3 +143,9 @@ Configure retention in **Settings** > **General**: | **Auto Cleanup** | On | Automatically remove old entries | To clear all history, open **Settings** > **General** and click **Clear All History**. For a specific connection, right-click it in the sidebar and select **Clear History**. + +## Search From External Clients + +History is searchable from MCP clients. The `search_query_history` tool returns matching entries with timestamp, connection, query text, and outcome. The Raycast extension wraps this in a **Search Query History** command. + +See [`search_query_history`](/external-api/mcp-tools) and [Raycast commands](/external-api/raycast#commands). diff --git a/docs/features/tabs.mdx b/docs/features/tabs.mdx index 242aa576f..8e89b349d 100644 --- a/docs/features/tabs.mdx +++ b/docs/features/tabs.mdx @@ -211,3 +211,14 @@ Right-click any tab: alt="Tab context menu" /> + +## From External Clients + +Raycast, Cursor, Claude Desktop, and other MCP clients can list and focus tabs across windows. Four MCP tools cover the surface: + +- `list_recent_tabs` enumerates open tabs across every window. +- `focus_query_tab` brings an existing tab to the front by id. +- `open_connection_window` opens a saved connection. +- `open_table_tab` opens a specific table. + +The Raycast extension's [Recent Tabs command](/external-api/raycast#commands) wraps these tools. See [MCP Tools](/external-api/mcp-tools) for input and output schemas. From 243be1df564458ab1d4393b6e5bb1c93f52210d9 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 01:56:28 +0700 Subject: [PATCH 18/83] docs: tighten MCP page lazy-start description and update settings reference --- docs/customization/settings.mdx | 14 +++++++++++++- docs/features/mcp.mdx | 6 +++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/customization/settings.mdx b/docs/customization/settings.mdx index 3298bf2be..b631759f8 100644 --- a/docs/customization/settings.mdx +++ b/docs/customization/settings.mdx @@ -14,7 +14,7 @@ Open with `Cmd+,`. Settings are grouped into tabs. Custom shortcuts. Provider config, inline suggestions, context, privacy. Font, theme, CLI paths. - MCP server config. + Server config, tokens, activity log, connected clients. Manage drivers and exporters. License, iCloud sync, linked folders. @@ -74,6 +74,18 @@ No queries or database content is transmitted. A tab is "clean" when it's a table tab (not query/create), unpinned, no unsaved changes, and no interactions (sort, filter, selection). +## MCP + +The **MCP** tab covers the [External API](/external-api) surface. The server lazy-starts on first use and exposes the following sections: + +- **MCP Server**: enable toggle and live status. The server runs on a free port in the `51000-52000` range. See [MCP Server](/features/mcp). +- **MCP Configuration**: row limit defaults, query timeout, "log MCP queries in history". +- **Authentication**: list, create, and revoke bearer tokens. Issued by the [pairing flow](/external-api/pairing) or generated manually. See [Tokens](/external-api/tokens). +- **Activity Log**: every authentication, tool call, and resource read with token, category, action, connection, and outcome. 90-day retention. Backed by `~/Library/Application Support/com.TablePro/mcp-audit.db`. +- **Network**: remote access toggle, TLS certificate, fingerprint, and PEM export. +- **MCP Setup**: one-click config snippets for Claude Code, Claude Desktop, and Cursor. +- **Connected Clients**: live list of MCP clients connected to the server. + ## Plugins Manage database driver and exporter plugins from **Settings** > **Plugins**. Split-view: list on the left, details on the right. diff --git a/docs/features/mcp.mdx b/docs/features/mcp.mdx index 3f3573cb8..aebb763c8 100644 --- a/docs/features/mcp.mdx +++ b/docs/features/mcp.mdx @@ -32,11 +32,11 @@ This page covers the in-app **Settings > MCP** UI. For protocol details, see the ## Enabling the server -Open **Settings > MCP** and toggle **Enable MCP Server**. +The MCP server lazy-starts on first use. Pairing an extension or hitting `tablepro://integrations/start-mcp` from the bundled `tablepro-mcp` CLI starts the server on demand. You do not have to flip a toggle in Settings beforehand. -The server starts on a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. The bundled `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. +When the server starts, it picks a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. The `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. -The server can also lazy-start. The first call to `tablepro://integrations/start-mcp` enables it on demand, so users do not have to flip the toggle before pairing an extension. +To start it manually or keep it running between launches, open **Settings > MCP** and toggle **Enable MCP Server**. Date: Tue, 28 Apr 2026 02:08:32 +0700 Subject: [PATCH 19/83] feat(settings): rename MCP tab to Integrations --- TablePro/Views/Settings/SettingsView.swift | 2 +- docs/external-api/index.mdx | 2 +- docs/external-api/mcp-clients.mdx | 8 ++++---- docs/external-api/pairing.mdx | 2 +- docs/external-api/raycast.mdx | 2 +- docs/external-api/tokens.mdx | 6 +++--- docs/features/mcp.mdx | 20 ++++++++++---------- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/TablePro/Views/Settings/SettingsView.swift b/TablePro/Views/Settings/SettingsView.swift index 9754db52e..30a2ab5a4 100644 --- a/TablePro/Views/Settings/SettingsView.swift +++ b/TablePro/Views/Settings/SettingsView.swift @@ -50,7 +50,7 @@ struct SettingsView: View { .tag(SettingsTab.terminal.rawValue) MCPSettingsView(settings: $settingsManager.mcp) - .tabItem { Label("MCP", systemImage: "network") } + .tabItem { Label("Integrations", systemImage: "network") } .tag(SettingsTab.mcp.rawValue) PluginsSettingsView() diff --git a/docs/external-api/index.mdx b/docs/external-api/index.mdx index 4c77a2520..22792fa3b 100644 --- a/docs/external-api/index.mdx +++ b/docs/external-api/index.mdx @@ -45,7 +45,7 @@ The External API is gated by three independent layers. A request must clear all The effective permission for any request is `MIN(token.scope, connection.externalAccess)`. A token with `fullAccess` against a connection with `readOnly` cannot mutate. -Every request is recorded in the activity log. Open **Settings > MCP > Activity Log** to inspect. +Every request is recorded in the activity log. Open **Settings > Integrations > Activity Log** to inspect. ## Quick start diff --git a/docs/external-api/mcp-clients.mdx b/docs/external-api/mcp-clients.mdx index 79c421be0..affb8e526 100644 --- a/docs/external-api/mcp-clients.mdx +++ b/docs/external-api/mcp-clients.mdx @@ -163,7 +163,7 @@ For most desktop clients, stdio is the right default. Use HTTP when the client l ## HTTP transport -If your client cannot use stdio, mint a token in **Settings > MCP > Authentication** and configure HTTP directly. The shape varies by client; here is the Cursor form: +If your client cannot use stdio, mint a token in **Settings > Integrations > Authentication** and configure HTTP directly. The shape varies by client; here is the Cursor form: ```json { @@ -178,11 +178,11 @@ If your client cannot use stdio, mint a token in **Settings > MCP > Authenticati } ``` -Replace `23508` with the port shown in **Settings > MCP > MCP Configuration**. Other clients use the same `url` plus `headers` shape, sometimes under `type: streamable-http`. Check the client's docs. +Replace `23508` with the port shown in **Settings > Integrations > MCP Configuration**. Other clients use the same `url` plus `headers` shape, sometimes under `type: streamable-http`. Check the client's docs. ## Setup snippets in TablePro -Open **Settings > MCP > MCP Setup** and pick a client. TablePro shows the exact JSON or shell command to paste into the client's config, with the correct paths for your install. +Open **Settings > Integrations > MCP Setup** and pick a client. TablePro shows the exact JSON or shell command to paste into the client's config, with the correct paths for your install. ## What the AI sees @@ -205,7 +205,7 @@ If the call fails, the response code tells you which layer rejected it: ## Troubleshooting -**Handshake timeout.** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > MCP** and toggle **Enable MCP Server** off and on, then re-launch the client. +**Handshake timeout.** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > Integrations** and toggle **Enable MCP Server** off and on, then re-launch the client. **Stale handshake file.** Delete `~/Library/Application Support/com.TablePro/mcp-handshake.json` and reopen TablePro. The app rewrites the file on launch. diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index 30fa857fe..65da9bfcb 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -139,7 +139,7 @@ For preferences-backed storage, use `updateCommandMetadata` or write to the pass | Code is single-use | Successful exchange or 5-minute expiry deletes the pending exchange. | | Plaintext token is not persisted by TablePro | Only the SHA-256 hash plus salt is saved to `mcp-tokens.json`. | | User sees and approves scopes | The sheet shows what was requested, what is granted, and which connections. | -| User can revoke any time | **Settings > MCP > Authentication > Revoke**. | +| User can revoke any time | **Settings > Integrations > Authentication > Revoke**. | ## Errors diff --git a/docs/external-api/raycast.mdx b/docs/external-api/raycast.mdx index e64eaa175..fba74e5ab 100644 --- a/docs/external-api/raycast.mdx +++ b/docs/external-api/raycast.mdx @@ -86,7 +86,7 @@ The token is stored in the Keychain via Raycast's password preference type. **Token revoked (`401`).** The extension clears the stored token and shows the pair CTA. -**Connection rejected (`403`).** The connection's `externalAccess` is `blocked` or the token's allowlist excludes it. Open **Settings > MCP** in TablePro to inspect. +**Connection rejected (`403`).** The connection's `externalAccess` is `blocked` or the token's allowlist excludes it. Open **Settings > Integrations** in TablePro to inspect. **Read-only error (`403 Connection is read-only for external clients`).** The connection's `externalAccess` is `readOnly` and the SQL is a write. Either change the connection's external access in TablePro, or run the query in TablePro's editor. diff --git a/docs/external-api/tokens.mdx b/docs/external-api/tokens.mdx index 79e84f1df..ca620ffa0 100644 --- a/docs/external-api/tokens.mdx +++ b/docs/external-api/tokens.mdx @@ -67,7 +67,7 @@ A `fullAccess` token cannot mutate data on a `readOnly` connection. A token's re Tokens are created in three ways: 1. **Pairing flow** (most common). See [Pairing](/external-api/pairing). -2. **Settings UI**. **Settings > MCP > Authentication**, then **Generate Token**. Pick name, scope, allowlist, expiry. The plaintext is shown once in a reveal sheet. +2. **Settings UI**. **Settings > Integrations > Authentication**, then **Generate Token**. Pick name, scope, allowlist, expiry. The plaintext is shown once in a reveal sheet. 3. **AppleScript-style URL** is not supported. Tokens are not exposed as a URL scheme action. The plaintext format is `tp_`. The first 8 chars are the prefix. @@ -84,7 +84,7 @@ Recommended values: ## Revocation -**Settings > MCP > Authentication** lists all tokens with prefix, name, scope, allowlist, last-used time, and expiry. Each row has: +**Settings > Integrations > Authentication** lists all tokens with prefix, name, scope, allowlist, last-used time, and expiry. Each row has: - **Revoke**: marks the token inactive. Stays in the list with status `Revoked`. Cannot be reactivated. - **Delete**: removes the row entirely. @@ -95,7 +95,7 @@ After revoking a token used by an extension, the extension shows an "unauthorize ## Audit log -Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > MCP > Activity Log** shows: +Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > Integrations > Activity Log** shows: | Field | Example | |-------|---------| diff --git a/docs/features/mcp.mdx b/docs/features/mcp.mdx index aebb763c8..9248c8ec5 100644 --- a/docs/features/mcp.mdx +++ b/docs/features/mcp.mdx @@ -7,7 +7,7 @@ description: Built-in Model Context Protocol server that exposes TablePro to AI TablePro includes a built-in [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that lets AI clients query your databases through TablePro's saved connections. The MCP server is one of three pillars of the [External API](/external-api), alongside the URL scheme and the pairing flow. -This page covers the in-app **Settings > MCP** UI. For protocol details, see the External API section. +This page covers the in-app **Settings > Integrations** UI. For protocol details, see the External API section. @@ -36,7 +36,7 @@ The MCP server lazy-starts on first use. Pairing an extension or hitting `tablep When the server starts, it picks a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. The `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. -To start it manually or keep it running between launches, open **Settings > MCP** and toggle **Enable MCP Server**. +To start it manually or keep it running between launches, open **Settings > Integrations** and toggle **Enable MCP Server**. MCP > MCP Setup** writes the config for popular clients in one click: +**Settings > Integrations > MCP Setup** writes the config for popular clients in one click: - **Setup for Claude Code** uses the stdio bridge, no token needed. - **Setup for Claude Desktop** writes to `~/Library/Application Support/Claude/claude_desktop_config.json`. @@ -70,13 +70,13 @@ For manual configuration, see [MCP Clients](/external-api/mcp-clients). The HTTP ## Authentication -Tokens are managed under **Settings > MCP > Authentication**. The pairing flow, scopes, allowlists, expiry, and revocation are documented in [Tokens](/external-api/tokens). +Tokens are managed under **Settings > Integrations > Authentication**. The pairing flow, scopes, allowlists, expiry, and revocation are documented in [Tokens](/external-api/tokens). -The activity log under **Settings > MCP > Activity Log** shows every authentication, tool call, and resource read with the token id, category, action, connection, and outcome. Entries are kept for 90 days. +The activity log under **Settings > Integrations > Activity Log** shows every authentication, tool call, and resource read with the token id, category, action, connection, and outcome. Entries are kept for 90 days. ## Remote access -The MCP server is localhost-only by default. Toggle **Remote access** under **Settings > MCP > Network** to accept connections from other machines. +The MCP server is localhost-only by default. Toggle **Remote access** under **Settings > Integrations > Network** to accept connections from other machines. Enabling remote access automatically requires authentication and TLS. @@ -108,7 +108,7 @@ macOS firewall allows TablePro automatically (Developer ID signed). When remote access is enabled, TablePro generates a self-signed certificate valid for 1 year. -- The SHA-256 fingerprint shows in **Settings > MCP > Network**. +- The SHA-256 fingerprint shows in **Settings > Integrations > Network**. - **Copy Certificate (PEM)** exports the certificate for client trust stores. - **Regenerate** creates a new certificate (invalidates existing trust). @@ -149,12 +149,12 @@ The reachable surface is the [tool catalog](/external-api/mcp-tools) and the [UR **App must be running**: the MCP server only runs while TablePro is open. The stdio bridge fires `tablepro://integrations/start-mcp` to launch the app on cold start. -**Connection refused**: check the green status indicator in **Settings > MCP**. Verify the URL and port match the handshake file. +**Connection refused**: check the green status indicator in **Settings > Integrations**. Verify the URL and port match the handshake file. -**`401 Unauthorized`**: the token is missing, expired, or revoked. Generate a new one in **Settings > MCP > Authentication**, or run the pair command in your extension. +**`401 Unauthorized`**: the token is missing, expired, or revoked. Generate a new one in **Settings > Integrations > Authentication**, or run the pair command in your extension. **`403 Forbidden`**: the token's allowlist excludes the connection, the connection's `externalAccess` is `blocked`, or the SQL is a write against a `readOnly` connection. -**Certificate trust error**: export the PEM from **Settings > MCP > Network** and add it to your client's trust store, or use fingerprint pinning. +**Certificate trust error**: export the PEM from **Settings > Integrations > Network** and add it to your client's trust store, or use fingerprint pinning. **`429 Too Many Requests`**: too many failed auth attempts. The lockout escalates to 5 minutes and resets on the next successful auth. From 9b3e8f32ab5f7cca668aae650dec3a81f85637ed Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 02:18:03 +0700 Subject: [PATCH 20/83] fix(integrations): filter blocked connections from list_connections response --- TablePro/Core/MCP/MCPConnectionBridge.swift | 1 + .../MCP/MCPToolHandlerIntegrationTests.swift | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index d0dfbfb69..cb7e27fd0 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -16,6 +16,7 @@ actor MCPConnectionBridge { func listConnections() async -> JSONValue { let (connections, activeSessions) = await MainActor.run { let conns = ConnectionStorage.shared.loadConnections() + .filter { $0.externalAccess != .blocked } let sessions = DatabaseManager.shared.activeSessions return (conns, sessions) } diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index 0f7d2856c..1a8d1f95d 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -46,6 +46,27 @@ struct MCPToolHandlerIntegrationTests { try await body() } + // MARK: - list_connections + + @Test("list_connections omits connections with externalAccess == .blocked") + func listConnectionsFiltersBlocked() async throws { + let handler = makeHandler() + let blocked = DatabaseConnection(name: "Blocked Prod", type: .mysql, externalAccess: .blocked) + let visible = DatabaseConnection(name: "Visible Staging", type: .mysql, externalAccess: .readOnly) + try await withConnections([blocked, visible]) { + let result = try await handler.handleToolCall( + name: "list_connections", + arguments: nil, + sessionId: "test-session", + token: nil + ) + #expect(result.isError == nil) + let payload = result.content.first?.text ?? "" + #expect(!payload.contains(blocked.id.uuidString)) + #expect(payload.contains(visible.id.uuidString)) + } + } + // MARK: - list_recent_tabs @Test("list_recent_tabs returns tabs JSON object") From 591b5d16b0f2ff9a0b24bb84c165bfb7d72b006a Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 02:22:30 +0700 Subject: [PATCH 21/83] feat(integrations): add date filter params to search_query_history tool --- TablePro/Core/MCP/MCPRouter.swift | 8 +++ .../MCP/MCPToolHandler+Integrations.swift | 10 ++- .../Core/Storage/QueryHistoryStorage.swift | 36 +++++++--- .../MCP/MCPToolHandlerIntegrationTests.swift | 70 +++++++++++++++++++ .../Storage/QueryHistoryStorageTests.swift | 38 ++++++++++ docs/external-api/mcp-tools.mdx | 6 +- extensions/tablepro/src/lib/mcp.ts | 23 ++++-- .../tablepro/src/tools/search-history.ts | 9 ++- 8 files changed, 184 insertions(+), 16 deletions(-) diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index 8caf1fae2..bcba46603 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -896,6 +896,14 @@ extension MCPRouter { "limit": .object([ "type": "integer", "description": "Maximum number of entries to return (default 50, max 500)" + ]), + "since": .object([ + "type": "number", + "description": "Earliest executed_at to include, Unix epoch seconds (inclusive, optional)" + ]), + "until": .object([ + "type": "number", + "description": "Latest executed_at to include, Unix epoch seconds (inclusive, optional)" ]) ]), "required": .array([.string("query")]) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 17e858688..4d0ae3164 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -55,6 +55,12 @@ extension MCPToolHandler { let query = try requireString(args, key: "query") let connectionIdString = optionalString(args, key: "connection_id") let limit = optionalInt(args, key: "limit", default: 50, clamp: 1...500) + let since = args?["since"]?.doubleValue.map { Date(timeIntervalSince1970: $0) } + let until = args?["until"]?.doubleValue.map { Date(timeIntervalSince1970: $0) } + + if let since, let until, since > until { + throw MCPError.invalidParams("'since' must be less than or equal to 'until'") + } let connectionId: UUID? if let connectionIdString { @@ -72,7 +78,9 @@ extension MCPToolHandler { offset: 0, connectionId: connectionId, searchText: query.isEmpty ? nil : query, - dateFilter: .all + dateFilter: .all, + since: since, + until: until ) let allowed = token?.allowedConnectionIds diff --git a/TablePro/Core/Storage/QueryHistoryStorage.swift b/TablePro/Core/Storage/QueryHistoryStorage.swift index bb0bb965e..39f2761c4 100644 --- a/TablePro/Core/Storage/QueryHistoryStorage.swift +++ b/TablePro/Core/Storage/QueryHistoryStorage.swift @@ -281,14 +281,19 @@ actor QueryHistoryStorage { offset: Int = 0, connectionId: UUID? = nil, searchText: String? = nil, - dateFilter: DateFilter = .all + dateFilter: DateFilter = .all, + since: Date? = nil, + until: Date? = nil ) -> [QueryHistoryEntry] { var entries: [QueryHistoryEntry] = [] + let effectiveSince = [dateFilter.startDate, since].compactMap { $0 }.max() + var sql: String var bindIndex: Int32 = 1 var hasConnectionFilter = false - var hasDateFilter = false + var hasSinceFilter = false + var hasUntilFilter = false if let searchText = searchText, !searchText.isEmpty { sql = """ @@ -303,9 +308,14 @@ actor QueryHistoryStorage { hasConnectionFilter = true } - if dateFilter.startDate != nil { + if effectiveSince != nil { sql += " AND h.executed_at >= ?" - hasDateFilter = true + hasSinceFilter = true + } + + if until != nil { + sql += " AND h.executed_at <= ?" + hasUntilFilter = true } } else { sql = @@ -318,9 +328,14 @@ actor QueryHistoryStorage { hasConnectionFilter = true } - if dateFilter.startDate != nil { + if effectiveSince != nil { whereClauses.append("executed_at >= ?") - hasDateFilter = true + hasSinceFilter = true + } + + if until != nil { + whereClauses.append("executed_at <= ?") + hasUntilFilter = true } if !whereClauses.isEmpty { @@ -350,8 +365,13 @@ actor QueryHistoryStorage { bindIndex += 1 } - if let startDate = dateFilter.startDate, hasDateFilter { - sqlite3_bind_double(statement, bindIndex, startDate.timeIntervalSince1970) + if let effectiveSince, hasSinceFilter { + sqlite3_bind_double(statement, bindIndex, effectiveSince.timeIntervalSince1970) + bindIndex += 1 + } + + if let until, hasUntilFilter { + sqlite3_bind_double(statement, bindIndex, until.timeIntervalSince1970) bindIndex += 1 } diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index 1a8d1f95d..8d37f567e 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -158,6 +158,76 @@ struct MCPToolHandlerIntegrationTests { #expect(payload.contains("\"entries\"")) } + @Test("search_query_history rejects since greater than until") + func searchQueryHistoryRejectsInvertedWindow() async { + let handler = makeHandler() + do { + _ = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object([ + "query": .string(""), + "since": .double(2_000), + "until": .double(1_000) + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams when since > until") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("search_query_history with since/until filters by executed_at window") + func searchQueryHistorySinceUntilFilters() async throws { + let handler = makeHandler() + let connId = UUID() + let now = Date() + let oneHourAgo = now.addingTimeInterval(-3_600) + let twoHoursAgo = now.addingTimeInterval(-7_200) + let marker = UUID().uuidString + + let outside = QueryHistoryEntry( + query: "SELECT outside_\(marker)", + connectionId: connId, + databaseName: "testdb", + executedAt: twoHoursAgo, + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + let inside = QueryHistoryEntry( + query: "SELECT inside_\(marker)", + connectionId: connId, + databaseName: "testdb", + executedAt: oneHourAgo, + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(outside) + _ = await QueryHistoryStorage.shared.addHistory(inside) + + let result = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object([ + "query": .string(marker), + "connection_id": .string(connId.uuidString), + "since": .double(now.addingTimeInterval(-5_400).timeIntervalSince1970), + "until": .double(now.timeIntervalSince1970) + ]), + sessionId: "test-session", + token: nil + ) + #expect(result.isError == nil) + let payload = result.content.first?.text ?? "" + #expect(payload.contains("inside_\(marker)")) + #expect(!payload.contains("outside_\(marker)")) + } + // MARK: - open_connection_window @Test("open_connection_window rejects missing connection_id") diff --git a/TableProTests/Core/Storage/QueryHistoryStorageTests.swift b/TableProTests/Core/Storage/QueryHistoryStorageTests.swift index abfeac488..66b04e86c 100644 --- a/TableProTests/Core/Storage/QueryHistoryStorageTests.swift +++ b/TableProTests/Core/Storage/QueryHistoryStorageTests.swift @@ -193,6 +193,44 @@ struct QueryHistoryStorageTests { #expect(remaining.isEmpty) } + @Test("fetchHistory with since/until window excludes entries outside the range") + func fetchHistorySinceUntilWindow() async { + let connId = UUID() + let now = Date() + let oneHourAgo = now.addingTimeInterval(-3_600) + let twoHoursAgo = now.addingTimeInterval(-7_200) + + let outside = QueryHistoryEntry( + query: "SELECT outside_window", + connectionId: connId, + databaseName: "testdb", + executedAt: twoHoursAgo, + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + let inside = QueryHistoryEntry( + query: "SELECT inside_window", + connectionId: connId, + databaseName: "testdb", + executedAt: oneHourAgo, + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + + _ = await storage.addHistory(outside) + _ = await storage.addHistory(inside) + + let windowed = await storage.fetchHistory( + connectionId: connId, + since: now.addingTimeInterval(-5_400), + until: now + ) + #expect(windowed.count == 1) + #expect(windowed.first?.query == "SELECT inside_window") + } + @Test("Combined connectionId + dateFilter works") func combinedConnectionIdAndDateFilter() async { let targetConn = UUID() diff --git a/docs/external-api/mcp-tools.mdx b/docs/external-api/mcp-tools.mdx index fb360ca26..988072906 100644 --- a/docs/external-api/mcp-tools.mdx +++ b/docs/external-api/mcp-tools.mdx @@ -432,11 +432,13 @@ Full-text search over the query history database. { "query": "users active", "connection_id": "9f1f...", - "limit": 50 + "limit": 50, + "since": 1745577262, + "until": 1745663662 } ``` -`connection_id` is optional. `limit` is 1-500, default 50. +`connection_id` is optional. `limit` is 1-500, default 50. `since` and `until` are optional Unix epoch seconds; both bounds are inclusive. Either may be set on its own. Pass an empty `query` ("") to skip the full-text filter and only narrow by date or connection. **Output**: diff --git a/extensions/tablepro/src/lib/mcp.ts b/extensions/tablepro/src/lib/mcp.ts index bbc023ad2..9f44de33a 100644 --- a/extensions/tablepro/src/lib/mcp.ts +++ b/extensions/tablepro/src/lib/mcp.ts @@ -509,16 +509,31 @@ interface RawHistoryEntry { error_message?: string; } +export interface SearchHistoryOptions { + /** Earliest executed_at to include, Unix epoch seconds (inclusive). */ + since?: number; + /** Latest executed_at to include, Unix epoch seconds (inclusive). */ + until?: number; +} + export async function searchHistory( query: string, limit = 50, + options: SearchHistoryOptions = {}, ): Promise { + const args: Record = { + query, + limit, + }; + if (options.since !== undefined) { + args.since = options.since; + } + if (options.until !== undefined) { + args.until = options.until; + } const envelope = await callTool<{ entries: RawHistoryEntry[] }>( "search_query_history", - { - query, - limit, - }, + args, ); return (envelope.entries ?? []).map((entry) => ({ id: entry.id, diff --git a/extensions/tablepro/src/tools/search-history.ts b/extensions/tablepro/src/tools/search-history.ts index d5af46228..12496f0be 100644 --- a/extensions/tablepro/src/tools/search-history.ts +++ b/extensions/tablepro/src/tools/search-history.ts @@ -6,8 +6,15 @@ type Input = { query: string; /** Maximum results to return. Defaults to 50. */ limit?: number; + /** Earliest executed_at to include, Unix epoch seconds (inclusive). */ + since?: number; + /** Latest executed_at to include, Unix epoch seconds (inclusive). */ + until?: number; }; export default async function tool(input: Input): Promise { - return searchHistory(input.query, input.limit ?? 50); + return searchHistory(input.query, input.limit ?? 50, { + since: input.since, + until: input.until, + }); } From 95690d28f06a3a7c56531646fdc0421224eda9ab Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 02:24:45 +0700 Subject: [PATCH 22/83] docs(integrations): align mcp-resources shapes with implementation --- docs/external-api/mcp-resources.mdx | 64 +++++++++++++---------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/docs/external-api/mcp-resources.mdx b/docs/external-api/mcp-resources.mdx index f7aa93b97..13b28545e 100644 --- a/docs/external-api/mcp-resources.mdx +++ b/docs/external-api/mcp-resources.mdx @@ -11,7 +11,7 @@ URIs use the `tablepro://` scheme inside the MCP transport. Do not confuse them ## `tablepro://connections` -All saved connections with metadata. +All saved connections with their current session state. **Returns**: @@ -25,23 +25,24 @@ All saved connections with metadata. "host": "db.example.com", "port": 5432, "database": "app", - "isConnected": false, - "externalAccess": "readOnly", - "color": "blue", - "tagName": null, - "groupName": "Servers" + "username": "app", + "is_connected": false, + "ai_policy": "askEachTime", + "safe_mode": "silent" } ] } ``` -Connections with `externalAccess: blocked` are omitted. Connections outside the token's allowlist are omitted. +`database` reflects the active session database when connected, otherwise the saved default. `type` uses display casing (`MySQL`, `PostgreSQL`, `SQLite`, etc.). `safe_mode` is one of `silent`, `alert`, `alertFull`, `safeMode`, `safeModeFull`, `readOnly`. `ai_policy` is one of `askEachTime`, `alwaysAllow`, `never`. + +Connections with `externalAccess: blocked` are omitted. The envelope matches the `list_connections` tool. **Scope**: `readOnly`. ## `tablepro://connections/{id}/schema` -Schema for a connection. Returns all databases, schemas, and tables visible to the user. +Tables and columns visible on the current connection session. **Path parameter**: `id` is the connection UUID. @@ -49,31 +50,22 @@ Schema for a connection. Returns all databases, schemas, and tables visible to t ```json { - "connectionId": "9f1f...", - "databases": [ + "tables": [ { - "name": "app", - "schemas": [ - { - "name": "public", - "tables": [ - { - "name": "users", - "type": "table", - "columns": [ - { "name": "id", "type": "uuid", "nullable": false, "isPrimaryKey": true }, - { "name": "email", "type": "text", "nullable": false } - ] - } - ] - } + "name": "users", + "type": "table", + "columns": [ + { "name": "id", "data_type": "uuid", "is_nullable": false, "is_primary_key": true }, + { "name": "email", "data_type": "text", "is_nullable": false, "is_primary_key": false } ] } ] } ``` -Capped at 100 tables per schema. For larger schemas, call `list_tables` with paging. +The response is flat: tables for the active database/schema only. To switch context, call the `switch_database` or `switch_schema` tool first. `type` matches the underlying `TableType` raw value (for example `table`, `view`). + +Capped at 100 tables. When more exist, the response also includes `truncated: true` and `total_tables: `. For larger schemas, page through `list_tables` instead. **Scope**: `readOnly`. @@ -89,27 +81,27 @@ Recent query history for a connection. |-----------|-------------| | `limit` | 1-500. Default 50. | | `search` | Full-text query string. | -| `date_filter` | `today`, `thisWeek`, or `thisMonth`. | +| `date_filter` | `today`, `thisWeek`, or `thisMonth`. Anything else is treated as no date filter. | **Returns**: ```json { - "connectionId": "9f1f...", - "entries": [ + "history": [ { - "id": "...", - "sql": "SELECT * FROM users WHERE active = true", - "executedAt": "2026-04-26T10:14:22Z", - "rowCount": 142, - "executionTimeMs": 18, - "source": "editor" + "id": "9b2d3c5a-...", + "query": "SELECT * FROM users WHERE active = true", + "database_name": "app", + "executed_at": "2026-04-26T10:14:22Z", + "execution_time_ms": 18.4, + "row_count": 142, + "was_successful": true } ] } ``` -`source` is `editor`, `mcp`, or `terminal`. +`executed_at` is an ISO 8601 timestamp. `execution_time_ms` is a double in milliseconds. `error_message` is included when `was_successful` is false. **Scope**: `readOnly`. From b532f411ed87a5589bd665ed46394b8a5388e319 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 02:28:20 +0700 Subject: [PATCH 23/83] feat(extension): set Raycast author to ngoquocdat and update callback URLs --- docs/external-api/pairing.mdx | 2 +- docs/external-api/url-scheme.mdx | 2 +- extensions/tablepro/package.json | 2 +- extensions/tablepro/src/lib/pairing.ts | 2 +- extensions/tablepro/src/pair.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index 65da9bfcb..2abc80bdd 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -58,7 +58,7 @@ import { open } from "@raycast/api"; const params = new URLSearchParams({ client: `Raycast on ${require("os").hostname()}`, challenge, - redirect: "raycast://extensions/datlechin/tablepro/pair-callback", + redirect: "raycast://extensions/ngoquocdat/tablepro/pair-callback", scopes: "readOnly,readWrite", }); await open(`tablepro://integrations/pair?${params}`); diff --git a/docs/external-api/url-scheme.mdx b/docs/external-api/url-scheme.mdx index 00b07aca5..636c09720 100644 --- a/docs/external-api/url-scheme.mdx +++ b/docs/external-api/url-scheme.mdx @@ -113,7 +113,7 @@ import { open } from "@raycast/api"; const params = new URLSearchParams({ client: "Raycast on macbook-pro", challenge: challengeB64Url, - redirect: "raycast://extensions/datlechin/tablepro/pair-callback", + redirect: "raycast://extensions/ngoquocdat/tablepro/pair-callback", scopes: "readOnly,readWrite", }); await open(`tablepro://integrations/pair?${params}`); diff --git a/extensions/tablepro/package.json b/extensions/tablepro/package.json index 866b7ee4d..3dc84d6ef 100644 --- a/extensions/tablepro/package.json +++ b/extensions/tablepro/package.json @@ -4,7 +4,7 @@ "title": "TablePro", "description": "Open and search your TablePro database connections, browse schema, and run queries.", "icon": "icon.png", - "author": "datlechin", + "author": "ngoquocdat", "categories": ["Developer Tools", "Productivity"], "platforms": ["macOS"], "license": "MIT", diff --git a/extensions/tablepro/src/lib/pairing.ts b/extensions/tablepro/src/lib/pairing.ts index 54ce15cc0..2ba25d64c 100644 --- a/extensions/tablepro/src/lib/pairing.ts +++ b/extensions/tablepro/src/lib/pairing.ts @@ -22,7 +22,7 @@ export function generatePKCE(): PKCEPair { } export const PAIR_CALLBACK_URL = - "raycast://extensions/datlechin/tablepro/pair-callback"; + "raycast://extensions/ngoquocdat/tablepro/pair-callback"; export const STORAGE_KEYS = { pendingVerifier: "pairing.pendingVerifier", diff --git a/extensions/tablepro/src/pair.tsx b/extensions/tablepro/src/pair.tsx index 4479113d9..ea3695087 100644 --- a/extensions/tablepro/src/pair.tsx +++ b/extensions/tablepro/src/pair.tsx @@ -319,7 +319,7 @@ async function persistToken(token: string): Promise { }, }); await open( - `raycast://extensions/datlechin/tablepro?token=${encodeURIComponent(token)}`, + `raycast://extensions/ngoquocdat/tablepro?token=${encodeURIComponent(token)}`, ).catch(() => undefined); } From 2be9a256846b7c0297cf736e49a1f1683ec5a5c2 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 11:36:22 +0700 Subject: [PATCH 24/83] fix(extension): read connections.json from TablePro support dir not com.TablePro --- docs/external-api/raycast.mdx | 2 +- docs/external-api/versioning.mdx | 2 +- extensions/tablepro/README.md | 2 +- extensions/tablepro/src/lib/paths.ts | 15 ++++++++++----- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/external-api/raycast.mdx b/docs/external-api/raycast.mdx index fba74e5ab..16863a7ea 100644 --- a/docs/external-api/raycast.mdx +++ b/docs/external-api/raycast.mdx @@ -92,6 +92,6 @@ The token is stored in the Keychain via Raycast's password preference type. ## Privacy -The extension reads connection metadata from `~/Library/Application Support/com.TablePro/connections.json` to build the connection picker without an MCP roundtrip. Passwords are not in that file (they live in the Keychain). The extension never reads or transmits passwords. +The extension reads connection metadata from `~/Library/Application Support/TablePro/connections.json` to build the connection picker without an MCP roundtrip. Passwords are not in that file (they live in the Keychain). The extension never reads or transmits passwords. Query results returned by `Run Query` stay in Raycast's process. Raycast does not send them to a server. AI tool calls go through Raycast's AI provider per Raycast's [privacy policy](https://www.raycast.com/privacy). diff --git a/docs/external-api/versioning.mdx b/docs/external-api/versioning.mdx index 1d067e125..4bbb1fe02 100644 --- a/docs/external-api/versioning.mdx +++ b/docs/external-api/versioning.mdx @@ -52,7 +52,7 @@ The following are not part of the External API contract and can change at any ti - The handshake file format at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. Use the bundled `tablepro-mcp` CLI rather than parsing it yourself. - The tokens file format at `~/Library/Application Support/com.TablePro/mcp-tokens.json`. Tokens are managed via Settings, not the file. - Audit log file format at `~/Library/Application Support/com.TablePro/mcp-audit.db`. Read via the activity log view. -- The connections file format at `~/Library/Application Support/com.TablePro/connections.json`. Treat as best-effort. Schema can shift between minor versions; integrations should fall back to MCP `list_connections`. +- The connections file format at `~/Library/Application Support/TablePro/connections.json`. Treat as best-effort. Schema can shift between minor versions; integrations should fall back to MCP `list_connections`. ## Past breaking changes diff --git a/extensions/tablepro/README.md b/extensions/tablepro/README.md index 08c1639b8..c3018083f 100644 --- a/extensions/tablepro/README.md +++ b/extensions/tablepro/README.md @@ -55,7 +55,7 @@ The exchange endpoint takes no auth. The single-use code is the auth. ## Privacy -- Connection metadata (`name`, `host`, `port`, `type`) is read from `~/Library/Application Support/com.TablePro/connections.json`. +- Connection metadata (`name`, `host`, `port`, `type`) is read from `~/Library/Application Support/TablePro/connections.json`. - Passwords are never read by the extension. They live in the TablePro Keychain. - Query results are fetched on demand from the local MCP server. Nothing leaves your machine. diff --git a/extensions/tablepro/src/lib/paths.ts b/extensions/tablepro/src/lib/paths.ts index 99c9d4493..1e65b89ee 100644 --- a/extensions/tablepro/src/lib/paths.ts +++ b/extensions/tablepro/src/lib/paths.ts @@ -4,18 +4,23 @@ import { getPreferenceValues } from "@raycast/api"; import { existsSync } from "fs"; import { Preferences } from "./types"; -const APP_SUPPORT_RELATIVE = "Library/Application Support/com.TablePro"; +const CONNECTION_SUPPORT_RELATIVE = "Library/Application Support/TablePro"; +const MCP_SUPPORT_RELATIVE = "Library/Application Support/com.TablePro"; -export function appSupportDir(): string { - return join(homedir(), APP_SUPPORT_RELATIVE); +export function connectionSupportDir(): string { + return join(homedir(), CONNECTION_SUPPORT_RELATIVE); +} + +export function mcpSupportDir(): string { + return join(homedir(), MCP_SUPPORT_RELATIVE); } export function connectionsFilePath(): string { - return join(appSupportDir(), "connections.json"); + return join(connectionSupportDir(), "connections.json"); } export function handshakeFilePath(): string { - return join(appSupportDir(), "mcp-handshake.json"); + return join(mcpSupportDir(), "mcp-handshake.json"); } export function tableProAppPath(): string { From aaccdd9fdc59b7b5a4db87989f34e3b2b5d69292 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 11:46:01 +0700 Subject: [PATCH 25/83] refactor: unify MCP files into TablePro support dir, drop com.TablePro path The MCP subsystem wrote its handshake, tokens, and audit DB under ~/Library/Application Support/com.TablePro/, while every other on-disk file (connections.json, TabState/, LastQuery/, known_hosts, themes) lives under ~/Library/Application Support/TablePro/. Bundle-id paths are the sandboxed-app convention; TablePro is non-sandboxed and should use the friendly app-name directory throughout. Updates the three MCP path constructions, the bundled tablepro-mcp bridge, the Raycast extension, and every docs reference. The com.TablePro identifier is preserved in OSLog subsystems, Keychain, UserDefaults keys, the bundle id, AppGroup ids, and NSUserActivity types since those are not file paths. No migration code or compat shim per CLAUDE.md "no backward-compat hacks". After upgrading, users must re-pair Raycast, Cursor, Claude Desktop, and any other external MCP clients, and may delete the stale directory with `rm -rf ~/Library/Application Support/com.TablePro`. --- CHANGELOG.md | 3 ++- TablePro/CLI/MCPBridgeProxy.swift | 2 +- TablePro/Core/MCP/MCPAuditLogStorage.swift | 2 +- TablePro/Core/MCP/MCPServerManager.swift | 2 +- TablePro/Core/MCP/MCPTokenStore.swift | 2 +- docs/customization/settings.mdx | 2 +- docs/external-api/mcp-clients.mdx | 6 +++--- docs/external-api/pairing.mdx | 2 +- docs/external-api/tokens.mdx | 6 +++--- docs/external-api/url-scheme.mdx | 2 +- docs/external-api/versioning.mdx | 6 +++--- docs/features/mcp.mdx | 4 ++-- extensions/tablepro/src/lib/paths.ts | 15 +++++---------- 13 files changed, 25 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67dc11732..7555b6c90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - stdio MCP transport via bundled `tablepro-mcp` CLI at `Contents/MacOS/tablepro-mcp`. Reads handshake file, no token needed - Per-connection `External Access` setting (`blocked`, `readOnly`, `readWrite`). Defaults to `readOnly`. Bounds token reach via `MIN(token.scope, connection.externalAccess)` - Pairing flow with PKCE code exchange. One-click token issuance for Raycast and other extensions -- Activity log at `~/Library/Application Support/com.TablePro/mcp-audit.db`. Viewable in Settings > Integrations > Activity Log. 90-day retention +- Activity log at `~/Library/Application Support/TablePro/mcp-audit.db`. Viewable in Settings > Integrations > Activity Log. 90-day retention - New MCP tools: `list_recent_tabs`, `search_query_history`, `open_connection_window`, `open_table_tab`, `focus_query_tab` - PostgreSQL ICU collation provider in Create Database (PG 15+). Provider picker is added when the server reports PG 15 or newer. ICU locale list comes from `pg_collation`. SQL emission is version-aware: PG 16+ uses unified `LOCALE`, PG 15 uses `ICU_LOCALE` with `LC_COLLATE 'C' LC_CTYPE 'C'`. - Connection URL parsing: SSH `user:password@host` split, `safeModeLevel` from TablePlus URLs, case-insensitive query params @@ -76,6 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed (BREAKING) - `tablepro://connect//...` deep links. Replace with UUID-keyed paths from "Copy Connection Deep Link" in the sidebar context menu. User-saved bookmarks must be regenerated +- MCP server data directory moved from `~/Library/Application Support/com.TablePro/` to `~/Library/Application Support/TablePro/`. Existing tokens, audit log, and handshake files are not migrated. Re-pair Raycast, Cursor, Claude Desktop, and any other external clients after upgrading. Delete the old directory with `rm -rf ~/Library/Application Support/com.TablePro` ### Fixed diff --git a/TablePro/CLI/MCPBridgeProxy.swift b/TablePro/CLI/MCPBridgeProxy.swift index 567a782ba..f52bae633 100644 --- a/TablePro/CLI/MCPBridgeProxy.swift +++ b/TablePro/CLI/MCPBridgeProxy.swift @@ -58,7 +58,7 @@ final class MCPBridgeProxy { init() { let home = FileManager.default.homeDirectoryForCurrentUser.path - self.handshakePath = "\(home)/Library/Application Support/com.TablePro/mcp-handshake.json" + self.handshakePath = "\(home)/Library/Application Support/TablePro/mcp-handshake.json" } func run() async { diff --git a/TablePro/Core/MCP/MCPAuditLogStorage.swift b/TablePro/Core/MCP/MCPAuditLogStorage.swift index 5d296107e..bf840960f 100644 --- a/TablePro/Core/MCP/MCPAuditLogStorage.swift +++ b/TablePro/Core/MCP/MCPAuditLogStorage.swift @@ -67,7 +67,7 @@ actor MCPAuditLogStorage { Self.logger.error("Unable to access application support directory") return } - let directory = appSupport.appendingPathComponent("com.TablePro") + let directory = appSupport.appendingPathComponent("TablePro") try? fileManager.createDirectory(at: directory, withIntermediateDirectories: true) let suffix = testDatabaseSuffix ?? "" diff --git a/TablePro/Core/MCP/MCPServerManager.swift b/TablePro/Core/MCP/MCPServerManager.swift index b7576b920..f028ac932 100644 --- a/TablePro/Core/MCP/MCPServerManager.swift +++ b/TablePro/Core/MCP/MCPServerManager.swift @@ -203,7 +203,7 @@ final class MCPServerManager { private static let handshakeDirectoryPath: String = { let home = FileManager.default.homeDirectoryForCurrentUser.path - return "\(home)/Library/Application Support/com.TablePro" + return "\(home)/Library/Application Support/TablePro" }() private static let handshakeFilePath: String = { diff --git a/TablePro/Core/MCP/MCPTokenStore.swift b/TablePro/Core/MCP/MCPTokenStore.swift index 2a67d50ca..b786764a3 100644 --- a/TablePro/Core/MCP/MCPTokenStore.swift +++ b/TablePro/Core/MCP/MCPTokenStore.swift @@ -65,7 +65,7 @@ actor MCPTokenStore { init() { let appSupportUrl = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first ?? URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Library/Application Support") - let directory = appSupportUrl.appendingPathComponent("com.TablePro") + let directory = appSupportUrl.appendingPathComponent("TablePro") self.storageUrl = directory.appendingPathComponent("mcp-tokens.json") } diff --git a/docs/customization/settings.mdx b/docs/customization/settings.mdx index b631759f8..96339fc5d 100644 --- a/docs/customization/settings.mdx +++ b/docs/customization/settings.mdx @@ -81,7 +81,7 @@ The **MCP** tab covers the [External API](/external-api) surface. The server laz - **MCP Server**: enable toggle and live status. The server runs on a free port in the `51000-52000` range. See [MCP Server](/features/mcp). - **MCP Configuration**: row limit defaults, query timeout, "log MCP queries in history". - **Authentication**: list, create, and revoke bearer tokens. Issued by the [pairing flow](/external-api/pairing) or generated manually. See [Tokens](/external-api/tokens). -- **Activity Log**: every authentication, tool call, and resource read with token, category, action, connection, and outcome. 90-day retention. Backed by `~/Library/Application Support/com.TablePro/mcp-audit.db`. +- **Activity Log**: every authentication, tool call, and resource read with token, category, action, connection, and outcome. 90-day retention. Backed by `~/Library/Application Support/TablePro/mcp-audit.db`. - **Network**: remote access toggle, TLS certificate, fingerprint, and PEM export. - **MCP Setup**: one-click config snippets for Claude Code, Claude Desktop, and Cursor. - **Connected Clients**: live list of MCP clients connected to the server. diff --git a/docs/external-api/mcp-clients.mdx b/docs/external-api/mcp-clients.mdx index affb8e526..9e6464c73 100644 --- a/docs/external-api/mcp-clients.mdx +++ b/docs/external-api/mcp-clients.mdx @@ -17,7 +17,7 @@ Any MCP client that supports the stdio transport and lets you point it at a comm } ``` -The `tablepro-mcp` CLI ships inside the app bundle. It reads `~/Library/Application Support/com.TablePro/mcp-handshake.json` for the local port and a bridge token, then forwards stdio JSON-RPC to the running app's HTTP MCP server. If the handshake file is missing, the CLI fires `tablepro://integrations/start-mcp` to lazy-start the server and waits up to 10 seconds for the handshake to appear. The TablePro app must be running; you can keep it minimized. +The `tablepro-mcp` CLI ships inside the app bundle. It reads `~/Library/Application Support/TablePro/mcp-handshake.json` for the local port and a bridge token, then forwards stdio JSON-RPC to the running app's HTTP MCP server. If the handshake file is missing, the CLI fires `tablepro://integrations/start-mcp` to lazy-start the server and waits up to 10 seconds for the handshake to appear. The TablePro app must be running; you can keep it minimized. You do not pass a token in the client config. The bridge reuses the in-app handshake, so the token issued during pairing stays inside TablePro. The Raycast extension or any `tablepro://integrations/pair?...` link triggers the one-time pairing flow that puts a token on disk; clients launched via stdio inherit that trust automatically. @@ -157,7 +157,7 @@ Run `goose session` and ask for the tool list to confirm. If you are building a client against the [MCP specification](https://modelcontextprotocol.io), TablePro speaks two transports: - **stdio**: spawn `/Applications/TablePro.app/Contents/MacOS/tablepro-mcp` with no arguments. The CLI handles the handshake and forwards JSON-RPC over its stdin and stdout. No token, no environment variables. -- **HTTP**: connect to `http://127.0.0.1:/mcp` using the port from `~/Library/Application Support/com.TablePro/mcp-handshake.json` and a bearer token issued via [Pairing](/external-api/pairing). See [Tokens](/external-api/tokens) for scope rules. +- **HTTP**: connect to `http://127.0.0.1:/mcp` using the port from `~/Library/Application Support/TablePro/mcp-handshake.json` and a bearer token issued via [Pairing](/external-api/pairing). See [Tokens](/external-api/tokens) for scope rules. For most desktop clients, stdio is the right default. Use HTTP when the client lives on a different machine, when you need a tighter token scope than the bridge token, or when the client cannot spawn a local process. See [MCP Server](/features/mcp#remote-access) for remote setup. @@ -207,7 +207,7 @@ If the call fails, the response code tells you which layer rejected it: **Handshake timeout.** TablePro launched but did not respond to `tablepro://integrations/start-mcp` within 10 seconds. Open **Settings > Integrations** and toggle **Enable MCP Server** off and on, then re-launch the client. -**Stale handshake file.** Delete `~/Library/Application Support/com.TablePro/mcp-handshake.json` and reopen TablePro. The app rewrites the file on launch. +**Stale handshake file.** Delete `~/Library/Application Support/TablePro/mcp-handshake.json` and reopen TablePro. The app rewrites the file on launch. **Setapp or non-default install path.** Replace `/Applications/TablePro.app` in the `command` with the absolute path to your install. For Setapp the bundle lives under `~/Applications/Setapp/TablePro.app`. diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index 2abc80bdd..39c0340c8 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -97,7 +97,7 @@ TablePro appends `?code=` to the `redirect` URL and opens it with `NSWorks ### 6. Extension exchanges the code -The extension reads the MCP port from `~/Library/Application Support/com.TablePro/mcp-handshake.json`, then: +The extension reads the MCP port from `~/Library/Application Support/TablePro/mcp-handshake.json`, then: ```ts const port = await readHandshakePort(); diff --git a/docs/external-api/tokens.mdx b/docs/external-api/tokens.mdx index ca620ffa0..e9014a5e7 100644 --- a/docs/external-api/tokens.mdx +++ b/docs/external-api/tokens.mdx @@ -5,7 +5,7 @@ description: Token model, scopes, per-connection allowlists, expiry, and revocat # Tokens -Every external request needs a bearer token. Tokens carry a scope, an optional connection allowlist, and an optional expiry. Tokens are stored hashed (SHA-256 + salt) at `~/Library/Application Support/com.TablePro/mcp-tokens.json` with `0600` permissions. The plaintext is shown once at creation and never again. +Every external request needs a bearer token. Tokens carry a scope, an optional connection allowlist, and an optional expiry. Tokens are stored hashed (SHA-256 + salt) at `~/Library/Application Support/TablePro/mcp-tokens.json` with `0600` permissions. The plaintext is shown once at creation and never again. ## Token shape @@ -95,7 +95,7 @@ After revoking a token used by an extension, the extension shows an "unauthorize ## Audit log -Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/com.TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > Integrations > Activity Log** shows: +Every authentication, every tool call, every resource read is recorded in `~/Library/Application Support/TablePro/mcp-audit.db` with the token id (not the plaintext). The activity log view in **Settings > Integrations > Activity Log** shows: | Field | Example | |-------|---------| @@ -129,7 +129,7 @@ A successful auth resets the counter. During lockout the server returns `429 Too | Read SSH keys | no | | Read license data | no | | Read app settings | no | -| Read local files outside `~/Library/Application Support/com.TablePro/` | no | +| Read local files outside `~/Library/Application Support/TablePro/` | no | | Mutate Safe Mode rules | no | | Mutate other tokens | no | | Mutate connection records | no | diff --git a/docs/external-api/url-scheme.mdx b/docs/external-api/url-scheme.mdx index 636c09720..4f9b43ff1 100644 --- a/docs/external-api/url-scheme.mdx +++ b/docs/external-api/url-scheme.mdx @@ -129,7 +129,7 @@ tablepro://integrations/start-mcp Starts the MCP server if it is not already running, then returns. Used by the bundled `tablepro-mcp` CLI to bootstrap on cold launch. -The user does not need to enable MCP in Settings beforehand. The first call starts the server on a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. +The user does not need to enable MCP in Settings beforehand. The first call starts the server on a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/TablePro/mcp-handshake.json`. ```bash open "tablepro://integrations/start-mcp" diff --git a/docs/external-api/versioning.mdx b/docs/external-api/versioning.mdx index 4bbb1fe02..b2a81fe8c 100644 --- a/docs/external-api/versioning.mdx +++ b/docs/external-api/versioning.mdx @@ -49,9 +49,9 @@ The warn-to-remove gap is at least one minor version. The following are not part of the External API contract and can change at any time without notice: - Internal MCP message routing details, transport framing, and HTTP path layout under `/v1/internal/*`. -- The handshake file format at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. Use the bundled `tablepro-mcp` CLI rather than parsing it yourself. -- The tokens file format at `~/Library/Application Support/com.TablePro/mcp-tokens.json`. Tokens are managed via Settings, not the file. -- Audit log file format at `~/Library/Application Support/com.TablePro/mcp-audit.db`. Read via the activity log view. +- The handshake file format at `~/Library/Application Support/TablePro/mcp-handshake.json`. Use the bundled `tablepro-mcp` CLI rather than parsing it yourself. +- The tokens file format at `~/Library/Application Support/TablePro/mcp-tokens.json`. Tokens are managed via Settings, not the file. +- Audit log file format at `~/Library/Application Support/TablePro/mcp-audit.db`. Read via the activity log view. - The connections file format at `~/Library/Application Support/TablePro/connections.json`. Treat as best-effort. Schema can shift between minor versions; integrations should fall back to MCP `list_connections`. ## Past breaking changes diff --git a/docs/features/mcp.mdx b/docs/features/mcp.mdx index 9248c8ec5..16f43f627 100644 --- a/docs/features/mcp.mdx +++ b/docs/features/mcp.mdx @@ -34,7 +34,7 @@ This page covers the in-app **Settings > Integrations** UI. For protocol details The MCP server lazy-starts on first use. Pairing an extension or hitting `tablepro://integrations/start-mcp` from the bundled `tablepro-mcp` CLI starts the server on demand. You do not have to flip a toggle in Settings beforehand. -When the server starts, it picks a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/com.TablePro/mcp-handshake.json`. The `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. +When the server starts, it picks a free port in the `51000-52000` range and writes a handshake file at `~/Library/Application Support/TablePro/mcp-handshake.json`. The `tablepro-mcp` CLI and the Raycast extension read this file to find the port; you do not need to configure it manually. To start it manually or keep it running between launches, open **Settings > Integrations** and toggle **Enable MCP Server**. @@ -136,7 +136,7 @@ The server validates the `Origin` header against `localhost`, `127.0.0.1`, and ` | Read SSH keys | no | | Read license data | no | | Read app settings | no | -| Read local files outside `~/Library/Application Support/com.TablePro/` | no | +| Read local files outside `~/Library/Application Support/TablePro/` | no | | Mutate Safe Mode rules | no | The reachable surface is the [tool catalog](/external-api/mcp-tools) and the [URL scheme](/external-api/url-scheme). diff --git a/extensions/tablepro/src/lib/paths.ts b/extensions/tablepro/src/lib/paths.ts index 1e65b89ee..6f079f344 100644 --- a/extensions/tablepro/src/lib/paths.ts +++ b/extensions/tablepro/src/lib/paths.ts @@ -4,23 +4,18 @@ import { getPreferenceValues } from "@raycast/api"; import { existsSync } from "fs"; import { Preferences } from "./types"; -const CONNECTION_SUPPORT_RELATIVE = "Library/Application Support/TablePro"; -const MCP_SUPPORT_RELATIVE = "Library/Application Support/com.TablePro"; +const APP_SUPPORT_RELATIVE = "Library/Application Support/TablePro"; -export function connectionSupportDir(): string { - return join(homedir(), CONNECTION_SUPPORT_RELATIVE); -} - -export function mcpSupportDir(): string { - return join(homedir(), MCP_SUPPORT_RELATIVE); +export function appSupportDir(): string { + return join(homedir(), APP_SUPPORT_RELATIVE); } export function connectionsFilePath(): string { - return join(connectionSupportDir(), "connections.json"); + return join(appSupportDir(), "connections.json"); } export function handshakeFilePath(): string { - return join(mcpSupportDir(), "mcp-handshake.json"); + return join(appSupportDir(), "mcp-handshake.json"); } export function tableProAppPath(): string { From 416bd9fe5b986bf039204005eee0bcb1ed685fea Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 11:48:49 +0700 Subject: [PATCH 26/83] docs: drop Past breaking changes table from versioning page --- docs/external-api/versioning.mdx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/external-api/versioning.mdx b/docs/external-api/versioning.mdx index b2a81fe8c..905fab298 100644 --- a/docs/external-api/versioning.mdx +++ b/docs/external-api/versioning.mdx @@ -54,13 +54,6 @@ The following are not part of the External API contract and can change at any ti - Audit log file format at `~/Library/Application Support/TablePro/mcp-audit.db`. Read via the activity log view. - The connections file format at `~/Library/Application Support/TablePro/connections.json`. Treat as best-effort. Schema can shift between minor versions; integrations should fall back to MCP `list_connections`. -## Past breaking changes - -| Version | Change | -|---------|--------| -| 0.37 | `tablepro://connect//...` deep links removed. Use UUID-keyed paths. Bookmarks must be regenerated. | -| 0.37 | The MCP server lazy-starts on first external request. Manual enable in Settings is no longer required. | - ## Reporting issues If you find a behavior that contradicts these rules, file an issue at [github.com/TableProApp/TablePro](https://github.com/TableProApp/TablePro/issues). Include the TablePro version, the URL or MCP call, expected and actual behavior, and a snippet of the activity log row if relevant. From 3f57f336f19d9ef71bcc69fa1b142c4c7dc59170 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:01:07 +0700 Subject: [PATCH 27/83] fix(extension): drop redundant TablePro subtitles from commands --- extensions/tablepro/package.json | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/extensions/tablepro/package.json b/extensions/tablepro/package.json index 3dc84d6ef..9623a1301 100644 --- a/extensions/tablepro/package.json +++ b/extensions/tablepro/package.json @@ -13,14 +13,12 @@ { "name": "search-connections", "title": "Search Connections", - "subtitle": "TablePro", "description": "Search and open saved TablePro connections.", "mode": "view" }, { "name": "open-connection", "title": "Open Connection", - "subtitle": "TablePro", "description": "Open a connection by name.", "mode": "no-view", "arguments": [ @@ -35,7 +33,6 @@ { "name": "menu-bar-connections", "title": "TablePro Menu Bar", - "subtitle": "TablePro", "description": "Show connections in the menu bar.", "mode": "menu-bar", "interval": "10m" @@ -43,43 +40,37 @@ { "name": "search-schema", "title": "Search Schema", - "subtitle": "TablePro", "description": "Search databases and schemas across your connections.", "mode": "view" }, { "name": "search-tables", "title": "Search Tables", - "subtitle": "TablePro", "description": "Search tables in a connection.", "mode": "view" }, { "name": "recent-tabs", "title": "Recent Tabs", - "subtitle": "TablePro", "description": "Show recently opened tabs in TablePro.", "mode": "view" }, { "name": "run-query", "title": "Run Query", - "subtitle": "TablePro", "description": "Run a SQL query against a connection.", "mode": "view" }, { "name": "search-history", "title": "Search Query History", - "subtitle": "TablePro", "description": "Search the TablePro query history.", "mode": "view" }, { "name": "pair", "title": "Pair with TablePro", - "subtitle": "TablePro", - "description": "Pair this extension with TablePro.", + "description": "Pair this extension with TablePro to issue an API token.", "mode": "view" } ], From aa0328715a5cf81b34fab8f5897a39570db7441e Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:01:39 +0700 Subject: [PATCH 28/83] fix(extension): polish action titles, empty states, and pair form for Raycast Store --- extensions/tablepro/src/lib/empty-state.tsx | 8 ++++---- extensions/tablepro/src/pair.tsx | 8 +++++--- extensions/tablepro/src/recent-tabs.tsx | 2 +- extensions/tablepro/src/run-query.tsx | 16 ++++++++++------ extensions/tablepro/src/search-connections.tsx | 4 ++-- extensions/tablepro/src/search-history.tsx | 2 +- extensions/tablepro/src/search-schema.tsx | 12 ++++++++++-- extensions/tablepro/src/search-tables.tsx | 16 ++++++++++++---- 8 files changed, 45 insertions(+), 23 deletions(-) diff --git a/extensions/tablepro/src/lib/empty-state.tsx b/extensions/tablepro/src/lib/empty-state.tsx index bd5e6c449..a614fb28d 100644 --- a/extensions/tablepro/src/lib/empty-state.tsx +++ b/extensions/tablepro/src/lib/empty-state.tsx @@ -27,7 +27,7 @@ export function ScenarioEmptyView({ scenario }: Props) { actions={ open("https://tablepro.app")} /> @@ -44,7 +44,7 @@ export function ScenarioEmptyView({ scenario }: Props) { actions={ open("tablepro://integrations/start-mcp") @@ -63,7 +63,7 @@ export function ScenarioEmptyView({ scenario }: Props) { actions={ { await launchCommand({ @@ -90,7 +90,7 @@ export function ScenarioEmptyView({ scenario }: Props) { actions={ { await launchCommand({ diff --git a/extensions/tablepro/src/pair.tsx b/extensions/tablepro/src/pair.tsx index ea3695087..c91b5bf0a 100644 --- a/extensions/tablepro/src/pair.tsx +++ b/extensions/tablepro/src/pair.tsx @@ -77,6 +77,7 @@ function PairForm() { @@ -92,7 +93,7 @@ function PairForm() { actions={ @@ -151,7 +153,7 @@ function PairForm() { { try { diff --git a/extensions/tablepro/src/run-query.tsx b/extensions/tablepro/src/run-query.tsx index 75e20cc57..4bbcd6233 100644 --- a/extensions/tablepro/src/run-query.tsx +++ b/extensions/tablepro/src/run-query.tsx @@ -62,7 +62,11 @@ export default function RunQueryCommand() { if (connections.length === 0) { return ( - + ); } @@ -125,7 +129,7 @@ function QueryForm({ connections }: { connections: Connection[] }) { }} /> openQueryDeeplink(connection.id, sql) @@ -262,7 +266,7 @@ function ResultView({ actions={ openQueryDeeplink(connection.id, sql) @@ -281,11 +285,11 @@ function ResultView({ actions={ openQueryDeeplink(connection.id, sql)} /> - + } /> diff --git a/extensions/tablepro/src/search-connections.tsx b/extensions/tablepro/src/search-connections.tsx index c79595bc7..9c7f305e7 100644 --- a/extensions/tablepro/src/search-connections.tsx +++ b/extensions/tablepro/src/search-connections.tsx @@ -88,7 +88,7 @@ function ConnectionRow({ connection }: { connection: Connection }) { actions={ { try { @@ -120,7 +120,7 @@ function ConnectionRow({ connection }: { connection: Connection }) { }} /> diff --git a/extensions/tablepro/src/search-history.tsx b/extensions/tablepro/src/search-history.tsx index 66ab18410..9788a730c 100644 --- a/extensions/tablepro/src/search-history.tsx +++ b/extensions/tablepro/src/search-history.tsx @@ -83,7 +83,7 @@ export default function SearchHistoryCommand() { actions={ { await Clipboard.copy(entry.query); diff --git a/extensions/tablepro/src/search-schema.tsx b/extensions/tablepro/src/search-schema.tsx index eaaf321f0..d8979bf38 100644 --- a/extensions/tablepro/src/search-schema.tsx +++ b/extensions/tablepro/src/search-schema.tsx @@ -107,7 +107,11 @@ function DatabasesView({ connection }: { connection: Connection }) { searchBarPlaceholder="Filter databases" > {databases !== null && databases.length === 0 ? ( - + ) : null} {(databases ?? []).map((db) => ( {schemas !== null && schemas.length === 0 ? ( - + ) : null} {(schemas ?? []).map((schema) => ( {connections !== null && connections.length === 0 ? ( - + ) : null} {(connections ?? []).map((connection) => ( {tables !== null && tables.length === 0 ? ( - + ) : null} {(tables ?? []).map((table) => ( { await openTableDeeplink( @@ -174,7 +182,7 @@ function TablesList({ }} /> { From ff243bd1ad8bb80270d5b45dcb8f106028003270 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:15:28 +0700 Subject: [PATCH 29/83] refactor(extension): replace useState/useEffect data loading with useCachedPromise --- .../tablepro/src/menu-bar-connections.tsx | 54 +++--- extensions/tablepro/src/recent-tabs.tsx | 31 +--- extensions/tablepro/src/run-query.tsx | 64 +++---- .../tablepro/src/search-connections.tsx | 40 ++--- extensions/tablepro/src/search-history.tsx | 38 ++--- extensions/tablepro/src/search-schema.tsx | 157 +++++++----------- extensions/tablepro/src/search-tables.tsx | 92 +++++----- 7 files changed, 191 insertions(+), 285 deletions(-) diff --git a/extensions/tablepro/src/menu-bar-connections.tsx b/extensions/tablepro/src/menu-bar-connections.tsx index 79b5551d9..4dd193024 100644 --- a/extensions/tablepro/src/menu-bar-connections.tsx +++ b/extensions/tablepro/src/menu-bar-connections.tsx @@ -5,7 +5,7 @@ import { LaunchType, open, } from "@raycast/api"; -import { useEffect, useState } from "react"; +import { useCachedPromise } from "@raycast/utils"; import { Connection } from "./lib/types"; import { databaseTypeLabel, loadConnections } from "./lib/connections"; import { tableProInstalled } from "./lib/paths"; @@ -13,29 +13,31 @@ import { openConnectionDeeplink } from "./lib/deeplink"; const MAX_RECENT = 12; -export default function MenuBarConnections() { - const [connections, setConnections] = useState(null); - const [installed, setInstalled] = useState(true); +interface MenuData { + installed: boolean; + connections: Connection[]; +} - useEffect(() => { - (async () => { - const present = tableProInstalled(); - setInstalled(present); - if (!present) { - setConnections([]); - return; +export default function MenuBarConnections() { + const { data, isLoading } = useCachedPromise( + async (): Promise => { + const installed = tableProInstalled(); + if (!installed) { + return { installed: false, connections: [] }; } try { const list = await loadConnections(); - setConnections(list); + return { installed: true, connections: list }; } catch { - setConnections([]); + return { installed: true, connections: [] }; } - })(); - }, []); + }, + [], + { keepPreviousData: true }, + ); - const isLoading = connections === null; - const recent = (connections ?? []).slice(0, MAX_RECENT); + const installed = data?.installed ?? true; + const recent = (data?.connections ?? []).slice(0, MAX_RECENT); return ( {!installed ? ( - open("https://tablepro.app")} - /> + + + open("https://tablepro.app").catch(() => undefined) + } + /> + ) : null} {installed && recent.length > 0 ? ( @@ -58,7 +64,9 @@ export default function MenuBarConnections() { title={connection.name} subtitle={databaseTypeLabel(connection.type)} onAction={() => - openConnectionDeeplink(connection.id) + openConnectionDeeplink(connection.id).catch( + () => undefined, + ) } /> ))} diff --git a/extensions/tablepro/src/recent-tabs.tsx b/extensions/tablepro/src/recent-tabs.tsx index 852ffb23d..52eaa910c 100644 --- a/extensions/tablepro/src/recent-tabs.tsx +++ b/extensions/tablepro/src/recent-tabs.tsx @@ -6,7 +6,7 @@ import { showToast, Toast, } from "@raycast/api"; -import { useEffect, useState } from "react"; +import { useCachedPromise } from "@raycast/utils"; import { RecentTab } from "./lib/types"; import { listRecentTabs, openConnectionWindow } from "./lib/mcp"; import { ScenarioEmptyView } from "./lib/empty-state"; @@ -14,23 +14,11 @@ import { classifyError } from "./lib/errors"; import { openTableDeeplink } from "./lib/deeplink"; export default function RecentTabsCommand() { - const [tabs, setTabs] = useState(null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const list = await listRecentTabs(); - if (!cancelled) setTabs(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, []); + const { + data: tabs, + isLoading, + error, + } = useCachedPromise(listRecentTabs, [], { keepPreviousData: true }); if (error) { return ( @@ -41,11 +29,8 @@ export default function RecentTabsCommand() { } return ( - - {tabs !== null && tabs.length === 0 ? ( + + {!isLoading && tabs !== undefined && tabs.length === 0 ? ( (null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - const list = await loadConnections(); - if (!cancelled) setConnections(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, []); + const { + data: connections, + isLoading, + error, + } = useCachedPromise( + async () => { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + return loadConnections(); + }, + [], + { keepPreviousData: true }, + ); if (error) { return ( @@ -55,7 +50,7 @@ export default function RunQueryCommand() { ); } - if (connections === null) { + if (isLoading || connections === undefined) { return ; } @@ -187,25 +182,14 @@ function RunningView({ connection: Connection; sql: string; }) { - const [result, setResult] = useState(null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const data = await executeQuery(connection.id, sql, { - rowLimit: 200, - }); - if (!cancelled) setResult(data); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, [connection.id, sql]); + const { + data: result, + isLoading, + error, + } = useCachedPromise( + (id: string, q: string) => executeQuery(id, q, { rowLimit: 200 }), + [connection.id, sql], + ); if (error) { return ( @@ -215,7 +199,7 @@ function RunningView({ ); } - if (!result) { + if (isLoading || !result) { return ( (null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - if (!tableProInstalled()) { - throw new TableProNotInstalledError(); - } - const list = await loadConnections(); - if (!cancelled) setConnections(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, []); + const { + data: connections, + isLoading, + error, + } = useCachedPromise( + async () => { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + return loadConnections(); + }, + [], + { keepPreviousData: true }, + ); if (error) { return ( @@ -49,10 +41,12 @@ export default function SearchConnections() { return ( - {connections !== null && connections.length === 0 ? ( + {!isLoading && + connections !== undefined && + connections.length === 0 ? ( (null); - const [error, setError] = useState(null); - const [isLoading, setIsLoading] = useState(false); - - useEffect(() => { - let cancelled = false; - setIsLoading(true); - const handle = setTimeout(async () => { - try { - const data = await searchHistory(query, 100); - if (!cancelled) { - setResults(data); - setError(null); - } - } catch (err) { - if (!cancelled) setError(err); - } finally { - if (!cancelled) setIsLoading(false); - } - }, 200); - return () => { - cancelled = true; - clearTimeout(handle); - }; - }, [query]); + const { + data: results, + isLoading, + error, + } = useCachedPromise((q: string) => searchHistory(q, 100), [query], { + keepPreviousData: true, + }); if (error) { return ( @@ -57,7 +39,7 @@ export default function SearchHistoryCommand() { searchBarPlaceholder="Search query history" throttle > - {results !== null && results.length === 0 ? ( + {!isLoading && results !== undefined && results.length === 0 ? ( (null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - const list = await loadConnections(); - if (!cancelled) setConnections(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, []); + const { + data: connections, + isLoading, + error, + } = useCachedPromise( + async () => { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + return loadConnections(); + }, + [], + { keepPreviousData: true }, + ); if (error) { return ( @@ -38,11 +32,10 @@ export default function SearchSchema() { } return ( - - {connections !== null && connections.length === 0 ? ( + + {!isLoading && + connections !== undefined && + connections.length === 0 ? ( (null); - const [error, setError] = useState(null); - const { push } = useNavigation(); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const list = await listDatabases(connection.id); - if (!cancelled) setDatabases(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, [connection.id]); + const { + data: databases, + isLoading, + error, + } = useCachedPromise((id: string) => listDatabases(id), [connection.id], { + keepPreviousData: true, + }); if (error) { return ( @@ -102,11 +84,11 @@ function DatabasesView({ connection }: { connection: Connection }) { return ( - {databases !== null && databases.length === 0 ? ( + {!isLoading && databases !== undefined && databases.length === 0 ? ( - - push( - , - ) + target={ + } /> - - push( - , - ) + target={ + } /> @@ -159,24 +137,15 @@ function SchemasView({ connection: Connection; database: string; }) { - const [schemas, setSchemas] = useState(null); - const [error, setError] = useState(null); - const { push } = useNavigation(); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const list = await listSchemas(connection.id, database); - if (!cancelled) setSchemas(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, [connection.id, database]); + const { + data: schemas, + isLoading, + error, + } = useCachedPromise( + (id: string, db: string) => listSchemas(id, db), + [connection.id, database], + { keepPreviousData: true }, + ); if (error) { return ( @@ -188,11 +157,11 @@ function SchemasView({ return ( - {schemas !== null && schemas.length === 0 ? ( + {!isLoading && schemas !== undefined && schemas.length === 0 ? ( - { - await listTables(connection.id, { - database, - schema: schema.name, - }); - push( - , - ); - }} + target={ + + } /> } diff --git a/extensions/tablepro/src/search-tables.tsx b/extensions/tablepro/src/search-tables.tsx index 8f8ada502..f68cb62f8 100644 --- a/extensions/tablepro/src/search-tables.tsx +++ b/extensions/tablepro/src/search-tables.tsx @@ -8,7 +8,7 @@ import { Toast, useNavigation, } from "@raycast/api"; -import { useEffect, useState } from "react"; +import { useCachedPromise } from "@raycast/utils"; import { Connection, TableInfo } from "./lib/types"; import { databaseTypeLabel, loadConnections } from "./lib/connections"; import { listTables, getTableDDL } from "./lib/mcp"; @@ -38,26 +38,20 @@ export default function SearchTables(props: Props) { } function ConnectionPicker() { - const [connections, setConnections] = useState(null); - const [error, setError] = useState(null); + const { + data: connections, + isLoading, + error, + } = useCachedPromise( + async () => { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + return loadConnections(); + }, + [], + { keepPreviousData: true }, + ); const { push } = useNavigation(); - useEffect(() => { - let cancelled = false; - (async () => { - try { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - const list = await loadConnections(); - if (!cancelled) setConnections(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, []); - if (error) { return ( @@ -67,11 +61,10 @@ function ConnectionPicker() { } return ( - - {connections !== null && connections.length === 0 ? ( + + {!isLoading && + connections !== undefined && + connections.length === 0 ? ( (null); - const [error, setError] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const list = await listTables(connection.id, { - database, - schema, - }); - if (!cancelled) setTables(list); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, [connection.id, database, schema]); + const { + data: tables, + isLoading, + error, + } = useCachedPromise( + (id: string, db: string | undefined, sc: string | undefined) => + listTables(id, { database: db, schema: sc }), + [connection.id, database, schema], + { keepPreviousData: true }, + ); if (error) { return ( @@ -145,11 +128,11 @@ function TablesList({ return ( - {tables !== null && tables.length === 0 ? ( + {!isLoading && tables !== undefined && tables.length === 0 ? ( @@ -226,3 +205,14 @@ function TablesList({ ); } + +function tableAccessories(table: TableInfo): List.Item.Accessory[] { + const accessories: List.Item.Accessory[] = []; + if (table.type && table.type.toLowerCase() !== "table") { + accessories.push({ tag: table.type }); + } + if (table.rowCount !== undefined) { + accessories.push({ text: `${table.rowCount} rows` }); + } + return accessories; +} From 3494507bb9190d00869e8ff24a45055061172701 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:16:47 +0700 Subject: [PATCH 30/83] refactor(extension): adopt useForm and add validation to pair flow Also log previously swallowed best-effort failures from updateCommandMetadata and the post-pair redirect so they surface in dev. The setInterval polling in WaitingView remains, since LocalStorage cannot signal cross-command writes. --- extensions/tablepro/src/pair.tsx | 163 +++++++++++++++---------------- 1 file changed, 78 insertions(+), 85 deletions(-) diff --git a/extensions/tablepro/src/pair.tsx b/extensions/tablepro/src/pair.tsx index c91b5bf0a..e4e7bcbba 100644 --- a/extensions/tablepro/src/pair.tsx +++ b/extensions/tablepro/src/pair.tsx @@ -15,9 +15,10 @@ import { popToRoot, updateCommandMetadata, } from "@raycast/api"; +import { FormValidation, useCachedPromise, useForm } from "@raycast/utils"; import { useEffect, useState } from "react"; import { hostname } from "os"; -import { Connection, TableProNotInstalledError } from "./lib/types"; +import { TableProNotInstalledError } from "./lib/types"; import { databaseTypeLabel, loadConnections } from "./lib/connections"; import { tableProInstalled } from "./lib/paths"; import { pairDeeplink } from "./lib/deeplink"; @@ -29,6 +30,12 @@ interface LaunchContext { code?: string; } +interface PairFormValues { + client: string; + scope: string; + connections: string[]; +} + const SCOPE_OPTIONS = [ { value: "read", label: "Read-only" }, { value: "read-write", label: "Read & write" }, @@ -46,28 +53,61 @@ export default function PairCommand( } function PairForm() { - const [connections, setConnections] = useState(null); - const [error, setError] = useState(null); - const [selectedConnections, setSelectedConnections] = useState( + const { + data: connections, + isLoading, + error, + } = useCachedPromise( + async () => { + if (!tableProInstalled()) throw new TableProNotInstalledError(); + return loadConnections(); + }, [], + { keepPreviousData: true }, ); const { push } = useNavigation(); - useEffect(() => { - let cancelled = false; - (async () => { + const { handleSubmit, itemProps } = useForm({ + async onSubmit(values) { try { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - const list = await loadConnections(); - if (!cancelled) setConnections(list); + const { verifier, challenge } = generatePKCE(); + await LocalStorage.setItem( + STORAGE_KEYS.pendingVerifier, + verifier, + ); + await LocalStorage.setItem( + STORAGE_KEYS.pendingClient, + values.client, + ); + await pairDeeplink({ + client: values.client, + challenge, + redirect: PAIR_CALLBACK_URL, + scopes: scopeToList(values.scope), + connectionIds: + values.connections.length > 0 + ? values.connections + : undefined, + }); + push(); } catch (err) { - if (!cancelled) setError(err); + await showToast({ + style: Toast.Style.Failure, + title: "Failed to start pairing", + message: err instanceof Error ? err.message : String(err), + }); } - })(); - return () => { - cancelled = true; - }; - }, []); + }, + initialValues: { + client: `Raycast on ${hostname()}`, + scope: "read", + connections: [], + }, + validation: { + client: FormValidation.Required, + scope: FormValidation.Required, + }, + }); if (error) { return ( @@ -88,61 +128,24 @@ function PairForm() { return (

{ - try { - const { verifier, challenge } = generatePKCE(); - await LocalStorage.setItem( - STORAGE_KEYS.pendingVerifier, - verifier, - ); - await LocalStorage.setItem( - STORAGE_KEYS.pendingClient, - values.client, - ); - await pairDeeplink({ - client: values.client, - challenge, - redirect: PAIR_CALLBACK_URL, - scopes: scopeToList(values.scope), - connectionIds: - values.connections.length > 0 - ? values.connections - : undefined, - }); - push(); - } catch (err) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to start pairing", - message: - err instanceof Error - ? err.message - : String(err), - }); - } - }} + onSubmit={handleSubmit} /> } > - + {SCOPE_OPTIONS.map((option) => ( {(connections ?? []).map((connection) => ( (null); - const [done, setDone] = useState(false); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - await LocalStorage.setItem(STORAGE_KEYS.callbackCode, code); - if (!cancelled) setDone(true); - } catch (err) { - if (!cancelled) setError(err); - } - })(); - return () => { - cancelled = true; - }; - }, [code]); + const { isLoading, error } = useCachedPromise( + (c: string) => LocalStorage.setItem(STORAGE_KEYS.callbackCode, c), + [code], + { keepPreviousData: false }, + ); if (error) { return ; @@ -269,9 +258,9 @@ function ExchangeView({ code }: { code: string }) { return ( ); @@ -305,8 +294,8 @@ async function persistToken(token: string): Promise { await LocalStorage.setItem("apiToken", token); try { await updateCommandMetadata({ subtitle: "Paired" }); - } catch { - // updateCommandMetadata is best-effort; ignore failures + } catch (err) { + console.error("updateCommandMetadata failed", err); } await showToast({ style: Toast.Style.Success, @@ -320,9 +309,13 @@ async function persistToken(token: string): Promise { }, }, }); - await open( - `raycast://extensions/ngoquocdat/tablepro?token=${encodeURIComponent(token)}`, - ).catch(() => undefined); + try { + await open( + `raycast://extensions/ngoquocdat/tablepro?token=${encodeURIComponent(token)}`, + ); + } catch (err) { + console.error("post-pair redirect failed", err); + } } function renderErrorMarkdown(err: unknown): string { From 42f288ffa005feab5e5993905c5138e2d0ff77c9 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:17:36 +0700 Subject: [PATCH 31/83] chore(extension): add discovery keywords and use Action.Open variants in empty states --- extensions/tablepro/package.json | 12 ++++++++++++ extensions/tablepro/src/lib/empty-state.tsx | 11 ++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/extensions/tablepro/package.json b/extensions/tablepro/package.json index 9623a1301..4c1effb8e 100644 --- a/extensions/tablepro/package.json +++ b/extensions/tablepro/package.json @@ -6,6 +6,18 @@ "icon": "icon.png", "author": "ngoquocdat", "categories": ["Developer Tools", "Productivity"], + "keywords": [ + "database", + "sql", + "mysql", + "postgres", + "postgresql", + "mongodb", + "redis", + "clickhouse", + "tableplus", + "dbeaver" + ], "platforms": ["macOS"], "license": "MIT", "version": "0.1.0", diff --git a/extensions/tablepro/src/lib/empty-state.tsx b/extensions/tablepro/src/lib/empty-state.tsx index a614fb28d..c60f05f84 100644 --- a/extensions/tablepro/src/lib/empty-state.tsx +++ b/extensions/tablepro/src/lib/empty-state.tsx @@ -6,7 +6,6 @@ import { launchCommand, LaunchType, openExtensionPreferences, - open, } from "@raycast/api"; import { ErrorScenario, describeScenario } from "./errors"; @@ -26,10 +25,10 @@ export function ScenarioEmptyView({ scenario }: Props) { description={description} actions={ - open("https://tablepro.app")} + url="https://tablepro.app" /> } @@ -43,12 +42,10 @@ export function ScenarioEmptyView({ scenario }: Props) { description={description} actions={ - - open("tablepro://integrations/start-mcp") - } + target="tablepro://integrations/start-mcp" /> } From 69508e619820a341af8f6aed078b3bf3c50bd081 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 12:29:19 +0700 Subject: [PATCH 32/83] =?UTF-8?q?chore:=20remove=20extensions/=20=E2=80=94?= =?UTF-8?q?=20Raycast=20extension=20lives=20in=20raycast/extensions=20repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Raycast extension was developed in extensions/tablepro/ for convenience but its canonical source belongs in github.com/raycast/extensions per Raycast's distribution model. After this branch ships, the extension will be PR'd separately to that repo. Local copy preserved at ~/Projects/raycast-tablepro-staging/tablepro for the upcoming raycast/extensions PR. --- extensions/tablepro/.eslintrc.json | 4 - extensions/tablepro/.gitignore | 5 - extensions/tablepro/CHANGELOG.md | 10 - extensions/tablepro/README.md | 67 - extensions/tablepro/assets/icon.png | Bin 527921 -> 0 bytes extensions/tablepro/assets/icon@dark.png | Bin 613508 -> 0 bytes extensions/tablepro/metadata/.gitkeep | 0 extensions/tablepro/package-lock.json | 3568 ----------------- extensions/tablepro/package.json | 270 -- extensions/tablepro/src/lib/connections.ts | 99 - extensions/tablepro/src/lib/deeplink.ts | 64 - extensions/tablepro/src/lib/empty-state.tsx | 120 - extensions/tablepro/src/lib/errors.ts | 73 - extensions/tablepro/src/lib/mcp.ts | 576 --- extensions/tablepro/src/lib/pairing.ts | 31 - extensions/tablepro/src/lib/paths.ts | 35 - extensions/tablepro/src/lib/sql.ts | 13 - extensions/tablepro/src/lib/types.ts | 122 - .../tablepro/src/menu-bar-connections.tsx | 112 - extensions/tablepro/src/open-connection.tsx | 46 - extensions/tablepro/src/pair.tsx | 337 -- extensions/tablepro/src/recent-tabs.tsx | 96 - extensions/tablepro/src/run-query.tsx | 323 -- .../tablepro/src/search-connections.tsx | 141 - extensions/tablepro/src/search-history.tsx | 84 - extensions/tablepro/src/search-schema.tsx | 195 - extensions/tablepro/src/search-tables.tsx | 218 - .../tablepro/src/tools/describe-table.ts | 19 - .../tablepro/src/tools/explain-query.ts | 20 - .../tablepro/src/tools/get-table-ddl.ts | 16 - .../tablepro/src/tools/list-connections.ts | 15 - .../tablepro/src/tools/list-databases.ts | 11 - extensions/tablepro/src/tools/list-schemas.ts | 13 - extensions/tablepro/src/tools/list-tables.ts | 18 - .../src/tools/open-connection-window.ts | 16 - extensions/tablepro/src/tools/run-query.ts | 63 - .../tablepro/src/tools/search-history.ts | 20 - extensions/tablepro/tsconfig.json | 17 - 38 files changed, 6837 deletions(-) delete mode 100644 extensions/tablepro/.eslintrc.json delete mode 100644 extensions/tablepro/.gitignore delete mode 100644 extensions/tablepro/CHANGELOG.md delete mode 100644 extensions/tablepro/README.md delete mode 100644 extensions/tablepro/assets/icon.png delete mode 100644 extensions/tablepro/assets/icon@dark.png delete mode 100644 extensions/tablepro/metadata/.gitkeep delete mode 100644 extensions/tablepro/package-lock.json delete mode 100644 extensions/tablepro/package.json delete mode 100644 extensions/tablepro/src/lib/connections.ts delete mode 100644 extensions/tablepro/src/lib/deeplink.ts delete mode 100644 extensions/tablepro/src/lib/empty-state.tsx delete mode 100644 extensions/tablepro/src/lib/errors.ts delete mode 100644 extensions/tablepro/src/lib/mcp.ts delete mode 100644 extensions/tablepro/src/lib/pairing.ts delete mode 100644 extensions/tablepro/src/lib/paths.ts delete mode 100644 extensions/tablepro/src/lib/sql.ts delete mode 100644 extensions/tablepro/src/lib/types.ts delete mode 100644 extensions/tablepro/src/menu-bar-connections.tsx delete mode 100644 extensions/tablepro/src/open-connection.tsx delete mode 100644 extensions/tablepro/src/pair.tsx delete mode 100644 extensions/tablepro/src/recent-tabs.tsx delete mode 100644 extensions/tablepro/src/run-query.tsx delete mode 100644 extensions/tablepro/src/search-connections.tsx delete mode 100644 extensions/tablepro/src/search-history.tsx delete mode 100644 extensions/tablepro/src/search-schema.tsx delete mode 100644 extensions/tablepro/src/search-tables.tsx delete mode 100644 extensions/tablepro/src/tools/describe-table.ts delete mode 100644 extensions/tablepro/src/tools/explain-query.ts delete mode 100644 extensions/tablepro/src/tools/get-table-ddl.ts delete mode 100644 extensions/tablepro/src/tools/list-connections.ts delete mode 100644 extensions/tablepro/src/tools/list-databases.ts delete mode 100644 extensions/tablepro/src/tools/list-schemas.ts delete mode 100644 extensions/tablepro/src/tools/list-tables.ts delete mode 100644 extensions/tablepro/src/tools/open-connection-window.ts delete mode 100644 extensions/tablepro/src/tools/run-query.ts delete mode 100644 extensions/tablepro/src/tools/search-history.ts delete mode 100644 extensions/tablepro/tsconfig.json diff --git a/extensions/tablepro/.eslintrc.json b/extensions/tablepro/.eslintrc.json deleted file mode 100644 index e6258e11d..000000000 --- a/extensions/tablepro/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "root": true, - "extends": ["@raycast"] -} diff --git a/extensions/tablepro/.gitignore b/extensions/tablepro/.gitignore deleted file mode 100644 index 349b2d696..000000000 --- a/extensions/tablepro/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -dist -.DS_Store -*.log -raycast-env.d.ts diff --git a/extensions/tablepro/CHANGELOG.md b/extensions/tablepro/CHANGELOG.md deleted file mode 100644 index 6a4d5b352..000000000 --- a/extensions/tablepro/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# TablePro Changelog - -## [Initial Version] - {PR_MERGE_DATE} - -- Search Connections, Open Connection, and TablePro Menu Bar commands. -- Search Schema, Search Tables, Recent Tabs, Run Query, and Search Query History commands. -- Pair with TablePro command for PKCE-based token issuance. -- 10 AI tools (list-connections, list-databases, list-schemas, list-tables, describe-table, get-table-ddl, run-query, explain-query, open-connection-window, search-history). -- Tool.Confirmation prompt for mutating SQL with connection name and SQL preview. -- Empty states for missing TablePro install, MCP not running, no token paired, and revoked tokens. diff --git a/extensions/tablepro/README.md b/extensions/tablepro/README.md deleted file mode 100644 index c3018083f..000000000 --- a/extensions/tablepro/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# TablePro - -Open and search your TablePro database connections from Raycast. Browse schema, run queries, and let Raycast AI use TablePro tools. - -TablePro is a native macOS database client. This extension talks to a running TablePro app over a local MCP server. No credentials are passed through Raycast. - -## Setup - -1. Install TablePro 0.6 or later from [tablepro.app](https://tablepro.app). -2. Run the **Pair with TablePro** command in Raycast. -3. TablePro shows an approval sheet. Choose the scope (read-only by default), pick which connections this token can reach, and approve. -4. The token lands in this extension's preferences. You're done. - -The MCP server starts on demand. You don't need to enable it manually. - -## Commands - -- **Search Connections** — list saved connections, open one in TablePro, copy a deep link. -- **Open Connection** — `Open Connection prod` from the Raycast root. -- **TablePro Menu Bar** — show recent connections and quick actions in the menu bar. -- **Search Schema** — drill into databases and schemas across connections. -- **Search Tables** — pick a connection, list tables, copy DDL, open a table tab. -- **Recent Tabs** — show tabs currently open in TablePro and reopen one. -- **Run Query** — paste SQL, pick a connection, see the first 50 rows in Raycast or open the full grid in TablePro. Mutating queries ask before running. -- **Search Query History** — full-text search across the TablePro query history. -- **Pair with TablePro** — issue or refresh the API token. - -## AI tools - -The extension exposes 10 tools to Raycast AI: - -- `list-connections`, `list-databases`, `list-schemas`, `list-tables`, `describe-table`, `get-table-ddl` -- `run-query` — mutating SQL goes through `Tool.Confirmation` with the connection name and SQL preview -- `explain-query`, `open-connection-window`, `search-history` - -Try `@tablepro show me users in prod` or `@tablepro how big is the orders table on staging`. - -## Permissions and access control - -Each TablePro connection has an external-access setting (Blocked, Read-only, Read & Write). Tokens are issued with their own scope. The actual permission is the minimum of the two. A full-access token against a read-only connection cannot mutate. - -If TablePro returns 403 for a write query, the extension surfaces the error verbatim. Change the connection's external access in TablePro under the connection editor. - -## Pairing flow - -The pairing flow uses PKCE so the local TablePro app and the extension agree on a token without ever sharing it through a URL. - -1. Raycast generates a verifier (32 random bytes) and a SHA-256 challenge. -2. Raycast opens `tablepro://integrations/pair?...` with the challenge and a `raycast://` callback. -3. TablePro shows the approval sheet. On approve, TablePro mints a one-time code and opens the callback. -4. The extension exchanges code plus verifier for the token at `POST http://127.0.0.1:/v1/integrations/exchange`. -5. The token is stored in the extension's preferences (Keychain-backed). - -The exchange endpoint takes no auth. The single-use code is the auth. - -## Privacy - -- Connection metadata (`name`, `host`, `port`, `type`) is read from `~/Library/Application Support/TablePro/connections.json`. -- Passwords are never read by the extension. They live in the TablePro Keychain. -- Query results are fetched on demand from the local MCP server. Nothing leaves your machine. - -## Troubleshooting - -- **TablePro is not installed** — install from tablepro.app or set the path in extension preferences. -- **TablePro is not running** — open TablePro. The MCP server starts on first request. -- **API token was revoked** — run Pair with TablePro again. -- **Pairing got stuck** — close the Pair window and start the command again. The pending verifier is cleared each run. diff --git a/extensions/tablepro/assets/icon.png b/extensions/tablepro/assets/icon.png deleted file mode 100644 index 214a776787a59aa7c5a667845a40fcb55eda507b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527921 zcmYIv2QXZ3)V^LKx^^cE5=EFnrl^j=o) z%W8|QpWpY*fBtvooqO)Rb7$_{^FHT2=Q+^NrwUKOU8-cqlE2?`J-FnzJFx!lGhb>>z|)g zmbph^^SyPIBVtlFyZU*=jG284#fN2+kslVruB+%>Wf_!6?}9+eBZ@XjUe%=N9d5Hz zarqwDL3uPyc87#Wd>UE4Gyq_Hj}6xSB% z_29T3*Ul;;`+s-HNQ%h+zy04s5t&Rl35gnszLxs4K+=N_x)u+8Q=zP&8x0vVI?R<} zYGNNgd;HZ=+ud^b#J84iq~KVQD8S%6_pmL&zx)@~;4f;nrge3v92Qd+>o4|AikC&q z?s`mZ%%%(`f-)z1Y`0uK()%2#IDw{fh{^t77@H)wgwOVDw3*!5M{|=k%RJWRr z<^Z!CWtkxRldi;#2ybO za^`0Om{RC`Gu*XR7VCJG8izB8CZ^ec bCZ^}o7IH(#3^WmmxUVis~{l!6B0GPoi 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ეulydb#o@!lmT?ueT50QR#GPC?(4S0!Q+p0@*kJ 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਑if=z(-DZYFVGaxt`RSdeP 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�#3!@FcG_ZU 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 Bg4qB7 diff --git a/extensions/tablepro/assets/icon@dark.png b/extensions/tablepro/assets/icon@dark.png deleted file mode 100644 index 237edc57d66d870f81663edd2d5109f12d3b24ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613508 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

03G{jn2*>fYlQ97K|jnMn3Y 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 pYpI+Zb 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
)xSEYa%u@xw|}&aWx6wr~-SY$**l5f19PabbpG zafa6hSvZSWg;E)_Wog@NNmuHM>1!1l*_-Syip;qx9tu`y#5Sy|AJk7Gvu_WyY&p$j zymZWMTxz-e7j~xZQC&OrD1YGRO5Y0z`7~GUf=?L^$sY zeedUN&O|@Zkr?xvgP)M(72EsRh?V*!`_HQABl?CZuJp@rZr=5lVQNCP6@JO`%qbRh z!2~Anz9Ssad>GTzyW~HVr9fr9`?nUBqTCTZPHSFfnU1c`19+AZs^;KhMUb4JAzGcd za?J{epOwSH1q^VYUI&;EWPS*x0Bvx~AbOZ+LqmWq$AbzoAj#??1B7uBv@^H)Uk^g!E=rEc1>iGPv7zV&*6ZFNA@a_XNndLGGmFNkzYy)=)=O6xge>$f* zW+B>afNanRlnZcB&j3AvMIxddI7H_W!X!sFlJPIaiyj`Hx_j3Gn_rdY`Z8>hL;ZZG>e5wx0jL*Ul1PjT68lxB%rN7SKb+6u7bGb`nt4-y7rRtrKj5-AU4(0oYcP~Jj^9rw?SMG;?`Mz2=2(l6ICD!|Coqa@QbUrrm-pEJqRr-8xkc+>2-QqL$MCCBSQO`E_``l2viV4-7 zMf#E}<({V+L*GpB3`76KX|N18I<8(Q84DjsdcXLnl-T|)q{I0iC9a=UZogzv)!pNj z_9tf+8~r?Emd1QnJA&?ocu)t$saIYnt}j+oKBOM&cUFO3ps>GPwDbYxVqB-d`p}_Z zvA?QT!~5>H=@_@+-2@q-Zy$z{!L-Gzcrmf7pC#O?c{$atXudFbHvOb+p@3Uv!J(bHq2(b>eiaYL%zp)#Vj1=A< zkA&gPqco-{K-Q&~sb}Q+qk3UW3Vr8dAD%6ImZDYXqJ~%dDFD+qcQnhDE=L8?sLsPu z*YPQAs#_p4RyO~4cQ?|5&rBh4?6t!|H(8AVUP`-WYOI<8%$dfv`OS=7W}(|^4<4GW z=nicCRCfAMss9ujF?aSCPL^_;xRqajJ)HuYNCThAxJMJRCs*)XDZI?Go@PEiKkKlt z!BH0LdNas$Q}`W2y=e;r7`FElQnsi)i8bt3%{D;VH^Ae2C2?|~4B=P2+B=W(;rIU~ z9T<;}m2Br9Sy*yD(gdv!D#2>H95u8ism&l+-L07^pMl6zkUCRb7F_N!8cb1SL76_D3qc(cn zYhV}S5nfe?J~+80n`pK$fEGNzF#y#U&qWw)z?LO{x+2eWZ-HF6ieu1s8Tt}9%z(K> z;R9X)FW0l~U;-kR=r>@8u+4lE%>n4HoA~yo`Z4^)F^mNTmbW5@Vq!yi2Io{Ei$cl8wWw7yxPFp6IdI_Pf*Pz zWgn1AyN z3uS!Ak=Ku_Wscwk@>qSa1?R)|U zqXYvkJe&B{jJ-kei#G6X>*JPLcFGZT0yGsdbcA3|qzZpO7z5g@L!TD?0_c~PE3bY8 zG5((f;w%}{!P@6mIK)e0G{?Y^9H}*|Ay3WLP-(jm6|sX&*7;z3NABVAkoQ+>DGKq`4oP5^iTeL{gZpnXq_ZJt?<5DC)r4z2#6}&dvWo242*KZ z%k^2?|5Z_VpWkv9Qy$4C+iB#n_*dzr7CgMT`EVLsQ~d~ivUpld)%)r7l`D(7FS)z3 zgr);yeaWDP0_)89_H*e>;=~bW%3M6r)Ep+w(~ub(;fSMe917|?F>o1X5S5o4C$*r^ zB=L8tu$&Ekrlq=$*{-+0`df-v)1PR6pDX%g4&OvBs`raUx=>#jsNZ~=63k*~7q^|+ zcHifIh{CTE?OAd4N9ku*xI2S(s6Sj7g4`d7CYFM=H?$Rha&g3_8~)q>tfAAj0?MV? zS>69-%kMirhkbQ;m7Ce>iLKX-5&?xaB(lt_-t&HUTgDp`yF08>EH2D}Pb^M(c@iJ# zYf624B0XIu=tdcnBpCxmf|=3a+IG*B4+W_AzPblt@uULBGVxzU8w0^6bd^`fsvvph zelad3@frr&&lhNR-}J$s%KRd+o_MLc%@u^3F{N;Z-@I_53pu~$HE_&ael_ZXl3+kZ z1G4pV{1z`y2CT^Gw;;1i6Kk>i=0{go?`5b4rHReuIFGS1xKR?D?o8-6jiAt0v4}o7 ztbtBZX6GF;6Kl+pcEnOi-dZ*T)IJXfO?2o_vA8)3wa-k4&=KK2nxv2qpV*~=3<%GK zL1DP*R(_z60oR_De}i&(B*clHXoK05re|{|&h6lqa_1#`2$}}aWdy0vBnOLP{e+5Q zLRV9QZPPfNXafX3$cqkukpdOg`K;Ssp5i*bLVDe{SwI>lX4arG*zIhF;I0ZodI(Nk;u4N|z7 z-Ifx2M}88Bje-n7Z6%KRx`ggV+My5Kfa+7O@Jp$}9Sq_fKq_OAkSd>_ULUi&2fCV( zG|)NAQT7jTEt8>Ws`X`QEQ>2SL~pVN}V*}2f#>JASZ}pZyOO;$w3ZWEc5Y5J_h~~C@YkR zL_PJDF}Q(+`t@c$TULKfFxy1sexq}przO4+(?Nr&A`Xirh2DF_Z`qS!ZlNoU+=P1F zW+(;``ZL^W`kWG9)~F5e-Bl(JFT`^Ysu?p)GtO=SWxnH7?8Yqnkp#2he6&bK_IzI-L2>vAl3=2rVk_I~Y5?`c(YJ{V! zI9bAQ+z~7>s5}QW2e|lyUiX70f4qK4zm3=0Z+x%IiT8s4xmIu$`y;bWRdoB_sEH-S z*YCZZ5r^IDP3gJmE|hULCMDfYf#(^U8A5E8>kH2eduo{+t6^%1!wHaaUJHuPjZdB| ze})EbPI3P~n!Yoh%K!i0o^i}jI98ciC1f01$V!sLsjO6zWRJ_S2&N(;E^?tve^X0KPDt>ag{k_S8xJmD&Bk69YonI)& z@Q^>})FzYKSVo7D*}#6)`(Fut&jc)DZq-Xr$m6+>DwCMbKD4bSc7B(R-&JH`-0D!> zFmg4b&1uYc{CV};((3`LnC!1fwIa6aVL}kjW%%ZXDP0PdVECTJXO3QB zedwuqr{j{ze!co6?B0{>5)FG*?)!P7L#$MzGO4s&PQd~e+6{c=-~4tIzrElC)F8W3 zE@+vOH2#=%KA?A}V&1WP$v^Eghuhd_6nDUYm%Wc9lj^N0ZX+G;PWT8k*a=KcN#k3Y zf``HpSTvJ|Hy*ii<8kT&nif)`y3`J|H0O&nK4#mr7ppAm#heL6p&>`2QcI#pvX$|lXWT~PAiZDg6;h^K}-ot2SxoV-CJiMB@PA_ zO}0oyrt5JDSem!Xk)uIVnNz(7gr1;wx#7#yVL&Mr!a&(ZG`QFAY5ZnBFPBrEdxmrd zCobLjUmx#psv`rua~S}e%w^>E_BZEwti1T;%F9pZ$Zs!}d#F~!rm2^`g0meLW{^v~ z5(G{|?~47XOOLsFpCJ1n@q?d?C-32%J`{*gW;w^2I*tA{nJMc&1I>RqrJ0=mwH3%+ zp-T)D6PtqkZi`Fmd}-Ws(-hrRRE^ObQSy@8HfGhB>olm zs9EdDk9PuhRgtoso1;iCtl>AX`i{glaJVJW3r)EY5=lG=2kn6%e*U-8O{4t$0x%YA&S=;)~WCiBGA-;}?7XK=K%geW9Dx;dJ<_&e5lZIIo~b z6bKjBHt8U!1vj|@P@{|li2PLdBQOK%zgJL&fjLkXBVypUPDt-;D68*<2YkD+DBXdj6!MtB~rDpgClRS0*A^28pB5*+Ih(T&QV=EG8ZDF=XtaM z0UhP3j77W%cXpv5x>~>8goO#W3m@$E6Z^KwC&9Z@xE}*(a-k)FfHpsclaFgO;~H`v zzU;5xXdQj_Y9#ZpI|5k*G_xwR6FioH7om{l1j%%V8IPL9!R~}L$x518}tq z>UnuT9SB7(w=y`|s_zD%XSfH*{4z)LNz@GOkw zNLKSHjlPYtCwvjRzT*((<-nL50Y) z6ymG54{OdHT{#~a%nR~=(hUnq3;2-bGj+Sx&>stba`Ux#an+$ot!vgvZ63FEsz*bN zj8w1KR8`NJMP&@Ttk}ng4kr&k>&ncZg@`P~-JZ;uo{`4OnHVnB$(#T-Ba^9ZRD-a@l3AadB9{ibE0%Wuc?ScJPc z*~VCfg#@!TyAQhMSi#(tx&`#C=ViSVkvFdYEQ!k8#8GP<-MxCZa*4)ZCn};%NAl9G za47cC_f^6jB3x(dwLgZPtNaiab;T+M%xsJ2rHKl8dYBxmLHmG`R4-g+PiwO$S974b zhCE3#pW@T&vs#DO*qF^%bs|e4l@o^9>z#6TsNyg1?8FNkdPlRX!IZ?Y(|3A$`Nj}Q zf+_z&%}+$UUf3D=B27w}p$!JLPqhckf)Yk83ZkH>P)NgO8Tb@>%PUr3QN(tRhZ;O- z+(-9qaVmkn0+SHi0YkjGJBS`o&MVVgQcJs&lo6)(U7T=zVswCr7-E!-K1ExtLdGjd zE-9=HnAJ6dbBltQG-kEU*wJyDmnQnvB%ML{hple-0I}$Ax^)zRoxW@@U*(%er0=Vl z3q)kWS$M0?D%5lVLaSmS<&X3yPXpAA5cAN9g@gJ2mut&!fdpRJ3~2C-3LI5_H=m4! z`j#gy;vug(?nQOn#VE*>5<;^aM0D;VWQZ6|=iSOZAPU_Jp{ygi(txPo_*E*zqh%(9 zuLLnW=qc`MycC4iIfa6UAV&ONJ2RM`uTGx$xFOEA&g2UYVL*13PV&!PD%@lh0MCkz zks^LQlFJ6{At#U;zg=dz+gz?pkGl#nAr5Moj%d$omjTalc6fhqSwDij-YmVn<`5lq?U!LN_tjm6QIjlbqFf3P2~`k( z#m(!sO}h~RUihi(q(LnEU6nvJnh;oX zOLe>+MXlNQxSI-!dK$ai0i1^k3wtqUv(CQlgBHp9tS$VL^eQ9CXD!*&3#H{X4sTyG z9}YH74c>nO{L6g}{ip#k@A1>fAne@xCOu%}64Rt@?T)KC(JthmYisB%@k+=iY-LBZ za+8eY4}xUEAEyFXt` zD3NK8*q`e61+r?H_xwx3|s@X{6KhQ{vTb%9zjC``F5$x+?30~Zg zX()tUBYUv@+^LE5quh|?kiH~0?AD$1U*t7z{8#{=-!| zA6LFUDPC4EJ^fVcAG@(MUd~*0pQw7Lk8BJh!Y}#ua*<#RM_hzBFN~n~8j^N|yKRi= zNCV4PcIz?g)_m|7+JNTfcgtQz>*MtUwdaYc7oQ|W)JT*tykS=Nr5(*~&+MG(^ONu5 z&hU6HI&eUK>UGDwnI|0+{UT1X6m2#j zMO4$et{p7+X7Lq}$4?bFQGx55s=THvfVXBhuFdsL2#FbykgCz%^9)VRZ7_ZJB1D} zq==Huj_4m}|A@K2>j`uR*LRc(3tg1V%=nIF0PX)k7 zFa0qQ;ZnK3shW=}lfP9M`{>D2SAVSjBOfb}L2@IC^{y4n@vU z;eY!h8tuXmKkVj=Nk(bxb4IrLP$MaR0V>OZ`uvdmc*Mw&6tUsVoRP>|z2FkH8F+Z1 ztU&nCegzQ82Fk)f4{vf%5vsuHLL(&g6YZhWcISHaD;-Dmcpw}!9|Gb|Xb)lA&!4wpL`w2ffI%Dun-xO zMxm~VQbG|WyL%i5CU&{{mp)RJbrzs(Q47Gg^kb7#&-;r8e56V!_HBwfW zEh+E>pSb7i88XTxQa54Pnx`uP7YiVf?N*u3e1z@KTIa@OnI%X~fhHP+nAnoDLzB;C ze(}fWx#;Ff9(C!?OeVn%&fj~hW+}EM6ZTXcmGbuyXKAa}Mj`9YMM{FowrCKe|HySF znD;UE(w&DJ%3Wzr3_S?vCb)u^1q)4DhI=~UGCP$>%GUIwhf0S99JHZjh$AG;@I7tTu`(j=tA5HMK@@KtKJ(2#O1)Tn1`0ZqfCz6 z9cX*(YDg3cvcd8Yl093ql&f!#q`banh?Z5`m9hH3W=&flWArgJCiY{t)ST=m@5Ez` z@UB3~n7CMDt6r6R&vWaT072HtA1dF5-Z791%(Lp45Q`K2;y$ruIgE?vK4&fj;gUN_ z8~k=OSE#aXrwQK0im&Caeoc{0+63(w<+FD8vL$~Mc$UGvy)JZ(ihQhReL^2{>jF;u zj%E(z9?;uVb0@?BTc#=0mnR7YrX0t}3sWaQw|$uPWzRz_tAj$oVvxkOjXZ>Zu^A5$ zz=#^3d9SeN0L?2iRjMM8qu+=_^LRu86eh2H5&4aHY6}z(<5Pqy?vA@e)J`lyijxubww!V`v{_osYiWs z9x}`XEAYq#`OYiVWRaBlAt&x3m+x|O1a)gX)ao*a&OFw@agztiX)5v;$l>J)RGm64ey?lyozITsJNJCZ{o)W}F?$94`j8yts`k`p=>p4@X=iIodQwGihcAl1!#IztW1ynv~iaLjYyF;tEI`T? zcn_pl*bF1lCV52Jk~)2+VI3n8e|3H?UB{du`r=4ZhK)9AbE&G+>>W}5Z_$$zU5zt z*%_dj4M|&=ECtT-wnNKILZAGYE zEBrNFgA@_|m8_Af{i_iTq`=g(g38n8KS7?BdFC&O-U0%2^OWvsZpJjP3Js{T*(*}o zj?q44U)j7oV2Jw-q@5rbKq$E2z^8CYEyp(-?TF|Y0y51`u9@8i=_@w;?K&$dVZo>;U+)pYndf!j4yP@p9) zB<%!a{Qe(&uSEhW5S9o+Fs_5`E=aw3fecxK)|5BN0BP88J2%Q<3n5w-frW-gsvcV? zyt+@i_yo3s*~uw$5^$~#KNXi08&%k?gSz$wMsgszdXBkH(hwT8K;XNTOuGT2gy2?) z1PG{%erG9PnZMakNP!sg4g>N7s7VpNld+HDJYn&5H3y?X+82X$ApT;%8d^c8OvkgB zF9=7Td{N^tAkJqEDXRVH5Q+>w?|9)AbyG~i`{&(c|Bj}~nHc}Gq}2zH%1Bhs9%Oe6 zNgDj1nz?-R1z}eNJh4mnr79ywuH>qSyO+t%;2r&*<3kPjq&IBA_L`7uT9-4Ixxw5MuB1=0H?hyF;5Hj$e z4O(jT(B?mVv>B}NtO2(+tmUV#j`fQe}BXzwq?)1wpE**OM&!J66< zgg8s{T$*BP_12su&xZxt(NLTpHsV$(&a~pJO*XIXPI!1XZI#WZD)8vP^B1_Zhsxt_ z)iI|@si_bW|0tha9sx2yfV&@unR}l7FIGNS&-8UmjzcDT_mu zNrRkl`H!QNkSSG*dCGN6zLh@<%6lP20`L^v$)l79rl{srTB;f|{3-dZgAWv%H;)`l4scpeV`NAjTW%lq@nc3)ic-2^7pr}TZw>2bMIMAbktdWFBS zS^}?aj0ur^Zbi#^V2d*?{{16zDqO;GK9(0oBD9;ZpBH}6_~^mVRJFwO#LtCvi3a#Ai=G^yO}}QLhkud0l|E#Cn)haa zlH&WS>k#TZF{XKwsOAnjGC>Et@8QcDd|XWqJ9aM8VZ1k7a%xs3PHs`4y|OfU@Xms! z8L`x-)vYtC{Un>uJFV#fxmTt(C3AoU1#7aD#$Ttswo%Bk8K&k*{@jgt)`Gl(%f zD@=}yS#@`O_4cHe&lJ_1Y^1je&$RrP1H_!tCoJ6XILjVCos&TIeF{x3`tIXNk^wO# zyQ;L%UL`#ar3n@P)wwFZf{uoMWfQaEf7ToW_569UfG8;f^2yumAW{Rg5H$fo4~=%B z-;;-GZi2E=47n|7(*K{~00roUhvT~Z3jyRhyvxmj`{V|J$DCYQH-_-kTvWsatT~sd zkIJsya99Q?i5B_ekSZPqU46!l&xDpw>t-h|uAy&0&ogf0M^k|f9K1k^>H9v~YZ?Ac zXh3DO2Uv!d%v7VGh)20IJUH@!wu*!3P7R$dFI&k8LkvI#3XpH2L+mmxqh(K{i-;AQ zTVzYQM|j0wN-jcG|7{w=OS{%EhRsyhzs)e)v{uCK6|2i4C381O#anwGB?U*{-qmIF z+9eM$skvBbh1IRCJTR8q{`N%GBm~e6e1kaj1!~+TTTeEpK8UVfHI-{Sxsp(lV3JUR zTz)h8r)K>t?T+n}gl0_k6%c+FbEWkPfG%x3+l=-0s6*^m+mknpdR&}LN+ktaXjm8# z-F73igJ;ys!ymzZ?5>o{O(lw*Jn~GKpXTWa3D@s?cx7ik(seKUN*p#e^e}_rso&>o zCg|XbU_o|+H#}!w^f*#3PP0?89#57C#!C;EtVsPsxLIvj=JbrqG6&{a;(`vi12dU6 z1n_ioH-mM4ds$KiAe@xbK&xaXz7~>HH{$ zcUw7inU|?U#zM8A5+0!+w;Am8<2>c|D|Jpb{`rEe3X0a}W!+wpe(3iF@iKxVDkP83 zyN6yG9%AnsQ2TVZgkhdQ^qt$vmOc;pvd*GOYGSY7YV>&S$w&Stv}kldF_yUp*l7|? zumej7N54!oqQzA1-dcAk^eL1PG$&&dIDyKKz*rkpKv?WPk+G1?mF#fLNN`9RGFp(_ zC<##x>EK${wP1a%Pu1kT_u!y+ng*I@I(su?$j}JL#UtmYZo@dEwU5R$RxpoWV1u1= zb&uGo9Wy}`Crn)MQ(un|1G34sjmJX9q+D}gIGDq-17E`fQ{LFC6X5>d>A`HT>$@%0 zuiObSs$+G^e6b1+#kb-H3{_X0B1hO`cT@MMAtffLKBz`;BRFv(pqd&j78T(kqtXt; zNR`}w396SV^?P~L_Zgqqs=N5UY~?W%BLkszp_g~p0ZPj=qklEx&Us%DOnrXQiZFUf zOF_1?+R>xjy%uU%CtIXq`qFsk0gDgAqroTDEF4Bk!4F;Z+|4fcR#hxet)-6vbA*}7helHhbGTJjco z2&tw3!6KI1VLa&bObW-Y3R;8e1<}yfZySAeottL@hvpnjdjR_l6;hH}vr2enbKz;uGW-&|OXMshdTA3|g3)fJda@e5j@r@zyeu(xNpf>P?S0x>wxv@a5ca)|Rn7=`EU6X6N zu+*%{Y(1yPrPXzN^ zw#<6igA&{F;>IenAkLtmCg9#@P zO&|uEfY>8(+xyuvG9ihxL6-&|rAvqky}RRo@5-`!-g~3WuA>`+ff@NS3^Ee@4VmM| z+{bHzw^4m%X(f(m;7)sXv5vT*0(A8w>=l_i5#46M5HiAHEc8X?5s zo|C|XUBl1O7WZB}*yFDieKkBf?g9V&#`94u?^sk|QZ^0WC}rRN^OqzxD{bi`mN^Rb z86fnf3_6%wBKcnJ+x1Bkw)G2D0y1tQ60*YmTNVhHxY94P*QMxa(h5E6WS!Zq`eZLT z{%U=-zr=N99RwVT=U8gb3+f)`E{42mN@a6xi3qaXsF%!Z4Bl;~q6w^o4Wn zfD*20=^RB!g@>7VuS z!-GqJM9FL?8jJD08~gve0LVKN5VPYn5GO6)S4}MN(i#u+Q6zl3P9jndjeD4%J1Y|-9k6q^>vXvqs3RV6^w6u!?Dw68~>Q`tsk^T=}F|u_O zZDMTkd$#6^;05AP{RpA}ONZy)aje*c-}#uzf{`Ur*Gn56ZtOvqCebW+@PY*TO(<#w zF6n&t4=EuU;iiWFL$?*;M)W8I(muZ-Q&hi)A^%B;e^VXp5eO;|y{9G*7HIOEU(%!adlfg$zWN1OT)JCVv*Z>wF=8sN>V9H@uvN*e}bNR3{h zA-Z!d5`}l` zTU@KzL!DiSLDPjis+70$8`V)b&iq@`Q;je3AiK=_91ea`g%r`!Wb+oit`{lv3h`AQ z_`(qXZfUUEE2`!uM*;2E4~dys79H&UQ~Ftj7%8{>+Zm_(u>o^sjC?d<`7C#Q{R<)! z&FU-!vKoFLOvJ-K=A0#)-qCn5j2Gf*M7LwS|Mg9MsqF~%qG9y7jS->oeM=AwXG3&@ zFH8$2c6^^4?|uC$Hh zQg|PZ0hJ$tmo4#jPt4`pUKCu7Fz!4c-Zc=$u{u)y7z+t~_u06qk0^9vxO5q=bF~_w%YR4+2zNSiV4J?#;SKz$B6QRye=QBa_0)x4Qq7CzauW=z z;w)o8@0l|n{q?bBnimCDC6EIv(`?Zk10<~BXU+n4P=utpupi5$8V&Hw$M-#Dx3TL$+$_W~)VkzC}>*fM+3PNLg-0^8+#>dpefbp0%dgMsSkQ@HjK zDq|B@<38Yh2iJN7zqtxzZgM`KT2SSQM09**|~0 zc^1?TIfJFhMPiK&)|U!zc_aBWjl->WslTz|W?i&aPmSrMcn-w%Raf3FByH=Qdgj;* z>(CrP{_Y;~zb9PH8;`!wrgjs-yV%tA{JL#vD-)n5h~@Imfz&S@$W6NQcfDplqA9uY zp>iIOhl-zE?c#|9xZ-a{>?%TD;n2eo^%ItezOD)S{7XgDy+#+V|7#{n5i6|80w;+? zv7>uVUeSY+2)_9xCwz(c*sBE7QB+q60a-8dL+%yTOvC!Uxwsiz(p08PjW(tsMYS%SYr*Oj`(Tq{=l zqTCM4mw>2cN8%Ph3y_R&X#6+^&~lQH+6T8WJ{@7W=cK67fM*bX?4#PQnZNCZ(eB^e z(xE_FGNJM!jc62{e||%Z_W7?@|2F?{Tn+8>_4PU|LyE1q%&6Ov>Src(AjGlepTocp zSn$e8?+1^dwTlTJ_QYoii$x0_;V3JT`MtYsTJxVeYj_Gs_vWtUAeD3BBf@uIClp4g zti=mCvIGXRQ&=WDidfWcarbbBXQz7y*uK1L8|qpvYN5g)M$?%j#KlKAoRV1%(>+f) zaK&|+vdFgA=N9awbUW{Ufg{6x)$B-AG>LvL^?yBg0YcKYs~9p4u?`1?VpD=b@@{$v;YJmX*}Uc)VLQ$BO2_dmW3B8tR*~{UcnzbV%!WU@SwXMjiGgSg5zS3rZ@- z(erL56Ajoq!x@GyS)Z98RRr;p3N!8$*sdSIrU*gx!ma?R%Ju{x+Lw^20D z)<^5VS=`qbPEd=q_?b+6{|xwUWKSnI)id_A&Y5W=^C9$ z*3^bfUe^w6^8s|amsqr)Lnu@}9J3MTkqxvZji8?!vExZf)6^^vcp>u~z^dmzOZrkg z6jaJY&JTT>P=p?@si{Fc$&ezsy@VXo{0`FNfzLRbb=1U{%p<6H9WEJhnt6o8(QZ^! zLinDF!kUi*ff$=iDdE~7CZu9jiJ$VRY^-=0a zaDz7aKrKmYt*RH&`EP!wD;%`|NpF?_*B@@4RuW6~sRcI+>bMjHU$40PTPjB^6ztud zwf{TyJz>MlRxfJQGe4HX634hcY8aov>Cjuc9c$m6Y_LQM z_t&Mb-dgl6%-2o-ZcV9az%Bc8Zs>M)X)tG3m%_={5|_U6K8wH14|cx<#zsDF+R0pG zVqXa8Y1bM7S=cKX`DUEoGoT&++SELvbhp?=)Xvu(t+v7Im3I_O7kk^R3TvVW8 zCFRSTp>6G>608FA*6ngcm}ZWRK9LJQ|9b$+{{0X0lR?1-iFG z3MjG_#_7EUh>U`NwO>Uhn*Khup*9wPTxCbQAXUxX6weSca}&Xe@KX5k&+Wn<^mrBd z2ca~iG=k`hj@Pk^f~G$Jlh@P~5tw;`d7kC%b2oG#%pYRC_Q#-h5(^%XB2to5I5i81 z7ANLkF770#`T+fF4PXqQ`@j2)a3q%jAo)%)_MUySG)#oHhV@>He)`$cn{NVox4mp6 z)3bWiB^P(<8ccFd?rN-YUe&r^olXKeuPppT`qaNdiot(^0dYyQ1HenVjCkM-lp}0LS;{Nq^i3*melYUs0aEA zgfmCcgzdKd-FH_*Ht7{<#(WdXD9=cA*8|n*ma9FM@37q}r*|BXssAflcvgY0V{n!k z&FYhwwmrVruga`-(x27L;4nBgHyk&t`=z0n@ZuqF?CIjCd*VMXkC_K%5SJMqi#$n) zy6_dS<9eC_US|&b%MrN7ehnA>a$JtI%22@FAsR)P8$6<(cDdI`vg}@9|7W*VAjRNW zN9Ee6Y25$x-SG=zj@4np=L8kw;AF3{zU5OI(hm|RFM}VPNw;2)sc>ji|T@*Fitt`Uy*Kv85c0jB!#&@+IxhkxM_%vj4cK zbGZLQ>uV_gch4c?@yYi$ct(<;r|otI9ob=m?Ld)oxvw4f=J|5bLcsFc#yXN4wg#6| zI81&ld#D!ABy@;c#iCh_*WgTZvE(slu!0qvDifxfRmY7j|} z9`YsIk9mf^Mr0>nab`+{cUK2XcpO+)2&-r}QDVDEa=z z$9^X{KoU{3D|zXT(11%MU*@irs`YB~SCD1Dl(VIQk~|F4LJGHNHv#g;O#(`EO5+gC zw8XesJXl2J900In*Z2;56EPEJxR7&E!P5dhWfo((r(I{W%Qvrww}d`M@931hsCN6~_zpKC{@_n@zq%Vl zS6=g7KiPY1I8ZYAOvK3J+rpms<EE))sJP(E_H}4cJBoLYSKR$VeCD!r z3h$rSp2_&@{)alun-EdF_RmMhpQn6KL4~$DIX%OGaD=DTd+@n^SA^<R&F_&-8s#D^G?+b`q=fr zjOUbNY~#F4%@0SpgnKnI0)1}w&i73PDx2BA5<7SM8{Wu>N}r=dgT#9Ay#|fu5ZvT( z*d@(}M(5}w_qn^z;>4fXw23zr!@5I5``mA)a|t-6NZdB;u?+i^uvofM9!(~$VRQCW zcsMf-ZK~ta0X+_d4i>^rV1ETF@kmx2JYbE3DBciip|1svc}Ia$MGkK_?Xr(Ez&&~K z@`k#Tz~s8*J6;tnuFRj{RuPLu`%%tjupeFm1e=J0NRAUL6!RKDUEP7dRoNnbSo6cU z`QvJl6P_s~Qej!wYKEt@Rew0X6Mp}YaNQ+3cy9X5Xw)hL>Dh#?78EO8Pf6m@4+{rZ z2Xiw#u^Jz`g{0!I+A+S-v-}np-;uF|e6}!U15S<{eWL>>9rqt&+kX{sYsc-X{_k!^kIKlnxZl{A!KHy@rikvqell$R|D2C(I+DG$V z*t}}XW+Ljl=wab?UCW->1ddl|lc_FpAbchEt^$oDv4R_qd<8m7hqa?4Dob&TKV5?K z+P<3XU-P@Fjh~1(1%7wQRooTFefj)5%KvlOFu)}m;;V=drYZ8+k zK#`u>&AV(leNrG?MTs!Em-Nmp6Yet@Q3r~ea*dimJP3$U{uf*7IMro7kqZ$=a3Zo) zv-_>E|LEm$N=&}W5BpoLI7FE~9*#$dz2fq`YE4MKi$h(xgjFVb*h!uP#hFZ5{_nDr z#ffGB=(2s_*So;2w-)_@svl|?a(_IgC_E(Kwsco_WSdWIlW`ENsq*6166WaD?eCuM zD8uC#aBs6Fpf7{*I(6kZVwGEjdVDU!_h90egU&g6{v8_}(*)4p+(Bv=ulu8ntY2LJ zO7GA>F5_<*fvD^|$xk@t>ZR(atPL`fb6qk&WnQWB=`;(%TKYJFjigL-C-!S53wws9 zf`)!dGOGtZ>H7>Fn-tpBqdo~*F&u5!A&V6wW(G%{p&jlp3!fLSV8U)AUj&L1Z*apj zC0!0%aB0@m;lm4Re;52WM+BR%JJ&et7p+R2J-21p+w+<=|6E#lGr#q-OmtnAyA=&} zMZ(TP*$`hsU_`Jj`&x{Qy3MAwSLHqD9BR$xgk3(JP6SOtz3VU2-k%HBguGYVi|KKl@~< z{$F`aia%Q5oV!=e1LdLjFPPWJ8tU3B{)pnSdD?Z<73#4p&%qey0z=4NiLHNbjeDbn zn7Zky-fx#7&95$XBstONFra;L46z#l@>y#^WdHTpr?8W+PnWn>=&Y{=u%DfUzW6Qp zbSK4<;MxfATa{U81`fEV)rEmghU+L69hO6QJ7!QJD3Q57R63f{08>gVOM?1%`{-N- zWhQ@xFiXAZ@RAnquP+nitZq5cA$s)C;L;;gPH;+0k1dw%t9kGLO>J@Umum?yI>$mx z`b0^Nwos8}?U@Q(y%hh(37@yYYi2&&po)`ua8KmRuv7DTDt&+RKRYIMwgqY%^0FCn zHoYBmbShHL7bhPR-N}Uu*j0-@CSplT!%g%Se}q1&u?Ph^{1?8;B)0`Tz`BQsF1ihbTQ^1i!c2l>l?} za}P%@7%nT{)Tbn!br6!jT&u)$R+4S*au=YkBSZ$^(~i=-H~?sjO`X_*v+d7W;rnkz z=u_GEx&yZz(g+m(XJ;SftU8lhRQ%88<+jL)ir{|*aZBY5?1!V?zBd%-&7Ntjb{fu} zm%9{?cI{_PDI1~@hNx3*m33Q%aw#N$pJ)0fM-t%KG3h!OW(Zd?*n{K)?&F)w{YOw8FSVik3&Mdva0+3(K12g%p;&}Vjr#pT7ZaJB;J zAMQTg#XE9mJ^MG3?RC91i!}%5fa?0P5FK6XK8rABzm*5-SDuZJq|KS4?bWx2GmPe_ zJJ>AcKNgTgaybk>8d`3zHno{;Y9^*p*fW}nITS^fhqphoyL6`TlR-N6AA>BI5y0jZ z%hEcLYgx+&Lq8fkd(Qupn@YSa%;oD!fB~61TX$J%4>M2P6x(}h6Q&SfEQj-X75O;K zhX(>Oz}8qyV!|AAi=FzzO_4Q`*e?n6U96{x*45PPi%!=vD`)K_@SG12216<mS-^L4Di=@h43e1L8UB zWDe~Oq1eMt-|trrli6#-KuZ`kfd{lM1q$qoAQt=p>-HF+s>?_!30P#T)Z=F)F++NB zHw?VrrW}X!%2pi0U?0WyDoOzIWI&&NFM@pzJHecb)dF}^0b;h7-30Ce4iScAsiTCRMM9-`R68IH#@uMD2vQ5h z9CsvB<12{f*uJYilz8)fVA?Q|0n@}p7TVHJ^%JMOapYPu8EA5B+k_i*J~zpEgi|Ir z>X4Dt>U1Ymzlo%UPXA%AJj44>qBn?+I6)5T>8Yb+25NigZ(bkKW)dw0)|+h-M&I4H zgSb65aLBdF8)S%+w28(-s)q=s{8c`WMlfcdoX!~lYFJJubKL(uzo0{jaW+Q;QJV*w zJ4F%VC*|Us-!E|X%;o!}f5MivTEaAq1BdcUk!e>beoZ*O82Nu>y=7F?Z`d_TcS?!G z5K;nCN(l@|jEIy-Nh&JREj>diDMJd<(ujnD(#%kj0us_Nbi>fY(U1ap z=;y24RR_FpbAKTe&xd_A+PxBpq%6?bGL9wmewN9<{+DZi6Vede77RQ4$kh;(16~N* zhZy8^o!+2xW9V|XQF9kR&UEkULA5mn`-s(Ggg&WK>e$4S?C4P{zT+`|`U&qRg|KV9 zy77D%XN4?@`}af4&syCX^CnK|CR>0`qsXgt&F2*MX>Wh_q|JuFeIl**+>%~KqnSE? zNerpwR8(bRtB z>>k_QlmOX|JE=_-)-1?ExRJtEjJ>73$;@MQXi}zRhq6}NUOaTE=rk^+Txa~>gT1*> zMi6FC2JgJRscrinKlvD<5_P&NCSF#ZBLe0?#~P{pd1bM)k~9~AALc+qSF>uyVJHE{ zz#5Ak2WA3W&$^Z-A^79%9IcbB>vPwc?bcG780ahofev@|V=!U=SAWvLKT-(XMf>^% zv#i#5H$)Yi$5&F&*DDd`${4Mw6o4xHyoM&TWdmysU`aI~a*vJ_UZ!!YvJJ&1X45O~ z%EWHas`d1;GWg`HPoIJnWjF3qw7#$4^$wrrcZwnbzw2o-rNhb%CDUQuX~pTV-fgs- z5YVE!0glD9FZ^AXXJR)k&@GjQzVltI^hu}6vebG;l6*TLv7_5KIrFi+E&}vghh)1Z zJmZi1#Mf9DJZS*M6m)Bh93Q;7ug!rU`~5>D{=B>WD>8SN1W)0xQbu4!iZyG*#{r9w z#L44y#X$X@m2NCOw&D-rcB*%JSeEcJ-<{}dm@*d7(8?6GK7C=ly&@&RC`D0+c%qv_vxD~(IvfN|Q#&Br81vF?$(g*Flj=f0t!O(9Y zQn%k&XIhGH4?CX_vO}Vl;m`-f*=k<&7(&2mE9Ae6W-NwcAA)4oSY}mX_b-dTHW=M& z5l4L^UuMK0jHl$cn?mG5ErE$u!1KQB> z#@iBm_@qNoLAPT{Q2{cJwCKqTvVn0t(=l`ViUQ?TL;IB&Fs}jjs_sYDid_gI;Iuzx z5H}Kdsa-$=sq5v6<8UHujlgBZXd*BXu#ptAAPV{OU6n;?)>iuFr9}K6Vp}sL;e5a@J zmT1EH&5~t3*=jZC_jy!{V+#w<>Sz12#17XryUq;r5PHE!cRO3S(VIxISIzdC*z&@a z-=CtjY5{Ub8uLWsh@MV_uWk|I*@}J}2t$!j9R>xjiI+F?I}LYh9GZ5PCS^ILHg-5n zln@8HOx`Rf&Z^0bk?*zBZTW_@sL2?q{t!C+k5h|=3F0AzJCLmPz2`)x(!cr~`h4RP z5eRD%9>ccBAuP1!C6H$}JB2a+j|oQ9VW3^WGzC8LY1uim!`D)$X#DiXO(byPJ@6t9 zlb-#Sd*&JiQ2UuoNF8Owl76sDU%TE2W9|GPCy#(2|J>bcLw?~N;$^kwF0fgLB>APh zLjjfpNqjZYV) z0#F%OjaLCz`QV9;$&Nob008}a4YoZ7LuJ3cxq94&qRcy9Yv=||hetj%ShX{*150@U z6CYi?U+9dH4Jo@uIBY5dn`S=8l8U)kQ2w2B%5B`AdZ15;MZ`rd2$GSJolpox2Ys+G zS!Q&-N~QU*(LQ}vnIGP^Y0_U;!msGu^Eq&0iu!>6PKS@JGgan-a!p*LO}q2tQ5^hj zKXM0pk{3)dYccfV9rdq)07VG~lix@YS&bees~9R%#MPXx+W`%Po0=-2{U*Qi>(Iv! zuRQpnmY*)|)ox_)`kCu9&Hl+9+7x$twMGJdS zubtsD;r(&4^Kk6sw$qIC^>-J5raQ2>BSLveKQum$WDlOg(GxSbnrP_9ryU>kN~-GD zt7^)bK!3?@8vS_HxBmy<5RL)39HD(9@;;f;8$meeQp$c_$XbI^o zZWlv(RsC{)o@ebh)`v`f!DZ-e3)B8Q$;cngyLDG|)*p^bdSRu$O@2Q6rBi!A5y^v? zp^0!=%YVf?nMYlMob>v*|Hr#gr2sPW{j0?8n9E(e^TgDeh?Aamr>D*};z+8&-KUN4 z_@~PfD$IFW7Ktt$%XG|&VHfu!BW-05i^p^96#W>V-gUJ4!0fdAaWE+E+0FX4sWv%A zsWXje{hyEW&nBlG<%VWl%U9ee@snGS=-|hvd{Gz7y7n``(X{akW`#kO{lXU-*VU{% zc`yIgt*BcOtg2P>1Z(?)CzLn))_`ZsOv51+XV9pXs(x0*5g6?Z%o`U=oEbJ2Cv;|D zkCRlj4Jp&kGlf8@_Y#8c$n)=(gV{fKBwcj<(W7d=eZhIG{80VI8CvKZ)B%j+HDS_u zntF5do6_OOr=o*rW4PNVxdE0Eeg~Ub7v%yH z=8g|HZ|r3~i~Ld8QNVKh3*IJ8Lsf3MGg4A zXi;K@6*-x4*M=|cd>X#`r{|kNAZ+w9S>GJ%w zq+$*>%?#Wjg5MoLK`Bw4|5kvHrn&v6M9!(d-D9`~IP=&A;nS?L!!X84e?Bh4t>Nfp^hbV~bHbCJb zY0bPD|9+oH{KuTGTp8dEebi+3zswl;cJT6}-dq(`0Z!%uw$;u_n~08c!>8{;KbLzB z+2NaXRdo2ld!^_^;w1cj7E+!lVPe=aCZgZfR^%{TFwB@uDWq~9dgUZ|(jU?$2u*2 zH+yzRSKg8S3&qoeA1Skj&W|~kMV?`9Uc9KVQDc5L|9Aa5Pfd=Ja*x}2_Lrb6Q_gJ- z>bV6N!}QA_cmw|?nkGtY!?_{uPk$q{o<8O3ON7kAia z?IFK^n|`Hb?Sn_GebkDGd5T@?25E6P^~!gK)9Twk%+55UDlhXic$cw+5o$h8&>UWI zdKNNAH-0BUod8|nJy|5?6pBcsL!eF2V$-3ej z*LZFAGKl0zIP!laU>3rcM1vUoNx${v7wBWg>+|hBCU|{+DLwjWF&eOsz8!(rF?mQGhCXH|$s>VOOzM72n@M z6k}&436k3?5aQs~rYb(xQ~?3Wmf>bz_-up(j^y0OS5S@fjRr&#Ufg3u0T$JVF>YAs zl?0&&9%7FNz0%FVtP;9`)!4!d$Jx)txSw>yhzJ9B6>Ao(WA(iJiqjZi>bNu3#kMmP z_R1B}^k+}}Z2E=Ms6d%p+7J8hqwH3nyDwyH3ED)(i)#q-?Ot10?D2Q({<*4LMZ}uj z>7_8HzJgDN?}bKt$H2&I719*DPXsY%J)o^O|}Ici2;J%0~W- zMdK}4i_C-PE0TV^*7_}{_i00YNW=H$?cin3LDH-iu;!~C<-`7i&BBtre(f;~i?YFu z&k>G`UQQYPLCBjx?yffT)T|zk*z*=`RijI$M1j#4k@RFTq<#AOck~c7N4T;B4(Q## z?2@N^v*P1o-oo|z^U|Gw6Y8@m4EO5oix*Gm*ruEZBI~({6dELsAc*T>-ZFs)iW4KB zXkdpl7nI6&VqqmcObMhn0#vH_mo$`*KAe8B{_|P>kIP-|T97_ZkS2F5q}Hb+H`+M( zuC4NmT!}1YE4e=xuNBry#oJcjg(AObKlqaHN+}Y9ltj(9-{LP%axX~PKA2M+^2kl) zmAUC;69ar|R8_pv6BNW0xt7z*u{={nwb*#b(#7`P{2I{iZ@(Hr$XtbpA_&MGr@2;y zS9;?`+$H@fkH6CUz8-iP z8pwZj5lC!dfM2lGE4av1NT96MrBFE_y#uz8Jv@>16Liy|RAu5oL}EcW+8*$_P-$NX z6e^t>>{TFdbP8kGG`W3LWfXVP? zo;g3@TO{*?lqnpSx2{b#l$P3nSuP<8+jQ7-MrTe3t2~FWrNSd$32ZnsECR<*Ou3s5 z?$mTwyJUU|Ih_IAhq*4lz@HJozX`9;^kIY!IV|NJE41IHKHeEiOQA-gt6+b3txYSn zk6NzlQ{=1Q(Ut8G05#nwaXX+r|5hu-o_5jgGaifgEyJ(w4gRZK5#*PBxFa^aaK7L; zOiJ<5M779<_0@V8)rGJk?IRfLsrL46mY^Y^%&wQ^#%RGU zA=#5<@rU2#Tny%AYK>C~5MtDigVU5qzuaM-MSbaqh;I+gRWc*C7n}rAPOjF!xUH(t zV!c)7ADlcp3%eX=s_KV5@+AGud_dXuxMj#9K^*6MlZI}J(VF935L1D|AD{6k@!Sd( zrw3DJiX&C@OXs(KfF^QFZO>e-22K@Qyx0oG*Z=R6db^a6LU@k_{)hgFT>MrF^x^d} z^>chcYfhTsKu_uNzRN9LB)IMnmcPLh(p& ze7VNaaLOgKN^S=(X9}7^aN$yE9lXbpLyR8Q$0!*PzGVfbH#+B1Jv%Wzv#m|nkv$X@ z2Oiq*GlhRegb_onaDT6WIJkobGAj{yvQh`?W`eB5%COub>0}1r!s?Q6N1sz?kLUOQ zl;AB#n!uZ$XX^xD=rQ^7UI1rMf!}%f4@Ia_35AzQv_9;WAuG2rYu78Cev141gCRf4 zC4Uqo?PM2GDXkCYB#AF;xSmk_%tj10>w0uliHp8H3b6UR{Od8lQe_wW{p@FqqH&H- z4UzX867{DYqjFlcC`!B_$ElcD(q9c{;~taX*0GM`@G-)b`u2nEcF3qoSM}5m59Ez^ zb;t#RxSPx`ZPA>(! z`oI&<%dth#;?Qah#c!greG=ePNoqL=cjTAk!^C*XtY;1r)WK4&x=8IKDJzmUG>7^j zOZ5rwZ;=t?u9>E9K5Sp?R9C~mdgo^4CNf)=LJf!d0*jtt$pSIXU1BWjWp-!HZ@2Vk z5I<^ft%fc}MZ6tbd2LR4<#MHpQp~!Umi&N9ROcj8`#33}%TBMxn*yxGQEBt#or~6I ztBuxfOQ|RcA z7z<|&d5#x_ymQG(psgB`72jEyo-fUg&zf1@o^jNfcwtXxHZc(LG{Q_omn&PPZF*(> z1<_F1Itkr~@L;F;M$p`}h~y{h%nnfLxTp(1TJ=Qs!LusU*M@0!x3McVo#o3iesPG{+Z%p!@}n%NaTLscgE z5jLSL3iLd6!P=K`q0R{7?wcpn*vxa6#~G)@g)U9_eFoQ<``!DE3Ge(Cf?_c+pRO{_ z`98ZpXL(VXmQ?2BKEhHTW5BrRF1D>E!r+~9 zjF)L)vwU6czorC4wauRW#l1OCy^I=Ct^fmO8lV6tskvQwt>p|^|Ak=)xpGBLF^lYM zk0CAA+D*4AXzr~AYY2l+Hs2@SLayNLLGJ;PW_n+ z<(EH=VBQPe{Bbwt!uj5zjyPuTfAA9Z|Ea$e|tHEwg`1`gR_kzd&|kDnlje;h(Ykjzf0!QRpX)JM|6$TuXML ziV)G~$+ZHNS$R*-Yk-00r1;-f6S zJ9LYxklENaC1r!ZgbO8w)X9PLt@2!Ze?0nZrVs-MZJVPots9z^B&gPdPcrwv2G(9# zcHo@ft;4(rjqN5Nfz!ko?IQ4E%~ziD z(gkFpdu3PxxZ9L{M{#WPBl+a)_XV1Iwmnt1xlsX8pf*ZwhIQGflgE@)jcHl)8D|&D zhvEh66m)vO?`iE(uN+>qJ6y+AQ59{s_Z&yDY0h%q_kG(pjJcND)2zf8OL9N*33--a z0x_^}`mstulgw&f|t={+cpv%@wBSMNwUaxhS1>d0~ig9W>t%19id;BO}SC;W)go-CykUA=N zI?9%+%)VTv#3RANHu|gfX&;$s!R~?gVG_3ozrg8YgC2j2CUa<0)sH`hXm|>~o)G>U^xyR+I%@yta(7=8hJ%_3v{w*PdNfo6lpbJSXNsW|l3A2yAnk>*MG;oC_&iX&a)5+}GEMc^eN?xLYs zJg(N4-SGpm=dHwZ>T**lmNA&!$xZJC&)?E%ojZz~-+%=x}@Z8~I!=e3% zam%3+@@3^p`)W7$;tU;IAmu{^F|*zO!&FCxj9hyNxy?`dCUyU49P9G|2S*AD8}$cp zh7EqRw!{SYg!jidj8lg4Z?JryroJ*~mF%40=I56pxjJvYj8HL?W!kiu{;on|d=oT! zvr4YPwY0PO#Dr1Y&po;RgJjHM!2VNMO!W;mW;zPvpAmjT=?2%$9jc;-=03^%vR#gr zz-dXE3F^g!4lPvbM&kb)0jJR>t8%zTC(+VkV8NF;Xm~PXI^2j^i3}42LWPPhj25mqKJz*yz%tg z1aBPu48fbgc0|Az;OYi*Kj{lNHWlBQU;T&In~E=IoiYZU{^hT~Q3G;{;VM~vle2xRQoCTO*q&ddUDIHbDZ(@~OVh$*FrU&^ z?(Ob2f3%@;5fYGHpAZ*>u+}&dX#K-lASkm*sh}!M0I?SN(}pF_&>)nyH7pNJ-xu7W z4R2Ht%c3i$`h4R(#l3=u@oRM5B40p&)jCWw&PuaGr4|E}*Z7~MDTkiye^Rep+aWJsyEg;9S9$$4{ool#J_8$m6y z{Z@)tIP*4MJ}9q^{41hhJ^l;S1}m1IdB%NFjpjP<9U2}BC$x+eVz84w9C-T_URjv| zi`b8NA!_Ux$`o?7n+B;S;Kf!#he0C`E{t>g!5dyp2gM-(L>+rP9l7uW`n>DL7=tUvcS% zV9TJEHJntibF>`W=akhRrSkrm^Gn>vcR2bs4%jIz_xca8}2_4C~c8xgqvvJM8_4LbYX*yL++M+|76Ma7M+ZPA- z%_)s3_KPbKl{#D;v~^sXfa_-oGjKOe3BPFAf~_Y_IB(0Nzw%w1E)P+l<0R5e&kyE~ z|9$QCBD<@?aYnc_u^%Rstz7i7k%Wei{h zwGp#4H^jzPz~Dpdsx&|a$c{C5MZEcrOfhs3T;AI_J448+C6-J5+P3B!z6MPmzCXq6 zT@JRPzEW&izz6QQL$}Yio&UC6iDbfy}n1eiQUgR*%u|%_h<3 zQdb>wyuUPX3rSh^w@ zHsF;ynqBO6pyijM>=R4sT1!ovy$;>*|6Vq^m_^blWLfKUvtzRv)`K8ii;di)iH4pQ}dW+ zZLfv@jgUM2v!+$Ai{+>LV7~T%H~DS!@njU)$=RN!JqNtO(SV)oYw}8rl$EqQ-WvH* z*7f*iwn$+kkiT&=lPU(^@ui;S2y|Nn~pS=2m1_t!|NzR+9e zeBtkv&>-P>*2{3)7A39=mih;O2UA@f(+sevP7n*MCW4=*3N#n1Cn@~r?R#X16whm7 z9!cDQ*JQ;aMauYF+U)In8W>%ptt{I;;f!_!|6NRg<6sSxokm6wZP4mFl^#~f^P_fS ztl6iD8moDJRSc!5;h0O0=Yu^c4q%?7Qk(!he_|z&=Q$z*6I7?Y~R~J*Q5l^DH0AQ zQ%$8<#x4D(5+fWFU*>=N|7a}KBdgZja|3~zJpT|aF;@9#28%@`!3PfgPf73z32JrxPQEv!rz|4q7% zPmp;P@Uea2IvqHW4b73pA>Dw%`1{)i+XSEW%>%zoGyuhe?-W#V>=dk`i$~k=B0<)!WSyJ;6iHA)S z)y>UgBn`8rT#=#k{HzFv{?>n%pUGGs>1T4#E8fKi=-9r8z*|*FpniV@t_|(Q{z&{W zsA{Acus2lorKEN7j1Bd+9*Zybx&itom<09P#0nTYM?)>^!ieG0t>SNqC6)-b=>_RVjh)?=m# z04Zjcx8IAi>W|jZ$-3&4_GW$-Cj5Or^J#A+2J}5Y?{78$8mlt<1Ol3GxmWA1(SMZ{ z05~5){Yk@=kkqf~4TNZ_RfT+_P|-#1(p&V6^jg^qmsz@w%zD(p57}SKoPa3M83A1@ zn!G?Vhw}RsaPwX_(G7u*BKGsZ%6tJF?Qt7(-RTcU`H5PIX# zWBHS=aH1Dbawl6btWd-&(z}qLErYB2wypPHl}L*HzmP%ce;`BfNbLWRdY$fs3YpoZ z9QlUSQvH_^dpUgrH=`hw^mx^v`4OExc&S8=#;Rnhevh({o%967KcW3KEuP(6qnPlb zlV%YE2|mEs51N&}q&#lAgC%1>rAj~*12Ur|6j9|8FzFntr zg=&cfnm=7V&P^jv^?LkOyBIbQxolCl61vgwXSwd`dB@n&)f_4WJMD8dV_ypV0*1sHDaQ)HNuvmInb}+ z{q=LOPe{wkv{uHT%H^_J;(B7V7ESemz-T^d)zqoO=G!^$9P&?9!E^|yc~D8SHBZn zEKIuDl%1lBZ78lk>P~g-JV~;kMPkIVC9~D)^&9tnOEa+1N?n~;d(E+FD5CCFWHTR% z>4Ithvp1tF^ZXb4a?c4Uo5pZiygE`mP^g`{y%bQN5StjCtNZ0)C{zU2`mBSZ8py>U zk27QTqWNZkX}M8fCmKPU%&$iCtqQa$P9BAu-g}OyIFG&1ZiI2FRpua$O|N#^9tDbt z)I>H(JL`1$Hi^5Q^Wqv9@=T$WGQvxJUG0X1kbuk&{1+A%jUfuM|M7|cZ_fc63t|0_ zB_8V}@(2XK`{fya2h{x|wJnsS*EOjX#O5M@JAXef_InEOSYt;h1ymRKYe^ZE5&E4T zkmt5o5UmwIi&+XsC>+79DODHOpjv}f56nEN!iMvGDk6uEKG;z5x1_I0z#D>NN7Xh* zS$~js9(`*`gAI{~-*@Dq?*yS5*_y`vY?v;TJ^BMBd$aPAsv{Vcj<+IprLc^SybBOM zD=`Ov^8Uu+9c0B4&{q}q35vBUy?H(Oe$3s$4=*-0){bKaU|B9A_pn3`lvWqdiRb={|)k`T*(k;U}**E!WH+m3_NlDV0B3l zMFtdgOBf#|G3R`7Iz)WtKPjIF>SxjY`X&ObCIo-XBNR`6(0PC#Vy3fSzl?8 zHG&D%t;v7unerOf=Cy_z+huRJ=Toc!$}wx3WIblgJ1Q}xMWrY%x3knCycE5HIYGVvNfA(jQr1~`DOWQ6Ecoe)a2OTz!;M|0O>fFoyXpD@GBFf|R5YLmCp@uv zQA>l*SYl-+Jz{tKyXAEY7{eKqJi}C)CvVC6R3lJIilzglD`lnIBeeMVM(10JtYOCe zD8C{>U3y}CLkbwh_MZ%K4JK}-`H#>lyq5h>?1DhAk^3Hm^tBx4%LnCM;BlusMd5Vc z+Z=6}UnjIcy>lBwks5RMF} zra!eZW3C(^2Z5}QY|u~#+sTy=3Iq?C(Y>pkgeNI+sdezLGM}z67mRSehkQKvxZmC1 zj>nbW-uu?&#sc~*z#1r)A!s)&l^YlVWNq(#J}Wk&u&39(aOcB#nQ}2==PDXl#{ZNX z@w~pI@XcDAZs@-r1o+@Eu{2a~B{7ifldn71R0&|ZX@M3E&O7WAMp)RZr@Z@kLZ=yx zYGdg-PC1>*e{-wd&C^1rY%!s=n{G&^ODyu8@GGu!605b}7?TCzkz6S(!HT(j2 z&X{HhO^kAfOCT>QMM~SNr`=o{#BU+R5K75j)bxemjw32VEi&NUUUb$z;c z6=bCz`IL+@zV%OtyPA={InriV;(z+=Rn&Iq{|8yu4dFr1HF7j>6tW=|lYb-XxFc0N zoxDI#G~YvNCHLqx6GrYTFEko+quVminTYmApPlFRbPlR?N6DPVf&yh0Q zio>m5-?1{VoeOi*g>#>ufc)OGe3c33dLkir+!F5A;-%VIqjdD!qeIReCnaVyFVVs{ zkyVdv7}JYHw3#EJZC-&{U`eRz3yB}FbJlll+;-N|g@mfJ>9av&>|N^~hk-~~7P(N! zdsqs&Ln=8wcLRz}@xrd09lK=Y9|zd4Gt^>8vR1;M5Y{fTvYB_2ucP(!?8bSvU=#^W zq`&>CwB}8DKG1St{B5NstOlC;x;>fxW)_pcf7B%*`juA|zVDga1F~@XJJ4YJHYYFry)-xNGwYwP$+@&5tCI5yLP0W)P8DhtXxbCy@roe+Z}a{<;$lcE z6DLt^^pc}#1?9};4vBNifi$MEEPApdO_J`9sCVWzgG7JE$BOmRV?Vx^X-K|N6a6;y zPO?*P)3^jCrfyfnj9M|kOpQ}n`EScnHWTPg=NrIV4 zTSiIbo+&?4N(fR_7|n!<8L*?Se%}4^j_8>Dp1sMGB%FT8UUZO=^|F?13M7a#LrVVl z>?$z*->P^lU`yy!nITY)=p58Nk(p35cLdlxz$l2Z&9P{yJl9TnQ^3p3^O;+MoC_rC zMClmX+d2U~FP@&|+-?1PovN6^`&ZcU^{YEW;Mb)Z^89ur#ya~qfN8!MVQI&(Ql$xz z_7R293@#77tYTe9r`v8lWfYh9g=?&qf6IJqEXBW-+0xC5IC%@ctsfS6TXBN)3iMUj z9a8MVKU>YppQu>E7!Msy*5n#Hoh}JRDsMXLTNYF7@l~~zz2#FIdkx;${t7##*==5v zkqJ8A+d2E|z(~<~2dyK#-Z_o4-tOF&p|!uU$cg10b0-`SdnO+;Jxk%5_bLYRW`Tg@oUGrP02PGKWzUkgb!;@;vU5KDU^FIO#@_Y$9Q zV|`s0DLNe-JY~)dyk{b*HR=MJ)iozVEwsk(LG>RrYE8>A=fM>acZNQ1Q<13Aj+AW) zu@0CfB&F$989RQ?Lf1~}9X&%x$Asz#^y3MQygnu#Q@6*+)dOl4-$#gO{Du_|1X=8u z1P4@il7;01rCAZ*7aCZ)VP;E|%RPb-?5lO4Oj6kN&n|U~zrN|M>?mX>bD*eRZM5)m~|i)-*XLR7R)0Ko*uh>#~)MQZ-d1!wOc>2`8|NER-75c%(NuQFuOPFyKq^OiVDYoa{rbuh}bPi zwD8xjzu|M)2DBFX9TVs`!+?ju$oybWag;R)angszc9sRCg0yBRq za8Je@MX!Qf=_19gq>7E)@I}BrlP`a}vOjk240wpM!8xHlnvANMDX+T<7cXDQnjBje zp5zSmtme~lV<6gct5l0QKxK;LYEzy98dVE{{H-Tp>Hg|R3~yN+w0K{2|BlKrnfNuJa?_GGF)d7Uws;w+)tte zulRl@Lk5+2ormNeDglo!&eVu$@}LJwn1V&R$nWla^KiKPC~iB7W6_qjXj-qA4bGGlK;R+BhYp00Z|{D17Ed(Q@oYZ%UAtdhnRID&Wf4rR zbtw$WCijJt+bg`}GgoMrY$O}CGkz&<(pe<|SlsqrzvZ21cKSMTrq7852>*2Xs41cA z3!Uvaqn#FM%HPSg?{R<~%DL?--pM^!y;Q{IJn zK81g(+NU6D3Kj~8lSgy+BE#)Iolg};zU;HZ7o>*q?;60RoKGo_ecm}(=Ml`Hpah2I z1okAcO3ihy`J&UgzXkHb6li2Y*n@fG2;G>UOlW z@Nc_e0j&_r&WeA?gpKwSIAykfY2`Q&DYLG5Tz|E^4ALMxsr!eiUUoS6xn36!+e#a3 zQh#-14y%D+O3W|D&P(x$gzv@RgtE2E>Up%yALGxvkMy8bmh}M;nzY0z*%${q4U53b9>(1Yg0@VZ0#@N6`)E2_w zS>Oh{lwZ@r@`7h!E7KMvVb51yP%arW^eK{)uoE zRKObpNR%%?Q|ao(>1%5XC~e^sSE8Fbp4P8jt*GdY?#}f3R_46m(z-3|QScVWmXbbvexz?=lY#p$A$Fsnp%Z zD*o1uI#sRAzX^1AzdW%wv1JUd-p~&IDRe#&$hT{mYjjOBMtUD)^ z>|G+>A*Oi+g5&CC#tYv|M#U0&*)b%||8e60&Q=L4XN1UBQ6vgqyKP>OHZrysBC_Ah z6eZ`^Y`rT1E-$qyo_vOr1U@-Zb?iyIIV5Hq3G5=D;V%VWI3sD zX*E99XJ)~_-S|8Z4VU(;bIwm}S4j)7h=)zK2+AjHHs1irWb=xCdNz2u*jZ>h&m3G}ZGK=(SZ2UjW3s|EZPcIsU@=2xNbg$bX^I~O9i z^Yph}x{v)`nZn}TRVia}w1MkQOXP?hS=bRB3u1-?nWs! zLtyl_eG|-ui{VNh`__JvMhX5B^O@vmqzwIm4-bUWswj`5KIl{JUa9R~0MB?9X^0h8 z#NmcR48QCL=B|k|kt@smV}H+uDm~Rv;|C4zjrWZG+$P%yOZ#KMAbi*1F{TFVMWfkmuUQ~`BJan&bEOg}pcv$Iy%iSwnQsc+wBATXw;nURTP#@hD zOsD0GtEK+Aj#4A@(E8D+wxYd%@+&;--}=HSGquu?KOOU~XnJ3VnNk2-7y&j4S@SP! zpyV=+q0UjDyv1^<>$1(vh$24T=cFsz01evCujNz?y`#P#@_luH(wt~b#$Vs4!s(p} z(nyIRbwN7|6^rQboA;;1x;4P>TlnA_cNvj$6~c*k0+DucO#!lR1A|tMso9> zSu0n1r2k6w9A~3fk8)u=ChOxNE%{fbQKMHQrbFov7d}yjd~HQ_w4-w35AV)rqknLD zDjnl-a_`YT z_M%i*(}NsMm>-7evy*8RG~m~J>$(LeiyIwr`c;JmHf8Np{IpD~BJQWbj-1A%sK+a+FXJP;3=LJ6-wjj? zUC(ztO%YqUqrroX3VwET7`tsHc4$Y_;pntu9ZBi*!M~yPHa~zk%*PR{`%EAWEGACj z1`n8qhidv*K4f10D)7-E8d;`o%pb*t*uTB2*c=9$`1s}FPV|gQm=s2x9d@=lq(j7Zh|g|>+f19e%nvJL+2KxVWeXT!brQR=juqQ zraLK2eHM}OyADTTDgGi@e%|gg*X284qk$|jJbR}x8?4gkAZTpu0l9i4*OLTL;`0f$ zO4`LT-YVFL2j^7uTBXdo@&HBbDW5m(PWdG*DE|dCBO@53J%84;Gh_Z#qN7hd{tU3Q zJ4_zIK16+kG{)SH!@MHm2c1=W3%R zc+jSpYs5J$AA*-epM3a^Gp;cgfk{78dkEV9Mwn3+62Up#yaa~boN&NAB`h4LDj6Uo z3Z6LQ3TMo^T40}khCeY(12$gIzw{ck)gvw3JbbKtn zZkF)Afw;Yx;F85}F7^(4EQ<$8D3w)Dp*L|b9b#~lLp|Nx>z@*5_ieAA5-J8~Xnr4{ zyqNk41UG`03IDnSO1F@G^T8MBEqVMdVR2=LV21v9`UN&-D}Mk%+w1`M38o!noz)2w zgvJ+R$@}Jbj~fNts5R>kOFu>!hSZE<<>ImUCLAjOObGg5jfTwVg%%0>Jg5H~!g0T}5qjdan|chu)8I_R&&qK4>ANMx)CGKv9<7QvnXr^&$mh%a zzkq=&X7!}Y2E4Oq+UeQX{sg%Lf&#jx@9O^v={gq0OW*&hou@abiFz3SC$jFy_YZG} z^WPc$tbw!--zmOJXgmpojvd~m872KBic!I#|7`wSl>XOitR~RU{8#=P^Iw%O+tSYi zxb!DVZ%cnr)>ASsvzDdo_;0a_^#y0$-lY5^X8bLnd})Gj(K{Y+jqxCOk{Pce5GwNI z+vHMU`jJ&^hmj}>-MlFNnSU~}-b2NX+=&DCS^N20H%X~4ScMJ=PYl0H^5*R8LIBp!o_q|xM`_ZYIv#}cKw2T`=@mznfC~OeJu#gS zx>>*E)*Yp5s%XoXBZpbR`NE{#DaH-_r!F5~L`AJ*%(RL-@VN&cm?LM0@REw_IAzhR3I`{6ENLM0%f%s-56R8p|){5aWB`ODzAAzQI9+3xs=YnQP!X zI%yZ$>|oy>5lFL)N_v(sd-PzDqY7~_4*__be9LUh7FZzii1|L@7lL&wxaC-K!C8(M zY`t@OhAoa_W3p}2IV{sB;5D|W)X&CnQv~FoN(c)*LbYrc#MM733oCZ=UE7X!khF@3 z1-3e)#FuoH7AUs;l1etbtFqCCC*lmRbed(f0$yW#)+N47J12k@TG0n~S(f3K%Bo3$ zw0&MC3taO11If3D2ne0Dd&|1!mu;DBsP(9QC7_H5v_||I+ZqSh4lY<_%qlMb;JSsN z20g(N96Ba`)^c6=cOn}C)kMtPBOQVgeWnHtHYlWn$4jyy4#wC9kzafCHsu9J!L*dm z;ybN9@^8VHZQv{dJL$Q!uxdA|i=^2A&mubR0Gl>eT%D)k3H`!0g>ooyLi&MiSVlIS z@MOtQ4mT)_4lWR0WUG_{pJwYsJ`Q?}OV2>f1fq=KE!j}B{mm02{N$k|!Z#7TfZFGO zJ;GPbirpaR;WBh0=EZD3bcjE+`S+}VeV{s)Zxd`PCMbs+7HqrHSPrE86Aqh@pY7C~ zv@6(#!*%cldXDt;!;t{CM3Dmhd}Ups zpKyAZbVC0o;m~itpM6?43ciCXV1{%%XY@PJ-?!;!Egu|2pmE|ixt_B@_&T?lq{%lO z)a{0Rhpq6u)Q6&JQOXPUhy9P>;eqp9r+g=V?q~& zPTT*I|E&K}hYtIH?QHyuAWi>6|FPx&8Y-v^>81ZSfHMB~fHM9a;Mw?Ro_B0NIB?n0 z&!`YcPRo}vsv@C(1CO*RAm6{8S1z2<&-}}Xm+`b`1m3d>>|B_~$zXxy%`r&tzzLq<3hU0&n^u&MJ_(#+OKMt~X{FhK^3ZF%ghJL8* z+WJdp^cSJOO!yo#pwJ=eHA_FZ&{Jd7OZ^J2pYZPr6bd|re(FJyYsWwHY4?o&3-*~? zp?{9}d0-y6!}l-atPH1xe#BC{PC&mA`dgGF^lv~@e}v z)zJ-bc|5NQUP3`#04C_Eb;8TI$P=zT3;;q$+7wI+9J*zm);UyS1f#IAu99B$q;`mGG$n2b5{@y-<#d^FSZ%jlgB0 z8*bP2Eb&#sv*b^ZejU7{OA*@50Rzv{=Odz*371jVv*C3^cH^UpARU)G*DZfaxcd8) zpTb$6cuJ>i8?Q_o*u?3-3Cw5@3cAP&4lzeQ`*b`M3ek?cX$Tw=aezvbPZRL8-) z^-`^{?QLIj{_#&xQ}_!x@b$+5`DVjk$blCe2d=!u`*SbhC9xA-p+BGP>JJ2;3}QF` zqrvOc`+|qRud1#Ket=y;2J2!)HZUx6c0*!s*H1uh3sFv>&r&@F97hC70#6W!GAxvb zEPs2z3fqjA>8GSY^ zQ&s@p#irXK-6|sS3gHKXs`kJ;dU0quBR3n6U>Cbcn{YX4C+%NjNm(Mi#Dcg1zDs)v zXA{$xjSh=aOz0TY*;YE>MZ0wq4}iAaNJv@yW&5&WH)?%t&*JmSz_?x}{XB{b+4xMb zEs^$*vXP*Cw(U79&~*8idJqVYWWh&#IhA%Yfv~kCycnDeO2BahqfO$)A0bQpG40qU zJWDx~gdeiS>J!dJkTOJYYuW|<1Vzpm;RkF_R|!9$H@f6=*p9@375)+qj7fQLxheeQ zhK5mEBpVUy;V{5YL{ETM*na1TUxa(J;3sT{PRPH6jb{-!&U1&*sV0LoyhYK1&1Qvk zGvq3h&tt9~#jdEQ0q&+M>yWqSofzO2qByl#s;<3Sd5X8&) z+b6t$Psj|gkA)%uY#?^lNf$@V$&+pj0X;={4@(fV(zmlvst`IF(tngWZh5c+bxp#L z*&ahD?VPk5uTi$F)JJLKcD!!0DS=L*iA}lCKOybLg0(}B$VR#+?I-Pw6;z6Fx&%Ip z$h--h(tAeQ*(1j~>0@W~Z=5X|4fsiVJ&vlONxCigUj;(HY_Ms|y5-L(rAzz@mdPxz zkAN8miUq#`9792o2gcdzPf=bU5ezq=_uvIZe&wIM#igN#o`5>d>c98Gv9g3_EV2>NjMw! z4cqUV+L2;V0(dfR=%3n<{$O107U8QO6Z-j1*2Hp$I&4e&pSp_nyK}gXbDZ!7l#>oc z){)MWehiCM%NVK&~N$sCHjvn{i!qhV{CVel*bVp85fBAHETIs zAuoJ~UlNMI1?N|7xhHlUOd%FSFJW=nK-2!LwfvsZk6N{euq6Gz!Av89Z{NaQ%9HRo z<6r2&!$amr#H-=>$FgU~zeBI>k?#xrj|$WF{|@y@J{kWx;^PRY)8y~LPuj!0Fh{7+ z-w**1wQRx)CJpLsfOo&x{}VD#@l{P)`n%BYk*^BRg{H_Zq zjPlYhTHT`D!rAzjmdf~VKtFV_9(64JF~)yd+KFISA-qSw^hoDHzl7JA4G3q>NXfjx ze2>bPbV*WlrJl3?_bFG(ubk1p#1}Vf%k>Dgf}`b2Qu96w0SV^6b>g{9)sFvJQiIc$ zrfp{z&PaTp*e>bU$=4^oNxdb)W6U$O2S1*K9sjdBX7N1hXO4JLUAIVIV1>w%u1`+@ zEIs5Smv6^^3{RvK;XUYu&Y({VdL)d4OSsIp5{{xt%D4SbIH}U~h|H-O8Mm}8sgvMM z)uzYb1L>E*W2`cS<5|{`au9qy=5SFw6sbYVPl;j=tTgN|T9N_x2yGFcrabbqZ}6mi z=&%Yj)MH)xOfko010RSWN#C$Oph~WiFQo*dzft5!d(z}j6W-;k?9-kcGk67jmYqTg zn5HLv!ZTng(&rG2CA?2dJK&1%D#mzBp?WWpuE?qOG@)7MDT$wD+%4JkF+_J!oZ9)! zWazm9@qK!=4Xlu=E2Ys=%A-%Db&M~#n*ern)~pj=VBCQ-MpC*+c)}Fqdq7}sSUy)# zpv;2L(mLX4ZNv6w8j)Pet?PAoEAd(3A8Nyv@quMhR;4^deaRoA^el8qyoAS~qywHY zzNM!&Oi%uTKu89>r#;iN_2o?oJVSUD=;@Sc6W)%L;e;|J z{+9(3YV-Np?niVA0bkNL87T$e9p+z~t<$D?i+Q`g@Q9~>)Vx3P;`e?J{;I#O*6NA# zKX?95&cE8H#o;gHzzc^1G8c!xkOSW^9PmEv#jbqY#m8*c|0wvWmrtnAuuOgEhyR@I z(pvERKhGnE|4aP~msi<*B}HIjxtx{_;UJG)HxC zr{vqB6%OG|Z0oZ1EwN=!0~doNJ`A!TZ_0v*KS0B}@^hJ>6=cQ`%d5mIM0FNY1lA?{ zQL~T@^59%vWCaw5EePd_U?#4Gs1p|KMyRff_#Vh*f+Bh=Rj1T(;2v90X?GUeNCMbV z>mtao=$;@#4BMXpuIOcHmujk6tiZByv97!d;h1bD={D&b|ef^BfI%}RN3>?BR- zpCcXh;c&SQ2Nm0;HLH-QXlyftmx389_#CsLl76@_Xa{+qgP^nloIr6=2ab_*L13`S zrc2_FEZ;nw=8vdnlK4F3t+QbVXFFLEOCAb`iU=sEQ~FkLYaPzDj`MNNTgeJwVh^W$#M*JIfSBOmhLk@A7mrA{ zjOdvG@6axR4qPk)cM;JGz-_fOXaVDD-;4s=h(_zc39eg$-|#qQH*{0fU7|eH1eX3d z0&azP9N#V9CgIaE_!b-cV_<><4*R6{O-=F-n)sOrKiX{QXNW%`1>>6UBW7_Cd7%@b zH6HlHd$g1CboGpWANo7Qi|5M(;X?nCq{FpY+P`ZiBtQ1y)*1axOMd}Dd6sZ`Q8t2> z{tZcwEoucQ^wUo2J1}Fwc5rIHzexnN8u%QX@u@FG-K*de*!a@GF+`RvAoej!?-XB# zlviU5-vf>#3LlW~&{S=|?FBIr1h6x1+xGPF*QgV}$~Jb`u03L9oF}B+&{enPRT=3* zS9eH1UoppwZN*993E5Cn z%aY`0JKd5EHAh@xGCtr=3tHs+6kDN^&9$UQjKRqjn9#}!WY`t8Px=(8q`X?t(vm(w zDH7f_RrxLvPb~d>%hh3fP(Vug1!~Ozh4L8xHqOSI$NwmgucvJJ*~RkNp_~Hs(-y=4 zD*!Tz@^*YSv`21fXVZR9U!uQcaUX8a65nV1mB`?^BKs1+6ps>)>rYq`!|ny+OL7 zR$uI&KDcl}@+X*2i=?kYf0z6|BAA5B(I)B_`gIOGKBS-5Qally>69ae-w%of%UAldDfDAU7g1d5Z_;wbHxvH?{Z^rgSY+vkGCOakRGx2I z(syipjeLT~m@Rzrx6L{czRRxEulqv18-#_EIFZ6&n_;*OZ3>@v z9F_bneBVky_z&+DJofDPPos({6P^mHCJjvL*q{l_AuyAVZ_d)kSnS$z(#&Tu!j&1$ zYkgelJA(6X(Uy~ya&^Tdp+x49zU`+ztt20PWjR9Xp`wtLf>2RVbX1;vqR65>)LXIX zMGcc8fs`dF1;&Xl+b>1NZ;z3nsH3Cng!d7#f$*p-o-1Gpodl1w%F|9}HF}tE5#&>X z)1nr5f&9|`Jc_&+utHCekMOkRcLG6P$|zNW` zf^khxRlt{+@eANp>WhP?_>%`#XmOSBG&TE_yM!Vbl+l)vc?3STZMg~fk^m>QrIXxR z%IPt_p#xYplyB&NTThdg5{~`dHJrR{P{>$@<}Zw z4qh->4Md#J8U9evDg};ykFL(~vZ}bIEMMyx%fv>=U@z=;7^=;1QoTr__6|dIk zd7SQhug?VkDtMXl|F-}E@<#QG(@piJ;KAS>2{~3!Q;QUuL_FOFZnN+ovcOO9|AH(e z2&QR^4_zq5ZiT>sMSsCAM5~CI8PcW@SQZHHVOtXc$MWHb(8+bj7AcmlYdgDkoa%_`2h%yQn+Tq4_pDl(% zJVydp5~ZC5D*(?yWeU8F$k!xZj$9m&Z=3DJ65-+!S|WT5tO9Eqs3fsaH%G;!8Xg3>>6I#sC4_twB z;Mn@w-@DW{BX;2iX{~(XX?`6G7Aw*Hi>ZM>ZI$M6a9z zkB5RSJe}8+gYdZ}?M2{S)LC#uDRC*qHMcH&LR^{D>o)(qj0d<>w*8P~`{omWjOApW z@HQ%v4f18#wlxTEGU9|EEx0N4Zen?zBwYiG2$lok3#sK&LGerQw90_91+?4dBC-Eg_2J>aU09)2f`5P{XSz1CZpTFo1=K8fiGFJV z>xiahp!hi~kv~Qaw1fU{5-RmwqO4(f*e-$Hbu zJlj60A1>>(#dA<1bkuFVRl+>-wV_JFYqkZ@Piu-&Kcz~VD*X}z@9K>39qw35AYzB5 z9|c2MCyBRqP}2A5f6^mB%Qs5@QyS&-tIK>w?u?8SjfLHg{}LPcJb0gadc=E!rfpAK zdon(tDlg-o*=Q(8BvGw(2=5N_N$ZF7!$&EX{os#$w!Y-F5@2& z)rPmFUiv>K{NdYY1b{c7t3tfc9|yMS|0b{~B?4>Ima%YMd!#Qw75OP4VbA2pDXj@A z^RWE-a5xQIrze}h+OQpzmt&3=`hCeCq^!CEI%p5=L?KWRMH>BEviwZYk~ZO8`iXWz ze~%F<0vk@C&i5I%SZ&XQuHNe+tK}q7_ zN0$6OT1Ps@zx^Ino$*tYa`_@_go|amMfwE2N`B}Ve*b6mORKHIv4*N6Pde%UCa}!R zoCMaWr6c)<^?tGc?QBZ;7sh`9>PnK1d6;@p6IcZX?aSHrRZ%onh;O4HDG*OC@Eyhn~4 zuw>G9JfykBLhuB&N_i=20N{#WviaJG{7or`@$Larh};E5I{sG$_xU2h5%9CNeEAv( zS9z0>@5Pj9Zyvl(i<(j{Y$!`+Qk-;@eP=1&^D!_K0tCyM7#4r~IabYtOX7 zB}X1y;lwZLzD0kFxwu<0qeiJ;-^=K?>AOw$gPMKH1@#vnZkij-h)I6xm(Hc+4`P4# z3pwx&%mMj!!(YgOkOOBN@ZNXjdGEI_J63-k{7d!S=|y#wzDnQmzx*Th_Q7ujtsls! z-!aqbfBvqfGC`oeJyzusqdn2kb5^r!H#TjSu^1MWQ&nb3VWGmdE(`V;TL2bfmb-#1 zz*x%H2U!-REK9ctK$E0e1a`1t&j3eR;!2cLRlBkwVS92U0wJ4$nBCYMu}~+$kNEc# z80Qq|8s#4AMZF4M!J)E6zM`(kMkgo_d=@#`h@RR@m$(ee%#n^O!|VpKu00XF*>?Dd zXd>{+>Hpydg?4i!;mB?TPg%YxhxR75w6lUQ!7{Lc#oVVpTmU5>;yMo`65hkJq7O`C zuig-xtxk;i#o)qVh4cj${5s*YIDON8wiA;gP+}=Qrfj*4>%dx?kJ$npgKw~5Y7&1! zdDB2An6Vq93^v&vaF4B=KrREc_14&S*1&gZAAI4=X-fEueRbDRKikA@IXesAaefC* zuyvw+2-igs(DgLoW$+$?!31#9Y@sSqIDBSpf9}(sD)=#_#z{ZH7Kd^;7}8Y^;S<;f z;RoBPL+fHXj%}NEqtNhW1ID(-KBve=ISEA~ATL+}55EWv|KNFC_`rs1!V3I**t}0j zH^zuq1WrO{2AE|l)+8NQ`62v^rIgdY;3zs!{vc>G9ySSIHZrgWt4h$BiW-=^05&{v?D$%qnw|| z=#uh_aJVJ7YUvcPibcLbdhFG3Oa!Hrd_RbPc}wpSJ=vyx{WDL51f?X1Z?Wy`OFHF? zfC1G-OMjk!NzX>pZU7OpOSU~t1YIe&gR66e@~BS~L?*2|hWu=nxkiilp2|~_qBRNa zfqV3N7MMpgYXBL+mVR-VE|HGZ{7(dM&yKGi;~_!0Dd^479PS0-CD<*kH|E$!bJw{fUbl64D=(pw5s-)#(n^yISms|ybeBHC;%Rzq=JdG$M zunjeFV9Wkde482JD;s-kbfizwbCSP}M-lBq;g_>`QZtu;ClJfCz#KDF6)4wVO1dOp zEcu|nWWS3hR7<(i{|RY7?aGllZ>gdzMlkfUjUV=ZTx{WAM*ljL`AX=Wwck+!2w(Nm z8U50d8aU&?wyUi(XZ_!??e+Ky)8rTXY8@!_H-K_d89ERbhKhvt(A8c16YPBIskX^W zIz;UZunV=&MXdmi#Syy)Y$di5yM9e1~`iK3}gj%2f%hw_8 z6%T_HQ0T7#lYCJEn}o;6S4S1n0B=EmiSo+$F69V^emzTggVsy_E+yFV7`O5h4=st$ z@U<$62j$SB8dC+g?CuXx*TVI^{CQEn@s-&dYu>Z+}s0|L~nsy2Oc3mvM z?57cwCh;*i z(FP_M4{6e+bdQ=5#Ob$`l!s?Qj`%t~2nF!GYx&;MDeFO4gU%k|6;x|d&Mf?GfLCcR zC}XoA?I%^r_D7snNx4P78`8n+n$*X)SQ5Sv-h)>{PgBOJoy|RP$=3ubdXsugUU{Yj znt_9LV4g2U@|R7X7BF6i^RM=4IVib&<~pV72-Jf6tOO}wffyj^WlmS7NeKU?^s25C z-z2{e%<8g?BWfvFI!m;IcsW^bnuKQvF92D6EG)oD36B#~1-3Q31@spEqwZhvx9(8O#Ci)OY<>Q)~T{`p)0@ta>!~as3mmt?kdf^L5+xr^i(I z3po&SK-q6KE<5Z4r>L3q2>*Llu$;rzOM4JQ*n*RPRv%bFat~bUbr7KTfeE%I zCE_=+b50%oc4aDg#;a%Fv!cMM9+2C+> zn%I_Q!!4(ivE1W?E%jzeS0la&pC|`$Yx67RqX2EY%=pC=rfe zW%-#CkqDe429~c$UA5)Z5Y#i2hs(BgWoAPu<&rlk8!Gy%Mhiq>h_lHQ`s-{W?MBV= zK?I;C>Ds7#g#IOB1@H22511iUpY$o6wBx9)8afRwoB~<}jntPkF{uZErJ&b=acc5` zhym1~*yh$PpUP+S_n}nsmuOFy_y#tz4mg%Z%eR7V%J+c4i6}+;3yk0fxQxac=~B94 z%db<h+U+C|X z-im{SL%$toKH+J?g;N>IZNdlYqqdmNgNwkrPI^!Gg@16ZAUL(xbj-FxltJ`A-*JlY z6647S$5LkLE|FgF0`06w{2BdAd^vS+A9||9Cw19=cMbY2E9s!LZ1W8jEbze)PTCq@ zJmY{C3oaJbIO#<|k>BhY{q(Znz@_-(x zC4ZAIwg?n;Kv%-g`XA9q=%*b$OJ|pUmi$F}vqO0(_~3xJp4<6}@4qS@1(aq5FusZm zBVGi-8ng;uE&Uw0@ueTAvtrXrsR{5Br<@6A^f#;^TGo9#{-K|~7z$_rq2CHb9c+xV z;05ydKp)C_lq2*5>Cc4FZTXTWya%;O(l*ZMPYuhr0#n2~I25`785~i1Nb6C81vz=^?4F0`(G( zCzBmFc^SFHuWL{G7rrdfb_EaHq+$G$BTjgWQI(f;)GXzcDK`yXW97_&ODn3t4%C$i z@A2A561>D{l5|!~2Zvia53E2{45(CJ=#py%7BZTk%_)m0PRLu5`7-?pPqF)vnStVvoaU;C8Ee;JEaNr(E=jyq<}3}uLdTSAn{ z5Z5MQo`3m2d>_sWO?oR%T$5QM4}?NfB|a`x@JpG}upQ(mNg0$@2KwN6;`8_h)WPGl zNa72YLzF{m!cnuy3?=QYN;^$id*oGM8EKd9A;8ChbzQRa5#|6Je#+rERz&l-zQY_H z=TSU7u0H;8xukK!%zRAgJrz}vhu@(75A{pxR~|iKRi9MOAAjnd=il|M@BHq;Bh(Q7 zLJou+_zE15Z!-La90)n^RpNkm=Zl~A9*o_~#`YKWO)tJ%U5b5r^dHC6p9Sv=-jw=o z^-=Ydy7;>lZ^S>SUj3b(`a{)L>G7ue(f_Bt^N*FLtnT=8R(V-?;bp5J*H*)0RJs+C zPFhH|rrLqhvJx$m*6Lc23`ot|kYr(piA*Ban-t9?^1}5;(+!p8Qb`ys z=&jIniO^mn#KA&)p&-l43tr*n-G07jFSh+(6VmK%?w&d4InQ~{InOh5&v~9_W(aeh z++ULf-pm?!WJUMj{89c<_6UIpSV(eH-$G7W?JHQ31oTvlc+{r>2*|jz|4MMZcI-a* zc`2a(1HW^ApSFmzTi_i2_480Kq>q6usdolE(#e^c;6sA0@-D3r@Q^I6Dsg4{Vexe8 zt9VZLI`l``Quqeo)E@AsP_MG~^8kF8qCo?F<=8<&B264zZx;ZM5@;w;dX&e8eM%6$ z`@n>K2M2))Uq;wj(&9<3=O#SVBkVW|)Sc8Vuw);C^j2D30+m*&UL*k@Q13>j7H)>l z)@`N?6qxF9Y6=98`UJ?GyrAi9=naA3O+Ywjby#Vtj^u=y&p}5ceH=y-3_y#22=tp?9SP_h@`AF}A zkhg)}_Y{?Yo6s}`S2!*I3Z76@RQnkeq0T$u#25^NH zz!hLi%UhIp@%|?G7WI+GyDK6x0uwmBg?^oN`4RgI4*@em!IJVdg=p}n$c^9|Xwe4g zJ8=FUlJOH>su`n7pw``fO-l^m8(8E0G+ZQ})Z6AuyXdd>3gk_J30AK|ZwLrw#}s{4 zf2i{Um~+&3dW8-O9EXI&fjT1_gX32uD)5yq=!g9Yu*J_?(0a&gz_+Q93fhVXszX*t zC6Dz^QY`#T;<0GA$H)(asSSOugzEp=pP*F^e?+qQHc82&+h4o=<9RE6u-_*X&|>C+ z?f^ME&=Xox`4~U9;=?}L!LC(H!DYYT2#x#DGcfGY%MTa!Q@f_T1{Rd};2VNZN%b~? zk?{{dqbRp2dXEC^wt*rpR&GNg7-V6+mkI;G~rn!O6!bB^g`A)ltuq9^p^!B z47TeNX&Z#vpPZoIIcl9GZ3uL4aYJ)^u~FIf$qvI7JhYT@HQVowXM8acnMMVkN% z&W{?%=+lH4+E1(i&yk;lPdNV@dGJZ@DEt#*02MYp$rW8&?VqVq|;enn}j_RuDW+C!rjD5(vQmZV=t_LZRYnwJ-x z5yB%=1GLx47JB<{<@5}n1?plU2Suk2Ex4{9=n*Q{Fm!qrEy}M}_;`t40w3QN{@POM z&uFNS5b!1~g74=cdEdv&_u1R+N6+Q7m*5 zemlp`vyVQw8!is}=FdNJ&7rRz+PUSp-7Ao|{471N^uW*913LGYpQQ(u9(aX$ApXaj zPL6l&yDnVBTa`a`>c!!$;qUD6Gcr3NoIZcz&E2_${o&fTK213Eop8yU8^X6M!b)r@ z|75uBml`(I|9$xOYn6cB5x%)!VZo8`U6T7X){_a)2+SWKI3zG2rEdAhezqlY0dE)B z*2*6n+Ak&K4)zcnBk(R04N9bMBBi1}0fe55t=ChnDN(na@&@`Fc!=R!fJ!hAQvNlI zN}LHO`kv5txqE*|xn9mT01kMFVncatM~;z*Gp*o(8tdT)2~tD2fHVR*9zZ?--%;-6 z-+`}3Xixjd=K0~kf~~xlQhose=8ST^yh?iAjGkS}Gd#5d)P4oEdou}tM){Sj$oJvD ziu5f7*IOWJ%9UR9z!m<}4mu~kb$H5Chs9qJpth7NZAA`ANaB9Y39rZCJzClV&IoWf zTu$MB91*S|&%FvC!S0%M!FLG3Tc>X#Qwhzc+9!A$;7bB&QXX&u+HA2EodB=)@<@wX z>1xz&XG}l_*?ruHe}dJLmmx>;TEg|A=xj|bz{fV0{n)!EJLuaLB?{QLDLMhV2ilY^ z>~EIYUJQ~3*e;r7&wCg|87-QVl{Cg4dZlwh)@JLM=4?7IDo4!@@uZ?#^pK~fjF zIVsgDFp@BA0nuDrut_sZIJ9!Dy%uKCo;!hY#j;7Q2XzpL?#{fYIV=k$-{wOEt`H}T>~{MbLlzM8Z%1K)A-XaNk_$2lI_tYAEf>iX!ON;Rz84;V%r6~}!E!$yyr|5&7oC68I)c8pl(H^^$3N$p+rMc@LR!Z7>A|n*tr>jfp8bi{ zTxsNAMgV+?MIVnj*S`w9WN%cVay$tiwzaaG-bfs#v^WFD&x|4YJ$1X&Jvd>cr7Gud z!e7Nv0$-1DRv<%sV#7ZR`4-ia>o;n#1|RY4fR@%D)1>a@(|Fu(RqqC ziQ7*CEPe4GYwYl6tb|j{*;4C#m{&iwzYGb@R=oO0v&H<&*F)Z(svcggkTda?f<-i{;cqx20kj+aR4y>Ta|C!fE zs?D6wZz<{&XxLLbYC&>owE))C%;1asHsCW7e(1<@y(}^Hk?hO8-Iv09>~DBO(INY~ zJ^WnDv^qNmp9=O7yVtIMEM=nf9-Fk0bNULq?P1+Z|H1j~-~WZMe}2f`_wa5w%dQQ7 z{m6uA{a1zR$-lkjZhc?)I4v$eOAjnP@CxyOy+ZU@sx1JuuSGXnNveQZ={b%_4sSSb2oxB7$C7gNKt~#ZeKREy1{O*$)!q21gx1G?= zUmLyHWBy=ynox_^^mDI1lwM3L zNH1g%3c}azcw$5S9Zx`}q%)MW!(ig_rUY`}Br}VIY!%BZ@RnA`@b$1~030C~K$25n zGZO@aZactj0^I_B!oLpsqSMS1$3B7F6ntip6iW%0C-5APY#n@qP_R@vEAll^^18s3 z355i>9U9kT%$8M9wp0^}a@FqBY@QSZhP@)cWq1J}FNRdYABZjrvN5 zQt&BuOyKJicDBGB5_E86dSFg6v?=?Pwt7O)V=FOo86$nyuf%@z=aUk&O3!V-hj+AR ze?wcl(1(mXmCMuH)F+^~1Z*3x*5KH0=*6e?35Y=A9KnibB2BL@`hQ5vTj-Etz39D8=KWpZJ=!HD*MEqQ|QILu;u?pO@{=ZKG3yH;nf#a7h2Rz<|^#zdPUq(3Z{c>)^6q za%R{MPCG+-ZejljIHe!P@C_|`J50>D{TgXo(Dh6Su5Eg+8t(*0>*Aq*TzA*hctL&VTqwpBqM6=wyp_8U3~F zbdH)|mA0Tt{GfZ^B;YY5lxbpP=JeJQx3{27^{4z!;7=%@!8av=EWxLEFQL3*oC?Q& zwGa2qCwNlMPxzr_w5WbeuvPLJGz%6<=v04#OaOWm(t|eK-z3zPBl$1fnf7wbFv6yeXQ``=>kBo%me|5xYd zg%8+2oZN(`dClT&2i6F0F0$JXB=!!Ty3ib`=J&$+o>OLaTKKq4PML(?od0@w@|3&6 zXFKPH%MYaC@O;H?InajR2-nU(c5)0KW9$FgNs+CE?+x!_C&Zs}@BC>e=E3at@W2Vd zE+J)oq}zr+3-^Tf_>!FkFU{Y7TuCe6u!mk92u|mrcvT4R;$FiGJAv(tzs(EzQoGtZ zb`hc6#rDhdZxi0Jk=qlSRl@NhzU;A5JOi$<*8)fqm~})STU<;~P~WD*|5< zBEs(4y3i9SJJ2VglpNBA!UJ_B&hQgXt|2pkWeO}w@KTayK1@Z3&Q^8>)_8T`0Vf-k znaWV0y5)&imw+4jogDjH_zDs$+98qE~*r-4}Q=&yevFmnbi-6np z*nqyqme(9U>{jB8o?|5_v^KJggR%7qdgY%@%7SB(zk$3yup*J`0W-?Gly4Al?}C?T z5rHJ+B!vpVt3CU3`H}P{6`gc2UC`-`b?^yV)|AWsG4`!vXCgi{+Qt4=i{4MNU!M^Z z2o;ch2cA%_!nsQQoUQcIvm0{v%PPH;Lm%N^)hzJK2DnzNOK|nS=qde%J@jMN$-xT} zR|{j2<(}v%UV8{ads%#uDl=!b?pM;Qx_N2;^{& zz%zQV0p@V5)9#pu+2!ET771hIW)j(7g|w4FFX-I{81{bggY?GEmX?$d)#Cy+vdJ00pc$-pQvNb)WoMT!F7Lim2=~?=?si>8L&*=X>x{u?UD@h@K^vozP zkkAt!Tr=niiDv_z;}>ux+djdVz%hZYx7+7Hr0ga2snb)mN>!iM8_MYgwF51ezxiZV z^ZT;>Dn~Zd*8Mr7J$-s%BKeHw*4r=H0XBoK>mMAJBT<|s-xMhA1yf2YpkDiWD#`j6 z+1d67NZLmNeCx3${7(36_~J31yPwn1{$RM_XrRuK@OBdEcToPupOkifC))OI zwClKH{mPF+_*^(+e#`T9xQxgD{_ArsyUR|qFCA&a@7baG4bQgW{BX7X;Be&0JWq$K z4mb7z&hzdw=YslCeBZ^vktF@-?9h8 zp=VQWB>Tttcb|JN|6RUpmp}KAUC;lY`**LN|2_|S{pT0H9L{5J+pS0Ued#KF=g(v5 k^0V~7(gRBm{7gOY--{%^m%N{~T>t<807*qoM6N<$f;$2Er2qf` diff --git a/extensions/tablepro/metadata/.gitkeep b/extensions/tablepro/metadata/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/extensions/tablepro/package-lock.json b/extensions/tablepro/package-lock.json deleted file mode 100644 index 81e768ffb..000000000 --- a/extensions/tablepro/package-lock.json +++ /dev/null @@ -1,3568 +0,0 @@ -{ - "name": "tablepro", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tablepro", - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "@raycast/api": "^1.83.0", - "@raycast/utils": "^1.18.1" - }, - "devDependencies": { - "@raycast/eslint-config": "^1.0.11", - "@types/node": "22.13.10", - "@types/react": "19.0.10", - "eslint": "^8.57.0", - "prettier": "^3.3.3", - "typescript": "~5.6.2" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@inquirer/ansi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/external-editor": "^1.0.3", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.3.2", - "@inquirer/confirm": "^5.1.21", - "@inquirer/editor": "^4.2.23", - "@inquirer/expand": "^4.0.23", - "@inquirer/input": "^4.3.1", - "@inquirer/number": "^3.0.23", - "@inquirer/password": "^4.0.23", - "@inquirer/rawlist": "^4.1.11", - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.4.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oclif/core": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.6.tgz", - "integrity": "sha512-ySCOYnPKZE3KACT1V9It99hWG9b8E5MpagbRdWxPNRO3beMqmbr4SLUQoFtZ9XRtW++kks1ZVwZOdpnR8rpb9A==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.17.0", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.4.3", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.3", - "minimatch": "^10.2.5", - "semver": "^7.7.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "tinyglobby": "^0.2.14", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-autocomplete": { - "version": "3.2.46", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.46.tgz", - "integrity": "sha512-TFvuD6JlmqEVsEvMqunyj3cyCz/l2Q4MqCjp/XtlSLS9x3xTlam7PGlqWi4WAhxl/K8CtpYqVlMYFEnlLTHspw==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4", - "ansis": "^3.16.0", - "debug": "^4.4.1", - "ejs": "^3.1.10" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-help": { - "version": "6.2.45", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.45.tgz", - "integrity": "sha512-avWOKYmjANtyu8ipju/kopIIrSrbS/scJjiZTpBp/HKEHNm46v5riOo5LQj6MZ4bYJVQEoyHPg/2Seig5Ilkjw==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-not-found": { - "version": "3.2.81", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.81.tgz", - "integrity": "sha512-M88tLONBH36hLAbkFbmCo1hoZPSdU5l8Px1xEIlIgSmGMam+CoAzx4kGqpLbokgfpaHeP8/Jx3QJ18u9ef/2Qw==", - "license": "MIT", - "dependencies": { - "@inquirer/prompts": "^7.10.1", - "@oclif/core": "^4.10.6", - "ansis": "^3.17.0", - "fast-levenshtein": "^3.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@raycast/api": { - "version": "1.104.12", - "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.104.12.tgz", - "integrity": "sha512-DdrtoksnzLw4q60BgFr/H+PIvIObOfJrW15duTFH7QXVx/0Vxzw9fY7wo+H2gQ2JDDAh9sEMCpc5akP3UxKjTw==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4.8.4", - "@oclif/plugin-autocomplete": "^3.2.40", - "@oclif/plugin-help": "^6.2.37", - "@oclif/plugin-not-found": "^3.2.74", - "@types/node": "22.13.10", - "@types/react": "19.0.10", - "esbuild": "^0.27.3", - "react": "19.0.0" - }, - "bin": { - "ray": "bin/run.js" - }, - "engines": { - "node": ">=22.14.0" - }, - "peerDependencies": { - "@types/node": "22.13.10", - "@types/react": "19.0.10", - "react-devtools": "6.1.1" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "react-devtools": { - "optional": true - } - } - }, - "node_modules/@raycast/eslint-config": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@raycast/eslint-config/-/eslint-config-1.0.11.tgz", - "integrity": "sha512-I0Lt8bwahVGkANUBxripIxKptMBz1Ou+UXGwfqgFvKwo1gVLrnlEngxaspQJA8L5pvzQkQMwizVCSgNC3bddWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@raycast/eslint-plugin": "^1.0.11", - "@rushstack/eslint-patch": "^1.10.4", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", - "eslint-config-prettier": "^9.1.0" - }, - "peerDependencies": { - "eslint": ">=7", - "prettier": ">=2", - "typescript": ">=4" - } - }, - "node_modules/@raycast/eslint-plugin": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@raycast/eslint-plugin/-/eslint-plugin-1.0.16.tgz", - "integrity": "sha512-OyFL/W75/4hlgdUUI80Eoes0HjpVrJ8I1kB/PBH2RLjbcK22TC6IwZPXvhBZ5jF962O1TqtOuHrTjySwDaa/cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^5.62.0" - }, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/@raycast/utils": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.19.1.tgz", - "integrity": "sha512-/udUGcTZCgZZwzesmjBkqG5naQZTD/ZLHbqRwkWcF+W97vf9tr9raxKyQjKsdZ17OVllw2T3sHBQsVUdEmCm2g==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.6", - "dequal": "^2.0.3", - "object-hash": "^3.0.0", - "signal-exit": "^4.0.2", - "stream-chain": "^2.2.5", - "stream-json": "^1.8.0" - }, - "peerDependencies": { - "@raycast/api": ">=1.69.0" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", - "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/react": { - "version": "19.0.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", - "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "license": "MIT" - }, - "node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", - "license": "MIT", - "dependencies": { - "fastest-levenshtein": "^1.0.7" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", - "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/extensions/tablepro/package.json b/extensions/tablepro/package.json deleted file mode 100644 index 4c1effb8e..000000000 --- a/extensions/tablepro/package.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "$schema": "https://www.raycast.com/schemas/extension.json", - "name": "tablepro", - "title": "TablePro", - "description": "Open and search your TablePro database connections, browse schema, and run queries.", - "icon": "icon.png", - "author": "ngoquocdat", - "categories": ["Developer Tools", "Productivity"], - "keywords": [ - "database", - "sql", - "mysql", - "postgres", - "postgresql", - "mongodb", - "redis", - "clickhouse", - "tableplus", - "dbeaver" - ], - "platforms": ["macOS"], - "license": "MIT", - "version": "0.1.0", - "commands": [ - { - "name": "search-connections", - "title": "Search Connections", - "description": "Search and open saved TablePro connections.", - "mode": "view" - }, - { - "name": "open-connection", - "title": "Open Connection", - "description": "Open a connection by name.", - "mode": "no-view", - "arguments": [ - { - "name": "connection", - "placeholder": "Connection name", - "type": "text", - "required": true - } - ] - }, - { - "name": "menu-bar-connections", - "title": "TablePro Menu Bar", - "description": "Show connections in the menu bar.", - "mode": "menu-bar", - "interval": "10m" - }, - { - "name": "search-schema", - "title": "Search Schema", - "description": "Search databases and schemas across your connections.", - "mode": "view" - }, - { - "name": "search-tables", - "title": "Search Tables", - "description": "Search tables in a connection.", - "mode": "view" - }, - { - "name": "recent-tabs", - "title": "Recent Tabs", - "description": "Show recently opened tabs in TablePro.", - "mode": "view" - }, - { - "name": "run-query", - "title": "Run Query", - "description": "Run a SQL query against a connection.", - "mode": "view" - }, - { - "name": "search-history", - "title": "Search Query History", - "description": "Search the TablePro query history.", - "mode": "view" - }, - { - "name": "pair", - "title": "Pair with TablePro", - "description": "Pair this extension with TablePro to issue an API token.", - "mode": "view" - } - ], - "tools": [ - { - "name": "list-connections", - "title": "List Connections", - "description": "List all saved TablePro database connections." - }, - { - "name": "list-databases", - "title": "List Databases", - "description": "List databases on a TablePro connection." - }, - { - "name": "list-schemas", - "title": "List Schemas", - "description": "List schemas in a database on a TablePro connection." - }, - { - "name": "list-tables", - "title": "List Tables", - "description": "List tables in a database or schema." - }, - { - "name": "describe-table", - "title": "Describe Table", - "description": "Return the column list, types, and constraints for a table." - }, - { - "name": "get-table-ddl", - "title": "Get Table DDL", - "description": "Return the CREATE TABLE statement for a table." - }, - { - "name": "run-query", - "title": "Run Query", - "description": "Run a read or write SQL query. Mutating queries require user confirmation." - }, - { - "name": "explain-query", - "title": "Explain Query", - "description": "Run EXPLAIN on a query and return the plan." - }, - { - "name": "open-connection-window", - "title": "Open Connection in TablePro", - "description": "Open a TablePro connection window so the user can continue work in the GUI." - }, - { - "name": "search-history", - "title": "Search Query History", - "description": "Search the saved TablePro query history by text." - } - ], - "ai": { - "instructions": "TablePro is a native macOS database client. Use list-connections to find a connection by user description, then pass its UUID to other tools. Always describe-table before generating queries against an unknown schema. For mutating SQL (INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, MERGE) the run-query tool will require user confirmation, never bypass that. The connection's external-access setting may reject your query as read-only, surface that error to the user verbatim. Prefer open-connection-window when the user wants to inspect or edit data interactively rather than streaming rows in chat.", - "evals": [ - { - "input": "@tablepro list my connections", - "expected": [ - { - "callsTool": { - "name": "list-connections" - } - } - ], - "mocks": { - "list-connections": [ - { - "id": "3823CB84-BB87-457E-8930-6DB35E210228", - "name": "prod", - "type": "postgresql", - "host": "db.example.com", - "port": 5432 - } - ] - } - }, - { - "input": "@tablepro show me the columns of the users table on my prod connection", - "expected": [ - { - "callsTool": { - "name": "list-connections" - } - }, - { - "callsTool": { - "name": "describe-table", - "arguments": { - "connectionId": "3823CB84-BB87-457E-8930-6DB35E210228", - "table": "users" - } - } - } - ], - "mocks": { - "list-connections": [ - { - "id": "3823CB84-BB87-457E-8930-6DB35E210228", - "name": "prod", - "type": "postgresql", - "host": "db.example.com", - "port": 5432 - } - ], - "describe-table": { - "columns": [ - { "name": "id", "type": "uuid", "nullable": false, "primaryKey": true }, - { "name": "email", "type": "text", "nullable": false } - ] - } - } - }, - { - "input": "@tablepro open my prod connection in TablePro", - "expected": [ - { - "callsTool": { - "name": "list-connections" - } - }, - { - "callsTool": { - "name": "open-connection-window", - "arguments": { - "connectionId": "3823CB84-BB87-457E-8930-6DB35E210228" - } - } - } - ], - "mocks": { - "list-connections": [ - { - "id": "3823CB84-BB87-457E-8930-6DB35E210228", - "name": "prod", - "type": "postgresql", - "host": "db.example.com", - "port": 5432 - } - ], - "open-connection-window": "Opened connection prod in TablePro" - } - } - ] - }, - "preferences": [ - { - "name": "tableProAppPath", - "title": "TablePro App", - "description": "Path to the TablePro app. Used to detect installation and open the app on demand.", - "type": "appPicker", - "required": false, - "default": "/Applications/TablePro.app" - }, - { - "name": "apiToken", - "title": "API Token", - "description": "Token issued by TablePro after pairing. Run the Pair with TablePro command to fill this in.", - "type": "password", - "required": false, - "placeholder": "tp_..." - } - ], - "dependencies": { - "@raycast/api": "^1.83.0", - "@raycast/utils": "^1.18.1" - }, - "devDependencies": { - "@raycast/eslint-config": "^1.0.11", - "@types/node": "22.13.10", - "@types/react": "19.0.10", - "eslint": "^8.57.0", - "prettier": "^3.3.3", - "typescript": "~5.6.2" - }, - "scripts": { - "build": "ray build -e dist", - "dev": "ray develop", - "fix-lint": "ray lint --fix", - "lint": "ray lint", - "publish": "npx @raycast/api@latest publish" - } -} diff --git a/extensions/tablepro/src/lib/connections.ts b/extensions/tablepro/src/lib/connections.ts deleted file mode 100644 index 37b01f2a6..000000000 --- a/extensions/tablepro/src/lib/connections.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { promises as fs } from "fs"; -import { Connection } from "./types"; -import { connectionsFilePath } from "./paths"; - -interface RawConnection { - id?: string; - name?: string; - type?: string; - host?: string; - port?: number; - color?: string; - groupId?: string; - database?: string; - schema?: string; -} - -function isENOENT(error: unknown): boolean { - return ( - typeof error === "object" && - error !== null && - "code" in error && - (error as { code: string }).code === "ENOENT" - ); -} - -function normalize(raw: RawConnection): Connection | null { - if (!raw.id || !raw.name || !raw.type) { - return null; - } - return { - id: raw.id, - name: raw.name, - type: raw.type, - host: raw.host, - port: raw.port, - color: raw.color, - groupId: raw.groupId, - database: raw.database, - schema: raw.schema, - }; -} - -export async function loadConnections(): Promise { - try { - const raw = await fs.readFile(connectionsFilePath(), "utf8"); - const parsed: unknown = JSON.parse(raw); - if (!Array.isArray(parsed)) { - return []; - } - const result: Connection[] = []; - for (const item of parsed) { - const conn = normalize(item as RawConnection); - if (conn) { - result.push(conn); - } - } - return result; - } catch (error) { - if (isENOENT(error)) { - return []; - } - throw error; - } -} - -export async function findConnection( - idOrName: string, -): Promise { - const list = await loadConnections(); - const byId = list.find((c) => c.id === idOrName); - if (byId) return byId; - const lower = idOrName.toLowerCase(); - return list.find((c) => c.name.toLowerCase() === lower); -} - -export function databaseTypeLabel(type: string): string { - const known: Record = { - mysql: "MySQL", - mariadb: "MariaDB", - postgresql: "PostgreSQL", - redshift: "Redshift", - sqlite: "SQLite", - clickhouse: "ClickHouse", - redis: "Redis", - mongodb: "MongoDB", - oracle: "Oracle", - duckdb: "DuckDB", - mssql: "MS SQL", - cassandra: "Cassandra", - etcd: "etcd", - cloudflareD1: "Cloudflare D1", - dynamodb: "DynamoDB", - bigquery: "BigQuery", - libsql: "libSQL", - csv: "CSV", - json: "JSON", - }; - return known[type] ?? type; -} diff --git a/extensions/tablepro/src/lib/deeplink.ts b/extensions/tablepro/src/lib/deeplink.ts deleted file mode 100644 index f06d8cf61..000000000 --- a/extensions/tablepro/src/lib/deeplink.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { open } from "@raycast/api"; - -const SCHEME = "tablepro"; - -export async function openConnectionDeeplink( - connectionId: string, -): Promise { - await open(`${SCHEME}://connect/${connectionId}`); -} - -export async function openTableDeeplink( - connectionId: string, - tableName: string, - databaseName?: string, - schemaName?: string, -): Promise { - const encodedTable = encodeURIComponent(tableName); - let url: string; - if (databaseName && schemaName) { - url = `${SCHEME}://connect/${connectionId}/database/${encodeURIComponent(databaseName)}/schema/${encodeURIComponent(schemaName)}/table/${encodedTable}`; - } else if (databaseName) { - url = `${SCHEME}://connect/${connectionId}/database/${encodeURIComponent(databaseName)}/table/${encodedTable}`; - } else { - url = `${SCHEME}://connect/${connectionId}/table/${encodedTable}`; - } - await open(url); -} - -export async function openQueryDeeplink( - connectionId: string, - sql: string, - token?: string, -): Promise { - const params = new URLSearchParams({ sql }); - if (token) { - params.set("token", token); - } - await open( - `${SCHEME}://connect/${connectionId}/query?${params.toString()}`, - ); -} - -export async function startMCPDeeplink(): Promise { - await open(`${SCHEME}://integrations/start-mcp`); -} - -export async function pairDeeplink(params: { - client: string; - challenge: string; - redirect: string; - scopes: string[]; - connectionIds?: string[]; -}): Promise { - const search = new URLSearchParams({ - client: params.client, - challenge: params.challenge, - redirect: params.redirect, - scopes: params.scopes.join(","), - }); - if (params.connectionIds && params.connectionIds.length > 0) { - search.set("connection-ids", params.connectionIds.join(",")); - } - await open(`${SCHEME}://integrations/pair?${search.toString()}`); -} diff --git a/extensions/tablepro/src/lib/empty-state.tsx b/extensions/tablepro/src/lib/empty-state.tsx deleted file mode 100644 index c60f05f84..000000000 --- a/extensions/tablepro/src/lib/empty-state.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { - Action, - ActionPanel, - Icon, - List, - launchCommand, - LaunchType, - openExtensionPreferences, -} from "@raycast/api"; -import { ErrorScenario, describeScenario } from "./errors"; - -interface Props { - scenario: ErrorScenario; -} - -export function ScenarioEmptyView({ scenario }: Props) { - const { title, description } = describeScenario(scenario); - - switch (scenario.kind) { - case "not-installed": - return ( - - - - } - /> - ); - case "mcp-not-running": - return ( - - - - } - /> - ); - case "no-token": - return ( - - { - await launchCommand({ - name: "pair", - type: LaunchType.UserInitiated, - }); - }} - /> - - - } - /> - ); - case "token-revoked": - return ( - - { - await launchCommand({ - name: "pair", - type: LaunchType.UserInitiated, - }); - }} - /> - - } - /> - ); - case "access-denied": - return ( - - ); - case "other": - return ( - - ); - } -} diff --git a/extensions/tablepro/src/lib/errors.ts b/extensions/tablepro/src/lib/errors.ts deleted file mode 100644 index 4760d72f7..000000000 --- a/extensions/tablepro/src/lib/errors.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - ExternalAccessDeniedError, - MCPNotRunningError, - TableProNotInstalledError, - TokenMissingError, - TokenRevokedError, -} from "./types"; - -export type ErrorScenario = - | { kind: "not-installed" } - | { kind: "mcp-not-running" } - | { kind: "no-token" } - | { kind: "token-revoked" } - | { kind: "access-denied"; message: string } - | { kind: "other"; message: string }; - -export function classifyError(error: unknown): ErrorScenario { - if (error instanceof TableProNotInstalledError) { - return { kind: "not-installed" }; - } - if (error instanceof MCPNotRunningError) { - return { kind: "mcp-not-running" }; - } - if (error instanceof TokenMissingError) { - return { kind: "no-token" }; - } - if (error instanceof TokenRevokedError) { - return { kind: "token-revoked" }; - } - if (error instanceof ExternalAccessDeniedError) { - return { kind: "access-denied", message: error.message }; - } - if (error instanceof Error) { - return { kind: "other", message: error.message }; - } - return { kind: "other", message: String(error) }; -} - -export function describeScenario(scenario: ErrorScenario): { - title: string; - description: string; -} { - switch (scenario.kind) { - case "not-installed": - return { - title: "TablePro is not installed", - description: - "Install TablePro from tablepro.app to use this extension.", - }; - case "mcp-not-running": - return { - title: "TablePro is not running", - description: - "Open TablePro and try again. The local MCP server starts on demand.", - }; - case "no-token": - return { - title: "Pair with TablePro", - description: - "Run the Pair with TablePro command to issue an API token.", - }; - case "token-revoked": - return { - title: "API token was revoked", - description: - "Run Pair with TablePro again to issue a new token.", - }; - case "access-denied": - return { title: "Access denied", description: scenario.message }; - case "other": - return { title: "TablePro error", description: scenario.message }; - } -} diff --git a/extensions/tablepro/src/lib/mcp.ts b/extensions/tablepro/src/lib/mcp.ts deleted file mode 100644 index 9f44de33a..000000000 --- a/extensions/tablepro/src/lib/mcp.ts +++ /dev/null @@ -1,576 +0,0 @@ -import { promises as fs } from "fs"; -import { - ColumnInfo, - Connection, - DatabaseInfo, - MCPHandshake, - MCPNotRunningError, - QueryHistoryEntry, - QueryResult, - RecentTab, - SchemaInfo, - TableInfo, - TableProNotInstalledError, - TokenMissingError, - TokenRevokedError, - ExternalAccessDeniedError, - Preferences, -} from "./types"; -import { handshakeFilePath, tableProInstalled } from "./paths"; -import { startMCPDeeplink } from "./deeplink"; -import { getPreferenceValues } from "@raycast/api"; - -interface JsonRpcRequest { - jsonrpc: "2.0"; - id: string; - method: string; - params?: unknown; -} - -interface JsonRpcSuccess { - jsonrpc: "2.0"; - id: string; - result: T; -} - -interface JsonRpcError { - jsonrpc: "2.0"; - id: string; - error: { - code: number; - message: string; - data?: unknown; - }; -} - -type JsonRpcResponse = JsonRpcSuccess | JsonRpcError; - -interface InitializeResult { - protocolVersion: string; -} - -async function readHandshake(): Promise { - try { - const raw = await fs.readFile(handshakeFilePath(), "utf8"); - const parsed = JSON.parse(raw) as MCPHandshake; - if ( - typeof parsed.port !== "number" || - typeof parsed.token !== "string" - ) { - return null; - } - return parsed; - } catch { - return null; - } -} - -const HANDSHAKE_RETRY_DELAY_MS = 600; -const HANDSHAKE_MAX_RETRIES = 12; - -async function ensureHandshake(allowAutoStart: boolean): Promise { - if (!tableProInstalled()) { - throw new TableProNotInstalledError(); - } - let handshake = await readHandshake(); - if (handshake) return handshake; - if (!allowAutoStart) { - throw new MCPNotRunningError(); - } - await startMCPDeeplink(); - for (let attempt = 0; attempt < HANDSHAKE_MAX_RETRIES; attempt += 1) { - await new Promise((resolve) => - setTimeout(resolve, HANDSHAKE_RETRY_DELAY_MS), - ); - handshake = await readHandshake(); - if (handshake) return handshake; - } - throw new MCPNotRunningError(); -} - -function getApiToken(): string { - const prefs = getPreferenceValues(); - if (!prefs.apiToken || prefs.apiToken.trim() === "") { - throw new TokenMissingError(); - } - return prefs.apiToken.trim(); -} - -let requestCounter = 0; -function nextRequestId(): string { - requestCounter += 1; - return `tp-${Date.now()}-${requestCounter}`; -} - -interface SessionState { - sessionId: string; - initialized: boolean; -} - -let sessionState: SessionState | null = null; - -function mcpUrl(handshake: MCPHandshake): string { - return `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/mcp`; -} - -async function postJsonRpc( - method: string, - params: Record | undefined, - handshake: MCPHandshake, - token: string, - sessionId: string | null, -): Promise<{ result: T; sessionId: string | null }> { - const body: JsonRpcRequest = { - jsonrpc: "2.0", - id: nextRequestId(), - method, - params, - }; - const headers: Record = { - "Content-Type": "application/json", - Accept: "application/json", - Authorization: `Bearer ${token}`, - }; - if (sessionId) { - headers["Mcp-Session-Id"] = sessionId; - } - let response: Response; - try { - response = await fetch(mcpUrl(handshake), { - method: "POST", - headers, - body: JSON.stringify(body), - }); - } catch { - throw new MCPNotRunningError(); - } - if (response.status === 401) { - sessionState = null; - throw new TokenRevokedError(); - } - if (response.status === 403) { - const message = await safeReadError(response); - throw new ExternalAccessDeniedError(message); - } - if (response.status === 404) { - sessionState = null; - throw new Error(`TablePro MCP returned HTTP 404`); - } - if (!response.ok) { - throw new Error(`TablePro MCP returned HTTP ${response.status}`); - } - const responseSessionId = response.headers.get("mcp-session-id"); - const json = (await response.json()) as JsonRpcResponse; - if ("error" in json) { - const message = json.error.message; - if ( - message.toLowerCase().includes("read-only") || - message.toLowerCase().includes("read only") - ) { - throw new ExternalAccessDeniedError(message); - } - throw new Error(message); - } - return { result: json.result, sessionId: responseSessionId }; -} - -async function ensureSession( - handshake: MCPHandshake, - token: string, -): Promise { - if (sessionState && sessionState.initialized) { - return sessionState.sessionId; - } - const initParams = { - protocolVersion: "2025-03-26", - capabilities: {}, - clientInfo: { name: "raycast-tablepro", version: "0.1.0" }, - }; - const init = await postJsonRpc( - "initialize", - initParams, - handshake, - token, - null, - ); - if (!init.sessionId) { - throw new Error("MCP initialize did not return a session id"); - } - sessionState = { sessionId: init.sessionId, initialized: false }; - await postJsonRpc( - "notifications/initialized", - {}, - handshake, - token, - init.sessionId, - ); - sessionState.initialized = true; - return init.sessionId; -} - -async function rpc( - method: string, - params: Record = {}, -): Promise { - const handshake = await ensureHandshake(true); - const token = getApiToken(); - let sessionId: string; - try { - sessionId = await ensureSession(handshake, token); - } catch (err) { - sessionState = null; - throw err; - } - try { - const { result } = await postJsonRpc( - method, - params, - handshake, - token, - sessionId, - ); - return result; - } catch (err) { - if (err instanceof Error && /HTTP 404/.test(err.message)) { - sessionState = null; - const fresh = await ensureSession(handshake, token); - const { result } = await postJsonRpc( - method, - params, - handshake, - token, - fresh, - ); - return result; - } - throw err; - } -} - -async function safeReadError(response: Response): Promise { - try { - const text = await response.text(); - return text || `HTTP ${response.status}`; - } catch { - return `HTTP ${response.status}`; - } -} - -export async function callTool( - name: string, - args: Record = {}, -): Promise { - const result = await rpc<{ - content: Array<{ type: string; text?: string; data?: unknown }>; - }>("tools/call", { - name, - arguments: args, - }); - const first = result.content?.[0]; - if (!first) { - return undefined as T; - } - if (first.data !== undefined) { - return first.data as T; - } - if (first.text !== undefined) { - try { - return JSON.parse(first.text) as T; - } catch { - return first.text as unknown as T; - } - } - return undefined as T; -} - -interface RawConnectionRow { - id: string; - name: string; - type: string; - host?: string; - port?: number; - database?: string; - username?: string; - is_connected?: boolean; - ai_policy?: string; - safe_mode?: string; -} - -export async function listConnections(): Promise { - const envelope = await callTool<{ connections: RawConnectionRow[] }>( - "list_connections", - ); - return (envelope.connections ?? []).map((row) => ({ - id: row.id, - name: row.name, - type: row.type, - host: row.host, - port: row.port, - database: row.database, - })); -} - -export async function listDatabases( - connectionId: string, -): Promise { - const envelope = await callTool<{ databases: string[] }>("list_databases", { - connection_id: connectionId, - }); - return (envelope.databases ?? []).map((name) => ({ name })); -} - -export async function listSchemas( - connectionId: string, - database?: string, -): Promise { - const envelope = await callTool<{ schemas: string[] }>("list_schemas", { - connection_id: connectionId, - database, - }); - return (envelope.schemas ?? []).map((name) => ({ name, database })); -} - -interface RawTableRow { - name: string; - type?: string; - schema?: string; - database?: string; - row_count?: number; -} - -export async function listTables( - connectionId: string, - options: { database?: string; schema?: string } = {}, -): Promise { - const envelope = await callTool<{ tables: RawTableRow[] }>("list_tables", { - connection_id: connectionId, - database: options.database, - schema: options.schema, - include_row_counts: true, - }); - return (envelope.tables ?? []).map((row) => ({ - name: row.name, - type: row.type, - schema: row.schema, - database: row.database, - rowCount: row.row_count, - })); -} - -interface RawColumn { - name: string; - data_type: string; - is_nullable: boolean; - is_primary_key: boolean; - default_value?: string | null; - extra?: string | null; - comment?: string | null; -} - -interface RawDescribeTable { - columns: RawColumn[]; - indexes?: unknown[]; - foreign_keys?: unknown[]; - ddl?: string; - approximate_row_count?: number; -} - -export async function describeTable( - connectionId: string, - table: string, - options: { schema?: string } = {}, -): Promise<{ columns: ColumnInfo[] }> { - const envelope = await callTool("describe_table", { - connection_id: connectionId, - table, - schema: options.schema, - }); - const columns: ColumnInfo[] = (envelope.columns ?? []).map((col) => ({ - name: col.name, - type: col.data_type, - nullable: col.is_nullable, - primaryKey: col.is_primary_key, - defaultValue: col.default_value ?? undefined, - comment: col.comment ?? undefined, - })); - return { columns }; -} - -export async function getTableDDL( - connectionId: string, - table: string, - options: { schema?: string } = {}, -): Promise<{ ddl: string }> { - return callTool<{ ddl: string }>("get_table_ddl", { - connection_id: connectionId, - table, - schema: options.schema, - }); -} - -interface RawQueryResult { - columns: string[]; - rows: Array>; - row_count: number; - rows_affected: number; - execution_time_ms: number; - is_truncated: boolean; - status_message?: string; -} - -function adaptQueryResult(raw: RawQueryResult): QueryResult { - const rows: Array> = (raw.rows ?? []).map((row) => { - const obj: Record = {}; - raw.columns.forEach((col, idx) => { - obj[col] = row[idx] ?? null; - }); - return obj; - }); - return { - columns: raw.columns ?? [], - rows, - affectedRows: raw.rows_affected, - durationMs: raw.execution_time_ms, - }; -} - -export async function executeQuery( - connectionId: string, - sql: string, - options: { database?: string; schema?: string; rowLimit?: number } = {}, -): Promise { - const raw = await callTool("execute_query", { - connection_id: connectionId, - query: sql, - database: options.database, - schema: options.schema, - max_rows: options.rowLimit, - }); - return adaptQueryResult(raw); -} - -export async function explainQuery( - connectionId: string, - sql: string, - options: { database?: string; schema?: string } = {}, -): Promise { - const raw = await callTool("execute_query", { - connection_id: connectionId, - query: `EXPLAIN ${sql}`, - database: options.database, - schema: options.schema, - }); - return adaptQueryResult(raw); -} - -interface RawRecentTab { - tab_id: string; - connection_id: string; - connection_name: string; - tab_type: string; - display_title: string; - is_active: boolean; - table_name?: string; - database_name?: string; - schema_name?: string; - window_id?: string; -} - -function tabTypeFromRaw(raw: string): RecentTab["tabType"] { - if (raw === "table") return "table"; - if (raw === "createTable") return "structure"; - return "query"; -} - -export async function listRecentTabs(): Promise { - const envelope = await callTool<{ tabs: RawRecentTab[] }>( - "list_recent_tabs", - ); - return (envelope.tabs ?? []).map((tab) => ({ - id: tab.tab_id, - connectionId: tab.connection_id, - connectionName: tab.connection_name, - tabType: tabTypeFromRaw(tab.tab_type), - title: tab.display_title, - tableName: tab.table_name, - databaseName: tab.database_name, - })); -} - -interface RawHistoryEntry { - id: string; - query: string; - connection_id: string; - database_name?: string; - executed_at: number; - execution_time_ms: number; - row_count: number; - was_successful: boolean; - error_message?: string; -} - -export interface SearchHistoryOptions { - /** Earliest executed_at to include, Unix epoch seconds (inclusive). */ - since?: number; - /** Latest executed_at to include, Unix epoch seconds (inclusive). */ - until?: number; -} - -export async function searchHistory( - query: string, - limit = 50, - options: SearchHistoryOptions = {}, -): Promise { - const args: Record = { - query, - limit, - }; - if (options.since !== undefined) { - args.since = options.since; - } - if (options.until !== undefined) { - args.until = options.until; - } - const envelope = await callTool<{ entries: RawHistoryEntry[] }>( - "search_query_history", - args, - ); - return (envelope.entries ?? []).map((entry) => ({ - id: entry.id, - query: entry.query, - connectionId: entry.connection_id, - executedAt: new Date(entry.executed_at * 1000).toISOString(), - durationMs: entry.execution_time_ms, - rowCount: entry.row_count, - })); -} - -export async function openConnectionWindow( - connectionId: string, -): Promise { - await callTool("open_connection_window", { - connection_id: connectionId, - }); -} - -export async function exchangePairingCode( - code: string, - codeVerifier: string, -): Promise<{ token: string }> { - const handshake = await ensureHandshake(false); - const url = `http${handshake.tls ? "s" : ""}://127.0.0.1:${handshake.port}/v1/integrations/exchange`; - const response = await fetch(url, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ code, code_verifier: codeVerifier }), - }); - if (!response.ok) { - const text = await safeReadError(response); - throw new Error(`Pairing exchange failed: ${text}`); - } - const json = (await response.json()) as { token?: string }; - if (!json.token) { - throw new Error("Pairing exchange returned no token"); - } - return { token: json.token }; -} diff --git a/extensions/tablepro/src/lib/pairing.ts b/extensions/tablepro/src/lib/pairing.ts deleted file mode 100644 index 2ba25d64c..000000000 --- a/extensions/tablepro/src/lib/pairing.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { randomBytes, createHash } from "crypto"; - -export interface PKCEPair { - verifier: string; - challenge: string; -} - -function base64UrlEncode(buffer: Buffer): string { - return buffer - .toString("base64") - .replace(/\+/g, "-") - .replace(/\//g, "_") - .replace(/=+$/, ""); -} - -export function generatePKCE(): PKCEPair { - const verifier = base64UrlEncode(randomBytes(32)); - const challenge = base64UrlEncode( - createHash("sha256").update(verifier).digest(), - ); - return { verifier, challenge }; -} - -export const PAIR_CALLBACK_URL = - "raycast://extensions/ngoquocdat/tablepro/pair-callback"; - -export const STORAGE_KEYS = { - pendingVerifier: "pairing.pendingVerifier", - pendingClient: "pairing.pendingClient", - callbackCode: "pairing.callbackCode", -}; diff --git a/extensions/tablepro/src/lib/paths.ts b/extensions/tablepro/src/lib/paths.ts deleted file mode 100644 index 6f079f344..000000000 --- a/extensions/tablepro/src/lib/paths.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { homedir } from "os"; -import { join } from "path"; -import { getPreferenceValues } from "@raycast/api"; -import { existsSync } from "fs"; -import { Preferences } from "./types"; - -const APP_SUPPORT_RELATIVE = "Library/Application Support/TablePro"; - -export function appSupportDir(): string { - return join(homedir(), APP_SUPPORT_RELATIVE); -} - -export function connectionsFilePath(): string { - return join(appSupportDir(), "connections.json"); -} - -export function handshakeFilePath(): string { - return join(appSupportDir(), "mcp-handshake.json"); -} - -export function tableProAppPath(): string { - const prefs = getPreferenceValues(); - const value = prefs.tableProAppPath; - if (!value) { - return "/Applications/TablePro.app"; - } - if (typeof value === "string") { - return value; - } - return value.path ?? "/Applications/TablePro.app"; -} - -export function tableProInstalled(): boolean { - return existsSync(tableProAppPath()); -} diff --git a/extensions/tablepro/src/lib/sql.ts b/extensions/tablepro/src/lib/sql.ts deleted file mode 100644 index a449369bd..000000000 --- a/extensions/tablepro/src/lib/sql.ts +++ /dev/null @@ -1,13 +0,0 @@ -const MUTATING_PATTERN = - /^\s*(?:WITH\s+[\s\S]+?\)\s*)?(?:INSERT|UPDATE|DELETE|DROP|ALTER|TRUNCATE|MERGE|CREATE|REPLACE|GRANT|REVOKE)\b/i; - -export function isMutatingSQL(sql: string): boolean { - if (!sql) return false; - return MUTATING_PATTERN.test(sql); -} - -export function summarizeSQL(sql: string, max = 240): string { - const cleaned = sql.replace(/\s+/g, " ").trim(); - if (cleaned.length <= max) return cleaned; - return cleaned.slice(0, max - 1) + "…"; -} diff --git a/extensions/tablepro/src/lib/types.ts b/extensions/tablepro/src/lib/types.ts deleted file mode 100644 index 739b88d60..000000000 --- a/extensions/tablepro/src/lib/types.ts +++ /dev/null @@ -1,122 +0,0 @@ -export type DatabaseType = string; - -export interface Connection { - id: string; - name: string; - type: DatabaseType; - host?: string; - port?: number; - color?: string; - groupId?: string; - database?: string; - schema?: string; -} - -export interface ConnectionGroup { - id: string; - name: string; - color?: string; -} - -export interface MCPHandshake { - port: number; - token: string; - pid: number; - protocolVersion: string; - tls: boolean; -} - -export interface DatabaseInfo { - name: string; -} - -export interface SchemaInfo { - name: string; - database?: string; -} - -export interface TableInfo { - name: string; - schema?: string; - database?: string; - rowCount?: number; - type?: string; -} - -export interface ColumnInfo { - name: string; - type: string; - nullable: boolean; - primaryKey?: boolean; - defaultValue?: string | null; - comment?: string | null; -} - -export interface QueryResult { - columns: string[]; - rows: Array>; - affectedRows?: number; - durationMs?: number; - error?: string; -} - -export interface RecentTab { - id: string; - connectionId: string; - connectionName: string; - tabType: "query" | "table" | "structure"; - title: string; - tableName?: string; - databaseName?: string; - updatedAt?: string; -} - -export interface QueryHistoryEntry { - id: string; - connectionId?: string; - connectionName?: string; - query: string; - executedAt: string; - durationMs?: number; - rowCount?: number; -} - -export interface Preferences { - tableProAppPath?: { path: string; bundleId: string; name: string } | string; - apiToken?: string; -} - -export class TableProNotInstalledError extends Error { - constructor() { - super("TablePro is not installed"); - this.name = "TableProNotInstalledError"; - } -} - -export class MCPNotRunningError extends Error { - constructor() { - super("TablePro MCP server is not running"); - this.name = "MCPNotRunningError"; - } -} - -export class TokenMissingError extends Error { - constructor() { - super("No API token. Run the Pair with TablePro command first."); - this.name = "TokenMissingError"; - } -} - -export class TokenRevokedError extends Error { - constructor() { - super("API token was revoked. Pair with TablePro again."); - this.name = "TokenRevokedError"; - } -} - -export class ExternalAccessDeniedError extends Error { - constructor(message: string) { - super(message); - this.name = "ExternalAccessDeniedError"; - } -} diff --git a/extensions/tablepro/src/menu-bar-connections.tsx b/extensions/tablepro/src/menu-bar-connections.tsx deleted file mode 100644 index 4dd193024..000000000 --- a/extensions/tablepro/src/menu-bar-connections.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { - Icon, - MenuBarExtra, - launchCommand, - LaunchType, - open, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { Connection } from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { tableProInstalled } from "./lib/paths"; -import { openConnectionDeeplink } from "./lib/deeplink"; - -const MAX_RECENT = 12; - -interface MenuData { - installed: boolean; - connections: Connection[]; -} - -export default function MenuBarConnections() { - const { data, isLoading } = useCachedPromise( - async (): Promise => { - const installed = tableProInstalled(); - if (!installed) { - return { installed: false, connections: [] }; - } - try { - const list = await loadConnections(); - return { installed: true, connections: list }; - } catch { - return { installed: true, connections: [] }; - } - }, - [], - { keepPreviousData: true }, - ); - - const installed = data?.installed ?? true; - const recent = (data?.connections ?? []).slice(0, MAX_RECENT); - - return ( - - {!installed ? ( - - - open("https://tablepro.app").catch(() => undefined) - } - /> - - ) : null} - {installed && recent.length > 0 ? ( - - {recent.map((connection) => ( - - openConnectionDeeplink(connection.id).catch( - () => undefined, - ) - } - /> - ))} - - ) : null} - {installed && recent.length === 0 ? ( - - ) : null} - - - launchCommand({ - name: "search-connections", - type: LaunchType.UserInitiated, - }) - } - /> - - launchCommand({ - name: "recent-tabs", - type: LaunchType.UserInitiated, - }) - } - /> - - launchCommand({ - name: "run-query", - type: LaunchType.UserInitiated, - }) - } - /> - - - ); -} diff --git a/extensions/tablepro/src/open-connection.tsx b/extensions/tablepro/src/open-connection.tsx deleted file mode 100644 index d68236707..000000000 --- a/extensions/tablepro/src/open-connection.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { LaunchProps, showHUD, showToast, Toast, open } from "@raycast/api"; -import { findConnection } from "./lib/connections"; -import { openConnectionDeeplink } from "./lib/deeplink"; -import { tableProInstalled } from "./lib/paths"; - -interface Args { - connection: string; -} - -export default async function OpenConnection( - props: LaunchProps<{ arguments: Args }>, -) { - const query = props.arguments.connection.trim(); - if (!query) { - await showToast({ - style: Toast.Style.Failure, - title: "Connection name required", - }); - return; - } - if (!tableProInstalled()) { - await showToast({ - style: Toast.Style.Failure, - title: "TablePro is not installed", - message: "Install from tablepro.app", - primaryAction: { - title: "Open Website", - onAction: () => { - open("https://tablepro.app"); - }, - }, - }); - return; - } - const match = await findConnection(query); - if (!match) { - await showToast({ - style: Toast.Style.Failure, - title: "Connection not found", - message: query, - }); - return; - } - await openConnectionDeeplink(match.id); - await showHUD(`Opening ${match.name}`); -} diff --git a/extensions/tablepro/src/pair.tsx b/extensions/tablepro/src/pair.tsx deleted file mode 100644 index e4e7bcbba..000000000 --- a/extensions/tablepro/src/pair.tsx +++ /dev/null @@ -1,337 +0,0 @@ -import { - Action, - ActionPanel, - Detail, - Form, - Icon, - LaunchProps, - LocalStorage, - Toast, - showToast, - showHUD, - useNavigation, - open, - openExtensionPreferences, - popToRoot, - updateCommandMetadata, -} from "@raycast/api"; -import { FormValidation, useCachedPromise, useForm } from "@raycast/utils"; -import { useEffect, useState } from "react"; -import { hostname } from "os"; -import { TableProNotInstalledError } from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { tableProInstalled } from "./lib/paths"; -import { pairDeeplink } from "./lib/deeplink"; -import { exchangePairingCode } from "./lib/mcp"; -import { generatePKCE, PAIR_CALLBACK_URL, STORAGE_KEYS } from "./lib/pairing"; -import { classifyError } from "./lib/errors"; - -interface LaunchContext { - code?: string; -} - -interface PairFormValues { - client: string; - scope: string; - connections: string[]; -} - -const SCOPE_OPTIONS = [ - { value: "read", label: "Read-only" }, - { value: "read-write", label: "Read & write" }, - { value: "full", label: "Full access" }, -]; - -export default function PairCommand( - props: LaunchProps<{ launchContext: LaunchContext }>, -) { - const incomingCode = props.launchContext?.code; - if (incomingCode) { - return ; - } - return ; -} - -function PairForm() { - const { - data: connections, - isLoading, - error, - } = useCachedPromise( - async () => { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - return loadConnections(); - }, - [], - { keepPreviousData: true }, - ); - const { push } = useNavigation(); - - const { handleSubmit, itemProps } = useForm({ - async onSubmit(values) { - try { - const { verifier, challenge } = generatePKCE(); - await LocalStorage.setItem( - STORAGE_KEYS.pendingVerifier, - verifier, - ); - await LocalStorage.setItem( - STORAGE_KEYS.pendingClient, - values.client, - ); - await pairDeeplink({ - client: values.client, - challenge, - redirect: PAIR_CALLBACK_URL, - scopes: scopeToList(values.scope), - connectionIds: - values.connections.length > 0 - ? values.connections - : undefined, - }); - push(); - } catch (err) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to start pairing", - message: err instanceof Error ? err.message : String(err), - }); - } - }, - initialValues: { - client: `Raycast on ${hostname()}`, - scope: "read", - connections: [], - }, - validation: { - client: FormValidation.Required, - scope: FormValidation.Required, - }, - }); - - if (error) { - return ( - - - - } - /> - ); - } - - return ( - - - - } - > - - - {SCOPE_OPTIONS.map((option) => ( - - ))} - - - {(connections ?? []).map((connection) => ( - - ))} - - - - ); -} - -function WaitingView() { - const [error, setError] = useState(null); - const [completed, setCompleted] = useState(false); - const { pop } = useNavigation(); - - useEffect(() => { - let cancelled = false; - const handle = setInterval(async () => { - try { - const code = await LocalStorage.getItem( - STORAGE_KEYS.callbackCode, - ); - if (!code) return; - await LocalStorage.removeItem(STORAGE_KEYS.callbackCode); - clearInterval(handle); - const verifier = await LocalStorage.getItem( - STORAGE_KEYS.pendingVerifier, - ); - if (!verifier) { - throw new Error( - "Pairing verifier missing. Restart the pairing flow.", - ); - } - const exchange = await exchangePairingCode(code, verifier); - await persistToken(exchange.token); - await LocalStorage.removeItem(STORAGE_KEYS.pendingVerifier); - await LocalStorage.removeItem(STORAGE_KEYS.pendingClient); - if (cancelled) return; - setCompleted(true); - await showHUD("Paired with TablePro"); - await popToRoot({ clearSearchBar: true }); - } catch (err) { - if (cancelled) return; - setError(err); - clearInterval(handle); - } - }, 1000); - return () => { - cancelled = true; - clearInterval(handle); - }; - }, []); - - if (error) { - return ( - - - - } - /> - ); - } - - const message = completed - ? "Paired. You can close this window." - : "Approve the pairing in TablePro. Come back here once you have approved it."; - - return ( - - ); -} - -function ExchangeView({ code }: { code: string }) { - const { isLoading, error } = useCachedPromise( - (c: string) => LocalStorage.setItem(STORAGE_KEYS.callbackCode, c), - [code], - { keepPreviousData: false }, - ); - - if (error) { - return ; - } - - return ( - - ); -} - -function scopeToList(scope: string): string[] { - switch (scope) { - case "read": - return ["connections.read", "schema.read", "query.read"]; - case "read-write": - return [ - "connections.read", - "schema.read", - "query.read", - "query.write", - ]; - case "full": - return [ - "connections.read", - "schema.read", - "query.read", - "query.write", - "admin", - ]; - default: - return ["connections.read", "schema.read", "query.read"]; - } -} - -async function persistToken(token: string): Promise { - await LocalStorage.setItem("apiToken", token); - try { - await updateCommandMetadata({ subtitle: "Paired" }); - } catch (err) { - console.error("updateCommandMetadata failed", err); - } - await showToast({ - style: Toast.Style.Success, - title: "Token issued", - message: - "Open extension preferences to paste it into the API Token field.", - primaryAction: { - title: "Open Preferences", - onAction: () => { - openExtensionPreferences(); - }, - }, - }); - try { - await open( - `raycast://extensions/ngoquocdat/tablepro?token=${encodeURIComponent(token)}`, - ); - } catch (err) { - console.error("post-pair redirect failed", err); - } -} - -function renderErrorMarkdown(err: unknown): string { - const scenario = classifyError(err); - switch (scenario.kind) { - case "not-installed": - return "# TablePro is not installed\n\nInstall TablePro from [tablepro.app](https://tablepro.app), then run this command again."; - case "mcp-not-running": - return "# TablePro is not running\n\nOpen TablePro and try again. The MCP server starts on demand."; - case "no-token": - return "# No token yet\n\nFinish the pairing flow to issue one."; - case "token-revoked": - return "# Token was revoked\n\nRun this command to issue a new one."; - case "access-denied": - return `# Access denied\n\n${scenario.message}`; - case "other": - return `# Pairing failed\n\n${scenario.message}`; - } -} diff --git a/extensions/tablepro/src/recent-tabs.tsx b/extensions/tablepro/src/recent-tabs.tsx deleted file mode 100644 index 52eaa910c..000000000 --- a/extensions/tablepro/src/recent-tabs.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { - Action, - ActionPanel, - Icon, - List, - showToast, - Toast, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { RecentTab } from "./lib/types"; -import { listRecentTabs, openConnectionWindow } from "./lib/mcp"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; -import { openTableDeeplink } from "./lib/deeplink"; - -export default function RecentTabsCommand() { - const { - data: tabs, - isLoading, - error, - } = useCachedPromise(listRecentTabs, [], { keepPreviousData: true }); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && tabs !== undefined && tabs.length === 0 ? ( - - ) : null} - {(tabs ?? []).map((tab) => ( - - { - try { - if (tab.tableName) { - await openTableDeeplink( - tab.connectionId, - tab.tableName, - tab.databaseName, - ); - } else { - await openConnectionWindow( - tab.connectionId, - ); - } - } catch (err) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to open tab", - message: - err instanceof Error - ? err.message - : String(err), - }); - } - }} - /> - - } - /> - ))} - - ); -} - -function tabIcon(tab: RecentTab): Icon { - switch (tab.tabType) { - case "query": - return Icon.Terminal; - case "table": - return Icon.List; - case "structure": - return Icon.Code; - default: - return Icon.Document; - } -} diff --git a/extensions/tablepro/src/run-query.tsx b/extensions/tablepro/src/run-query.tsx deleted file mode 100644 index 85eda1a0d..000000000 --- a/extensions/tablepro/src/run-query.tsx +++ /dev/null @@ -1,323 +0,0 @@ -import { - Action, - ActionPanel, - Form, - Icon, - List, - Detail, - useNavigation, - showToast, - Toast, - confirmAlert, - Alert, - getPreferenceValues, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { useState } from "react"; -import { - Connection, - Preferences, - QueryResult, - TableProNotInstalledError, -} from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { tableProInstalled } from "./lib/paths"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; -import { executeQuery } from "./lib/mcp"; -import { openQueryDeeplink } from "./lib/deeplink"; -import { isMutatingSQL, summarizeSQL } from "./lib/sql"; - -export default function RunQueryCommand() { - const { - data: connections, - isLoading, - error, - } = useCachedPromise( - async () => { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - return loadConnections(); - }, - [], - { keepPreviousData: true }, - ); - - if (error) { - return ( - - - - ); - } - - if (isLoading || connections === undefined) { - return ; - } - - if (connections.length === 0) { - return ( - - - - ); - } - - return ; -} - -function QueryForm({ connections }: { connections: Connection[] }) { - const initialId = connections[0]?.id ?? ""; - const [connectionId, setConnectionId] = useState(initialId); - const [sql, setSql] = useState(""); - const { push } = useNavigation(); - - return ( -
- { - const trimmed = values.sql.trim(); - if (!trimmed) { - await showToast({ - style: Toast.Style.Failure, - title: "SQL is empty", - }); - return; - } - const target = connections.find( - (c) => c.id === values.connection, - ); - if (!target) { - await showToast({ - style: Toast.Style.Failure, - title: "Pick a connection", - }); - return; - } - if (isMutatingSQL(trimmed)) { - const confirmed = await confirmAlert({ - title: "Run mutating query?", - message: summarizeSQL(trimmed), - primaryAction: { - title: "Run", - style: Alert.ActionStyle.Destructive, - }, - }); - if (!confirmed) return; - } - push( - , - ); - }} - /> - { - const target = connections.find( - (c) => c.id === values.connection, - ); - if (!target) return; - const prefs = getPreferenceValues(); - await openQueryDeeplink( - target.id, - values.sql, - prefs.apiToken, - ); - }} - /> - - } - > - - {connections.map((connection) => ( - - ))} - - - - - ); -} - -function RunningView({ - connection, - sql, -}: { - connection: Connection; - sql: string; -}) { - const { - data: result, - isLoading, - error, - } = useCachedPromise( - (id: string, q: string) => executeQuery(id, q, { rowLimit: 200 }), - [connection.id, sql], - ); - - if (error) { - return ( - - - - ); - } - - if (isLoading || !result) { - return ( - - ); - } - - return ; -} - -function ResultView({ - connection, - sql, - result, -}: { - connection: Connection; - sql: string; - result: QueryResult; -}) { - if (result.error) { - return ( - - - openQueryDeeplink(connection.id, sql) - } - /> - - } - /> - ); - } - - if (!result.rows || result.rows.length === 0) { - const summary = - result.affectedRows !== undefined - ? `${result.affectedRows} rows affected` - : "Query returned no rows"; - return ( - - - openQueryDeeplink(connection.id, sql) - } - /> - - } - /> - ); - } - - const markdown = renderResultMarkdown(connection.name, sql, result); - return ( - - openQueryDeeplink(connection.id, sql)} - /> - - - } - /> - ); -} - -function renderResultMarkdown( - connectionName: string, - sql: string, - result: QueryResult, -): string { - const headerRow = `| ${result.columns.join(" | ")} |`; - const separator = `| ${result.columns.map(() => "---").join(" | ")} |`; - const dataRows = result.rows.slice(0, 50).map((row) => { - return `| ${result.columns.map((col) => formatCell(row[col])).join(" | ")} |`; - }); - const previewNote = - result.rows.length > 50 - ? `\n\n_Showing 50 of ${result.rows.length} rows. Open in TablePro for the full grid._` - : ""; - return [ - `# ${connectionName}`, - `${result.rows.length} rows in ${result.durationMs ?? 0} ms`, - "", - "```sql", - sql, - "```", - "", - headerRow, - separator, - ...dataRows, - previewNote, - ].join("\n"); -} - -function formatCell(value: unknown): string { - if (value === null || value === undefined) return "_null_"; - if (typeof value === "string") - return value.replace(/\|/g, "\\|").slice(0, 120); - if (typeof value === "number" || typeof value === "boolean") - return String(value); - try { - return JSON.stringify(value).slice(0, 120); - } catch { - return "_unprintable_"; - } -} diff --git a/extensions/tablepro/src/search-connections.tsx b/extensions/tablepro/src/search-connections.tsx deleted file mode 100644 index 31d453cd6..000000000 --- a/extensions/tablepro/src/search-connections.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { - Action, - ActionPanel, - Icon, - List, - showToast, - Toast, - Clipboard, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { Connection, TableProNotInstalledError } from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { tableProInstalled } from "./lib/paths"; -import { openConnectionDeeplink } from "./lib/deeplink"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; - -export default function SearchConnections() { - const { - data: connections, - isLoading, - error, - } = useCachedPromise( - async () => { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - return loadConnections(); - }, - [], - { keepPreviousData: true }, - ); - - if (error) { - return ( - - - - ); - } - - const grouped = groupByType(connections ?? []); - - return ( - - {!isLoading && - connections !== undefined && - connections.length === 0 ? ( - - ) : null} - {Object.entries(grouped).map(([type, items]) => ( - - {items.map((connection) => ( - - ))} - - ))} - - ); -} - -function ConnectionRow({ connection }: { connection: Connection }) { - const subtitle = formatSubtitle(connection); - return ( - - { - try { - await openConnectionDeeplink(connection.id); - } catch (err) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to open connection", - message: - err instanceof Error - ? err.message - : String(err), - }); - } - }} - /> - { - await Clipboard.copy( - `tablepro://connect/${connection.id}`, - ); - await showToast({ - style: Toast.Style.Success, - title: "Deep link copied", - }); - }} - /> - - - } - /> - ); -} - -function formatSubtitle(connection: Connection): string { - if (!connection.host) return ""; - if (connection.port) return `${connection.host}:${connection.port}`; - return connection.host; -} - -function groupByType(list: Connection[]): Record { - const map: Record = {}; - for (const conn of list) { - const bucket = map[conn.type] ?? []; - bucket.push(conn); - map[conn.type] = bucket; - } - return map; -} diff --git a/extensions/tablepro/src/search-history.tsx b/extensions/tablepro/src/search-history.tsx deleted file mode 100644 index 5bd0dd996..000000000 --- a/extensions/tablepro/src/search-history.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { - Action, - ActionPanel, - Clipboard, - Icon, - List, - showToast, - Toast, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { useState } from "react"; -import { searchHistory } from "./lib/mcp"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; -import { summarizeSQL } from "./lib/sql"; - -export default function SearchHistoryCommand() { - const [query, setQuery] = useState(""); - const { - data: results, - isLoading, - error, - } = useCachedPromise((q: string) => searchHistory(q, 100), [query], { - keepPreviousData: true, - }); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && results !== undefined && results.length === 0 ? ( - - ) : null} - {(results ?? []).map((entry) => ( - - { - await Clipboard.copy(entry.query); - await showToast({ - style: Toast.Style.Success, - title: "SQL copied", - }); - }} - /> - - } - /> - ))} - - ); -} diff --git a/extensions/tablepro/src/search-schema.tsx b/extensions/tablepro/src/search-schema.tsx deleted file mode 100644 index c988bb2fa..000000000 --- a/extensions/tablepro/src/search-schema.tsx +++ /dev/null @@ -1,195 +0,0 @@ -import { Action, ActionPanel, Icon, List } from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { Connection } from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { listDatabases, listSchemas } from "./lib/mcp"; -import { tableProInstalled } from "./lib/paths"; -import { TableProNotInstalledError } from "./lib/types"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; -import SearchTablesView from "./search-tables"; - -export default function SearchSchema() { - const { - data: connections, - isLoading, - error, - } = useCachedPromise( - async () => { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - return loadConnections(); - }, - [], - { keepPreviousData: true }, - ); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && - connections !== undefined && - connections.length === 0 ? ( - - ) : null} - {(connections ?? []).map((connection) => ( - - - } - /> - - } - /> - ))} - - ); -} - -function DatabasesView({ connection }: { connection: Connection }) { - const { - data: databases, - isLoading, - error, - } = useCachedPromise((id: string) => listDatabases(id), [connection.id], { - keepPreviousData: true, - }); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && databases !== undefined && databases.length === 0 ? ( - - ) : null} - {(databases ?? []).map((db) => ( - - - } - /> - - } - /> - - } - /> - ))} - - ); -} - -function SchemasView({ - connection, - database, -}: { - connection: Connection; - database: string; -}) { - const { - data: schemas, - isLoading, - error, - } = useCachedPromise( - (id: string, db: string) => listSchemas(id, db), - [connection.id, database], - { keepPreviousData: true }, - ); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && schemas !== undefined && schemas.length === 0 ? ( - - ) : null} - {(schemas ?? []).map((schema) => ( - - - } - /> - - } - /> - ))} - - ); -} diff --git a/extensions/tablepro/src/search-tables.tsx b/extensions/tablepro/src/search-tables.tsx deleted file mode 100644 index f68cb62f8..000000000 --- a/extensions/tablepro/src/search-tables.tsx +++ /dev/null @@ -1,218 +0,0 @@ -import { - Action, - ActionPanel, - Clipboard, - Icon, - List, - showToast, - Toast, - useNavigation, -} from "@raycast/api"; -import { useCachedPromise } from "@raycast/utils"; -import { Connection, TableInfo } from "./lib/types"; -import { databaseTypeLabel, loadConnections } from "./lib/connections"; -import { listTables, getTableDDL } from "./lib/mcp"; -import { tableProInstalled } from "./lib/paths"; -import { TableProNotInstalledError } from "./lib/types"; -import { ScenarioEmptyView } from "./lib/empty-state"; -import { classifyError } from "./lib/errors"; -import { openTableDeeplink } from "./lib/deeplink"; - -interface Props { - connection?: Connection; - database?: string; - schema?: string; -} - -export default function SearchTables(props: Props) { - if (!props.connection) { - return ; - } - return ( - - ); -} - -function ConnectionPicker() { - const { - data: connections, - isLoading, - error, - } = useCachedPromise( - async () => { - if (!tableProInstalled()) throw new TableProNotInstalledError(); - return loadConnections(); - }, - [], - { keepPreviousData: true }, - ); - const { push } = useNavigation(); - - if (error) { - return ( - - - - ); - } - - return ( - - {!isLoading && - connections !== undefined && - connections.length === 0 ? ( - - ) : null} - {(connections ?? []).map((connection) => ( - - - push() - } - /> - - } - /> - ))} - - ); -} - -function TablesList({ - connection, - database, - schema, -}: { - connection: Connection; - database?: string; - schema?: string; -}) { - const { - data: tables, - isLoading, - error, - } = useCachedPromise( - (id: string, db: string | undefined, sc: string | undefined) => - listTables(id, { database: db, schema: sc }), - [connection.id, database, schema], - { keepPreviousData: true }, - ); - - if (error) { - return ( - - - - ); - } - - const navTitle = [connection.name, database, schema] - .filter(Boolean) - .join(" / "); - - return ( - - {!isLoading && tables !== undefined && tables.length === 0 ? ( - - ) : null} - {(tables ?? []).map((table) => ( - - { - await openTableDeeplink( - connection.id, - table.name, - database, - table.schema ?? schema, - ); - }} - /> - { - try { - const result = await getTableDDL( - connection.id, - table.name, - { - schema: table.schema ?? schema, - }, - ); - await Clipboard.copy(result.ddl); - await showToast({ - style: Toast.Style.Success, - title: "DDL copied", - }); - } catch (err) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to fetch DDL", - message: - err instanceof Error - ? err.message - : String(err), - }); - } - }} - /> - - - } - /> - ))} - - ); -} - -function tableAccessories(table: TableInfo): List.Item.Accessory[] { - const accessories: List.Item.Accessory[] = []; - if (table.type && table.type.toLowerCase() !== "table") { - accessories.push({ tag: table.type }); - } - if (table.rowCount !== undefined) { - accessories.push({ text: `${table.rowCount} rows` }); - } - return accessories; -} diff --git a/extensions/tablepro/src/tools/describe-table.ts b/extensions/tablepro/src/tools/describe-table.ts deleted file mode 100644 index 1352ac4ee..000000000 --- a/extensions/tablepro/src/tools/describe-table.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ColumnInfo } from "../lib/types"; -import { describeTable } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** Table name. */ - table: string; - /** Schema name. Optional. */ - schema?: string; -}; - -export default async function tool( - input: Input, -): Promise<{ columns: ColumnInfo[] }> { - return describeTable(input.connectionId, input.table, { - schema: input.schema, - }); -} diff --git a/extensions/tablepro/src/tools/explain-query.ts b/extensions/tablepro/src/tools/explain-query.ts deleted file mode 100644 index f4bcd93d8..000000000 --- a/extensions/tablepro/src/tools/explain-query.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { QueryResult } from "../lib/types"; -import { explainQuery } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** SQL to explain. The tool wraps it with EXPLAIN before running. */ - sql: string; - /** Database to scope the query to. Optional. */ - database?: string; - /** Schema to scope the query to. Optional. */ - schema?: string; -}; - -export default async function tool(input: Input): Promise { - return explainQuery(input.connectionId, input.sql, { - database: input.database, - schema: input.schema, - }); -} diff --git a/extensions/tablepro/src/tools/get-table-ddl.ts b/extensions/tablepro/src/tools/get-table-ddl.ts deleted file mode 100644 index 6c6af582c..000000000 --- a/extensions/tablepro/src/tools/get-table-ddl.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getTableDDL } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** Table name. */ - table: string; - /** Schema name. Optional. */ - schema?: string; -}; - -export default async function tool(input: Input): Promise<{ ddl: string }> { - return getTableDDL(input.connectionId, input.table, { - schema: input.schema, - }); -} diff --git a/extensions/tablepro/src/tools/list-connections.ts b/extensions/tablepro/src/tools/list-connections.ts deleted file mode 100644 index 7c90cfbd3..000000000 --- a/extensions/tablepro/src/tools/list-connections.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Connection } from "../lib/types"; -import { loadConnections } from "../lib/connections"; -import { listConnections } from "../lib/mcp"; - -/** - * List all saved TablePro connections. Reads connections.json directly when no - * token is paired so the model can still discover what is available. - */ -export default async function tool(): Promise { - try { - return await listConnections(); - } catch { - return loadConnections(); - } -} diff --git a/extensions/tablepro/src/tools/list-databases.ts b/extensions/tablepro/src/tools/list-databases.ts deleted file mode 100644 index 592ae492d..000000000 --- a/extensions/tablepro/src/tools/list-databases.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DatabaseInfo } from "../lib/types"; -import { listDatabases } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. Get this from list-connections. */ - connectionId: string; -}; - -export default async function tool(input: Input): Promise { - return listDatabases(input.connectionId); -} diff --git a/extensions/tablepro/src/tools/list-schemas.ts b/extensions/tablepro/src/tools/list-schemas.ts deleted file mode 100644 index fe9bd4896..000000000 --- a/extensions/tablepro/src/tools/list-schemas.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SchemaInfo } from "../lib/types"; -import { listSchemas } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** Database to list schemas for. Optional for engines that don't separate databases and schemas. */ - database?: string; -}; - -export default async function tool(input: Input): Promise { - return listSchemas(input.connectionId, input.database); -} diff --git a/extensions/tablepro/src/tools/list-tables.ts b/extensions/tablepro/src/tools/list-tables.ts deleted file mode 100644 index 5eed8a4db..000000000 --- a/extensions/tablepro/src/tools/list-tables.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TableInfo } from "../lib/types"; -import { listTables } from "../lib/mcp"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** Database name. Optional. */ - database?: string; - /** Schema name. Optional. */ - schema?: string; -}; - -export default async function tool(input: Input): Promise { - return listTables(input.connectionId, { - database: input.database, - schema: input.schema, - }); -} diff --git a/extensions/tablepro/src/tools/open-connection-window.ts b/extensions/tablepro/src/tools/open-connection-window.ts deleted file mode 100644 index a7c43bb93..000000000 --- a/extensions/tablepro/src/tools/open-connection-window.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { openConnectionWindow } from "../lib/mcp"; -import { openConnectionDeeplink } from "../lib/deeplink"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; -}; - -export default async function tool(input: Input): Promise<{ opened: true }> { - try { - await openConnectionWindow(input.connectionId); - } catch { - await openConnectionDeeplink(input.connectionId); - } - return { opened: true }; -} diff --git a/extensions/tablepro/src/tools/run-query.ts b/extensions/tablepro/src/tools/run-query.ts deleted file mode 100644 index 409ec0bf1..000000000 --- a/extensions/tablepro/src/tools/run-query.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Action, Tool } from "@raycast/api"; -import { QueryResult } from "../lib/types"; -import { executeQuery } from "../lib/mcp"; -import { listConnections } from "../lib/mcp"; -import { loadConnections } from "../lib/connections"; -import { isMutatingSQL, summarizeSQL } from "../lib/sql"; - -type Input = { - /** UUID of the TablePro connection. */ - connectionId: string; - /** SQL to run. Mutating statements ask for explicit user approval before running. */ - sql: string; - /** Database to scope the query to. Optional. */ - database?: string; - /** Schema to scope the query to. Optional. */ - schema?: string; - /** Maximum rows to return. Defaults to 200. */ - rowLimit?: number; -}; - -export default async function tool(input: Input): Promise { - return executeQuery(input.connectionId, input.sql, { - database: input.database, - schema: input.schema, - rowLimit: input.rowLimit ?? 200, - }); -} - -export const confirmation: Tool.Confirmation = async (input) => { - if (!isMutatingSQL(input.sql)) { - return undefined; - } - const connectionName = await resolveConnectionName(input.connectionId); - const info: { name: string; value?: string }[] = [ - { name: "Connection", value: connectionName }, - { name: "SQL", value: summarizeSQL(input.sql) }, - ]; - if (input.database) info.push({ name: "Database", value: input.database }); - if (input.schema) info.push({ name: "Schema", value: input.schema }); - return { - style: Action.Style.Destructive, - message: `This query mutates data. Run it on ${connectionName}?`, - info, - }; -}; - -async function resolveConnectionName(connectionId: string): Promise { - try { - const list = await listConnections(); - const match = list.find((c) => c.id === connectionId); - if (match) return match.name; - } catch { - // fall through to local file - } - try { - const list = await loadConnections(); - const match = list.find((c) => c.id === connectionId); - if (match) return match.name; - } catch { - // ignore - } - return connectionId; -} diff --git a/extensions/tablepro/src/tools/search-history.ts b/extensions/tablepro/src/tools/search-history.ts deleted file mode 100644 index 12496f0be..000000000 --- a/extensions/tablepro/src/tools/search-history.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { QueryHistoryEntry } from "../lib/types"; -import { searchHistory } from "../lib/mcp"; - -type Input = { - /** Free-text search across query bodies and connection names. */ - query: string; - /** Maximum results to return. Defaults to 50. */ - limit?: number; - /** Earliest executed_at to include, Unix epoch seconds (inclusive). */ - since?: number; - /** Latest executed_at to include, Unix epoch seconds (inclusive). */ - until?: number; -}; - -export default async function tool(input: Input): Promise { - return searchHistory(input.query, input.limit ?? 50, { - since: input.since, - until: input.until, - }); -} diff --git a/extensions/tablepro/tsconfig.json b/extensions/tablepro/tsconfig.json deleted file mode 100644 index 13451feb4..000000000 --- a/extensions/tablepro/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "include": ["src/**/*", "raycast-env.d.ts"], - "compilerOptions": { - "lib": ["es2022"], - "module": "commonjs", - "target": "ES2022", - "strict": true, - "isolatedModules": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "jsx": "react-jsx", - "resolveJsonModule": true, - "noUncheckedIndexedAccess": true - } -} From 13eab63f00690ca59c3d17af74dd295dcd210207 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 13:00:23 +0700 Subject: [PATCH 33/83] fix(integrations): use Raycast launchContext format for raycast:// redirect --- TablePro/Core/MCP/MCPPairingService.swift | 11 ++++++++++- docs/external-api/pairing.mdx | 7 +++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/TablePro/Core/MCP/MCPPairingService.swift b/TablePro/Core/MCP/MCPPairingService.swift index 71bde51d7..ae1652fbb 100644 --- a/TablePro/Core/MCP/MCPPairingService.swift +++ b/TablePro/Core/MCP/MCPPairingService.swift @@ -168,7 +168,16 @@ final class MCPPairingService { return nil } var items = components.queryItems ?? [] - items.append(URLQueryItem(name: "code", value: code)) + if base.scheme == "raycast" { + let payload = ["code": code] + guard let data = try? JSONSerialization.data(withJSONObject: payload, options: [.sortedKeys]), + let json = String(data: data, encoding: .utf8) else { + return nil + } + items.append(URLQueryItem(name: "context", value: json)) + } else { + items.append(URLQueryItem(name: "code", value: code)) + } components.queryItems = items return components.url } diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index 39c0340c8..c2a20471f 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -26,7 +26,7 @@ sequenceDiagram U->>T: Approve T->>T: tokenStore.generate(...) -> { plaintext, prefix } T->>T: store pending exchange { code, plaintext, challenge }
expires in 5 min - T->>E: open redirect URL with ?code= + T->>E: open redirect URL with code (context for raycast://, ?code= otherwise) E->>M: POST /v1/integrations/exchange
{ code, code_verifier: verifier } M->>M: SHA-256(verifier) == challenge ? M->>E: 200 { token: "tp_..." } @@ -93,7 +93,10 @@ The plaintext token is held in memory only. The token store keeps the hashed for ### 5. TablePro redirects with the code -TablePro appends `?code=` to the `redirect` URL and opens it with `NSWorkspace.shared.open(...)`. Raycast routes the callback to the extension's `pair-callback` handler. +TablePro opens the `redirect` URL with `NSWorkspace.shared.open(...)`. The encoding depends on the redirect scheme: + +- **`raycast://...`** — TablePro appends `?context={"code":""}` (URL-encoded JSON). Raycast parses `context` and passes it to the receiving command as `LaunchProps.launchContext`. This matches Raycast's documented launch-context convention. +- **Anything else** (`http://127.0.0.1:/callback`, custom schemes) — TablePro appends `?code=` as a flat query parameter. Standard OAuth-callback shape. ### 6. Extension exchanges the code From 2580da9715485a2736a5e0ef8f2b5f917d721ba5 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 13:10:34 +0700 Subject: [PATCH 34/83] fix(mcp): drop blocked-connection results from list_recent_tabs and search_query_history --- .../MCP/MCPToolHandler+Integrations.swift | 32 +++++--- .../MCP/MCPToolHandlerIntegrationTests.swift | 78 +++++++++++++++++++ 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 4d0ae3164..3f85d0285 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -13,12 +13,12 @@ extension MCPToolHandler { let limit = optionalInt(args, key: "limit", default: 20, clamp: 1...500) let snapshots = await MainActor.run { Self.collectTabSnapshots() } + let blockedConnectionIds = await MainActor.run { Self.blockedExternalConnectionIds() } let allowed = token?.allowedConnectionIds - let filtered: [TabSnapshot] - if let allowed { - filtered = snapshots.filter { allowed.contains($0.connectionId) } - } else { - filtered = snapshots + let filtered = snapshots.filter { snapshot in + guard !blockedConnectionIds.contains(snapshot.connectionId) else { return false } + if let allowed, !allowed.contains(snapshot.connectionId) { return false } + return true } let trimmed = Array(filtered.prefix(limit)) @@ -62,12 +62,19 @@ extension MCPToolHandler { throw MCPError.invalidParams("'since' must be less than or equal to 'until'") } + let blockedConnectionIds = await MainActor.run { Self.blockedExternalConnectionIds() } + let connectionId: UUID? if let connectionIdString { guard let parsed = UUID(uuidString: connectionIdString) else { throw MCPError.invalidParams("Invalid UUID for parameter: connection_id") } if let token { try checkTokenConnectionAccess(token, connectionId: parsed) } + if blockedConnectionIds.contains(parsed) { + throw MCPError.forbidden( + String(localized: "External access is disabled for this connection") + ) + } connectionId = parsed } else { connectionId = nil @@ -84,11 +91,10 @@ extension MCPToolHandler { ) let allowed = token?.allowedConnectionIds - let filtered: [QueryHistoryEntry] - if let allowed { - filtered = entries.filter { allowed.contains($0.connectionId) } - } else { - filtered = entries + let filtered = entries.filter { entry in + guard !blockedConnectionIds.contains(entry.connectionId) else { return false } + if let allowed, !allowed.contains(entry.connectionId) { return false } + return true } let payload = filtered.map { entry -> JSONValue in @@ -249,6 +255,12 @@ extension MCPToolHandler { } return snapshots } + + @MainActor + static func blockedExternalConnectionIds() -> Set { + let connections = ConnectionStorage.shared.loadConnections() + return Set(connections.filter { $0.externalAccess == .blocked }.map(\.id)) + } } struct TabSnapshot { diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index 8d37f567e..a31c1ae25 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -84,6 +84,19 @@ struct MCPToolHandlerIntegrationTests { #expect(payload.contains("\"tabs\"")) } + @Test("blockedExternalConnectionIds returns ids of connections with externalAccess == .blocked") + func blockedExternalConnectionIdsHelper() async throws { + let blocked = DatabaseConnection(name: "Blocked", type: .mysql, externalAccess: .blocked) + let readOnly = DatabaseConnection(name: "ReadOnly", type: .mysql, externalAccess: .readOnly) + let readWrite = DatabaseConnection(name: "ReadWrite", type: .mysql, externalAccess: .readWrite) + try await withConnections([blocked, readOnly, readWrite]) { + let ids = MCPToolHandler.blockedExternalConnectionIds() + #expect(ids.contains(blocked.id)) + #expect(!ids.contains(readOnly.id)) + #expect(!ids.contains(readWrite.id)) + } + } + @Test("list_recent_tabs requires read scope only") func listRecentTabsScope() async throws { let handler = makeHandler() @@ -181,6 +194,71 @@ struct MCPToolHandlerIntegrationTests { } } + @Test("search_query_history rejects connection_id whose externalAccess is .blocked") + func searchQueryHistoryRejectsBlockedConnection() async throws { + let handler = makeHandler() + let blocked = DatabaseConnection(name: "Blocked Prod", type: .mysql, externalAccess: .blocked) + try await withConnections([blocked]) { + do { + _ = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object([ + "query": .string(""), + "connection_id": .string(blocked.id.uuidString) + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for blocked connection") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("search_query_history filters out blocked connections when iterating without connection_id") + func searchQueryHistoryFiltersBlockedFromUnscopedQuery() async throws { + let handler = makeHandler() + let blocked = DatabaseConnection(name: "Blocked", type: .mysql, externalAccess: .blocked) + let visible = DatabaseConnection(name: "Visible", type: .mysql, externalAccess: .readOnly) + let marker = UUID().uuidString + + try await withConnections([blocked, visible]) { + let blockedEntry = QueryHistoryEntry( + query: "SELECT blocked_\(marker)", + connectionId: blocked.id, + databaseName: "db", + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + let visibleEntry = QueryHistoryEntry( + query: "SELECT visible_\(marker)", + connectionId: visible.id, + databaseName: "db", + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(blockedEntry) + _ = await QueryHistoryStorage.shared.addHistory(visibleEntry) + + let result = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object(["query": .string(marker)]), + sessionId: "test-session", + token: nil + ) + #expect(result.isError == nil) + let payload = result.content.first?.text ?? "" + #expect(payload.contains("visible_\(marker)")) + #expect(!payload.contains("blocked_\(marker)")) + } + } + @Test("search_query_history with since/until filters by executed_at window") func searchQueryHistorySinceUntilFilters() async throws { let handler = makeHandler() From f19dab5797822ace106c1d3183f6748707852f8c Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 13:16:11 +0700 Subject: [PATCH 35/83] fix(mcp): enforce externalAccess readOnly on state-mutating tools --- TablePro/Core/MCP/MCPAuthGuard.swift | 21 +++ .../MCP/MCPToolHandler+Integrations.swift | 7 +- TablePro/Core/MCP/MCPToolHandler.swift | 5 +- .../Connection/DatabaseConnection.swift | 12 ++ .../MCP/MCPToolHandlerIntegrationTests.swift | 137 +++++++++++++++++- 5 files changed, 178 insertions(+), 4 deletions(-) diff --git a/TablePro/Core/MCP/MCPAuthGuard.swift b/TablePro/Core/MCP/MCPAuthGuard.swift index deaac12c7..7743f876b 100644 --- a/TablePro/Core/MCP/MCPAuthGuard.swift +++ b/TablePro/Core/MCP/MCPAuthGuard.swift @@ -72,6 +72,27 @@ actor MCPAuthGuard { } } + func checkExternalAccessLevel( + connectionId: UUID, + requires required: ExternalAccessLevel + ) async throws { + let externalAccess: ExternalAccessLevel? = await MainActor.run { + ConnectionStorage.shared.loadConnections().first { $0.id == connectionId }?.externalAccess + } + + guard let externalAccess else { + throw MCPError.forbidden( + String(localized: "Connection not found") + ) + } + + guard externalAccess.satisfies(required) else { + throw MCPError.forbidden( + String(localized: "Connection is read-only for external clients") + ) + } + } + func checkExternalWritePermission( connectionId: UUID, sql: String, diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 3f85d0285..5e5111d69 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -123,6 +123,7 @@ extension MCPToolHandler { let connectionId = try requireUUID(args, key: "connection_id") if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -153,6 +154,7 @@ extension MCPToolHandler { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -198,8 +200,9 @@ extension MCPToolHandler { throw MCPError.notFound("tab") } - if let connectionId = outcome.2, let token { - try checkTokenConnectionAccess(token, connectionId: connectionId) + if let connectionId = outcome.2 { + if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) } var dict: [String: JSONValue] = [ diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 074ba0fce..23867ba74 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -5,7 +5,7 @@ final class MCPToolHandler: Sendable { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPToolHandler") private let bridge: MCPConnectionBridge - private let authGuard: MCPAuthGuard + let authGuard: MCPAuthGuard init(bridge: MCPConnectionBridge, authGuard: MCPAuthGuard) { self.bridge = bridge @@ -393,6 +393,7 @@ final class MCPToolHandler: Sendable { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) var queries: [(label: String, sql: String)] = [] @@ -488,6 +489,7 @@ final class MCPToolHandler: Sendable { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) let result = try await bridge.switchDatabase(connectionId: connectionId, database: database) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -499,6 +501,7 @@ final class MCPToolHandler: Sendable { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) let result = try await bridge.switchSchema(connectionId: connectionId, schema: schema) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) diff --git a/TablePro/Models/Connection/DatabaseConnection.swift b/TablePro/Models/Connection/DatabaseConnection.swift index 8924a79f6..087dcac5b 100644 --- a/TablePro/Models/Connection/DatabaseConnection.swift +++ b/TablePro/Models/Connection/DatabaseConnection.swift @@ -160,6 +160,18 @@ enum ExternalAccessLevel: String, Codable, Sendable, CaseIterable, Identifiable case .readWrite: return String(localized: "Read-Write") } } + + private var rank: Int { + switch self { + case .blocked: 0 + case .readOnly: 1 + case .readWrite: 2 + } + } + + func satisfies(_ required: ExternalAccessLevel) -> Bool { + rank >= required.rank + } } // MARK: - Connection Color diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index a31c1ae25..5be35bd9b 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -87,7 +87,7 @@ struct MCPToolHandlerIntegrationTests { @Test("blockedExternalConnectionIds returns ids of connections with externalAccess == .blocked") func blockedExternalConnectionIdsHelper() async throws { let blocked = DatabaseConnection(name: "Blocked", type: .mysql, externalAccess: .blocked) - let readOnly = DatabaseConnection(name: "ReadOnly", type: .mysql, externalAccess: .readOnly) + let readOnly = DatabaseConnection(name: "ReadOnly", type: .mysql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) let readWrite = DatabaseConnection(name: "ReadWrite", type: .mysql, externalAccess: .readWrite) try await withConnections([blocked, readOnly, readWrite]) { let ids = MCPToolHandler.blockedExternalConnectionIds() @@ -306,6 +306,141 @@ struct MCPToolHandlerIntegrationTests { #expect(!payload.contains("outside_\(marker)")) } + // MARK: - External access readOnly enforcement + + @Test("switch_database against a readOnly connection returns forbidden") + func switchDatabaseDeniedByReadOnlyExternalAccess() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "ReadOnly", type: .mysql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "switch_database", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "database": .string("postgres") + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for readOnly externalAccess") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("switch_schema against a readOnly connection returns forbidden") + func switchSchemaDeniedByReadOnlyExternalAccess() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "ReadOnly", type: .postgresql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "switch_schema", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "schema": .string("public") + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for readOnly externalAccess") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("export_data against a readOnly connection returns forbidden") + func exportDataDeniedByReadOnlyExternalAccess() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "ReadOnly", type: .mysql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "export_data", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "format": .string("csv"), + "tables": .array([.string("users")]) + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for readOnly externalAccess") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("open_connection_window against a readOnly connection returns forbidden") + func openConnectionWindowDeniedByReadOnlyExternalAccess() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "ReadOnly", type: .mysql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "open_connection_window", + arguments: .object(["connection_id": .string(connection.id.uuidString)]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for readOnly externalAccess") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("open_table_tab against a readOnly connection returns forbidden") + func openTableTabDeniedByReadOnlyExternalAccess() async throws { + let handler = makeHandler() + let connection = DatabaseConnection(name: "ReadOnly", type: .mysql, aiPolicy: .alwaysAllow, externalAccess: .readOnly) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "open_table_tab", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "table_name": .string("users") + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.forbidden for readOnly externalAccess") + } catch let error as MCPError { + if case .forbidden = error { return } + Issue.record("Expected forbidden, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("ExternalAccessLevel.satisfies follows blocked < readOnly < readWrite ordering") + func externalAccessLevelSatisfiesOrdering() { + #expect(ExternalAccessLevel.readWrite.satisfies(.readWrite)) + #expect(ExternalAccessLevel.readWrite.satisfies(.readOnly)) + #expect(ExternalAccessLevel.readOnly.satisfies(.readOnly)) + #expect(!ExternalAccessLevel.readOnly.satisfies(.readWrite)) + #expect(!ExternalAccessLevel.blocked.satisfies(.readOnly)) + #expect(!ExternalAccessLevel.blocked.satisfies(.readWrite)) + } + // MARK: - open_connection_window @Test("open_connection_window rejects missing connection_id") From 8a2ca0a0b17ad4ed16a9732d425f9a510132fd8f Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 13:20:24 +0700 Subject: [PATCH 36/83] fix(mcp): push search_query_history allowlist into SQL to avoid post-LIMIT trim --- .../MCP/MCPToolHandler+Integrations.swift | 36 ++++-- .../Core/Storage/QueryHistoryStorage.swift | 34 +++++- .../MCP/MCPToolHandlerIntegrationTests.swift | 105 ++++++++++++++++++ 3 files changed, 165 insertions(+), 10 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 5e5111d69..ff76b5638 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -80,6 +80,12 @@ extension MCPToolHandler { connectionId = nil } + let allowedConnectionIds = await resolveHistoryAllowlist( + token: token, + scopedConnectionId: connectionId, + blockedConnectionIds: blockedConnectionIds + ) + let entries = await QueryHistoryStorage.shared.fetchHistory( limit: limit, offset: 0, @@ -87,17 +93,11 @@ extension MCPToolHandler { searchText: query.isEmpty ? nil : query, dateFilter: .all, since: since, - until: until + until: until, + allowedConnectionIds: allowedConnectionIds ) - let allowed = token?.allowedConnectionIds - let filtered = entries.filter { entry in - guard !blockedConnectionIds.contains(entry.connectionId) else { return false } - if let allowed, !allowed.contains(entry.connectionId) { return false } - return true - } - - let payload = filtered.map { entry -> JSONValue in + let payload = entries.map { entry -> JSONValue in var dict: [String: JSONValue] = [ "id": .string(entry.id.uuidString), "query": .string(entry.query), @@ -221,6 +221,24 @@ extension MCPToolHandler { // MARK: - Helpers + private func resolveHistoryAllowlist( + token: MCPAuthToken?, + scopedConnectionId: UUID?, + blockedConnectionIds: Set + ) async -> Set? { + if scopedConnectionId != nil { + return nil + } + if let tokenAllowed = token?.allowedConnectionIds { + return tokenAllowed.subtracting(blockedConnectionIds) + } + guard !blockedConnectionIds.isEmpty else { return nil } + let allConnectionIds = await MainActor.run { + Set(ConnectionStorage.shared.loadConnections().map(\.id)) + } + return allConnectionIds.subtracting(blockedConnectionIds) + } + private func ensureConnectionExists(_ connectionId: UUID) async throws { let exists = await MainActor.run { ConnectionStorage.shared.loadConnections().contains { $0.id == connectionId } diff --git a/TablePro/Core/Storage/QueryHistoryStorage.swift b/TablePro/Core/Storage/QueryHistoryStorage.swift index 39f2761c4..6d7aac446 100644 --- a/TablePro/Core/Storage/QueryHistoryStorage.swift +++ b/TablePro/Core/Storage/QueryHistoryStorage.swift @@ -283,17 +283,30 @@ actor QueryHistoryStorage { searchText: String? = nil, dateFilter: DateFilter = .all, since: Date? = nil, - until: Date? = nil + until: Date? = nil, + allowedConnectionIds: Set? = nil ) -> [QueryHistoryEntry] { var entries: [QueryHistoryEntry] = [] + if let allowedConnectionIds, allowedConnectionIds.isEmpty { + return entries + } + let effectiveSince = [dateFilter.startDate, since].compactMap { $0 }.max() + let allowedList: [UUID]? + if let allowedConnectionIds { + allowedList = Array(allowedConnectionIds) + } else { + allowedList = nil + } + var sql: String var bindIndex: Int32 = 1 var hasConnectionFilter = false var hasSinceFilter = false var hasUntilFilter = false + var hasAllowedFilter = false if let searchText = searchText, !searchText.isEmpty { sql = """ @@ -308,6 +321,12 @@ actor QueryHistoryStorage { hasConnectionFilter = true } + if let allowedList { + let placeholders = Array(repeating: "?", count: allowedList.count).joined(separator: ", ") + sql += " AND h.connection_id IN (\(placeholders))" + hasAllowedFilter = true + } + if effectiveSince != nil { sql += " AND h.executed_at >= ?" hasSinceFilter = true @@ -328,6 +347,12 @@ actor QueryHistoryStorage { hasConnectionFilter = true } + if let allowedList { + let placeholders = Array(repeating: "?", count: allowedList.count).joined(separator: ", ") + whereClauses.append("connection_id IN (\(placeholders))") + hasAllowedFilter = true + } + if effectiveSince != nil { whereClauses.append("executed_at >= ?") hasSinceFilter = true @@ -365,6 +390,13 @@ actor QueryHistoryStorage { bindIndex += 1 } + if let allowedList, hasAllowedFilter { + for allowedId in allowedList { + sqlite3_bind_text(statement, bindIndex, allowedId.uuidString, -1, SQLITE_TRANSIENT) + bindIndex += 1 + } + } + if let effectiveSince, hasSinceFilter { sqlite3_bind_double(statement, bindIndex, effectiveSince.timeIntervalSince1970) bindIndex += 1 diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index 5be35bd9b..175538d2a 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -259,6 +259,111 @@ struct MCPToolHandlerIntegrationTests { } } + @Test("search_query_history pushes token allowlist into SQL so older allowed entries surface") + func searchQueryHistoryAllowlistOverFlood() async throws { + let handler = makeHandler() + let allowedConn = DatabaseConnection(name: "Allowed", type: .mysql) + let otherConn = DatabaseConnection(name: "Other", type: .mysql) + let marker = UUID().uuidString + let now = Date() + + try await withConnections([allowedConn, otherConn]) { + let oldAllowed = QueryHistoryEntry( + query: "SELECT old_allowed_\(marker)", + connectionId: allowedConn.id, + databaseName: "db", + executedAt: now.addingTimeInterval(-3_600), + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(oldAllowed) + + for index in 0..<20 { + let recentOther = QueryHistoryEntry( + query: "SELECT recent_other_\(marker)_\(index)", + connectionId: otherConn.id, + databaseName: "db", + executedAt: now.addingTimeInterval(Double(index)), + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(recentOther) + } + + let token = makeToken(allowedConnectionIds: [allowedConn.id]) + let result = try await handler.handleToolCall( + name: "search_query_history", + arguments: .object(["query": .string(marker), "limit": .int(5)]), + sessionId: "test-session", + token: token + ) + #expect(result.isError == nil) + let payload = result.content.first?.text ?? "" + #expect(payload.contains("old_allowed_\(marker)")) + #expect(!payload.contains("recent_other_\(marker)")) + } + } + + @Test("QueryHistoryStorage.fetchHistory restricts results to allowedConnectionIds") + func fetchHistoryAllowlistFilters() async throws { + let allowedId = UUID() + let otherId = UUID() + let marker = UUID().uuidString + + let allowedEntry = QueryHistoryEntry( + query: "SELECT allowed_\(marker)", + connectionId: allowedId, + databaseName: "db", + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + let otherEntry = QueryHistoryEntry( + query: "SELECT other_\(marker)", + connectionId: otherId, + databaseName: "db", + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(allowedEntry) + _ = await QueryHistoryStorage.shared.addHistory(otherEntry) + + let entries = await QueryHistoryStorage.shared.fetchHistory( + limit: 100, + searchText: marker, + allowedConnectionIds: [allowedId] + ) + + #expect(entries.contains { $0.query.contains("allowed_\(marker)") }) + #expect(!entries.contains { $0.query.contains("other_\(marker)") }) + } + + @Test("QueryHistoryStorage.fetchHistory returns empty when allowedConnectionIds is empty") + func fetchHistoryEmptyAllowlistReturnsEmpty() async throws { + let connectionId = UUID() + let marker = UUID().uuidString + let entry = QueryHistoryEntry( + query: "SELECT empty_allowlist_\(marker)", + connectionId: connectionId, + databaseName: "db", + executionTime: 0.01, + rowCount: 1, + wasSuccessful: true + ) + _ = await QueryHistoryStorage.shared.addHistory(entry) + + let entries = await QueryHistoryStorage.shared.fetchHistory( + limit: 100, + searchText: marker, + allowedConnectionIds: [] + ) + + #expect(entries.isEmpty) + } + @Test("search_query_history with since/until filters by executed_at window") func searchQueryHistorySinceUntilFilters() async throws { let handler = makeHandler() From 8fb9141018651fb85a445b3f6197ac2a3a11a3f8 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 28 Apr 2026 13:28:11 +0700 Subject: [PATCH 37/83] docs: drop em dashes from pairing redirect format section --- docs/external-api/pairing.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/external-api/pairing.mdx b/docs/external-api/pairing.mdx index c2a20471f..de1181bb0 100644 --- a/docs/external-api/pairing.mdx +++ b/docs/external-api/pairing.mdx @@ -95,8 +95,8 @@ The plaintext token is held in memory only. The token store keeps the hashed for TablePro opens the `redirect` URL with `NSWorkspace.shared.open(...)`. The encoding depends on the redirect scheme: -- **`raycast://...`** — TablePro appends `?context={"code":""}` (URL-encoded JSON). Raycast parses `context` and passes it to the receiving command as `LaunchProps.launchContext`. This matches Raycast's documented launch-context convention. -- **Anything else** (`http://127.0.0.1:/callback`, custom schemes) — TablePro appends `?code=` as a flat query parameter. Standard OAuth-callback shape. +- **`raycast://...`**: TablePro appends `?context={"code":""}` (URL-encoded JSON). Raycast parses `context` and passes it to the receiving command as `LaunchProps.launchContext`. This matches Raycast's documented launch-context convention. +- **Anything else** (`http://127.0.0.1:/callback`, custom schemes): TablePro appends `?code=` as a flat query parameter. Standard OAuth-callback shape. ### 6. Extension exchanges the code From 614a03a35dc4c081e7221a9d3d27834ef9a0268b Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 30 Apr 2026 21:12:11 +0700 Subject: [PATCH 38/83] chore: fix lint errors after rebase onto main --- .../MainContentCoordinator+Registry.swift | 44 ++++++++++++++++++ .../Views/Main/MainContentCoordinator.swift | 46 +------------------ .../Results/Cells/DataGridBaseCellView.swift | 2 +- .../Views/Results/DataGridCellFactory.swift | 2 +- 4 files changed, 47 insertions(+), 47 deletions(-) create mode 100644 TablePro/Views/Main/Extensions/MainContentCoordinator+Registry.swift diff --git a/TablePro/Views/Main/Extensions/MainContentCoordinator+Registry.swift b/TablePro/Views/Main/Extensions/MainContentCoordinator+Registry.swift new file mode 100644 index 000000000..9a766df2c --- /dev/null +++ b/TablePro/Views/Main/Extensions/MainContentCoordinator+Registry.swift @@ -0,0 +1,44 @@ +// +// MainContentCoordinator+Registry.swift +// TablePro +// + +import AppKit +import Foundation + +extension MainContentCoordinator { + static func allActiveCoordinators() -> [MainContentCoordinator] { + Array(activeCoordinators.values) + } + + static func coordinator(for windowId: UUID) -> MainContentCoordinator? { + activeCoordinators.values.first { $0.windowId == windowId } + } + + static func coordinator(forWindow window: NSWindow) -> MainContentCoordinator? { + activeCoordinators.values.first { $0.contentWindow === window } + } + + static func hasAnyUnsavedChanges() -> Bool { + activeCoordinators.values.contains { coordinator in + coordinator.changeManager.hasChanges + || coordinator.tabManager.tabs.contains { $0.pendingChanges.hasChanges } + } + } + + static func allTabs(for connectionId: UUID) -> [QueryTab] { + activeCoordinators.values + .filter { $0.connectionId == connectionId } + .flatMap { $0.tabManager.tabs } + } + + static func coordinator( + forConnection connectionId: UUID, + tabMatching predicate: (QueryTab) -> Bool + ) -> MainContentCoordinator? { + activeCoordinators.values.first { coordinator in + coordinator.connectionId == connectionId + && coordinator.tabManager.tabs.contains(where: predicate) + } + } +} diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 674ee2419..f53ec1f6f 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -243,7 +243,7 @@ final class MainContentCoordinator { /// Registry of active coordinators for aggregated quit-time persistence. /// Keyed by ObjectIdentifier of each coordinator instance. - private static var activeCoordinators: [ObjectIdentifier: MainContentCoordinator] = [:] + static var activeCoordinators: [ObjectIdentifier: MainContentCoordinator] = [:] /// Register this coordinator so quit-time persistence can aggregate tabs. private func registerForPersistence() { @@ -255,50 +255,6 @@ final class MainContentCoordinator { Self.activeCoordinators.removeValue(forKey: ObjectIdentifier(self)) } - /// Find a coordinator by its window identifier. - static func coordinator(for windowId: UUID) -> MainContentCoordinator? { - activeCoordinators.values.first { $0.windowId == windowId } - } - - /// Find the coordinator whose `contentWindow` matches the given NSWindow. - /// Used by `TabWindowController` to dispatch NSWindowDelegate callbacks - /// to the correct coordinator without needing a shared registry key. - static func coordinator(forWindow window: NSWindow) -> MainContentCoordinator? { - activeCoordinators.values.first { $0.contentWindow === window } - } - - /// Check whether any active coordinator has unsaved edits. - static func hasAnyUnsavedChanges() -> Bool { - activeCoordinators.values.contains { coordinator in - coordinator.changeManager.hasChanges - || coordinator.tabManager.tabs.contains { $0.pendingChanges.hasChanges } - } - } - - /// Collect all tabs from all active coordinators for a given connectionId. - static func allTabs(for connectionId: UUID) -> [QueryTab] { - activeCoordinators.values - .filter { $0.connectionId == connectionId } - .flatMap { $0.tabManager.tabs } - } - - /// All currently active coordinators across windows. - static func allActiveCoordinators() -> [MainContentCoordinator] { - Array(activeCoordinators.values) - } - - /// Find the first coordinator for `connectionId` that owns a tab matching `predicate`. - /// Used to dedup cross-window tabs (Server Dashboard singleton, ER Diagram reuse). - static func coordinator( - forConnection connectionId: UUID, - tabMatching predicate: (QueryTab) -> Bool - ) -> MainContentCoordinator? { - activeCoordinators.values.first { coordinator in - coordinator.connectionId == connectionId - && coordinator.tabManager.tabs.contains(where: predicate) - } - } - /// Collect non-preview tabs for persistence. private static func aggregatedTabs(for connectionId: UUID) -> [QueryTab] { let coordinators = activeCoordinators.values diff --git a/TablePro/Views/Results/Cells/DataGridBaseCellView.swift b/TablePro/Views/Results/Cells/DataGridBaseCellView.swift index 369e88dee..9fc74090a 100644 --- a/TablePro/Views/Results/Cells/DataGridBaseCellView.swift +++ b/TablePro/Views/Results/Cells/DataGridBaseCellView.swift @@ -65,7 +65,7 @@ class DataGridBaseCellView: NSTableCellView { return view }() - required override init(frame frameRect: NSRect) { + override required init(frame frameRect: NSRect) { cellTextField = Self.makeTextField() super.init(frame: frameRect) commonInit() diff --git a/TablePro/Views/Results/DataGridCellFactory.swift b/TablePro/Views/Results/DataGridCellFactory.swift index ee2d3c6e2..433dd096e 100644 --- a/TablePro/Views/Results/DataGridCellFactory.swift +++ b/TablePro/Views/Results/DataGridCellFactory.swift @@ -13,7 +13,7 @@ final class DataGridCellFactory { private static let sampleRowCount = 30 private static let maxMeasureChars = 50 - private static let headerFont: NSFont = NSFont.systemFont(ofSize: 13, weight: .semibold) + private static let headerFont = NSFont.systemFont(ofSize: 13, weight: .semibold) func calculateColumnWidth(for columnName: String) -> CGFloat { let attributes: [NSAttributedString.Key: Any] = [.font: Self.headerFont] From af0a5d479f99791f03218523a136deae506c6b3c Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 30 Apr 2026 21:44:05 +0700 Subject: [PATCH 39/83] fix(mcp): run auth checks before raising window in focus_query_tab --- .../MCP/MCPToolHandler+Integrations.swift | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index ff76b5638..e9d0df1ea 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -184,35 +184,44 @@ extension MCPToolHandler { func handleFocusQueryTab(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { let tabId = try requireUUID(args, key: "tab_id") - let outcome = await MainActor.run { () -> (Bool, UUID?, UUID?) in + let resolved = await MainActor.run { () -> (hasWindow: Bool, windowId: UUID?, connectionId: UUID?)? in for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { - if let window = snapshot.window { - NSApp.activate(ignoringOtherApps: true) - window.makeKeyAndOrderFront(nil) - return (true, snapshot.windowId, snapshot.connectionId) - } - return (false, snapshot.windowId, snapshot.connectionId) + return (snapshot.window != nil, snapshot.windowId, snapshot.connectionId) } - return (false, nil, nil) + return nil } - guard outcome.0 else { + guard let resolved, resolved.hasWindow else { throw MCPError.notFound("tab") } - if let connectionId = outcome.2 { + if let connectionId = resolved.connectionId { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) } + let raised = await MainActor.run { () -> Bool in + for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { + guard let window = snapshot.window else { return false } + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + return true + } + return false + } + + guard raised else { + throw MCPError.notFound("tab") + } + var dict: [String: JSONValue] = [ "status": "focused", "tab_id": .string(tabId.uuidString) ] - if let windowId = outcome.1 { + if let windowId = resolved.windowId { dict["window_id"] = .string(windowId.uuidString) } - if let connectionId = outcome.2 { + if let connectionId = resolved.connectionId { dict["connection_id"] = .string(connectionId.uuidString) } From a2c09ce6eed5db8725fdfe2fb17a6041bcc888b2 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:47:47 +0700 Subject: [PATCH 40/83] fix(mcp): validate and gate export_data table names against SQL injection --- TablePro/Core/MCP/MCPToolHandler.swift | 36 ++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 23867ba74..1b48ccee9 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -395,10 +395,10 @@ final class MCPToolHandler: Sendable { try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + let (databaseType, safeModeLevel, _) = try await resolveConnectionMeta(connectionId) var queries: [(label: String, sql: String)] = [] if let query { - let (databaseType, safeModeLevel, _) = try await resolveConnectionMeta(connectionId) try await authGuard.checkQueryPermission( sql: query, connectionId: connectionId, @@ -407,8 +407,18 @@ final class MCPToolHandler: Sendable { ) queries.append((label: "query", sql: query)) } else if let tables { + let quoteIdentifier = Self.identifierQuoter(for: databaseType) for table in tables { - queries.append((label: table, sql: "SELECT * FROM \(table) LIMIT \(maxRows)")) + try Self.validateExportTableName(table) + let quoted = Self.quoteQualifiedIdentifier(table, quoter: quoteIdentifier) + let sql = "SELECT * FROM \(quoted) LIMIT \(maxRows)" + try await authGuard.checkQueryPermission( + sql: sql, + connectionId: connectionId, + databaseType: databaseType, + safeModeLevel: safeModeLevel + ) + queries.append((label: table, sql: sql)) } } @@ -614,6 +624,28 @@ final class MCPToolHandler: Sendable { } } + static func validateExportTableName(_ table: String) throws { + let pattern = "^[A-Za-z0-9_][A-Za-z0-9_.]*$" + guard table.range(of: pattern, options: .regularExpression) != nil else { + throw MCPError.invalidParams( + "Invalid table name: '\(table)'. Allowed characters: letters, digits, underscore, and '.' for schema-qualified names." + ) + } + } + + static func identifierQuoter(for databaseType: DatabaseType) -> (String) -> String { + if let dialect = try? resolveSQLDialect(for: databaseType) { + return quoteIdentifierFromDialect(dialect) + } + return { "\"\($0.replacingOccurrences(of: "\"", with: "\"\""))\"" } + } + + static func quoteQualifiedIdentifier(_ identifier: String, quoter: (String) -> String) -> String { + identifier.split(separator: ".", omittingEmptySubsequences: false) + .map { quoter(String($0)) } + .joined(separator: ".") + } + func encodeJSON(_ value: JSONValue) -> String { let encoder = JSONEncoder() encoder.outputFormatting = [.sortedKeys] From 99830087f77be91b17153e5f478840bdcb8028b4 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:48:44 +0700 Subject: [PATCH 41/83] fix(mcp): allow readOnly tokens to navigate window/tab/focus tools --- TablePro/Core/MCP/MCPToolHandler+Integrations.swift | 6 +++--- TablePro/Core/MCP/MCPToolHandler.swift | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index e9d0df1ea..74b77098c 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -123,7 +123,7 @@ extension MCPToolHandler { let connectionId = try requireUUID(args, key: "connection_id") if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -154,7 +154,7 @@ extension MCPToolHandler { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -197,7 +197,7 @@ extension MCPToolHandler { if let connectionId = resolved.connectionId { if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) } let raised = await MainActor.run { () -> Bool in diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 1b48ccee9..86cdef699 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -128,8 +128,7 @@ final class MCPToolHandler: Sendable { switch toolName { case "confirm_destructive_operation": return .fullAccess - case "switch_database", "switch_schema", "export_data", - "open_connection_window", "open_table_tab", "focus_query_tab": + case "switch_database", "switch_schema", "export_data": return .readWrite default: return .readOnly From 699261406064a0f6d1bfc5c112bf52cd2c950995 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:49:00 +0700 Subject: [PATCH 42/83] fix(mcp): filter list_connections by token allowed connection ids --- TablePro/Core/MCP/MCPToolHandler.swift | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 86cdef699..2f0e11363 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -54,7 +54,7 @@ final class MCPToolHandler: Sendable { ) async throws -> MCPToolResult { switch name { case "list_connections": - return try await handleListConnections() + return try await handleListConnections(token: token) case "connect": return try await handleConnect(arguments, sessionId: sessionId, token: token) case "disconnect": @@ -142,9 +142,29 @@ final class MCPToolHandler: Sendable { } } - private func handleListConnections() async throws -> MCPToolResult { + private func handleListConnections(token: MCPAuthToken?) async throws -> MCPToolResult { let result = await bridge.listConnections() - return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) + let filtered = filterConnectionsByToken(result, token: token) + return MCPToolResult(content: [.text(encodeJSON(filtered))], isError: nil) + } + + private func filterConnectionsByToken(_ value: JSONValue, token: MCPAuthToken?) -> JSONValue { + guard let allowed = token?.allowedConnectionIds, !allowed.isEmpty else { return value } + guard case .object(var dict) = value, + let entries = dict["connections"]?.arrayValue + else { + return value + } + let filtered = entries.filter { entry in + guard let idString = entry["id"]?.stringValue, + let id = UUID(uuidString: idString) + else { + return false + } + return allowed.contains(id) + } + dict["connections"] = .array(filtered) + return .object(dict) } private func handleConnect(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { From c9cbd55e31e10b1075c841c6a1555e3e3697b5fe Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:49:13 +0700 Subject: [PATCH 43/83] fix(mcp): refuse focus_query_tab on tabs without a connection --- TablePro/Core/MCP/MCPToolHandler+Integrations.swift | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 74b77098c..aba0cce6c 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -195,10 +195,11 @@ extension MCPToolHandler { throw MCPError.notFound("tab") } - if let connectionId = resolved.connectionId { - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) + guard let connectionId = resolved.connectionId else { + throw MCPError.notFound("connection") } + if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) let raised = await MainActor.run { () -> Bool in for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { @@ -216,14 +217,12 @@ extension MCPToolHandler { var dict: [String: JSONValue] = [ "status": "focused", - "tab_id": .string(tabId.uuidString) + "tab_id": .string(tabId.uuidString), + "connection_id": .string(connectionId.uuidString) ] if let windowId = resolved.windowId { dict["window_id"] = .string(windowId.uuidString) } - if let connectionId = resolved.connectionId { - dict["connection_id"] = .string(connectionId.uuidString) - } return MCPToolResult(content: [.text(encodeJSON(.object(dict)))], isError: nil) } From 7def027dee9d3e61ca8e43f68045e8780b14ce4a Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:49:47 +0700 Subject: [PATCH 44/83] fix(mcp): restrict export_data output path to Downloads directory --- TablePro/Core/MCP/MCPRouter.swift | 2 +- TablePro/Core/MCP/MCPToolHandler.swift | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index bcba46603..7f4f53f38 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -822,7 +822,7 @@ extension MCPRouter { ]), "output_path": .object([ "type": "string", - "description": "File path to save export (returns inline data if omitted)" + "description": "File path inside the user's Downloads directory (returns inline data if omitted). Paths outside Downloads are rejected." ]), "max_rows": .object([ "type": "integer", diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 2f0e11363..785964294 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -483,6 +483,8 @@ final class MCPToolHandler: Sendable { } if let outputPath { + let fileURL = try Self.sandboxedDownloadsURL(for: outputPath) + let fullContent: String if exportResults.count == 1, let data = exportResults.first?["data"]?.stringValue @@ -492,11 +494,10 @@ final class MCPToolHandler: Sendable { fullContent = exportResults.compactMap { $0["data"]?.stringValue }.joined(separator: "\n\n") } - let fileURL = URL(fileURLWithPath: outputPath) try fullContent.write(to: fileURL, atomically: true, encoding: .utf8) let response: JSONValue = .object([ - "path": .string(outputPath), + "path": .string(fileURL.path), "rows_exported": .int(totalRowsExported) ]) return MCPToolResult(content: [.text(encodeJSON(response))], isError: nil) @@ -665,6 +666,22 @@ final class MCPToolHandler: Sendable { .joined(separator: ".") } + static func sandboxedDownloadsURL(for path: String) throws -> URL { + guard let downloads = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first else { + throw MCPError.invalidParams("Downloads directory is not available") + } + let downloadsRoot = downloads.standardizedFileURL.resolvingSymlinksInPath().path + let candidate = path.hasPrefix("/") ? URL(fileURLWithPath: path) : downloads.appendingPathComponent(path) + let resolvedPath = candidate.standardizedFileURL.resolvingSymlinksInPath().path + let prefix = downloadsRoot.hasSuffix("/") ? downloadsRoot : downloadsRoot + "/" + guard resolvedPath == downloadsRoot || resolvedPath.hasPrefix(prefix) else { + throw MCPError.invalidParams( + "output_path must be inside the Downloads directory (\(downloadsRoot))" + ) + } + return URL(fileURLWithPath: resolvedPath) + } + func encodeJSON(_ value: JSONValue) -> String { let encoder = JSONEncoder() encoder.outputFormatting = [.sortedKeys] From 8368530afdc196ddbc6fff82f0908bd832f4a2ac Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:50:11 +0700 Subject: [PATCH 45/83] refactor(mcp): rename history allowlist var to clarify token scope --- TablePro/Core/MCP/MCPToolHandler+Integrations.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index aba0cce6c..4e240334d 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -80,7 +80,7 @@ extension MCPToolHandler { connectionId = nil } - let allowedConnectionIds = await resolveHistoryAllowlist( + let tokenScopedAllowlist = await resolveHistoryAllowlist( token: token, scopedConnectionId: connectionId, blockedConnectionIds: blockedConnectionIds @@ -94,7 +94,7 @@ extension MCPToolHandler { dateFilter: .all, since: since, until: until, - allowedConnectionIds: allowedConnectionIds + allowedConnectionIds: tokenScopedAllowlist ) let payload = entries.map { entry -> JSONValue in From d423c677c9992b65e44c0d332902fddcb627c1ac Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:50:26 +0700 Subject: [PATCH 46/83] style(mcp): remove function comment in MCPAuthGuard --- TablePro/Core/MCP/MCPAuthGuard.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/TablePro/Core/MCP/MCPAuthGuard.swift b/TablePro/Core/MCP/MCPAuthGuard.swift index 7743f876b..0a4a78ba7 100644 --- a/TablePro/Core/MCP/MCPAuthGuard.swift +++ b/TablePro/Core/MCP/MCPAuthGuard.swift @@ -195,9 +195,6 @@ actor MCPAuthGuard { // MARK: - User Approval (askEachTime) private func promptUserApproval(connectionName: String, databaseType: String) async throws -> Bool { - // Use a task group so the actor suspends (freeing it for other requests) - // while the approval dialog is shown on the main thread. - // Race the dialog against a 30-second timeout. let approvalTask = Task { @MainActor in NSApp.requestUserAttention(.criticalRequest) NSApp.activate(ignoringOtherApps: true) From 80d72a7671d70718fe698ac174a5125ccd616d20 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:51:37 +0700 Subject: [PATCH 47/83] test(mcp): add export_data table injection regression tests --- TablePro/Core/MCP/MCPToolHandler.swift | 11 +- .../Core/MCP/MCPToolHandlerExportTests.swift | 183 ++++++++++++++++++ 2 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 TableProTests/Core/MCP/MCPToolHandlerExportTests.swift diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 785964294..c9679d5d3 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -410,6 +410,16 @@ final class MCPToolHandler: Sendable { throw MCPError.invalidParams("Either 'query' or 'tables' must be provided") } + if let tables { + for table in tables { + try Self.validateExportTableName(table) + } + } + + if let outputPath { + _ = try Self.sandboxedDownloadsURL(for: outputPath) + } + if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) @@ -428,7 +438,6 @@ final class MCPToolHandler: Sendable { } else if let tables { let quoteIdentifier = Self.identifierQuoter(for: databaseType) for table in tables { - try Self.validateExportTableName(table) let quoted = Self.quoteQualifiedIdentifier(table, quoter: quoteIdentifier) let sql = "SELECT * FROM \(quoted) LIMIT \(maxRows)" try await authGuard.checkQueryPermission( diff --git a/TableProTests/Core/MCP/MCPToolHandlerExportTests.swift b/TableProTests/Core/MCP/MCPToolHandlerExportTests.swift new file mode 100644 index 000000000..b1be3ae00 --- /dev/null +++ b/TableProTests/Core/MCP/MCPToolHandlerExportTests.swift @@ -0,0 +1,183 @@ +// +// MCPToolHandlerExportTests.swift +// TableProTests +// + +import Foundation +import Testing + +@testable import TablePro + +@Suite("MCP Tool Handler — export_data validation", .serialized) +@MainActor +struct MCPToolHandlerExportTests { + private let storage = ConnectionStorage.shared + + private func makeHandler() -> MCPToolHandler { + MCPToolHandler(bridge: MCPConnectionBridge(), authGuard: MCPAuthGuard()) + } + + private func withConnections( + _ connections: [DatabaseConnection], + body: () async throws -> Void + ) async throws { + let original = storage.loadConnections() + defer { storage.saveConnections(original) } + storage.saveConnections(connections) + try await body() + } + + @Test("export_data rejects table name with SQL injection payload") + func exportDataRejectsInjectionInTableName() async throws { + let handler = makeHandler() + let connection = DatabaseConnection( + name: "Target", + type: .mysql, + aiPolicy: .alwaysAllow, + externalAccess: .readWrite + ) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "export_data", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "format": .string("csv"), + "tables": .array([.string("users; DROP TABLE users;--")]) + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams for malicious table name") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("export_data rejects table name with quote payload") + func exportDataRejectsQuotePayload() async throws { + let handler = makeHandler() + let connection = DatabaseConnection( + name: "Target", + type: .mysql, + aiPolicy: .alwaysAllow, + externalAccess: .readWrite + ) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "export_data", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "format": .string("csv"), + "tables": .array([.string("users`; DROP TABLE x;--")]) + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams for backtick injection") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } + + @Test("validateExportTableName accepts simple identifiers") + func validateExportTableNameAcceptsSimple() throws { + try MCPToolHandler.validateExportTableName("users") + try MCPToolHandler.validateExportTableName("users_v2") + try MCPToolHandler.validateExportTableName("public.users") + try MCPToolHandler.validateExportTableName("schema.table_name_42") + } + + @Test("validateExportTableName rejects spaces") + func validateExportTableNameRejectsSpaces() { + do { + try MCPToolHandler.validateExportTableName("users x") + Issue.record("Expected throw for table name with space") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("validateExportTableName rejects semicolon") + func validateExportTableNameRejectsSemicolon() { + do { + try MCPToolHandler.validateExportTableName("users;DROP TABLE x") + Issue.record("Expected throw for table name with semicolon") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("validateExportTableName rejects empty string") + func validateExportTableNameRejectsEmpty() { + do { + try MCPToolHandler.validateExportTableName("") + Issue.record("Expected throw for empty table name") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("validateExportTableName rejects leading dot") + func validateExportTableNameRejectsLeadingDot() { + do { + try MCPToolHandler.validateExportTableName(".users") + Issue.record("Expected throw for table name with leading dot") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("export_data rejects output_path outside Downloads") + func exportDataRejectsPathOutsideDownloads() async throws { + let handler = makeHandler() + let connection = DatabaseConnection( + name: "Target", + type: .mysql, + aiPolicy: .alwaysAllow, + externalAccess: .readWrite + ) + try await withConnections([connection]) { + do { + _ = try await handler.handleToolCall( + name: "export_data", + arguments: .object([ + "connection_id": .string(connection.id.uuidString), + "format": .string("csv"), + "query": .string("SELECT 1"), + "output_path": .string("/tmp/escape.csv") + ]), + sessionId: "test-session", + token: nil + ) + Issue.record("Expected MCPError.invalidParams for path outside Downloads") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + } +} From 90b9527466db3200a7b8df75693d8ce02d49479e Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 00:52:18 +0700 Subject: [PATCH 48/83] fix(mcp): treat empty allowedConnectionIds set as no-access in list_connections --- TablePro/Core/MCP/MCPToolHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index c9679d5d3..2b6d9735f 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -149,7 +149,7 @@ final class MCPToolHandler: Sendable { } private func filterConnectionsByToken(_ value: JSONValue, token: MCPAuthToken?) -> JSONValue { - guard let allowed = token?.allowedConnectionIds, !allowed.isEmpty else { return value } + guard let allowed = token?.allowedConnectionIds else { return value } guard case .object(var dict) = value, let entries = dict["connections"]?.arrayValue else { From ae3de897d90afcab339bc46bef4655f4a0ef1bac Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 01:11:12 +0700 Subject: [PATCH 49/83] fix(deeplink): support schema-qualified table URL path --- TablePro/AppDelegate+FileOpen.swift | 4 ++-- .../Infrastructure/DeeplinkHandler.swift | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index 64d7505ea..d5a5e12ac 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -172,10 +172,10 @@ extension AppDelegate { case .connect(let connectionId): connectViaDeeplink(connectionId: connectionId) - case .openTable(let connectionId, let table, let database): + case .openTable(let connectionId, let table, let database, let schema): connectViaDeeplink(connectionId: connectionId) { resolvedId in EditorTabPayload(connectionId: resolvedId, tabType: .table, - tableName: table, databaseName: database) + tableName: table, databaseName: database, schemaName: schema) } case .openQuery(let connectionId, let sql): diff --git a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift b/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift index 83f89e9d1..8223851ca 100644 --- a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift +++ b/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift @@ -21,7 +21,7 @@ struct PairingExchange: Sendable, Equatable { enum DeeplinkAction { case connect(connectionId: UUID) - case openTable(connectionId: UUID, tableName: String, databaseName: String?) + case openTable(connectionId: UUID, tableName: String, databaseName: String?, schemaName: String?) case openQuery(connectionId: UUID, sql: String) case importConnection(ExportableConnection) case pairIntegration(PairingRequest) @@ -69,17 +69,27 @@ enum DeeplinkHandler { return .openQuery(connectionId: connectionId, sql: sql) } + if components.count == 7, + components[1] == "database", + components[3] == "schema", + components[5] == "table", + let dbName = components[2].removingPercentEncoding, + let schemaName = components[4].removingPercentEncoding, + let tableName = components[6].removingPercentEncoding { + return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName, schemaName: schemaName) + } + if components.count == 5, components[1] == "database", components[3] == "table", let dbName = components[2].removingPercentEncoding, let tableName = components[4].removingPercentEncoding { - return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName) + return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName, schemaName: nil) } if components.count >= 3, components[1] == "table", let tableName = components[2].removingPercentEncoding { - return .openTable(connectionId: connectionId, tableName: tableName, databaseName: nil) + return .openTable(connectionId: connectionId, tableName: tableName, databaseName: nil, schemaName: nil) } if components.count == 1 { From 2810452454f92cf67fb5d409b4ae8d87f98793d6 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 01:25:10 +0700 Subject: [PATCH 50/83] fix(mcp): handle OPTIONS preflight on integrations exchange endpoint --- TablePro/Core/MCP/MCPRouter.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index 7f4f53f38..a47305a02 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -983,6 +983,9 @@ extension MCPRouter { } func handleIntegrationsExchange(_ request: HTTPRequest) async -> RouteResult { + if request.method == .options { + return .noContent + } guard request.method == .post else { return .httpError(status: 405, message: "Method not allowed") } From fd1ee94e191d95041bdd30340522c9cf8e7586a2 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 01:41:39 +0700 Subject: [PATCH 51/83] fix(mcp): guard pairing approval continuation against double resume --- .../Sections/PairingApprovalSheet.swift | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift index dd9d65b4e..8750ed913 100644 --- a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift +++ b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift @@ -16,12 +16,11 @@ struct PairingApproval: Sendable { enum PairingApprovalPresenter { static func present(request: PairingRequest) async throws -> PairingApproval { try await withCheckedThrowingContinuation { continuation in + var deliver: ((Result) -> Void)? let host = NSHostingController( rootView: PairingApprovalSheet( request: request, - onComplete: { result in - continuation.resume(with: result) - } + onComplete: { result in deliver?(result) } ) ) host.view.frame = NSRect(x: 0, y: 0, width: 520, height: 560) @@ -32,17 +31,17 @@ enum PairingApprovalPresenter { sheetWindow.title = String(localized: "Approve Integration") sheetWindow.isReleasedWhenClosed = false - host.rootView = PairingApprovalSheet( - request: request, - onComplete: { result in - if let parent { - parent.endSheet(sheetWindow) - } else { - sheetWindow.close() - } - continuation.resume(with: result) + var resolved = false + deliver = { result in + guard !resolved else { return } + resolved = true + if let parent { + parent.endSheet(sheetWindow) + } else { + sheetWindow.close() } - ) + continuation.resume(with: result) + } if let parent { parent.beginSheet(sheetWindow, completionHandler: nil) From 96dc93c8429f7502186ad4e4d0cf30bc45ec895d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 01:49:20 +0700 Subject: [PATCH 52/83] fix(deeplink): use restoreOrDefault intent for connect URL to avoid forcing query tab --- TablePro/AppDelegate+FileOpen.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index d5a5e12ac..21230d712 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -270,7 +270,7 @@ extension AppDelegate { NSWindow.allowsAutomaticWindowTabbing = false } - let deeplinkPayload = EditorTabPayload(connectionId: connection.id) + let deeplinkPayload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) WindowManager.shared.openTab(payload: deeplinkPayload) NSWindow.allowsAutomaticWindowTabbing = savedTabbing From c130db0c0621769ed5fd3e7b12facc71c7f5bc9e Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 01:57:38 +0700 Subject: [PATCH 53/83] fix(deeplink): suppress welcome window when handling tablepro URL on cold launch --- TablePro/AppDelegate+FileOpen.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index 21230d712..64f870353 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -86,8 +86,10 @@ extension AppDelegate { func handleOpenURLs(_ urls: [URL]) { let deeplinks = urls.filter { $0.scheme == "tablepro" } if !deeplinks.isEmpty { + suppressWelcomeWindow() Task { for url in deeplinks { await self.handleDeeplink(url) } + self.endFileOpenSuppression() } } From 17e8975332ec019a4aa5e8bb80afab9c33cb5f0a Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:02:36 +0700 Subject: [PATCH 54/83] fix(launch): skip auto-reconnect when a deeplink is being handled on cold launch --- TablePro/AppDelegate.swift | 48 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/TablePro/AppDelegate.swift b/TablePro/AppDelegate.swift index 50129031c..ec4fa2880 100644 --- a/TablePro/AppDelegate.swift +++ b/TablePro/AppDelegate.swift @@ -90,32 +90,34 @@ class AppDelegate: NSObject, NSApplicationDelegate { _ = QueryHistoryStorage.shared } - let settings = AppSettingsStorage.shared.loadGeneral() - if settings.startupBehavior == .reopenLast { - let connectionIds = AppSettingsStorage.shared.loadLastOpenConnectionIds() - if !connectionIds.isEmpty { - closeWelcomeWindowEagerly() - attemptAutoReconnectAll(connectionIds: connectionIds) - } else if let lastConnectionId = AppSettingsStorage.shared.loadLastConnectionId() { - // Backward compat: fall back to single lastConnectionId for upgrades - closeWelcomeWindowEagerly() - attemptAutoReconnect(connectionId: lastConnectionId) - } else { - // Crash recovery: if the app crashed before applicationWillTerminate - // could save the list, scan the TabState directory for connections - // that still have saved tab state on disk. - Task { @MainActor [weak self] in - let diskIds = await TabDiskActor.shared.connectionIdsWithSavedState() - if !diskIds.isEmpty { - self?.closeWelcomeWindowEagerly() - self?.attemptAutoReconnectAll(connectionIds: diskIds) - } else { - self?.closeRestoredMainWindows() + if isHandlingFileOpen { + closeRestoredMainWindows() + } else { + let settings = AppSettingsStorage.shared.loadGeneral() + if settings.startupBehavior == .reopenLast { + let connectionIds = AppSettingsStorage.shared.loadLastOpenConnectionIds() + if !connectionIds.isEmpty { + closeWelcomeWindowEagerly() + attemptAutoReconnectAll(connectionIds: connectionIds) + } else if let lastConnectionId = AppSettingsStorage.shared.loadLastConnectionId() { + closeWelcomeWindowEagerly() + attemptAutoReconnect(connectionId: lastConnectionId) + } else { + Task { @MainActor [weak self] in + guard let self, !self.isHandlingFileOpen else { return } + let diskIds = await TabDiskActor.shared.connectionIdsWithSavedState() + guard !self.isHandlingFileOpen else { return } + if !diskIds.isEmpty { + self.closeWelcomeWindowEagerly() + self.attemptAutoReconnectAll(connectionIds: diskIds) + } else { + self.closeRestoredMainWindows() + } } } + } else { + closeRestoredMainWindows() } - } else { - closeRestoredMainWindows() } // NOTE: These observers are not explicitly removed because AppDelegate From c697113af31cc36de3373a50f1e7f537d4f79c71 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:08:03 +0700 Subject: [PATCH 55/83] fix(launch): do not close restored windows when handling deeplink (race destroyed connection window) --- TablePro/AppDelegate.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/TablePro/AppDelegate.swift b/TablePro/AppDelegate.swift index ec4fa2880..fdc6ebc1d 100644 --- a/TablePro/AppDelegate.swift +++ b/TablePro/AppDelegate.swift @@ -90,9 +90,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { _ = QueryHistoryStorage.shared } - if isHandlingFileOpen { - closeRestoredMainWindows() - } else { + if !isHandlingFileOpen { let settings = AppSettingsStorage.shared.loadGeneral() if settings.startupBehavior == .reopenLast { let connectionIds = AppSettingsStorage.shared.loadLastOpenConnectionIds() From 675575c90cf21f9e2739183b7b539b1b0fe1a41c Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:23:33 +0700 Subject: [PATCH 56/83] fix(mcp): dedupe concurrent ai-access approval prompts via in-flight task --- TablePro/Core/MCP/MCPAuthGuard.swift | 36 ++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/TablePro/Core/MCP/MCPAuthGuard.swift b/TablePro/Core/MCP/MCPAuthGuard.swift index 0a4a78ba7..c4689f3d8 100644 --- a/TablePro/Core/MCP/MCPAuthGuard.swift +++ b/TablePro/Core/MCP/MCPAuthGuard.swift @@ -15,6 +15,14 @@ actor MCPAuthGuard { /// Per-session approved connections (for askEachTime policy) private var sessionApprovals: [String: Set] = [:] + /// In-flight approval prompts keyed by (sessionId, connectionId) to dedupe concurrent requests. + private var inFlightApprovals: [ApprovalKey: Task] = [:] + + private struct ApprovalKey: Hashable { + let sessionId: String + let connectionId: UUID + } + // MARK: - Connection Access Check func checkConnectionAccess(connectionId: UUID, sessionId: String) async throws { @@ -51,10 +59,30 @@ actor MCPAuthGuard { break } - let userApproved = try await promptUserApproval( - connectionName: snapshot.name, - databaseType: snapshot.databaseType - ) + let key = ApprovalKey(sessionId: sessionId, connectionId: connectionId) + let approvalTask: Task + if let existing = inFlightApprovals[key] { + approvalTask = existing + } else { + let connectionName = snapshot.name + let databaseType = snapshot.databaseType + approvalTask = Task { + try await self.promptUserApproval( + connectionName: connectionName, + databaseType: databaseType + ) + } + inFlightApprovals[key] = approvalTask + } + + let userApproved: Bool + do { + userApproved = try await approvalTask.value + inFlightApprovals.removeValue(forKey: key) + } catch { + inFlightApprovals.removeValue(forKey: key) + throw error + } if userApproved { sessionApprovals[sessionId, default: []].insert(connectionId) From df17ff495e2f855bba7e26c7c47a712dfbf9f6b3 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:33:09 +0700 Subject: [PATCH 57/83] fix(sidebar): mark sidebar loaded when schema already loaded by sibling window --- TablePro/Views/Main/MainContentCoordinator.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index d9dd408f6..83f60140c 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -638,9 +638,13 @@ final class MainContentCoordinator { /// Load schema only if the shared provider hasn't loaded yet func loadSchemaIfNeeded() async { let alreadyLoaded = await schemaProvider.isSchemaLoaded() - if !alreadyLoaded { - await loadSchema() + if alreadyLoaded { + if sidebarLoadingState == .idle { + sidebarLoadingState = .loaded + } + return } + await loadSchema() } /// Initialize view with connection info and load schema (legacy — used by first window) From b229880072335ed9cc72b3f29f8e1b9ab15fd4c8 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:54:29 +0700 Subject: [PATCH 58/83] fix(sidebar): render table list when tables binding has data, regardless of loading state machine --- TablePro/Views/Sidebar/SidebarView.swift | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/TablePro/Views/Sidebar/SidebarView.swift b/TablePro/Views/Sidebar/SidebarView.swift index b1aef4621..12dbaae01 100644 --- a/TablePro/Views/Sidebar/SidebarView.swift +++ b/TablePro/Views/Sidebar/SidebarView.swift @@ -121,15 +121,22 @@ struct SidebarView: View { @ViewBuilder private var tablesContent: some View { - switch coordinator?.sidebarLoadingState ?? (tables.isEmpty ? .idle : .loaded) { + let rawState = coordinator?.sidebarLoadingState ?? .idle + let effectiveState: SidebarLoadingState = { + if case .error = rawState { return rawState } + if !tables.isEmpty { return .loaded } + if case .loading = rawState { return .loading } + return rawState + }() + switch effectiveState { case .loading: loadingState case .error(let message): errorState(message: message) - case .loaded where tables.isEmpty: - emptyState case .loaded where !viewModel.searchText.isEmpty && filteredTables.isEmpty: noMatchState + case .loaded where tables.isEmpty: + emptyState case .loaded: tableList case .idle: From c8d2b7abd026a8b72efc6759b3ef9e3a3a5b36e4 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:56:53 +0700 Subject: [PATCH 59/83] fix(deeplink): skip placeholder window when deeplink targets specific tab content --- TablePro/AppDelegate+FileOpen.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index 64f870353..d2a991c0a 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -272,13 +272,14 @@ extension AppDelegate { NSWindow.allowsAutomaticWindowTabbing = false } - let deeplinkPayload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) - WindowManager.shared.openTab(payload: deeplinkPayload) + if makePayload == nil { + let deeplinkPayload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) + WindowManager.shared.openTab(payload: deeplinkPayload) + } NSWindow.allowsAutomaticWindowTabbing = savedTabbing Task { do { - // Confirm pre-connect script if present (deep links are external, so always confirm) if let script = connection.preConnectScript, !script.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { From a61013e50d9eed771d5ad93826cc863898184ce4 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 02:58:47 +0700 Subject: [PATCH 60/83] fix(sidebar): hydrate session.tables from cached schema provider when skipping reload --- TablePro/Views/Main/MainContentCoordinator.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 83f60140c..3eaff3215 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -639,6 +639,11 @@ final class MainContentCoordinator { func loadSchemaIfNeeded() async { let alreadyLoaded = await schemaProvider.isSchemaLoaded() if alreadyLoaded { + let cachedTables = await schemaProvider.getTables() + let sessionTables = DatabaseManager.shared.session(for: connectionId)?.tables ?? [] + if sessionTables.isEmpty && !cachedTables.isEmpty { + DatabaseManager.shared.updateSession(connectionId) { $0.tables = cachedTables } + } if sidebarLoadingState == .idle { sidebarLoadingState = .loaded } From 6281a71eb5efc16639b19f2cde98ed9f17fc07c5 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:07:11 +0700 Subject: [PATCH 61/83] fix(schema): hydrate session.tables from provider after loadSchema fetch --- TablePro/Views/Main/MainContentCoordinator.swift | 11 +++++++++++ TablePro/Views/Sidebar/SidebarView.swift | 1 + 2 files changed, 12 insertions(+) diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 3eaff3215..82c946750 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -672,7 +672,18 @@ final class MainContentCoordinator { func loadSchema() async { guard let driver = DatabaseManager.shared.driver(for: connectionId) else { return } + sidebarLoadingState = .loading await schemaProvider.loadSchema(using: driver, connection: connection) + let fetchedTables = await schemaProvider.getTables() + if !fetchedTables.isEmpty { + let sessionTables = DatabaseManager.shared.session(for: connectionId)?.tables ?? [] + if sessionTables != fetchedTables { + DatabaseManager.shared.updateSession(connectionId) { $0.tables = fetchedTables } + } + sidebarLoadingState = .loaded + } else { + sidebarLoadingState = .idle + } } func loadTableMetadata(tableName: String) async { diff --git a/TablePro/Views/Sidebar/SidebarView.swift b/TablePro/Views/Sidebar/SidebarView.swift index 12dbaae01..c554b71e1 100644 --- a/TablePro/Views/Sidebar/SidebarView.swift +++ b/TablePro/Views/Sidebar/SidebarView.swift @@ -11,6 +11,7 @@ import SwiftUI /// Sidebar view with segmented tab picker for Tables and Favorites struct SidebarView: View { + @State private var viewModel: SidebarViewModel @Binding var tables: [TableInfo] From 4f36ba6fe14fa63cd88735594e16a5e62971969b Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:15:05 +0700 Subject: [PATCH 62/83] fix(deeplink): route openTable into existing window's tab manager instead of new native window --- TablePro/AppDelegate+FileOpen.swift | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift index d2a991c0a..938cdeba1 100644 --- a/TablePro/AppDelegate+FileOpen.swift +++ b/TablePro/AppDelegate+FileOpen.swift @@ -256,7 +256,25 @@ extension AppDelegate { if DatabaseManager.shared.activeSessions[connection.id]?.driver != nil { if let payload = makePayload?(connection.id) { - WindowManager.shared.openTab(payload: payload) + if payload.tabType == .table, + let tableName = payload.tableName, + let coordinator = MainContentCoordinator.allActiveCoordinators() + .first(where: { $0.connectionId == connection.id }) { + if let window = coordinator.contentWindow { + window.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + } + Task { @MainActor in + if let dbName = payload.databaseName, !dbName.isEmpty, + let session = DatabaseManager.shared.session(for: connection.id), + dbName != session.activeDatabase { + await coordinator.switchDatabase(to: dbName) + } + coordinator.openTableTab(tableName) + } + } else { + WindowManager.shared.openTab(payload: payload) + } } else { for window in NSApp.windows where isMainWindow(window) { window.makeKeyAndOrderFront(nil) From 2ad01606dada76a76d5c091c548af1d3d82d9469 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:18:15 +0700 Subject: [PATCH 63/83] fix(mcp): auto-connect session when tool requires driver --- TablePro/Core/MCP/MCPConnectionBridge.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index cb7e27fd0..69207a00b 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -484,7 +484,14 @@ actor MCPConnectionBridge { // MARK: - Private Helpers private func resolveDriver(_ connectionId: UUID) async throws -> (DatabaseDriver, DatabaseType) { - try await MainActor.run { + let needsConnect = await MainActor.run { + DatabaseManager.shared.activeSessions[connectionId]?.driver == nil + } + if needsConnect { + let connection = try await resolveConnection(connectionId) + try await DatabaseManager.shared.connectToSession(connection) + } + return try await MainActor.run { guard let session = DatabaseManager.shared.activeSessions[connectionId], let driver = session.driver else { throw MCPError.notConnected(connectionId) From e6f5231ab1714da023d4fe522ada739671e9f28d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:29:33 +0700 Subject: [PATCH 64/83] fix(mcp): activate app before auto-connect so any prompt has a key window --- TablePro/Core/MCP/MCPConnectionBridge.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index 69207a00b..e5e73a052 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -484,11 +484,14 @@ actor MCPConnectionBridge { // MARK: - Private Helpers private func resolveDriver(_ connectionId: UUID) async throws -> (DatabaseDriver, DatabaseType) { - let needsConnect = await MainActor.run { - DatabaseManager.shared.activeSessions[connectionId]?.driver == nil + let needsConnect: DatabaseConnection? = await MainActor.run { + if DatabaseManager.shared.activeSessions[connectionId]?.driver != nil { return nil } + return ConnectionStorage.shared.loadConnections().first { $0.id == connectionId } } - if needsConnect { - let connection = try await resolveConnection(connectionId) + if let connection = needsConnect { + await MainActor.run { + NSApp.activate(ignoringOtherApps: true) + } try await DatabaseManager.shared.connectToSession(connection) } return try await MainActor.run { From 0a0b71f59eb5d01f1f19009447162ab77679149e Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:39:27 +0700 Subject: [PATCH 65/83] fix(mcp): dedupe concurrent auto-connect tasks for same connection --- TablePro/Core/MCP/MCPConnectionBridge.swift | 32 +++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index e5e73a052..e7f7cd9ed 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -11,6 +11,8 @@ import os actor MCPConnectionBridge { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPConnectionBridge") + private var inFlightConnects: [UUID: Task] = [:] + // MARK: - Connection Management func listConnections() async -> JSONValue { @@ -484,15 +486,12 @@ actor MCPConnectionBridge { // MARK: - Private Helpers private func resolveDriver(_ connectionId: UUID) async throws -> (DatabaseDriver, DatabaseType) { - let needsConnect: DatabaseConnection? = await MainActor.run { + let connection: DatabaseConnection? = await MainActor.run { if DatabaseManager.shared.activeSessions[connectionId]?.driver != nil { return nil } return ConnectionStorage.shared.loadConnections().first { $0.id == connectionId } } - if let connection = needsConnect { - await MainActor.run { - NSApp.activate(ignoringOtherApps: true) - } - try await DatabaseManager.shared.connectToSession(connection) + if let connection { + try await connectIfNeeded(connection) } return try await MainActor.run { guard let session = DatabaseManager.shared.activeSessions[connectionId], @@ -503,6 +502,27 @@ actor MCPConnectionBridge { } } + private func connectIfNeeded(_ connection: DatabaseConnection) async throws { + if let existing = inFlightConnects[connection.id] { + try await existing.value + return + } + let task = Task { + await MainActor.run { + NSApp.activate(ignoringOtherApps: true) + } + try await DatabaseManager.shared.connectToSession(connection) + } + inFlightConnects[connection.id] = task + do { + try await task.value + inFlightConnects.removeValue(forKey: connection.id) + } catch { + inFlightConnects.removeValue(forKey: connection.id) + throw error + } + } + private func resolveSession(_ connectionId: UUID) async throws -> ConnectionSession { try await MainActor.run { guard let session = DatabaseManager.shared.activeSessions[connectionId] else { From afc5e6ddba6459ed03a035b22311e8506812f382 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:44:46 +0700 Subject: [PATCH 66/83] fix(mcp): allow tool meta resolution from disk so auto-connect can run later --- TablePro/Core/MCP/MCPToolHandler.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 2b6d9735f..cdf135fb7 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -646,10 +646,13 @@ final class MCPToolHandler: Sendable { private func resolveConnectionMeta(_ connectionId: UUID) async throws -> (DatabaseType, SafeModeLevel, String) { try await MainActor.run { - guard let session = DatabaseManager.shared.activeSessions[connectionId] else { - throw MCPError.notConnected(connectionId) + if let session = DatabaseManager.shared.activeSessions[connectionId] { + return (session.connection.type, session.connection.safeModeLevel, session.activeDatabase) } - return (session.connection.type, session.connection.safeModeLevel, session.activeDatabase) + if let conn = ConnectionStorage.shared.loadConnections().first(where: { $0.id == connectionId }) { + return (conn.type, conn.safeModeLevel, conn.database) + } + throw MCPError.notConnected(connectionId) } } From 77aa01fc91fc7711a2b3081a2a942cf1ad8b74c2 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 03:50:34 +0700 Subject: [PATCH 67/83] fix(mcp): use defer for inFlightConnects cleanup --- TablePro/Core/MCP/MCPConnectionBridge.swift | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index e7f7cd9ed..770daeb0c 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -507,20 +507,12 @@ actor MCPConnectionBridge { try await existing.value return } - let task = Task { - await MainActor.run { - NSApp.activate(ignoringOtherApps: true) - } + let task = Task { [connection] in try await DatabaseManager.shared.connectToSession(connection) } inFlightConnects[connection.id] = task - do { - try await task.value - inFlightConnects.removeValue(forKey: connection.id) - } catch { - inFlightConnects.removeValue(forKey: connection.id) - throw error - } + defer { inFlightConnects.removeValue(forKey: connection.id) } + try await task.value } private func resolveSession(_ connectionId: UUID) async throws -> ConnectionSession { From f162f287f8ab768779b8684084a492dfc01a43ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Fri, 1 May 2026 16:32:35 +0700 Subject: [PATCH 68/83] refactor: typed lifecycle, single auth gate, imperative window factories (#958) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(mcp): app-modal auth alert, strip trailing semicolons, decode + as space * refactor(ui): centralize cross-process alerts in AlertHelper * refactor(concurrency): introduce OnceTask, migrate MCP dedup sites * refactor(mcp): replace router switch with route registry * refactor(schema): single SchemaService for sidebar state and table list (WIP) * refactor(mcp): MCPAuthPolicy gate, typed session/pairing lifecycles (WIP) * refactor(lifecycle): typed launch coordinator, grammar parser, tab router (WIP) * fix(refactor): post-merge build fixes for Wave 2 integration - Restore PairingRequest/PairingExchange types deleted with DeeplinkHandler - Add reason: label to AuthDecision.denied call sites in MCPAuthPolicy - Convert PairingApproval.allowedConnectionIds to ConnectionAccess - Mark TransientConnectionFactory @MainActor for ConnectionURLParser access - Rename AppLaunchCoordinator.didFinishLaunching property to hasFinishedLaunching - Drop tables binding from MainContentView preview (SchemaService now owns it) * refactor(welcome): imperative NSWindow factory replaces SwiftUI Scene auto-open Welcome window was the first SwiftUI Scene declared, so SwiftUI auto-opened it on every cold launch before AppLaunchCoordinator could check for pending intents. The coordinator orderOut'd the window after URL events arrived, but SwiftUI had already painted the welcome frame. Move Welcome to imperative NSWindow + NSHostingController pattern, matching how main windows are already created. AppLaunchCoordinator becomes the only place that decides whether welcome appears. - Add WelcomeWindowFactory with openOrFront / close / orderOut - Drop Window("Welcome to TablePro", id: "welcome") Scene from TableProApp - Drop openWelcomeWindow Notification.Name (no remaining posters) - Drop AppDelegate.configureWelcomeWindowStyle (factory owns style) - Drop AppDelegate.openWelcomeWindow private helper - Replace 7 openWindow/closeWindows(id: "welcome") sites with factory calls - Ignore .claude/worktrees, .profraw, scratch reference repos * chore(refactor): drop dead notifications, wire SQL file drain After the Wave-2 lifecycle refactor, several Notification.Name declarations have no posters or no listeners. Delete them and rewire the only path that still needed cross-component messaging. - Drop .openWelcomeWindow (factory replaced it) - Drop .openMainWindow (no posters; WindowManager.openTab is direct) - Drop .switchSchemaFromURL (TabRouter calls coordinator directly) - Drop .applyURLFilter (method on coordinator, not a notification) - Drop .connectionShareFileOpened, .deeplinkImportRequested (WelcomeRouter pendingImport replaces them) - Drop OpenWindowHandler.onReceive(.openMainWindow) (dead listener) - Wire WelcomeRouter pendingSQLFiles to .databaseDidConnect → posts .openSQLFiles for drain * refactor(connection-form): imperative NSWindow factory replaces SwiftUI Scene The connection-form WindowGroup was the only remaining declared Scene besides Settings, so SwiftUI auto-restored it on cold launch and produced the same flash bug the welcome refactor fixed. Apply the same imperative factory pattern to make the entire user-facing window lifecycle imperative and AppLaunchCoordinator-driven. - Add ConnectionFormWindowFactory (imperative open / close, per-id NSWindow) - Drop WindowGroup(id: "connection-form", for: UUID?.self) Scene - Replace 7 openWindow / closeWindows(id: "connection-form") sites - Replace OpenWindowHandler with SettingsNotificationBridge inside Settings (only forward .openSettingsWindow to SwiftUI's openSettings action) - Drop WindowOpener helper (no consumers after factory migration) - Drop @Environment(\\.openWindow) from ConnectionFormView and WelcomeWindowView - Drop WelcomeViewModel.setUp(openWindow:) signature; setUp() takes no args After this commit Settings is the only declared Scene, which is special: SwiftUI never auto-opens Settings on launch. * fix(tabrouter): focus existing table tab when deeplink targets already-open table Native macOS pattern: opening the same target twice focuses the existing window/tab, it does not create duplicates (Finder folders, Xcode files). Before opening a new native window tab from a deeplink, scan all active coordinators for a tab matching (connectionId, tabType: .table, tableName, optional database, optional schema). If found, select that tab and bring its window to front; skip openTab. If not found, fall through to creating a new tab as before. * fix(switcher): route through TabRouter so .restoreOrDefault intent applies Connection switcher built EditorTabPayload(connectionId:) directly with the type defaults (tabType: .query, intent: .openContent). That always forced a fresh empty query tab instead of restoring the user's last tabs or opening the connection's default tab. Single path: both switchToSession and connectToSaved now call TabRouter.route(.openConnection(id)). TabRouter focuses an existing window for the connection if any; otherwise creates a new window with intent: .restoreOrDefault and ensures the connection is live. Drop the manual NSWindow.tabbingMode = .disallowed workaround — per- connection tabbingIdentifier in WindowManager.openTab already prevents cross-connection tab merging when groupAllConnectionTabs is off. Drop the now-unused isConnecting per-row spinner state — popover dismisses synchronously now, so the spinner had no chance to render. * Update .gitignore * refactor(review): address PR #958 reviewer findings - MCPAuthPolicy.promptApproval: defer group.cancelAll() so timeout task cannot leak when the dialog task throws on a future code change - TabRouter.focusExistingTableTab: tighten matching so a deeplink that specifies a database does not match a tab whose databaseName is nil; similarly for schema - AlertHelper.swift: strip /// doc comments and inline // comments per CLAUDE.md "no comments" rule (function names are self-descriptive) - AppDelegate: drop configureConnectionFormWindowStyle, configuredWindows tracking, windowDidBecomeKey observer — ConnectionFormWindowFactory applies style at creation time, no post-hoc restyle needed - MCPConnectionBridge: drop unused connectDedup property and route connect/connectIfNeeded through DatabaseManager.ensureConnected so dedup lives in one place (manager-level OnceTask) - Delete dead MCPPendingPairing/MCPPairingRegistry — pairing service uses PairingExchangeStore + NSLock; the actor-based duplicate from Wave 2B was never wired up * fix(setup): always create default tab when restoreOrDefault has no persisted state handleRestoreOrDefault left the new window with zero tabs when restoreFromDisk returned an empty result (first-time connection, persistence cleared, etc.). Tab manager being empty causes updateWindowTitleAndFileState's fallback branch to use connection.name as the window title, so the user sees an empty "" tab next to any subsequent tab opened from a deeplink or Cmd+T. Hoist the "add default empty query tab" logic to a helper and run it in both paths: when other windows already exist for the connection, and when restoreFromDisk returns empty. Window now always has at least one tab. * fix(tabs): number new query tabs across all windows for the connection QueryTabManager.addTab defaulted the new tab title to nextQueryTitle computed against this manager's local tabs. Each window has its own tab manager, so a fresh window numbering its first tab always returned "Query 1" — even if a sibling window already had Query 1, Query 2. Inject globalTabsProvider into QueryTabManager. SessionStateFactory supplies a closure that returns MainContentCoordinator.allTabs(for: connectionId), so the title generator sees every existing query tab in the connection's tab group, not just this window's. The closure is lazy (called only when title is computed) so manager init stays decoupled from the registry's MainActor isolation at use time. The default empty closure keeps the type usable in tests and preserves a sensible per-window fallback when no provider is wired. * fix(setup): empty workspace as default for new connection (no auto query tab) Reverts the addDefaultEmptyTab fallback in handleRestoreOrDefault. Opening a fresh connection no longer creates a default "Query 1" tab — the window shows the existing emptyStateView placeholder ("No tabs open" + Cmd+T / click-a-table hint) instead. Native macOS pattern: opening a workspace shouldn't pre-fill content. The user explicitly creates content via Cmd+T, sidebar table click, Raycast deeplink, etc. The empty-tabs path is a supported state with proper UI. * refactor(tab-router): add openQuery dedup, route openTable through fast-path, drop fragile string match, fix openDatabaseURL double-open * refactor(polish): fix safeMode dialog window race, strip Sessions comments, type session-term reason, dedup preview tab, fix Cmd+1..9 guard, fix denial string format * refactor(routing): unify connection-open paths through TabRouter * refactor(persistence): track save Task, clear empty-payload files, escalate save errors * refactor(state): cross-window correctness + lifecycle leak fixes * refactor(round2-review): fix 9 PR #958 review findings Critical: - MCPServer.stop() runs cleanup handlers before clearing sessions so future handlers can read session data High: - TabRouter.focusExistingTableTab assigns tabManager.selectedTabId directly instead of delegating to coordinator.openTableTab — the latter has its own create-new-tab fast-path that produced duplicate tabs - SessionStateFactory tracks pending-expiration tasks per payload and cancels on consume; eliminates 5s dormant Task per successful window open - OnceTask.execute uses a generation counter so the defer cleanup only removes the entry when it still matches the caller's task; cancel + re-execute no longer evicts a sibling caller's in-flight task - SchemaService.load now joins the in-flight load when state is .loading instead of returning empty-handed; callers can await completion Medium: - Remove unused TabPersistenceCoordinator.saveNow(persistedTabs:) overload that lacked an empty-array guard - TabRouter.previewForSQL uses NSString.substring(to:) for O(1) head slice consistent with the project's NSString convention - WelcomeViewModel.awaitWelcomeRouterChange wraps the continuation in a ContinuationBox + withTaskCancellationHandler so deinit cancellation resolves cleanly instead of leaving a dormant Task Low: - Strip explanatory /// and inline comments from WindowManager, SessionStateFactory, TabDiskActor, TabPersistenceCoordinator, MCPServer per CLAUDE.md "no comments" rule --- CHANGELOG.md | 3 + TablePro.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/TablePro.xcscheme | 1 - TablePro/AppDelegate+ConnectionHandler.swift | 589 ----------------- TablePro/AppDelegate+FileOpen.swift | 354 ---------- TablePro/AppDelegate+WindowConfig.swift | 406 ------------ TablePro/AppDelegate.swift | 236 ++++--- TablePro/Core/Concurrency/OnceTask.swift | 52 ++ .../DatabaseManager+ConnectionState.swift | 20 + .../DatabaseManager+EnsureConnected.swift | 15 + .../Database/DatabaseManager+Health.swift | 3 + .../Database/DatabaseManager+Sessions.swift | 48 +- TablePro/Core/Database/DatabaseManager.swift | 2 + TablePro/Core/MCP/MCPAuthGuard.swift | 274 -------- TablePro/Core/MCP/MCPAuthPolicy.swift | 314 +++++++++ TablePro/Core/MCP/MCPConnectionBridge.swift | 78 +-- TablePro/Core/MCP/MCPHTTPParser.swift | 13 + TablePro/Core/MCP/MCPPairingService.swift | 5 +- TablePro/Core/MCP/MCPResourceHandler.swift | 20 +- TablePro/Core/MCP/MCPRouteHandler.swift | 7 + TablePro/Core/MCP/MCPRouter.swift | 617 +----------------- TablePro/Core/MCP/MCPServer.swift | 27 +- TablePro/Core/MCP/MCPServerManager.swift | 17 +- TablePro/Core/MCP/MCPSession.swift | 45 +- TablePro/Core/MCP/MCPSessionPhase.swift | 20 + TablePro/Core/MCP/MCPTokenStore.swift | 103 ++- .../MCP/MCPToolHandler+Integrations.swift | 60 +- TablePro/Core/MCP/MCPToolHandler.swift | 200 +++--- TablePro/Core/MCP/PairingTypes.swift | 14 + .../Routes/IntegrationsExchangeHandler.swift | 94 +++ .../Core/MCP/Routes/MCPProtocolHandler.swift | 533 +++++++++++++++ TablePro/Core/MCP/TokenPermissionFilter.swift | 47 ++ .../Infrastructure/AppLaunchCoordinator.swift | 226 +++++++ .../Infrastructure/AppNotifications.swift | 2 - .../ConnectionFormWindowFactory.swift | 60 ++ .../Infrastructure/DeeplinkHandler.swift | 300 --------- .../Infrastructure/DeeplinkParser.swift | 378 +++++++++++ .../Infrastructure/LaunchIntent.swift | 38 ++ .../Infrastructure/LaunchIntentRouter.swift | 95 +++ .../Services/Infrastructure/LaunchPhase.swift | 27 + .../MainSplitViewController.swift | 20 - .../Infrastructure/MainWindowToolbar.swift | 11 +- .../Infrastructure/PendingActionStore.swift | 28 - .../Infrastructure/SessionStateFactory.swift | 50 +- ...ersistenceCoordinator+AggregatedSave.swift | 33 + .../TabPersistenceCoordinator.swift | 72 +- .../Services/Infrastructure/TabRouter.swift | 426 ++++++++++++ .../Infrastructure/URLClassifier.swift | 48 ++ .../Infrastructure/WelcomeRouter.swift | 70 ++ .../Infrastructure/WelcomeWindowFactory.swift | 55 ++ .../Infrastructure/WindowManager.swift | 71 +- .../Infrastructure/WindowOpener.swift | 49 -- .../Core/Services/Query/SchemaService.swift | 87 +++ .../Core/Services/Query/SchemaState.swift | 13 + TablePro/Core/Storage/TabDiskActor.swift | 46 +- .../TransientConnectionFactory.swift | 71 ++ TablePro/Core/Utilities/UI/AlertHelper.swift | 179 +++-- .../Extensions/URL+SanitizedLogging.swift | 17 + .../Models/Connection/ConnectionSession.swift | 11 +- .../Connection/ConnectionToolbarState.swift | 3 + TablePro/Models/Query/QueryResult.swift | 2 +- TablePro/Models/Query/QueryTabManager.swift | 24 +- TablePro/Resources/Localizable.xcstrings | 187 +++++- TablePro/TableProApp.swift | 67 +- TablePro/ViewModels/SidebarViewModel.swift | 8 - TablePro/ViewModels/WelcomeViewModel.swift | 137 ++-- .../ConnectionFormView+Footer.swift | 4 +- .../ConnectionFormView+Helpers.swift | 33 +- .../Views/Connection/ConnectionFormView.swift | 2 - .../Connection/WelcomeContextMenus.swift | 4 +- .../Views/Connection/WelcomeWindowView.swift | 9 +- .../Main/Child/MainEditorContentView.swift | 2 +- .../MainContentCoordinator+Navigation.swift | 31 +- .../MainContentCoordinator+URLFilter.swift | 53 +- ...inContentCoordinator+WindowLifecycle.swift | 18 +- .../MainContentView+EventHandlers.swift | 15 +- .../MainContentView+Modifiers.swift | 1 - .../Extensions/MainContentView+Setup.swift | 26 +- .../Main/MainContentCommandActions.swift | 48 +- .../Views/Main/MainContentCoordinator.swift | 177 +++-- TablePro/Views/Main/MainContentView.swift | 12 +- .../Views/Settings/Sections/MCPSection.swift | 3 +- .../Sections/PairingApprovalSheet.swift | 43 -- TablePro/Views/Sidebar/SidebarView.swift | 28 +- .../Toolbar/ConnectionSwitcherPopover.swift | 55 +- .../Views/Toolbar/TableProToolbarView.swift | 10 +- .../Core/Concurrency/OnceTaskTests.swift | 186 ++++++ .../Core/Database/MultiConnectionTests.swift | 50 +- TableProTests/Core/MCP/MCPRouterTests.swift | 167 +++++ .../Models/ConnectionSessionTests.swift | 27 +- 90 files changed, 4314 insertions(+), 3820 deletions(-) delete mode 100644 TablePro/AppDelegate+ConnectionHandler.swift delete mode 100644 TablePro/AppDelegate+FileOpen.swift delete mode 100644 TablePro/AppDelegate+WindowConfig.swift create mode 100644 TablePro/Core/Concurrency/OnceTask.swift create mode 100644 TablePro/Core/Database/DatabaseManager+ConnectionState.swift create mode 100644 TablePro/Core/Database/DatabaseManager+EnsureConnected.swift delete mode 100644 TablePro/Core/MCP/MCPAuthGuard.swift create mode 100644 TablePro/Core/MCP/MCPAuthPolicy.swift create mode 100644 TablePro/Core/MCP/MCPRouteHandler.swift create mode 100644 TablePro/Core/MCP/MCPSessionPhase.swift create mode 100644 TablePro/Core/MCP/PairingTypes.swift create mode 100644 TablePro/Core/MCP/Routes/IntegrationsExchangeHandler.swift create mode 100644 TablePro/Core/MCP/Routes/MCPProtocolHandler.swift create mode 100644 TablePro/Core/MCP/TokenPermissionFilter.swift create mode 100644 TablePro/Core/Services/Infrastructure/AppLaunchCoordinator.swift create mode 100644 TablePro/Core/Services/Infrastructure/ConnectionFormWindowFactory.swift delete mode 100644 TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift create mode 100644 TablePro/Core/Services/Infrastructure/DeeplinkParser.swift create mode 100644 TablePro/Core/Services/Infrastructure/LaunchIntent.swift create mode 100644 TablePro/Core/Services/Infrastructure/LaunchIntentRouter.swift create mode 100644 TablePro/Core/Services/Infrastructure/LaunchPhase.swift delete mode 100644 TablePro/Core/Services/Infrastructure/PendingActionStore.swift create mode 100644 TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator+AggregatedSave.swift create mode 100644 TablePro/Core/Services/Infrastructure/TabRouter.swift create mode 100644 TablePro/Core/Services/Infrastructure/URLClassifier.swift create mode 100644 TablePro/Core/Services/Infrastructure/WelcomeRouter.swift create mode 100644 TablePro/Core/Services/Infrastructure/WelcomeWindowFactory.swift delete mode 100644 TablePro/Core/Services/Infrastructure/WindowOpener.swift create mode 100644 TablePro/Core/Services/Query/SchemaService.swift create mode 100644 TablePro/Core/Services/Query/SchemaState.swift create mode 100644 TablePro/Core/Utilities/Connection/TransientConnectionFactory.swift create mode 100644 TablePro/Extensions/URL+SanitizedLogging.swift create mode 100644 TableProTests/Core/Concurrency/OnceTaskTests.swift create mode 100644 TableProTests/Core/MCP/MCPRouterTests.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index e36f5cb7b..6e54f7574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Data grid cell focus ring redraws when the user toggles Light or Dark mode mid-session, picking up the system's appearance-aware focus indicator color - Data grid keeps sortedIDs and cachedRowCount paired by calling updateCache() immediately after the SwiftUI bridge writes new sortedIDs to the coordinator, removing a window where the cached count and the sort permutation could disagree - Display formats memoized per tab on MainContentCoordinator keyed by schema version, smart-detection setting, and format-overrides version, so ValueDisplayDetector.detect runs once per result schema instead of on every SwiftUI body evaluation +- MCP HTTP router replaced with a route registry. `MCPRouter` now matches paths and methods against a list of `MCPRouteHandler` values; `/mcp` traffic and `/v1/integrations/exchange` traffic each live in their own handler file under `Core/MCP/Routes/`. OPTIONS preflight is handled once at the router level for every path +- `MCPAuthGuard` and `MCPConnectionBridge` route concurrent dedup through a shared `OnceTask` actor (`Core/Concurrency/OnceTask.swift`). Cleanup of in-flight slots happens in `defer` inside the actor, so a cancelled or thrown caller no longer leaves a stale entry behind. ### Removed (BREAKING) @@ -91,6 +93,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Persist group deletions before firing the sync notification, fixing a race that could re-upload deleted groups via iCloud. - Persist connection deletions before firing the sync notification, fixing the same race for deleted connections. - Refuse to generate SQL when the database dialect cannot be resolved, instead of silently emitting unquoted identifiers. +- MCP `execute_query`: strip trailing semicolons before appending `LIMIT/OFFSET`, fixing `syntax error at or near LIMIT` for queries like `select * from t;`. ## [0.36.0] - 2026-04-27 diff --git a/TablePro.xcodeproj/project.pbxproj b/TablePro.xcodeproj/project.pbxproj index a5749a98c..9c65d7b14 100644 --- a/TablePro.xcodeproj/project.pbxproj +++ b/TablePro.xcodeproj/project.pbxproj @@ -459,9 +459,9 @@ 5AF312BE2F36FF7500E86682 /* Exceptions for "TablePro" folder in "TablePro" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - Info.plist, CLI/main.swift, CLI/MCPBridgeProxy.swift, + Info.plist, ); target = 5A1091C62EF17EDC0055EA7C /* TablePro */; }; diff --git a/TablePro.xcodeproj/xcshareddata/xcschemes/TablePro.xcscheme b/TablePro.xcodeproj/xcshareddata/xcschemes/TablePro.xcscheme index d2a10cf3d..f99c67cbd 100644 --- a/TablePro.xcodeproj/xcshareddata/xcschemes/TablePro.xcscheme +++ b/TablePro.xcodeproj/xcshareddata/xcschemes/TablePro.xcscheme @@ -25,7 +25,6 @@ 300 - ? String(condition.prefix(300)) + "…" : condition - filterDescription = preview - } else { - filterDescription = [parsed.filterColumn, parsed.filterOperation, parsed.filterValue] - .compactMap { $0 }.joined(separator: " ") - } - if !filterDescription.isEmpty { - let confirmed = await AlertHelper.confirmDestructive( - title: String(localized: "Apply Filter from Link"), - message: String( - format: String(localized: "An external link wants to apply a filter:\n\n%@"), - filterDescription - ), - confirmButton: String(localized: "Apply Filter"), - cancelButton: String(localized: "Cancel"), - window: NSApp.keyWindow - ) - guard confirmed else { return } - } - - NotificationCenter.default.post( - name: .applyURLFilter, - object: nil, - userInfo: [ - "connectionId": connectionId, - "column": parsed.filterColumn as Any, - "operation": parsed.filterOperation as Any, - "value": parsed.filterValue as Any, - "condition": parsed.filterCondition as Any - ] - ) - } - } - } - } - - private func waitForConnection(timeout: Duration) async { - await withCheckedContinuation { (continuation: CheckedContinuation) in - var didResume = false - var observer: NSObjectProtocol? - - func resumeOnce() { - guard !didResume else { return } - didResume = true - if let obs = observer { - NotificationCenter.default.removeObserver(obs) - } - continuation.resume() - } - - let timeoutTask = Task { - try? await Task.sleep(for: timeout) - resumeOnce() - } - observer = NotificationCenter.default.addObserver( - forName: .databaseDidConnect, - object: nil, - queue: .main - ) { _ in - timeoutTask.cancel() - resumeOnce() - } - } - } - - private func waitForNotification(_ name: Notification.Name, timeout: Duration) async { - await withCheckedContinuation { (continuation: CheckedContinuation) in - var didResume = false - var observer: NSObjectProtocol? - - func resumeOnce() { - guard !didResume else { return } - didResume = true - if let obs = observer { - NotificationCenter.default.removeObserver(obs) - } - continuation.resume() - } - - let timeoutTask = Task { - try? await Task.sleep(for: timeout) - resumeOnce() - } - observer = NotificationCenter.default.addObserver( - forName: name, object: nil, queue: .main - ) { _ in - timeoutTask.cancel() - resumeOnce() - } - } - } - - // MARK: - Session Lookup - - /// Finds any session (connected or still connecting) matching the parsed URL params. - private func findSessionByParams(_ parsed: ParsedConnectionURL) -> UUID? { - for (id, session) in DatabaseManager.shared.activeSessions { - let conn = session.connection - if conn.type == parsed.type - && conn.host == parsed.host - && conn.database == parsed.database - && (parsed.port == nil || conn.port == parsed.port || conn.port == parsed.type.defaultPort) - && (parsed.username.isEmpty || conn.username == parsed.username) - && (parsed.redisDatabase == nil || conn.redisDatabase == parsed.redisDatabase) { - return id - } - } - return nil - } - - /// Normalized key for deduplicating connection attempts by URL params. - static func paramKey(for parsed: ParsedConnectionURL) -> String { - let rdb = parsed.redisDatabase.map { "/redis:\($0)" } ?? "" - return "\(parsed.type.rawValue):\(parsed.username)@\(parsed.host):\(parsed.port ?? 0)/\(parsed.database)\(rdb)" - } - - func bringConnectionWindowToFront(_ connectionId: UUID) { - let windows = WindowLifecycleMonitor.shared.windows(for: connectionId) - if let window = windows.first { - window.makeKeyAndOrderFront(nil) - } else { - NSApp.windows.first { isMainWindow($0) && $0.isVisible }?.makeKeyAndOrderFront(nil) - } - } - - // MARK: - Connection Failure - - func handleConnectionFailure(_ error: Error) async { - closeOrphanedMainWindows() - - // User cancelled password prompt — no error dialog needed - if error is CancellationError { return } - - await Task.yield() - AlertHelper.showErrorSheet( - title: String(localized: "Connection Failed"), - message: error.localizedDescription, - window: NSApp.keyWindow - ) - } - - /// Closes main windows that have no active database session, then opens the welcome window if none remain. - private func closeOrphanedMainWindows() { - for window in NSApp.windows where isMainWindow(window) { - let hasActiveSession = DatabaseManager.shared.activeSessions.values.contains { - window.subtitle == $0.connection.name - || window.subtitle == "\($0.connection.name) — Preview" - } - if !hasActiveSession { window.close() } - } - if !NSApp.windows.contains(where: { isMainWindow($0) && $0.isVisible }) { - openWelcomeWindow() - } - } - - // MARK: - Transient Connection Builder - - private func buildTransientConnection(from parsed: ParsedConnectionURL) -> DatabaseConnection { - var sshConfig = SSHConfiguration() - if let sshHost = parsed.sshHost { - sshConfig.enabled = true - sshConfig.host = sshHost - sshConfig.port = parsed.sshPort ?? 22 - sshConfig.username = parsed.sshUsername ?? "" - if parsed.usePrivateKey == true { - sshConfig.authMethod = .privateKey - } - if parsed.useSSHAgent == true { - sshConfig.authMethod = .sshAgent - sshConfig.agentSocketPath = parsed.agentSocket ?? "" - } - } - - var sslConfig = SSLConfiguration() - if let sslMode = parsed.sslMode { - sslConfig.mode = sslMode - } - - var color: ConnectionColor = .none - if let hex = parsed.statusColor { - color = ConnectionURLParser.connectionColor(fromHex: hex) - } - - var tagId: UUID? - if let envName = parsed.envTag { - tagId = ConnectionURLParser.tagId(fromEnvName: envName) - } - - let resolvedSafeMode = parsed.safeModeLevel.flatMap(SafeModeLevel.from(urlInteger:)) ?? .silent - - var connection = DatabaseConnection( - name: parsed.connectionName ?? parsed.suggestedName, - host: parsed.host, - port: parsed.port ?? parsed.type.defaultPort, - database: parsed.database, - username: parsed.username, - type: parsed.type, - sshConfig: sshConfig, - sslConfig: sslConfig, - color: color, - tagId: tagId, - safeModeLevel: resolvedSafeMode, - mongoAuthSource: parsed.authSource, - mongoUseSrv: parsed.useSrv, - mongoAuthMechanism: parsed.mongoQueryParams["authMechanism"], - mongoReplicaSet: parsed.mongoQueryParams["replicaSet"], - redisDatabase: parsed.redisDatabase, - oracleServiceName: parsed.oracleServiceName - ) - - for (key, value) in parsed.mongoQueryParams where !value.isEmpty { - if key != "authMechanism" && key != "replicaSet" { - connection.additionalFields["mongoParam_\(key)"] = value - } - } - - return connection - } -} diff --git a/TablePro/AppDelegate+FileOpen.swift b/TablePro/AppDelegate+FileOpen.swift deleted file mode 100644 index 938cdeba1..000000000 --- a/TablePro/AppDelegate+FileOpen.swift +++ /dev/null @@ -1,354 +0,0 @@ -// -// AppDelegate+FileOpen.swift -// TablePro -// - -import AppKit -import os -import SwiftUI - -private let fileOpenLogger = Logger(subsystem: "com.TablePro", category: "FileOpen") - -extension AppDelegate { - // MARK: - Handoff - - func application(_ application: NSApplication, continue userActivity: NSUserActivity, - restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void) -> Bool { - handleHandoffActivity(userActivity) - return true - } - - private func handleHandoffActivity(_ activity: NSUserActivity) { - guard let connectionIdString = activity.userInfo?["connectionId"] as? String, - let connectionId = UUID(uuidString: connectionIdString) else { return } - - let connections = ConnectionStorage.shared.loadConnections() - guard let connection = connections.first(where: { $0.id == connectionId }) else { - fileOpenLogger.error("Handoff: no connection with ID '\(connectionIdString, privacy: .public)'") - return - } - - let tableName = activity.userInfo?["tableName"] as? String - - if DatabaseManager.shared.activeSessions[connectionId]?.driver != nil { - if let tableName { - let payload = EditorTabPayload(connectionId: connectionId, tabType: .table, tableName: tableName) - WindowManager.shared.openTab(payload: payload) - } else { - for window in NSApp.windows where isMainWindow(window) { - window.makeKeyAndOrderFront(nil) - return - } - } - return - } - - let initialPayload = EditorTabPayload(connectionId: connectionId) - WindowManager.shared.openTab(payload: initialPayload) - - Task { - do { - try await DatabaseManager.shared.connectToSession(connection) - for window in NSApp.windows where self.isWelcomeWindow(window) { - window.close() - } - if let tableName { - let payload = EditorTabPayload(connectionId: connectionId, tabType: .table, tableName: tableName) - WindowManager.shared.openTab(payload: payload) - } - } catch { - fileOpenLogger.error("Handoff connect failed: \(error.localizedDescription)") - } - } - } - - // MARK: - URL Classification - - private func isDatabaseURL(_ url: URL) -> Bool { - guard let scheme = url.scheme?.lowercased() else { return false } - let base = scheme - .replacingOccurrences(of: "+ssh", with: "") - .replacingOccurrences(of: "+srv", with: "") - let registeredSchemes = PluginManager.shared.allRegisteredURLSchemes - return registeredSchemes.contains(base) || registeredSchemes.contains(scheme) - } - - private func isDatabaseFile(_ url: URL) -> Bool { - PluginManager.shared.allRegisteredFileExtensions[url.pathExtension.lowercased()] != nil - } - - private func databaseTypeForFile(_ url: URL) -> DatabaseType? { - PluginManager.shared.allRegisteredFileExtensions[url.pathExtension.lowercased()] - } - - // MARK: - Main Dispatch - - func handleOpenURLs(_ urls: [URL]) { - let deeplinks = urls.filter { $0.scheme == "tablepro" } - if !deeplinks.isEmpty { - suppressWelcomeWindow() - Task { - for url in deeplinks { await self.handleDeeplink(url) } - self.endFileOpenSuppression() - } - } - - let plugins = urls.filter { $0.pathExtension == "tableplugin" } - if !plugins.isEmpty { - Task { - for url in plugins { await self.handlePluginInstall(url) } - } - } - - let databaseURLs = urls.filter { isDatabaseURL($0) } - if !databaseURLs.isEmpty { - suppressWelcomeWindow() - Task { - for url in databaseURLs { self.handleDatabaseURL(url) } - // endFileOpenSuppression is called here to match suppressWelcomeWindow above. - // Individual handlers no longer manage this flag. - self.endFileOpenSuppression() - } - } - - let databaseFiles = urls.filter { isDatabaseFile($0) } - if !databaseFiles.isEmpty { - suppressWelcomeWindow() - Task { - for url in databaseFiles { - guard let dbType = self.databaseTypeForFile(url) else { continue } - switch dbType { - case .sqlite: - self.handleSQLiteFile(url) - case .duckdb: - self.handleDuckDBFile(url) - default: - self.handleGenericDatabaseFile(url, type: dbType) - } - } - self.endFileOpenSuppression() - } - } - - // Connection share files - let connectionShareFiles = urls.filter { $0.pathExtension.lowercased() == "tablepro" } - for url in connectionShareFiles { - handleConnectionShareFile(url) - } - - let sqlFiles = urls.filter { $0.pathExtension.lowercased() == "sql" } - if !sqlFiles.isEmpty { - if DatabaseManager.shared.currentSession != nil { - suppressWelcomeWindow() - for window in NSApp.windows where isMainWindow(window) { - window.makeKeyAndOrderFront(nil) - } - for window in NSApp.windows where isWelcomeWindow(window) { - window.close() - } - NotificationCenter.default.post(name: .openSQLFiles, object: sqlFiles) - endFileOpenSuppression() - } else { - queuedFileURLs.append(contentsOf: sqlFiles) - openWelcomeWindow() - } - } - } - - // MARK: - Welcome Window Suppression - - func suppressWelcomeWindow() { - isHandlingFileOpen = true - fileOpenSuppressionCount += 1 - for window in NSApp.windows where isWelcomeWindow(window) { - window.orderOut(nil) - } - } - - // MARK: - Deeplink Handling - - private func handleDeeplink(_ url: URL) async { - guard let action = DeeplinkHandler.parse(url) else { return } - - switch action { - case .connect(let connectionId): - connectViaDeeplink(connectionId: connectionId) - - case .openTable(let connectionId, let table, let database, let schema): - connectViaDeeplink(connectionId: connectionId) { resolvedId in - EditorTabPayload(connectionId: resolvedId, tabType: .table, - tableName: table, databaseName: database, schemaName: schema) - } - - case .openQuery(let connectionId, let sql): - let maxDeeplinkSQLLength = 51_200 - let sqlLength = (sql as NSString).length - guard sqlLength <= maxDeeplinkSQLLength else { return } - guard let connection = DeeplinkHandler.resolveConnection(byId: connectionId) else { - showConnectionNotFoundAlert(connectionId: connectionId) - return - } - let preview: String - if sqlLength > 300 { - let hiddenCount = sqlLength - 300 - preview = String(sql.prefix(300)) - + String(format: String(localized: "\n\n… (%d more characters not shown)"), hiddenCount) - } else { - preview = sql - } - let confirmed = await AlertHelper.confirmDestructive( - title: String(localized: "Open Query from Link"), - message: String(format: String(localized: "An external link wants to open a query on connection \"%@\":\n\n%@"), connection.name, preview), - confirmButton: String(localized: "Open Query"), - cancelButton: String(localized: "Cancel"), - window: NSApp.keyWindow - ) - guard confirmed else { return } - connectViaDeeplink(connectionId: connectionId) { resolvedId in - EditorTabPayload(connectionId: resolvedId, tabType: .query, - initialQuery: sql) - } - - case .importConnection(let exportable): - openWelcomeWindow() - PendingActionStore.shared.deeplinkImport = exportable - NotificationCenter.default.post(name: .deeplinkImportRequested, object: exportable) - - case .pairIntegration(let request): - do { - try await MCPPairingService.shared.startPairing(request) - } catch let error as MCPError where error.isUserCancelled { - fileOpenLogger.info("Pairing cancelled by user") - } catch { - fileOpenLogger.error("Pairing failed: \(error.localizedDescription)") - AlertHelper.showErrorSheet( - title: String(localized: "Pairing Failed"), - message: error.localizedDescription, - window: NSApp.keyWindow - ) - } - - case .exchangePairing: - fileOpenLogger.warning("Exchange pairing received via URL scheme; ignored (use HTTP endpoint)") - - case .startMCP: - await MCPServerManager.shared.lazyStart() - } - } - - private func showConnectionNotFoundAlert(connectionId: UUID) { - fileOpenLogger.error("Deep link: no connection with ID '\(connectionId.uuidString, privacy: .public)'") - AlertHelper.showErrorSheet( - title: String(localized: "Connection Not Found"), - message: String(format: String(localized: "No saved connection with ID \"%@\"."), connectionId.uuidString), - window: NSApp.keyWindow - ) - } - - private func connectViaDeeplink( - connectionId: UUID, - makePayload: (@Sendable (UUID) -> EditorTabPayload)? = nil - ) { - guard let connection = DeeplinkHandler.resolveConnection(byId: connectionId) else { - showConnectionNotFoundAlert(connectionId: connectionId) - return - } - - if DatabaseManager.shared.activeSessions[connection.id]?.driver != nil { - if let payload = makePayload?(connection.id) { - if payload.tabType == .table, - let tableName = payload.tableName, - let coordinator = MainContentCoordinator.allActiveCoordinators() - .first(where: { $0.connectionId == connection.id }) { - if let window = coordinator.contentWindow { - window.makeKeyAndOrderFront(nil) - NSApp.activate(ignoringOtherApps: true) - } - Task { @MainActor in - if let dbName = payload.databaseName, !dbName.isEmpty, - let session = DatabaseManager.shared.session(for: connection.id), - dbName != session.activeDatabase { - await coordinator.switchDatabase(to: dbName) - } - coordinator.openTableTab(tableName) - } - } else { - WindowManager.shared.openTab(payload: payload) - } - } else { - for window in NSApp.windows where isMainWindow(window) { - window.makeKeyAndOrderFront(nil) - return - } - } - return - } - - let hadExistingMain = NSApp.windows.contains { isMainWindow($0) && $0.isVisible } - let savedTabbing = NSWindow.allowsAutomaticWindowTabbing - if hadExistingMain && !AppSettingsManager.shared.tabs.groupAllConnectionTabs { - NSWindow.allowsAutomaticWindowTabbing = false - } - - if makePayload == nil { - let deeplinkPayload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) - WindowManager.shared.openTab(payload: deeplinkPayload) - } - NSWindow.allowsAutomaticWindowTabbing = savedTabbing - - Task { - do { - if let script = connection.preConnectScript, - !script.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty - { - let confirmed = await AlertHelper.confirmDestructive( - title: String(localized: "Pre-Connect Script"), - message: String(format: String(localized: "Connection \"%@\" has a script that will run before connecting:\n\n%@"), connection.name, script), - confirmButton: String(localized: "Run Script"), - cancelButton: String(localized: "Cancel"), - window: NSApp.keyWindow - ) - guard confirmed else { return } - } - - try await DatabaseManager.shared.connectToSession(connection) - for window in NSApp.windows where self.isWelcomeWindow(window) { - window.close() - } - if let payload = makePayload?(connection.id) { - WindowManager.shared.openTab(payload: payload) - } - } catch { - fileOpenLogger.error("Deep link connect failed: \(error.localizedDescription)") - await self.handleConnectionFailure(error) - } - } - } - - // MARK: - Connection Share Import - - private func handleConnectionShareFile(_ url: URL) { - openWelcomeWindow() - PendingActionStore.shared.connectionShareURL = url - NotificationCenter.default.post(name: .connectionShareFileOpened, object: url) - } - - // MARK: - Plugin Install - - private func handlePluginInstall(_ url: URL) async { - do { - let entry = try await PluginManager.shared.installPlugin(from: url) - fileOpenLogger.info("Installed plugin '\(entry.name)' from Finder") - - UserDefaults.standard.set(SettingsTab.plugins.rawValue, forKey: "selectedSettingsTab") - NotificationCenter.default.post(name: .openSettingsWindow, object: nil) - } catch { - fileOpenLogger.error("Plugin install failed: \(error.localizedDescription)") - AlertHelper.showErrorSheet( - title: String(localized: "Plugin Installation Failed"), - message: error.localizedDescription, - window: NSApp.keyWindow - ) - } - } -} diff --git a/TablePro/AppDelegate+WindowConfig.swift b/TablePro/AppDelegate+WindowConfig.swift deleted file mode 100644 index 3e9f8dde2..000000000 --- a/TablePro/AppDelegate+WindowConfig.swift +++ /dev/null @@ -1,406 +0,0 @@ -// -// AppDelegate+WindowConfig.swift -// TablePro -// - -import AppKit -import os -import SwiftUI - -private let windowLogger = Logger(subsystem: "com.TablePro", category: "WindowConfig") - -extension AppDelegate { - // MARK: - Dock Menu - - func applicationDockMenu(_ sender: NSApplication) -> NSMenu? { - let menu = NSMenu() - - let welcomeItem = NSMenuItem( - title: String(localized: "Show Welcome Window"), - action: #selector(showWelcomeFromDock), - keyEquivalent: "" - ) - welcomeItem.target = self - menu.addItem(welcomeItem) - - let connections = ConnectionStorage.shared.loadConnections() - if !connections.isEmpty { - let connectionsItem = NSMenuItem(title: String(localized: "Open Connection"), action: nil, keyEquivalent: "") - let submenu = NSMenu() - - for connection in connections { - let item = NSMenuItem( - title: connection.name, - action: #selector(connectFromDock(_:)), - keyEquivalent: "" - ) - item.target = self - item.representedObject = connection.id - let iconName = connection.type.iconName - let original = NSImage(systemSymbolName: iconName, accessibilityDescription: nil) - ?? NSImage(named: iconName) - if let original { - let resized = NSImage(size: NSSize(width: 16, height: 16), flipped: false) { rect in - original.draw(in: rect) - return true - } - item.image = resized - } - submenu.addItem(item) - } - - connectionsItem.submenu = submenu - menu.addItem(connectionsItem) - } - - return menu - } - - @objc func showWelcomeFromDock() { - openWelcomeWindow() - } - - @objc func newWindowForTab(_ sender: Any?) { - guard let keyWindow = NSApp.keyWindow, - let connectionId = MainActor.assumeIsolated({ - WindowLifecycleMonitor.shared.connectionId(forWindow: keyWindow) - }) - else { return } - - let payload = EditorTabPayload( - connectionId: connectionId, - intent: .newEmptyTab - ) - MainActor.assumeIsolated { - WindowManager.shared.openTab(payload: payload) - } - } - - @objc func connectFromDock(_ sender: NSMenuItem) { - guard let connectionId = sender.representedObject as? UUID else { return } - let connections = ConnectionStorage.shared.loadConnections() - guard let connection = connections.first(where: { $0.id == connectionId }) else { return } - - let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) - WindowManager.shared.openTab(payload: payload) - - Task { - do { - try await DatabaseManager.shared.connectToSession(connection) - - for window in NSApp.windows where self.isWelcomeWindow(window) { - window.close() - } - } catch { - windowLogger.error("Dock connection failed for '\(connection.name)': \(error.localizedDescription)") - - for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { - window.close() - } - if !NSApp.windows.contains(where: { self.isMainWindow($0) && $0.isVisible }) { - self.openWelcomeWindow() - } - } - } - } - - // MARK: - Reopen Handling - - func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { - if flag { - return true - } - - openWelcomeWindow() - return false - } - - // MARK: - Window Identification - - private enum WindowId { - static let main = "main" - static let welcome = "welcome" - static let connectionForm = "connection-form" - } - - func isMainWindow(_ window: NSWindow) -> Bool { - guard let rawValue = window.identifier?.rawValue else { return false } - return rawValue == WindowId.main || rawValue.hasPrefix("\(WindowId.main)-") - } - - func isWelcomeWindow(_ window: NSWindow) -> Bool { - guard let rawValue = window.identifier?.rawValue else { return false } - return rawValue == WindowId.welcome || rawValue.hasPrefix("\(WindowId.welcome)-") - } - - private func isConnectionFormWindow(_ window: NSWindow) -> Bool { - guard let rawValue = window.identifier?.rawValue else { return false } - return rawValue == WindowId.connectionForm || rawValue.hasPrefix("\(WindowId.connectionForm)-") - } - - @objc func handleFocusConnectionForm() { - if let window = NSApp.windows.first(where: { isConnectionFormWindow($0) }) { - window.makeKeyAndOrderFront(nil) - } - } - - // MARK: - Welcome Window - - /// Hide the Welcome window immediately when we know we're going to - /// auto-reconnect. Prevents a visible flash of the Welcome screen - /// before the main editor window appears. - func closeWelcomeWindowEagerly() { - for window in NSApp.windows where isWelcomeWindow(window) { - window.orderOut(nil) - } - } - - func openWelcomeWindow() { - for window in NSApp.windows where isWelcomeWindow(window) { - window.makeKeyAndOrderFront(nil) - return - } - - NotificationCenter.default.post(name: .openWelcomeWindow, object: nil) - } - - private func configureWelcomeWindowStyle(_ window: NSWindow) { - window.standardWindowButton(.miniaturizeButton)?.isHidden = true - window.standardWindowButton(.zoomButton)?.isHidden = true - window.styleMask.remove(.miniaturizable) - - window.collectionBehavior.remove(.fullScreenPrimary) - window.collectionBehavior.insert(.fullScreenNone) - - if window.styleMask.contains(.resizable) { - window.styleMask.remove(.resizable) - } - - let welcomeSize = NSSize(width: 700, height: 450) - if window.frame.size != welcomeSize { - window.setContentSize(welcomeSize) - window.center() - } - - window.isOpaque = false - window.backgroundColor = .clear - window.titlebarAppearsTransparent = true - - window.makeKeyAndOrderFront(nil) - - if let textField = window.contentView?.firstEditableTextField() { - window.makeFirstResponder(textField) - } - } - - private func configureConnectionFormWindowStyle(_ window: NSWindow) { - window.standardWindowButton(.miniaturizeButton)?.isEnabled = false - window.standardWindowButton(.zoomButton)?.isEnabled = false - window.styleMask.remove(.miniaturizable) - - window.collectionBehavior.remove(.fullScreenPrimary) - window.collectionBehavior.insert(.fullScreenNone) - } - - // MARK: - Welcome Window Suppression - - /// Called by connection handlers when the file-open connection attempt finishes - /// (success or failure). Decrements the suppression counter and resets the flag - /// when all outstanding file opens have completed. - func endFileOpenSuppression() { - fileOpenSuppressionCount = max(0, fileOpenSuppressionCount - 1) - if fileOpenSuppressionCount == 0 { - isHandlingFileOpen = false - } - } - - @discardableResult - private func closeWelcomeWindowIfMainExists() -> Bool { - let hasMainWindow = NSApp.windows.contains { isMainWindow($0) && $0.isVisible } - guard hasMainWindow else { return false } - for window in NSApp.windows where isWelcomeWindow(window) { - window.close() - } - return true - } - - // MARK: - Window Notifications - - @objc func windowDidBecomeKey(_ notification: Notification) { - guard let window = notification.object as? NSWindow else { return } - let windowId = ObjectIdentifier(window) - - if isWelcomeWindow(window) && isHandlingFileOpen { - // Only close welcome if a main window exists to take its place; - // otherwise just hide it so the user doesn't see a flash. - if let mainWin = NSApp.windows.first(where: { isMainWindow($0) }) { - window.close() - mainWin.makeKeyAndOrderFront(nil) - } else { - window.orderOut(nil) - } - return - } - - if isWelcomeWindow(window) && !configuredWindows.contains(windowId) { - configureWelcomeWindowStyle(window) - configuredWindows.insert(windowId) - } - - if isConnectionFormWindow(window) && !configuredWindows.contains(windowId) { - configureConnectionFormWindowStyle(window) - configuredWindows.insert(windowId) - } - - if isMainWindow(window) && isHandlingFileOpen { - closeWelcomeWindowIfMainExists() - } - - // Phase 5: removed legacy main-window tabbing block. `WindowManager.openTab` - // now performs the tab-group merge at creation time with the correct - // ordering, and pre-marks `configuredWindows` so this method is a no-op - // for main windows. The old block consumed `WindowOpener.pendingPayloads` - // and called `addTabbedWindow` mid-`windowDidBecomeKey`, which produced - // the 200–7000 ms grace-period delay we removed in Phase 2. - } - - @objc func windowWillClose(_ notification: Notification) { - let seq = MainContentCoordinator.nextSwitchSeq() - let t0 = Date() - guard let window = notification.object as? NSWindow else { return } - let isMain = isMainWindow(window) - - configuredWindows.remove(ObjectIdentifier(window)) - - if isMain { - let remainingMainWindows = NSApp.windows.filter { - $0 !== window && isMainWindow($0) && $0.isVisible - }.count - windowLogger.info("[close] AppDelegate.windowWillClose seq=\(seq) isMain=true remaining=\(remainingMainWindows)") - - if remainingMainWindows == 0 { - NotificationCenter.default.post(name: .mainWindowWillClose, object: nil) - openWelcomeWindow() - } - } - windowLogger.info("[close] AppDelegate.windowWillClose seq=\(seq) total ms=\(Int(Date().timeIntervalSince(t0) * 1_000))") - } - - @objc func windowDidChangeOcclusionState(_ notification: Notification) { - guard let window = notification.object as? NSWindow, - isHandlingFileOpen else { return } - - if isWelcomeWindow(window), - window.occlusionState.contains(.visible), - NSApp.windows.contains(where: { isMainWindow($0) && $0.isVisible }), - window.isVisible { - window.close() - } - } - - // MARK: - Auto-Reconnect - - func attemptAutoReconnectAll(connectionIds: [UUID]) { - let connections = ConnectionStorage.shared.loadConnections() - let validConnections = connectionIds.compactMap { id in - connections.first { $0.id == id } - } - - guard !validConnections.isEmpty else { - AppSettingsStorage.shared.saveLastOpenConnectionIds([]) - AppSettingsStorage.shared.saveLastConnectionId(nil) - closeRestoredMainWindows() - openWelcomeWindow() - return - } - - isAutoReconnecting = true - - Task { @MainActor [weak self] in - guard let self else { return } - defer { self.isAutoReconnecting = false } - - for connection in validConnections { - let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) - WindowManager.shared.openTab(payload: payload) - - do { - try await DatabaseManager.shared.connectToSession(connection) - } catch is CancellationError { - for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { - window.close() - } - continue - } catch { - windowLogger.error( - "Auto-reconnect failed for '\(connection.name)': \(error.localizedDescription)" - ) - for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { - window.close() - } - continue - } - } - - for window in NSApp.windows where self.isWelcomeWindow(window) { - window.close() - } - - // If all connections failed, show the welcome window - if !NSApp.windows.contains(where: { self.isMainWindow($0) && $0.isVisible }) { - self.openWelcomeWindow() - } - } - } - - func attemptAutoReconnect(connectionId: UUID) { - let connections = ConnectionStorage.shared.loadConnections() - guard let connection = connections.first(where: { $0.id == connectionId }) else { - AppSettingsStorage.shared.saveLastConnectionId(nil) - closeRestoredMainWindows() - openWelcomeWindow() - return - } - - isAutoReconnecting = true - - Task { @MainActor [weak self] in - guard let self else { return } - let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) - WindowManager.shared.openTab(payload: payload) - - defer { self.isAutoReconnecting = false } - do { - try await DatabaseManager.shared.connectToSession(connection) - - for window in NSApp.windows where self.isWelcomeWindow(window) { - window.close() - } - } catch is CancellationError { - for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { - window.close() - } - if !NSApp.windows.contains(where: { self.isMainWindow($0) && $0.isVisible }) { - self.openWelcomeWindow() - } - } catch { - windowLogger.error("Auto-reconnect failed for '\(connection.name)': \(error.localizedDescription)") - - for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { - window.close() - } - if !NSApp.windows.contains(where: { self.isMainWindow($0) && $0.isVisible }) { - self.openWelcomeWindow() - } - } - } - } - - func closeRestoredMainWindows() { - Task { @MainActor [weak self] in - for window in NSApp.windows where self?.isMainWindow(window) == true { - window.close() - } - } - } -} diff --git a/TablePro/AppDelegate.swift b/TablePro/AppDelegate.swift index fdc6ebc1d..bf3f1c360 100644 --- a/TablePro/AppDelegate.swift +++ b/TablePro/AppDelegate.swift @@ -7,44 +7,30 @@ import AppKit import os import SwiftUI -internal extension URL { - /// Returns the URL string with the password component replaced by `***` for safe logging. - var sanitizedForLogging: String { - guard var components = URLComponents(url: self, resolvingAgainstBaseURL: false), - components.password != nil else { - return absoluteString - } - components.password = "***" - return components.string ?? absoluteString - } -} - @MainActor class AppDelegate: NSObject, NSApplicationDelegate { private static let logger = Logger(subsystem: "com.TablePro", category: "AppDelegate") static let lifecycleLogger = Logger(subsystem: "com.TablePro", category: "NativeTabLifecycle") - var configuredWindows = Set() - var queuedFileURLs: [URL] = [] - var queuedURLEntries: [QueuedURLEntry] = [] - var isHandlingFileOpen = false - var fileOpenSuppressionCount = 0 - var isProcessingQueuedURLs = false - var isAutoReconnecting = false - var connectingURLConnectionIds = Set() - var connectingURLParamKeys = Set() - var connectingFilePaths = Set() - - // MARK: - NSApplicationDelegate + // MARK: - URL & File Open func application(_ application: NSApplication, open urls: [URL]) { - handleOpenURLs(urls) + AppLaunchCoordinator.shared.handleOpenURLs(urls) + } + + func application(_ application: NSApplication, continue userActivity: NSUserActivity, + restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void) -> Bool { + AppLaunchCoordinator.shared.handleHandoff(userActivity) + return true } + func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { + AppLaunchCoordinator.shared.handleReopen(hasVisibleWindows: flag) + } + + // MARK: - Lifecycle + func applicationDidFinishLaunching(_ notification: Notification) { - // Re-apply appearance now that NSApp exists. - // AppSettingsManager.shared may already be initialized (by @State in TableProApp), - // but NSApp was nil at that point so NSApp?.appearance was a no-op. let appearanceSettings = AppSettingsManager.shared.appearance ThemeEngine.shared.updateAppearanceAndTheme( mode: appearanceSettings.appearanceMode, @@ -90,54 +76,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { _ = QueryHistoryStorage.shared } - if !isHandlingFileOpen { - let settings = AppSettingsStorage.shared.loadGeneral() - if settings.startupBehavior == .reopenLast { - let connectionIds = AppSettingsStorage.shared.loadLastOpenConnectionIds() - if !connectionIds.isEmpty { - closeWelcomeWindowEagerly() - attemptAutoReconnectAll(connectionIds: connectionIds) - } else if let lastConnectionId = AppSettingsStorage.shared.loadLastConnectionId() { - closeWelcomeWindowEagerly() - attemptAutoReconnect(connectionId: lastConnectionId) - } else { - Task { @MainActor [weak self] in - guard let self, !self.isHandlingFileOpen else { return } - let diskIds = await TabDiskActor.shared.connectionIdsWithSavedState() - guard !self.isHandlingFileOpen else { return } - if !diskIds.isEmpty { - self.closeWelcomeWindowEagerly() - self.attemptAutoReconnectAll(connectionIds: diskIds) - } else { - self.closeRestoredMainWindows() - } - } - } - } else { - closeRestoredMainWindows() - } - } - - // NOTE: These observers are not explicitly removed because AppDelegate - // lives for the entire app lifetime. NotificationCenter uses weak - // references for selector-based observers on macOS 10.11+. + AppLaunchCoordinator.shared.didFinishLaunching() - NotificationCenter.default.addObserver( - self, selector: #selector(windowDidBecomeKey(_:)), - name: NSWindow.didBecomeKeyNotification, object: nil - ) NotificationCenter.default.addObserver( self, selector: #selector(windowWillClose(_:)), name: NSWindow.willCloseNotification, object: nil ) - NotificationCenter.default.addObserver( - self, selector: #selector(windowDidChangeOcclusionState(_:)), - name: NSWindow.didChangeOcclusionStateNotification, object: nil - ) - NotificationCenter.default.addObserver( - self, selector: #selector(handleDatabaseDidConnect), - name: .databaseDidConnect, object: nil - ) NotificationCenter.default.addObserver( self, selector: #selector(handlePluginsRejected(_:)), name: .pluginsRejected, object: nil @@ -148,6 +92,45 @@ class AppDelegate: NSObject, NSApplicationDelegate { ) } + func applicationDidBecomeActive(_ notification: Notification) { + SyncCoordinator.shared.syncIfNeeded() + } + + func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { + let hasUnsaved = MainContentCoordinator.hasAnyUnsavedChanges() + if hasUnsaved { + let alert = NSAlert() + alert.messageText = String(localized: "You have unsaved changes") + alert.informativeText = String(localized: "Some tabs have unsaved edits. Quitting will discard these changes.") + alert.alertStyle = .warning + alert.addButton(withTitle: String(localized: "Cancel")) + alert.addButton(withTitle: String(localized: "Quit Anyway")) + alert.buttons[1].hasDestructiveAction = true + let response = alert.runModal() + guard response == .alertSecondButtonReturn else { return .terminateCancel } + } + + Task { + await MCPServerManager.shared.stop() + NSApp.reply(toApplicationShouldTerminate: true) + } + return .terminateLater + } + + func applicationWillTerminate(_ notification: Notification) { + LinkedFolderWatcher.shared.stop() + TerminalProcessManager.registry.terminateAllSync() + SSHTunnelManager.shared.terminateAllProcessesSync() + } + + @objc func showHelp(_ sender: Any?) { + if let url = URL(string: "https://docs.tablepro.app") { + NSWorkspace.shared.open(url) + } + } + + // MARK: - Plugin Rejection Alert + @objc private func handlePluginsRejected(_ notification: Notification) { guard let rejected = notification.object as? [RejectedPlugin], !rejected.isEmpty else { return } @@ -184,40 +167,101 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } - func applicationDidBecomeActive(_ notification: Notification) { - SyncCoordinator.shared.syncIfNeeded() + // MARK: - Window Notifications + + @objc func windowWillClose(_ notification: Notification) { + guard let window = notification.object as? NSWindow else { return } + + if AppLaunchCoordinator.isMainWindow(window) { + let remaining = NSApp.windows.filter { + $0 !== window && AppLaunchCoordinator.isMainWindow($0) && $0.isVisible + }.count + if remaining == 0 { + NotificationCenter.default.post(name: .mainWindowWillClose, object: nil) + WelcomeWindowFactory.openOrFront() + } + } } - func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { - let hasUnsaved = MainContentCoordinator.hasAnyUnsavedChanges() - if hasUnsaved { - let alert = NSAlert() - alert.messageText = String(localized: "You have unsaved changes") - alert.informativeText = String(localized: "Some tabs have unsaved edits. Quitting will discard these changes.") - alert.alertStyle = .warning - alert.addButton(withTitle: String(localized: "Cancel")) - alert.addButton(withTitle: String(localized: "Quit Anyway")) - alert.buttons[1].hasDestructiveAction = true - let response = alert.runModal() - guard response == .alertSecondButtonReturn else { return .terminateCancel } + @objc func handleFocusConnectionForm() { + if let window = NSApp.windows.first(where: { AppLaunchCoordinator.isConnectionFormWindow($0) }) { + window.makeKeyAndOrderFront(nil) } + } - Task { - await MCPServerManager.shared.stop() - NSApp.reply(toApplicationShouldTerminate: true) + // MARK: - Dock Menu + + func applicationDockMenu(_ sender: NSApplication) -> NSMenu? { + let menu = NSMenu() + + let welcomeItem = NSMenuItem( + title: String(localized: "Show Welcome Window"), + action: #selector(showWelcomeFromDock), + keyEquivalent: "" + ) + welcomeItem.target = self + menu.addItem(welcomeItem) + + let connections = ConnectionStorage.shared.loadConnections() + if !connections.isEmpty { + let connectionsItem = NSMenuItem(title: String(localized: "Open Connection"), action: nil, keyEquivalent: "") + let submenu = NSMenu() + + for connection in connections { + let item = NSMenuItem( + title: connection.name, + action: #selector(connectFromDock(_:)), + keyEquivalent: "" + ) + item.target = self + item.representedObject = connection.id + let iconName = connection.type.iconName + let original = NSImage(systemSymbolName: iconName, accessibilityDescription: nil) + ?? NSImage(named: iconName) + if let original { + let resized = NSImage(size: NSSize(width: 16, height: 16), flipped: false) { rect in + original.draw(in: rect) + return true + } + item.image = resized + } + submenu.addItem(item) + } + + connectionsItem.submenu = submenu + menu.addItem(connectionsItem) } - return .terminateLater + + return menu } - func applicationWillTerminate(_ notification: Notification) { - LinkedFolderWatcher.shared.stop() - TerminalProcessManager.registry.terminateAllSync() - SSHTunnelManager.shared.terminateAllProcessesSync() + @objc func showWelcomeFromDock() { + WelcomeWindowFactory.openOrFront() } - @objc func showHelp(_ sender: Any?) { - if let url = URL(string: "https://docs.tablepro.app") { - NSWorkspace.shared.open(url) + @objc func newWindowForTab(_ sender: Any?) { + guard let keyWindow = NSApp.keyWindow, + let connectionId = MainActor.assumeIsolated({ + WindowLifecycleMonitor.shared.connectionId(forWindow: keyWindow) + }) + else { return } + + MainActor.assumeIsolated { + if let actions = MainContentCoordinator.allActiveCoordinators() + .first(where: { $0.connectionId == connectionId })?.commandActions { + actions.newTab() + } else { + WindowManager.shared.openTab( + payload: EditorTabPayload(connectionId: connectionId, intent: .newEmptyTab) + ) + } + } + } + + @objc func connectFromDock(_ sender: NSMenuItem) { + guard let connectionId = sender.representedObject as? UUID else { return } + Task { + await LaunchIntentRouter.shared.route(.openConnection(connectionId)) } } diff --git a/TablePro/Core/Concurrency/OnceTask.swift b/TablePro/Core/Concurrency/OnceTask.swift new file mode 100644 index 000000000..69b0c2ed9 --- /dev/null +++ b/TablePro/Core/Concurrency/OnceTask.swift @@ -0,0 +1,52 @@ +// +// OnceTask.swift +// TablePro +// + +import Foundation + +actor OnceTask { + private struct Entry { + let task: Task + let generation: Int + } + + private var inFlight: [Key: Entry] = [:] + private var nextGeneration: Int = 0 + + init() {} + + func execute( + key: Key, + work: @Sendable @escaping () async throws -> Value + ) async throws -> Value { + if let existing = inFlight[key] { + return try await existing.task.value + } + + nextGeneration += 1 + let generation = nextGeneration + let task = Task { + try await work() + } + inFlight[key] = Entry(task: task, generation: generation) + defer { + if inFlight[key]?.generation == generation { + inFlight.removeValue(forKey: key) + } + } + return try await task.value + } + + func cancel(key: Key) { + inFlight[key]?.task.cancel() + inFlight.removeValue(forKey: key) + } + + func cancelAll() { + for entry in inFlight.values { + entry.task.cancel() + } + inFlight.removeAll() + } +} diff --git a/TablePro/Core/Database/DatabaseManager+ConnectionState.swift b/TablePro/Core/Database/DatabaseManager+ConnectionState.swift new file mode 100644 index 000000000..765a3490f --- /dev/null +++ b/TablePro/Core/Database/DatabaseManager+ConnectionState.swift @@ -0,0 +1,20 @@ +import Foundation + +enum ConnectionState { + case live(DatabaseDriver, ConnectionSession) + case stored(DatabaseConnection) + case unknown +} + +extension DatabaseManager { + @MainActor + func connectionState(_ id: UUID) -> ConnectionState { + if let session = activeSessions[id], let driver = session.driver { + return .live(driver, session) + } + if let connection = ConnectionStorage.shared.loadConnections().first(where: { $0.id == id }) { + return .stored(connection) + } + return .unknown + } +} diff --git a/TablePro/Core/Database/DatabaseManager+EnsureConnected.swift b/TablePro/Core/Database/DatabaseManager+EnsureConnected.swift new file mode 100644 index 000000000..4abe669e2 --- /dev/null +++ b/TablePro/Core/Database/DatabaseManager+EnsureConnected.swift @@ -0,0 +1,15 @@ +// +// DatabaseManager+EnsureConnected.swift +// TablePro +// + +import Foundation + +extension DatabaseManager { + func ensureConnected(_ connection: DatabaseConnection) async throws { + if activeSessions[connection.id]?.driver != nil { return } + try await ensureConnectedDedup.execute(key: connection.id) { + try await self.connectToSession(connection) + } + } +} diff --git a/TablePro/Core/Database/DatabaseManager+Health.swift b/TablePro/Core/Database/DatabaseManager+Health.swift index 1cb7b128c..a6c6e7c8e 100644 --- a/TablePro/Core/Database/DatabaseManager+Health.swift +++ b/TablePro/Core/Database/DatabaseManager+Health.swift @@ -51,6 +51,7 @@ extension DatabaseManager { reconnectHandler: { [weak self] in guard let self else { return false } guard let session = await self.activeSessions[connectionId] else { return false } + await SchemaService.shared.invalidate(connectionId: connectionId) do { let result = try await self.trackOperation(sessionId: connectionId) { try await self.reconnectDriver(for: session) @@ -207,6 +208,8 @@ extension DatabaseManager { session.status = .connecting } + await SchemaService.shared.invalidate(connectionId: sessionId) + // Stop existing health monitor await stopHealthMonitor(for: sessionId) diff --git a/TablePro/Core/Database/DatabaseManager+Sessions.swift b/TablePro/Core/Database/DatabaseManager+Sessions.swift index 59f99a4ec..ecb77f56e 100644 --- a/TablePro/Core/Database/DatabaseManager+Sessions.swift +++ b/TablePro/Core/Database/DatabaseManager+Sessions.swift @@ -13,17 +13,12 @@ import TableProPluginKit // MARK: - Session Management extension DatabaseManager { - /// Connect to a database and create/switch to its session - /// If connection already has a session, switches to it instead func connectToSession(_ connection: DatabaseConnection) async throws { - // Check if session already exists and is connected if let existing = activeSessions[connection.id], existing.driver != nil { - // Session is fully connected, just switch to it switchToSession(connection.id) return } - // Resolve environment variable references in connection fields (Pro feature) let resolvedConnection: DatabaseConnection if LicenseManager.shared.isFeatureAvailable(.envVarReferences) { resolvedConnection = EnvVarResolver.resolveConnection(connection) @@ -31,7 +26,6 @@ extension DatabaseManager { resolvedConnection = connection } - // Create new session (or reuse a prepared one) if activeSessions[connection.id] == nil { var session = ConnectionSession(connection: connection) session.status = .connecting @@ -39,18 +33,15 @@ extension DatabaseManager { } currentSessionId = connection.id - // Create SSH tunnel if needed and build effective connection let effectiveConnection: DatabaseConnection do { effectiveConnection = try await buildEffectiveConnection(for: resolvedConnection) } catch { - // Remove failed session removeSessionEntry(for: connection.id) currentSessionId = nil throw error } - // Run pre-connect hook if configured (only on explicit connect, not auto-reconnect) if let script = resolvedConnection.preConnectScript, !script.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { @@ -63,7 +54,6 @@ extension DatabaseManager { } } - // Resolve password override for prompt-for-password connections var passwordOverride: String? if connection.promptForPassword { if let cached = activeSessions[connection.id]?.cachedPassword { @@ -83,7 +73,6 @@ extension DatabaseManager { } } - // Create appropriate driver with effective connection let driver: DatabaseDriver do { driver = try await DatabaseDriverFactory.createDriver( @@ -92,7 +81,6 @@ extension DatabaseManager { awaitPlugins: true ) } catch { - // Close tunnel if SSH was established if connection.resolvedSSHConfig.enabled { Task { do { @@ -110,35 +98,32 @@ extension DatabaseManager { do { try await driver.connect() - // Apply query timeout from settings (best-effort — some PostgreSQL-compatible - // databases like Aurora DSQL don't support SET statement_timeout) let timeoutSeconds = AppSettingsManager.shared.general.queryTimeoutSeconds if timeoutSeconds > 0 { do { try await driver.applyQueryTimeout(timeoutSeconds) } catch { + // Best-effort: some PostgreSQL-compatible databases like Aurora DSQL + // don't support SET statement_timeout. Self.logger.warning( "Query timeout not supported for \(connection.name): \(error.localizedDescription)" ) } } - // Run startup commands before schema init await executeStartupCommands( resolvedConnection.startupCommands, on: driver, connectionName: connection.name ) - // Initialize schema for drivers that support schema switching if let schemaDriver = driver as? SchemaSwitchable { activeSessions[connection.id]?.currentSchema = schemaDriver.currentSchema } - // Run post-connect actions declared by the plugin await executePostConnectActions( for: connection, resolvedConnection: resolvedConnection, driver: driver ) - // Batch all session mutations into a single write to fire objectWillChange once + // Batch all session mutations into a single write to fire objectWillChange once. if var session = activeSessions[connection.id] { session.driver = driver session.status = driver.status @@ -149,13 +134,10 @@ extension DatabaseManager { setSession(session, for: connection.id) } - // Save as last connection for "Reopen Last Session" feature appSettingsStorage.saveLastConnectionId(connection.id) - // Post notification for reliable delivery NotificationCenter.default.post(name: .databaseDidConnect, object: nil) - // Start health monitoring if the plugin supports it let supportsHealth = PluginMetadataRegistry.shared.snapshot( forTypeId: connection.type.pluginTypeId )?.supportsHealthMonitor ?? true @@ -164,7 +146,6 @@ extension DatabaseManager { await startHealthMonitor(for: connection.id) } } catch { - // Close tunnel if connection failed if connection.resolvedSSHConfig.enabled { Task { do { @@ -175,12 +156,10 @@ extension DatabaseManager { } } - // Remove failed session completely so UI returns to Welcome window + // Remove failed session completely so UI returns to Welcome window. removeSessionEntry(for: connection.id) - // Clear current session if this was it if currentSessionId == connection.id { - // Switch to another session if available, otherwise clear if let nextSessionId = activeSessions.keys.first { currentSessionId = nextSessionId } else { @@ -268,6 +247,7 @@ extension DatabaseManager { session.currentSchema = nil } appSettingsStorage.saveLastSchema(nil, for: connectionId) + await SchemaService.shared.invalidate(connectionId: connectionId) await reconnectSession(connectionId) } else if pm?.capabilities.supportsSchemaSwitching == true, let schemaDriver = driver as? SchemaSwitchable { @@ -304,7 +284,6 @@ extension DatabaseManager { appSettingsStorage.saveLastSchema(schema, for: connectionId) } - /// Switch to an existing session func switchToSession(_ sessionId: UUID) { guard activeSessions[sessionId] != nil else { return } currentSessionId = sessionId @@ -313,7 +292,6 @@ extension DatabaseManager { } } - /// Disconnect a specific session func disconnectSession(_ sessionId: UUID) async { let lifecycleLogger = Logger(subsystem: "com.TablePro", category: "NativeTabLifecycle") guard let session = activeSessions[sessionId] else { @@ -327,7 +305,6 @@ extension DatabaseManager { "[close] disconnectSession start connId=\(sessionId, privacy: .public) name=\(session.connection.name, privacy: .public) hasSSH=\(session.connection.resolvedSSHConfig.enabled)" ) - // Close SSH tunnel if exists if session.connection.resolvedSSHConfig.enabled { let sshStart = Date() do { @@ -340,7 +317,6 @@ extension DatabaseManager { ) } - // Stop health monitoring let hmStart = Date() await stopHealthMonitor(for: sessionId) lifecycleLogger.info( @@ -354,18 +330,16 @@ extension DatabaseManager { ) removeSessionEntry(for: sessionId) - // Clean up shared schema cache for this connection + await SchemaService.shared.invalidate(connectionId: sessionId) + SchemaProviderRegistry.shared.clear(for: sessionId) - // Clean up shared sidebar state for this connection SharedSidebarState.removeConnection(sessionId) - // If this was the current session, switch to another or clear if currentSessionId == sessionId { if let nextSessionId = activeSessions.keys.first { switchToSession(nextSessionId) } else { - // No more sessions - clear current session and last connection ID currentSessionId = nil appSettingsStorage.saveLastConnectionId(nil) } @@ -375,7 +349,6 @@ extension DatabaseManager { ) } - /// Disconnect all sessions func disconnectAll() async { let monitorIds = Array(healthMonitors.keys) for sessionId in monitorIds { @@ -388,8 +361,7 @@ extension DatabaseManager { } } - /// Update session state (for preserving UI state). - /// Skips the write-back when no observable fields changed, avoiding spurious connectionStatusVersion bumps. + // Skips the write-back when no observable fields changed, avoiding spurious connectionStatusVersion bumps. func updateSession(_ sessionId: UUID, update: (inout ConnectionSession) -> Void) { guard var session = activeSessions[sessionId] else { return } let before = session @@ -400,14 +372,12 @@ extension DatabaseManager { setSession(session, for: sessionId) } - /// Write a session and bump its per-connection version counter. internal func setSession(_ session: ConnectionSession, for connectionId: UUID) { activeSessions[connectionId] = session connectionStatusVersions[connectionId, default: 0] &+= 1 NotificationCenter.default.post(name: .connectionStatusDidChange, object: connectionId) } - /// Remove a session and clean up its per-connection version counter. internal func removeSessionEntry(for connectionId: UUID) { activeSessions.removeValue(forKey: connectionId) connectionStatusVersions.removeValue(forKey: connectionId) @@ -415,12 +385,10 @@ extension DatabaseManager { } #if DEBUG - /// Test-only: inject a session for unit testing without real database connections internal func injectSession(_ session: ConnectionSession, for connectionId: UUID) { setSession(session, for: connectionId) } - /// Test-only: remove an injected session internal func removeSession(for connectionId: UUID) { removeSessionEntry(for: connectionId) } diff --git a/TablePro/Core/Database/DatabaseManager.swift b/TablePro/Core/Database/DatabaseManager.swift index 83bded437..d70f35448 100644 --- a/TablePro/Core/Database/DatabaseManager.swift +++ b/TablePro/Core/Database/DatabaseManager.swift @@ -60,6 +60,8 @@ final class DatabaseManager { /// and the wake-from-sleep handler fire for the same connection. @ObservationIgnored internal var recoveringConnectionIds = Set() + @ObservationIgnored internal let ensureConnectedDedup = OnceTask() + /// Current session (computed from currentSessionId) var currentSession: ConnectionSession? { guard let sessionId = currentSessionId else { return nil } diff --git a/TablePro/Core/MCP/MCPAuthGuard.swift b/TablePro/Core/MCP/MCPAuthGuard.swift deleted file mode 100644 index c4689f3d8..000000000 --- a/TablePro/Core/MCP/MCPAuthGuard.swift +++ /dev/null @@ -1,274 +0,0 @@ -// -// MCPAuthGuard.swift -// TablePro -// -// Enforces AIConnectionPolicy and SafeModeLevel for MCP requests. -// - -import AppKit -import Foundation -import os - -actor MCPAuthGuard { - private static let logger = Logger(subsystem: "com.TablePro", category: "MCPAuthGuard") - - /// Per-session approved connections (for askEachTime policy) - private var sessionApprovals: [String: Set] = [:] - - /// In-flight approval prompts keyed by (sessionId, connectionId) to dedupe concurrent requests. - private var inFlightApprovals: [ApprovalKey: Task] = [:] - - private struct ApprovalKey: Hashable { - let sessionId: String - let connectionId: UUID - } - - // MARK: - Connection Access Check - - func checkConnectionAccess(connectionId: UUID, sessionId: String) async throws { - let snapshot: ConnectionAccessSnapshot? = await MainActor.run { - let conns = ConnectionStorage.shared.loadConnections() - guard let conn = conns.first(where: { $0.id == connectionId }) else { - return nil - } - return ConnectionAccessSnapshot( - policy: conn.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy, - externalAccess: conn.externalAccess, - name: conn.name, - databaseType: conn.type.rawValue - ) - } - - guard let snapshot else { - throw MCPError.forbidden( - String(localized: "Connection not found") - ) - } - - switch snapshot.policy { - case .alwaysAllow: - break - - case .never: - throw MCPError.forbidden( - String(localized: "AI access is disabled for this connection") - ) - - case .askEachTime: - if let approved = sessionApprovals[sessionId], approved.contains(connectionId) { - break - } - - let key = ApprovalKey(sessionId: sessionId, connectionId: connectionId) - let approvalTask: Task - if let existing = inFlightApprovals[key] { - approvalTask = existing - } else { - let connectionName = snapshot.name - let databaseType = snapshot.databaseType - approvalTask = Task { - try await self.promptUserApproval( - connectionName: connectionName, - databaseType: databaseType - ) - } - inFlightApprovals[key] = approvalTask - } - - let userApproved: Bool - do { - userApproved = try await approvalTask.value - inFlightApprovals.removeValue(forKey: key) - } catch { - inFlightApprovals.removeValue(forKey: key) - throw error - } - - if userApproved { - sessionApprovals[sessionId, default: []].insert(connectionId) - } else { - throw MCPError.forbidden( - String(localized: "User denied MCP access to this connection") - ) - } - } - - if snapshot.externalAccess == .blocked { - throw MCPError.forbidden( - String(localized: "External access is disabled for this connection") - ) - } - } - - func checkExternalAccessLevel( - connectionId: UUID, - requires required: ExternalAccessLevel - ) async throws { - let externalAccess: ExternalAccessLevel? = await MainActor.run { - ConnectionStorage.shared.loadConnections().first { $0.id == connectionId }?.externalAccess - } - - guard let externalAccess else { - throw MCPError.forbidden( - String(localized: "Connection not found") - ) - } - - guard externalAccess.satisfies(required) else { - throw MCPError.forbidden( - String(localized: "Connection is read-only for external clients") - ) - } - } - - func checkExternalWritePermission( - connectionId: UUID, - sql: String, - databaseType: DatabaseType - ) async throws { - guard QueryClassifier.isWriteQuery(sql, databaseType: databaseType) else { return } - - let externalAccess: ExternalAccessLevel? = await MainActor.run { - ConnectionStorage.shared.loadConnections().first { $0.id == connectionId }?.externalAccess - } - - guard let externalAccess else { - throw MCPError.forbidden( - String(localized: "Connection not found") - ) - } - - if externalAccess != .readWrite { - throw MCPError.forbidden( - String(localized: "Connection is read-only for external clients") - ) - } - } - - private struct ConnectionAccessSnapshot: Sendable { - let policy: AIConnectionPolicy - let externalAccess: ExternalAccessLevel - let name: String - let databaseType: String - } - - // MARK: - Query Permission Check - - func checkQueryPermission( - sql: String, - connectionId: UUID, - databaseType: DatabaseType, - safeModeLevel: SafeModeLevel - ) async throws { - try await checkExternalWritePermission( - connectionId: connectionId, - sql: sql, - databaseType: databaseType - ) - - let isWrite = QueryClassifier.isWriteQuery(sql, databaseType: databaseType) - let needsDialog = safeModeLevel != .silent && (isWrite || safeModeLevel == .alertFull || safeModeLevel == .safeModeFull) - - var window: NSWindow? - if needsDialog { - window = await MainActor.run { - NSApp.activate(ignoringOtherApps: true) - return NSApp.keyWindow ?? NSApp.mainWindow - } - } - - let permission = await SafeModeGuard.checkPermission( - level: safeModeLevel, - isWriteOperation: isWrite, - sql: sql, - operationDescription: String(localized: "MCP query execution"), - window: window, - databaseType: databaseType - ) - - if case .blocked(let reason) = permission { - throw MCPError.forbidden(reason) - } - } - - // MARK: - Query Logging - - func logQuery( - sql: String, - connectionId: UUID, - databaseName: String, - executionTime: TimeInterval, - rowCount: Int, - wasSuccessful: Bool, - errorMessage: String? - ) async { - let shouldLog = await MainActor.run { - AppSettingsManager.shared.mcp.logQueriesInHistory - } - guard shouldLog else { return } - - let entry = QueryHistoryEntry( - query: sql, - connectionId: connectionId, - databaseName: databaseName, - executionTime: executionTime, - rowCount: rowCount, - wasSuccessful: wasSuccessful, - errorMessage: errorMessage - ) - - _ = await QueryHistoryStorage.shared.addHistory(entry) - } - - // MARK: - User Approval (askEachTime) - - private func promptUserApproval(connectionName: String, databaseType: String) async throws -> Bool { - let approvalTask = Task { @MainActor in - NSApp.requestUserAttention(.criticalRequest) - NSApp.activate(ignoringOtherApps: true) - return await AlertHelper.confirmDestructive( - title: String(localized: "MCP Access Request"), - message: String( - format: String(localized: "An MCP client wants to access '%@' (%@). Allow?"), - connectionName, - databaseType - ), - confirmButton: String(localized: "Allow"), - cancelButton: String(localized: "Deny"), - window: nil - ) - } - - let approved = try await withThrowingTaskGroup(of: Bool.self) { group in - group.addTask { - await approvalTask.value - } - group.addTask { - try await Task.sleep(for: .seconds(30)) - approvalTask.cancel() - throw MCPError.timeout( - String(localized: "User approval timed out after 30 seconds") - ) - } - guard let result = try await group.next() else { - throw MCPError.internalError("No result from approval prompt") - } - approvalTask.cancel() - group.cancelAll() - return result - } - - if approved { - return true - } - throw MCPError.forbidden( - String(localized: "User denied MCP access to this connection") - ) - } - - // MARK: - Session Cleanup - - func clearSession(_ sessionId: String) { - sessionApprovals.removeValue(forKey: sessionId) - } -} diff --git a/TablePro/Core/MCP/MCPAuthPolicy.swift b/TablePro/Core/MCP/MCPAuthPolicy.swift new file mode 100644 index 000000000..2fa2eee60 --- /dev/null +++ b/TablePro/Core/MCP/MCPAuthPolicy.swift @@ -0,0 +1,314 @@ +import AppKit +import Foundation +import os + +typealias MCPToolName = String + +extension MCPToolName { + static let stateMutating: Set = [ + "execute_query", "confirm_destructive_operation", + "switch_database", "switch_schema", "export_data" + ] + static let requiresFullAccess: Set = ["confirm_destructive_operation"] + static let requiresReadWrite: Set = ["switch_database", "switch_schema", "export_data"] + static let writeQueryTools: Set = ["execute_query"] +} + +enum AuthDecision: Sendable { + case allowed + case requiresUserApproval(reason: String) + case denied(reason: String) +} + +actor MCPAuthPolicy { + private static let logger = Logger(subsystem: "com.TablePro", category: "MCPAuthPolicy") + + private var sessionApprovals: [String: Set] = [:] + private let approvalDedup = OnceTask() + + private struct ApprovalKey: Hashable, Sendable { + let sessionId: String + let connectionId: UUID + } + + private struct ConnectionSnapshot: Sendable { + let policy: AIConnectionPolicy + let externalAccess: ExternalAccessLevel + let name: String + let databaseType: String + let safeModeLevel: SafeModeLevel + } + + func authorize( + token: MCPAuthToken, + tool: MCPToolName, + connectionId: UUID?, + sql: String? = nil, + sessionId: String + ) async throws -> AuthDecision { + guard let connectionId else { + return decideTokenTier(token: token, tool: tool) + } + + guard let snapshot = await loadConnection(connectionId) else { + return .denied(reason: String(localized: "Connection not found")) + } + + if snapshot.policy == .never { + return .denied(reason: String(localized: "AI access is disabled for this connection")) + } + + if snapshot.externalAccess == .blocked { + return .denied(reason: String(localized: "External access is disabled for this connection")) + } + + if !token.connectionAccess.allows(connectionId) { + return .denied(reason: String(localized: "Token does not have access to this connection")) + } + + if case .denied(let reason) = decideTokenTier(token: token, tool: tool) { + return .denied(reason: reason) + } + + if let writeReason = denialForWriteIntent( + tool: tool, + sql: sql, + externalAccess: snapshot.externalAccess, + databaseType: snapshot.databaseType + ) { + return .denied(reason: writeReason) + } + + if snapshot.policy == .askEachTime, + !(sessionApprovals[sessionId]?.contains(connectionId) ?? false) + { + return .requiresUserApproval( + reason: String( + format: String(localized: "An MCP client wants to access '%@' (%@). Allow?"), + snapshot.name, + snapshot.databaseType + ) + ) + } + + return .allowed + } + + func resolveAndAuthorize( + token: MCPAuthToken, + tool: MCPToolName, + connectionId: UUID?, + sql: String? = nil, + sessionId: String + ) async throws { + let decision = try await authorize( + token: token, + tool: tool, + connectionId: connectionId, + sql: sql, + sessionId: sessionId + ) + + switch decision { + case .allowed: + return + + case .denied(let reason): + throw MCPError.forbidden(reason) + + case .requiresUserApproval(let reason): + guard let connectionId else { + throw MCPError.forbidden(reason) + } + let approved = try await runApprovalDedup( + sessionId: sessionId, + connectionId: connectionId, + reason: reason + ) + if approved { + recordApproval(sessionId: sessionId, connectionId: connectionId) + } else { + throw MCPError.forbidden( + String(localized: "User denied MCP access to this connection") + ) + } + } + } + + func recordApproval(sessionId: String, connectionId: UUID) { + sessionApprovals[sessionId, default: []].insert(connectionId) + } + + func clearSession(_ sessionId: String) { + sessionApprovals.removeValue(forKey: sessionId) + } + + func checkSafeModeDialog( + sql: String, + connectionId: UUID, + databaseType: DatabaseType, + safeModeLevel: SafeModeLevel + ) async throws { + let isWrite = QueryClassifier.isWriteQuery(sql, databaseType: databaseType) + let needsDialog = safeModeLevel != .silent + && (isWrite || safeModeLevel == .alertFull || safeModeLevel == .safeModeFull) + + let window: NSWindow? = needsDialog + ? await MainActor.run { + NSApp.activate(ignoringOtherApps: true) + return WindowLifecycleMonitor.shared.findWindow(for: connectionId) + ?? NSApp.mainWindow + } + : nil + + let permission = await SafeModeGuard.checkPermission( + level: safeModeLevel, + isWriteOperation: isWrite, + sql: sql, + operationDescription: String(localized: "MCP query execution"), + window: window, + databaseType: databaseType + ) + + if case .blocked(let reason) = permission { + throw MCPError.forbidden(reason) + } + } + + func logQuery( + sql: String, + connectionId: UUID, + databaseName: String, + executionTime: TimeInterval, + rowCount: Int, + wasSuccessful: Bool, + errorMessage: String? + ) async { + let shouldLog = await MainActor.run { + AppSettingsManager.shared.mcp.logQueriesInHistory + } + guard shouldLog else { return } + + let entry = QueryHistoryEntry( + query: sql, + connectionId: connectionId, + databaseName: databaseName, + executionTime: executionTime, + rowCount: rowCount, + wasSuccessful: wasSuccessful, + errorMessage: errorMessage + ) + + _ = await QueryHistoryStorage.shared.addHistory(entry) + } + + private func runApprovalDedup( + sessionId: String, + connectionId: UUID, + reason: String + ) async throws -> Bool { + let key = ApprovalKey(sessionId: sessionId, connectionId: connectionId) + return try await approvalDedup.execute(key: key) { + try await Self.promptApproval(reason: reason) + } + } + + private static func promptApproval(reason: String) async throws -> Bool { + try await withThrowingTaskGroup(of: Bool.self) { group in + defer { group.cancelAll() } + group.addTask { + await AlertHelper.runApprovalModal( + title: String(localized: "MCP Access Request"), + message: reason, + confirm: String(localized: "Allow"), + cancel: String(localized: "Deny") + ) + } + group.addTask { + try await Task.sleep(for: .seconds(30)) + throw MCPError.timeout( + String(localized: "User approval timed out after 30 seconds") + ) + } + guard let result = try await group.next() else { + throw MCPError.internalError("No result from approval prompt") + } + return result + } + } + + private func decideTokenTier(token: MCPAuthToken, tool: MCPToolName) -> AuthDecision { + let required = requiredPermission(for: tool) + if token.permissions.satisfies(required) { + return .allowed + } + return .denied( + reason: String( + format: String(localized: "Token '%@' with permission '%@' cannot access '%@'"), + token.name, + token.permissions.displayName, + tool + ) + ) + } + + private func requiredPermission(for tool: MCPToolName) -> TokenPermissions { + if MCPToolName.requiresFullAccess.contains(tool) { return .fullAccess } + if MCPToolName.requiresReadWrite.contains(tool) { return .readWrite } + return .readOnly + } + + private func denialForWriteIntent( + tool: MCPToolName, + sql: String?, + externalAccess: ExternalAccessLevel, + databaseType: String + ) -> String? { + if MCPToolName.requiresReadWrite.contains(tool) || MCPToolName.requiresFullAccess.contains(tool) { + if externalAccess != .readWrite { + return String(localized: "Connection is read-only for external clients") + } + return nil + } + + guard MCPToolName.writeQueryTools.contains(tool), let sql else { + return nil + } + + let dbType = DatabaseType(rawValue: databaseType) + guard QueryClassifier.isWriteQuery(sql, databaseType: dbType) else { + return nil + } + if externalAccess != .readWrite { + return String(localized: "Connection is read-only for external clients") + } + return nil + } + + private func loadConnection(_ connectionId: UUID) async -> ConnectionSnapshot? { + await MainActor.run { + let state = DatabaseManager.shared.connectionState(connectionId) + switch state { + case .live(_, let session): + let conn = session.connection + return ConnectionSnapshot( + policy: conn.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy, + externalAccess: conn.externalAccess, + name: conn.name, + databaseType: conn.type.rawValue, + safeModeLevel: conn.safeModeLevel + ) + case .stored(let conn): + return ConnectionSnapshot( + policy: conn.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy, + externalAccess: conn.externalAccess, + name: conn.name, + databaseType: conn.type.rawValue, + safeModeLevel: conn.safeModeLevel + ) + case .unknown: + return nil + } + } + } +} diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index 770daeb0c..97e647c56 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -11,8 +11,6 @@ import os actor MCPConnectionBridge { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPConnectionBridge") - private var inFlightConnects: [UUID: Task] = [:] - // MARK: - Connection Management func listConnections() async -> JSONValue { @@ -72,9 +70,7 @@ actor MCPConnectionBridge { return .object(result) } - // Not connected yet -- create a new session via DatabaseManager. - // connectToSession is @MainActor; Swift hops automatically for async calls. - try await DatabaseManager.shared.connectToSession(connection) + try await DatabaseManager.shared.ensureConnected(connection) let (serverVersion, currentDatabase, currentSchema) = await MainActor.run { let session = DatabaseManager.shared.activeSessions[connectionId] @@ -173,8 +169,9 @@ actor MCPConnectionBridge { timeoutSeconds: Int ) async throws -> JSONValue { let (driver, databaseType) = try await resolveDriver(connectionId) - let isWrite = QueryClassifier.isWriteQuery(query, databaseType: databaseType) - let hasReturning = query.range(of: #"\bRETURNING\b"#, options: [.regularExpression, .caseInsensitive]) != nil + let normalizedQuery = Self.stripTrailingSemicolons(query) + let isWrite = QueryClassifier.isWriteQuery(normalizedQuery, databaseType: databaseType) + let hasReturning = normalizedQuery.range(of: #"\bRETURNING\b"#, options: [.regularExpression, .caseInsensitive]) != nil let shouldUseFetchRows = !isWrite || hasReturning let effectiveLimit = maxRows + 1 @@ -186,9 +183,9 @@ actor MCPConnectionBridge { try await withThrowingTaskGroup(of: QueryResult.self) { group in group.addTask { if shouldUseFetchRows { - try await driver.fetchRows(query: query, offset: 0, limit: effectiveLimit) + try await driver.fetchRows(query: normalizedQuery, offset: 0, limit: effectiveLimit) } else { - try await driver.execute(query: query) + try await driver.execute(query: normalizedQuery) } } group.addTask { @@ -237,15 +234,8 @@ actor MCPConnectionBridge { // MARK: - Schema Operations func listTables(connectionId: UUID, includeRowCounts: Bool) async throws -> JSONValue { - let provider = await MainActor.run { - SchemaProviderRegistry.shared.provider(for: connectionId) - } - var cachedTables: [TableInfo] = [] - if let provider { - let cached = await provider.getTables() - if !cached.isEmpty { - cachedTables = cached - } + let cachedTables = await MainActor.run { + SchemaService.shared.tables(for: connectionId) } let tables: [TableInfo] @@ -385,16 +375,8 @@ actor MCPConnectionBridge { // MARK: - Schema Resource (for resources/read) func fetchSchemaResource(connectionId: UUID) async throws -> JSONValue { - // Check SchemaProviderRegistry cache first - let provider = await MainActor.run { - SchemaProviderRegistry.shared.provider(for: connectionId) - } - var cachedTables: [TableInfo] = [] - if let provider { - let cached = await provider.getTables() - if !cached.isEmpty { - cachedTables = cached - } + let cachedTables = await MainActor.run { + SchemaService.shared.tables(for: connectionId) } let (driver, _) = try await resolveDriver(connectionId) @@ -486,33 +468,28 @@ actor MCPConnectionBridge { // MARK: - Private Helpers private func resolveDriver(_ connectionId: UUID) async throws -> (DatabaseDriver, DatabaseType) { - let connection: DatabaseConnection? = await MainActor.run { - if DatabaseManager.shared.activeSessions[connectionId]?.driver != nil { return nil } - return ConnectionStorage.shared.loadConnections().first { $0.id == connectionId } + let pending: DatabaseConnection? = await MainActor.run { + switch DatabaseManager.shared.connectionState(connectionId) { + case .live: return nil + case .stored(let connection): return connection + case .unknown: return nil + } } - if let connection { - try await connectIfNeeded(connection) + if let pending { + try await connectIfNeeded(pending) } return try await MainActor.run { - guard let session = DatabaseManager.shared.activeSessions[connectionId], - let driver = session.driver else { + switch DatabaseManager.shared.connectionState(connectionId) { + case .live(let driver, let session): + return (driver, session.connection.type) + case .stored, .unknown: throw MCPError.notConnected(connectionId) } - return (driver, session.connection.type) } } private func connectIfNeeded(_ connection: DatabaseConnection) async throws { - if let existing = inFlightConnects[connection.id] { - try await existing.value - return - } - let task = Task { [connection] in - try await DatabaseManager.shared.connectToSession(connection) - } - inFlightConnects[connection.id] = task - defer { inFlightConnects.removeValue(forKey: connection.id) } - try await task.value + try await DatabaseManager.shared.ensureConnected(connection) } private func resolveSession(_ connectionId: UUID) async throws -> ConnectionSession { @@ -533,4 +510,13 @@ actor MCPConnectionBridge { return connection } } + + static func stripTrailingSemicolons(_ query: String) -> String { + var result = query.trimmingCharacters(in: .whitespacesAndNewlines) + while result.hasSuffix(";") { + result = String(result.dropLast()) + .trimmingCharacters(in: .whitespacesAndNewlines) + } + return result + } } diff --git a/TablePro/Core/MCP/MCPHTTPParser.swift b/TablePro/Core/MCP/MCPHTTPParser.swift index 6fdc329ae..5662aa73e 100644 --- a/TablePro/Core/MCP/MCPHTTPParser.swift +++ b/TablePro/Core/MCP/MCPHTTPParser.swift @@ -13,6 +13,19 @@ struct HTTPRequest: Sendable { let path: String let headers: [String: String] let body: Data? + var remoteIP: String? + + init(method: Method, path: String, headers: [String: String], body: Data?, remoteIP: String? = nil) { + self.method = method + self.path = path + self.headers = headers + self.body = body + self.remoteIP = remoteIP + } + + func withRemoteIP(_ remoteIP: String?) -> HTTPRequest { + HTTPRequest(method: method, path: path, headers: headers, body: body, remoteIP: remoteIP) + } } enum HTTPParseError: Error, Sendable { diff --git a/TablePro/Core/MCP/MCPPairingService.swift b/TablePro/Core/MCP/MCPPairingService.swift index ae1652fbb..c486180f2 100644 --- a/TablePro/Core/MCP/MCPPairingService.swift +++ b/TablePro/Core/MCP/MCPPairingService.swift @@ -120,12 +120,13 @@ final class MCPPairingService { throw MCPError.internalError("Token store unavailable") } - let approval = try await PairingApprovalPresenter.present(request: request) + let approval = try await AlertHelper.runPairingApproval(request: request) + let connectionAccess: ConnectionAccess = approval.allowedConnectionIds.map { .limited($0) } ?? .all let result = await tokenStore.generate( name: request.clientName, permissions: approval.grantedPermissions, - allowedConnectionIds: approval.allowedConnectionIds, + connectionAccess: connectionAccess, expiresAt: approval.expiresAt ) diff --git a/TablePro/Core/MCP/MCPResourceHandler.swift b/TablePro/Core/MCP/MCPResourceHandler.swift index d2fec5f24..aa4b36226 100644 --- a/TablePro/Core/MCP/MCPResourceHandler.swift +++ b/TablePro/Core/MCP/MCPResourceHandler.swift @@ -5,11 +5,11 @@ final class MCPResourceHandler: Sendable { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPResourceHandler") private let bridge: MCPConnectionBridge - private let authGuard: MCPAuthGuard + private let authPolicy: MCPAuthPolicy - init(bridge: MCPConnectionBridge, authGuard: MCPAuthGuard) { + init(bridge: MCPConnectionBridge, authPolicy: MCPAuthPolicy) { self.bridge = bridge - self.authGuard = authGuard + self.authPolicy = authPolicy } func handleResourceRead(uri: String, sessionId: String) async throws -> MCPResourceReadResult { @@ -65,7 +65,12 @@ final class MCPResourceHandler: Sendable { } private func handleSchemaResource(uri: String, connectionId: UUID, sessionId: String) async throws -> MCPResourceReadResult { - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authPolicy.resolveAndAuthorize( + token: MCPToolHandler.anonymousFullAccessToken, + tool: "describe_table", + connectionId: connectionId, + sessionId: sessionId + ) let result = try await bridge.fetchSchemaResource(connectionId: connectionId) let jsonString = encodeJSON(result) return MCPResourceReadResult(contents: [ @@ -79,7 +84,12 @@ final class MCPResourceHandler: Sendable { queryItems: [URLQueryItem], sessionId: String ) async throws -> MCPResourceReadResult { - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authPolicy.resolveAndAuthorize( + token: MCPToolHandler.anonymousFullAccessToken, + tool: "search_query_history", + connectionId: connectionId, + sessionId: sessionId + ) let limit = queryItems.first(where: { $0.name == "limit" }) .flatMap { $0.value } .flatMap { Int($0) } diff --git a/TablePro/Core/MCP/MCPRouteHandler.swift b/TablePro/Core/MCP/MCPRouteHandler.swift new file mode 100644 index 000000000..3b7a39c12 --- /dev/null +++ b/TablePro/Core/MCP/MCPRouteHandler.swift @@ -0,0 +1,7 @@ +import Foundation + +protocol MCPRouteHandler: Sendable { + var methods: [HTTPRequest.Method] { get } + var path: String { get } + func handle(_ request: HTTPRequest) async -> MCPRouter.RouteResult +} diff --git a/TablePro/Core/MCP/MCPRouter.swift b/TablePro/Core/MCP/MCPRouter.swift index a47305a02..1561e27dd 100644 --- a/TablePro/Core/MCP/MCPRouter.swift +++ b/TablePro/Core/MCP/MCPRouter.swift @@ -1,12 +1,6 @@ import Foundation -import os final class MCPRouter: Sendable { - private static let logger = Logger(subsystem: "com.TablePro", category: "MCPRouter") - - private let encoder: JSONEncoder - private let decoder: JSONDecoder - enum RouteResult: Sendable { case json(Data, sessionId: String?) case sseStream(sessionId: String) @@ -16,542 +10,40 @@ final class MCPRouter: Sendable { case httpErrorWithHeaders(status: Int, message: String, extraHeaders: [(String, String)]) } - init() { - let enc = JSONEncoder() - enc.outputFormatting = [.sortedKeys] - self.encoder = enc - self.decoder = JSONDecoder() + private let routes: [any MCPRouteHandler] + + init(routes: [any MCPRouteHandler]) { + self.routes = routes } - func route( - _ request: HTTPRequest, - server: MCPServer, - remoteIP: String?, - tokenStore: MCPTokenStore?, - rateLimiter: MCPRateLimiter? - ) async -> RouteResult { + func handle(_ request: HTTPRequest) async -> RouteResult { if request.path.hasPrefix("/.well-known/") { return .httpError(status: 404, message: "Not found") } - if request.path == "/v1/integrations/exchange" - || request.path.hasPrefix("/v1/integrations/exchange?") - { - return await handleIntegrationsExchange(request) + if request.method == .options { + return .noContent } - guard request.path == "/mcp" || request.path.hasPrefix("/mcp?") else { + guard let route = match(request) else { return .httpError(status: 404, message: "Not found") } - if let rateLimiter, let ip = remoteIP { - let lockoutCheck = await rateLimiter.isLockedOut(ip: ip) - if case .rateLimited(let retryAfter) = lockoutCheck { - let seconds = Int(retryAfter.components.seconds) - MCPAuditLogger.logRateLimited(ip: ip, retryAfterSeconds: seconds) - return .httpErrorWithHeaders( - status: 429, - message: "Too many failed attempts", - extraHeaders: [("Retry-After", "\(seconds)")] - ) - } - } - - let authResult = await authenticateRequest( - request, - remoteIP: remoteIP, - tokenStore: tokenStore, - rateLimiter: rateLimiter - ) - - switch authResult { - case .failure(let result): - return result - case .success(let token): - if token == nil { - if let origin = request.headers["origin"], !isAllowedOrigin(origin) { - return .httpError(status: 403, message: "Forbidden origin") - } - } - - switch request.method { - case .options: - return handleOptions() - case .post: - return await handlePost(request, server: server, authenticatedToken: token) - case .get: - return await handleGet(request, server: server) - case .delete: - return await handleDelete(request, server: server) - } - } - } - - private enum AuthResult { - case success(MCPAuthToken?) - case failure(RouteResult) - } - - private func authenticateRequest( - _ request: HTTPRequest, - remoteIP: String?, - tokenStore: MCPTokenStore?, - rateLimiter: MCPRateLimiter? - ) async -> AuthResult { - let authRequired = await MainActor.run { AppSettingsManager.shared.mcp.requireAuthentication } - - guard let authHeader = request.headers["authorization"] else { - guard !authRequired else { - MCPAuditLogger.logAuthFailure(reason: "Missing authorization header", ip: remoteIP ?? "localhost") - return .failure(.httpErrorWithHeaders( - status: 401, - message: "Authentication required", - extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] - )) - } - return .success(nil) - } - - guard authHeader.lowercased().hasPrefix("bearer "), let tokenStore else { - let rateLimitResult = await recordAuthFailure(ip: remoteIP, rateLimiter: rateLimiter) - if case .rateLimited(let retryAfter) = rateLimitResult { - let seconds = Int(retryAfter.components.seconds) - MCPAuditLogger.logRateLimited(ip: remoteIP ?? "localhost", retryAfterSeconds: seconds) - return .failure(.httpErrorWithHeaders( - status: 429, - message: "Too many failed attempts", - extraHeaders: [("Retry-After", "\(seconds)")] - )) - } - MCPAuditLogger.logAuthFailure(reason: "Invalid authorization header format", ip: remoteIP ?? "localhost") - return .failure(.httpErrorWithHeaders( - status: 401, - message: "Invalid authorization header", - extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] - )) - } - - let bearerToken = String(authHeader.dropFirst(7)) - - guard let token = await tokenStore.validate(bearerToken: bearerToken) else { - let rateLimitResult = await recordAuthFailure(ip: remoteIP, rateLimiter: rateLimiter) - if case .rateLimited(let retryAfter) = rateLimitResult { - let seconds = Int(retryAfter.components.seconds) - MCPAuditLogger.logRateLimited(ip: remoteIP ?? "localhost", retryAfterSeconds: seconds) - return .failure(.httpErrorWithHeaders( - status: 429, - message: "Too many failed attempts", - extraHeaders: [("Retry-After", "\(seconds)")] - )) - } - MCPAuditLogger.logAuthFailure(reason: "Invalid token", ip: remoteIP ?? "localhost") - return .failure(.httpErrorWithHeaders( - status: 401, - message: "Invalid or expired token", - extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] - )) - } - - if let rateLimiter, let ip = remoteIP { - _ = await rateLimiter.checkAndRecord(ip: ip, success: true) - } - MCPAuditLogger.logAuthSuccess(tokenName: token.name, ip: remoteIP ?? "localhost") - return .success(token) - } - - @discardableResult - private func recordAuthFailure( - ip: String?, - rateLimiter: MCPRateLimiter? - ) async -> MCPRateLimiter.AuthRateResult? { - guard let rateLimiter, let ip else { return nil } - return await rateLimiter.checkAndRecord(ip: ip, success: false) - } - - private func isAllowedOrigin(_ origin: String) -> Bool { - guard let components = URLComponents(string: origin), - let host = components.host - else { - return false - } - let allowedHosts: Set = ["localhost", "127.0.0.1", "::1"] - return allowedHosts.contains(host) - } - - private func handleOptions() -> RouteResult { - .noContent - } - - private func handleGet(_ request: HTTPRequest, server: MCPServer) async -> RouteResult { - guard let sessionId = request.headers["mcp-session-id"] else { - return .httpError(status: 400, message: "Missing Mcp-Session-Id header") - } - - guard let session = await server.session(for: sessionId) else { - return .httpError(status: 404, message: "Session not found") - } - - await session.markActive() - return .sseStream(sessionId: session.id) - } - - private func handleDelete(_ request: HTTPRequest, server: MCPServer) async -> RouteResult { - guard let sessionId = request.headers["mcp-session-id"] else { - return .httpError(status: 400, message: "Missing Mcp-Session-Id header") - } - - guard await server.session(for: sessionId) != nil else { - return .httpError(status: 404, message: "Session not found") - } - - await server.removeSession(sessionId) - Self.logger.info("Session terminated via DELETE: \(sessionId)") - return .noContent - } - - private func handlePost( - _ request: HTTPRequest, - server: MCPServer, - authenticatedToken: MCPAuthToken? - ) async -> RouteResult { - if let accept = request.headers["accept"], !accept.contains("application/json") && !accept.contains("*/*") { - return .httpError(status: 406, message: "Accept header must include application/json") - } - - guard let body = request.body else { - return encodeError(MCPError.parseError, id: nil) - } - - let rpcRequest: JSONRPCRequest - do { - rpcRequest = try decoder.decode(JSONRPCRequest.self, from: body) - } catch { - return encodeError(MCPError.parseError, id: nil) - } - - guard rpcRequest.jsonrpc == "2.0" else { - return encodeError(MCPError.invalidRequest("jsonrpc must be \"2.0\""), id: rpcRequest.id) - } - - if let protocolVersion = request.headers["mcp-protocol-version"], - protocolVersion != "2025-03-26" - { - Self.logger.warning("Client mcp-protocol-version mismatch: \(protocolVersion)") - } - - let headerSessionId = request.headers["mcp-session-id"] - return await dispatchMethod( - rpcRequest, - headerSessionId: headerSessionId, - server: server, - authenticatedToken: authenticatedToken - ) - } - - private func dispatchMethod( - _ request: JSONRPCRequest, - headerSessionId: String?, - server: MCPServer, - authenticatedToken: MCPAuthToken? - ) async -> RouteResult { - if request.method == "initialize" { - return await handleInitialize(request, server: server, authenticatedToken: authenticatedToken) - } - - if request.method == "ping" { - return handlePing(request) - } - - guard let sessionId = headerSessionId else { - return .httpError(status: 400, message: "Missing Mcp-Session-Id header") - } - guard let session = await server.session(for: sessionId) else { - return .httpError(status: 404, message: "Session not found") - } - - await session.markActive() - - if request.method == "notifications/initialized" { - await session.setInitialized(true) - return .accepted - } - - if request.method == "notifications/cancelled" { - return await handleCancellation(request, session: session) - } - - guard await session.isInitialized else { - return encodeError( - MCPError.invalidRequest("Session not initialized. Send notifications/initialized first."), - id: request.id - ) - } - - switch request.method { - case "tools/list": - return handleToolsList(request, sessionId: sessionId) - - case "tools/call": - return await handleToolsCall( - request, - sessionId: sessionId, - server: server, - authenticatedToken: authenticatedToken - ) - - case "resources/list": - return handleResourcesList(request, sessionId: sessionId) - - case "resources/read": - return await handleResourcesRead(request, sessionId: sessionId, server: server) - - default: - return encodeError(MCPError.methodNotFound(request.method), id: request.id) - } - } - - private func handleInitialize( - _ request: JSONRPCRequest, - server: MCPServer, - authenticatedToken: MCPAuthToken? - ) async -> RouteResult { - guard let session = await server.createSession() else { - return encodeError(MCPError.internalError("Maximum sessions reached"), id: request.id) - } - - if let params = request.params, - let clientInfo = params["clientInfo"], - let name = clientInfo["name"]?.stringValue - { - let version = clientInfo["version"]?.stringValue - await session.setClientInfo(MCPClientInfo(name: name, version: version)) - } - - if let token = authenticatedToken { - await session.setAuthenticatedTokenId(token.id) - await session.setTokenName(token.name) - } - - let result = MCPInitializeResult( - protocolVersion: "2025-03-26", - capabilities: MCPServerCapabilities( - tools: .init(listChanged: false), - resources: .init(subscribe: false, listChanged: false) - ), - serverInfo: MCPServerInfo(name: "tablepro", version: "1.0.0") - ) - - return encodeResult(result, id: request.id, sessionId: session.id) - } - - private func handlePing(_ request: JSONRPCRequest) -> RouteResult { - guard let id = request.id else { - return .accepted - } - return encodeRawResult(.object([:]), id: id, sessionId: nil) - } - - private func handleCancellation( - _ request: JSONRPCRequest, - session: MCPSession - ) async -> RouteResult { - guard let params = request.params, - let requestIdValue = params["requestId"] - else { - return .accepted - } - - let cancelId: JSONRPCId? - switch requestIdValue { - case .string(let s): - cancelId = .string(s) - case .int(let i): - cancelId = .int(i) - default: - cancelId = nil - } - - if let cancelId, let task = await session.removeRunningTask(cancelId) { - task.cancel() - Self.logger.info("Cancelled request \(String(describing: cancelId)) in session \(session.id)") - } - - return .accepted - } - - private func handleToolsList(_ request: JSONRPCRequest, sessionId: String) -> RouteResult { - guard let id = request.id else { - return .accepted - } - - let tools = Self.toolDefinitions() - let result: JSONValue = .object(["tools": encodeToolDefinitions(tools)]) - return encodeRawResult(result, id: id, sessionId: sessionId) - } - - private func handleToolsCall( - _ request: JSONRPCRequest, - sessionId: String, - server: MCPServer, - authenticatedToken: MCPAuthToken? - ) async -> RouteResult { - guard let id = request.id else { - return encodeError(MCPError.invalidRequest("tools/call requires an id"), id: nil) - } - - guard let params = request.params, - let name = params["name"]?.stringValue - else { - return encodeError(MCPError.invalidParams("Missing tool name"), id: id) - } - - let arguments = params["arguments"] - - guard let handler = await server.toolCallHandler else { - return encodeError(MCPError.internalError("Server not fully initialized"), id: id) - } - - let session = await server.session(for: sessionId) - let toolTask = Task { - try await handler(name, arguments, sessionId, authenticatedToken) - } - if let session { - let cancelForwardingTask = Task { - await withTaskCancellationHandler { - _ = try? await toolTask.value - } onCancel: { - toolTask.cancel() - } - } - await session.addRunningTask(id, task: cancelForwardingTask) - } - - do { - let toolResult = try await toolTask.value - if let session { _ = await session.removeRunningTask(id) } - let resultData = try encoder.encode(toolResult) - guard let resultValue = try? decoder.decode(JSONValue.self, from: resultData) else { - return encodeError(MCPError.internalError("Failed to encode tool result"), id: id) - } - return encodeRawResult(resultValue, id: id, sessionId: sessionId) - } catch is CancellationError { - if let session { _ = await session.removeRunningTask(id) } - return encodeError(MCPError.timeout("Request was cancelled"), id: id) - } catch let mcpError as MCPError { - if let session { _ = await session.removeRunningTask(id) } - return encodeError(mcpError, id: id) - } catch { - if let session { _ = await session.removeRunningTask(id) } - return encodeError(MCPError.internalError(error.localizedDescription), id: id) - } - } - - private func handleResourcesList(_ request: JSONRPCRequest, sessionId: String) -> RouteResult { - guard let id = request.id else { - return .accepted - } - - let resources = Self.resourceDefinitions() - let result: JSONValue = .object(["resources": encodeResourceDefinitions(resources)]) - return encodeRawResult(result, id: id, sessionId: sessionId) - } - - private func handleResourcesRead( - _ request: JSONRPCRequest, - sessionId: String, - server: MCPServer - ) async -> RouteResult { - guard let id = request.id else { - return encodeError(MCPError.invalidRequest("resources/read requires an id"), id: nil) - } - - guard let params = request.params, - let uri = params["uri"]?.stringValue - else { - return encodeError(MCPError.invalidParams("Missing resource uri"), id: id) - } - - guard let handler = await server.resourceReadHandler else { - return encodeError(MCPError.internalError("Server not fully initialized"), id: id) - } - - do { - let readResult = try await handler(uri, sessionId) - let resultData = try encoder.encode(readResult) - guard let resultValue = try? decoder.decode(JSONValue.self, from: resultData) else { - return encodeError(MCPError.internalError("Failed to encode resource result"), id: id) - } - return encodeRawResult(resultValue, id: id, sessionId: sessionId) - } catch let mcpError as MCPError { - return encodeError(mcpError, id: id) - } catch { - return encodeError(MCPError.internalError(error.localizedDescription), id: id) - } + return await route.handle(request) } - private func encodeResult(_ result: T, id: JSONRPCId?, sessionId: String?) -> RouteResult { - guard let id else { - return .accepted - } - - do { - let resultData = try encoder.encode(result) - let resultValue = try decoder.decode(JSONValue.self, from: resultData) - let response = JSONRPCResponse(id: id, result: resultValue) - let data = try encoder.encode(response) - return .json(data, sessionId: sessionId) - } catch { - Self.logger.error("Failed to encode response: \(error.localizedDescription)") - return encodeError(MCPError.internalError("Encoding failed"), id: id) + private func match(_ request: HTTPRequest) -> (any MCPRouteHandler)? { + let normalizedPath = Self.canonicalPath(request.path) + return routes.first { route in + route.path == normalizedPath && route.methods.contains(request.method) } } - private func encodeRawResult(_ result: JSONValue, id: JSONRPCId, sessionId: String?) -> RouteResult { - do { - let response = JSONRPCResponse(id: id, result: result) - let data = try encoder.encode(response) - return .json(data, sessionId: sessionId) - } catch { - Self.logger.error("Failed to encode response: \(error.localizedDescription)") - return encodeError(MCPError.internalError("Encoding failed"), id: id) + private static func canonicalPath(_ path: String) -> String { + if let queryIndex = path.firstIndex(of: "?") { + return String(path[.. RouteResult { - let errorResponse = error.toJsonRpcError(id: id) - do { - let data = try encoder.encode(errorResponse) - return .json(data, sessionId: nil) - } catch { - Self.logger.error("Failed to encode error response") - return .httpError(status: 500, message: "Internal encoding error") - } - } - - private func encodeToolDefinitions(_ tools: [MCPToolDefinition]) -> JSONValue { - .array(tools.map { tool in - .object([ - "name": .string(tool.name), - "description": .string(tool.description), - "inputSchema": tool.inputSchema - ]) - }) - } - - private func encodeResourceDefinitions(_ resources: [MCPResourceDefinition]) -> JSONValue { - .array(resources.map { resource in - var dict: [String: JSONValue] = [ - "uri": .string(resource.uri), - "name": .string(resource.name) - ] - if let description = resource.description { - dict["description"] = .string(description) - } - if let mimeType = resource.mimeType { - dict["mimeType"] = .string(mimeType) - } - return .object(dict) - }) + return path } } @@ -967,81 +459,6 @@ extension MCPRouter { } } -extension MCPRouter { - private struct ExchangeRequestBody: Decodable { - let code: String - let codeVerifier: String - - enum CodingKeys: String, CodingKey { - case code - case codeVerifier = "code_verifier" - } - } - - private struct ExchangeResponseBody: Encodable { - let token: String - } - - func handleIntegrationsExchange(_ request: HTTPRequest) async -> RouteResult { - if request.method == .options { - return .noContent - } - guard request.method == .post else { - return .httpError(status: 405, message: "Method not allowed") - } - - guard let body = request.body else { - return .httpError(status: 400, message: "Missing request body") - } - - let parsed: ExchangeRequestBody - do { - parsed = try decoder.decode(ExchangeRequestBody.self, from: body) - } catch { - return .httpError(status: 400, message: "Invalid JSON body") - } - - guard !parsed.code.isEmpty, !parsed.codeVerifier.isEmpty else { - return .httpError(status: 400, message: "Missing code or code_verifier") - } - - let token: String - do { - token = try await MainActor.run { - try MCPPairingService.shared.exchange( - PairingExchange(code: parsed.code, verifier: parsed.codeVerifier) - ) - } - } catch let mcpError as MCPError { - return mapExchangeError(mcpError) - } catch { - Self.logger.error("Pairing exchange failed: \(error.localizedDescription)") - return .httpError(status: 500, message: "Internal error") - } - - do { - let data = try encoder.encode(ExchangeResponseBody(token: token)) - return .json(data, sessionId: nil) - } catch { - Self.logger.error("Failed to encode exchange response: \(error.localizedDescription)") - return .httpError(status: 500, message: "Internal error") - } - } - - private func mapExchangeError(_ error: MCPError) -> RouteResult { - switch error { - case .notFound: - return .httpError(status: 404, message: "Pairing code not found") - case .expired: - return .httpError(status: 410, message: "Pairing code expired") - case .forbidden: - return .httpError(status: 403, message: "Challenge mismatch") - default: - return .httpError(status: 500, message: "Internal error") - } - } -} - extension MCPRouter { static func resourceDefinitions() -> [MCPResourceDefinition] { [ diff --git a/TablePro/Core/MCP/MCPServer.swift b/TablePro/Core/MCP/MCPServer.swift index 5d2a3b1c3..a499d6581 100644 --- a/TablePro/Core/MCP/MCPServer.swift +++ b/TablePro/Core/MCP/MCPServer.swift @@ -27,7 +27,7 @@ actor MCPServer { private var sessions: [String: MCPSession] = [:] private var cleanupTask: Task? private let stateCallback: @Sendable (MCPServerState) -> Void - private var router: MCPRouter! + private var router: MCPRouter? private(set) var tokenStore: MCPTokenStore? private(set) var rateLimiter: MCPRateLimiter? @@ -38,7 +38,10 @@ actor MCPServer { init(stateCallback: @escaping @Sendable (MCPServerState) -> Void) { self.stateCallback = stateCallback - self.router = MCPRouter() + } + + func setRouter(_ router: MCPRouter) { + self.router = router } func setTokenStore(_ store: MCPTokenStore) { @@ -129,10 +132,18 @@ actor MCPServer { cleanupTask?.cancel() cleanupTask = nil + let sessionIds = Array(sessions.keys) for (_, session) in sessions { await session.cancelAllTasks() await session.cancelSSEConnection() } + + if let cleanupHandler = sessionCleanupHandler { + for id in sessionIds { + await cleanupHandler(id) + } + } + sessions.removeAll() if let currentListener = listener { @@ -280,7 +291,7 @@ actor MCPServer { } } - private static let corsHeaders: [(String, String)] = [ + static let corsHeaders: [(String, String)] = [ ("Access-Control-Allow-Origin", "http://localhost"), ("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS"), ("Access-Control-Allow-Headers", "Content-Type, Mcp-Session-Id, mcp-protocol-version, Authorization"), @@ -295,7 +306,13 @@ actor MCPServer { return "\(host)" }() - let result = await router.route(request, server: self, remoteIP: remoteIP, tokenStore: tokenStore, rateLimiter: rateLimiter) + guard let router else { + sendHTTPError(connection: connection, status: 503, message: "Server not configured") + return + } + + let routedRequest = request.withRemoteIP(remoteIP) + let result = await router.handle(routedRequest) switch result { case .json(let data, let sessionId): @@ -342,6 +359,7 @@ actor MCPServer { guard let session = sessions.removeValue(forKey: sessionId) else { return } await session.cancelAllTasks() await session.cancelSSEConnection() + try? await session.transition(to: .terminated(reason: .removed)) if let cleanupHandler = sessionCleanupHandler { await cleanupHandler(sessionId) @@ -371,6 +389,7 @@ actor MCPServer { if idle > .seconds(Self.idleTimeout) { await session.cancelAllTasks() await session.cancelSSEConnection() + try? await session.transition(to: .terminated(reason: .idleTimeout)) sessions.removeValue(forKey: id) if let cleanupHandler = sessionCleanupHandler { diff --git a/TablePro/Core/MCP/MCPServerManager.swift b/TablePro/Core/MCP/MCPServerManager.swift index f028ac932..a51f0da54 100644 --- a/TablePro/Core/MCP/MCPServerManager.swift +++ b/TablePro/Core/MCP/MCPServerManager.swift @@ -61,9 +61,9 @@ final class MCPServerManager { let rateLimiter = MCPRateLimiter() let bridge = MCPConnectionBridge() - let authGuard = MCPAuthGuard() - let toolHandler = MCPToolHandler(bridge: bridge, authGuard: authGuard) - let resourceHandler = MCPResourceHandler(bridge: bridge, authGuard: authGuard) + let authPolicy = MCPAuthPolicy() + let toolHandler = MCPToolHandler(bridge: bridge, authPolicy: authPolicy) + let resourceHandler = MCPResourceHandler(bridge: bridge, authPolicy: authPolicy) await newServer.setTokenStore(newTokenStore) await newServer.setRateLimiter(rateLimiter) @@ -75,9 +75,18 @@ final class MCPServerManager { try await resourceHandler.handleResourceRead(uri: uri, sessionId: sessionId) } await newServer.setSessionCleanupHandler { sessionId in - await authGuard.clearSession(sessionId) + await authPolicy.clearSession(sessionId) } + let protocolHandler = MCPProtocolHandler( + server: newServer, + tokenStore: newTokenStore, + rateLimiter: rateLimiter + ) + let exchangeHandler = IntegrationsExchangeHandler.live() + let router = MCPRouter(routes: [protocolHandler, exchangeHandler]) + await newServer.setRouter(router) + let bridgeResult = await newTokenStore.generate( name: "__stdio_bridge__", permissions: .fullAccess diff --git a/TablePro/Core/MCP/MCPSession.swift b/TablePro/Core/MCP/MCPSession.swift index 66933e08c..a52295cad 100644 --- a/TablePro/Core/MCP/MCPSession.swift +++ b/TablePro/Core/MCP/MCPSession.swift @@ -6,15 +6,23 @@ actor MCPSession { let createdAt: ContinuousClock.Instant var lastActivityAt: ContinuousClock.Instant - var isInitialized: Bool = false + private(set) var phase: MCPSessionPhase = .created var clientInfo: MCPClientInfo? var sseConnection: NWConnection? var runningTasks: [JSONRPCId: Task] = [:] private(set) var eventCounter: Int = 0 - private(set) var authenticatedTokenId: UUID? - private(set) var tokenName: String? private(set) var remoteAddress: String? + var authenticatedTokenId: UUID? { + if case .active(let tokenId, _) = phase { return tokenId } + return nil + } + + var tokenName: String? { + if case .active(_, let tokenName) = phase { return tokenName } + return nil + } + init() { self.id = UUID().uuidString let now = ContinuousClock.now @@ -33,20 +41,31 @@ actor MCPSession { runningTasks.removeAll() } - func setInitialized(_ value: Bool) { - isInitialized = value - } - - func setClientInfo(_ info: MCPClientInfo?) { - clientInfo = info + func transition(to next: MCPSessionPhase) throws { + guard isValidTransition(from: phase, to: next) else { + throw MCPError.invalidRequest( + "Invalid session phase transition from \(phase) to \(next)" + ) + } + phase = next } - func setAuthenticatedTokenId(_ id: UUID?) { - authenticatedTokenId = id + private func isValidTransition(from current: MCPSessionPhase, to next: MCPSessionPhase) -> Bool { + switch (current, next) { + case (.created, .initializing), + (.created, .active), + (.created, .terminated), + (.initializing, .active), + (.initializing, .terminated), + (.active, .terminated): + return true + default: + return false + } } - func setTokenName(_ name: String?) { - tokenName = name + func setClientInfo(_ info: MCPClientInfo?) { + clientInfo = info } func setRemoteAddress(_ address: String?) { diff --git a/TablePro/Core/MCP/MCPSessionPhase.swift b/TablePro/Core/MCP/MCPSessionPhase.swift new file mode 100644 index 000000000..fa502c9f5 --- /dev/null +++ b/TablePro/Core/MCP/MCPSessionPhase.swift @@ -0,0 +1,20 @@ +import Foundation + +enum MCPSessionTerminationReason: Sendable, Equatable { + case removed + case idleTimeout + case serverStopped + case clientDisconnected +} + +enum MCPSessionPhase: Sendable, Equatable { + case created + case initializing + case active(tokenId: UUID?, tokenName: String?) + case terminated(reason: MCPSessionTerminationReason) + + var isActive: Bool { + if case .active = self { return true } + return false + } +} diff --git a/TablePro/Core/MCP/MCPTokenStore.swift b/TablePro/Core/MCP/MCPTokenStore.swift index b786764a3..cff7e3d89 100644 --- a/TablePro/Core/MCP/MCPTokenStore.swift +++ b/TablePro/Core/MCP/MCPTokenStore.swift @@ -3,6 +3,25 @@ import Foundation import os import Security +enum ConnectionAccess: Sendable, Codable, Equatable { + case all + case limited(Set) + + var allowedIds: Set? { + switch self { + case .all: return nil + case .limited(let ids): return ids + } + } + + func allows(_ connectionId: UUID) -> Bool { + switch self { + case .all: return true + case .limited(let ids): return ids.contains(connectionId) + } + } +} + struct MCPAuthToken: Codable, Identifiable, Sendable { let id: UUID let name: String @@ -10,7 +29,7 @@ struct MCPAuthToken: Codable, Identifiable, Sendable { let tokenHash: String let salt: String let permissions: TokenPermissions - let allowedConnectionIds: Set? + let connectionAccess: ConnectionAccess let createdAt: Date var lastUsedAt: Date? let expiresAt: Date? @@ -22,6 +41,84 @@ struct MCPAuthToken: Codable, Identifiable, Sendable { } var isEffectivelyActive: Bool { isActive && !isExpired } + + init( + id: UUID, + name: String, + prefix: String, + tokenHash: String, + salt: String, + permissions: TokenPermissions, + connectionAccess: ConnectionAccess, + createdAt: Date, + lastUsedAt: Date?, + expiresAt: Date?, + isActive: Bool + ) { + self.id = id + self.name = name + self.prefix = prefix + self.tokenHash = tokenHash + self.salt = salt + self.permissions = permissions + self.connectionAccess = connectionAccess + self.createdAt = createdAt + self.lastUsedAt = lastUsedAt + self.expiresAt = expiresAt + self.isActive = isActive + } + + private enum CodingKeys: String, CodingKey { + case id + case name + case prefix + case tokenHash + case salt + case permissions + case connectionAccess + case allowedConnectionIds + case createdAt + case lastUsedAt + case expiresAt + case isActive + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.id = try container.decode(UUID.self, forKey: .id) + self.name = try container.decode(String.self, forKey: .name) + self.prefix = try container.decode(String.self, forKey: .prefix) + self.tokenHash = try container.decode(String.self, forKey: .tokenHash) + self.salt = try container.decode(String.self, forKey: .salt) + self.permissions = try container.decode(TokenPermissions.self, forKey: .permissions) + self.createdAt = try container.decode(Date.self, forKey: .createdAt) + self.lastUsedAt = try container.decodeIfPresent(Date.self, forKey: .lastUsedAt) + self.expiresAt = try container.decodeIfPresent(Date.self, forKey: .expiresAt) + self.isActive = try container.decode(Bool.self, forKey: .isActive) + + if let access = try container.decodeIfPresent(ConnectionAccess.self, forKey: .connectionAccess) { + self.connectionAccess = access + } else if let legacyIds = try container.decodeIfPresent(Set.self, forKey: .allowedConnectionIds) { + self.connectionAccess = .limited(legacyIds) + } else { + self.connectionAccess = .all + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(name, forKey: .name) + try container.encode(prefix, forKey: .prefix) + try container.encode(tokenHash, forKey: .tokenHash) + try container.encode(salt, forKey: .salt) + try container.encode(permissions, forKey: .permissions) + try container.encode(connectionAccess, forKey: .connectionAccess) + try container.encode(createdAt, forKey: .createdAt) + try container.encodeIfPresent(lastUsedAt, forKey: .lastUsedAt) + try container.encodeIfPresent(expiresAt, forKey: .expiresAt) + try container.encode(isActive, forKey: .isActive) + } } enum TokenPermissions: String, Codable, Sendable, CaseIterable, Identifiable { @@ -72,7 +169,7 @@ actor MCPTokenStore { func generate( name: String, permissions: TokenPermissions, - allowedConnectionIds: Set? = nil, + connectionAccess: ConnectionAccess = .all, expiresAt: Date? = nil ) -> (token: MCPAuthToken, plaintext: String) { let key = SymmetricKey(size: .bits256) @@ -93,7 +190,7 @@ actor MCPTokenStore { tokenHash: hash, salt: saltBase64, permissions: permissions, - allowedConnectionIds: allowedConnectionIds, + connectionAccess: connectionAccess, createdAt: Date.now, lastUsedAt: nil, expiresAt: expiresAt, diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 4e240334d..4724b646d 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -9,16 +9,21 @@ import Foundation extension MCPToolHandler { // MARK: - list_recent_tabs - func handleListRecentTabs(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + func handleListRecentTabs(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let limit = optionalInt(args, key: "limit", default: 20, clamp: 1...500) + if let token, !token.permissions.satisfies(.readOnly) { + throw MCPError.forbidden( + "Token '\(token.name)' with permission '\(token.permissions.displayName)' cannot access 'list_recent_tabs'" + ) + } + let snapshots = await MainActor.run { Self.collectTabSnapshots() } let blockedConnectionIds = await MainActor.run { Self.blockedExternalConnectionIds() } - let allowed = token?.allowedConnectionIds + let access = token?.connectionAccess ?? .all let filtered = snapshots.filter { snapshot in guard !blockedConnectionIds.contains(snapshot.connectionId) else { return false } - if let allowed, !allowed.contains(snapshot.connectionId) { return false } - return true + return access.allows(snapshot.connectionId) } let trimmed = Array(filtered.prefix(limit)) @@ -51,7 +56,7 @@ extension MCPToolHandler { // MARK: - search_query_history - func handleSearchQueryHistory(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + func handleSearchQueryHistory(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let query = try requireString(args, key: "query") let connectionIdString = optionalString(args, key: "connection_id") let limit = optionalInt(args, key: "limit", default: 50, clamp: 1...500) @@ -62,6 +67,12 @@ extension MCPToolHandler { throw MCPError.invalidParams("'since' must be less than or equal to 'until'") } + if let token, !token.permissions.satisfies(.readOnly) { + throw MCPError.forbidden( + "Token '\(token.name)' with permission '\(token.permissions.displayName)' cannot access 'search_query_history'" + ) + } + let blockedConnectionIds = await MainActor.run { Self.blockedExternalConnectionIds() } let connectionId: UUID? @@ -69,7 +80,9 @@ extension MCPToolHandler { guard let parsed = UUID(uuidString: connectionIdString) else { throw MCPError.invalidParams("Invalid UUID for parameter: connection_id") } - if let token { try checkTokenConnectionAccess(token, connectionId: parsed) } + if let token, !token.connectionAccess.allows(parsed) { + throw MCPError.forbidden("Token does not have access to this connection") + } if blockedConnectionIds.contains(parsed) { throw MCPError.forbidden( String(localized: "External access is disabled for this connection") @@ -119,11 +132,15 @@ extension MCPToolHandler { // MARK: - open_connection_window - func handleOpenConnectionWindow(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + func handleOpenConnectionWindow(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) + try await authPolicy.resolveAndAuthorize( + token: token ?? Self.anonymousFullAccessToken, + tool: "open_connection_window", + connectionId: connectionId, + sessionId: sessionId + ) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -146,15 +163,19 @@ extension MCPToolHandler { // MARK: - open_table_tab - func handleOpenTableTab(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + func handleOpenTableTab(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") let tableName = try requireString(args, key: "table_name") let databaseName = optionalString(args, key: "database_name") let schemaName = optionalString(args, key: "schema_name") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } try await ensureConnectionExists(connectionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) + try await authPolicy.resolveAndAuthorize( + token: token ?? Self.anonymousFullAccessToken, + tool: "open_table_tab", + connectionId: connectionId, + sessionId: sessionId + ) let windowId = await MainActor.run { () -> UUID in let payload = EditorTabPayload( @@ -181,7 +202,7 @@ extension MCPToolHandler { // MARK: - focus_query_tab - func handleFocusQueryTab(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + func handleFocusQueryTab(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let tabId = try requireUUID(args, key: "tab_id") let resolved = await MainActor.run { () -> (hasWindow: Bool, windowId: UUID?, connectionId: UUID?)? in @@ -198,8 +219,12 @@ extension MCPToolHandler { guard let connectionId = resolved.connectionId else { throw MCPError.notFound("connection") } - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readOnly) + try await authPolicy.resolveAndAuthorize( + token: token ?? Self.anonymousFullAccessToken, + tool: "focus_query_tab", + connectionId: connectionId, + sessionId: sessionId + ) let raised = await MainActor.run { () -> Bool in for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { @@ -237,8 +262,8 @@ extension MCPToolHandler { if scopedConnectionId != nil { return nil } - if let tokenAllowed = token?.allowedConnectionIds { - return tokenAllowed.subtracting(blockedConnectionIds) + if let access = token?.connectionAccess, case .limited(let allowed) = access { + return allowed.subtracting(blockedConnectionIds) } guard !blockedConnectionIds.isEmpty else { return nil } let allConnectionIds = await MainActor.run { @@ -290,6 +315,7 @@ extension MCPToolHandler { let connections = ConnectionStorage.shared.loadConnections() return Set(connections.filter { $0.externalAccess == .blocked }.map(\.id)) } + } struct TabSnapshot { diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index cdf135fb7..3e1c9a77d 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -4,12 +4,12 @@ import os final class MCPToolHandler: Sendable { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPToolHandler") - private let bridge: MCPConnectionBridge - let authGuard: MCPAuthGuard + let bridge: MCPConnectionBridge + let authPolicy: MCPAuthPolicy - init(bridge: MCPConnectionBridge, authGuard: MCPAuthGuard) { + init(bridge: MCPConnectionBridge, authPolicy: MCPAuthPolicy) { self.bridge = bridge - self.authGuard = authGuard + self.authPolicy = authPolicy } func handleToolCall( @@ -18,10 +18,6 @@ final class MCPToolHandler: Sendable { sessionId: String, token: MCPAuthToken? = nil ) async throws -> MCPToolResult { - if let token { - try checkTokenToolPermission(token, toolName: name) - } - do { let result = try await dispatchTool( name: name, @@ -58,9 +54,9 @@ final class MCPToolHandler: Sendable { case "connect": return try await handleConnect(arguments, sessionId: sessionId, token: token) case "disconnect": - return try await handleDisconnect(arguments, token: token) + return try await handleDisconnect(arguments, sessionId: sessionId, token: token) case "get_connection_status": - return try await handleGetConnectionStatus(arguments, token: token) + return try await handleGetConnectionStatus(arguments, sessionId: sessionId, token: token) case "execute_query": return try await handleExecuteQuery(arguments, sessionId: sessionId, token: token) case "list_tables": @@ -82,15 +78,15 @@ final class MCPToolHandler: Sendable { case "switch_schema": return try await handleSwitchSchema(arguments, sessionId: sessionId, token: token) case "list_recent_tabs": - return try await handleListRecentTabs(arguments, token: token) + return try await handleListRecentTabs(arguments, sessionId: sessionId, token: token) case "search_query_history": - return try await handleSearchQueryHistory(arguments, token: token) + return try await handleSearchQueryHistory(arguments, sessionId: sessionId, token: token) case "open_connection_window": - return try await handleOpenConnectionWindow(arguments, token: token) + return try await handleOpenConnectionWindow(arguments, sessionId: sessionId, token: token) case "open_table_tab": - return try await handleOpenTableTab(arguments, token: token) + return try await handleOpenTableTab(arguments, sessionId: sessionId, token: token) case "focus_query_tab": - return try await handleFocusQueryTab(arguments, token: token) + return try await handleFocusQueryTab(arguments, sessionId: sessionId, token: token) default: throw MCPError.methodNotFound(name) } @@ -114,33 +110,35 @@ final class MCPToolHandler: Sendable { ) } - private func checkTokenToolPermission(_ token: MCPAuthToken, toolName: String) throws { - let required = minimumPermission(for: toolName) - guard token.permissions.satisfies(required) else { - throw MCPError.forbidden( - "Token '\(token.name)' with permission '\(token.permissions.displayName)' " - + "cannot access '\(toolName)'" - ) - } - } - - private func minimumPermission(for toolName: String) -> TokenPermissions { - switch toolName { - case "confirm_destructive_operation": - return .fullAccess - case "switch_database", "switch_schema", "export_data": - return .readWrite - default: - return .readOnly - } + private func authorize( + token: MCPAuthToken?, + tool: String, + connectionId: UUID?, + sql: String? = nil, + sessionId: String + ) async throws { + try await authPolicy.resolveAndAuthorize( + token: token ?? Self.anonymousFullAccessToken, + tool: tool, + connectionId: connectionId, + sql: sql, + sessionId: sessionId + ) } - func checkTokenConnectionAccess(_ token: MCPAuthToken, connectionId: UUID) throws { - guard let allowed = token.allowedConnectionIds else { return } - guard allowed.contains(connectionId) else { - throw MCPError.forbidden("Token does not have access to this connection") - } - } + static let anonymousFullAccessToken: MCPAuthToken = MCPAuthToken( + id: UUID(), + name: "__anonymous__", + prefix: "tp_anon", + tokenHash: "", + salt: "", + permissions: .fullAccess, + connectionAccess: .all, + createdAt: Date.now, + lastUsedAt: nil, + expiresAt: nil, + isActive: true + ) private func handleListConnections(token: MCPAuthToken?) async throws -> MCPToolResult { let result = await bridge.listConnections() @@ -149,7 +147,9 @@ final class MCPToolHandler: Sendable { } private func filterConnectionsByToken(_ value: JSONValue, token: MCPAuthToken?) -> JSONValue { - guard let allowed = token?.allowedConnectionIds else { return value } + guard let access = token?.connectionAccess, case .limited(let allowed) = access else { + return value + } guard case .object(var dict) = value, let entries = dict["connections"]?.arrayValue else { @@ -169,23 +169,22 @@ final class MCPToolHandler: Sendable { private func handleConnect(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "connect", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.connect(connectionId: connectionId) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } - private func handleDisconnect(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + private func handleDisconnect(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await authorize(token: token, tool: "disconnect", connectionId: connectionId, sessionId: sessionId) try await bridge.disconnect(connectionId: connectionId) let result: JSONValue = .object(["status": "disconnected"]) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } - private func handleGetConnectionStatus(_ args: JSONValue?, token: MCPAuthToken?) async throws -> MCPToolResult { + private func handleGetConnectionStatus(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } + try await authorize(token: token, tool: "get_connection_status", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.getConnectionStatus(connectionId: connectionId) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } @@ -207,8 +206,13 @@ final class MCPToolHandler: Sendable { throw MCPError.invalidParams("Multi-statement queries are not supported. Send one statement at a time.") } - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize( + token: token, + tool: "execute_query", + connectionId: connectionId, + sql: query, + sessionId: sessionId + ) let (databaseType, safeModeLevel, databaseName) = try await resolveConnectionMeta(connectionId) @@ -228,11 +232,21 @@ final class MCPToolHandler: Sendable { + "Use the confirm_destructive_operation tool instead." ) - case .write, .safe: - if let token { - try checkTokenQueryTierPermission(token, tier: tier) + case .write: + if let token, !token.permissions.satisfies(.readWrite) { + throw MCPError.forbidden( + "Token '\(token.name)' with '\(token.permissions.displayName)' permission cannot execute write queries" + ) } - try await authGuard.checkQueryPermission( + try await authPolicy.checkSafeModeDialog( + sql: query, + connectionId: connectionId, + databaseType: databaseType, + safeModeLevel: safeModeLevel + ) + + case .safe: + try await authPolicy.checkSafeModeDialog( sql: query, connectionId: connectionId, databaseType: databaseType, @@ -252,25 +266,6 @@ final class MCPToolHandler: Sendable { return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } - private func checkTokenQueryTierPermission(_ token: MCPAuthToken, tier: QueryTier) throws { - switch tier { - case .safe: - return - case .write: - guard token.permissions.satisfies(.readWrite) else { - throw MCPError.forbidden( - "Token '\(token.name)' with '\(token.permissions.displayName)' permission cannot execute write queries" - ) - } - case .destructive: - guard token.permissions == .fullAccess else { - throw MCPError.forbidden( - "Token '\(token.name)' with '\(token.permissions.displayName)' permission cannot execute destructive queries" - ) - } - } - } - private func handleConfirmDestructiveOperation( _ args: JSONValue?, sessionId: String, @@ -292,8 +287,13 @@ final class MCPToolHandler: Sendable { ) } - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize( + token: token, + tool: "confirm_destructive_operation", + connectionId: connectionId, + sql: query, + sessionId: sessionId + ) let (databaseType, safeModeLevel, databaseName) = try await resolveConnectionMeta(connectionId) @@ -305,7 +305,7 @@ final class MCPToolHandler: Sendable { ) } - try await authGuard.checkQueryPermission( + try await authPolicy.checkSafeModeDialog( sql: query, connectionId: connectionId, databaseType: databaseType, @@ -333,8 +333,7 @@ final class MCPToolHandler: Sendable { let database = optionalString(args, key: "database") let schema = optionalString(args, key: "schema") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "list_tables", connectionId: connectionId, sessionId: sessionId) if let database { _ = try await bridge.switchDatabase(connectionId: connectionId, database: database) @@ -352,8 +351,7 @@ final class MCPToolHandler: Sendable { let table = try requireString(args, key: "table") let schema = optionalString(args, key: "schema") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "describe_table", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.describeTable(connectionId: connectionId, table: table, schema: schema) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -361,8 +359,7 @@ final class MCPToolHandler: Sendable { private func handleListDatabases(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "list_databases", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.listDatabases(connectionId: connectionId) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } @@ -371,8 +368,7 @@ final class MCPToolHandler: Sendable { let connectionId = try requireUUID(args, key: "connection_id") let database = optionalString(args, key: "database") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "list_schemas", connectionId: connectionId, sessionId: sessionId) if let database { _ = try await bridge.switchDatabase(connectionId: connectionId, database: database) @@ -387,8 +383,7 @@ final class MCPToolHandler: Sendable { let table = try requireString(args, key: "table") let schema = optionalString(args, key: "schema") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) + try await authorize(token: token, tool: "get_table_ddl", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.getTableDDL(connectionId: connectionId, table: table, schema: schema) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -420,15 +415,19 @@ final class MCPToolHandler: Sendable { _ = try Self.sandboxedDownloadsURL(for: outputPath) } - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authorize( + token: token, + tool: "export_data", + connectionId: connectionId, + sql: query, + sessionId: sessionId + ) let (databaseType, safeModeLevel, _) = try await resolveConnectionMeta(connectionId) var queries: [(label: String, sql: String)] = [] if let query { - try await authGuard.checkQueryPermission( + try await authPolicy.checkSafeModeDialog( sql: query, connectionId: connectionId, databaseType: databaseType, @@ -440,7 +439,7 @@ final class MCPToolHandler: Sendable { for table in tables { let quoted = Self.quoteQualifiedIdentifier(table, quoter: quoteIdentifier) let sql = "SELECT * FROM \(quoted) LIMIT \(maxRows)" - try await authGuard.checkQueryPermission( + try await authPolicy.checkSafeModeDialog( sql: sql, connectionId: connectionId, databaseType: databaseType, @@ -526,9 +525,7 @@ final class MCPToolHandler: Sendable { let connectionId = try requireUUID(args, key: "connection_id") let database = try requireString(args, key: "database") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authorize(token: token, tool: "switch_database", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.switchDatabase(connectionId: connectionId, database: database) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -538,9 +535,7 @@ final class MCPToolHandler: Sendable { let connectionId = try requireUUID(args, key: "connection_id") let schema = try requireString(args, key: "schema") - if let token { try checkTokenConnectionAccess(token, connectionId: connectionId) } - try await authGuard.checkConnectionAccess(connectionId: connectionId, sessionId: sessionId) - try await authGuard.checkExternalAccessLevel(connectionId: connectionId, requires: .readWrite) + try await authorize(token: token, tool: "switch_schema", connectionId: connectionId, sessionId: sessionId) let result = try await bridge.switchSchema(connectionId: connectionId, schema: schema) return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) @@ -564,7 +559,7 @@ final class MCPToolHandler: Sendable { ) let elapsed = Date().timeIntervalSince(startTime) let rowCount = result["row_count"]?.intValue ?? 0 - await authGuard.logQuery( + await authPolicy.logQuery( sql: query, connectionId: connectionId, databaseName: databaseName, @@ -585,7 +580,7 @@ final class MCPToolHandler: Sendable { return result } catch { let elapsed = Date().timeIntervalSince(startTime) - await authGuard.logQuery( + await authPolicy.logQuery( sql: query, connectionId: connectionId, databaseName: databaseName, @@ -646,13 +641,14 @@ final class MCPToolHandler: Sendable { private func resolveConnectionMeta(_ connectionId: UUID) async throws -> (DatabaseType, SafeModeLevel, String) { try await MainActor.run { - if let session = DatabaseManager.shared.activeSessions[connectionId] { + switch DatabaseManager.shared.connectionState(connectionId) { + case .live(_, let session): return (session.connection.type, session.connection.safeModeLevel, session.activeDatabase) - } - if let conn = ConnectionStorage.shared.loadConnections().first(where: { $0.id == connectionId }) { + case .stored(let conn): return (conn.type, conn.safeModeLevel, conn.database) + case .unknown: + throw MCPError.notConnected(connectionId) } - throw MCPError.notConnected(connectionId) } } diff --git a/TablePro/Core/MCP/PairingTypes.swift b/TablePro/Core/MCP/PairingTypes.swift new file mode 100644 index 000000000..c54345d24 --- /dev/null +++ b/TablePro/Core/MCP/PairingTypes.swift @@ -0,0 +1,14 @@ +import Foundation + +struct PairingRequest: Sendable, Equatable { + let clientName: String + let challenge: String + let redirectURL: URL + let requestedScopes: String? + let requestedConnectionIds: Set? +} + +struct PairingExchange: Sendable, Equatable { + let code: String + let verifier: String +} diff --git a/TablePro/Core/MCP/Routes/IntegrationsExchangeHandler.swift b/TablePro/Core/MCP/Routes/IntegrationsExchangeHandler.swift new file mode 100644 index 000000000..794494a02 --- /dev/null +++ b/TablePro/Core/MCP/Routes/IntegrationsExchangeHandler.swift @@ -0,0 +1,94 @@ +import Foundation +import os + +struct IntegrationsExchangeHandler: MCPRouteHandler { + private static let logger = Logger(subsystem: "com.TablePro", category: "IntegrationsExchangeHandler") + + private let exchange: @Sendable (PairingExchange) async throws -> String + + private let encoder: JSONEncoder + private let decoder: JSONDecoder + + var methods: [HTTPRequest.Method] { [.post] } + var path: String { "/v1/integrations/exchange" } + + init(exchange: @escaping @Sendable (PairingExchange) async throws -> String) { + self.exchange = exchange + let enc = JSONEncoder() + enc.outputFormatting = [.sortedKeys] + self.encoder = enc + self.decoder = JSONDecoder() + } + + static func live() -> IntegrationsExchangeHandler { + IntegrationsExchangeHandler { request in + try await MainActor.run { + try MCPPairingService.shared.exchange(request) + } + } + } + + func handle(_ request: HTTPRequest) async -> MCPRouter.RouteResult { + guard let body = request.body else { + return .httpError(status: 400, message: "Missing request body") + } + + let parsed: ExchangeRequestBody + do { + parsed = try decoder.decode(ExchangeRequestBody.self, from: body) + } catch { + return .httpError(status: 400, message: "Invalid JSON body") + } + + guard !parsed.code.isEmpty, !parsed.codeVerifier.isEmpty else { + return .httpError(status: 400, message: "Missing code or code_verifier") + } + + let token: String + do { + token = try await exchange( + PairingExchange(code: parsed.code, verifier: parsed.codeVerifier) + ) + } catch let mcpError as MCPError { + return Self.mapExchangeError(mcpError) + } catch { + Self.logger.error("Pairing exchange failed: \(error.localizedDescription)") + return .httpError(status: 500, message: "Internal error") + } + + do { + let data = try encoder.encode(ExchangeResponseBody(token: token)) + return .json(data, sessionId: nil) + } catch { + Self.logger.error("Failed to encode exchange response: \(error.localizedDescription)") + return .httpError(status: 500, message: "Internal error") + } + } + + private static func mapExchangeError(_ error: MCPError) -> MCPRouter.RouteResult { + switch error { + case .notFound: + return .httpError(status: 404, message: "Pairing code not found") + case .expired: + return .httpError(status: 410, message: "Pairing code expired") + case .forbidden: + return .httpError(status: 403, message: "Challenge mismatch") + default: + return .httpError(status: 500, message: "Internal error") + } + } + + private struct ExchangeRequestBody: Decodable { + let code: String + let codeVerifier: String + + enum CodingKeys: String, CodingKey { + case code + case codeVerifier = "code_verifier" + } + } + + private struct ExchangeResponseBody: Encodable { + let token: String + } +} diff --git a/TablePro/Core/MCP/Routes/MCPProtocolHandler.swift b/TablePro/Core/MCP/Routes/MCPProtocolHandler.swift new file mode 100644 index 000000000..dac72ede6 --- /dev/null +++ b/TablePro/Core/MCP/Routes/MCPProtocolHandler.swift @@ -0,0 +1,533 @@ +import Foundation +import os + +final class MCPProtocolHandler: MCPRouteHandler, @unchecked Sendable { + private static let logger = Logger(subsystem: "com.TablePro", category: "MCPProtocolHandler") + + private weak var server: MCPServer? + private let tokenStore: MCPTokenStore? + private let rateLimiter: MCPRateLimiter? + + private let encoder: JSONEncoder + private let decoder: JSONDecoder + + var methods: [HTTPRequest.Method] { [.get, .post, .delete] } + var path: String { "/mcp" } + + init(server: MCPServer, tokenStore: MCPTokenStore?, rateLimiter: MCPRateLimiter?) { + self.server = server + self.tokenStore = tokenStore + self.rateLimiter = rateLimiter + let enc = JSONEncoder() + enc.outputFormatting = [.sortedKeys] + self.encoder = enc + self.decoder = JSONDecoder() + } + + func handle(_ request: HTTPRequest) async -> MCPRouter.RouteResult { + guard let server else { + return .httpError(status: 503, message: "Server unavailable") + } + + if let rateLimiter, let ip = request.remoteIP { + let lockoutCheck = await rateLimiter.isLockedOut(ip: ip) + if case .rateLimited(let retryAfter) = lockoutCheck { + let seconds = Int(retryAfter.components.seconds) + MCPAuditLogger.logRateLimited(ip: ip, retryAfterSeconds: seconds) + return .httpErrorWithHeaders( + status: 429, + message: "Too many failed attempts", + extraHeaders: [("Retry-After", "\(seconds)")] + ) + } + } + + let authResult = await authenticateRequest(request) + + switch authResult { + case .failure(let result): + return result + case .success(let token): + if token == nil { + if let origin = request.headers["origin"], !isAllowedOrigin(origin) { + return .httpError(status: 403, message: "Forbidden origin") + } + } + + switch request.method { + case .post: + return await handlePost(request, server: server, authenticatedToken: token) + case .get: + return await handleGet(request, server: server) + case .delete: + return await handleDelete(request, server: server) + case .options: + return .noContent + } + } + } + + private enum AuthResult { + case success(MCPAuthToken?) + case failure(MCPRouter.RouteResult) + } + + private func authenticateRequest(_ request: HTTPRequest) async -> AuthResult { + let remoteIP = request.remoteIP + let authRequired = await MainActor.run { AppSettingsManager.shared.mcp.requireAuthentication } + + guard let authHeader = request.headers["authorization"] else { + guard !authRequired else { + MCPAuditLogger.logAuthFailure(reason: "Missing authorization header", ip: remoteIP ?? "localhost") + return .failure(.httpErrorWithHeaders( + status: 401, + message: "Authentication required", + extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] + )) + } + return .success(nil) + } + + guard authHeader.lowercased().hasPrefix("bearer "), let tokenStore else { + let rateLimitResult = await recordAuthFailure(ip: remoteIP) + if case .rateLimited(let retryAfter) = rateLimitResult { + let seconds = Int(retryAfter.components.seconds) + MCPAuditLogger.logRateLimited(ip: remoteIP ?? "localhost", retryAfterSeconds: seconds) + return .failure(.httpErrorWithHeaders( + status: 429, + message: "Too many failed attempts", + extraHeaders: [("Retry-After", "\(seconds)")] + )) + } + MCPAuditLogger.logAuthFailure(reason: "Invalid authorization header format", ip: remoteIP ?? "localhost") + return .failure(.httpErrorWithHeaders( + status: 401, + message: "Invalid authorization header", + extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] + )) + } + + let bearerToken = String(authHeader.dropFirst(7)) + + guard let token = await tokenStore.validate(bearerToken: bearerToken) else { + let rateLimitResult = await recordAuthFailure(ip: remoteIP) + if case .rateLimited(let retryAfter) = rateLimitResult { + let seconds = Int(retryAfter.components.seconds) + MCPAuditLogger.logRateLimited(ip: remoteIP ?? "localhost", retryAfterSeconds: seconds) + return .failure(.httpErrorWithHeaders( + status: 429, + message: "Too many failed attempts", + extraHeaders: [("Retry-After", "\(seconds)")] + )) + } + MCPAuditLogger.logAuthFailure(reason: "Invalid token", ip: remoteIP ?? "localhost") + return .failure(.httpErrorWithHeaders( + status: 401, + message: "Invalid or expired token", + extraHeaders: [("WWW-Authenticate", "Bearer realm=\"TablePro MCP\"")] + )) + } + + if let rateLimiter, let ip = remoteIP { + _ = await rateLimiter.checkAndRecord(ip: ip, success: true) + } + MCPAuditLogger.logAuthSuccess(tokenName: token.name, ip: remoteIP ?? "localhost") + return .success(token) + } + + @discardableResult + private func recordAuthFailure(ip: String?) async -> MCPRateLimiter.AuthRateResult? { + guard let rateLimiter, let ip else { return nil } + return await rateLimiter.checkAndRecord(ip: ip, success: false) + } + + private func isAllowedOrigin(_ origin: String) -> Bool { + guard let components = URLComponents(string: origin), + let host = components.host + else { + return false + } + let allowedHosts: Set = ["localhost", "127.0.0.1", "::1"] + return allowedHosts.contains(host) + } + + private func handleGet(_ request: HTTPRequest, server: MCPServer) async -> MCPRouter.RouteResult { + guard let sessionId = request.headers["mcp-session-id"] else { + return .httpError(status: 400, message: "Missing Mcp-Session-Id header") + } + + guard let session = await server.session(for: sessionId) else { + return .httpError(status: 404, message: "Session not found") + } + + await session.markActive() + return .sseStream(sessionId: session.id) + } + + private func handleDelete(_ request: HTTPRequest, server: MCPServer) async -> MCPRouter.RouteResult { + guard let sessionId = request.headers["mcp-session-id"] else { + return .httpError(status: 400, message: "Missing Mcp-Session-Id header") + } + + guard await server.session(for: sessionId) != nil else { + return .httpError(status: 404, message: "Session not found") + } + + await server.removeSession(sessionId) + Self.logger.info("Session terminated via DELETE: \(sessionId)") + return .noContent + } + + private func handlePost( + _ request: HTTPRequest, + server: MCPServer, + authenticatedToken: MCPAuthToken? + ) async -> MCPRouter.RouteResult { + if let accept = request.headers["accept"], !accept.contains("application/json") && !accept.contains("*/*") { + return .httpError(status: 406, message: "Accept header must include application/json") + } + + guard let body = request.body else { + return encodeError(MCPError.parseError, id: nil) + } + + let rpcRequest: JSONRPCRequest + do { + rpcRequest = try decoder.decode(JSONRPCRequest.self, from: body) + } catch { + return encodeError(MCPError.parseError, id: nil) + } + + guard rpcRequest.jsonrpc == "2.0" else { + return encodeError(MCPError.invalidRequest("jsonrpc must be \"2.0\""), id: rpcRequest.id) + } + + if let protocolVersion = request.headers["mcp-protocol-version"], + protocolVersion != "2025-03-26" + { + Self.logger.warning("Client mcp-protocol-version mismatch: \(protocolVersion)") + } + + let headerSessionId = request.headers["mcp-session-id"] + return await dispatchMethod( + rpcRequest, + headerSessionId: headerSessionId, + server: server, + authenticatedToken: authenticatedToken + ) + } + + private func dispatchMethod( + _ request: JSONRPCRequest, + headerSessionId: String?, + server: MCPServer, + authenticatedToken: MCPAuthToken? + ) async -> MCPRouter.RouteResult { + if request.method == "initialize" { + return await handleInitialize(request, server: server) + } + + if request.method == "ping" { + return handlePing(request) + } + + guard let sessionId = headerSessionId else { + return .httpError(status: 400, message: "Missing Mcp-Session-Id header") + } + guard let session = await server.session(for: sessionId) else { + return .httpError(status: 404, message: "Session not found") + } + + await session.markActive() + + if request.method == "notifications/initialized" { + do { + try await session.transition(to: .active( + tokenId: authenticatedToken?.id, + tokenName: authenticatedToken?.name + )) + } catch { + return encodeError(MCPError.invalidRequest("Cannot initialize session in current phase"), id: request.id) + } + return .accepted + } + + if request.method == "notifications/cancelled" { + return await handleCancellation(request, session: session) + } + + guard await session.phase.isActive else { + return encodeError( + MCPError.invalidRequest("Session not initialized. Send notifications/initialized first."), + id: request.id + ) + } + + switch request.method { + case "tools/list": + return handleToolsList(request, sessionId: sessionId) + + case "tools/call": + return await handleToolsCall( + request, + sessionId: sessionId, + server: server, + authenticatedToken: authenticatedToken + ) + + case "resources/list": + return handleResourcesList(request, sessionId: sessionId) + + case "resources/read": + return await handleResourcesRead(request, sessionId: sessionId, server: server) + + default: + return encodeError(MCPError.methodNotFound(request.method), id: request.id) + } + } + + private func handleInitialize( + _ request: JSONRPCRequest, + server: MCPServer + ) async -> MCPRouter.RouteResult { + guard let session = await server.createSession() else { + return encodeError(MCPError.internalError("Maximum sessions reached"), id: request.id) + } + + if let params = request.params, + let clientInfo = params["clientInfo"], + let name = clientInfo["name"]?.stringValue + { + let version = clientInfo["version"]?.stringValue + await session.setClientInfo(MCPClientInfo(name: name, version: version)) + } + + do { + try await session.transition(to: .initializing) + } catch { + await server.removeSession(session.id) + return encodeError(MCPError.invalidRequest("Cannot initialize session"), id: request.id) + } + + let result = MCPInitializeResult( + protocolVersion: "2025-03-26", + capabilities: MCPServerCapabilities( + tools: .init(listChanged: false), + resources: .init(subscribe: false, listChanged: false) + ), + serverInfo: MCPServerInfo(name: "tablepro", version: "1.0.0") + ) + + return encodeResult(result, id: request.id, sessionId: session.id) + } + + private func handlePing(_ request: JSONRPCRequest) -> MCPRouter.RouteResult { + guard let id = request.id else { + return .accepted + } + return encodeRawResult(.object([:]), id: id, sessionId: nil) + } + + private func handleCancellation( + _ request: JSONRPCRequest, + session: MCPSession + ) async -> MCPRouter.RouteResult { + guard let params = request.params, + let requestIdValue = params["requestId"] + else { + return .accepted + } + + let cancelId: JSONRPCId? + switch requestIdValue { + case .string(let s): + cancelId = .string(s) + case .int(let i): + cancelId = .int(i) + default: + cancelId = nil + } + + if let cancelId, let task = await session.removeRunningTask(cancelId) { + task.cancel() + Self.logger.info("Cancelled request \(String(describing: cancelId)) in session \(session.id)") + } + + return .accepted + } + + private func handleToolsList(_ request: JSONRPCRequest, sessionId: String) -> MCPRouter.RouteResult { + guard let id = request.id else { + return .accepted + } + + let tools = MCPRouter.toolDefinitions() + let result: JSONValue = .object(["tools": encodeToolDefinitions(tools)]) + return encodeRawResult(result, id: id, sessionId: sessionId) + } + + private func handleToolsCall( + _ request: JSONRPCRequest, + sessionId: String, + server: MCPServer, + authenticatedToken: MCPAuthToken? + ) async -> MCPRouter.RouteResult { + guard let id = request.id else { + return encodeError(MCPError.invalidRequest("tools/call requires an id"), id: nil) + } + + guard let params = request.params, + let name = params["name"]?.stringValue + else { + return encodeError(MCPError.invalidParams("Missing tool name"), id: id) + } + + let arguments = params["arguments"] + + guard let handler = await server.toolCallHandler else { + return encodeError(MCPError.internalError("Server not fully initialized"), id: id) + } + + let session = await server.session(for: sessionId) + let toolTask = Task { + try await handler(name, arguments, sessionId, authenticatedToken) + } + if let session { + let cancelForwardingTask = Task { + await withTaskCancellationHandler { + _ = try? await toolTask.value + } onCancel: { + toolTask.cancel() + } + } + await session.addRunningTask(id, task: cancelForwardingTask) + } + + do { + let toolResult = try await toolTask.value + if let session { _ = await session.removeRunningTask(id) } + let resultData = try encoder.encode(toolResult) + guard let resultValue = try? decoder.decode(JSONValue.self, from: resultData) else { + return encodeError(MCPError.internalError("Failed to encode tool result"), id: id) + } + return encodeRawResult(resultValue, id: id, sessionId: sessionId) + } catch is CancellationError { + if let session { _ = await session.removeRunningTask(id) } + return encodeError(MCPError.timeout("Request was cancelled"), id: id) + } catch let mcpError as MCPError { + if let session { _ = await session.removeRunningTask(id) } + return encodeError(mcpError, id: id) + } catch { + if let session { _ = await session.removeRunningTask(id) } + return encodeError(MCPError.internalError(error.localizedDescription), id: id) + } + } + + private func handleResourcesList(_ request: JSONRPCRequest, sessionId: String) -> MCPRouter.RouteResult { + guard let id = request.id else { + return .accepted + } + + let resources = MCPRouter.resourceDefinitions() + let result: JSONValue = .object(["resources": encodeResourceDefinitions(resources)]) + return encodeRawResult(result, id: id, sessionId: sessionId) + } + + private func handleResourcesRead( + _ request: JSONRPCRequest, + sessionId: String, + server: MCPServer + ) async -> MCPRouter.RouteResult { + guard let id = request.id else { + return encodeError(MCPError.invalidRequest("resources/read requires an id"), id: nil) + } + + guard let params = request.params, + let uri = params["uri"]?.stringValue + else { + return encodeError(MCPError.invalidParams("Missing resource uri"), id: id) + } + + guard let handler = await server.resourceReadHandler else { + return encodeError(MCPError.internalError("Server not fully initialized"), id: id) + } + + do { + let readResult = try await handler(uri, sessionId) + let resultData = try encoder.encode(readResult) + guard let resultValue = try? decoder.decode(JSONValue.self, from: resultData) else { + return encodeError(MCPError.internalError("Failed to encode resource result"), id: id) + } + return encodeRawResult(resultValue, id: id, sessionId: sessionId) + } catch let mcpError as MCPError { + return encodeError(mcpError, id: id) + } catch { + return encodeError(MCPError.internalError(error.localizedDescription), id: id) + } + } + + private func encodeResult(_ result: T, id: JSONRPCId?, sessionId: String?) -> MCPRouter.RouteResult { + guard let id else { + return .accepted + } + + do { + let resultData = try encoder.encode(result) + let resultValue = try decoder.decode(JSONValue.self, from: resultData) + let response = JSONRPCResponse(id: id, result: resultValue) + let data = try encoder.encode(response) + return .json(data, sessionId: sessionId) + } catch { + Self.logger.error("Failed to encode response: \(error.localizedDescription)") + return encodeError(MCPError.internalError("Encoding failed"), id: id) + } + } + + private func encodeRawResult(_ result: JSONValue, id: JSONRPCId, sessionId: String?) -> MCPRouter.RouteResult { + do { + let response = JSONRPCResponse(id: id, result: result) + let data = try encoder.encode(response) + return .json(data, sessionId: sessionId) + } catch { + Self.logger.error("Failed to encode response: \(error.localizedDescription)") + return encodeError(MCPError.internalError("Encoding failed"), id: id) + } + } + + private func encodeError(_ error: MCPError, id: JSONRPCId?) -> MCPRouter.RouteResult { + let errorResponse = error.toJsonRpcError(id: id) + do { + let data = try encoder.encode(errorResponse) + return .json(data, sessionId: nil) + } catch { + Self.logger.error("Failed to encode error response") + return .httpError(status: 500, message: "Internal encoding error") + } + } + + private func encodeToolDefinitions(_ tools: [MCPToolDefinition]) -> JSONValue { + .array(tools.map { tool in + .object([ + "name": .string(tool.name), + "description": .string(tool.description), + "inputSchema": tool.inputSchema + ]) + }) + } + + private func encodeResourceDefinitions(_ resources: [MCPResourceDefinition]) -> JSONValue { + .array(resources.map { resource in + var dict: [String: JSONValue] = [ + "uri": .string(resource.uri), + "name": .string(resource.name) + ] + if let description = resource.description { + dict["description"] = .string(description) + } + if let mimeType = resource.mimeType { + dict["mimeType"] = .string(mimeType) + } + return .object(dict) + }) + } +} diff --git a/TablePro/Core/MCP/TokenPermissionFilter.swift b/TablePro/Core/MCP/TokenPermissionFilter.swift new file mode 100644 index 000000000..8c42600e6 --- /dev/null +++ b/TablePro/Core/MCP/TokenPermissionFilter.swift @@ -0,0 +1,47 @@ +import Foundation + +protocol ConnectionIdentifiable { + var connectionId: UUID { get } +} + +enum TokenPermissionFilter { + static let overfetchMultiplier = 3 + private static let maxRoundTrips = 2 + + static func filter(_ items: [T], by access: ConnectionAccess) -> [T] { + switch access { + case .all: + return items + case .limited(let ids): + return items.filter { ids.contains($0.connectionId) } + } + } + + static func fetchFiltered( + access: ConnectionAccess, + limit: Int, + fetch: (Int, Int) async throws -> [T] + ) async throws -> [T] { + if case .all = access { + let items = try await fetch(limit, 0) + return Array(items.prefix(limit)) + } + + guard limit > 0 else { return [] } + + let fetchLimit = limit * overfetchMultiplier + var collected: [T] = [] + var offset = 0 + + for _ in 0..= limit { break } + if raw.count < fetchLimit { break } + offset += fetchLimit + } + + return Array(collected.prefix(limit)) + } +} diff --git a/TablePro/Core/Services/Infrastructure/AppLaunchCoordinator.swift b/TablePro/Core/Services/Infrastructure/AppLaunchCoordinator.swift new file mode 100644 index 000000000..b49745142 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/AppLaunchCoordinator.swift @@ -0,0 +1,226 @@ +// +// AppLaunchCoordinator.swift +// TablePro +// + +import AppKit +import Foundation +import Observation +import os + +@MainActor +@Observable +internal final class AppLaunchCoordinator { + internal static let shared = AppLaunchCoordinator() + + private static let logger = Logger(subsystem: "com.TablePro", category: "AppLaunchCoordinator") + internal static let collectionWindow: Duration = .milliseconds(150) + + private(set) var phase: LaunchPhase = .launching + + private var pendingIntents: [LaunchIntent] = [] + private var deadlineTask: Task? + private var hasFinishedLaunching = false + + private init() {} + + // MARK: - App Lifecycle Hooks + + internal func didFinishLaunching() { + hasFinishedLaunching = true + let deadline = Date().addingTimeInterval(0.150) + phase = .collectingIntents(deadline: deadline) + deadlineTask = Task { [weak self] in + try? await Task.sleep(for: Self.collectionWindow) + await MainActor.run { + self?.transitionToRouting() + } + } + } + + internal func handleOpenURLs(_ urls: [URL]) { + let intents: [LaunchIntent] = urls.compactMap { url in + switch URLClassifier.classify(url) { + case .none: + Self.logger.warning("Unrecognized URL: \(url.sanitizedForLogging, privacy: .public)") + return nil + case .some(.failure(let error)): + Self.logger.error("URL parse failed: \(error.localizedDescription, privacy: .public) for \(url.sanitizedForLogging, privacy: .public)") + return nil + case .some(.success(let intent)): + return intent + } + } + deliver(intents) + } + + internal func handleHandoff(_ activity: NSUserActivity) { + guard let connectionIdString = activity.userInfo?["connectionId"] as? String, + let connectionId = UUID(uuidString: connectionIdString) else { return } + let table = activity.userInfo?["tableName"] as? String + + if let table { + deliver([.openTable( + connectionId: connectionId, + database: nil, + schema: nil, + table: table, + isView: false + )]) + } else { + deliver([.openConnection(connectionId)]) + } + } + + internal func handleReopen(hasVisibleWindows: Bool) -> Bool { + if hasVisibleWindows { return true } + showWelcomeWindow() + return false + } + + // MARK: - Phase Transitions + + private func deliver(_ intents: [LaunchIntent]) { + guard !intents.isEmpty else { return } + if phase.isAcceptingIntents { + pendingIntents.append(contentsOf: intents) + for window in NSApp.windows where Self.isWelcomeWindow(window) { + window.orderOut(nil) + } + } else { + Task { [weak self] in + guard let self else { return } + for intent in intents { + await LaunchIntentRouter.shared.route(intent) + } + } + } + } + + private func transitionToRouting() { + guard hasFinishedLaunching else { return } + phase = .routing + let intents = pendingIntents + pendingIntents.removeAll() + + Task { [weak self] in + guard let self else { return } + for intent in intents { + await LaunchIntentRouter.shared.route(intent) + } + self.runStartupBehaviorIfNeeded(skipping: intents) + self.phase = .ready + self.finalizeWindowsIfNoVisibleMain(intents: intents) + } + } + + private func runStartupBehaviorIfNeeded(skipping intents: [LaunchIntent]) { + guard intents.isEmpty else { + closeRestoredMainWindowsExcept(intents: intents) + return + } + let general = AppSettingsStorage.shared.loadGeneral() + guard general.startupBehavior == .reopenLast else { + closeRestoredMainWindowsExcept(intents: intents) + return + } + let openIds = AppSettingsStorage.shared.loadLastOpenConnectionIds() + if !openIds.isEmpty { + attemptAutoReconnect(connectionIds: openIds) + return + } + if let lastId = AppSettingsStorage.shared.loadLastConnectionId() { + attemptAutoReconnect(connectionIds: [lastId]) + return + } + Task { [weak self] in + let diskIds = await TabDiskActor.shared.connectionIdsWithSavedState() + if !diskIds.isEmpty { + self?.attemptAutoReconnect(connectionIds: diskIds) + } else { + self?.closeRestoredMainWindowsExcept(intents: []) + } + } + } + + private func finalizeWindowsIfNoVisibleMain(intents: [LaunchIntent]) { + guard intents.isEmpty else { return } + guard !NSApp.windows.contains(where: { Self.isMainWindow($0) && $0.isVisible }) else { return } + showWelcomeWindow() + } + + private func closeRestoredMainWindowsExcept(intents: [LaunchIntent]) { + let preserved = Set(intents.compactMap { $0.targetConnectionId }) + for window in NSApp.windows where Self.isMainWindow(window) { + if let id = WindowLifecycleMonitor.shared.connectionId(forWindow: window), + preserved.contains(id) { + continue + } + window.close() + } + } + + private func attemptAutoReconnect(connectionIds: [UUID]) { + let saved = ConnectionStorage.shared.loadConnections() + let valid = connectionIds.compactMap { id in + saved.first(where: { $0.id == id }) + } + guard !valid.isEmpty else { + AppSettingsStorage.shared.saveLastOpenConnectionIds([]) + AppSettingsStorage.shared.saveLastConnectionId(nil) + closeRestoredMainWindowsExcept(intents: []) + showWelcomeWindow() + return + } + for window in NSApp.windows where Self.isWelcomeWindow(window) { + window.orderOut(nil) + } + Task { [weak self] in + for connection in valid { + let payload = EditorTabPayload( + connectionId: connection.id, intent: .restoreOrDefault + ) + WindowManager.shared.openTab(payload: payload) + do { + try await DatabaseManager.shared.ensureConnected(connection) + } catch is CancellationError { + for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { + window.close() + } + } catch { + Self.logger.error("Auto-reconnect failed for '\(connection.name, privacy: .public)': \(error.localizedDescription, privacy: .public)") + for window in WindowLifecycleMonitor.shared.windows(for: connection.id) { + window.close() + } + } + } + for window in NSApp.windows where Self.isWelcomeWindow(window) { + window.close() + } + if !NSApp.windows.contains(where: { Self.isMainWindow($0) && $0.isVisible }) { + self?.showWelcomeWindow() + } + } + } + + // MARK: - Window Identification + + internal static func isMainWindow(_ window: NSWindow) -> Bool { + guard let raw = window.identifier?.rawValue else { return false } + return raw == "main" || raw.hasPrefix("main-") + } + + internal static func isWelcomeWindow(_ window: NSWindow) -> Bool { + guard let raw = window.identifier?.rawValue else { return false } + return raw == "welcome" || raw.hasPrefix("welcome-") + } + + internal static func isConnectionFormWindow(_ window: NSWindow) -> Bool { + guard let raw = window.identifier?.rawValue else { return false } + return raw == "connection-form" || raw.hasPrefix("connection-form-") + } + + private func showWelcomeWindow() { + WelcomeWindowFactory.openOrFront() + } +} diff --git a/TablePro/Core/Services/Infrastructure/AppNotifications.swift b/TablePro/Core/Services/Infrastructure/AppNotifications.swift index ca04e402a..fa88c5b6a 100644 --- a/TablePro/Core/Services/Infrastructure/AppNotifications.swift +++ b/TablePro/Core/Services/Infrastructure/AppNotifications.swift @@ -19,8 +19,6 @@ extension Notification.Name { static let connectionUpdated = Notification.Name("connectionUpdated") static let connectionStatusDidChange = Notification.Name("connectionStatusDidChange") static let databaseDidConnect = Notification.Name("databaseDidConnect") - static let connectionShareFileOpened = Notification.Name("connectionShareFileOpened") - static let deeplinkImportRequested = Notification.Name("deeplinkImportRequested") static let exportConnections = Notification.Name("exportConnections") static let importConnections = Notification.Name("importConnections") static let importConnectionsFromApp = Notification.Name("importConnectionsFromApp") diff --git a/TablePro/Core/Services/Infrastructure/ConnectionFormWindowFactory.swift b/TablePro/Core/Services/Infrastructure/ConnectionFormWindowFactory.swift new file mode 100644 index 000000000..4c55f775e --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/ConnectionFormWindowFactory.swift @@ -0,0 +1,60 @@ +// +// ConnectionFormWindowFactory.swift +// TablePro +// + +import AppKit +import SwiftUI + +@MainActor +internal enum ConnectionFormWindowFactory { + private static let baseIdentifier = "connection-form" + + internal static func openOrFront(connectionId: UUID? = nil) { + if let existing = existingWindow(for: connectionId) { + existing.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + return + } + let window = makeWindow(connectionId: connectionId) + window.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + } + + internal static func close(connectionId: UUID? = nil) { + existingWindow(for: connectionId)?.close() + } + + internal static func closeAll() { + for window in NSApp.windows where AppLaunchCoordinator.isConnectionFormWindow(window) { + window.close() + } + } + + private static func existingWindow(for connectionId: UUID?) -> NSWindow? { + let target = identifier(for: connectionId) + return NSApp.windows.first { $0.identifier?.rawValue == target } + } + + private static func identifier(for connectionId: UUID?) -> String { + if let connectionId { + return "\(baseIdentifier)-\(connectionId.uuidString)" + } + return baseIdentifier + } + + private static func makeWindow(connectionId: UUID?) -> NSWindow { + let hostingController = NSHostingController(rootView: ConnectionFormView(connectionId: connectionId)) + let window = NSWindow(contentViewController: hostingController) + window.identifier = NSUserInterfaceItemIdentifier(identifier(for: connectionId)) + window.title = String(localized: "New Connection") + window.styleMask = [.titled, .closable, .resizable] + window.standardWindowButton(.miniaturizeButton)?.isEnabled = false + window.standardWindowButton(.zoomButton)?.isEnabled = false + window.styleMask.remove(.miniaturizable) + window.collectionBehavior.insert(.fullScreenNone) + window.center() + window.isReleasedWhenClosed = false + return window + } +} diff --git a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift b/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift deleted file mode 100644 index 8223851ca..000000000 --- a/TablePro/Core/Services/Infrastructure/DeeplinkHandler.swift +++ /dev/null @@ -1,300 +0,0 @@ -// -// DeeplinkHandler.swift -// TablePro -// - -import Foundation -import os - -struct PairingRequest: Sendable, Equatable { - let clientName: String - let challenge: String - let redirectURL: URL - let requestedScopes: String? - let requestedConnectionIds: Set? -} - -struct PairingExchange: Sendable, Equatable { - let code: String - let verifier: String -} - -enum DeeplinkAction { - case connect(connectionId: UUID) - case openTable(connectionId: UUID, tableName: String, databaseName: String?, schemaName: String?) - case openQuery(connectionId: UUID, sql: String) - case importConnection(ExportableConnection) - case pairIntegration(PairingRequest) - case exchangePairing(PairingExchange) - case startMCP -} - -@MainActor -enum DeeplinkHandler { - private static let logger = Logger(subsystem: "com.TablePro", category: "DeeplinkHandler") - - static func parse(_ url: URL) -> DeeplinkAction? { - guard url.scheme == "tablepro" else { return nil } - - let host = url.host(percentEncoded: false) - switch host { - case "connect": - return parseConnect(url) - case "import": - return parseImport(url) - case "integrations": - return parseIntegrations(url) - default: - logger.warning("Unknown deep link host: \(host ?? "nil", privacy: .public)") - return nil - } - } - - // MARK: - Connect parsing - - private static func parseConnect(_ url: URL) -> DeeplinkAction? { - let components = url.pathComponents.filter { $0 != "/" } - guard let firstRaw = components.first?.removingPercentEncoding, - !firstRaw.isEmpty else { return nil } - - guard let connectionId = UUID(uuidString: firstRaw) else { - logger.warning("Connect deep link missing valid UUID: \(firstRaw, privacy: .public)") - return nil - } - - if components.count >= 2, components[1] == "query" { - let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems - guard let sql = queryItems?.first(where: { $0.name == "sql" })?.value, - !sql.isEmpty else { return nil } - return .openQuery(connectionId: connectionId, sql: sql) - } - - if components.count == 7, - components[1] == "database", - components[3] == "schema", - components[5] == "table", - let dbName = components[2].removingPercentEncoding, - let schemaName = components[4].removingPercentEncoding, - let tableName = components[6].removingPercentEncoding { - return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName, schemaName: schemaName) - } - - if components.count == 5, - components[1] == "database", - components[3] == "table", - let dbName = components[2].removingPercentEncoding, - let tableName = components[4].removingPercentEncoding { - return .openTable(connectionId: connectionId, tableName: tableName, databaseName: dbName, schemaName: nil) - } - - if components.count >= 3, components[1] == "table", - let tableName = components[2].removingPercentEncoding { - return .openTable(connectionId: connectionId, tableName: tableName, databaseName: nil, schemaName: nil) - } - - if components.count == 1 { - return .connect(connectionId: connectionId) - } - - logger.warning("Unrecognized connect deep link path: \(url.path, privacy: .public)") - return nil - } - - // MARK: - Integrations parsing - - private static func parseIntegrations(_ url: URL) -> DeeplinkAction? { - let components = url.pathComponents.filter { $0 != "/" } - guard let action = components.first else { - logger.warning("Integrations deep link missing action") - return nil - } - - switch action { - case "pair": - return parsePair(url) - case "exchange": - return parseExchange(url) - case "start-mcp": - return .startMCP - default: - logger.warning("Unknown integrations action: \(action, privacy: .public)") - return nil - } - } - - private static func parsePair(_ url: URL) -> DeeplinkAction? { - guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems - else { - logger.warning("Pair deep link missing query items") - return nil - } - - func value(_ key: String) -> String? { - queryItems.first(where: { $0.name == key })?.value - } - - guard let clientName = value("client"), !clientName.isEmpty, - let challenge = value("challenge"), !challenge.isEmpty, - let redirectRaw = value("redirect"), !redirectRaw.isEmpty, - let redirectURL = URL(string: redirectRaw) else { - logger.warning("Pair deep link missing required params") - return nil - } - - let scopes = value("scopes")?.nilIfEmpty - let connectionIds: Set? - if let csv = value("connection-ids")?.nilIfEmpty { - let parsed = csv.split(separator: ",").compactMap { UUID(uuidString: String($0)) } - connectionIds = parsed.isEmpty ? nil : Set(parsed) - } else { - connectionIds = nil - } - - return .pairIntegration( - PairingRequest( - clientName: clientName, - challenge: challenge, - redirectURL: redirectURL, - requestedScopes: scopes, - requestedConnectionIds: connectionIds - ) - ) - } - - private static func parseExchange(_ url: URL) -> DeeplinkAction? { - guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems - else { - logger.warning("Exchange deep link missing query items") - return nil - } - - func value(_ key: String) -> String? { - queryItems.first(where: { $0.name == key })?.value - } - - guard let code = value("code"), !code.isEmpty, - let verifier = value("verifier"), !verifier.isEmpty else { - logger.warning("Exchange deep link missing code or verifier") - return nil - } - - return .exchangePairing(PairingExchange(code: code, verifier: verifier)) - } - - // MARK: - Import parsing - - private static func parseImport(_ url: URL) -> DeeplinkAction? { - guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems - else { return nil } - - func value(_ key: String) -> String? { - queryItems.first(where: { $0.name == key })?.value - } - - guard let name = value("name"), !name.isEmpty, - let host = value("host"), !host.isEmpty, - let typeStr = value("type"), - let dbType = DatabaseType(validating: typeStr) - ?? PluginMetadataRegistry.shared.allRegisteredTypeIds() - .first(where: { $0.lowercased() == typeStr.lowercased() }) - .map({ DatabaseType(rawValue: $0) }) - else { - logger.warning("Import deep link missing required params") - return nil - } - - let port = value("port").flatMap(Int.init) ?? dbType.defaultPort - let username = value("username") ?? "" - let database = value("database") ?? "" - - let sshConfig: ExportableSSHConfig? - if value("ssh") == "1" { - let jumpHosts: [ExportableJumpHost]? - if let jumpJson = value("sshJumpHosts"), - let data = jumpJson.data(using: .utf8) { - jumpHosts = try? JSONDecoder().decode([ExportableJumpHost].self, from: data) - } else { - jumpHosts = nil - } - sshConfig = ExportableSSHConfig( - enabled: true, - host: value("sshHost") ?? "", - port: value("sshPort").flatMap(Int.init) ?? 22, - username: value("sshUsername") ?? "", - authMethod: value("sshAuthMethod") ?? "password", - privateKeyPath: value("sshPrivateKeyPath") ?? "", - useSSHConfig: value("sshUseSSHConfig") == "1", - agentSocketPath: value("sshAgentSocketPath") ?? "", - jumpHosts: jumpHosts, - totpMode: value("sshTotpMode"), - totpAlgorithm: value("sshTotpAlgorithm"), - totpDigits: value("sshTotpDigits").flatMap(Int.init), - totpPeriod: value("sshTotpPeriod").flatMap(Int.init) - ) - } else { - sshConfig = nil - } - - let sslConfig: ExportableSSLConfig? - if let sslMode = value("sslMode") { - sslConfig = ExportableSSLConfig( - mode: sslMode, - caCertificatePath: value("sslCaCertPath"), - clientCertificatePath: value("sslClientCertPath"), - clientKeyPath: value("sslClientKeyPath") - ) - } else { - sslConfig = nil - } - - var additionalFields: [String: String]? - let afItems = queryItems.filter { $0.name.hasPrefix("af_") } - if !afItems.isEmpty { - var fields: [String: String] = [:] - for item in afItems { - let fieldKey = String(item.name.dropFirst(3)) - if !fieldKey.isEmpty, let fieldValue = item.value { - fields[fieldKey] = fieldValue - } - } - if !fields.isEmpty { - additionalFields = fields - } - } - - let exportable = ExportableConnection( - name: name, - host: host, - port: port, - database: database, - username: username, - type: dbType.rawValue, - sshConfig: sshConfig, - sslConfig: sslConfig, - color: value("color"), - tagName: value("tagName"), - groupName: value("groupName"), - sshProfileId: nil, - safeModeLevel: value("safeModeLevel"), - aiPolicy: value("aiPolicy"), - additionalFields: additionalFields, - redisDatabase: value("redisDatabase").flatMap(Int.init), - startupCommands: value("startupCommands"), - localOnly: value("localOnly") == "1" ? true : nil - ) - - return .importConnection(exportable) - } - - // MARK: - Resolution - - static func resolveConnection(byId id: UUID) -> DatabaseConnection? { - ConnectionStorage.shared.loadConnections().first { $0.id == id } - } -} - -private extension String { - var nilIfEmpty: String? { - isEmpty ? nil : self - } -} diff --git a/TablePro/Core/Services/Infrastructure/DeeplinkParser.swift b/TablePro/Core/Services/Infrastructure/DeeplinkParser.swift new file mode 100644 index 000000000..d6bc15890 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/DeeplinkParser.swift @@ -0,0 +1,378 @@ +// +// DeeplinkParser.swift +// TablePro +// + +import Foundation +import TableProPluginKit + +internal enum DeeplinkError: Error, LocalizedError, Equatable { + case unknownScheme(String) + case unknownHost(String) + case malformedPath(String) + case missingRequiredParam(String) + case invalidUUID(String) + case sqlTooLong(Int, limit: Int) + case unsupportedDatabaseType(String) + + internal var errorDescription: String? { + switch self { + case .unknownScheme(let scheme): + return String(format: String(localized: "Unknown URL scheme: %@"), scheme) + case .unknownHost(let host): + return String(format: String(localized: "Unknown deep link host: %@"), host) + case .malformedPath(let path): + return String(format: String(localized: "Malformed deep link path: %@"), path) + case .missingRequiredParam(let name): + return String(format: String(localized: "Missing required parameter: %@"), name) + case .invalidUUID(let raw): + return String(format: String(localized: "Invalid UUID: %@"), raw) + case .sqlTooLong(let length, let limit): + return String( + format: String(localized: "SQL is too long: %d characters (limit %d)"), + length, limit + ) + case .unsupportedDatabaseType(let raw): + return String(format: String(localized: "Unsupported database type: %@"), raw) + } + } +} + +internal enum DeeplinkParser { + internal static let sqlLengthLimit = 51_200 + + internal static func parse(_ url: URL) -> Result { + guard url.scheme == "tablepro" else { + return .failure(.unknownScheme(url.scheme ?? "")) + } + let host = url.host(percentEncoded: false) ?? "" + switch host { + case "connect": + return parseConnect(url) + case "import": + return parseImport(url) + case "integrations": + return parseIntegrations(url) + default: + return .failure(.unknownHost(host)) + } + } + + private static func parseConnect(_ url: URL) -> Result { + let segments = pathSegments(url) + var cursor = PathCursor(segments: segments) + + guard let firstRaw = cursor.next() else { + return .failure(.malformedPath(url.path)) + } + guard let connectionId = UUID(uuidString: firstRaw) else { + return .failure(.invalidUUID(firstRaw)) + } + + guard let head = cursor.peek() else { + return .success(.openConnection(connectionId)) + } + + switch head { + case "table": + cursor.advance() + guard let table = cursor.next(), !table.isEmpty else { + return .failure(.malformedPath(url.path)) + } + guard cursor.atEnd else { return .failure(.malformedPath(url.path)) } + return .success(.openTable( + connectionId: connectionId, + database: nil, + schema: nil, + table: table, + isView: false + )) + + case "database": + cursor.advance() + guard let database = cursor.next(), !database.isEmpty else { + return .failure(.malformedPath(url.path)) + } + return parseDatabaseTail( + connectionId: connectionId, database: database, cursor: &cursor, fullPath: url.path + ) + + case "query": + cursor.advance() + guard cursor.atEnd else { return .failure(.malformedPath(url.path)) } + return parseQuery(url: url, connectionId: connectionId) + + default: + return .failure(.malformedPath(url.path)) + } + } + + private static func parseDatabaseTail( + connectionId: UUID, + database: String, + cursor: inout PathCursor, + fullPath: String + ) -> Result { + guard let next = cursor.next() else { + return .failure(.malformedPath(fullPath)) + } + switch next { + case "schema": + guard let schema = cursor.next(), !schema.isEmpty else { + return .failure(.malformedPath(fullPath)) + } + guard cursor.next() == "table", + let table = cursor.next(), !table.isEmpty else { + return .failure(.malformedPath(fullPath)) + } + guard cursor.atEnd else { return .failure(.malformedPath(fullPath)) } + return .success(.openTable( + connectionId: connectionId, + database: database, + schema: schema, + table: table, + isView: false + )) + + case "table": + guard let table = cursor.next(), !table.isEmpty else { + return .failure(.malformedPath(fullPath)) + } + guard cursor.atEnd else { return .failure(.malformedPath(fullPath)) } + return .success(.openTable( + connectionId: connectionId, + database: database, + schema: nil, + table: table, + isView: false + )) + + default: + return .failure(.malformedPath(fullPath)) + } + } + + private static func parseQuery(url: URL, connectionId: UUID) -> Result { + guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems, + let rawSQL = queryItems.first(where: { $0.name == "sql" })?.value, + !rawSQL.isEmpty else { + return .failure(.missingRequiredParam("sql")) + } + let length = (rawSQL as NSString).length + guard length <= sqlLengthLimit else { + return .failure(.sqlTooLong(length, limit: sqlLengthLimit)) + } + return .success(.openQuery(connectionId: connectionId, sql: rawSQL)) + } + + private static func parseIntegrations(_ url: URL) -> Result { + let segments = pathSegments(url) + var cursor = PathCursor(segments: segments) + guard let action = cursor.next() else { + return .failure(.malformedPath(url.path)) + } + switch action { + case "pair": + return parsePair(url) + case "start-mcp": + return .success(.startMCPServer) + default: + return .failure(.malformedPath(url.path)) + } + } + + private static func parsePair(_ url: URL) -> Result { + guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems + else { + return .failure(.missingRequiredParam("client")) + } + func value(_ key: String) -> String? { + queryItems.first(where: { $0.name == key })?.value + } + + guard let clientName = value("client"), !clientName.isEmpty else { + return .failure(.missingRequiredParam("client")) + } + guard let challenge = value("challenge"), !challenge.isEmpty else { + return .failure(.missingRequiredParam("challenge")) + } + guard let redirectRaw = value("redirect"), !redirectRaw.isEmpty, + let redirectURL = URL(string: redirectRaw) else { + return .failure(.missingRequiredParam("redirect")) + } + + let scopes = value("scopes")?.nilIfEmpty + let connectionIds: Set? + if let csv = value("connection-ids")?.nilIfEmpty { + let parsed = csv.split(separator: ",").compactMap { UUID(uuidString: String($0)) } + connectionIds = parsed.isEmpty ? nil : Set(parsed) + } else { + connectionIds = nil + } + + return .success(.pairIntegration( + PairingRequest( + clientName: clientName, + challenge: challenge, + redirectURL: redirectURL, + requestedScopes: scopes, + requestedConnectionIds: connectionIds + ) + )) + } + + private static func parseImport(_ url: URL) -> Result { + guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems + else { + return .failure(.missingRequiredParam("name")) + } + func value(_ key: String) -> String? { + queryItems.first(where: { $0.name == key })?.value + } + + guard let name = value("name"), !name.isEmpty else { + return .failure(.missingRequiredParam("name")) + } + guard let host = value("host"), !host.isEmpty else { + return .failure(.missingRequiredParam("host")) + } + guard let typeStr = value("type") else { + return .failure(.missingRequiredParam("type")) + } + + let resolvedType: DatabaseType? + if let direct = DatabaseType(validating: typeStr) { + resolvedType = direct + } else if let pluginMatch = PluginMetadataRegistry.shared.allRegisteredTypeIds() + .first(where: { $0.lowercased() == typeStr.lowercased() }) { + resolvedType = DatabaseType(rawValue: pluginMatch) + } else { + resolvedType = nil + } + guard let dbType = resolvedType else { + return .failure(.unsupportedDatabaseType(typeStr)) + } + + let port = value("port").flatMap(Int.init) ?? dbType.defaultPort + let username = value("username") ?? "" + let database = value("database") ?? "" + + let sshConfig: ExportableSSHConfig? + if value("ssh") == "1" { + let jumpHosts: [ExportableJumpHost]? + if let jumpJson = value("sshJumpHosts"), + let data = jumpJson.data(using: .utf8) { + jumpHosts = try? JSONDecoder().decode([ExportableJumpHost].self, from: data) + } else { + jumpHosts = nil + } + sshConfig = ExportableSSHConfig( + enabled: true, + host: value("sshHost") ?? "", + port: value("sshPort").flatMap(Int.init) ?? 22, + username: value("sshUsername") ?? "", + authMethod: value("sshAuthMethod") ?? "password", + privateKeyPath: value("sshPrivateKeyPath") ?? "", + useSSHConfig: value("sshUseSSHConfig") == "1", + agentSocketPath: value("sshAgentSocketPath") ?? "", + jumpHosts: jumpHosts, + totpMode: value("sshTotpMode"), + totpAlgorithm: value("sshTotpAlgorithm"), + totpDigits: value("sshTotpDigits").flatMap(Int.init), + totpPeriod: value("sshTotpPeriod").flatMap(Int.init) + ) + } else { + sshConfig = nil + } + + let sslConfig: ExportableSSLConfig? + if let sslMode = value("sslMode") { + sslConfig = ExportableSSLConfig( + mode: sslMode, + caCertificatePath: value("sslCaCertPath"), + clientCertificatePath: value("sslClientCertPath"), + clientKeyPath: value("sslClientKeyPath") + ) + } else { + sslConfig = nil + } + + var additionalFields: [String: String]? + let afItems = queryItems.filter { $0.name.hasPrefix("af_") } + if !afItems.isEmpty { + var fields: [String: String] = [:] + for item in afItems { + let fieldKey = String(item.name.dropFirst(3)) + if !fieldKey.isEmpty, let fieldValue = item.value, !fieldValue.isEmpty { + fields[fieldKey] = fieldValue + } + } + if !fields.isEmpty { + additionalFields = fields + } + } + + let exportable = ExportableConnection( + name: name, + host: host, + port: port, + database: database, + username: username, + type: dbType.rawValue, + sshConfig: sshConfig, + sslConfig: sslConfig, + color: value("color"), + tagName: value("tagName"), + groupName: value("groupName"), + sshProfileId: nil, + safeModeLevel: value("safeModeLevel"), + aiPolicy: value("aiPolicy"), + additionalFields: additionalFields, + redisDatabase: value("redisDatabase").flatMap(Int.init), + startupCommands: value("startupCommands"), + localOnly: value("localOnly") == "1" ? true : nil + ) + + return .success(.importConnection(exportable)) + } + + private static func pathSegments(_ url: URL) -> [String] { + url.pathComponents + .filter { $0 != "/" } + .compactMap { $0.removingPercentEncoding } + } +} + +private struct PathCursor { + private let segments: [String] + private var index: Int = 0 + + init(segments: [String]) { + self.segments = segments + } + + var atEnd: Bool { + index >= segments.count + } + + func peek() -> String? { + guard index < segments.count else { return nil } + return segments[index] + } + + mutating func advance() { + index += 1 + } + + mutating func next() -> String? { + guard index < segments.count else { return nil } + defer { index += 1 } + return segments[index] + } +} + +private extension String { + var nilIfEmpty: String? { + isEmpty ? nil : self + } +} diff --git a/TablePro/Core/Services/Infrastructure/LaunchIntent.swift b/TablePro/Core/Services/Infrastructure/LaunchIntent.swift new file mode 100644 index 000000000..aef5d2f68 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/LaunchIntent.swift @@ -0,0 +1,38 @@ +// +// LaunchIntent.swift +// TablePro +// + +import Foundation + +internal enum LaunchIntent: @unchecked Sendable { + case openConnection(UUID) + case openTable(connectionId: UUID, database: String?, schema: String?, table: String, isView: Bool) + case openQuery(connectionId: UUID, sql: String) + case importConnection(ExportableConnection) + case openSQLFile(URL) + case openDatabaseFile(URL, DatabaseType) + case openConnectionShare(URL) + case pairIntegration(PairingRequest) + case startMCPServer + case openDatabaseURL(URL) + case installPlugin(URL) + + internal var targetConnectionId: UUID? { + switch self { + case .openConnection(let id), + .openTable(let id, _, _, _, _), + .openQuery(let id, _): + return id + case .openDatabaseURL, + .openDatabaseFile, + .openSQLFile, + .importConnection, + .openConnectionShare, + .pairIntegration, + .startMCPServer, + .installPlugin: + return nil + } + } +} diff --git a/TablePro/Core/Services/Infrastructure/LaunchIntentRouter.swift b/TablePro/Core/Services/Infrastructure/LaunchIntentRouter.swift new file mode 100644 index 000000000..7a60f1959 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/LaunchIntentRouter.swift @@ -0,0 +1,95 @@ +// +// LaunchIntentRouter.swift +// TablePro +// + +import AppKit +import Foundation +import os + +@MainActor +internal final class LaunchIntentRouter { + internal static let shared = LaunchIntentRouter() + + private static let logger = Logger(subsystem: "com.TablePro", category: "LaunchIntentRouter") + + private init() {} + + internal func route(_ intent: LaunchIntent) async { + do { + switch intent { + case .openConnection, + .openTable, + .openQuery, + .openDatabaseURL, + .openDatabaseFile, + .openSQLFile: + try await TabRouter.shared.route(intent) + + case .importConnection(let exportable): + WelcomeRouter.shared.routeImport(exportable) + + case .openConnectionShare(let url): + WelcomeRouter.shared.routeShare(url) + + case .pairIntegration(let request): + try await MCPPairingService.shared.startPairing(request) + + case .startMCPServer: + await MCPServerManager.shared.lazyStart() + + case .installPlugin(let url): + try await installPlugin(url) + } + } catch let error as TabRouterError where error == .userCancelled { + Self.logger.info("Intent cancelled by user") + } catch let error as MCPError where error.isUserCancelled { + Self.logger.info("Pairing cancelled by user") + } catch is CancellationError { + Self.logger.info("Intent cancelled") + } catch { + Self.logger.error("Intent failed: \(error.localizedDescription, privacy: .public)") + await presentError(error, for: intent) + } + } + + private func installPlugin(_ url: URL) async throws { + let entry = try await PluginManager.shared.installPlugin(from: url) + Self.logger.info("Installed plugin '\(entry.name, privacy: .public)' from Finder") + UserDefaults.standard.set(SettingsTab.plugins.rawValue, forKey: "selectedSettingsTab") + NotificationCenter.default.post(name: .openSettingsWindow, object: nil) + } + + private func presentError(_ error: Error, for intent: LaunchIntent) async { + let title: String + switch intent { + case .pairIntegration: + title = String(localized: "Pairing Failed") + case .installPlugin: + title = String(localized: "Plugin Installation Failed") + case .openConnection, .openTable, .openQuery, .openDatabaseURL, .openDatabaseFile: + title = String(localized: "Connection Failed") + case .openSQLFile: + title = String(localized: "Could Not Open File") + case .importConnection, .openConnectionShare, .startMCPServer: + title = String(localized: "Action Failed") + } + AlertHelper.showErrorSheet( + title: title, + message: error.localizedDescription, + window: NSApp.keyWindow + ) + } +} + +extension TabRouterError: Equatable { + internal static func == (lhs: TabRouterError, rhs: TabRouterError) -> Bool { + switch (lhs, rhs) { + case (.userCancelled, .userCancelled): return true + case (.connectionNotFound(let l), .connectionNotFound(let r)): return l == r + case (.malformedDatabaseURL(let l), .malformedDatabaseURL(let r)): return l == r + case (.unsupportedIntent(let l), .unsupportedIntent(let r)): return l == r + default: return false + } + } +} diff --git a/TablePro/Core/Services/Infrastructure/LaunchPhase.swift b/TablePro/Core/Services/Infrastructure/LaunchPhase.swift new file mode 100644 index 000000000..2bbf8e0c5 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/LaunchPhase.swift @@ -0,0 +1,27 @@ +// +// LaunchPhase.swift +// TablePro +// + +import Foundation + +internal enum LaunchPhase: Equatable, Sendable { + case launching + case collectingIntents(deadline: Date) + case routing + case ready + + internal var isAcceptingIntents: Bool { + switch self { + case .launching, .collectingIntents: + return true + case .routing, .ready: + return false + } + } + + internal var isReady: Bool { + if case .ready = self { return true } + return false + } +} diff --git a/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift b/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift index b0bdc60c7..c200decf4 100644 --- a/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift +++ b/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift @@ -45,7 +45,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi // MARK: - Observers private var connectionStatusObserver: NSObjectProtocol? - private var newConnectionObserver: NSObjectProtocol? // MARK: - Init @@ -199,15 +198,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi self?.handleConnectionStatusChange() } } - newConnectionObserver = NotificationCenter.default.addObserver( - forName: .newConnection, - object: nil, - queue: .main - ) { _ in - MainActor.assumeIsolated { - NotificationCenter.default.post(name: .openWelcomeWindow, object: nil) - } - } handleConnectionStatusChange() } @@ -216,10 +206,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi NotificationCenter.default.removeObserver(observer) connectionStatusObserver = nil } - if let observer = newConnectionObserver { - NotificationCenter.default.removeObserver(observer) - newConnectionObserver = nil - } } // MARK: - Toolbar @@ -320,7 +306,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi private func buildSidebarView() -> some View { if let currentSession, let sessionState { SidebarView( - tables: sessionTablesBinding, sidebarState: SharedSidebarState.forConnection(currentSession.connection.id), onDoubleClick: { [weak self] table in guard let coordinator = self?.sessionState?.coordinator else { return } @@ -358,7 +343,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi connection: currentSession.connection, payload: payload, windowTitle: windowTitleBinding, - tables: sessionTablesBinding, sidebarState: SharedSidebarState.forConnection(currentSession.connection.id), pendingTruncates: sessionPendingTruncatesBinding, pendingDeletes: sessionPendingDeletesBinding, @@ -419,10 +403,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi ) } - private var sessionTablesBinding: Binding<[TableInfo]> { - createSessionBinding(get: { $0.tables }, set: { $0.tables = $1 }, defaultValue: []) - } - private var sessionPendingTruncatesBinding: Binding> { createSessionBinding(get: { $0.pendingTruncates }, set: { $0.pendingTruncates = $1 }, defaultValue: []) } diff --git a/TablePro/Core/Services/Infrastructure/MainWindowToolbar.swift b/TablePro/Core/Services/Infrastructure/MainWindowToolbar.swift index 38efcee31..5b8b08948 100644 --- a/TablePro/Core/Services/Infrastructure/MainWindowToolbar.swift +++ b/TablePro/Core/Services/Infrastructure/MainWindowToolbar.swift @@ -258,23 +258,20 @@ internal final class MainWindowToolbar: NSObject, NSToolbarDelegate { private struct ConnectionToolbarButton: View { let coordinator: MainContentCoordinator - @State private var showSwitcher = false var body: some View { + @Bindable var state = coordinator.toolbarState Button { - showSwitcher.toggle() + state.showConnectionSwitcher.toggle() } label: { Label("Connection", systemImage: "network") } .help(String(localized: "Switch Connection (⌘⌥C)")) - .popover(isPresented: $showSwitcher) { + .popover(isPresented: $state.showConnectionSwitcher) { ConnectionSwitcherPopover { - showSwitcher = false + state.showConnectionSwitcher = false } } - .onReceive(NotificationCenter.default.publisher(for: .openConnectionSwitcher)) { _ in - showSwitcher = true - } } } diff --git a/TablePro/Core/Services/Infrastructure/PendingActionStore.swift b/TablePro/Core/Services/Infrastructure/PendingActionStore.swift deleted file mode 100644 index 707884e9c..000000000 --- a/TablePro/Core/Services/Infrastructure/PendingActionStore.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// PendingActionStore.swift -// TablePro -// - -import Foundation - -@MainActor @Observable -final class PendingActionStore { - static let shared = PendingActionStore() - - var connectionShareURL: URL? - var deeplinkImport: ExportableConnection? - - private init() {} - - func consumeConnectionShareURL() -> URL? { - let url = connectionShareURL - connectionShareURL = nil - return url - } - - func consumeDeeplinkImport() -> ExportableConnection? { - let value = deeplinkImport - deeplinkImport = nil - return value - } -} diff --git a/TablePro/Core/Services/Infrastructure/SessionStateFactory.swift b/TablePro/Core/Services/Infrastructure/SessionStateFactory.swift index 099912e81..ffabe045a 100644 --- a/TablePro/Core/Services/Infrastructure/SessionStateFactory.swift +++ b/TablePro/Core/Services/Infrastructure/SessionStateFactory.swift @@ -2,9 +2,6 @@ // SessionStateFactory.swift // TablePro // -// Factory for creating session state objects used by MainContentView. -// Extracted from MainContentView.init to enable testability. -// import Foundation import os @@ -22,23 +19,36 @@ enum SessionStateFactory { let coordinator: MainContentCoordinator } - /// Hand-off registry for SessionState created eagerly by `WindowManager.openTab`. - /// `WindowManager` creates the coordinator BEFORE `TabWindowController.init` so the - /// NSToolbar can be installed synchronously in init (eliminating the toolbar flash - /// caused by lazy install via `WindowAccessor → configureWindow` after the window - /// is already on-screen). `ContentView.init` consumes the same SessionState here so - /// only one coordinator exists per window — no duplicate-tab side effects. private static var pendingSessionStates: [UUID: SessionState] = [:] + private static var pendingExpirationTasks: [UUID: Task] = [:] + + private static let pendingEntryTTL: Duration = .seconds(5) static func registerPending(_ state: SessionState, for payloadId: UUID) { pendingSessionStates[payloadId] = state + pendingExpirationTasks[payloadId]?.cancel() + pendingExpirationTasks[payloadId] = Task { [payloadId] in + try? await Task.sleep(for: pendingEntryTTL) + guard !Task.isCancelled else { return } + await MainActor.run { + pendingExpirationTasks.removeValue(forKey: payloadId) + guard let abandoned = pendingSessionStates.removeValue(forKey: payloadId) else { + return + } + MainContentCoordinator.activeCoordinators.removeValue( + forKey: abandoned.coordinator.instanceId + ) + } + } } static func consumePending(for payloadId: UUID) -> SessionState? { - pendingSessionStates.removeValue(forKey: payloadId) + pendingExpirationTasks.removeValue(forKey: payloadId)?.cancel() + return pendingSessionStates.removeValue(forKey: payloadId) } static func removePending(for payloadId: UUID) { + pendingExpirationTasks.removeValue(forKey: payloadId)?.cancel() pendingSessionStates.removeValue(forKey: payloadId) } @@ -46,14 +56,16 @@ enum SessionStateFactory { connection: DatabaseConnection, payload: EditorTabPayload? ) -> SessionState { - let tabMgr = QueryTabManager() + let connectionId = connection.id + let tabMgr = QueryTabManager(globalTabsProvider: { + MainActor.assumeIsolated { MainContentCoordinator.allTabs(for: connectionId) } + }) let changeMgr = DataChangeManager() changeMgr.databaseType = connection.type let filterMgr = FilterStateManager() let colVisMgr = ColumnVisibilityManager() let toolbarSt = ConnectionToolbarState(connection: connection) - // Eagerly populate version + state from existing session to avoid flash if let session = DatabaseManager.shared.session(for: connection.id) { toolbarSt.updateConnectionState(from: session.status) if let driver = session.driver { @@ -65,7 +77,6 @@ enum SessionStateFactory { } toolbarSt.hasCompletedSetup = true - // Redis: set initial database name eagerly to avoid toolbar flash if connection.type.pluginTypeId == "Redis" { let dbIndex = connection.redisDatabase ?? Int(connection.database) ?? 0 toolbarSt.databaseName = String(dbIndex) @@ -136,7 +147,11 @@ enum SessionStateFactory { case .newEmptyTab: let allTabs = MainContentCoordinator.allTabs(for: connection.id) let title = QueryTabManager.nextQueryTitle(existingTabs: allTabs) - tabMgr.addTab(title: title, databaseName: payload.databaseName ?? connection.database) + tabMgr.addTab( + initialQuery: payload.initialQuery, + title: title, + databaseName: payload.databaseName ?? connection.database + ) case .restoreOrDefault: break } @@ -151,6 +166,13 @@ enum SessionStateFactory { toolbarState: toolbarSt ) + // Eagerly publish to the active-coordinator registry so concurrent + // window opens for the same connection both observe each other when + // computing globals like nextQueryTitle. Without this, two windows + // opened back-to-back can both compute "Query 1" before either has + // run onAppear. + coord.registerEagerly() + return SessionState( tabManager: tabMgr, changeManager: changeMgr, diff --git a/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator+AggregatedSave.swift b/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator+AggregatedSave.swift new file mode 100644 index 000000000..c4424943e --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator+AggregatedSave.swift @@ -0,0 +1,33 @@ +// +// TabPersistenceCoordinator+AggregatedSave.swift +// TablePro +// + +import Foundation + +extension TabPersistenceCoordinator { + /// Save or clear persisted state based on tabs aggregated across all windows + /// for the connection. Prevents the per-window close path from clobbering + /// state when sibling windows still have open tabs. + func saveOrClearAggregated() { + let aggregatedTabs = MainContentCoordinator.aggregatedTabs(for: connectionId) + if aggregatedTabs.isEmpty { + clearSavedState() + } else { + let selectedId = MainContentCoordinator.aggregatedSelectedTabId(for: connectionId) + saveNow(tabs: aggregatedTabs, selectedTabId: selectedId) + } + } + + /// Synchronous variant for the window-close path, where the run loop may + /// not be available to service Tasks before the window tears down. + func saveOrClearAggregatedSync() { + let aggregatedTabs = MainContentCoordinator.aggregatedTabs(for: connectionId) + if aggregatedTabs.isEmpty { + saveNowSync(tabs: [], selectedTabId: nil) + } else { + let selectedId = MainContentCoordinator.aggregatedSelectedTabId(for: connectionId) + saveNowSync(tabs: aggregatedTabs, selectedTabId: selectedId) + } + } +} diff --git a/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator.swift b/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator.swift index 3af4eb7ee..2ce909d20 100644 --- a/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator.swift +++ b/TablePro/Core/Services/Infrastructure/TabPersistenceCoordinator.swift @@ -2,15 +2,11 @@ // TabPersistenceCoordinator.swift // TablePro // -// Explicit-save coordinator for tab state persistence. -// Replaces debounced/flag-based TabPersistenceService with direct save calls. -// import Foundation import Observation import os -/// Result of tab restoration from disk internal struct RestoreResult { let tabs: [QueryTab] let selectedTabId: UUID? @@ -22,22 +18,19 @@ internal struct RestoreResult { } } -/// Coordinator for persisting and restoring tab state. -/// All saves are explicit: no debounce timers, no onChange-driven saves, -/// no isDismissing/isRestoringTabs flag state machine. @MainActor @Observable internal final class TabPersistenceCoordinator { private static let logger = Logger(subsystem: "com.TablePro", category: "NativeTabLifecycle") let connectionId: UUID + @ObservationIgnored private var saveTask: Task? + init(connectionId: UUID) { self.connectionId = connectionId } // MARK: - Save - /// Save tab state to disk. Called explicitly at named business events - /// (tab switch, window close, quit, etc.). internal func saveNow(tabs: [QueryTab], selectedTabId: UUID?) { let nonPreviewTabs = tabs.filter { !$0.isPreview } guard !nonPreviewTabs.isEmpty else { @@ -45,43 +38,17 @@ internal final class TabPersistenceCoordinator { return } let persisted = nonPreviewTabs.map { convertToPersistedTab($0) } - let connId = connectionId let normalizedSelectedId = nonPreviewTabs.contains(where: { $0.id == selectedTabId }) ? selectedTabId : nonPreviewTabs.first?.id - Self.logger.debug("[persist] saveNow queued tabCount=\(nonPreviewTabs.count) connId=\(connId, privacy: .public)") - - Task { - let t0 = Date() - do { - try await TabDiskActor.shared.save(connectionId: connId, tabs: persisted, selectedTabId: normalizedSelectedId) - Self.logger.debug("[persist] saveNow written tabCount=\(persisted.count) connId=\(connId, privacy: .public) ms=\(Int(Date().timeIntervalSince(t0) * 1_000))") - } catch { - TabDiskActor.logSaveError(connectionId: connId, error: error) - } - } + scheduleSave(tabs: persisted, selectedTabId: normalizedSelectedId) } - /// Save pre-aggregated tabs for the quit path, where the caller has already - /// collected and converted tabs from all windows for this connection. - internal func saveNow(persistedTabs: [PersistedTab], selectedTabId: UUID?) { - let connId = connectionId - let selectedId = selectedTabId - - Task { - do { - try await TabDiskActor.shared.save(connectionId: connId, tabs: persistedTabs, selectedTabId: selectedId) - } catch { - TabDiskActor.logSaveError(connectionId: connId, error: error) - } - } - } - - /// Synchronous save for `applicationWillTerminate` where no run loop - /// remains to service async Tasks. Bypasses the actor and writes directly. internal func saveNowSync(tabs: [QueryTab], selectedTabId: UUID?) { let nonPreviewTabs = tabs.filter { !$0.isPreview } guard !nonPreviewTabs.isEmpty else { - TabDiskActor.saveSync(connectionId: connectionId, tabs: [], selectedTabId: nil) + saveTask?.cancel() + saveTask = nil + TabDiskActor.clearSync(connectionId: connectionId) return } let persisted = nonPreviewTabs.map { convertToPersistedTab($0) } @@ -92,17 +59,40 @@ internal final class TabPersistenceCoordinator { // MARK: - Clear - /// Clear all saved state for this connection (user closed all tabs). internal func clearSavedState() { + saveTask?.cancel() + saveTask = nil let connId = connectionId Task { await TabDiskActor.shared.clear(connectionId: connId) } } + // MARK: - Private save scheduling + + private func scheduleSave(tabs: [PersistedTab], selectedTabId: UUID?) { + saveTask?.cancel() + let connId = connectionId + let tabsCopy = tabs + let selectedId = selectedTabId + Self.logger.debug("[persist] saveNow queued tabCount=\(tabsCopy.count) connId=\(connId, privacy: .public)") + + saveTask = Task { + guard !Task.isCancelled else { return } + let t0 = Date() + do { + try await TabDiskActor.shared.save(connectionId: connId, tabs: tabsCopy, selectedTabId: selectedId) + Self.logger.debug("[persist] saveNow written tabCount=\(tabsCopy.count) connId=\(connId, privacy: .public) ms=\(Int(Date().timeIntervalSince(t0) * 1_000))") + } catch is CancellationError { + return + } catch { + Self.logger.fault("Failed to save tab state for connection \(connId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } + } + // MARK: - Restore - /// Restore tabs from disk. Called once at window creation. internal func restoreFromDisk() async -> RestoreResult { guard let state = await TabDiskActor.shared.load(connectionId: connectionId) else { return RestoreResult(tabs: [], selectedTabId: nil, source: .none) diff --git a/TablePro/Core/Services/Infrastructure/TabRouter.swift b/TablePro/Core/Services/Infrastructure/TabRouter.swift new file mode 100644 index 000000000..198b47f8e --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/TabRouter.swift @@ -0,0 +1,426 @@ +// +// TabRouter.swift +// TablePro +// + +import AppKit +import Foundation +import os + +internal enum TabRouterError: Error, LocalizedError { + case connectionNotFound(UUID) + case malformedDatabaseURL(URL) + case userCancelled + case unsupportedIntent(String) + + internal var errorDescription: String? { + switch self { + case .connectionNotFound(let id): + return String( + format: String(localized: "No saved connection with ID \"%@\"."), id.uuidString + ) + case .malformedDatabaseURL(let url): + return String( + format: String(localized: "Could not parse database URL: %@"), url.sanitizedForLogging + ) + case .userCancelled: + return String(localized: "Cancelled by user.") + case .unsupportedIntent(let detail): + return String(format: String(localized: "Unsupported intent: %@"), detail) + } + } +} + +@MainActor +internal final class TabRouter { + internal static let shared = TabRouter() + + private static let logger = Logger(subsystem: "com.TablePro", category: "TabRouter") + + private init() {} + + internal func route(_ intent: LaunchIntent) async throws { + switch intent { + case .openConnection(let id): + try await openConnection(id: id) + + case .openTable(let id, let database, let schema, let table, let isView): + try await openTable( + connectionId: id, transientConnection: nil, + database: database, schema: schema, table: table, isView: isView + ) + + case .openQuery(let id, let sql): + try await openQuery(connectionId: id, sql: sql) + + case .openDatabaseURL(let url): + try await openDatabaseURL(url) + + case .openDatabaseFile(let url, let type): + try await openDatabaseFile(url, type: type) + + case .openSQLFile(let url): + try await openSQLFile(url) + + default: + throw TabRouterError.unsupportedIntent(String(describing: intent)) + } + } + + // MARK: - Connection + + private func openConnection(id: UUID) async throws { + guard let connection = ConnectionStorage.shared.loadConnections().first(where: { $0.id == id }) else { + throw TabRouterError.connectionNotFound(id) + } + if let existing = WindowLifecycleMonitor.shared.findWindow(for: id) { + existing.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + try await DatabaseManager.shared.ensureConnected(connection) + closeWelcomeWindows() + return + } + try await runPreConnectScriptIfNeeded(connection) + let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + try await DatabaseManager.shared.ensureConnected(connection) + closeWelcomeWindows() + } + + // MARK: - Table + + private func openTable( + connectionId: UUID, transientConnection: DatabaseConnection? = nil, + database: String?, schema: String?, table: String, isView: Bool + ) async throws { + let connection: DatabaseConnection + if let transientConnection { + connection = transientConnection + } else if let stored = ConnectionStorage.shared.loadConnections().first(where: { $0.id == connectionId }) { + connection = stored + } else { + throw TabRouterError.connectionNotFound(connectionId) + } + try await runPreConnectScriptIfNeeded(connection) + try await DatabaseManager.shared.ensureConnected(connection) + + if let schema { + await switchSchemaOrDatabase(connectionId: connectionId, target: schema) + } else if let database { + await switchSchemaOrDatabase(connectionId: connectionId, target: database) + } + + if focusExistingTableTab(connectionId: connectionId, database: database, schema: schema, table: table) { + NSApp.activate(ignoringOtherApps: true) + closeWelcomeWindows() + return + } + + let payload = EditorTabPayload( + connectionId: connectionId, + tabType: .table, + tableName: table, + databaseName: database, + schemaName: schema, + isView: isView + ) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + closeWelcomeWindows() + } + + private func focusExistingTableTab( + connectionId: UUID, database: String?, schema: String?, table: String + ) -> Bool { + for coordinator in MainContentCoordinator.allActiveCoordinators() + where coordinator.connectionId == connectionId { + guard let match = coordinator.tabManager.tabs.first(where: { tab in + guard tab.tabType == .table, + tab.tableContext.tableName == table else { return false } + let databaseMatches = database.map { db in + tab.tableContext.databaseName == db + } ?? true + let schemaMatches = schema.map { sch in + tab.tableContext.schemaName.map { $0 == sch } ?? false + } ?? true + return databaseMatches && schemaMatches + }) else { continue } + coordinator.tabManager.selectedTabId = match.id + if let windowId = coordinator.windowId, + let window = WindowLifecycleMonitor.shared.window(for: windowId) { + window.makeKeyAndOrderFront(nil) + } + return true + } + return false + } + + // MARK: - Query + + private func openQuery(connectionId: UUID, sql: String) async throws { + guard let connection = ConnectionStorage.shared.loadConnections().first(where: { $0.id == connectionId }) else { + throw TabRouterError.connectionNotFound(connectionId) + } + + let preview = previewForSQL(sql) + let confirmed = await AlertHelper.runApprovalModal( + title: String(localized: "Open Query from Link"), + message: String( + format: String(localized: "An external link wants to open a query on \"%@\":\n\n%@"), + connection.name, preview + ), + confirm: String(localized: "Open Query"), + cancel: String(localized: "Cancel") + ) + guard confirmed else { throw TabRouterError.userCancelled } + + try await runPreConnectScriptIfNeeded(connection) + try await DatabaseManager.shared.ensureConnected(connection) + + if focusExistingQueryTab(connectionId: connectionId, sql: sql) { + NSApp.activate(ignoringOtherApps: true) + closeWelcomeWindows() + return + } + + let payload = EditorTabPayload( + connectionId: connectionId, + tabType: .query, + initialQuery: sql + ) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + closeWelcomeWindows() + } + + private func focusExistingQueryTab(connectionId: UUID, sql: String) -> Bool { + for coordinator in MainContentCoordinator.allActiveCoordinators() + where coordinator.connectionId == connectionId { + let match = coordinator.tabManager.tabs.first { tab in + tab.tabType == .query && tab.content.query == sql + } + guard let match else { continue } + coordinator.tabManager.selectedTabId = match.id + if let windowId = coordinator.windowId, + let window = WindowLifecycleMonitor.shared.window(for: windowId) { + window.makeKeyAndOrderFront(nil) + } + return true + } + return false + } + + private func previewForSQL(_ sql: String) -> String { + let nsSQL = sql as NSString + guard nsSQL.length > 300 else { return sql } + let head = nsSQL.substring(to: 300) + let hidden = nsSQL.length - 300 + return head + String(format: String(localized: "\n\n… (%d more characters not shown)"), hidden) + } + + // MARK: - Database URL + + private func openDatabaseURL(_ url: URL) async throws { + guard case .success(let parsed) = ConnectionURLParser.parse(url.absoluteString) else { + throw TabRouterError.malformedDatabaseURL(url) + } + + let connections = ConnectionStorage.shared.loadConnections() + let matched = connections.first { conn in + conn.type == parsed.type + && conn.host == parsed.host + && (parsed.port == nil || conn.port == parsed.port) + && conn.database == parsed.database + && (parsed.username.isEmpty || conn.username == parsed.username) + } + + let connection: DatabaseConnection + let isTransient: Bool + if let matched { + connection = matched + isTransient = false + } else { + connection = TransientConnectionFactory.build(from: parsed) + isTransient = true + } + + if !parsed.password.isEmpty { + ConnectionStorage.shared.savePassword(parsed.password, for: connection.id) + } + if let sshPass = parsed.sshPassword, !sshPass.isEmpty { + ConnectionStorage.shared.saveSSHPassword(sshPass, for: connection.id) + } + + do { + if let table = parsed.tableName { + try await openTable( + connectionId: connection.id, + transientConnection: isTransient ? connection : nil, + database: parsed.database.isEmpty ? nil : parsed.database, + schema: parsed.schema, + table: table, + isView: parsed.isView + ) + if parsed.filterColumn != nil || parsed.filterCondition != nil { + try await applyFilterFromParsedURL(parsed: parsed, connectionId: connection.id) + } + return + } + + try await runPreConnectScriptIfNeeded(connection) + let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + try await DatabaseManager.shared.ensureConnected(connection) + closeWelcomeWindows() + + if let schema = parsed.schema { + await switchSchemaOrDatabase(connectionId: connection.id, target: schema) + } + } catch { + if isTransient { + ConnectionStorage.shared.deletePassword(for: connection.id) + ConnectionStorage.shared.deleteSSHPassword(for: connection.id) + } + throw error + } + } + + // MARK: - Database File + + private func openDatabaseFile(_ url: URL, type: DatabaseType) async throws { + let filePath = url.path(percentEncoded: false) + let connectionName = url.deletingPathExtension().lastPathComponent + + for (sessionId, session) in DatabaseManager.shared.activeSessions + where session.connection.type == type + && session.connection.database == filePath + && session.driver != nil { + bringConnectionWindowToFront(sessionId) + return + } + + let connection = DatabaseConnection( + name: connectionName, + host: "", + port: 0, + database: filePath, + username: "", + type: type + ) + + let payload = EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + try await DatabaseManager.shared.ensureConnected(connection) + closeWelcomeWindows() + } + + // MARK: - SQL File + + private func openSQLFile(_ url: URL) async throws { + if let existing = WindowLifecycleMonitor.shared.window(forSourceFile: url) { + existing.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + return + } + + if let session = DatabaseManager.shared.currentSession { + let content = await Task.detached(priority: .userInitiated) { () -> String? in + try? String(contentsOf: url, encoding: .utf8) + }.value + guard let content else { + Self.logger.error("Failed to read SQL file: \(url.lastPathComponent, privacy: .public)") + return + } + let payload = EditorTabPayload( + connectionId: session.connection.id, + tabType: .query, + initialQuery: content, + sourceFileURL: url + ) + WindowManager.shared.openTab(payload: payload) + NSApp.activate(ignoringOtherApps: true) + } else { + WelcomeRouter.shared.enqueueSQLFile(url) + } + } + + // MARK: - Helpers + + internal func bringConnectionWindowToFront(_ connectionId: UUID) { + let windows = WindowLifecycleMonitor.shared.windows(for: connectionId) + if let window = windows.first { + window.makeKeyAndOrderFront(nil) + } else { + NSApp.windows.first { AppLaunchCoordinator.isMainWindow($0) && $0.isVisible }?.makeKeyAndOrderFront(nil) + } + NSApp.activate(ignoringOtherApps: true) + } + + private func switchSchemaOrDatabase(connectionId: UUID, target: String) async { + guard let coordinator = MainContentCoordinator.allActiveCoordinators() + .first(where: { $0.connectionId == connectionId }) else { return } + if PluginManager.shared.supportsSchemaSwitching(for: coordinator.connection.type) { + await coordinator.switchSchema(to: target) + } else { + await coordinator.switchDatabase(to: target) + } + } + + private func runPreConnectScriptIfNeeded(_ connection: DatabaseConnection) async throws { + guard let script = connection.preConnectScript, + !script.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + let confirmed = await AlertHelper.confirmDestructive( + title: String(localized: "Pre-Connect Script"), + message: String( + format: String(localized: "Connection \"%@\" has a script that will run before connecting:\n\n%@"), + connection.name, script + ), + confirmButton: String(localized: "Run Script"), + cancelButton: String(localized: "Cancel"), + window: NSApp.keyWindow + ) + guard confirmed else { throw TabRouterError.userCancelled } + } + + private func applyFilterFromParsedURL(parsed: ParsedConnectionURL, connectionId: UUID) async throws { + let description: String + if let condition = parsed.filterCondition, !condition.isEmpty { + description = (condition as NSString).length > 300 + ? String(condition.prefix(300)) + "…" : condition + } else { + description = [parsed.filterColumn, parsed.filterOperation, parsed.filterValue] + .compactMap { $0 }.joined(separator: " ") + } + if !description.isEmpty { + let confirmed = await AlertHelper.confirmDestructive( + title: String(localized: "Apply Filter from Link"), + message: String( + format: String(localized: "An external link wants to apply a filter:\n\n%@"), + description + ), + confirmButton: String(localized: "Apply Filter"), + cancelButton: String(localized: "Cancel"), + window: NSApp.keyWindow + ) + guard confirmed else { throw TabRouterError.userCancelled } + } + + guard let coordinator = MainContentCoordinator.allActiveCoordinators() + .first(where: { $0.connectionId == connectionId }) else { return } + coordinator.applyURLFilter( + condition: parsed.filterCondition, + column: parsed.filterColumn, + operation: parsed.filterOperation, + value: parsed.filterValue + ) + } + + private func closeWelcomeWindows() { + for window in NSApp.windows where AppLaunchCoordinator.isWelcomeWindow(window) { + window.close() + } + } +} diff --git a/TablePro/Core/Services/Infrastructure/URLClassifier.swift b/TablePro/Core/Services/Infrastructure/URLClassifier.swift new file mode 100644 index 000000000..114cf13c8 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/URLClassifier.swift @@ -0,0 +1,48 @@ +// +// URLClassifier.swift +// TablePro +// + +import Foundation + +@MainActor +internal enum URLClassifier { + internal static func classify(_ url: URL) -> Result? { + if url.scheme == "tablepro" { + return DeeplinkParser.parse(url) + } + if url.isFileURL { + return classifyFile(url) + } + if isDatabaseURL(url) { + return .success(.openDatabaseURL(url)) + } + return nil + } + + private static func classifyFile(_ url: URL) -> Result? { + let ext = url.pathExtension.lowercased() + if ext == "tableplugin" { + return .success(.installPlugin(url)) + } + if ext == "tablepro" { + return .success(.openConnectionShare(url)) + } + if ext == "sql" { + return .success(.openSQLFile(url)) + } + if let dbType = PluginManager.shared.allRegisteredFileExtensions[ext] { + return .success(.openDatabaseFile(url, dbType)) + } + return nil + } + + private static func isDatabaseURL(_ url: URL) -> Bool { + guard let scheme = url.scheme?.lowercased() else { return false } + let base = scheme + .replacingOccurrences(of: "+ssh", with: "") + .replacingOccurrences(of: "+srv", with: "") + let registered = PluginManager.shared.allRegisteredURLSchemes + return registered.contains(base) || registered.contains(scheme) + } +} diff --git a/TablePro/Core/Services/Infrastructure/WelcomeRouter.swift b/TablePro/Core/Services/Infrastructure/WelcomeRouter.swift new file mode 100644 index 000000000..f0997e8c9 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/WelcomeRouter.swift @@ -0,0 +1,70 @@ +// +// WelcomeRouter.swift +// TablePro +// + +import AppKit +import Foundation +import Observation + +@MainActor +@Observable +internal final class WelcomeRouter { + internal static let shared = WelcomeRouter() + + private(set) var pendingImport: ExportableConnection? + private(set) var pendingConnectionShare: URL? + private(set) var pendingSQLFiles: [URL] = [] + + private init() { + NotificationCenter.default.addObserver( + forName: .databaseDidConnect, object: nil, queue: .main + ) { _ in + MainActor.assumeIsolated { + WelcomeRouter.shared.drainPendingSQLFiles() + } + } + } + + private func drainPendingSQLFiles() { + let urls = consumePendingSQLFiles() + guard !urls.isEmpty else { return } + NotificationCenter.default.post(name: .openSQLFiles, object: urls) + } + + internal func routeImport(_ exportable: ExportableConnection) { + pendingImport = exportable + showWelcomeWindow() + } + + internal func routeShare(_ url: URL) { + pendingConnectionShare = url + showWelcomeWindow() + } + + internal func enqueueSQLFile(_ url: URL) { + pendingSQLFiles.append(url) + } + + internal func consumePendingImport() -> ExportableConnection? { + let value = pendingImport + pendingImport = nil + return value + } + + internal func consumePendingShare() -> URL? { + let value = pendingConnectionShare + pendingConnectionShare = nil + return value + } + + internal func consumePendingSQLFiles() -> [URL] { + let value = pendingSQLFiles + pendingSQLFiles.removeAll() + return value + } + + private func showWelcomeWindow() { + WelcomeWindowFactory.openOrFront() + } +} diff --git a/TablePro/Core/Services/Infrastructure/WelcomeWindowFactory.swift b/TablePro/Core/Services/Infrastructure/WelcomeWindowFactory.swift new file mode 100644 index 000000000..e64d00315 --- /dev/null +++ b/TablePro/Core/Services/Infrastructure/WelcomeWindowFactory.swift @@ -0,0 +1,55 @@ +// +// WelcomeWindowFactory.swift +// TablePro +// + +import AppKit +import SwiftUI + +@MainActor +internal enum WelcomeWindowFactory { + private static let identifier = NSUserInterfaceItemIdentifier("welcome") + private static let contentSize = NSSize(width: 700, height: 450) + + internal static func openOrFront() { + if let existing = existingWindow() { + existing.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + return + } + let window = makeWindow() + window.makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + } + + internal static func close() { + existingWindow()?.close() + } + + internal static func orderOut() { + existingWindow()?.orderOut(nil) + } + + private static func existingWindow() -> NSWindow? { + NSApp.windows.first { AppLaunchCoordinator.isWelcomeWindow($0) } + } + + private static func makeWindow() -> NSWindow { + let hostingController = NSHostingController(rootView: WelcomeWindowView()) + let window = NSWindow(contentViewController: hostingController) + window.identifier = identifier + window.title = String(localized: "Welcome to TablePro") + window.styleMask = [.titled, .closable, .fullSizeContentView] + window.titleVisibility = .hidden + window.titlebarAppearsTransparent = true + window.isOpaque = false + window.backgroundColor = .clear + window.standardWindowButton(.miniaturizeButton)?.isHidden = true + window.standardWindowButton(.zoomButton)?.isHidden = true + window.collectionBehavior.insert(.fullScreenNone) + window.setContentSize(contentSize) + window.center() + window.isReleasedWhenClosed = false + return window + } +} diff --git a/TablePro/Core/Services/Infrastructure/WindowManager.swift b/TablePro/Core/Services/Infrastructure/WindowManager.swift index d4a18eedd..27af3c145 100644 --- a/TablePro/Core/Services/Infrastructure/WindowManager.swift +++ b/TablePro/Core/Services/Infrastructure/WindowManager.swift @@ -2,17 +2,6 @@ // WindowManager.swift // TablePro // -// Imperative AppKit window management for main editor tabs. -// Phase 1 scope: create TabWindowController, install into tab group with -// correct ordering (orderFront before addTabbedWindow — avoids the synchronous -// full-tree layout that slowed the earlier prototype 4–5×), retain strong -// reference, release on willClose. -// -// In later phases WindowManager will also absorb the lookup API currently -// on WindowLifecycleMonitor (windows(for:), previewWindow(for:), etc.). -// In Phase 1, WindowLifecycleMonitor keeps that responsibility — this -// manager only owns window creation + controller lifetime. -// import AppKit import os @@ -24,9 +13,6 @@ internal final class WindowManager { internal static let shared = WindowManager() - /// Strong refs keyed by NSWindow identity. Because - /// `NSWindow.isReleasedWhenClosed = false` on our windows, this is the - /// only owner — dropping the entry deallocates controller + window. private var controllers: [ObjectIdentifier: TabWindowController] = [:] private var closeObservers: [ObjectIdentifier: NSObjectProtocol] = [:] @@ -34,25 +20,12 @@ internal final class WindowManager { // MARK: - Open - /// Creates and shows a new main-editor window hosting ContentView(payload:). - /// If a sibling window with the same tabbingIdentifier is already visible, - /// the new window joins its tab group. internal func openTab(payload: EditorTabPayload) { let t0 = Date() Self.lifecycleLogger.info( "[open] WindowManager.openTab start payloadId=\(payload.id, privacy: .public) connId=\(payload.connectionId, privacy: .public) intent=\(String(describing: payload.intent), privacy: .public) skipAutoExecute=\(payload.skipAutoExecute)" ) - // Eagerly create SessionState (coordinator + tab manager + toolbar state) - // BEFORE constructing the controller. This lets `TabWindowController.init` - // install the NSToolbar synchronously — so the window's first paint - // already has it, eliminating the toolbar-flash that occurs when the - // toolbar is installed later via `configureWindow` (which runs only - // after the window is on-screen). - // - // The same SessionState is handed off to ContentView via - // `SessionStateFactory.consumePending` so only ONE coordinator exists - // per window — no duplicate tabs. let resolvedConnection = DatabaseManager.shared.activeSessions[payload.connectionId]?.connection let preCreatedSessionState: SessionStateFactory.SessionState? if let resolvedConnection { @@ -60,9 +33,6 @@ internal final class WindowManager { SessionStateFactory.registerPending(state, for: payload.id) preCreatedSessionState = state } else { - // Connection not ready yet (welcome → connect race). Fall back to - // lazy SessionState creation inside ContentView.init + lazy toolbar - // install via configureWindow. preCreatedSessionState = nil } @@ -71,31 +41,14 @@ internal final class WindowManager { Self.lifecycleLogger.error( "[open] WindowManager.openTab failed: controller has no window payloadId=\(payload.id, privacy: .public)" ) - // Clean up the pending state we registered above so it doesn't leak. SessionStateFactory.removePending(for: payload.id) return } retain(controller: controller, window: window) - // Pre-mark so AppDelegate.windowDidBecomeKey skips its tabbing-merge - // block (we do the merge here, at creation, with the correct ordering). - if let appDelegate = NSApp.delegate as? AppDelegate { - appDelegate.configuredWindows.insert(ObjectIdentifier(window)) - } - - // --- Tab-group merge, correctly ordered --- - // - // The earlier prototype called `addTabbedWindow(window, …)` before - // the window was visible. AppKit responded by synchronously flushing - // the NSHostingView's SwiftUI layout (NavigationSplitView + editor + - // TreeSitterClient warmup) on the main thread — observed cost - // 800–960 ms per open. - // - // Ordering `orderFront(nil)` first makes the window visible and lets - // SwiftUI render asynchronously via its normal display cycle. Then - // `addTabbedWindow` re-parents an already-visible window into the - // tab group, which is a cheap AppKit-level operation. + // orderFront before addTabbedWindow avoids a synchronous full-tree + // SwiftUI layout pass that adds 700-900ms per open. let tabbingId = window.tabbingIdentifier ?? "" let groupAll = AppSettingsManager.shared.tabs.groupAllConnectionTabs let sibling = findSibling( @@ -103,13 +56,7 @@ internal final class WindowManager { ) if let sibling { - // Tab-merge: `addTabbedWindow(_:ordered:)` both adds the window to - // the group AND orders it — calling orderFront separately beforehand - // triggers a redundant layout pass on NSHostingView (observed cost - // 700-900ms vs. 75ms standalone). Let addTabbedWindow do both at once. if groupAll { - // groupAll mode: retag every visible main window with the unified - // identifier so addTabbedWindow is willing to merge. let otherMains = NSApp.windows.filter { $0 !== window && Self.isMainWindow($0) && $0.isVisible } @@ -119,29 +66,19 @@ internal final class WindowManager { } let target = sibling.tabbedWindows?.last ?? sibling target.addTabbedWindow(window, ordered: .above) - // `addTabbedWindow(_:ordered:)` only inserts — it doesn't select - // the new tab in the group. `makeKeyAndOrderFront` brings this - // window to the front of the group AND makes it key, which is - // what the user expects on Cmd+T. window.makeKeyAndOrderFront(nil) Self.lifecycleLogger.info( "[open] WindowManager joined existing tab group payloadId=\(payload.id, privacy: .public) tabbingId=\(tabbingId, privacy: .public)" ) } else { - // Standalone case: center the frame BEFORE showing so the window - // doesn't flash at the default (0,0) position before jumping. - // `makeKeyAndOrderFront` is the standard AppKit idiom for this. window.center() window.makeKeyAndOrderFront(nil) - // Ensure the app is active when opening from a background context - // (e.g. Welcome window's Connect button races with welcome close). NSApp.activate(ignoringOtherApps: true) Self.lifecycleLogger.info( "[open] WindowManager standalone window payloadId=\(payload.id, privacy: .public) tabbingId=\(tabbingId, privacy: .public)" ) } - Self.lifecycleLogger.info( "[open] WindowManager.openTab done payloadId=\(payload.id, privacy: .public) elapsedMs=\(Int(Date().timeIntervalSince(t0) * 1_000))" ) @@ -177,10 +114,6 @@ internal final class WindowManager { return raw == "main" || raw.hasPrefix("main-") } - /// Tabbing identifier for a connection. Per-connection by default; - /// shared "com.TablePro.main" when the user enables Group All Connection - /// Tabs in Settings → Tabs. Used by `TabWindowController.init` and by - /// AppDelegate's pre-Phase-1 fallback in `windowDidBecomeKey`. internal static func tabbingIdentifier(for connectionId: UUID) -> String { if AppSettingsManager.shared.tabs.groupAllConnectionTabs { return "com.TablePro.main" diff --git a/TablePro/Core/Services/Infrastructure/WindowOpener.swift b/TablePro/Core/Services/Infrastructure/WindowOpener.swift deleted file mode 100644 index e8a746911..000000000 --- a/TablePro/Core/Services/Infrastructure/WindowOpener.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// WindowOpener.swift -// TablePro -// -// Bridges SwiftUI's `OpenWindowAction` to imperative call sites for the -// remaining SwiftUI scenes (Welcome, Connection Form, Settings). The main -// editor windows no longer use this — they go through `WindowManager.openTab` -// directly. -// - -import os -import SwiftUI - -@MainActor -internal final class WindowOpener { - private static let logger = Logger(subsystem: "com.TablePro", category: "WindowOpener") - - internal static let shared = WindowOpener() - - private var readyContinuations: [CheckedContinuation] = [] - - /// Set on appear by `OpenWindowHandler` (TableProApp). Used to open the - /// welcome window, connection form, and settings from imperative code. - /// Safe to store — `OpenWindowAction` is app-scoped, not view-scoped. - internal var openWindow: OpenWindowAction? { - didSet { - if openWindow != nil { - for continuation in readyContinuations { - continuation.resume() - } - readyContinuations.removeAll() - } - } - } - - /// Suspends until `openWindow` is set. Returns immediately if available. - /// Used by Dock-menu / URL-scheme cold-launch paths that fire before any - /// SwiftUI view has appeared. - internal func waitUntilReady() async { - if openWindow != nil { return } - await withCheckedContinuation { continuation in - if openWindow != nil { - continuation.resume() - } else { - readyContinuations.append(continuation) - } - } - } -} diff --git a/TablePro/Core/Services/Query/SchemaService.swift b/TablePro/Core/Services/Query/SchemaService.swift new file mode 100644 index 000000000..8df9bf0fc --- /dev/null +++ b/TablePro/Core/Services/Query/SchemaService.swift @@ -0,0 +1,87 @@ +// +// SchemaService.swift +// TablePro +// + +import Foundation +import os + +@MainActor +@Observable +final class SchemaService { + static let shared = SchemaService() + + private(set) var states: [UUID: SchemaState] = [:] + + @ObservationIgnored private var lastLoadDates: [UUID: Date] = [:] + @ObservationIgnored private let loadDedup = OnceTask() + @ObservationIgnored private static let logger = Logger(subsystem: "com.TablePro", category: "SchemaService") + + init() {} + + func state(for connectionId: UUID) -> SchemaState { + states[connectionId] ?? .idle + } + + func tables(for connectionId: UUID) -> [TableInfo] { + if case .loaded(let tables) = state(for: connectionId) { + return tables + } + return [] + } + + func load(connectionId: UUID, driver: DatabaseDriver, connection: DatabaseConnection) async { + switch state(for: connectionId) { + case .loaded: + return + case .idle, .loading, .failed: + await runLoad(connectionId: connectionId, driver: driver, connection: connection) + } + } + + func reload(connectionId: UUID, driver: DatabaseDriver, connection: DatabaseConnection) async { + await runLoad(connectionId: connectionId, driver: driver, connection: connection) + } + + func reloadIfStale( + connectionId: UUID, + driver: DatabaseDriver, + connection: DatabaseConnection, + staleness: TimeInterval + ) async { + guard let lastLoad = lastLoadDates[connectionId] else { + await reload(connectionId: connectionId, driver: driver, connection: connection) + return + } + guard Date().timeIntervalSince(lastLoad) > staleness else { return } + await reload(connectionId: connectionId, driver: driver, connection: connection) + } + + func invalidate(connectionId: UUID) async { + await loadDedup.cancel(key: connectionId) + states.removeValue(forKey: connectionId) + lastLoadDates.removeValue(forKey: connectionId) + } + + private func runLoad( + connectionId: UUID, + driver: DatabaseDriver, + connection: DatabaseConnection + ) async { + states[connectionId] = .loading + do { + let tables = try await loadDedup.execute(key: connectionId) { + try await driver.fetchTables() + } + states[connectionId] = .loaded(tables) + lastLoadDates[connectionId] = Date() + } catch is CancellationError { + return + } catch { + Self.logger.warning( + "[schema] load failed connId=\(connectionId, privacy: .public) error=\(error.localizedDescription, privacy: .public)" + ) + states[connectionId] = .failed(error.localizedDescription) + } + } +} diff --git a/TablePro/Core/Services/Query/SchemaState.swift b/TablePro/Core/Services/Query/SchemaState.swift new file mode 100644 index 000000000..c61cbe46d --- /dev/null +++ b/TablePro/Core/Services/Query/SchemaState.swift @@ -0,0 +1,13 @@ +// +// SchemaState.swift +// TablePro +// + +import Foundation + +enum SchemaState: Equatable, Sendable { + case idle + case loading + case loaded([TableInfo]) + case failed(String) +} diff --git a/TablePro/Core/Storage/TabDiskActor.swift b/TablePro/Core/Storage/TabDiskActor.swift index 8f3382948..25e81f7a1 100644 --- a/TablePro/Core/Storage/TabDiskActor.swift +++ b/TablePro/Core/Storage/TabDiskActor.swift @@ -10,16 +10,11 @@ import Foundation import os -/// Persisted tab state for a connection internal struct TabDiskState: Codable { let tabs: [PersistedTab] let selectedTabId: UUID? } -/// Actor that serializes all tab-state disk I/O. -/// -/// Data is stored as individual JSON files per connection in: -/// `~/Library/Application Support/TablePro/TabState/` internal actor TabDiskActor { internal static let shared = TabDiskActor() @@ -52,7 +47,6 @@ internal actor TabDiskActor { // MARK: - Public API - /// Save tab state for a connection. Throws on encoding or disk write failure. internal func save(connectionId: UUID, tabs: [PersistedTab], selectedTabId: UUID?) throws { let state = TabDiskState(tabs: tabs, selectedTabId: selectedTabId) let data = try encoder.encode(state) @@ -60,12 +54,6 @@ internal actor TabDiskActor { try data.write(to: fileURL, options: .atomic) } - /// Log a save error from callers that handle errors externally. - nonisolated static func logSaveError(connectionId: UUID, error: Error) { - logger.error("Failed to save tab state for \(connectionId): \(error.localizedDescription)") - } - - /// Load tab state for a connection. Returns nil if the file is missing or corrupt. internal func load(connectionId: UUID) -> TabDiskState? { let fileURL = tabStateFileURL(for: connectionId) @@ -82,7 +70,6 @@ internal actor TabDiskActor { } } - /// Delete the tab state file for a connection. internal func clear(connectionId: UUID) { let fileURL = tabStateFileURL(for: connectionId) @@ -95,7 +82,6 @@ internal actor TabDiskActor { } } - /// List all connection IDs that have saved tab state on disk. internal func connectionIdsWithSavedState() -> [UUID] { let fm = FileManager.default guard let files = try? fm.contentsOfDirectory( @@ -104,10 +90,18 @@ internal actor TabDiskActor { ) else { return [] } - return files.compactMap { url -> UUID? in - guard url.pathExtension == "json" else { return nil } - return UUID(uuidString: url.deletingPathExtension().lastPathComponent) + var validIds: [UUID] = [] + for url in files where url.pathExtension == "json" { + guard let id = UUID(uuidString: url.deletingPathExtension().lastPathComponent) else { continue } + if let data = try? Data(contentsOf: url), + let state = try? decoder.decode(TabDiskState.self, from: data), + !state.tabs.isEmpty { + validIds.append(id) + } else { + try? fm.removeItem(at: url) + } } + return validIds } // MARK: - Static Path Helpers @@ -127,9 +121,6 @@ internal actor TabDiskActor { // MARK: - Synchronous Save (quit-time only) - /// Synchronous file write for `applicationWillTerminate`, where no run loop - /// remains to execute an async Task. Safe because the process is single-threaded - /// at termination — no concurrent actor access is possible. nonisolated internal static func saveSync( connectionId: UUID, tabs: [PersistedTab], @@ -145,7 +136,17 @@ internal actor TabDiskActor { let fileURL = tabStateFileURL(for: connectionId) try data.write(to: fileURL, options: .atomic) } catch { - logger.error("saveSync failed for \(connectionId): \(error.localizedDescription)") + logger.fault("saveSync failed for \(connectionId): \(error.localizedDescription)") + } + } + + nonisolated internal static func clearSync(connectionId: UUID) { + let fileURL = tabStateFileURL(for: connectionId) + guard FileManager.default.fileExists(atPath: fileURL.path) else { return } + do { + try FileManager.default.removeItem(at: fileURL) + } catch { + logger.fault("clearSync failed for \(connectionId): \(error.localizedDescription)") } } @@ -157,9 +158,6 @@ internal actor TabDiskActor { // MARK: - Migration from UserDefaults - /// One-time migration: reads existing tab state from UserDefaults, - /// writes it to file storage, then clears the old UserDefaults keys. - /// This is a static method to avoid actor-isolation issues during init. private static func performMigrationIfNeeded(tabStateDirectory: URL) { let defaults = UserDefaults.standard diff --git a/TablePro/Core/Utilities/Connection/TransientConnectionFactory.swift b/TablePro/Core/Utilities/Connection/TransientConnectionFactory.swift new file mode 100644 index 000000000..ea2fa15a2 --- /dev/null +++ b/TablePro/Core/Utilities/Connection/TransientConnectionFactory.swift @@ -0,0 +1,71 @@ +// +// TransientConnectionFactory.swift +// TablePro +// + +import Foundation + +@MainActor +internal enum TransientConnectionFactory { + internal static func build(from parsed: ParsedConnectionURL) -> DatabaseConnection { + var sshConfig = SSHConfiguration() + if let sshHost = parsed.sshHost { + sshConfig.enabled = true + sshConfig.host = sshHost + sshConfig.port = parsed.sshPort ?? 22 + sshConfig.username = parsed.sshUsername ?? "" + if parsed.usePrivateKey == true { + sshConfig.authMethod = .privateKey + } + if parsed.useSSHAgent == true { + sshConfig.authMethod = .sshAgent + sshConfig.agentSocketPath = parsed.agentSocket ?? "" + } + } + + var sslConfig = SSLConfiguration() + if let sslMode = parsed.sslMode { + sslConfig.mode = sslMode + } + + var color: ConnectionColor = .none + if let hex = parsed.statusColor { + color = ConnectionURLParser.connectionColor(fromHex: hex) + } + + var tagId: UUID? + if let envName = parsed.envTag { + tagId = ConnectionURLParser.tagId(fromEnvName: envName) + } + + let resolvedSafeMode = parsed.safeModeLevel.flatMap(SafeModeLevel.from(urlInteger:)) ?? .silent + + var connection = DatabaseConnection( + name: parsed.connectionName ?? parsed.suggestedName, + host: parsed.host, + port: parsed.port ?? parsed.type.defaultPort, + database: parsed.database, + username: parsed.username, + type: parsed.type, + sshConfig: sshConfig, + sslConfig: sslConfig, + color: color, + tagId: tagId, + safeModeLevel: resolvedSafeMode, + mongoAuthSource: parsed.authSource, + mongoUseSrv: parsed.useSrv, + mongoAuthMechanism: parsed.mongoQueryParams["authMechanism"], + mongoReplicaSet: parsed.mongoQueryParams["replicaSet"], + redisDatabase: parsed.redisDatabase, + oracleServiceName: parsed.oracleServiceName + ) + + for (key, value) in parsed.mongoQueryParams where !value.isEmpty { + if key != "authMechanism" && key != "replicaSet" { + connection.additionalFields["mongoParam_\(key)"] = value + } + } + + return connection + } +} diff --git a/TablePro/Core/Utilities/UI/AlertHelper.swift b/TablePro/Core/Utilities/UI/AlertHelper.swift index 07341e5e8..c1a43c226 100644 --- a/TablePro/Core/Utilities/UI/AlertHelper.swift +++ b/TablePro/Core/Utilities/UI/AlertHelper.swift @@ -2,31 +2,18 @@ // AlertHelper.swift // TablePro // -// Created by TablePro on 1/19/26. -// import AppKit +import SwiftUI -/// Centralized helper for creating and displaying NSAlert dialogs -/// Provides consistent styling and behavior across the application @MainActor final class AlertHelper { - /// Tries multiple sources to find a presentable window, minimizing runModal() fallback usage. static func resolveWindow(_ window: NSWindow?) -> NSWindow? { window ?? NSApp.keyWindow ?? NSApp.mainWindow ?? NSApp.windows.first { $0.isVisible } } // MARK: - Destructive Confirmations - /// Shows a destructive confirmation dialog (warning style) - /// Uses async sheet presentation when window is available, falls back to modal - /// - Parameters: - /// - title: Alert title - /// - message: Detailed message - /// - confirmButton: Label for destructive action button (default: "OK") - /// - cancelButton: Label for cancel button (default: "Cancel") - /// - window: Parent window to attach sheet to (optional) - /// - Returns: true if user confirmed, false if cancelled static func confirmDestructive( title: String, message: String, @@ -41,32 +28,18 @@ final class AlertHelper { alert.addButton(withTitle: confirmButton) alert.addButton(withTitle: cancelButton) - // Use sheet presentation when window is available (non-blocking, Swift 6 friendly) if let window = resolveWindow(window) { return await withCheckedContinuation { continuation in alert.beginSheetModal(for: window) { response in continuation.resume(returning: response == .alertFirstButtonReturn) } } - } else { - // Fallback to modal when no window available - let response = alert.runModal() - return response == .alertFirstButtonReturn } + return alert.runModal() == .alertFirstButtonReturn } // MARK: - Critical Confirmations - /// Shows a critical confirmation dialog (critical style) - /// Uses async sheet presentation when window is available, falls back to modal - /// Used for dangerous operations like DROP, TRUNCATE, DELETE without WHERE - /// - Parameters: - /// - title: Alert title - /// - message: Detailed message - /// - confirmButton: Label for dangerous action button (default: "Execute") - /// - cancelButton: Label for cancel button (default: "Cancel") - /// - window: Parent window to attach sheet to (optional) - /// - Returns: true if user confirmed, false if cancelled static func confirmCritical( title: String, message: String, @@ -81,33 +54,79 @@ final class AlertHelper { alert.addButton(withTitle: confirmButton) alert.addButton(withTitle: cancelButton) - // Use sheet presentation when window is available (non-blocking, Swift 6 friendly) if let window = resolveWindow(window) { return await withCheckedContinuation { continuation in alert.beginSheetModal(for: window) { response in continuation.resume(returning: response == .alertFirstButtonReturn) } } - } else { - // Fallback to modal when no window available - let response = alert.runModal() - return response == .alertFirstButtonReturn + } + return alert.runModal() == .alertFirstButtonReturn + } + + // MARK: - Cross-Process Approval + + static func runApprovalModal( + title: String, + message: String, + confirm: String, + cancel: String + ) async -> Bool { + NSApp.activate(ignoringOtherApps: true) + let alert = NSAlert() + alert.messageText = title + alert.informativeText = message + alert.alertStyle = .warning + alert.addButton(withTitle: confirm) + alert.addButton(withTitle: cancel) + return alert.runModal() == .alertFirstButtonReturn + } + + static func runPairingApproval(request: PairingRequest) async throws -> PairingApproval { + try await withCheckedThrowingContinuation { continuation in + var deliver: ((Result) -> Void)? + let host = NSHostingController( + rootView: PairingApprovalSheet( + request: request, + onComplete: { result in deliver?(result) } + ) + ) + host.view.frame = NSRect(x: 0, y: 0, width: 520, height: 560) + + let parent = resolveWindow(nil) + let sheetWindow = NSWindow(contentViewController: host) + sheetWindow.styleMask = [.titled] + sheetWindow.title = String(localized: "Approve Integration") + sheetWindow.isReleasedWhenClosed = false + + var resolved = false + deliver = { result in + guard !resolved else { return } + resolved = true + if let parent { + parent.endSheet(sheetWindow) + } else { + sheetWindow.close() + } + continuation.resume(with: result) + } + + if let parent { + parent.beginSheet(sheetWindow, completionHandler: nil) + } else { + NSApp.activate(ignoringOtherApps: true) + sheetWindow.center() + sheetWindow.makeKeyAndOrderFront(nil) + } } } // MARK: - Save Changes Confirmation - /// Result of a standard macOS save-changes confirmation dialog enum SaveConfirmationResult { case save, dontSave, cancel } - /// Shows the standard macOS "save changes before closing?" dialog. - /// Button layout matches NSDocument convention: Save (default) | Cancel | Don't Save (Cmd+D). - /// - Parameters: - /// - message: Detailed message explaining what has unsaved changes - /// - window: Parent window to attach sheet to (optional) - /// - Returns: The user's choice static func confirmSaveChanges( message: String, window: NSWindow? = nil @@ -117,17 +136,15 @@ final class AlertHelper { alert.informativeText = message alert.alertStyle = .warning - // Button order follows macOS convention (rightmost → leftmost): - // [Don't Save] [Cancel] [Save] - alert.addButton(withTitle: String(localized: "Save")) // alertFirstButtonReturn (default) - alert.addButton(withTitle: String(localized: "Cancel")) // alertSecondButtonReturn - let dontSaveButton = alert.addButton(withTitle: String(localized: "Don't Save")) // alertThirdButtonReturn + // Button order follows NSDocument convention: Save | Cancel | Don't Save (Cmd+D) + alert.addButton(withTitle: String(localized: "Save")) + alert.addButton(withTitle: String(localized: "Cancel")) + let dontSaveButton = alert.addButton(withTitle: String(localized: "Don't Save")) dontSaveButton.hasDestructiveAction = true dontSaveButton.keyEquivalent = "d" dontSaveButton.keyEquivalentModifierMask = .command let response: NSApplication.ModalResponse - if let window = resolveWindow(window) { response = await withCheckedContinuation { continuation in alert.beginSheetModal(for: window) { resp in @@ -139,27 +156,14 @@ final class AlertHelper { } switch response { - case .alertFirstButtonReturn: - return .save - case .alertThirdButtonReturn: - return .dontSave - default: - return .cancel + case .alertFirstButtonReturn: return .save + case .alertThirdButtonReturn: return .dontSave + default: return .cancel } } // MARK: - Three-Way Confirmations - /// Shows a three-option confirmation dialog - /// Uses async sheet presentation when window is available, falls back to modal - /// - Parameters: - /// - title: Alert title - /// - message: Detailed message - /// - first: Label for first button - /// - second: Label for second button - /// - third: Label for third button - /// - window: Parent window to attach sheet to (optional) - /// - Returns: 0 for first button, 1 for second, 2 for third static func confirmThreeWay( title: String, message: String, @@ -177,8 +181,6 @@ final class AlertHelper { alert.addButton(withTitle: third) let response: NSApplication.ModalResponse - - // Use sheet presentation when window is available (non-blocking, Swift 6 friendly) if let window = resolveWindow(window) { response = await withCheckedContinuation { continuation in alert.beginSheetModal(for: window) { resp in @@ -186,29 +188,19 @@ final class AlertHelper { } } } else { - // Fallback to modal when no window available response = alert.runModal() } switch response { - case .alertFirstButtonReturn: - return 0 - case .alertSecondButtonReturn: - return 1 - case .alertThirdButtonReturn: - return 2 - default: - return 2 // Default to third option (usually cancel) + case .alertFirstButtonReturn: return 0 + case .alertSecondButtonReturn: return 1 + case .alertThirdButtonReturn: return 2 + default: return 2 } } - // MARK: - Error Sheets + // MARK: - Error / Info Sheets - /// Shows an error message as a non-blocking sheet - /// - Parameters: - /// - title: Error title - /// - message: Error details - /// - window: Parent window to attach sheet to (optional, falls back to modal) static func showErrorSheet( title: String, message: String, @@ -221,22 +213,12 @@ final class AlertHelper { alert.addButton(withTitle: String(localized: "OK")) if let window = resolveWindow(window) { - alert.beginSheetModal(for: window) { _ in - // Sheet dismissed, no action needed - } + alert.beginSheetModal(for: window) { _ in } } else { - // Fallback to modal if no window available alert.runModal() } } - // MARK: - Info Sheets - - /// Shows an informational message as a non-blocking sheet - /// - Parameters: - /// - title: Info title - /// - message: Info details - /// - window: Parent window to attach sheet to (optional, falls back to modal) static func showInfoSheet( title: String, message: String, @@ -249,23 +231,14 @@ final class AlertHelper { alert.addButton(withTitle: String(localized: "OK")) if let window = resolveWindow(window) { - alert.beginSheetModal(for: window) { _ in - // Sheet dismissed, no action needed - } + alert.beginSheetModal(for: window) { _ in } } else { - // Fallback to modal if no window available alert.runModal() } } // MARK: - Query Error with AI Option - /// Shows a query error dialog with an option to ask AI to fix it - /// - Parameters: - /// - title: Error title - /// - message: Error details - /// - window: Parent window to attach sheet to (optional) - /// - Returns: true if "Ask AI to Fix" was clicked static func showQueryErrorWithAIOption( title: String, message: String, @@ -284,9 +257,7 @@ final class AlertHelper { continuation.resume(returning: response == .alertSecondButtonReturn) } } - } else { - let response = alert.runModal() - return response == .alertSecondButtonReturn } + return alert.runModal() == .alertSecondButtonReturn } } diff --git a/TablePro/Extensions/URL+SanitizedLogging.swift b/TablePro/Extensions/URL+SanitizedLogging.swift new file mode 100644 index 000000000..18f1fc93c --- /dev/null +++ b/TablePro/Extensions/URL+SanitizedLogging.swift @@ -0,0 +1,17 @@ +// +// URL+SanitizedLogging.swift +// TablePro +// + +import Foundation + +internal extension URL { + var sanitizedForLogging: String { + guard var components = URLComponents(url: self, resolvingAgainstBaseURL: false), + components.password != nil else { + return absoluteString + } + components.password = "***" + return components.string ?? absoluteString + } +} diff --git a/TablePro/Models/Connection/ConnectionSession.swift b/TablePro/Models/Connection/ConnectionSession.swift index 806907039..734b2bc95 100644 --- a/TablePro/Models/Connection/ConnectionSession.swift +++ b/TablePro/Models/Connection/ConnectionSession.swift @@ -18,7 +18,6 @@ struct ConnectionSession: Identifiable { var lastError: String? // Per-connection state - var tables: [TableInfo] = [] var selectedTables: Set = [] var pendingTruncates: Set = [] var pendingDeletes: Set = [] @@ -26,6 +25,11 @@ struct ConnectionSession: Identifiable { var currentSchema: String? var currentDatabase: String? + @MainActor + var tables: [TableInfo] { + SchemaService.shared.tables(for: id) + } + /// In-memory password for prompt-for-password connections. Never persisted to disk. var cachedPassword: String? @@ -63,7 +67,6 @@ struct ConnectionSession: Identifiable { /// to release memory held by stale table metadata. /// Note: `cachedPassword` is intentionally NOT cleared — auto-reconnect needs it after disconnect. mutating func clearCachedData() { - tables = [] selectedTables = [] pendingTruncates = [] pendingDeletes = [] @@ -80,12 +83,12 @@ struct ConnectionSession: Identifiable { /// Compares fields used by ContentView's body to avoid unnecessary SwiftUI re-renders. /// Excludes: driver (protocol, non-comparable), - /// lastActiveAt (volatile), lastError, effectiveConnection. + /// lastActiveAt (volatile), lastError, effectiveConnection, + /// tables (owned by SchemaService and observed independently). func isContentViewEquivalent(to other: ConnectionSession) -> Bool { id == other.id && status == other.status && connection == other.connection - && tables == other.tables && pendingTruncates == other.pendingTruncates && pendingDeletes == other.pendingDeletes && tableOperationOptions == other.tableOperationOptions diff --git a/TablePro/Models/Connection/ConnectionToolbarState.swift b/TablePro/Models/Connection/ConnectionToolbarState.swift index 9faaf3b75..484b38b82 100644 --- a/TablePro/Models/Connection/ConnectionToolbarState.swift +++ b/TablePro/Models/Connection/ConnectionToolbarState.swift @@ -195,6 +195,9 @@ final class ConnectionToolbarState { /// Whether the SQL review popover is showing var showSQLReviewPopover: Bool = false + /// Whether the connection switcher popover is showing + var showConnectionSwitcher: Bool = false + /// SQL statements to display in the review popover var previewStatements: [String] = [] diff --git a/TablePro/Models/Query/QueryResult.swift b/TablePro/Models/Query/QueryResult.swift index e7fa54063..92434a0fc 100644 --- a/TablePro/Models/Query/QueryResult.swift +++ b/TablePro/Models/Query/QueryResult.swift @@ -72,7 +72,7 @@ enum DatabaseError: Error, LocalizedError { } /// Information about a database table -struct TableInfo: Identifiable, Hashable { +struct TableInfo: Identifiable, Hashable, Sendable { var id: String { "\(name)_\(type.rawValue)" } let name: String let type: TableType diff --git a/TablePro/Models/Query/QueryTabManager.swift b/TablePro/Models/Query/QueryTabManager.swift index 98c1be0f2..0f6d387c5 100644 --- a/TablePro/Models/Query/QueryTabManager.swift +++ b/TablePro/Models/Query/QueryTabManager.swift @@ -26,6 +26,12 @@ final class QueryTabManager { @ObservationIgnored private var _tabIndexMap: [UUID: Int] = [:] @ObservationIgnored private var _tabIndexMapDirty = true + @ObservationIgnored private let globalTabsProvider: () -> [QueryTab] + + init(globalTabsProvider: @escaping () -> [QueryTab] = { [] }) { + self.globalTabsProvider = globalTabsProvider + } + private func rebuildTabIndexMapIfNeeded() { guard _tabIndexMapDirty else { return } _tabIndexMap = Dictionary(uniqueKeysWithValues: tabs.enumerated().map { ($1.id, $0) }) @@ -50,11 +56,6 @@ final class QueryTabManager { return (tabs[index], index) } - init() { - tabs = [] - selectedTabId = nil - } - // MARK: - Tab Naming /// Next "Query N" title based on existing tabs across all windows. @@ -69,6 +70,10 @@ final class QueryTabManager { return "Query \(maxNumber + 1)" } + private func nextTitle() -> String { + Self.nextQueryTitle(existingTabs: globalTabsProvider() + tabs) + } + // MARK: - Tab Management func addTab(initialQuery: String? = nil, title: String? = nil, databaseName: String = "", sourceFileURL: URL? = nil) { @@ -81,7 +86,7 @@ final class QueryTabManager { return } - let tabTitle = title ?? Self.nextQueryTitle(existingTabs: tabs) + let tabTitle = title ?? nextTitle() var newTab = QueryTab(title: tabTitle, tabType: .query) if let query = initialQuery { @@ -181,6 +186,13 @@ final class QueryTabManager { databaseName: String = "", quoteIdentifier: ((String) -> String)? = nil ) throws { + if let existing = tabs.first(where: { + $0.tabType == .table && $0.tableContext.tableName == tableName && $0.tableContext.databaseName == databaseName + }) { + selectedTabId = existing.id + return + } + let pageSize = AppSettingsManager.shared.dataGrid.defaultPageSize let query = try QueryTab.buildBaseTableQuery( tableName: tableName, databaseType: databaseType, quoteIdentifier: quoteIdentifier diff --git a/TablePro/Resources/Localizable.xcstrings b/TablePro/Resources/Localizable.xcstrings index 1dfd89061..bdb760dc2 100644 --- a/TablePro/Resources/Localizable.xcstrings +++ b/TablePro/Resources/Localizable.xcstrings @@ -2668,6 +2668,9 @@ } } } + }, + "1 day" : { + }, "1 of %lld conflicts" : { "localizations" : { @@ -3456,6 +3459,9 @@ } } } + }, + "Access Level" : { + }, "Account" : { "localizations" : { @@ -3801,6 +3807,9 @@ } } } + }, + "Activity Log" : { + }, "Actual" : { "localizations" : { @@ -4301,6 +4310,9 @@ } } } + }, + "Administration" : { + }, "Advanced" : { @@ -4681,6 +4693,9 @@ } } } + }, + "All categories" : { + }, "All columns" : { "localizations" : { @@ -4841,6 +4856,9 @@ } } } + }, + "All time" : { + }, "All Time" : { "localizations" : { @@ -4863,6 +4881,9 @@ } } } + }, + "All tokens" : { + }, "Allow" : { "localizations" : { @@ -4885,6 +4906,9 @@ } } } + }, + "Allow %@ to access TablePro?" : { + }, "Allow AI Access" : { "localizations" : { @@ -4910,6 +4934,9 @@ }, "Allow remote connections" : { + }, + "Allowed Connections" : { + }, "Also handles" : { "localizations" : { @@ -5050,6 +5077,9 @@ }, "Always Show" : { + }, + "An external app is asking for an API token. Review the permissions before approving." : { + }, "An external link wants to add a database connection:\n\nName: %@\n%@" : { "extractionState" : "stale", @@ -5102,7 +5132,18 @@ } } }, + "An external link wants to open a query on \"%@\":\n\n%@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "An external link wants to open a query on \"%1$@\":\n\n%2$@" + } + } + } + }, "An external link wants to open a query on connection \"%@\":\n\n%@" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -5630,6 +5671,12 @@ } } } + }, + "Approve" : { + + }, + "Approve Integration" : { + }, "Are you sure you want to cancel the running query for this session?" : { "localizations" : { @@ -6676,6 +6723,9 @@ } } } + }, + "Blocked" : { + }, "Blue" : { "localizations" : { @@ -7190,6 +7240,9 @@ } } } + }, + "Cancelled by user." : { + }, "Cannot connect to Ollama at %@. Is Ollama running?" : { "localizations" : { @@ -9675,6 +9728,9 @@ } } } + }, + "Connection is read-only for external clients" : { + }, "Connection lost" : { "localizations" : { @@ -9719,8 +9775,12 @@ } } } + }, + "Connection not found" : { + }, "Connection Not Found" : { + "extractionState" : "stale", "localizations" : { "tr" : { "stringUnit" : { @@ -9922,6 +9982,9 @@ } } } + }, + "Connection: %@" : { + }, "Connections" : { "localizations" : { @@ -10077,6 +10140,9 @@ } } } + }, + "Controls how external clients (Raycast, Cursor, Claude Desktop) access this connection. Tokens cannot exceed this level even with full-access scope." : { + }, "Conversation History" : { "extractionState" : "stale", @@ -10836,6 +10902,12 @@ }, "Could not generate SQL for changes." : { + }, + "Could Not Open File" : { + + }, + "Could not parse database URL: %@" : { + }, "Could not reach the license server. Check your internet connection and try again." : { "localizations" : { @@ -13512,6 +13584,9 @@ } } } + }, + "Denied" : { + }, "Deny" : { "localizations" : { @@ -17213,6 +17288,12 @@ } } } + }, + "External Access" : { + + }, + "External access is disabled for this connection" : { + }, "Extra Large" : { "extractionState" : "stale", @@ -19409,6 +19490,9 @@ }, "Full Access" : { + }, + "Full access including destructive DDL after explicit confirmation." : { + }, "Function" : { "localizations" : { @@ -21825,6 +21909,9 @@ } } } + }, + "Integrations" : { + }, "Interactive Data Grid" : { "localizations" : { @@ -22162,6 +22249,9 @@ } } } + }, + "Invalid UUID: %@" : { + }, "Invisibles" : { "localizations" : { @@ -22847,6 +22937,15 @@ } } } + }, + "Last 7 days" : { + + }, + "Last 24 hours" : { + + }, + "Last 30 days" : { + }, "Last query execution summary" : { "localizations" : { @@ -24080,6 +24179,9 @@ } } } + }, + "Malformed deep link path: %@" : { + }, "Manage Connections" : { "localizations" : { @@ -24481,9 +24583,6 @@ } } } - }, - "MCP" : { - }, "MCP Access Request" : { "localizations" : { @@ -24860,6 +24959,9 @@ } } } + }, + "Missing required parameter: %@" : { + }, "Missing value for parameter: %@" : { @@ -26114,6 +26216,9 @@ } } } + }, + "No activity yet" : { + }, "No AI provider configured. Go to Settings > AI to add one." : { "localizations" : { @@ -26494,6 +26599,16 @@ } } }, + "No free port in range %d-%d" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No free port in range %1$d-%2$d" + } + } + } + }, "No iCloud" : { "localizations" : { "tr" : { @@ -27119,6 +27234,7 @@ } }, "No saved connection named \"%@\"." : { + "extractionState" : "stale", "localizations" : { "tr" : { "stringUnit" : { @@ -27139,6 +27255,9 @@ } } } + }, + "No saved connection with ID \"%@\"." : { + }, "No saved connections" : { @@ -29209,6 +29328,9 @@ } } } + }, + "Pairing Failed" : { + }, "Panel State" : { "localizations" : { @@ -32119,6 +32241,12 @@ } } } + }, + "Range" : { + + }, + "Rate limited" : { + }, "Rate limited. Please try again later." : { "localizations" : { @@ -32280,6 +32408,12 @@ } } } + }, + "Read schema and run any non-destructive query, including INSERT, UPDATE, and DELETE." : { + + }, + "Read schema and run SELECT queries." : { + }, "Read-only" : { "extractionState" : "stale", @@ -32370,6 +32504,9 @@ } } } + }, + "Read-Write" : { + }, "Reading connections..." : { "localizations" : { @@ -33674,6 +33811,9 @@ } } } + }, + "Resource" : { + }, "Restart TablePro for the language change to take full effect." : { "localizations" : { @@ -37710,6 +37850,9 @@ } } } + }, + "SQL dialect for %@ is not available. The plugin may not be installed or loaded." : { + }, "SQL Editor" : { "localizations" : { @@ -37799,6 +37942,16 @@ } } }, + "SQL is too long: %d characters (limit %d)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "SQL is too long: %1$d characters (limit %2$d)" + } + } + } + }, "SQL Preview" : { "localizations" : { "tr" : { @@ -42195,12 +42348,28 @@ }, "Token" : { + }, + "Token '%@' with permission '%@' cannot access '%@'" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Token '%1$@' with permission '%2$@' cannot access '%3$@'" + } + } + } + }, + "Token does not have access to this connection" : { + }, "Token Name" : { }, "Too many submissions. Please try again later." : { + }, + "Tool" : { + }, "Toolbar" : { "localizations" : { @@ -43066,6 +43235,9 @@ } } } + }, + "Unknown deep link host: %@" : { + }, "Unknown error" : { "localizations" : { @@ -43110,6 +43282,9 @@ } } } + }, + "Unknown URL scheme: %@" : { + }, "Unlicensed" : { "localizations" : { @@ -43243,6 +43418,9 @@ } } } + }, + "Unsupported database type: %@" : { + }, "Unsupported encryption version %d" : { "localizations" : { @@ -43310,6 +43488,9 @@ } } } + }, + "Unsupported intent: %@" : { + }, "Unsupported MongoDB method: %@" : { "extractionState" : "stale", diff --git a/TablePro/TableProApp.swift b/TablePro/TableProApp.swift index b5d18fdf0..753d4d0d8 100644 --- a/TablePro/TableProApp.swift +++ b/TablePro/TableProApp.swift @@ -196,7 +196,7 @@ struct AppMenuCommands: Commands { // File menu CommandGroup(replacing: .newItem) { Button("Manage Connections") { - NotificationCenter.default.post(name: .newConnection, object: nil) + WelcomeWindowFactory.openOrFront() } .optionalKeyboardShortcut(shortcut(for: .manageConnections)) } @@ -384,7 +384,7 @@ struct AppMenuCommands: Commands { .disabled(!(actions?.isConnected ?? false)) Button("Switch Connection...") { - NotificationCenter.default.post(name: .openConnectionSwitcher, object: nil) + actions?.openConnectionSwitcher() } .optionalKeyboardShortcut(shortcut(for: .switchConnection)) .disabled(!(actions?.isConnected ?? false)) @@ -626,33 +626,15 @@ struct TableProApp: App { } var body: some Scene { - // Welcome Window - opens on launch (must be first Window scene so SwiftUI - // restores it by default when clicking the dock icon) - Window("Welcome to TablePro", id: "welcome") { - WelcomeWindowView() - .background(OpenWindowHandler()) // Handle window notifications from startup - } - .windowStyle(.hiddenTitleBar) - .windowResizability(.contentSize) - .defaultSize(width: 700, height: 450) - - // Connection Form Window - opens when creating/editing a connection - WindowGroup(id: "connection-form", for: UUID?.self) { $connectionId in - ConnectionFormView(connectionId: connectionId ?? nil) - } - .windowResizability(.contentSize) - - // NOTE (prototype): main windows are now created imperatively via - // MainWindowFactory → NSWindow + NSHostingController. The retired - // `WindowGroup(id:"main", for: EditorTabPayload.self)` caused SwiftUI to - // re-instantiate ContentView for every historical payload on every scene - // phase diff (5-7 phantom inits per open). AppKit-native windows avoid - // that and eliminate the 68-437ms openWindow() latency. - - // Settings Window - opens with Cmd+, + // All app windows are created imperatively via NSWindow + NSHostingController + // factories (MainWindow via WindowManager, Welcome via WelcomeWindowFactory, + // ConnectionForm via ConnectionFormWindowFactory). Declaring them as SwiftUI + // Scenes auto-opens the first Scene on launch and races with cold-launch + // intent routing. Settings { SettingsView() .environment(updaterBridge) + .background(SettingsNotificationBridge()) } .commands { @@ -668,9 +650,6 @@ struct TableProApp: App { // MARK: - Notification Names extension Notification.Name { - // Connection lifecycle - static let newConnection = Notification.Name("newConnection") - static let openConnectionSwitcher = Notification.Name("openConnectionSwitcher") // Multi-listener broadcasts (Sidebar + Coordinator + StructureView) static let refreshData = Notification.Name("refreshData") @@ -687,12 +666,6 @@ extension Notification.Name { // Window lifecycle notifications static let mainWindowWillClose = Notification.Name("mainWindowWillClose") - static let openMainWindow = Notification.Name("openMainWindow") - static let openWelcomeWindow = Notification.Name("openWelcomeWindow") - - // Database URL handling notifications - static let switchSchemaFromURL = Notification.Name("switchSchemaFromURL") - static let applyURLFilter = Notification.Name("applyURLFilter") } // MARK: - Check for Updates @@ -738,32 +711,18 @@ private struct MCPServerMenuItem: View { } } -// MARK: - Open Window Handler +// MARK: - Settings Notification Bridge -/// Helper view that listens for window open notifications -private struct OpenWindowHandler: View { - @Environment(\.openWindow) - private var openWindow +/// Forwards `.openSettingsWindow` notifications to SwiftUI's `openSettings` +/// action. Lives inside the Settings scene because `\.openSettings` is only +/// available there. +private struct SettingsNotificationBridge: View { @Environment(\.openSettings) private var openSettings var body: some View { Color.clear .frame(width: 0, height: 0) - .onAppear { - // Store openWindow action for imperative access (e.g., from MainContentCommandActions) - WindowOpener.shared.openWindow = openWindow - } - .onReceive(NotificationCenter.default.publisher(for: .openWelcomeWindow)) { _ in - openWindow(id: "welcome") - } - .onReceive(NotificationCenter.default.publisher(for: .openMainWindow)) { notification in - if let payload = notification.object as? EditorTabPayload { - WindowManager.shared.openTab(payload: payload) - } else if let connectionId = notification.object as? UUID { - WindowManager.shared.openTab(payload: EditorTabPayload(connectionId: connectionId)) - } - } .onReceive(NotificationCenter.default.publisher(for: .openSettingsWindow)) { _ in openSettings() } diff --git a/TablePro/ViewModels/SidebarViewModel.swift b/TablePro/ViewModels/SidebarViewModel.swift index 4d3e1aee8..268c57d78 100644 --- a/TablePro/ViewModels/SidebarViewModel.swift +++ b/TablePro/ViewModels/SidebarViewModel.swift @@ -41,7 +41,6 @@ final class SidebarViewModel { // MARK: - Binding Storage - private var tablesBinding: Binding<[TableInfo]> private var selectedTablesBinding: Binding> private var pendingTruncatesBinding: Binding> private var pendingDeletesBinding: Binding> @@ -54,11 +53,6 @@ final class SidebarViewModel { // MARK: - Convenience Accessors - var tables: [TableInfo] { - get { tablesBinding.wrappedValue } - set { tablesBinding.wrappedValue = newValue } - } - var selectedTables: Set { get { selectedTablesBinding.wrappedValue } set { selectedTablesBinding.wrappedValue = newValue } @@ -82,7 +76,6 @@ final class SidebarViewModel { // MARK: - Initialization init( - tables: Binding<[TableInfo]>, selectedTables: Binding>, pendingTruncates: Binding>, pendingDeletes: Binding>, @@ -90,7 +83,6 @@ final class SidebarViewModel { databaseType: DatabaseType, connectionId: UUID ) { - self.tablesBinding = tables self.selectedTablesBinding = selectedTables self.pendingTruncatesBinding = pendingTruncates self.pendingDeletesBinding = pendingDeletes diff --git a/TablePro/ViewModels/WelcomeViewModel.swift b/TablePro/ViewModels/WelcomeViewModel.swift index 01d391815..91a25c345 100644 --- a/TablePro/ViewModels/WelcomeViewModel.swift +++ b/TablePro/ViewModels/WelcomeViewModel.swift @@ -33,7 +33,6 @@ final class WelcomeViewModel { private let storage = ConnectionStorage.shared private let groupStorage = GroupStorage.shared - private let dbManager = DatabaseManager.shared // MARK: - State @@ -78,14 +77,12 @@ final class WelcomeViewModel { // MARK: - Notification Observers - @ObservationIgnored private var openWindow: OpenWindowAction? @ObservationIgnored private var connectionUpdatedObserver: NSObjectProtocol? - @ObservationIgnored private var shareFileObserver: NSObjectProtocol? @ObservationIgnored private var exportObserver: NSObjectProtocol? @ObservationIgnored private var importObserver: NSObjectProtocol? @ObservationIgnored private var linkedFoldersObserver: NSObjectProtocol? @ObservationIgnored private var importFromAppObserver: NSObjectProtocol? - @ObservationIgnored private var deeplinkImportObserver: NSObjectProtocol? + @ObservationIgnored private var welcomeRouterTask: Task? // MARK: - Computed Properties @@ -146,8 +143,7 @@ final class WelcomeViewModel { // MARK: - Setup & Teardown - func setUp(openWindow: OpenWindowAction) { - self.openWindow = openWindow + func setUp() { guard connectionUpdatedObserver == nil else { return } if expandedGroupIds.isEmpty { @@ -168,16 +164,6 @@ final class WelcomeViewModel { } } - shareFileObserver = NotificationCenter.default.addObserver( - forName: .connectionShareFileOpened, object: nil, queue: .main - ) { [weak self] notification in - Task { @MainActor [weak self] in - guard let url = notification.object as? URL else { return } - _ = PendingActionStore.shared.consumeConnectionShareURL() - self?.activeSheet = .importFile(url) - } - } - exportObserver = NotificationCenter.default.addObserver( forName: .exportConnections, object: nil, queue: .main ) { [weak self] _ in @@ -211,35 +197,74 @@ final class WelcomeViewModel { } } - deeplinkImportObserver = NotificationCenter.default.addObserver( - forName: .deeplinkImportRequested, object: nil, queue: .main - ) { [weak self] notification in - Task { @MainActor [weak self] in - guard let self else { return } - let exportable = (notification.object as? ExportableConnection) - ?? PendingActionStore.shared.consumeDeeplinkImport() - guard let exportable else { return } - PendingActionStore.shared.deeplinkImport = nil - self.activeSheet = .deeplinkImport(exportable) - } - } - loadConnections() linkedConnections = LinkedFolderWatcher.shared.linkedConnections - if let pendingURL = PendingActionStore.shared.consumeConnectionShareURL() { + consumePendingRouterActions() + startWelcomeRouterObservation() + } + + private func consumePendingRouterActions() { + if let pendingURL = WelcomeRouter.shared.consumePendingShare() { activeSheet = .importFile(pendingURL) + return } - - if let pendingImport = PendingActionStore.shared.consumeDeeplinkImport() { + if let pendingImport = WelcomeRouter.shared.consumePendingImport() { activeSheet = .deeplinkImport(pendingImport) } } + private func startWelcomeRouterObservation() { + welcomeRouterTask?.cancel() + welcomeRouterTask = Task { @MainActor [weak self] in + while !Task.isCancelled { + let didChange = await Self.awaitWelcomeRouterChange() + guard didChange else { return } + self?.consumePendingRouterActions() + } + } + } + + private static func awaitWelcomeRouterChange() async -> Bool { + let box = ContinuationBox() + return await withTaskCancellationHandler { + await withCheckedContinuation { continuation in + box.set(continuation) + withObservationTracking({ + _ = WelcomeRouter.shared.pendingImport + _ = WelcomeRouter.shared.pendingConnectionShare + }, onChange: { + box.resume(with: true) + }) + } + } onCancel: { + box.resume(with: false) + } + } + + private final class ContinuationBox: @unchecked Sendable { + private var continuation: CheckedContinuation? + private let lock = NSLock() + + func set(_ continuation: CheckedContinuation) { + lock.lock() + defer { lock.unlock() } + self.continuation = continuation + } + + func resume(with value: Bool) { + lock.lock() + let pending = continuation + continuation = nil + lock.unlock() + pending?.resume(returning: value) + } + } + deinit { - [connectionUpdatedObserver, shareFileObserver, exportObserver, - importObserver, importFromAppObserver, linkedFoldersObserver, - deeplinkImportObserver].forEach { + welcomeRouterTask?.cancel() + [connectionUpdatedObserver, exportObserver, importObserver, + importFromAppObserver, linkedFoldersObserver].forEach { if let observer = $0 { NotificationCenter.default.removeObserver(observer) } @@ -261,26 +286,13 @@ final class WelcomeViewModel { // MARK: - Connection Actions func connectToDatabase(_ connection: DatabaseConnection) { - guard let openWindow else { return } - if WindowOpener.shared.openWindow == nil { - WindowOpener.shared.openWindow = openWindow - } - // Close welcome BEFORE opening the new editor window. Otherwise the - // welcome window (still key + visible) reasserts itself during the - // new window's `makeKeyAndOrderFront` — the new window briefly - // becomes key, immediately resigns, welcome retakes key, and the - // app is left with no key window after welcome closes → menu - // @FocusedValue nil → Cmd+T/1...9 disabled. - NSApplication.shared.closeWindows(withId: "welcome") - WindowManager.shared.openTab(payload: EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault)) - + WelcomeWindowFactory.close() Task { do { - try await dbManager.connectToSession(connection) + try await TabRouter.shared.route(.openConnection(connection.id)) } catch is CancellationError { - // User cancelled password prompt — return to welcome closeConnectionWindows(for: connection.id) - self.openWindow?(id: "welcome") + WelcomeWindowFactory.openOrFront() } catch { if case PluginError.pluginNotInstalled = error { Self.logger.info("Plugin not installed for \(connection.type.rawValue), prompting install") @@ -295,21 +307,13 @@ final class WelcomeViewModel { } func connectAfterInstall(_ connection: DatabaseConnection) { - guard let openWindow else { return } - if WindowOpener.shared.openWindow == nil { - WindowOpener.shared.openWindow = openWindow - } - // Close welcome before opening editor — see connectToDatabase above - // for the welcome-reasserts-key race that disabled menu shortcuts. - NSApplication.shared.closeWindows(withId: "welcome") - WindowManager.shared.openTab(payload: EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault)) - + WelcomeWindowFactory.close() Task { do { - try await dbManager.connectToSession(connection) + try await TabRouter.shared.route(.openConnection(connection.id)) } catch is CancellationError { closeConnectionWindows(for: connection.id) - self.openWindow?(id: "welcome") + WelcomeWindowFactory.openOrFront() } catch { Self.logger.error( "Failed to connect after plugin install: \(error.localizedDescription, privacy: .public)") @@ -340,8 +344,7 @@ final class WelcomeViewModel { func duplicateConnection(_ connection: DatabaseConnection) { let duplicate = storage.duplicateConnection(connection) loadConnections() - openWindow?(id: "connection-form", value: duplicate.id as UUID?) - focusConnectionFormWindow() + ConnectionFormWindowFactory.openOrFront(connectionId: duplicate.id) } // MARK: - Delete @@ -589,17 +592,15 @@ final class WelcomeViewModel { // MARK: - Private Helpers private func handleConnectionFailure(error: Error, connectionId: UUID) { - guard let openWindow else { return } closeConnectionWindows(for: connectionId) connectionError = error.localizedDescription showConnectionError = true - openWindow(id: "welcome") + WelcomeWindowFactory.openOrFront() } private func handleMissingPlugin(connection: DatabaseConnection) { - guard let openWindow else { return } closeConnectionWindows(for: connection.id) - openWindow(id: "welcome") + WelcomeWindowFactory.openOrFront() pluginInstallConnection = connection } diff --git a/TablePro/Views/Connection/ConnectionFormView+Footer.swift b/TablePro/Views/Connection/ConnectionFormView+Footer.swift index f21e90e5e..bc8ce94af 100644 --- a/TablePro/Views/Connection/ConnectionFormView+Footer.swift +++ b/TablePro/Views/Connection/ConnectionFormView+Footer.swift @@ -52,7 +52,7 @@ extension ConnectionFormView { // Cancel Button("Cancel") { - NSApplication.shared.closeWindows(withId: "connection-form") + ConnectionFormWindowFactory.closeAll() } if isNew { @@ -74,7 +74,7 @@ extension ConnectionFormView { } .background(Color(nsColor: .windowBackgroundColor)) .onExitCommand { - NSApplication.shared.closeWindows(withId: "connection-form") + ConnectionFormWindowFactory.closeAll() } .onChange(of: host) { _, _ in testSucceeded = false } .onChange(of: port) { _, _ in testSucceeded = false } diff --git a/TablePro/Views/Connection/ConnectionFormView+Helpers.swift b/TablePro/Views/Connection/ConnectionFormView+Helpers.swift index 96ff405e3..40a3054e0 100644 --- a/TablePro/Views/Connection/ConnectionFormView+Helpers.swift +++ b/TablePro/Views/Connection/ConnectionFormView+Helpers.swift @@ -279,7 +279,7 @@ extension ConnectionFormView { if !connectionToSave.localOnly { SyncChangeTracker.shared.markDirty(.connection, id: connectionToSave.id.uuidString) } - NSApplication.shared.closeWindows(withId: "connection-form") + ConnectionFormWindowFactory.closeAll() NotificationCenter.default.post(name: .connectionUpdated, object: nil) if connect { connectToDatabase(connectionToSave) @@ -292,7 +292,7 @@ extension ConnectionFormView { SyncChangeTracker.shared.markDirty(.connection, id: connectionToSave.id.uuidString) } } - NSApplication.shared.closeWindows(withId: "connection-form") + ConnectionFormWindowFactory.closeAll() NotificationCenter.default.post(name: .connectionUpdated, object: nil) } } @@ -301,23 +301,15 @@ extension ConnectionFormView { guard let id = connectionId, let connection = storage.loadConnections().first(where: { $0.id == id }) else { return } storage.deleteConnection(connection) - NSApplication.shared.closeWindows(withId: "connection-form") + ConnectionFormWindowFactory.closeAll() NotificationCenter.default.post(name: .connectionUpdated, object: nil) } func connectToDatabase(_ connection: DatabaseConnection) { - if WindowOpener.shared.openWindow == nil { - WindowOpener.shared.openWindow = openWindow - } - // Close welcome BEFORE opening the editor window so it can't reassert - // key status during the new window's `makeKeyAndOrderFront`. See - // WelcomeViewModel.connectToDatabase for the diagnosed race. - NSApplication.shared.closeWindows(withId: "welcome") - WindowManager.shared.openTab(payload: EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault)) - + WelcomeWindowFactory.close() Task { do { - try await dbManager.connectToSession(connection) + try await TabRouter.shared.route(.openConnection(connection.id)) } catch { handleConnectError(error, connection: connection) } @@ -330,7 +322,7 @@ extension ConnectionFormView { return } closeConnectionWindows(for: connection.id) - openWindow(id: "welcome") + WelcomeWindowFactory.openOrFront() guard !(error is CancellationError) else { return } Self.logger.error("Failed to connect: \(error.localizedDescription, privacy: .public)") AlertHelper.showErrorSheet( @@ -341,7 +333,7 @@ extension ConnectionFormView { func handleMissingPlugin(connection: DatabaseConnection) { closeConnectionWindows(for: connection.id) - openWindow(id: "welcome") + WelcomeWindowFactory.openOrFront() pluginInstallConnection = connection } @@ -352,17 +344,10 @@ extension ConnectionFormView { } func connectAfterInstall(_ connection: DatabaseConnection) { - if WindowOpener.shared.openWindow == nil { - WindowOpener.shared.openWindow = openWindow - } - // Close welcome before opening editor — see connectToDatabase above - // for the welcome-reasserts-key race that disabled menu shortcuts. - NSApplication.shared.closeWindows(withId: "welcome") - WindowManager.shared.openTab(payload: EditorTabPayload(connectionId: connection.id, intent: .restoreOrDefault)) - + WelcomeWindowFactory.close() Task { do { - try await dbManager.connectToSession(connection) + try await TabRouter.shared.route(.openConnection(connection.id)) } catch { handleConnectError(error, connection: connection) } diff --git a/TablePro/Views/Connection/ConnectionFormView.swift b/TablePro/Views/Connection/ConnectionFormView.swift index a3d6140e3..75af777c4 100644 --- a/TablePro/Views/Connection/ConnectionFormView.swift +++ b/TablePro/Views/Connection/ConnectionFormView.swift @@ -12,13 +12,11 @@ import UniformTypeIdentifiers struct ConnectionFormView: View { static let logger = Logger(subsystem: "com.TablePro", category: "ConnectionFormView") - @Environment(\.openWindow) var openWindow // Connection ID: nil = new connection, UUID = edit existing let connectionId: UUID? let storage = ConnectionStorage.shared - let dbManager = DatabaseManager.shared var isNew: Bool { connectionId == nil } diff --git a/TablePro/Views/Connection/WelcomeContextMenus.swift b/TablePro/Views/Connection/WelcomeContextMenus.swift index 7ee94bced..d826d48d2 100644 --- a/TablePro/Views/Connection/WelcomeContextMenus.swift +++ b/TablePro/Views/Connection/WelcomeContextMenus.swift @@ -91,7 +91,7 @@ extension WelcomeWindowView { Divider() Button { - openWindow(id: "connection-form", value: connection.id as UUID?) + ConnectionFormWindowFactory.openOrFront(connectionId: connection.id) vm.focusConnectionFormWindow() } label: { Label(String(localized: "Edit"), systemImage: "pencil") @@ -228,7 +228,7 @@ extension WelcomeWindowView { @ViewBuilder var newConnectionContextMenu: some View { - Button(action: { openWindow(id: "connection-form") }) { + Button(action: { ConnectionFormWindowFactory.openOrFront() }) { Label("New Connection...", systemImage: "plus") } diff --git a/TablePro/Views/Connection/WelcomeWindowView.swift b/TablePro/Views/Connection/WelcomeWindowView.swift index 9c1ee3560..e52349874 100644 --- a/TablePro/Views/Connection/WelcomeWindowView.swift +++ b/TablePro/Views/Connection/WelcomeWindowView.swift @@ -16,7 +16,6 @@ struct WelcomeWindowView: View { @State var vm = WelcomeViewModel() @FocusState private var focus: FocusField? - @Environment(\.openWindow) var openWindow var body: some View { ZStack { @@ -36,7 +35,7 @@ struct WelcomeWindowView: View { .ignoresSafeArea() .frame(minWidth: 600, idealWidth: 700, minHeight: 400, idealHeight: 450) .onAppear { - vm.setUp(openWindow: openWindow) + vm.setUp() focus = .search } .alert( @@ -171,7 +170,7 @@ struct WelcomeWindowView: View { HStack(spacing: 0) { WelcomeLeftPanel( onActivateLicense: { vm.activeSheet = .activation }, - onCreateConnection: { openWindow(id: "connection-form") } + onCreateConnection: { ConnectionFormWindowFactory.openOrFront() } ) Divider() rightPanel @@ -184,7 +183,7 @@ struct WelcomeWindowView: View { private var rightPanel: some View { VStack(spacing: 0) { HStack(spacing: 8) { - Button(action: { openWindow(id: "connection-form") }) { + Button(action: { ConnectionFormWindowFactory.openOrFront() }) { Image(systemName: "plus") .font(.callout.weight(.medium)) .foregroundStyle(.secondary) @@ -418,7 +417,7 @@ struct WelcomeWindowView: View { .font(.callout) .foregroundStyle(.tertiary) - Button(action: { openWindow(id: "connection-form") }) { + Button(action: { ConnectionFormWindowFactory.openOrFront() }) { Label("New Connection", systemImage: "plus") } .controlSize(.large) diff --git a/TablePro/Views/Main/Child/MainEditorContentView.swift b/TablePro/Views/Main/Child/MainEditorContentView.swift index a1c8a2214..68c63347e 100644 --- a/TablePro/Views/Main/Child/MainEditorContentView.swift +++ b/TablePro/Views/Main/Child/MainEditorContentView.swift @@ -263,7 +263,7 @@ struct MainEditorContentView: View { parameters: parameterBinding(for: tab), isParameterPanelVisible: parameterVisibilityBinding(for: tab), onExecute: { coordinator.runQuery() }, - schemaProvider: coordinator.schemaProvider, + schemaProvider: SchemaProviderRegistry.shared.getOrCreate(for: coordinator.connection.id), databaseType: coordinator.connection.type, connectionId: coordinator.connection.id, connectionAIPolicy: coordinator.connection.aiPolicy ?? AppSettingsManager.shared.ai.defaultConnectionPolicy, diff --git a/TablePro/Views/Main/Extensions/MainContentCoordinator+Navigation.swift b/TablePro/Views/Main/Extensions/MainContentCoordinator+Navigation.swift index 97aa94f0e..d085311ae 100644 --- a/TablePro/Views/Main/Extensions/MainContentCoordinator+Navigation.swift +++ b/TablePro/Views/Main/Extensions/MainContentCoordinator+Navigation.swift @@ -49,7 +49,7 @@ extension MainContentCoordinator { // During database switch, update the existing tab in-place instead of // opening a new native window tab. - if sidebarLoadingState == .loading { + if case .loading = SchemaService.shared.state(for: connectionId) { if tabManager.tabs.isEmpty { do { try tabManager.addTableTab( @@ -65,14 +65,18 @@ extension MainContentCoordinator { } // Check if another native window tab already has this table open — switch to it - if let keyWindow = NSApp.keyWindow { - let ownWindows = Set(WindowLifecycleMonitor.shared.windows(for: connectionId).map { ObjectIdentifier($0) }) - let tabbedWindows = keyWindow.tabbedWindows ?? [keyWindow] - for window in tabbedWindows - where window.title == tableName && ownWindows.contains(ObjectIdentifier(window)) { - window.makeKeyAndOrderFront(nil) - return + for sibling in MainContentCoordinator.allActiveCoordinators() + where sibling !== self && sibling.connectionId == connectionId { + let hasMatch = sibling.tabManager.tabs.contains { tab in + tab.tabType == .table + && tab.tableContext.tableName == tableName + && tab.tableContext.databaseName == currentDatabase } + guard hasMatch, + let windowId = sibling.windowId, + let window = WindowLifecycleMonitor.shared.window(for: windowId) else { continue } + window.makeKeyAndOrderFront(nil) + return } // If no tabs exist (empty state), add a table tab directly. @@ -401,7 +405,6 @@ extension MainContentCoordinator { /// Switch to a different database (called from database switcher) func switchDatabase(to database: String) async { - sidebarLoadingState = .loading filterStateManager.clearAll() let previousDatabase = toolbarState.databaseName toolbarState.databaseName = database @@ -414,14 +417,11 @@ extension MainContentCoordinator { tableRowsStore.tearDown() tabManager.tabs = [] tabManager.selectedTabId = nil - DatabaseManager.shared.updateSession(connectionId) { session in - session.tables = [] - } + await SchemaService.shared.invalidate(connectionId: connectionId) await refreshTables() } catch { toolbarState.databaseName = previousDatabase - sidebarLoadingState = .error(error.localizedDescription) navigationLogger.error("Failed to switch database: \(error.localizedDescription, privacy: .public)") AlertHelper.showErrorSheet( @@ -436,7 +436,6 @@ extension MainContentCoordinator { func switchSchema(to schema: String) async { guard PluginManager.shared.supportsSchemaSwitching(for: connection.type) else { return } - sidebarLoadingState = .loading filterStateManager.clearAll() let previousSchema = toolbarState.databaseName toolbarState.databaseName = schema @@ -449,9 +448,7 @@ extension MainContentCoordinator { tableRowsStore.tearDown() tabManager.tabs = [] tabManager.selectedTabId = nil - DatabaseManager.shared.updateSession(connectionId) { session in - session.tables = [] - } + await SchemaService.shared.invalidate(connectionId: connectionId) await refreshTables() } catch { diff --git a/TablePro/Views/Main/Extensions/MainContentCoordinator+URLFilter.swift b/TablePro/Views/Main/Extensions/MainContentCoordinator+URLFilter.swift index dcbb54f4a..bc2f35b55 100644 --- a/TablePro/Views/Main/Extensions/MainContentCoordinator+URLFilter.swift +++ b/TablePro/Views/Main/Extensions/MainContentCoordinator+URLFilter.swift @@ -6,57 +6,7 @@ import Foundation extension MainContentCoordinator { - func setupURLNotificationObservers() -> [NSObjectProtocol] { - let connId = connectionId - let observer1 = NotificationCenter.default.addObserver( - forName: .applyURLFilter, - object: nil, - queue: .main - ) { [weak self] notification in - guard let userInfo = notification.userInfo, - let targetId = userInfo["connectionId"] as? UUID, - targetId == connId else { return } - - let condition = userInfo["condition"] as? String - let column = userInfo["column"] as? String - let operation = userInfo["operation"] as? String - let value = userInfo["value"] as? String - Task { [weak self] in - self?.applyURLFilterValues( - condition: condition, column: column, - operation: operation, value: value - ) - } - } - - let observer2 = NotificationCenter.default.addObserver( - forName: .switchSchemaFromURL, - object: nil, - queue: .main - ) { [weak self] notification in - guard let userInfo = notification.userInfo, - let targetId = userInfo["connectionId"] as? UUID, - targetId == connId, - let schema = userInfo["schema"] as? String else { return } - - Task { [weak self] in - guard let self else { return } - - if PluginManager.shared.supportsSchemaSwitching(for: self.connection.type) { - await self.switchSchema(to: schema) - } else { - await self.switchDatabase(to: schema) - } - } - } - - return [observer1, observer2] - } - - private func applyURLFilterValues( - condition: String?, column: String?, - operation: String?, value: String? - ) { + func applyURLFilter(condition: String?, column: String?, operation: String?, value: String?) { if let condition, !condition.isEmpty { let filter = TableFilter( id: UUID(), @@ -74,7 +24,6 @@ extension MainContentCoordinator { guard let column, !column.isEmpty else { return } let filterOp = mapTablePlusOperation(operation ?? "Equal") - let filter = TableFilter( id: UUID(), columnName: column, diff --git a/TablePro/Views/Main/Extensions/MainContentCoordinator+WindowLifecycle.swift b/TablePro/Views/Main/Extensions/MainContentCoordinator+WindowLifecycle.swift index 07f0244ab..cb11e10ab 100644 --- a/TablePro/Views/Main/Extensions/MainContentCoordinator+WindowLifecycle.swift +++ b/TablePro/Views/Main/Extensions/MainContentCoordinator+WindowLifecycle.swift @@ -102,19 +102,11 @@ extension MainContentCoordinator { "[close] coordinator.handleWindowWillClose connId=\(self.connectionId, privacy: .public) tabs=\(self.tabManager.tabs.count)" ) - // Persist remaining non-preview tabs synchronously. saveNowSync writes - // directly without spawning a Task — required here because the window - // is closing and we cannot rely on async tasks being serviced. - let persistableTabs = tabManager.tabs.filter { !$0.isPreview } - if persistableTabs.isEmpty { - // Empty → clear saved state so next open shows a default empty window. - persistence.saveNowSync(tabs: [], selectedTabId: nil) - } else { - let normalizedSelectedId = - persistableTabs.contains(where: { $0.id == tabManager.selectedTabId }) - ? tabManager.selectedTabId : persistableTabs.first?.id - persistence.saveNowSync(tabs: persistableTabs, selectedTabId: normalizedSelectedId) - } + // Persist tabs aggregated across all windows for this connection. + // Writing this window's tabs in isolation can clobber sibling windows' + // state on disk — for example, closing an empty window would erase the + // saved tabs of an open sibling window. + persistence.saveOrClearAggregatedSync() // Cancel the pending eviction task before teardown drops it. evictionTask?.cancel() diff --git a/TablePro/Views/Main/Extensions/MainContentView+EventHandlers.swift b/TablePro/Views/Main/Extensions/MainContentView+EventHandlers.swift index 0ce5ace93..986262d1b 100644 --- a/TablePro/Views/Main/Extensions/MainContentView+EventHandlers.swift +++ b/TablePro/Views/Main/Extensions/MainContentView+EventHandlers.swift @@ -58,20 +58,9 @@ extension MainContentView { coordinator.promotePreviewTab() } - let persistableTabs = tabManager.tabs.filter { !$0.isPreview } - if persistableTabs.isEmpty { - coordinator.persistence.clearSavedState() - } else { - let normalizedSelectedId = - persistableTabs.contains(where: { $0.id == tabManager.selectedTabId }) - ? tabManager.selectedTabId : persistableTabs.first?.id - coordinator.persistence.saveNow( - tabs: persistableTabs, - selectedTabId: normalizedSelectedId - ) - } + coordinator.persistence.saveOrClearAggregated() MainContentView.lifecycleLogger.debug( - "[switch] handleStructureChange tabCount=\(tabManager.tabs.count) persistableCount=\(persistableTabs.count) ms=\(Int(Date().timeIntervalSince(t0) * 1_000))" + "[switch] handleStructureChange tabCount=\(tabManager.tabs.count) ms=\(Int(Date().timeIntervalSince(t0) * 1_000))" ) } diff --git a/TablePro/Views/Main/Extensions/MainContentView+Modifiers.swift b/TablePro/Views/Main/Extensions/MainContentView+Modifiers.swift index 6dc477e02..1da3d0631 100644 --- a/TablePro/Views/Main/Extensions/MainContentView+Modifiers.swift +++ b/TablePro/Views/Main/Extensions/MainContentView+Modifiers.swift @@ -54,7 +54,6 @@ struct FocusedCommandActionsModifier: ViewModifier { connection: DatabaseConnection.preview, payload: nil, windowTitle: .constant("SQL Query"), - tables: .constant([]), sidebarState: SharedSidebarState(), pendingTruncates: .constant([]), pendingDeletes: .constant([]), diff --git a/TablePro/Views/Main/Extensions/MainContentView+Setup.swift b/TablePro/Views/Main/Extensions/MainContentView+Setup.swift index a884c2c02..5eebb9fdc 100644 --- a/TablePro/Views/Main/Extensions/MainContentView+Setup.swift +++ b/TablePro/Views/Main/Extensions/MainContentView+Setup.swift @@ -95,11 +95,6 @@ extension MainContentView { private func handleRestoreOrDefault() async { if WindowLifecycleMonitor.shared.hasOtherWindows(for: connection.id, excluding: windowId) { - if tabManager.tabs.isEmpty { - let allTabs = MainContentCoordinator.allTabs(for: connection.id) - let title = QueryTabManager.nextQueryTitle(existingTabs: allTabs) - tabManager.addTab(title: title, databaseName: connection.database) - } MainContentView.lifecycleLogger.info( "[open] handleRestoreOrDefault short-circuit (other windows exist) windowId=\(windowId, privacy: .public)" ) @@ -111,7 +106,8 @@ extension MainContentView { MainContentView.lifecycleLogger.info( "[open] restoreFromDisk done windowId=\(windowId, privacy: .public) tabsRestored=\(result.tabs.count) source=\(String(describing: result.source), privacy: .public) elapsedMs=\(Int(Date().timeIntervalSince(restoreStart) * 1_000))" ) - if !result.tabs.isEmpty { + guard !result.tabs.isEmpty else { return } + do { var restoredTabs = result.tabs for i in restoredTabs.indices where restoredTabs[i].tabType == .table { if let tableName = restoredTabs[i].tableContext.tableName { @@ -141,17 +137,13 @@ extension MainContentView { if !remainingTabs.isEmpty { let selectedWasFirst = firstTab.id == selectedId - Task { @MainActor in - for tab in remainingTabs { - let restorePayload = EditorTabPayload( - from: tab, connectionId: connection.id, skipAutoExecute: true) - WindowManager.shared.openTab(payload: restorePayload) - } - // Bring the first window to front only if it had the selected tab. - // Otherwise let the last restored window stay focused. - if selectedWasFirst { - viewWindow?.makeKeyAndOrderFront(nil) - } + for tab in remainingTabs { + let restorePayload = EditorTabPayload( + from: tab, connectionId: connection.id, skipAutoExecute: true) + WindowManager.shared.openTab(payload: restorePayload) + } + if selectedWasFirst { + viewWindow?.makeKeyAndOrderFront(nil) } } diff --git a/TablePro/Views/Main/MainContentCommandActions.swift b/TablePro/Views/Main/MainContentCommandActions.swift index 694bbf9d6..f22f2bcff 100644 --- a/TablePro/Views/Main/MainContentCommandActions.swift +++ b/TablePro/Views/Main/MainContentCommandActions.swift @@ -316,15 +316,8 @@ final class MainContentCommandActions { // MARK: - Tab Operations (Group A — Called Directly) func newTab(initialQuery: String? = nil) { - // If no tabs exist (empty state), add directly to this window - if coordinator?.tabManager.tabs.isEmpty == true { - coordinator?.tabManager.addTab(initialQuery: initialQuery, databaseName: connection.database) - return - } - // Open a new native macOS window tab with a query editor let payload = EditorTabPayload( connectionId: connection.id, - tabType: .query, initialQuery: initialQuery, intent: .newEmptyTab ) @@ -487,11 +480,11 @@ final class MainContentCommandActions { // MARK: - Tab Navigation (Group A — Called Directly) func selectTab(number: Int) { - // Switch to the nth native window tab guard let keyWindow = NSApp.keyWindow, let tabbedWindows = keyWindow.tabbedWindows, - number > 0, number <= tabbedWindows.count else { return } - tabbedWindows[number - 1].makeKeyAndOrderFront(nil) + tabbedWindows.indices.contains(number - 1) else { return } + let target = tabbedWindows[number - 1] + target.makeKeyAndOrderFront(nil) } // MARK: - Filter Operations (Group A — Called Directly) @@ -704,6 +697,10 @@ final class MainContentCommandActions { coordinator?.activeSheet = .quickSwitcher } + func openConnectionSwitcher() { + coordinator?.toolbarState.showConnectionSwitcher = true + } + // MARK: - Undo/Redo (Group A — Called Directly) func undoChange() { @@ -762,9 +759,11 @@ final class MainContentCommandActions { if let driver = DatabaseManager.shared.driver(for: self.connection.id) { coordinator?.toolbarState.databaseVersion = driver.serverVersion } - if coordinator?.sidebarLoadingState != .loading { - await coordinator?.refreshTables() + if case .loading = SchemaService.shared.state(for: self.connection.id) { + coordinator?.initRedisKeyTreeIfNeeded() + return } + await coordinator?.refreshTables() coordinator?.initRedisKeyTreeIfNeeded() } } @@ -791,32 +790,9 @@ final class MainContentCommandActions { private func handleOpenSQLFiles(_ notification: Notification) { guard let urls = notification.object as? [URL] else { return } - Task { for url in urls { - if let existingWindow = WindowLifecycleMonitor.shared.window(forSourceFile: url) { - existingWindow.makeKeyAndOrderFront(nil) - continue - } - - let content = await Task.detached(priority: .userInitiated) { () -> String? in - do { - return try String(contentsOf: url, encoding: .utf8) - } catch { - Self.logger.error("Failed to read \(url.lastPathComponent, privacy: .public): \(error.localizedDescription, privacy: .public)") - return nil - } - }.value - - if let content { - let payload = EditorTabPayload( - connectionId: connection.id, - tabType: .query, - initialQuery: content, - sourceFileURL: url - ) - WindowManager.shared.openTab(payload: payload) - } + try? await TabRouter.shared.route(.openSQLFile(url)) } } } diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 82c946750..cf8b99a1f 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -38,14 +38,6 @@ struct DisplayFormatsCacheEntry { let formats: [ValueDisplayFormat?] } -/// Sidebar table loading state — single source of truth for sidebar UI -enum SidebarLoadingState: Equatable { - case idle - case loading - case loaded - case error(String) -} - /// Represents which sheet is currently active in MainContentView. /// Uses a single `.sheet(item:)` modifier instead of multiple `.sheet(isPresented:)`. enum ActiveSheet: Identifiable { @@ -141,15 +133,12 @@ final class MainContentCoordinator { // MARK: - Published State - var schemaProvider: SQLSchemaProvider var cursorPositions: [CursorPosition] = [] var tableMetadata: TableMetadata? - // Removed: showErrorAlert and errorAlertMessage - errors now display inline var activeSheet: ActiveSheet? var importFileURL: URL? var exportPreselectedTableNames: Set? var needsLazyLoad = false - var sidebarLoadingState: SidebarLoadingState = .idle /// Cache for async-sorted query tab rows (large datasets sorted on background thread) @ObservationIgnored var querySortCache: [UUID: QuerySortCacheEntry] = [:] @@ -171,10 +160,8 @@ final class MainContentCoordinator { @ObservationIgnored private var changeManagerUpdateTask: Task? @ObservationIgnored private var activeSortTasks: [UUID: Task] = [:] @ObservationIgnored private var terminationObserver: NSObjectProtocol? - @ObservationIgnored private var urlFilterObservers: [NSObjectProtocol] = [] @ObservationIgnored private var pluginDriverObserver: NSObjectProtocol? @ObservationIgnored private var fileWatcher: DatabaseFileWatcher? - @ObservationIgnored private var lastSchemaRefreshDate = Date.distantPast /// Set during handleTabChange to suppress redundant column-change reconfiguration @ObservationIgnored internal var isHandlingTabSwitch = false @@ -241,22 +228,32 @@ final class MainContentCoordinator { set { _isAppTerminating.withLock { $0 = newValue } } } + /// Stable instance identity. Used to key the registry so a recycled + /// `ObjectIdentifier` from a freshly-allocated coordinator can never + /// remove a different instance's entry from a delayed cleanup Task. + let instanceId = UUID() + /// Registry of active coordinators for aggregated quit-time persistence. - /// Keyed by ObjectIdentifier of each coordinator instance. - static var activeCoordinators: [ObjectIdentifier: MainContentCoordinator] = [:] + /// Keyed by `instanceId` (UUID) — never by `ObjectIdentifier`, which can + /// be recycled across allocations. + static var activeCoordinators: [UUID: MainContentCoordinator] = [:] /// Register this coordinator so quit-time persistence can aggregate tabs. + /// Idempotent — repeated registration is a no-op. + func registerEagerly() { + Self.activeCoordinators[instanceId] = self + } + private func registerForPersistence() { - Self.activeCoordinators[ObjectIdentifier(self)] = self + Self.activeCoordinators[instanceId] = self } - /// Unregister this coordinator from quit-time aggregation. private func unregisterFromPersistence() { - Self.activeCoordinators.removeValue(forKey: ObjectIdentifier(self)) + Self.activeCoordinators.removeValue(forKey: instanceId) } /// Collect non-preview tabs for persistence. - private static func aggregatedTabs(for connectionId: UUID) -> [QueryTab] { + static func aggregatedTabs(for connectionId: UUID) -> [QueryTab] { let coordinators = activeCoordinators.values .filter { $0.connectionId == connectionId } @@ -282,7 +279,7 @@ final class MainContentCoordinator { } /// Get selected tab ID from any coordinator for a given connectionId. - private static func aggregatedSelectedTabId(for connectionId: UUID) -> UUID? { + static func aggregatedSelectedTabId(for connectionId: UUID) -> UUID? { activeCoordinators.values .first { $0.connectionId == connectionId && $0.tabManager.selectedTabId != nil }? .tabManager.selectedTabId @@ -355,9 +352,8 @@ final class MainContentCoordinator { ) self.persistence = TabPersistenceCoordinator(connectionId: connection.id) - self.schemaProvider = SchemaProviderRegistry.shared.getOrCreate(for: connection.id) + _ = SchemaProviderRegistry.shared.getOrCreate(for: connection.id) SchemaProviderRegistry.shared.retain(for: connection.id) - urlFilterObservers = setupURLNotificationObservers() changeManager.undoManagerProvider = { [weak self] in self?.contentWindow?.undoManager } changeManager.onUndoApplied = { [weak self] result in self?.handleUndoResult(result) } @@ -414,16 +410,6 @@ final class MainContentCoordinator { ) } - /// Transition sidebar from `.idle` to `.loaded` when tables already exist - /// (e.g. populated by another window's `refreshTables()`). - func healSidebarLoadingStateIfNeeded() { - guard sidebarLoadingState == .idle else { return } - let tables = DatabaseManager.shared.session(for: connectionId)?.tables ?? [] - if !tables.isEmpty { - sidebarLoadingState = .loaded - } - } - /// Start watching the database file for external changes (SQLite, DuckDB). private func startFileWatcherIfNeeded() { guard PluginManager.shared.connectionMode(for: connection.type) == .fileBased else { return } @@ -432,8 +418,9 @@ final class MainContentCoordinator { let watcher = DatabaseFileWatcher() watcher.watch(filePath: filePath, connectionId: connectionId) { [weak self] in - guard let self, self.sidebarLoadingState != .loading else { return } - Task { await self.refreshTablesIfStale() } + guard let self else { return } + if case .loading = SchemaService.shared.state(for: self.connectionId) { return } + Task { await self.refreshTables() } } fileWatcher = watcher } @@ -441,9 +428,14 @@ final class MainContentCoordinator { /// Refresh schema only if not recently refreshed (avoids redundant work /// when both the file watcher and window focus trigger close together). func refreshTablesIfStale() async { - guard Date().timeIntervalSince(lastSchemaRefreshDate) > 2 else { return } - lastSchemaRefreshDate = Date() - await refreshTables() + guard let driver = DatabaseManager.shared.driver(for: connectionId) else { return } + await SchemaService.shared.reloadIfStale( + connectionId: connectionId, + driver: driver, + connection: connection, + staleness: 2 + ) + await reconcilePostSchemaLoad() } func showAIChatPanel() { @@ -473,45 +465,44 @@ final class MainContentCoordinator { } func refreshTables() async { - lastSchemaRefreshDate = Date() - sidebarLoadingState = .loading - guard let driver = DatabaseManager.shared.driver(for: connectionId) else { - sidebarLoadingState = .error(String(localized: "Not connected")) - return - } - do { - let tables = try await driver.fetchTables() - .sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending } - DatabaseManager.shared.updateSession(connectionId) { $0.tables = tables } + guard let driver = DatabaseManager.shared.driver(for: connectionId) else { return } + await SchemaService.shared.reload( + connectionId: connectionId, + driver: driver, + connection: connection + ) + await reconcilePostSchemaLoad() + } + + /// Push the SchemaService table list into the autocomplete provider and prune sidebar + /// state for tables that no longer exist. + private func reconcilePostSchemaLoad() async { + guard case .loaded(let tables) = SchemaService.shared.state(for: connectionId) else { return } + if let driver = DatabaseManager.shared.driver(for: connectionId), + let provider = SchemaProviderRegistry.shared.provider(for: connectionId) { let currentDb = DatabaseManager.shared.session(for: connectionId)?.activeDatabase - await schemaProvider.resetForDatabase(currentDb, tables: tables, driver: driver) - - // Clean up stale selections and pending operations for tables that no longer exist - if let vm = sidebarViewModel { - let validNames = Set(tables.map(\.name)) - let staleSelections = vm.selectedTables.filter { !validNames.contains($0.name) } - if !staleSelections.isEmpty { - vm.selectedTables.subtract(staleSelections) - } - let stalePendingDeletes = vm.pendingDeletes.subtracting(validNames) - if !stalePendingDeletes.isEmpty { - vm.pendingDeletes.subtract(stalePendingDeletes) - for name in stalePendingDeletes { - vm.tableOperationOptions.removeValue(forKey: name) - } - } - let stalePendingTruncates = vm.pendingTruncates.subtracting(validNames) - if !stalePendingTruncates.isEmpty { - vm.pendingTruncates.subtract(stalePendingTruncates) - for name in stalePendingTruncates { - vm.tableOperationOptions.removeValue(forKey: name) - } - } - } + await provider.resetForDatabase(currentDb, tables: tables, driver: driver) + } - sidebarLoadingState = .loaded - } catch { - sidebarLoadingState = .error(error.localizedDescription) + guard let vm = sidebarViewModel else { return } + let validNames = Set(tables.map(\.name)) + let staleSelections = vm.selectedTables.filter { !validNames.contains($0.name) } + if !staleSelections.isEmpty { + vm.selectedTables.subtract(staleSelections) + } + let stalePendingDeletes = vm.pendingDeletes.subtracting(validNames) + if !stalePendingDeletes.isEmpty { + vm.pendingDeletes.subtract(stalePendingDeletes) + for name in stalePendingDeletes { + vm.tableOperationOptions.removeValue(forKey: name) + } + } + let stalePendingTruncates = vm.pendingTruncates.subtracting(validNames) + if !stalePendingTruncates.isEmpty { + vm.pendingTruncates.subtract(stalePendingTruncates) + for name in stalePendingTruncates { + vm.tableOperationOptions.removeValue(forKey: name) + } } } @@ -525,10 +516,6 @@ final class MainContentCoordinator { _didTeardown.withLock { $0 = true } unregisterFromPersistence() - for observer in urlFilterObservers { - NotificationCenter.default.removeObserver(observer) - } - urlFilterObservers.removeAll() if let observer = terminationObserver { NotificationCenter.default.removeObserver(observer) terminationObserver = nil @@ -592,7 +579,7 @@ final class MainContentCoordinator { // Never-activated coordinators are throwaway instances created by SwiftUI // during body re-evaluation — @State only keeps the first, rest are discarded guard _didActivate.withLock({ $0 }) else { - let id = ObjectIdentifier(self) + let id = instanceId Task { @MainActor in Self.activeCoordinators.removeValue(forKey: id) } @@ -635,20 +622,8 @@ final class MainContentCoordinator { } } - /// Load schema only if the shared provider hasn't loaded yet + /// Load schema if not already loaded by another window for this connection. func loadSchemaIfNeeded() async { - let alreadyLoaded = await schemaProvider.isSchemaLoaded() - if alreadyLoaded { - let cachedTables = await schemaProvider.getTables() - let sessionTables = DatabaseManager.shared.session(for: connectionId)?.tables ?? [] - if sessionTables.isEmpty && !cachedTables.isEmpty { - DatabaseManager.shared.updateSession(connectionId) { $0.tables = cachedTables } - } - if sidebarLoadingState == .idle { - sidebarLoadingState = .loaded - } - return - } await loadSchema() } @@ -672,18 +647,12 @@ final class MainContentCoordinator { func loadSchema() async { guard let driver = DatabaseManager.shared.driver(for: connectionId) else { return } - sidebarLoadingState = .loading - await schemaProvider.loadSchema(using: driver, connection: connection) - let fetchedTables = await schemaProvider.getTables() - if !fetchedTables.isEmpty { - let sessionTables = DatabaseManager.shared.session(for: connectionId)?.tables ?? [] - if sessionTables != fetchedTables { - DatabaseManager.shared.updateSession(connectionId) { $0.tables = fetchedTables } - } - sidebarLoadingState = .loaded - } else { - sidebarLoadingState = .idle - } + await SchemaService.shared.load( + connectionId: connectionId, + driver: driver, + connection: connection + ) + await reconcilePostSchemaLoad() } func loadTableMetadata(tableName: String) async { diff --git a/TablePro/Views/Main/MainContentView.swift b/TablePro/Views/Main/MainContentView.swift index 76ce35776..8467e0aaf 100644 --- a/TablePro/Views/Main/MainContentView.swift +++ b/TablePro/Views/Main/MainContentView.swift @@ -30,13 +30,17 @@ struct MainContentView: View { // Shared state from parent @Binding var windowTitle: String - @Binding var tables: [TableInfo] + @Bindable var schemaService = SchemaService.shared var sidebarState: SharedSidebarState @Binding var pendingTruncates: Set @Binding var pendingDeletes: Set @Binding var tableOperationOptions: [String: TableOperationOptions] var rightPanelState: RightPanelState + private var tables: [TableInfo] { + schemaService.tables(for: connection.id) + } + // MARK: - State Objects let tabManager: QueryTabManager @@ -66,7 +70,6 @@ struct MainContentView: View { connection: DatabaseConnection, payload: EditorTabPayload?, windowTitle: Binding, - tables: Binding<[TableInfo]>, sidebarState: SharedSidebarState, pendingTruncates: Binding>, pendingDeletes: Binding>, @@ -81,7 +84,6 @@ struct MainContentView: View { self.connection = connection self.payload = payload self._windowTitle = windowTitle - self._tables = tables self.sidebarState = sidebarState self._pendingTruncates = pendingTruncates self._pendingDeletes = pendingDeletes @@ -202,7 +204,7 @@ struct MainContentView: View { case .quickSwitcher: QuickSwitcherSheet( isPresented: dismissBinding, - schemaProvider: coordinator.schemaProvider, + schemaProvider: SchemaProviderRegistry.shared.getOrCreate(for: connection.id), connectionId: connection.id, databaseType: connection.type, onSelect: { item in @@ -262,7 +264,7 @@ struct MainContentView: View { setupCommandActions() updateToolbarPendingState() updateInspectorContext() - rightPanelState.aiViewModel.schemaProvider = coordinator.schemaProvider + rightPanelState.aiViewModel.schemaProvider = SchemaProviderRegistry.shared.getOrCreate(for: connection.id) coordinator.aiViewModel = rightPanelState.aiViewModel coordinator.rightPanelState = rightPanelState diff --git a/TablePro/Views/Settings/Sections/MCPSection.swift b/TablePro/Views/Settings/Sections/MCPSection.swift index fbcd8f3d0..0c8902385 100644 --- a/TablePro/Views/Settings/Sections/MCPSection.swift +++ b/TablePro/Views/Settings/Sections/MCPSection.swift @@ -188,10 +188,11 @@ struct MCPSection: View { private func handleGenerate(name: String, permissions: TokenPermissions, connectionIds: Set?, expiresAt: Date?) { Task { guard let store = manager.tokenStore else { return } + let access: ConnectionAccess = connectionIds.map { .limited($0) } ?? .all let result = await store.generate( name: name, permissions: permissions, - allowedConnectionIds: connectionIds, + connectionAccess: access, expiresAt: expiresAt ) revealedToken = result.token diff --git a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift index 8750ed913..e82d00e7f 100644 --- a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift +++ b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift @@ -3,7 +3,6 @@ // TablePro // -import AppKit import SwiftUI struct PairingApproval: Sendable { @@ -12,48 +11,6 @@ struct PairingApproval: Sendable { let expiresAt: Date? } -@MainActor -enum PairingApprovalPresenter { - static func present(request: PairingRequest) async throws -> PairingApproval { - try await withCheckedThrowingContinuation { continuation in - var deliver: ((Result) -> Void)? - let host = NSHostingController( - rootView: PairingApprovalSheet( - request: request, - onComplete: { result in deliver?(result) } - ) - ) - host.view.frame = NSRect(x: 0, y: 0, width: 520, height: 560) - - let parent = AlertHelper.resolveWindow(nil) - let sheetWindow = NSWindow(contentViewController: host) - sheetWindow.styleMask = [.titled] - sheetWindow.title = String(localized: "Approve Integration") - sheetWindow.isReleasedWhenClosed = false - - var resolved = false - deliver = { result in - guard !resolved else { return } - resolved = true - if let parent { - parent.endSheet(sheetWindow) - } else { - sheetWindow.close() - } - continuation.resume(with: result) - } - - if let parent { - parent.beginSheet(sheetWindow, completionHandler: nil) - } else { - NSApp.activate(ignoringOtherApps: true) - sheetWindow.center() - sheetWindow.makeKeyAndOrderFront(nil) - } - } - } -} - struct PairingApprovalSheet: View { let request: PairingRequest let onComplete: (Result) -> Void diff --git a/TablePro/Views/Sidebar/SidebarView.swift b/TablePro/Views/Sidebar/SidebarView.swift index c554b71e1..1fe9406e1 100644 --- a/TablePro/Views/Sidebar/SidebarView.swift +++ b/TablePro/Views/Sidebar/SidebarView.swift @@ -13,8 +13,8 @@ import SwiftUI struct SidebarView: View { @State private var viewModel: SidebarViewModel + @Bindable private var schemaService = SchemaService.shared - @Binding var tables: [TableInfo] var sidebarState: SharedSidebarState @Binding var pendingTruncates: Set @Binding var pendingDeletes: Set @@ -23,6 +23,10 @@ struct SidebarView: View { var connectionId: UUID private weak var coordinator: MainContentCoordinator? + private var tables: [TableInfo] { + schemaService.tables(for: connectionId) + } + private var filteredTables: [TableInfo] { guard !viewModel.searchText.isEmpty else { return tables } return tables.filter { $0.name.localizedCaseInsensitiveContains(viewModel.searchText) } @@ -36,7 +40,6 @@ struct SidebarView: View { } init( - tables: Binding<[TableInfo]>, sidebarState: SharedSidebarState, onDoubleClick: ((TableInfo) -> Void)? = nil, pendingTruncates: Binding>, @@ -46,7 +49,6 @@ struct SidebarView: View { connectionId: UUID, coordinator: MainContentCoordinator? = nil ) { - _tables = tables self.sidebarState = sidebarState self.onDoubleClick = onDoubleClick _pendingTruncates = pendingTruncates @@ -56,7 +58,6 @@ struct SidebarView: View { set: { sidebarState.selectedTables = $0 } ) let vm = SidebarViewModel( - tables: tables, selectedTables: selectedBinding, pendingTruncates: pendingTruncates, pendingDeletes: pendingDeletes, @@ -93,7 +94,6 @@ struct SidebarView: View { } .onAppear { coordinator?.sidebarViewModel = viewModel - coordinator?.healSidebarLoadingStateIfNeeded() // Update toolbar version if driver connected before this window's observer was set up if let driver = DatabaseManager.shared.driver(for: connectionId), coordinator?.toolbarState.databaseVersion == nil { @@ -122,23 +122,16 @@ struct SidebarView: View { @ViewBuilder private var tablesContent: some View { - let rawState = coordinator?.sidebarLoadingState ?? .idle - let effectiveState: SidebarLoadingState = { - if case .error = rawState { return rawState } - if !tables.isEmpty { return .loaded } - if case .loading = rawState { return .loading } - return rawState - }() - switch effectiveState { - case .loading: + switch schemaService.state(for: connectionId) { + case .loading where tables.isEmpty: loadingState - case .error(let message): + case .failed(let message): errorState(message: message) case .loaded where !viewModel.searchText.isEmpty && filteredTables.isEmpty: noMatchState - case .loaded where tables.isEmpty: + case .loaded(let allTables) where allTables.isEmpty: emptyState - case .loaded: + case .loaded, .loading: tableList case .idle: emptyState @@ -266,7 +259,6 @@ struct SidebarView: View { #Preview { SidebarView( - tables: .constant([]), sidebarState: SharedSidebarState(), pendingTruncates: .constant([]), pendingDeletes: .constant([]), diff --git a/TablePro/Views/Toolbar/ConnectionSwitcherPopover.swift b/TablePro/Views/Toolbar/ConnectionSwitcherPopover.swift index ea57967af..a9676ce64 100644 --- a/TablePro/Views/Toolbar/ConnectionSwitcherPopover.swift +++ b/TablePro/Views/Toolbar/ConnectionSwitcherPopover.swift @@ -13,11 +13,8 @@ import TableProPluginKit /// Popover content for quick connection switching struct ConnectionSwitcherPopover: View { @State private var savedConnections: [DatabaseConnection] = [] - @State private var isConnecting: UUID? @State private var selectedIndex: Int = 0 - @Environment(\.openWindow) private var openWindow - /// Callback when the popover should dismiss var onDismiss: (() -> Void)? @@ -94,7 +91,6 @@ struct ConnectionSwitcherPopover: View { connection: connection, isActive: false, isConnected: false, - isConnecting: isConnecting == connection.id, isHighlighted: itemIndex == selectedIndex ) } @@ -126,7 +122,7 @@ struct ConnectionSwitcherPopover: View { // Manage connections button Button { onDismiss?() - NotificationCenter.default.post(name: .openWelcomeWindow, object: nil) + WelcomeWindowFactory.openOrFront() } label: { HStack { Image(systemName: "gear") @@ -203,7 +199,6 @@ struct ConnectionSwitcherPopover: View { connection: DatabaseConnection, isActive: Bool, isConnected: Bool, - isConnecting: Bool = false, isHighlighted: Bool = false ) -> some View { HStack(spacing: 8) { @@ -228,10 +223,7 @@ struct ConnectionSwitcherPopover: View { Spacer() // Status indicator - if isConnecting { - ProgressView() - .controlSize(.small) - } else if isActive { + if isActive { Image(systemName: "checkmark.circle.fill") .foregroundStyle(isHighlighted ? Color(nsColor: .alternateSelectedControlTextColor) : Color(nsColor: .systemGreen)) .font(.system(size: 14)) @@ -287,23 +279,18 @@ struct ConnectionSwitcherPopover: View { } private func switchToSession(_ sessionId: UUID) { - onDismiss?() - // Try to bring existing window for this connection to front - if let existingWindow = findWindow(for: sessionId) { - existingWindow.makeKeyAndOrderFront(nil) - } else { - openWindowForDifferentConnection(EditorTabPayload(connectionId: sessionId)) - } + openConnection(sessionId) } private func connectToSaved(_ connection: DatabaseConnection) { - isConnecting = connection.id + openConnection(connection.id) + } + + private func openConnection(_ id: UUID) { onDismiss?() - // Open a new window, then connect — window shows "Connecting..." until ready - openWindowForDifferentConnection(EditorTabPayload(connectionId: connection.id)) Task { do { - try await DatabaseManager.shared.connectToSession(connection) + try await TabRouter.shared.route(.openConnection(id)) } catch { await MainActor.run { AlertHelper.showErrorSheet( @@ -313,32 +300,6 @@ struct ConnectionSwitcherPopover: View { ) } } - await MainActor.run { - isConnecting = nil - } - } - } - - /// Find an existing visible window for the given connection ID - private func findWindow(for connectionId: UUID) -> NSWindow? { - WindowLifecycleMonitor.shared.findWindow(for: connectionId) - } - - /// Open a new window for a different connection, ensuring it doesn't - /// merge as a tab with the current connection's window group - /// (unless the user opted to group all connections in one window). - private func openWindowForDifferentConnection(_ payload: EditorTabPayload) { - if AppSettingsManager.shared.tabs.groupAllConnectionTabs { - WindowManager.shared.openTab(payload: payload) - } else { - // Temporarily disable tab merging so the new window opens independently - let currentWindow = NSApp.keyWindow - let previousMode = currentWindow?.tabbingMode ?? .preferred - currentWindow?.tabbingMode = .disallowed - WindowManager.shared.openTab(payload: payload) - DispatchQueue.main.async { - currentWindow?.tabbingMode = previousMode - } } } } diff --git a/TablePro/Views/Toolbar/TableProToolbarView.swift b/TablePro/Views/Toolbar/TableProToolbarView.swift index df95683d6..1d13af062 100644 --- a/TablePro/Views/Toolbar/TableProToolbarView.swift +++ b/TablePro/Views/Toolbar/TableProToolbarView.swift @@ -59,7 +59,6 @@ struct ToolbarPrincipalContent: View { struct TableProToolbar: ViewModifier { @Bindable var state: ConnectionToolbarState @FocusedValue(\.commandActions) private var actions: MainContentCommandActions? - @State private var showConnectionSwitcher = false func body(content: Content) -> some View { content @@ -68,14 +67,14 @@ struct TableProToolbar: ViewModifier { ToolbarItem(placement: .navigation) { Button { - showConnectionSwitcher.toggle() + state.showConnectionSwitcher.toggle() } label: { Label("Connection", systemImage: "network") } .help(String(localized: "Switch Connection (⌘⌥C)")) - .popover(isPresented: $showConnectionSwitcher) { + .popover(isPresented: $state.showConnectionSwitcher) { ConnectionSwitcherPopover { - showConnectionSwitcher = false + state.showConnectionSwitcher = false } } } @@ -229,9 +228,6 @@ struct TableProToolbar: ViewModifier { } } } - .onReceive(NotificationCenter.default.publisher(for: .openConnectionSwitcher)) { _ in - showConnectionSwitcher = true - } } } diff --git a/TableProTests/Core/Concurrency/OnceTaskTests.swift b/TableProTests/Core/Concurrency/OnceTaskTests.swift new file mode 100644 index 000000000..33576a7ef --- /dev/null +++ b/TableProTests/Core/Concurrency/OnceTaskTests.swift @@ -0,0 +1,186 @@ +// +// OnceTaskTests.swift +// TableProTests +// + +import Foundation +@testable import TablePro +import XCTest + +final class OnceTaskTests: XCTestCase { + actor Counter { + private(set) var value: Int = 0 + + func increment() { + value += 1 + } + } + + private struct TestError: Error, Equatable { + let tag: String + } + + func testConcurrentSameKeyRunsWorkOnce() async throws { + let dedup = OnceTask() + let counter = Counter() + + async let first = dedup.execute(key: "k") { + await counter.increment() + try await Task.sleep(for: .milliseconds(50)) + return 42 + } + async let second = dedup.execute(key: "k") { + await counter.increment() + try await Task.sleep(for: .milliseconds(50)) + return 99 + } + + let results = try await [first, second] + let invocations = await counter.value + + XCTAssertEqual(invocations, 1, "Work block must run exactly once for concurrent same-key callers") + XCTAssertEqual(results[0], results[1], "Concurrent callers must observe the same value") + XCTAssertEqual(results[0], 42, "Both callers must receive the value produced by the first work block") + } + + func testConcurrentDifferentKeysRunWorkSeparately() async throws { + let dedup = OnceTask() + let counter = Counter() + + async let alpha = dedup.execute(key: "alpha") { + await counter.increment() + try await Task.sleep(for: .milliseconds(20)) + return "alpha-value" + } + async let beta = dedup.execute(key: "beta") { + await counter.increment() + try await Task.sleep(for: .milliseconds(20)) + return "beta-value" + } + + let alphaValue = try await alpha + let betaValue = try await beta + let invocations = await counter.value + + XCTAssertEqual(invocations, 2, "Distinct keys must each run their own work block") + XCTAssertEqual(alphaValue, "alpha-value") + XCTAssertEqual(betaValue, "beta-value") + } + + func testThrowingWorkPropagatesAndClearsInFlight() async throws { + let dedup = OnceTask() + let counter = Counter() + + do { + _ = try await dedup.execute(key: "k") { + await counter.increment() + throw TestError(tag: "first") + } + XCTFail("Expected throw from first execute") + } catch let error as TestError { + XCTAssertEqual(error.tag, "first") + } + + let secondValue = try await dedup.execute(key: "k") { + await counter.increment() + return 7 + } + + XCTAssertEqual(secondValue, 7, "After a throw, the next execute must rerun the work") + let invocations = await counter.value + XCTAssertEqual(invocations, 2, "Both work blocks must have run (throw cleared the in-flight slot)") + } + + func testCancelKeyClearsInFlightAndAllowsRerun() async throws { + let dedup = OnceTask() + let counter = Counter() + let started = expectation(description: "work started") + started.assertForOverFulfill = false + + let inFlight = Task { + try await dedup.execute(key: "k") { + await counter.increment() + started.fulfill() + try await Task.sleep(for: .seconds(5)) + return 1 + } + } + + await fulfillment(of: [started], timeout: 2.0) + await dedup.cancel(key: "k") + + do { + _ = try await inFlight.value + XCTFail("Expected CancellationError from cancelled in-flight call") + } catch is CancellationError { + // expected + } catch { + XCTFail("Expected CancellationError, got \(error)") + } + + let rerunValue = try await dedup.execute(key: "k") { + await counter.increment() + return 11 + } + + XCTAssertEqual(rerunValue, 11, "After cancel, a fresh execute must run the work again") + let invocations = await counter.value + XCTAssertEqual(invocations, 2) + } + + func testSequentialSameKeyRunsWorkAgain() async throws { + let dedup = OnceTask() + let counter = Counter() + + let first = try await dedup.execute(key: "k") { + await counter.increment() + return 1 + } + let second = try await dedup.execute(key: "k") { + await counter.increment() + return 2 + } + + XCTAssertEqual(first, 1) + XCTAssertEqual(second, 2) + let invocations = await counter.value + XCTAssertEqual(invocations, 2, "Sequential calls (after first completes) must each run the work") + } + + func testCancelAllCancelsEveryInFlight() async throws { + let dedup = OnceTask() + let firstStarted = expectation(description: "first started") + let secondStarted = expectation(description: "second started") + firstStarted.assertForOverFulfill = false + secondStarted.assertForOverFulfill = false + + let firstTask = Task { + try await dedup.execute(key: "a") { + firstStarted.fulfill() + try await Task.sleep(for: .seconds(5)) + return 1 + } + } + let secondTask = Task { + try await dedup.execute(key: "b") { + secondStarted.fulfill() + try await Task.sleep(for: .seconds(5)) + return 2 + } + } + + await fulfillment(of: [firstStarted, secondStarted], timeout: 2.0) + await dedup.cancelAll() + + for task in [firstTask, secondTask] { + do { + _ = try await task.value + XCTFail("Expected CancellationError from cancelAll") + } catch is CancellationError { + // expected + } catch { + XCTFail("Expected CancellationError, got \(error)") + } + } + } +} diff --git a/TableProTests/Core/Database/MultiConnectionTests.swift b/TableProTests/Core/Database/MultiConnectionTests.swift index 60a2b39bc..6ad99ad1e 100644 --- a/TableProTests/Core/Database/MultiConnectionTests.swift +++ b/TableProTests/Core/Database/MultiConnectionTests.swift @@ -95,13 +95,12 @@ struct DatabaseManagerMultiSessionTests { DatabaseManager.shared.removeSession(for: id2) } - let table = TestFixtures.makeTableInfo(name: "users") DatabaseManager.shared.updateSession(id1) { session in - session.tables = [table] + session.pendingTruncates = ["users"] } - #expect(DatabaseManager.shared.session(for: id1)?.tables.count == 1) - #expect(DatabaseManager.shared.session(for: id2)?.tables.isEmpty == true) + #expect(DatabaseManager.shared.session(for: id1)?.pendingTruncates == ["users"]) + #expect(DatabaseManager.shared.session(for: id2)?.pendingTruncates.isEmpty == true) } @Test("Removing one session does not affect the other") @@ -133,7 +132,7 @@ struct DatabaseManagerMultiSessionTests { let countBefore = DatabaseManager.shared.activeSessions.count DatabaseManager.shared.updateSession(unknownId) { session in - session.tables = [TestFixtures.makeTableInfo(name: "ghost")] + session.pendingTruncates = ["ghost"] } #expect(DatabaseManager.shared.activeSessions.count == countBefore) @@ -228,35 +227,22 @@ struct CoordinatorConnectionIsolationTests { #expect(coordinator2.connectionId == id2) } - @Test("sidebarLoadingState is per-coordinator and does not bleed across instances") - func sidebarLoadingStateIsPerCoordinator() { - let conn1 = TestFixtures.makeConnection(id: UUID(), name: "Conn1", database: "db_a", type: .mysql) - let conn2 = TestFixtures.makeConnection(id: UUID(), name: "Conn2", database: "db_b", type: .mysql) - - let coordinator1 = MainContentCoordinator( - connection: conn1, - tabManager: QueryTabManager(), - changeManager: DataChangeManager(), - filterStateManager: FilterStateManager(), - columnVisibilityManager: ColumnVisibilityManager(), - toolbarState: ConnectionToolbarState() - ) - defer { coordinator1.teardown() } - - let coordinator2 = MainContentCoordinator( - connection: conn2, - tabManager: QueryTabManager(), - changeManager: DataChangeManager(), - filterStateManager: FilterStateManager(), - columnVisibilityManager: ColumnVisibilityManager(), - toolbarState: ConnectionToolbarState() - ) - defer { coordinator2.teardown() } + @Test("Schema state is per-connection in SchemaService") + func schemaStateIsPerConnection() async { + let id1 = UUID() + let id2 = UUID() - coordinator1.sidebarLoadingState = .loading + await SchemaService.shared.invalidate(connectionId: id1) + await SchemaService.shared.invalidate(connectionId: id2) + defer { + Task { + await SchemaService.shared.invalidate(connectionId: id1) + await SchemaService.shared.invalidate(connectionId: id2) + } + } - #expect(coordinator1.sidebarLoadingState == .loading) - #expect(coordinator2.sidebarLoadingState == .idle) + #expect(SchemaService.shared.state(for: id1) == .idle) + #expect(SchemaService.shared.state(for: id2) == .idle) } @Test("openTableTab uses coordinator's connection database for the added tab") diff --git a/TableProTests/Core/MCP/MCPRouterTests.swift b/TableProTests/Core/MCP/MCPRouterTests.swift new file mode 100644 index 000000000..f2c392eae --- /dev/null +++ b/TableProTests/Core/MCP/MCPRouterTests.swift @@ -0,0 +1,167 @@ +// +// MCPRouterTests.swift +// TableProTests +// + +import Foundation +@testable import TablePro +import Testing + +@Suite("MCP Router") +struct MCPRouterTests { + private final class StubHandler: MCPRouteHandler, @unchecked Sendable { + let methods: [HTTPRequest.Method] + let path: String + private let result: MCPRouter.RouteResult + private(set) var invocationCount: Int = 0 + private(set) var lastRequest: HTTPRequest? + + init(methods: [HTTPRequest.Method], path: String, result: MCPRouter.RouteResult = .accepted) { + self.methods = methods + self.path = path + self.result = result + } + + func handle(_ request: HTTPRequest) async -> MCPRouter.RouteResult { + invocationCount += 1 + lastRequest = request + return result + } + } + + private func makeRequest( + method: HTTPRequest.Method, + path: String, + body: Data? = nil + ) -> HTTPRequest { + HTTPRequest(method: method, path: path, headers: [:], body: body, remoteIP: nil) + } + + @Test("OPTIONS preflight returns noContent regardless of path") + func optionsPreflightAlwaysNoContent() async { + let mcpHandler = StubHandler(methods: [.post], path: "/mcp", result: .accepted) + let router = MCPRouter(routes: [mcpHandler]) + + let optionsAtMcp = makeRequest(method: .options, path: "/mcp") + let result1 = await router.handle(optionsAtMcp) + guard case .noContent = result1 else { + Issue.record("Expected .noContent for OPTIONS /mcp, got \(result1)") + return + } + + let optionsAtUnknown = makeRequest(method: .options, path: "/unknown/path") + let result2 = await router.handle(optionsAtUnknown) + guard case .noContent = result2 else { + Issue.record("Expected .noContent for OPTIONS /unknown, got \(result2)") + return + } + + #expect(mcpHandler.invocationCount == 0) + } + + @Test("POST /mcp dispatches to MCP protocol handler") + func postMcpDispatchesToProtocolHandler() async { + let mcpHandler = StubHandler(methods: [.get, .post, .delete], path: "/mcp", result: .accepted) + let exchangeHandler = StubHandler(methods: [.post], path: "/v1/integrations/exchange", result: .accepted) + let router = MCPRouter(routes: [mcpHandler, exchangeHandler]) + + let request = makeRequest(method: .post, path: "/mcp") + _ = await router.handle(request) + + #expect(mcpHandler.invocationCount == 1) + #expect(exchangeHandler.invocationCount == 0) + } + + @Test("POST /v1/integrations/exchange dispatches to exchange handler") + func postExchangeDispatchesToExchangeHandler() async { + let mcpHandler = StubHandler(methods: [.get, .post, .delete], path: "/mcp", result: .accepted) + let exchangeHandler = StubHandler(methods: [.post], path: "/v1/integrations/exchange", result: .accepted) + let router = MCPRouter(routes: [mcpHandler, exchangeHandler]) + + let request = makeRequest(method: .post, path: "/v1/integrations/exchange") + _ = await router.handle(request) + + #expect(exchangeHandler.invocationCount == 1) + #expect(mcpHandler.invocationCount == 0) + } + + @Test("Path with query string still matches canonical route") + func queryStringMatchesCanonicalPath() async { + let mcpHandler = StubHandler(methods: [.post], path: "/mcp", result: .accepted) + let router = MCPRouter(routes: [mcpHandler]) + + let request = makeRequest(method: .post, path: "/mcp?session=abc") + _ = await router.handle(request) + + #expect(mcpHandler.invocationCount == 1) + } + + @Test("Unknown path returns 404 httpError") + func unknownPathReturnsNotFound() async { + let mcpHandler = StubHandler(methods: [.post], path: "/mcp", result: .accepted) + let router = MCPRouter(routes: [mcpHandler]) + + let request = makeRequest(method: .post, path: "/totally/unknown") + let result = await router.handle(request) + + guard case .httpError(let status, _) = result else { + Issue.record("Expected .httpError, got \(result)") + return + } + #expect(status == 404) + #expect(mcpHandler.invocationCount == 0) + } + + @Test("Method mismatch on registered path returns 404") + func methodMismatchReturnsNotFound() async { + let exchangeHandler = StubHandler(methods: [.post], path: "/v1/integrations/exchange", result: .accepted) + let router = MCPRouter(routes: [exchangeHandler]) + + let request = makeRequest(method: .get, path: "/v1/integrations/exchange") + let result = await router.handle(request) + + guard case .httpError(let status, _) = result else { + Issue.record("Expected .httpError, got \(result)") + return + } + #expect(status == 404) + #expect(exchangeHandler.invocationCount == 0) + } + + @Test(".well-known requests return 404 immediately") + func wellKnownReturnsNotFound() async { + let mcpHandler = StubHandler(methods: [.get], path: "/.well-known/oauth", result: .accepted) + let router = MCPRouter(routes: [mcpHandler]) + + let request = makeRequest(method: .get, path: "/.well-known/oauth") + let result = await router.handle(request) + + guard case .httpError(let status, _) = result else { + Issue.record("Expected .httpError, got \(result)") + return + } + #expect(status == 404) + #expect(mcpHandler.invocationCount == 0) + } + + @Test("Handler receives the original request") + func handlerReceivesOriginalRequest() async { + let mcpHandler = StubHandler(methods: [.post], path: "/mcp", result: .accepted) + let router = MCPRouter(routes: [mcpHandler]) + + let body = Data("{\"hello\":\"world\"}".utf8) + let request = HTTPRequest( + method: .post, + path: "/mcp", + headers: ["content-type": "application/json"], + body: body, + remoteIP: "10.0.0.1" + ) + _ = await router.handle(request) + + #expect(mcpHandler.lastRequest?.path == "/mcp") + #expect(mcpHandler.lastRequest?.method == .post) + #expect(mcpHandler.lastRequest?.body == body) + #expect(mcpHandler.lastRequest?.remoteIP == "10.0.0.1") + } +} diff --git a/TableProTests/Models/ConnectionSessionTests.swift b/TableProTests/Models/ConnectionSessionTests.swift index 9e3e50e67..0c843fef4 100644 --- a/TableProTests/Models/ConnectionSessionTests.swift +++ b/TableProTests/Models/ConnectionSessionTests.swift @@ -19,7 +19,6 @@ struct ConnectionSessionEquivalenceTests { id: UUID = UUID(), database: String = "testdb", type: DatabaseType = .mysql, - tables: [TableInfo] = [], status: ConnectionStatus = .connected ) -> ConnectionSession { let connection = DatabaseConnection( @@ -30,7 +29,6 @@ struct ConnectionSessionEquivalenceTests { ) var session = ConnectionSession(connection: connection) session.status = status - session.tables = tables return session } @@ -71,16 +69,15 @@ struct ConnectionSessionEquivalenceTests { #expect(!a.isContentViewEquivalent(to: b)) } - @Test("Returns false when tables change") - func falseWhenTablesChange() { + @Test("Tables are excluded from equivalence (owned by SchemaService)") + @MainActor + func tablesAreExcludedFromEquivalence() async { let id = UUID() - var a = makeSession(id: id) - var b = makeSession(id: id) - - a.tables = [TestFixtures.makeTableInfo(name: "users")] - b.tables = [TestFixtures.makeTableInfo(name: "orders")] + let a = makeSession(id: id) + let b = makeSession(id: id) - #expect(!a.isContentViewEquivalent(to: b)) + await SchemaService.shared.invalidate(connectionId: id) + #expect(a.isContentViewEquivalent(to: b)) } @Test("Returns false when status changes") @@ -162,14 +159,6 @@ struct ConnectionSessionStateTests { #expect(!session.isConnected) } - @Test("clearCachedData clears tables") - func clearCachedDataClearsTables() { - var session = makeSession() - session.tables = [TestFixtures.makeTableInfo(name: "users")] - session.clearCachedData() - #expect(session.tables.isEmpty) - } - @Test("clearCachedData clears selectedTables") func clearCachedDataClearsSelectedTables() { var session = makeSession() @@ -207,7 +196,7 @@ struct ConnectionSessionStateTests { let connection = TestFixtures.makeConnection(name: "Production") var session = ConnectionSession(connection: connection) session.status = .connected - session.tables = [TestFixtures.makeTableInfo(name: "users")] + session.selectedTables = [TestFixtures.makeTableInfo(name: "users")] session.clearCachedData() #expect(session.status == .connected) #expect(session.connection.id == connection.id) From d0fe3a4829d210d128e3ff09770d4738456245f3 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 16:53:10 +0700 Subject: [PATCH 69/83] fix: register custom file UTIs as exported so Finder enables Open With --- CHANGELOG.md | 1 + TablePro/Info.plist | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e54f7574..545d07f73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- File associations for `.sql`, `.sqlite`, `.duckdb`, and related extensions disabled in Finder's Open With menu. The custom UTIs (`com.tablepro.sql`, `com.tablepro.sqlite-db`, `com.tablepro.duckdb`) were declared under `UTImportedTypeDeclarations` instead of `UTExportedTypeDeclarations`, so Launch Services treated them as "imported" claims and ranked them below other apps. SQL is now `LSHandlerRank: Owner`, SQLite is `Default`, DuckDB is `Owner`/`Editor`, and `com.tablepro.sqlite-db` conforms to `com.apple.sqlite3`. - Crash on macOS 26 when opening SQL Preview (NSColor.cgColor calls deprecated colorSpaceName) - Connection form: `usePrivateKey=true` from URL no longer disables Test/Create buttons - Transient connections from URL clean up keychain entries on connection failure diff --git a/TablePro/Info.plist b/TablePro/Info.plist index 1cd4d004c..d5e98b81d 100644 --- a/TablePro/Info.plist +++ b/TablePro/Info.plist @@ -22,10 +22,11 @@ CFBundleTypeRole Editor LSHandlerRank - Default + Owner LSItemContentTypes com.tablepro.sql + public.sql @@ -61,7 +62,7 @@ CFBundleTypeRole Editor LSHandlerRank - Alternate + Default LSItemContentTypes com.apple.sqlite3 @@ -88,9 +89,9 @@ CFBundleTypeName DuckDB Database CFBundleTypeRole - Viewer + Editor LSHandlerRank - Alternate + Owner CFBundleTypeExtensions duckdb @@ -102,7 +103,7 @@ - UTImportedTypeDeclarations + UTExportedTypeDeclarations UTTypeIdentifier @@ -113,6 +114,7 @@ SQLDocument UTTypeConformsTo + public.sql public.plain-text UTTypeTagSpecification @@ -130,6 +132,7 @@ SQLite Database UTTypeConformsTo + com.apple.sqlite3 public.database public.data @@ -147,14 +150,15 @@ + UTTypeIdentifier + com.tablepro.duckdb + UTTypeDescription + DuckDB Database UTTypeConformsTo + public.database public.data - UTTypeDescription - DuckDB Database - UTTypeIdentifier - com.tablepro.duckdb UTTypeTagSpecification public.filename-extension @@ -164,9 +168,6 @@ - - UTExportedTypeDeclarations - UTTypeIdentifier com.tablepro.connection-share From 2f5b4f8e17032bc378c5812258015a8c365f9118 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:27:21 +0700 Subject: [PATCH 70/83] style: strip MARK comments from MCP source and test files --- TablePro/Core/MCP/MCPAuditLogStorage.swift | 10 ---------- TablePro/Core/MCP/MCPAuditLogger.swift | 12 ------------ TablePro/Core/MCP/MCPConnectionBridge.swift | 14 -------------- TablePro/Core/MCP/MCPMessageTypes.swift | 18 ------------------ TablePro/Core/MCP/MCPTLSManager.swift | 18 ------------------ .../Core/MCP/MCPToolHandler+Integrations.swift | 12 ------------ .../Core/MCP/MCPPairingServiceTests.swift | 12 ------------ .../Core/MCP/MCPRateLimiterTests.swift | 14 -------------- .../Core/MCP/MCPTokenStoreTests.swift | 8 -------- .../MCP/MCPToolHandlerIntegrationTests.swift | 16 ---------------- 10 files changed, 134 deletions(-) diff --git a/TablePro/Core/MCP/MCPAuditLogStorage.swift b/TablePro/Core/MCP/MCPAuditLogStorage.swift index bf840960f..c42e4e7c0 100644 --- a/TablePro/Core/MCP/MCPAuditLogStorage.swift +++ b/TablePro/Core/MCP/MCPAuditLogStorage.swift @@ -55,8 +55,6 @@ actor MCPAuditLogStorage { } } - // MARK: - Database Setup - private func setupDatabase() { let fileManager = FileManager.default guard @@ -114,8 +112,6 @@ actor MCPAuditLogStorage { sqlite3_finalize(statement) } - // MARK: - Insert - @discardableResult func addEntry(_ entry: AuditEntry) -> Bool { let sql = """ @@ -165,8 +161,6 @@ actor MCPAuditLogStorage { return sqlite3_step(statement) == SQLITE_DONE } - // MARK: - Query - func query( category: AuditCategory? = nil, tokenId: UUID? = nil, @@ -230,8 +224,6 @@ actor MCPAuditLogStorage { return 0 } - // MARK: - Prune - @discardableResult func prune(olderThan days: Int) -> Int { guard days > 0 else { return 0 } @@ -259,8 +251,6 @@ actor MCPAuditLogStorage { return sqlite3_step(statement) == SQLITE_DONE } - // MARK: - Parsing - private func parseEntry(_ statement: OpaquePointer?) -> AuditEntry? { guard let statement, let idCString = sqlite3_column_text(statement, 0), diff --git a/TablePro/Core/MCP/MCPAuditLogger.swift b/TablePro/Core/MCP/MCPAuditLogger.swift index 4d82f2ec4..f5f53a95f 100644 --- a/TablePro/Core/MCP/MCPAuditLogger.swift +++ b/TablePro/Core/MCP/MCPAuditLogger.swift @@ -11,8 +11,6 @@ enum MCPAuditLogger { private static let sqlExcerptLimit = 256 - // MARK: - Auth - static func logAuthSuccess(tokenName: String, ip: String) { serverAuth.info("Auth success: token=\(tokenName, privacy: .public) ip=\(ip, privacy: .public)") record( @@ -46,8 +44,6 @@ enum MCPAuditLogger { ) } - // MARK: - Admin - static func logTokenCreated(tokenName: String) { serverAdmin.info("Token created: \(tokenName, privacy: .public)") record( @@ -89,8 +85,6 @@ enum MCPAuditLogger { ) } - // MARK: - Query - static func logQueryExecuted( tokenId: UUID?, tokenName: String?, @@ -132,8 +126,6 @@ enum MCPAuditLogger { ) } - // MARK: - Tool - static func logToolCalled( tokenId: UUID?, tokenName: String?, @@ -167,8 +159,6 @@ enum MCPAuditLogger { ) } - // MARK: - Resource - static func logResourceRead( tokenId: UUID?, tokenName: String?, @@ -199,8 +189,6 @@ enum MCPAuditLogger { ) } - // MARK: - Storage Bridge - private static func record( category: AuditCategory, tokenId: UUID? = nil, diff --git a/TablePro/Core/MCP/MCPConnectionBridge.swift b/TablePro/Core/MCP/MCPConnectionBridge.swift index 97e647c56..f7958bffe 100644 --- a/TablePro/Core/MCP/MCPConnectionBridge.swift +++ b/TablePro/Core/MCP/MCPConnectionBridge.swift @@ -11,8 +11,6 @@ import os actor MCPConnectionBridge { private static let logger = Logger(subsystem: "com.TablePro", category: "MCPConnectionBridge") - // MARK: - Connection Management - func listConnections() async -> JSONValue { let (connections, activeSessions) = await MainActor.run { let conns = ConnectionStorage.shared.loadConnections() @@ -160,8 +158,6 @@ actor MCPConnectionBridge { return .object(result) } - // MARK: - Query Execution - func executeQuery( connectionId: UUID, query: String, @@ -231,8 +227,6 @@ actor MCPConnectionBridge { return .object(response) } - // MARK: - Schema Operations - func listTables(connectionId: UUID, includeRowCounts: Bool) async throws -> JSONValue { let cachedTables = await MainActor.run { SchemaService.shared.tables(for: connectionId) @@ -352,8 +346,6 @@ actor MCPConnectionBridge { return .object(["ddl": .string(ddl)]) } - // MARK: - Database/Schema Switching - func switchDatabase(connectionId: UUID, database: String) async throws -> JSONValue { // switchDatabase is @MainActor; Swift hops automatically for async calls. try await DatabaseManager.shared.switchDatabase(to: database, for: connectionId) @@ -372,8 +364,6 @@ actor MCPConnectionBridge { ]) } - // MARK: - Schema Resource (for resources/read) - func fetchSchemaResource(connectionId: UUID) async throws -> JSONValue { let cachedTables = await MainActor.run { SchemaService.shared.tables(for: connectionId) @@ -423,8 +413,6 @@ actor MCPConnectionBridge { return .object(result) } - // MARK: - History Resource - func fetchHistoryResource( connectionId: UUID, limit: Int, @@ -465,8 +453,6 @@ actor MCPConnectionBridge { return .object(["history": .array(jsonEntries)]) } - // MARK: - Private Helpers - private func resolveDriver(_ connectionId: UUID) async throws -> (DatabaseDriver, DatabaseType) { let pending: DatabaseConnection? = await MainActor.run { switch DatabaseManager.shared.connectionState(connectionId) { diff --git a/TablePro/Core/MCP/MCPMessageTypes.swift b/TablePro/Core/MCP/MCPMessageTypes.swift index 8775c23ed..01ae77a47 100644 --- a/TablePro/Core/MCP/MCPMessageTypes.swift +++ b/TablePro/Core/MCP/MCPMessageTypes.swift @@ -5,8 +5,6 @@ import Foundation -// MARK: - JSONValue - enum JSONValue: Codable, Equatable, Sendable { case null case bool(Bool) @@ -78,8 +76,6 @@ enum JSONValue: Codable, Equatable, Sendable { } } -// MARK: - JSONValue Literals - extension JSONValue: ExpressibleByStringLiteral { init(stringLiteral value: String) { self = .string(value) @@ -116,8 +112,6 @@ extension JSONValue: ExpressibleByDictionaryLiteral { } } -// MARK: - JSONValue Accessors - extension JSONValue { subscript(key: String) -> JSONValue? { guard case .object(let dict) = self else { return nil } @@ -161,8 +155,6 @@ extension JSONValue { } } -// MARK: - JSONRPCId - enum JSONRPCId: Codable, Equatable, Hashable, Sendable { case string(String) case int(Int) @@ -194,8 +186,6 @@ enum JSONRPCId: Codable, Equatable, Hashable, Sendable { } } -// MARK: - JSON-RPC 2.0 Base Types - struct JSONRPCRequest: Codable, Sendable { let jsonrpc: String let id: JSONRPCId? @@ -273,8 +263,6 @@ struct JSONRPCErrorDetail: Codable, Sendable { let data: JSONValue? } -// MARK: - MCPError - enum MCPError: Error, Sendable { case parseError case invalidRequest(String) @@ -372,8 +360,6 @@ extension MCPError: LocalizedError { var errorDescription: String? { message } } -// MARK: - MCP Initialize - struct MCPClientInfo: Codable, Sendable { let name: String let version: String? @@ -404,8 +390,6 @@ struct MCPServerInfo: Codable, Sendable { let version: String } -// MARK: - MCP Tools - struct MCPToolDefinition: Codable, Sendable { let name: String let description: String @@ -426,8 +410,6 @@ struct MCPContent: Codable, Sendable { } } -// MARK: - MCP Resources - struct MCPResourceDefinition: Codable, Sendable { let uri: String let name: String diff --git a/TablePro/Core/MCP/MCPTLSManager.swift b/TablePro/Core/MCP/MCPTLSManager.swift index c4338ed41..f876fca1a 100644 --- a/TablePro/Core/MCP/MCPTLSManager.swift +++ b/TablePro/Core/MCP/MCPTLSManager.swift @@ -20,8 +20,6 @@ actor MCPTLSManager { private(set) var fingerprint: String? private(set) var pemCertificate: String? - // MARK: - Public API - func loadOrGenerate() throws -> SecIdentity { if let existing = try? loadExistingIdentity() { return existing @@ -43,8 +41,6 @@ actor MCPTLSManager { Self.logger.info("Deleted MCP TLS identity from Keychain") } - // MARK: - Identity Loading - private func loadExistingIdentity() throws -> SecIdentity { let identityQuery: [String: Any] = [ kSecClass as String: kSecClassIdentity, @@ -80,8 +76,6 @@ actor MCPTLSManager { return identity } - // MARK: - Certificate Generation - private func generateAndStore() throws -> SecIdentity { let privateKey = P256.Signing.PrivateKey() let derCertData = try generateCertificate(privateKey: privateKey) @@ -132,8 +126,6 @@ actor MCPTLSManager { return Data(serializer.serializedBytes) } - // MARK: - Keychain Import - private func importPrivateKey(_ privateKey: P256.Signing.PrivateKey) throws { deleteKeychainKey() @@ -177,8 +169,6 @@ actor MCPTLSManager { } } - // MARK: - Keychain Retrieval - private func retrieveIdentity() throws -> SecIdentity { let identityQuery: [String: Any] = [ kSecClass as String: kSecClassIdentity, @@ -197,8 +187,6 @@ actor MCPTLSManager { return (ref as! SecIdentity) // swiftlint:disable:this force_cast } - // MARK: - Keychain Cleanup - private func deleteKeychainKey() { let query: [String: Any] = [ kSecClass as String: kSecClassKey, @@ -224,8 +212,6 @@ actor MCPTLSManager { } } - // MARK: - Certificate Validation - private func isCertificateValid(derData: Data) -> Bool { do { let certificate = try Certificate(derEncoded: Array(derData)) @@ -237,8 +223,6 @@ actor MCPTLSManager { } } - // MARK: - Metadata - private func cacheMetadata(derData: Data) { fingerprint = computeFingerprint(derData: derData) pemCertificate = encodePem(derData: derData) @@ -256,8 +240,6 @@ actor MCPTLSManager { } } -// MARK: - Errors - private enum MCPTLSError: LocalizedError { case keyGenerationFailed case certificateGenerationFailed diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 4724b646d..9ba7923d1 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -7,8 +7,6 @@ import AppKit import Foundation extension MCPToolHandler { - // MARK: - list_recent_tabs - func handleListRecentTabs(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let limit = optionalInt(args, key: "limit", default: 20, clamp: 1...500) @@ -54,8 +52,6 @@ extension MCPToolHandler { return MCPToolResult(content: [.text(encodeJSON(.object(["tabs": .array(payload)])))], isError: nil) } - // MARK: - search_query_history - func handleSearchQueryHistory(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let query = try requireString(args, key: "query") let connectionIdString = optionalString(args, key: "connection_id") @@ -130,8 +126,6 @@ extension MCPToolHandler { return MCPToolResult(content: [.text(encodeJSON(.object(["entries": .array(payload)])))], isError: nil) } - // MARK: - open_connection_window - func handleOpenConnectionWindow(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") try await ensureConnectionExists(connectionId) @@ -161,8 +155,6 @@ extension MCPToolHandler { return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } - // MARK: - open_table_tab - func handleOpenTableTab(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let connectionId = try requireUUID(args, key: "connection_id") let tableName = try requireString(args, key: "table_name") @@ -200,8 +192,6 @@ extension MCPToolHandler { return MCPToolResult(content: [.text(encodeJSON(result))], isError: nil) } - // MARK: - focus_query_tab - func handleFocusQueryTab(_ args: JSONValue?, sessionId: String, token: MCPAuthToken?) async throws -> MCPToolResult { let tabId = try requireUUID(args, key: "tab_id") @@ -252,8 +242,6 @@ extension MCPToolHandler { return MCPToolResult(content: [.text(encodeJSON(.object(dict)))], isError: nil) } - // MARK: - Helpers - private func resolveHistoryAllowlist( token: MCPAuthToken?, scopedConnectionId: UUID?, diff --git a/TableProTests/Core/MCP/MCPPairingServiceTests.swift b/TableProTests/Core/MCP/MCPPairingServiceTests.swift index eb3f2335f..d0d58529a 100644 --- a/TableProTests/Core/MCP/MCPPairingServiceTests.swift +++ b/TableProTests/Core/MCP/MCPPairingServiceTests.swift @@ -6,8 +6,6 @@ import Testing @Suite("MCP Pairing Exchange Store") struct MCPPairingServiceTests { - // MARK: - Helpers - private func base64UrlSha256(of value: String) -> String { PairingExchangeStore.sha256Base64Url(of: value) } @@ -24,8 +22,6 @@ struct MCPPairingServiceTests { ) } - // MARK: - Happy path - @Test("consume returns stored token when challenge and verifier match") func consumeReturnsTokenForValidVerifier() throws { let verifier = "test-verifier-1" @@ -64,8 +60,6 @@ struct MCPPairingServiceTests { } } - // MARK: - Failure modes - @Test("consume returns notFound for unknown code") func consumeUnknownCodeReturnsNotFound() { let store = makeStore() @@ -134,8 +128,6 @@ struct MCPPairingServiceTests { #expect(store.contains(code: "code-6") == false) } - // MARK: - Pruning - @Test("pruneExpired removes only expired entries") func pruneRemovesOnlyExpiredEntries() { let store = makeStore() @@ -160,8 +152,6 @@ struct MCPPairingServiceTests { #expect(store.contains(code: "stale-2") == false) } - // MARK: - SHA256 helper - @Test("sha256Base64Url matches CryptoKit output without padding") func sha256Base64UrlMatchesCryptoKit() { let value = "verifier-string" @@ -174,8 +164,6 @@ struct MCPPairingServiceTests { #expect(PairingExchangeStore.sha256Base64Url(of: value) == expected) } - // MARK: - constantTimeEqual - @Test("constantTimeEqual returns true for identical strings") func constantTimeEqualIdentical() { #expect(PairingExchangeStore.constantTimeEqual("abc", "abc")) diff --git a/TableProTests/Core/MCP/MCPRateLimiterTests.swift b/TableProTests/Core/MCP/MCPRateLimiterTests.swift index 23bac6635..95830f5c4 100644 --- a/TableProTests/Core/MCP/MCPRateLimiterTests.swift +++ b/TableProTests/Core/MCP/MCPRateLimiterTests.swift @@ -9,8 +9,6 @@ import Testing @Suite("MCP Rate Limiter") struct MCPRateLimiterTests { - // MARK: - Helpers - private func makeLimiter() -> MCPRateLimiter { MCPRateLimiter() } @@ -31,8 +29,6 @@ struct MCPRateLimiterTests { return retryAfter } - // MARK: - Basic Behavior - @Test("First request is allowed") func firstRequestAllowed() async { let limiter = makeLimiter() @@ -63,8 +59,6 @@ struct MCPRateLimiterTests { expectAllowed(result) } - // MARK: - Escalating Lockout - @Test("Second failure triggers 1s lockout") func secondFailureLockout() async { let limiter = makeLimiter() @@ -121,8 +115,6 @@ struct MCPRateLimiterTests { #expect(remainingRetry <= initialRetry) } - // MARK: - Lockout Check - @Test("isLockedOut returns rateLimited during lockout") func isLockedOutDuringLockout() async { let limiter = makeLimiter() @@ -140,8 +132,6 @@ struct MCPRateLimiterTests { expectAllowed(result) } - // MARK: - Per-IP Isolation - @Test("Different IPs have independent counters") func independentCounters() async { let limiter = makeLimiter() @@ -168,8 +158,6 @@ struct MCPRateLimiterTests { expectAllowed(resultB, message: "IP-B should not be affected by IP-A lockout") } - // MARK: - Success Resets - @Test("Success after failure resets counter") func successResetsCounter() async { let limiter = makeLimiter() @@ -183,8 +171,6 @@ struct MCPRateLimiterTests { expectRateLimited(secondFail, message: "Second failure after reset should lock out again") } - // MARK: - Edge Cases - @Test("Empty IP string works") func emptyIpString() async { let limiter = makeLimiter() diff --git a/TableProTests/Core/MCP/MCPTokenStoreTests.swift b/TableProTests/Core/MCP/MCPTokenStoreTests.swift index 0467ffc5f..757a9791c 100644 --- a/TableProTests/Core/MCP/MCPTokenStoreTests.swift +++ b/TableProTests/Core/MCP/MCPTokenStoreTests.swift @@ -5,8 +5,6 @@ import Testing @Suite("MCP Token Store") struct MCPTokenStoreTests { - // MARK: - Helpers - private func makeStore() -> MCPTokenStore { MCPTokenStore() } @@ -30,8 +28,6 @@ struct MCPTokenStoreTests { ) } - // MARK: - TokenPermissions - @Test("readOnly satisfies readOnly") func readOnlySatisfiesReadOnly() { #expect(TokenPermissions.readOnly.satisfies(.readOnly) == true) @@ -84,8 +80,6 @@ struct MCPTokenStoreTests { #expect(TokenPermissions.fullAccess.id == "fullAccess") } - // MARK: - MCPAuthToken - @Test("isExpired returns false when expiresAt is nil") func isExpiredNilExpiresAt() { let token = makeToken(expiresAt: nil) @@ -122,8 +116,6 @@ struct MCPTokenStoreTests { #expect(token.isEffectivelyActive == false) } - // MARK: - MCPTokenStore - @Test("generate creates token with tp_ prefix") func generateCreatesTokenWithPrefix() async { let store = makeStore() diff --git a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift index 175538d2a..73eb404be 100644 --- a/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift +++ b/TableProTests/Core/MCP/MCPToolHandlerIntegrationTests.swift @@ -46,8 +46,6 @@ struct MCPToolHandlerIntegrationTests { try await body() } - // MARK: - list_connections - @Test("list_connections omits connections with externalAccess == .blocked") func listConnectionsFiltersBlocked() async throws { let handler = makeHandler() @@ -67,8 +65,6 @@ struct MCPToolHandlerIntegrationTests { } } - // MARK: - list_recent_tabs - @Test("list_recent_tabs returns tabs JSON object") func listRecentTabsShape() async throws { let handler = makeHandler() @@ -110,8 +106,6 @@ struct MCPToolHandlerIntegrationTests { #expect(result.isError == nil) } - // MARK: - search_query_history - @Test("search_query_history rejects missing query parameter") func searchQueryHistoryRequiresQuery() async { let handler = makeHandler() @@ -411,8 +405,6 @@ struct MCPToolHandlerIntegrationTests { #expect(!payload.contains("outside_\(marker)")) } - // MARK: - External access readOnly enforcement - @Test("switch_database against a readOnly connection returns forbidden") func switchDatabaseDeniedByReadOnlyExternalAccess() async throws { let handler = makeHandler() @@ -546,8 +538,6 @@ struct MCPToolHandlerIntegrationTests { #expect(!ExternalAccessLevel.blocked.satisfies(.readWrite)) } - // MARK: - open_connection_window - @Test("open_connection_window rejects missing connection_id") func openConnectionWindowRequiresConnectionId() async { let handler = makeHandler() @@ -632,8 +622,6 @@ struct MCPToolHandlerIntegrationTests { } } - // MARK: - open_table_tab - @Test("open_table_tab requires table_name") func openTableTabRequiresTableName() async { let handler = makeHandler() @@ -653,8 +641,6 @@ struct MCPToolHandlerIntegrationTests { } } - // MARK: - focus_query_tab - @Test("focus_query_tab returns notFound when tab is not open") func focusQueryTabNotFound() async { let handler = makeHandler() @@ -694,8 +680,6 @@ struct MCPToolHandlerIntegrationTests { } } - // MARK: - Unknown tool - @Test("Unknown tool name throws methodNotFound") func unknownToolThrows() async { let handler = makeHandler() From 4f589e6c2877331eabd4f665d63c49df85641cf4 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:32:45 +0700 Subject: [PATCH 71/83] fix(mcp): tighten identifier validation, focus_query_tab TOCTOU, and pairing pending cap --- CHANGELOG.md | 3 + TablePro/Core/MCP/MCPPairingService.swift | 27 ++++-- .../MCP/MCPToolHandler+Integrations.swift | 1 + TablePro/Core/MCP/MCPToolHandler.swift | 16 ++-- .../Core/MCP/MCPPairingServiceTests.swift | 55 +++++++++--- .../MCP/MCPToolHandlerSecurityTests.swift | 87 +++++++++++++++++++ 6 files changed, 162 insertions(+), 27 deletions(-) create mode 100644 TableProTests/Core/MCP/MCPToolHandlerSecurityTests.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 545d07f73..3a6815ddb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,6 +95,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Persist connection deletions before firing the sync notification, fixing the same race for deleted connections. - Refuse to generate SQL when the database dialect cannot be resolved, instead of silently emitting unquoted identifiers. - MCP `execute_query`: strip trailing semicolons before appending `LIMIT/OFFSET`, fixing `syntax error at or near LIMIT` for queries like `select * from t;`. +- MCP `export_data`: tightened table name validation to reject double-dot, leading-dot, and trailing-dot identifiers (e.g. `schema..table`). `quoteQualifiedIdentifier` now rejects empty segments instead of producing `"schema".""."table"`. +- MCP `focus_query_tab`: re-validate that the resolved tab still belongs to the authorized connection between the auth check and the window raise, closing a TOCTOU window where a tab could be re-bound to a different connection. +- MCP pairing: cap pending exchange codes at 50 to prevent unbounded memory growth from repeated pairing attempts. ## [0.36.0] - 2026-04-27 diff --git a/TablePro/Core/MCP/MCPPairingService.swift b/TablePro/Core/MCP/MCPPairingService.swift index c486180f2..3201bf579 100644 --- a/TablePro/Core/MCP/MCPPairingService.swift +++ b/TablePro/Core/MCP/MCPPairingService.swift @@ -16,14 +16,20 @@ struct PairingExchangeRecord: Sendable, Equatable { final class PairingExchangeStore: @unchecked Sendable { static let exchangeWindow: TimeInterval = 300 + static let maxPendingCodes = 50 private let lock = NSLock() private var pending: [String: PairingExchangeRecord] = [:] - func insert(code: String, record: PairingExchangeRecord) { + func insert(code: String, record: PairingExchangeRecord) throws { lock.lock() defer { lock.unlock() } prune(now: Date.now) + guard pending.count < Self.maxPendingCodes else { + throw MCPError.forbidden( + String(localized: "Too many pending pairing codes. Try again later.") + ) + } pending[code] = record } @@ -131,14 +137,19 @@ final class MCPPairingService { ) let code = UUID().uuidString - store.insert( - code: code, - record: PairingExchangeRecord( - plaintextToken: result.plaintext, - challenge: request.challenge, - expiresAt: Date.now.addingTimeInterval(PairingExchangeStore.exchangeWindow) + do { + try store.insert( + code: code, + record: PairingExchangeRecord( + plaintextToken: result.plaintext, + challenge: request.challenge, + expiresAt: Date.now.addingTimeInterval(PairingExchangeStore.exchangeWindow) + ) ) - ) + } catch { + await tokenStore.delete(tokenId: result.token.id) + throw error + } guard let redirect = buildRedirectURL(base: request.redirectURL, code: code) else { Self.logger.error("Failed to build pairing redirect URL") diff --git a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift index 9ba7923d1..73ebad5e3 100644 --- a/TablePro/Core/MCP/MCPToolHandler+Integrations.swift +++ b/TablePro/Core/MCP/MCPToolHandler+Integrations.swift @@ -218,6 +218,7 @@ extension MCPToolHandler { let raised = await MainActor.run { () -> Bool in for snapshot in Self.collectTabSnapshots() where snapshot.tabId == tabId { + guard snapshot.connectionId == connectionId else { return false } guard let window = snapshot.window else { return false } NSApp.activate(ignoringOtherApps: true) window.makeKeyAndOrderFront(nil) diff --git a/TablePro/Core/MCP/MCPToolHandler.swift b/TablePro/Core/MCP/MCPToolHandler.swift index 3e1c9a77d..8fa342cae 100644 --- a/TablePro/Core/MCP/MCPToolHandler.swift +++ b/TablePro/Core/MCP/MCPToolHandler.swift @@ -437,7 +437,7 @@ final class MCPToolHandler: Sendable { } else if let tables { let quoteIdentifier = Self.identifierQuoter(for: databaseType) for table in tables { - let quoted = Self.quoteQualifiedIdentifier(table, quoter: quoteIdentifier) + let quoted = try Self.quoteQualifiedIdentifier(table, quoter: quoteIdentifier) let sql = "SELECT * FROM \(quoted) LIMIT \(maxRows)" try await authPolicy.checkSafeModeDialog( sql: sql, @@ -653,7 +653,7 @@ final class MCPToolHandler: Sendable { } static func validateExportTableName(_ table: String) throws { - let pattern = "^[A-Za-z0-9_][A-Za-z0-9_.]*$" + let pattern = "^[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)*$" guard table.range(of: pattern, options: .regularExpression) != nil else { throw MCPError.invalidParams( "Invalid table name: '\(table)'. Allowed characters: letters, digits, underscore, and '.' for schema-qualified names." @@ -668,10 +668,14 @@ final class MCPToolHandler: Sendable { return { "\"\($0.replacingOccurrences(of: "\"", with: "\"\""))\"" } } - static func quoteQualifiedIdentifier(_ identifier: String, quoter: (String) -> String) -> String { - identifier.split(separator: ".", omittingEmptySubsequences: false) - .map { quoter(String($0)) } - .joined(separator: ".") + static func quoteQualifiedIdentifier(_ identifier: String, quoter: (String) -> String) throws -> String { + let segments = identifier.split(separator: ".", omittingEmptySubsequences: true) + guard !segments.isEmpty, segments.count == identifier.split(separator: ".", omittingEmptySubsequences: false).count else { + throw MCPError.invalidParams( + "Invalid qualified identifier: '\(identifier)'. Empty components are not allowed." + ) + } + return segments.map { quoter(String($0)) }.joined(separator: ".") } static func sandboxedDownloadsURL(for path: String) throws -> URL { diff --git a/TableProTests/Core/MCP/MCPPairingServiceTests.swift b/TableProTests/Core/MCP/MCPPairingServiceTests.swift index d0d58529a..725508f9e 100644 --- a/TableProTests/Core/MCP/MCPPairingServiceTests.swift +++ b/TableProTests/Core/MCP/MCPPairingServiceTests.swift @@ -27,7 +27,7 @@ struct MCPPairingServiceTests { let verifier = "test-verifier-1" let challenge = base64UrlSha256(of: verifier) let store = makeStore() - store.insert(code: "code-1", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + try store.insert(code: "code-1", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) let token = try store.consume(code: "code-1", verifier: verifier) @@ -39,7 +39,7 @@ struct MCPPairingServiceTests { let verifier = "test-verifier-2" let challenge = base64UrlSha256(of: verifier) let store = makeStore() - store.insert(code: "code-2", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + try store.insert(code: "code-2", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) _ = try store.consume(code: "code-2", verifier: verifier) @@ -51,7 +51,7 @@ struct MCPPairingServiceTests { let verifier = "test-verifier-3" let challenge = base64UrlSha256(of: verifier) let store = makeStore() - store.insert(code: "code-3", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + try store.insert(code: "code-3", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) _ = try store.consume(code: "code-3", verifier: verifier) @@ -78,11 +78,11 @@ struct MCPPairingServiceTests { } @Test("consume returns expired when entry has expired") - func consumeExpiredEntryReturnsExpired() { + func consumeExpiredEntryReturnsExpired() throws { let verifier = "test-verifier-4" let challenge = base64UrlSha256(of: verifier) let store = makeStore() - store.insert(code: "code-4", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) + try store.insert(code: "code-4", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) do { _ = try store.consume(code: "code-4", verifier: verifier, now: Date.now) @@ -98,10 +98,10 @@ struct MCPPairingServiceTests { } @Test("consume returns forbidden when challenge does not match the verifier") - func consumeMismatchedChallengeReturnsForbidden() { + func consumeMismatchedChallengeReturnsForbidden() throws { let store = makeStore() let challenge = base64UrlSha256(of: "intended-verifier") - store.insert(code: "code-5", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) + try store.insert(code: "code-5", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: 60)) do { _ = try store.consume(code: "code-5", verifier: "attacker-verifier") @@ -117,11 +117,11 @@ struct MCPPairingServiceTests { } @Test("consume on expired code removes the entry") - func consumeOnExpiredCodeRemovesEntry() { + func consumeOnExpiredCodeRemovesEntry() throws { let verifier = "test-verifier-6" let challenge = base64UrlSha256(of: verifier) let store = makeStore() - store.insert(code: "code-6", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) + try store.insert(code: "code-6", record: record(plaintext: "tp_secret", challenge: challenge, expiresIn: -1)) _ = try? store.consume(code: "code-6", verifier: verifier) @@ -129,17 +129,17 @@ struct MCPPairingServiceTests { } @Test("pruneExpired removes only expired entries") - func pruneRemovesOnlyExpiredEntries() { + func pruneRemovesOnlyExpiredEntries() throws { let store = makeStore() - store.insert( + try store.insert( code: "alive", record: record(plaintext: "tp_a", challenge: "challenge", expiresIn: 60) ) - store.insert( + try store.insert( code: "stale-1", record: record(plaintext: "tp_b", challenge: "challenge", expiresIn: -1) ) - store.insert( + try store.insert( code: "stale-2", record: record(plaintext: "tp_c", challenge: "challenge", expiresIn: -10) ) @@ -178,4 +178,33 @@ struct MCPPairingServiceTests { func constantTimeEqualLengthMismatch() { #expect(PairingExchangeStore.constantTimeEqual("abc", "abcd") == false) } + + @Test("insert throws after maxPendingCodes consecutive inserts") + func insertThrowsWhenPendingCapReached() throws { + let store = makeStore() + for index in 0.. String = { "\"\($0)\"" } + do { + _ = try MCPToolHandler.quoteQualifiedIdentifier("schema..table", quoter: quoter) + Issue.record("Expected throw for empty component in qualified identifier") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("quoteQualifiedIdentifier throws on leading dot") + func quoteThrowsOnLeadingDot() { + let quoter: (String) -> String = { "\"\($0)\"" } + do { + _ = try MCPToolHandler.quoteQualifiedIdentifier(".table", quoter: quoter) + Issue.record("Expected throw for leading-dot identifier") + } catch let error as MCPError { + if case .invalidParams = error { return } + Issue.record("Expected invalidParams, got \(error)") + } catch { + Issue.record("Expected MCPError, got \(error)") + } + } + + @Test("quoteQualifiedIdentifier quotes each segment for valid identifiers") + func quoteQuotesValidSegments() throws { + let quoter: (String) -> String = { "\"\($0)\"" } + let result = try MCPToolHandler.quoteQualifiedIdentifier("public.users", quoter: quoter) + #expect(result == "\"public\".\"users\"") + } +} From d72b48b0ef4d3ded83899459dc58e03142c5760b Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:54:02 +0700 Subject: [PATCH 72/83] feat(integrations): extract shared status indicator, copyable code block, client enum --- .../Components/CopyableCodeBlock.swift | 34 +++++++ .../Components/IntegrationClient.swift | 17 ++++ .../IntegrationStatusIndicator.swift | 98 +++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 TablePro/Views/Settings/Components/CopyableCodeBlock.swift create mode 100644 TablePro/Views/Settings/Components/IntegrationClient.swift create mode 100644 TablePro/Views/Settings/Components/IntegrationStatusIndicator.swift diff --git a/TablePro/Views/Settings/Components/CopyableCodeBlock.swift b/TablePro/Views/Settings/Components/CopyableCodeBlock.swift new file mode 100644 index 000000000..5e54b7deb --- /dev/null +++ b/TablePro/Views/Settings/Components/CopyableCodeBlock.swift @@ -0,0 +1,34 @@ +import AppKit +import SwiftUI + +struct CopyableCodeBlock: View { + let text: String + @State private var copied = false + + var body: some View { + HStack(alignment: .top) { + Text(text) + .font(.system(.caption, design: .monospaced)) + .textSelection(.enabled) + .padding(8) + .frame(maxWidth: .infinity, alignment: .leading) + .background(.quaternary) + .clipShape(RoundedRectangle(cornerRadius: 6)) + + Button { + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(text, forType: .string) + copied = true + Task { @MainActor in + try? await Task.sleep(for: .seconds(1.5)) + copied = false + } + } label: { + Image(systemName: copied ? "checkmark" : "doc.on.doc") + .contentTransition(.symbolEffect(.replace)) + } + .accessibilityLabel(String(localized: "Copy")) + .help(String(localized: "Copy to clipboard")) + } + } +} diff --git a/TablePro/Views/Settings/Components/IntegrationClient.swift b/TablePro/Views/Settings/Components/IntegrationClient.swift new file mode 100644 index 000000000..9c8aeabf4 --- /dev/null +++ b/TablePro/Views/Settings/Components/IntegrationClient.swift @@ -0,0 +1,17 @@ +import Foundation + +enum IntegrationClient: String, CaseIterable, Identifiable, Sendable { + case claudeCode + case claudeDesktop + case cursor + + var id: String { rawValue } + + var displayName: String { + switch self { + case .claudeCode: return String(localized: "Claude Code") + case .claudeDesktop: return String(localized: "Claude Desktop") + case .cursor: return String(localized: "Cursor") + } + } +} diff --git a/TablePro/Views/Settings/Components/IntegrationStatusIndicator.swift b/TablePro/Views/Settings/Components/IntegrationStatusIndicator.swift new file mode 100644 index 000000000..f9b7533c4 --- /dev/null +++ b/TablePro/Views/Settings/Components/IntegrationStatusIndicator.swift @@ -0,0 +1,98 @@ +import AppKit +import SwiftUI + +enum IntegrationStatus: Equatable { + case running + case stopped + case starting + case failed + case success + case error + case warning + case expired + case revoked + case active +} + +struct IntegrationStatusIndicator: View { + let status: IntegrationStatus + var label: String? + + var body: some View { + HStack(spacing: 6) { + Image(systemName: symbolName) + .symbolRenderingMode(.hierarchical) + .foregroundStyle(tint) + .imageScale(.small) + .accessibilityHidden(true) + if let label { + Text(label) + .foregroundStyle(.secondary) + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilityDescription) + } + + private var symbolName: String { + switch status { + case .running, .success, .active: + return "checkmark.circle.fill" + case .stopped: + return "stop.circle.fill" + case .starting: + return "clock.fill" + case .failed, .error, .revoked: + return "xmark.circle.fill" + case .warning: + return "exclamationmark.triangle.fill" + case .expired: + return "clock.badge.exclamationmark.fill" + } + } + + private var tint: Color { + switch status { + case .running, .success, .active: + return Color(nsColor: .systemGreen) + case .stopped: + return Color(nsColor: .secondaryLabelColor) + case .starting: + return Color(nsColor: .systemOrange) + case .failed, .error: + return Color(nsColor: .systemRed) + case .warning, .expired: + return Color(nsColor: .systemOrange) + case .revoked: + return Color(nsColor: .systemRed) + } + } + + var accessibilityDescription: String { + let prefix: String + switch status { + case .running: + prefix = String(localized: "Status: running") + case .stopped: + prefix = String(localized: "Status: stopped") + case .starting: + prefix = String(localized: "Status: starting") + case .failed: + prefix = String(localized: "Status: failed") + case .success: + prefix = String(localized: "Status: success") + case .error: + prefix = String(localized: "Status: error") + case .warning: + prefix = String(localized: "Status: warning") + case .expired: + prefix = String(localized: "Status: expired") + case .revoked: + prefix = String(localized: "Status: revoked") + case .active: + prefix = String(localized: "Status: active") + } + guard let label, !label.isEmpty else { return prefix } + return String(format: String(localized: "%1$@, %2$@"), prefix, label) + } +} From b61ecc1f85e4c3ac86413efdec0be770dc5033ad Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:55:55 +0700 Subject: [PATCH 73/83] fix(integrations): pairing approval default action and expiry countdown --- TablePro/Core/Utilities/UI/AlertHelper.swift | 2 + .../Sections/MCPTokenCreateSheet.swift | 44 +++--- .../Sections/MCPTokenRevealSheet.swift | 125 ++++-------------- .../Sections/PairingApprovalSheet.swift | 106 ++++++++++++--- 4 files changed, 135 insertions(+), 142 deletions(-) diff --git a/TablePro/Core/Utilities/UI/AlertHelper.swift b/TablePro/Core/Utilities/UI/AlertHelper.swift index c1a43c226..e761369e9 100644 --- a/TablePro/Core/Utilities/UI/AlertHelper.swift +++ b/TablePro/Core/Utilities/UI/AlertHelper.swift @@ -85,9 +85,11 @@ final class AlertHelper { static func runPairingApproval(request: PairingRequest) async throws -> PairingApproval { try await withCheckedThrowingContinuation { continuation in var deliver: ((Result) -> Void)? + let codeExpiresAt = Date.now.addingTimeInterval(PairingExchangeStore.exchangeWindow) let host = NSHostingController( rootView: PairingApprovalSheet( request: request, + codeExpiresAt: codeExpiresAt, onComplete: { result in deliver?(result) } ) ) diff --git a/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift b/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift index 80356562b..3012a476e 100644 --- a/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift +++ b/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift @@ -1,8 +1,3 @@ -// -// MCPTokenCreateSheet.swift -// TablePro -// - import SwiftUI struct MCPTokenCreateSheet: View { @@ -33,23 +28,21 @@ struct MCPTokenCreateSheet: View { actionBar .padding() } - .frame(width: 480, height: 520) + .frame(width: 480, minHeight: 520) .task { connections = ConnectionStorage.shared.loadConnections() } } - // MARK: - Sections - private var nameSection: some View { - Section("Token Name") { - TextField("e.g., Claude Code on VPS", text: $tokenName) + Section(String(localized: "Token Name")) { + TextField(String(localized: "e.g., Claude Code on VPS"), text: $tokenName) } } private var permissionsSection: some View { - Section("Permission Level") { - Picker("Permission", selection: $permissions) { + Section(String(localized: "Permission Level")) { + Picker(String(localized: "Permission"), selection: $permissions) { ForEach(TokenPermissions.allCases) { permission in Text(permission.displayName).tag(permission) } @@ -60,10 +53,10 @@ struct MCPTokenCreateSheet: View { } private var connectionAccessSection: some View { - Section("Connection Access") { - Picker("Access", selection: $connectionAccess) { - Text("All Connections").tag(ConnectionAccessMode.all) - Text("Select Connections").tag(ConnectionAccessMode.selected) + Section(String(localized: "Connection Access")) { + Picker(String(localized: "Access"), selection: $connectionAccess) { + Text(String(localized: "All Connections")).tag(ConnectionAccessMode.all) + Text(String(localized: "Select Connections")).tag(ConnectionAccessMode.selected) } .labelsHidden() @@ -76,7 +69,7 @@ struct MCPTokenCreateSheet: View { @ViewBuilder private var connectionList: some View { if connections.isEmpty { - Text("No saved connections") + Text(String(localized: "No saved connections")) .foregroundStyle(.secondary) } else { ForEach(connections) { connection in @@ -94,8 +87,8 @@ struct MCPTokenCreateSheet: View { } private var expirationSection: some View { - Section("Expiration") { - Picker("Expires", selection: $expirationOption) { + Section(String(localized: "Expiration")) { + Picker(String(localized: "Expires"), selection: $expirationOption) { ForEach(ExpirationOption.allCases) { option in Text(option.displayName).tag(option) } @@ -104,7 +97,7 @@ struct MCPTokenCreateSheet: View { if expirationOption == .custom { DatePicker( - "Expiration date", + String(localized: "Expiration date"), selection: $customExpirationDate, in: Date.now..., displayedComponents: .date @@ -115,24 +108,23 @@ struct MCPTokenCreateSheet: View { private var actionBar: some View { HStack { - Button("Cancel", role: .cancel) { + Button(String(localized: "Cancel"), role: .cancel) { dismiss() } .keyboardShortcut(.cancelAction) Spacer() - Button("Generate") { + Button(String(localized: "Generate")) { let connectionIds: Set? = connectionAccess == .selected ? selectedConnectionIds : nil onGenerate(tokenName, permissions, connectionIds, resolvedExpirationDate) } .keyboardShortcut(.defaultAction) - .disabled(tokenName.trimmingCharacters(in: .whitespaces).isEmpty || (connectionAccess == .selected && selectedConnectionIds.isEmpty)) + .disabled(tokenName.trimmingCharacters(in: .whitespaces).isEmpty + || (connectionAccess == .selected && selectedConnectionIds.isEmpty)) } } - // MARK: - Helpers - private func connectionBinding(for id: UUID) -> Binding { Binding( get: { selectedConnectionIds.contains(id) }, @@ -157,8 +149,6 @@ struct MCPTokenCreateSheet: View { } } -// MARK: - Supporting Types - private enum ConnectionAccessMode: String, Identifiable { case all case selected diff --git a/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift b/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift index 443212f8a..cc91fd51a 100644 --- a/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift +++ b/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift @@ -1,8 +1,3 @@ -// -// MCPTokenRevealSheet.swift -// TablePro -// - import AppKit import SwiftUI @@ -15,7 +10,7 @@ struct MCPTokenRevealSheet: View { @State private var isTokenRevealed = false @State private var tokenCopied = false - @State private var selectedClient: MCPSetupClient = .claudeCode + @State private var selectedClient: IntegrationClient = .claudeCode var body: some View { VStack(spacing: 0) { @@ -32,35 +27,35 @@ struct MCPTokenRevealSheet: View { HStack { Spacer() - Button("Done") { dismiss() } + Button(String(localized: "Done")) { dismiss() } .keyboardShortcut(.defaultAction) } .padding() } - .frame(width: 540, height: 520) + .frame(width: 540, minHeight: 520) } - // MARK: - Warning Banner - private var warningBanner: some View { Label { - Text("This token will not be shown again") + Text(String(localized: "This token will not be shown again")) .fontWeight(.medium) } icon: { Image(systemName: "exclamationmark.triangle.fill") + .foregroundStyle(Color(nsColor: .systemOrange)) } - .foregroundStyle(Color(nsColor: .systemOrange)) .padding(12) .frame(maxWidth: .infinity, alignment: .leading) - .background(Color(nsColor: .systemOrange).opacity(0.1)) + .background(.thinMaterial) + .overlay( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(Color(nsColor: .systemOrange), lineWidth: 1) + ) .clipShape(RoundedRectangle(cornerRadius: 8)) } - // MARK: - Token Display - private var tokenDisplay: some View { VStack(alignment: .leading, spacing: 8) { - Text("Token") + Text(String(localized: "Token")) .font(.headline) HStack(spacing: 8) { @@ -77,7 +72,12 @@ struct MCPTokenRevealSheet: View { } label: { Image(systemName: isTokenRevealed ? "eye.slash" : "eye") } - .help(isTokenRevealed ? String(localized: "Hide token") : String(localized: "Reveal token")) + .accessibilityLabel(isTokenRevealed + ? String(localized: "Hide token") + : String(localized: "Reveal token")) + .help(isTokenRevealed + ? String(localized: "Hide token") + : String(localized: "Reveal token")) } .padding(10) .background(.quaternary) @@ -94,10 +94,13 @@ struct MCPTokenRevealSheet: View { HStack(spacing: 4) { Image(systemName: tokenCopied ? "checkmark" : "doc.on.doc") .contentTransition(.symbolEffect(.replace)) - Text(tokenCopied ? "Copied" : "Copy Token") + Text(tokenCopied + ? String(localized: "Copied") + : String(localized: "Copy Token")) } } .buttonStyle(.borderedProminent) + .accessibilityLabel(String(localized: "Copy token")) } } @@ -105,56 +108,33 @@ struct MCPTokenRevealSheet: View { String(plaintext.prefix(8)) + String(repeating: "\u{2022}", count: 24) } - // MARK: - Setup Instructions - private var setupInstructions: some View { VStack(alignment: .leading, spacing: 12) { - Text("Setup Instructions") + Text(String(localized: "Setup Instructions")) .font(.headline) - Picker("Client", selection: $selectedClient) { - ForEach(MCPSetupClient.allCases) { client in + Picker(String(localized: "Client"), selection: $selectedClient) { + ForEach(IntegrationClient.allCases) { client in Text(client.displayName).tag(client) } } .labelsHidden() .pickerStyle(.segmented) - snippetView(for: selectedClient) + CopyableCodeBlock(text: configSnippet(for: selectedClient)) } } - @ViewBuilder - private func snippetView(for client: MCPSetupClient) -> some View { - let snippet = configSnippet(for: client) - MCPCopyableCodeBlock(text: snippet) - } - - // MARK: - Config Snippets - private var baseURL: String { let scheme = allowRemoteConnections ? "https" : "http" return "\(scheme)://127.0.0.1:\(port)/mcp" } - private func configSnippet(for client: MCPSetupClient) -> String { + private func configSnippet(for client: IntegrationClient) -> String { switch client { case .claudeCode: return "claude mcp add tablepro --transport http \(baseURL) --header \"Authorization: Bearer \(plaintext)\"" - case .claudeDesktop: - return """ - { - "mcpServers": { - "tablepro": { - "url": "\(baseURL)", - "headers": { - "Authorization": "Bearer \(plaintext)" - } - } - } - } - """ - case .cursor: + case .claudeDesktop, .cursor: return """ { "mcpServers": { @@ -175,54 +155,3 @@ struct MCPTokenRevealSheet: View { NSPasteboard.general.setString(text, forType: .string) } } - -// MARK: - Setup Client - -private enum MCPSetupClient: String, CaseIterable, Identifiable { - case claudeCode - case claudeDesktop - case cursor - - var id: String { rawValue } - - var displayName: String { - switch self { - case .claudeCode: "Claude Code" - case .claudeDesktop: "Claude Desktop" - case .cursor: "Cursor" - } - } -} - -// MARK: - Copyable Code Block - -private struct MCPCopyableCodeBlock: View { - let text: String - @State private var copied = false - - var body: some View { - HStack(alignment: .top) { - Text(text) - .font(.system(.caption, design: .monospaced)) - .textSelection(.enabled) - .padding(8) - .frame(maxWidth: .infinity, alignment: .leading) - .background(.quaternary) - .clipShape(RoundedRectangle(cornerRadius: 6)) - - Button { - NSPasteboard.general.clearContents() - NSPasteboard.general.setString(text, forType: .string) - copied = true - Task { @MainActor in - try? await Task.sleep(for: .seconds(1.5)) - copied = false - } - } label: { - Image(systemName: copied ? "checkmark" : "doc.on.doc") - .contentTransition(.symbolEffect(.replace)) - } - .help(String(localized: "Copy to clipboard")) - } - } -} diff --git a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift index e82d00e7f..bbb8176ef 100644 --- a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift +++ b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift @@ -1,8 +1,3 @@ -// -// PairingApprovalSheet.swift -// TablePro -// - import SwiftUI struct PairingApproval: Sendable { @@ -13,6 +8,7 @@ struct PairingApproval: Sendable { struct PairingApprovalSheet: View { let request: PairingRequest + let codeExpiresAt: Date let onComplete: (Result) -> Void @State private var permissions: TokenPermissions @@ -20,9 +16,18 @@ struct PairingApprovalSheet: View { @State private var selectedConnectionIds: Set = [] @State private var expiry: ExpiryOption = .never @State private var connections: [DatabaseConnection] = [] + @State private var connectionSearch: String = "" + @State private var now: Date = .now + + private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() - init(request: PairingRequest, onComplete: @escaping (Result) -> Void) { + init( + request: PairingRequest, + codeExpiresAt: Date, + onComplete: @escaping (Result) -> Void + ) { self.request = request + self.codeExpiresAt = codeExpiresAt self.onComplete = onComplete let initialPermissions = Self.initialPermissions(from: request) _permissions = State(initialValue: initialPermissions) @@ -47,13 +52,16 @@ struct PairingApprovalSheet: View { Divider() actionBar.padding() } - .frame(width: 520, height: 560) + .frame(width: 520, minHeight: 560) .task { connections = ConnectionStorage.shared.loadConnections() if connectionAccess == .all { selectedConnectionIds = Set(connections.map(\.id)) } } + .onReceive(timer) { value in + now = value + } } private var header: some View { @@ -63,11 +71,42 @@ struct PairingApprovalSheet: View { Text(String(localized: "An external app is asking for an API token. Review the permissions before approving.")) .font(.callout) .foregroundStyle(.secondary) + countdownLabel } .frame(maxWidth: .infinity, alignment: .leading) .padding() } + private var countdownLabel: some View { + HStack(spacing: 6) { + Image(systemName: isExpired ? "clock.badge.exclamationmark.fill" : "clock") + .foregroundStyle(isExpired ? Color(nsColor: .systemRed) : Color(nsColor: .secondaryLabelColor)) + .imageScale(.small) + .accessibilityHidden(true) + Text(countdownText) + .font(.caption) + .monospacedDigit() + .foregroundStyle(isExpired ? Color(nsColor: .systemRed) : .secondary) + .contentTransition(.numericText()) + } + } + + private var remainingSeconds: Int { + let interval = codeExpiresAt.timeIntervalSince(now) + return max(0, Int(interval.rounded(.up))) + } + + private var isExpired: Bool { + remainingSeconds <= 0 + } + + private var countdownText: String { + if isExpired { + return String(localized: "Code expired") + } + return String(format: String(localized: "Code expires in %d seconds"), remainingSeconds) + } + private var permissionsSection: some View { Section(String(localized: "Permission Level")) { Picker(String(localized: "Permission"), selection: $permissions) { @@ -111,17 +150,45 @@ struct PairingApprovalSheet: View { Text(String(localized: "No saved connections")) .foregroundStyle(.secondary) } else { - ForEach(connections) { connection in - Toggle(isOn: connectionBinding(for: connection.id)) { - HStack(spacing: 6) { - Text(connection.name) - Text(connection.type.displayName) - .font(.caption) - .foregroundStyle(.secondary) + HStack { + TextField(String(localized: "Search connections"), text: $connectionSearch) + .textFieldStyle(.roundedBorder) + Spacer() + Button(String(localized: "Select All")) { + selectedConnectionIds.formUnion(filteredConnections.map(\.id)) + } + Button(String(localized: "Deselect All")) { + selectedConnectionIds.subtract(filteredConnections.map(\.id)) + } + } + + ScrollView { + VStack(alignment: .leading, spacing: 0) { + ForEach(filteredConnections) { connection in + Toggle(isOn: connectionBinding(for: connection.id)) { + HStack(spacing: 6) { + Text(connection.name) + Text(connection.type.displayName) + .font(.caption) + .foregroundStyle(.secondary) + } + } + .toggleStyle(.checkbox) + .padding(.vertical, 2) } } - .toggleStyle(.checkbox) } + .frame(maxHeight: 200) + } + } + + private var filteredConnections: [DatabaseConnection] { + let trimmed = connectionSearch.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return connections } + let lowercased = trimmed.lowercased() + return connections.filter { connection in + connection.name.lowercased().contains(lowercased) + || connection.type.displayName.lowercased().contains(lowercased) } } @@ -153,11 +220,16 @@ struct PairingApprovalSheet: View { ) onComplete(.success(approval)) } - .keyboardShortcut(.defaultAction) - .disabled(connectionAccess == .selected && selectedConnectionIds.isEmpty) + .disabled(approveDisabled) } } + private var approveDisabled: Bool { + if isExpired { return true } + if connectionAccess == .selected && selectedConnectionIds.isEmpty { return true } + return false + } + private func connectionBinding(for id: UUID) -> Binding { Binding( get: { selectedConnectionIds.contains(id) }, From 733a8d58497ba3d83886d091f6217201561701d8 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:58:42 +0700 Subject: [PATCH 74/83] fix(integrations): require confirmation for token delete and disconnect --- .../Settings/Sections/MCPTokenListView.swift | 191 ++++++++++++------ 1 file changed, 124 insertions(+), 67 deletions(-) diff --git a/TablePro/Views/Settings/Sections/MCPTokenListView.swift b/TablePro/Views/Settings/Sections/MCPTokenListView.swift index 78112e7ba..246e189bc 100644 --- a/TablePro/Views/Settings/Sections/MCPTokenListView.swift +++ b/TablePro/Views/Settings/Sections/MCPTokenListView.swift @@ -1,8 +1,4 @@ -// -// MCPTokenListView.swift -// TablePro -// - +import AppKit import SwiftUI struct MCPTokenListView: View { @@ -11,30 +7,119 @@ struct MCPTokenListView: View { let onRevoke: (UUID) -> Void let onDelete: (UUID) -> Void + @State private var selection: Set = [] + @State private var deleteCandidate: MCPAuthToken? + var body: some View { - if tokens.isEmpty { - Text("No tokens created") + VStack(alignment: .leading, spacing: 8) { + if tokens.isEmpty { + emptyState + } else { + List(selection: $selection) { + ForEach(tokens) { token in + MCPTokenRow(token: token) + .tag(token.id) + .contextMenu { + contextMenu(for: token) + } + } + } + .frame(minHeight: 160) + .onDeleteCommand(perform: deleteSelectionFromKeyboard) + } + + HStack(spacing: 8) { + Button { + onGenerate() + } label: { + Label(String(localized: "Generate Token"), systemImage: "plus") + } + .buttonStyle(.borderedProminent) + .accessibilityLabel(String(localized: "Generate token")) + + Spacer() + } + } + .alert(deleteAlertTitle, isPresented: deleteAlertBinding, presenting: deleteCandidate) { token in + Button(String(localized: "Cancel"), role: .cancel) { + deleteCandidate = nil + } + Button(String(localized: "Delete"), role: .destructive) { + onDelete(token.id) + selection.remove(token.id) + deleteCandidate = nil + } + } message: { token in + Text(String(format: String(localized: "“%@” will be permanently deleted. External clients using this token will lose access immediately."), token.name)) + } + } + + private var emptyState: some View { + VStack(spacing: 8) { + Image(systemName: "key") + .font(.system(size: 28)) + .foregroundStyle(.tertiary) + Text(String(localized: "No tokens created")) .foregroundStyle(.secondary) - } else { - ForEach(tokens) { token in - MCPTokenRow( - token: token, - onRevoke: { onRevoke(token.id) }, - onDelete: { onDelete(token.id) } - ) + Text(String(localized: "Generate a token so external clients can connect with their own credentials.")) + .font(.caption) + .foregroundStyle(.tertiary) + .multilineTextAlignment(.center) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 24) + } + + @ViewBuilder + private func contextMenu(for token: MCPAuthToken) -> some View { + if token.isActive { + Button(role: .destructive) { + onRevoke(token.id) + } label: { + Label(String(localized: "Revoke"), systemImage: "xmark.circle") } } + Button { + copyTokenId(token.id) + } label: { + Label(String(localized: "Copy ID"), systemImage: "doc.on.doc") + } + Divider() + Button(role: .destructive) { + deleteCandidate = token + } label: { + Label(String(localized: "Delete…"), systemImage: "trash") + } + } - Button("Generate New Token", action: onGenerate) + private func deleteSelectionFromKeyboard() { + guard let id = selection.first, let token = tokens.first(where: { $0.id == id }) else { return } + deleteCandidate = token + } + + private func copyTokenId(_ id: UUID) { + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(id.uuidString, forType: .string) } -} -// MARK: - Token Row + private var deleteAlertTitle: String { + String(localized: "Delete token?") + } + + private var deleteAlertBinding: Binding { + Binding( + get: { deleteCandidate != nil }, + set: { isPresented in + if !isPresented { + deleteCandidate = nil + } + } + ) + } +} private struct MCPTokenRow: View { let token: MCPAuthToken - let onRevoke: () -> Void - let onDelete: () -> Void var body: some View { HStack(spacing: 10) { @@ -56,7 +141,7 @@ private struct MCPTokenRow: View { .font(.system(.caption, design: .monospaced)) .foregroundStyle(.secondary) - lastUsedText + Text(lastUsedText) .font(.caption) .foregroundStyle(.tertiary) } @@ -64,63 +149,35 @@ private struct MCPTokenRow: View { Spacer() - statusIndicator - - contextMenuButton + IntegrationStatusIndicator(status: tokenStatus) + .help(tokenStatus == .active + ? String(localized: "Active") + : tokenStatus == .expired + ? String(localized: "Expired") + : String(localized: "Revoked")) } + .padding(.vertical, 2) } - private var statusIndicator: some View { - Circle() - .fill(token.isEffectivelyActive ? .green : .red) - .frame(width: 8, height: 8) - .help(statusHelpText) - } - - private var statusHelpText: String { - if token.isExpired { - return String(localized: "Expired") - } - return token.isActive ? String(localized: "Active") : String(localized: "Revoked") + private var tokenStatus: IntegrationStatus { + if token.isExpired { return .expired } + return token.isActive ? .active : .revoked } - private var lastUsedText: some View { - Group { - if let lastUsed = token.lastUsedAt { - Text(lastUsed, style: .relative) + Text(" ago") - } else { - Text("Never used") - } + private var lastUsedText: String { + guard let lastUsed = token.lastUsedAt else { + return String(localized: "Never used") } + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .full + return formatter.localizedString(for: lastUsed, relativeTo: .now) } private var permissionColor: Color { switch token.permissions { - case .readOnly: .blue - case .readWrite: .orange - case .fullAccess: .red - } - } - - private var contextMenuButton: some View { - Menu { - if token.isActive { - Button(role: .destructive) { - onRevoke() - } label: { - Label("Deactivate", systemImage: "xmark.circle") - } - } - Button(role: .destructive) { - onDelete() - } label: { - Label("Delete", systemImage: "trash") - } - } label: { - Image(systemName: "ellipsis.circle") - .foregroundStyle(.secondary) + case .readOnly: Color(nsColor: .systemBlue) + case .readWrite: Color(nsColor: .systemOrange) + case .fullAccess: Color(nsColor: .systemRed) } - .menuStyle(.borderlessButton) - .frame(width: 24) } } From 4a4a8c84fc2e1bea8851eb73068862ef3d90e6fd Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:58:46 +0700 Subject: [PATCH 75/83] refactor(integrations): lift activity log out of form, add search and export --- TablePro/Views/Settings/MCPSettingsView.swift | 21 +- .../Settings/Sections/MCPAuditLogView.swift | 155 +++++++++++-- .../Views/Settings/Sections/MCPSection.swift | 213 +++++++----------- 3 files changed, 230 insertions(+), 159 deletions(-) diff --git a/TablePro/Views/Settings/MCPSettingsView.swift b/TablePro/Views/Settings/MCPSettingsView.swift index 8454ee834..e3c709599 100644 --- a/TablePro/Views/Settings/MCPSettingsView.swift +++ b/TablePro/Views/Settings/MCPSettingsView.swift @@ -1,14 +1,23 @@ -// -// MCPSettingsView.swift -// TablePro -// - import SwiftUI struct MCPSettingsView: View { @Binding var settings: MCPSettings var body: some View { + TabView { + settingsTab + .tabItem { + Label(String(localized: "Settings"), systemImage: "gearshape") + } + + MCPAuditLogView() + .tabItem { + Label(String(localized: "Activity Log"), systemImage: "list.bullet.rectangle") + } + } + } + + private var settingsTab: some View { Form { MCPSection(settings: $settings) } @@ -19,5 +28,5 @@ struct MCPSettingsView: View { #Preview { MCPSettingsView(settings: .constant(.default)) - .frame(width: 450, height: 500) + .frame(width: 520, height: 540) } diff --git a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift index 04b8f12e0..d8567eac1 100644 --- a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift +++ b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift @@ -1,16 +1,15 @@ -// -// MCPAuditLogView.swift -// TablePro -// - +import AppKit import SwiftUI +import UniformTypeIdentifiers struct MCPAuditLogView: View { @State private var entries: [AuditEntry] = [] @State private var tokens: [MCPAuthToken] = [] + @State private var connections: [DatabaseConnection] = [] @State private var selectedTokenId: UUID? @State private var selectedCategory: AuditCategory? @State private var selectedRange: TimeRangeOption = .last7Days + @State private var searchText: String = "" @State private var isLoading = false var body: some View { @@ -21,12 +20,25 @@ struct MCPAuditLogView: View { ProgressView() .frame(maxWidth: .infinity) .padding(.vertical, 24) - } else if entries.isEmpty { + } else if filteredEntries.isEmpty { emptyState } else { entryList } + + HStack { + Text(String(localized: "Activity is retained for 90 days.")) + .font(.caption) + .foregroundStyle(.secondary) + Spacer() + } } + .padding() + .searchable( + text: $searchText, + placement: .toolbar, + prompt: Text(String(localized: "Search activity")) + ) .task { await reload() } } @@ -63,11 +75,21 @@ struct MCPAuditLogView: View { Spacer() + Button { + exportCSV() + } label: { + Label(String(localized: "Export…"), systemImage: "square.and.arrow.up") + } + .accessibilityLabel(String(localized: "Export activity to CSV")) + .help(String(localized: "Export the filtered activity log to CSV")) + .disabled(filteredEntries.isEmpty) + Button { Task { await reload() } } label: { Image(systemName: "arrow.clockwise") } + .accessibilityLabel(String(localized: "Refresh")) .help(String(localized: "Refresh")) } .onChange(of: selectedTokenId) { _, _ in Task { await reload() } } @@ -88,13 +110,41 @@ struct MCPAuditLogView: View { } private var entryList: some View { - List(entries) { entry in - MCPAuditLogRow(entry: entry) + List(filteredEntries) { entry in + MCPAuditLogRow( + entry: entry, + connectionName: connectionName(for: entry.connectionId) + ) } .listStyle(.inset) .frame(minHeight: 240) } + private var filteredEntries: [AuditEntry] { + let trimmed = searchText.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return entries } + let needle = trimmed.lowercased() + return entries.filter { entry in + if entry.action.lowercased().contains(needle) { return true } + if let tokenName = entry.tokenName?.lowercased(), tokenName.contains(needle) { return true } + if let connectionName = connectionName(for: entry.connectionId)?.lowercased(), + connectionName.contains(needle) { + return true + } + if let details = entry.details?.lowercased(), details.contains(needle) { return true } + return false + } + } + + private func connectionName(for id: UUID?) -> String? { + guard let id else { return nil } + if let connection = connections.first(where: { $0.id == id }) { + return connection.name + } + let prefix = id.uuidString.prefix(8) + return String(format: String(localized: "Deleted connection (%@)"), String(prefix)) + } + private func reload() async { isLoading = true defer { isLoading = false } @@ -103,6 +153,7 @@ struct MCPAuditLogView: View { if let store { tokens = await store.list().filter { $0.name != "__stdio_bridge__" } } + connections = ConnectionStorage.shared.loadConnections() let since = selectedRange.startDate let category = selectedCategory @@ -115,14 +166,78 @@ struct MCPAuditLogView: View { ) entries = result } + + private func exportCSV() { + let panel = NSSavePanel() + panel.allowedContentTypes = [.commaSeparatedText] + panel.nameFieldStringValue = "tablepro-activity-\(Self.fileTimestamp()).csv" + panel.canCreateDirectories = true + panel.title = String(localized: "Export Activity Log") + + let response = panel.runModal() + guard response == .OK, let url = panel.url else { return } + + let csv = csvString(for: filteredEntries) + do { + try csv.write(to: url, atomically: true, encoding: .utf8) + } catch { + let alert = NSAlert() + alert.messageText = String(localized: "Could not export activity log") + alert.informativeText = error.localizedDescription + alert.alertStyle = .warning + alert.addButton(withTitle: String(localized: "OK")) + alert.runModal() + } + } + + private func csvString(for entries: [AuditEntry]) -> String { + let header = [ + "Timestamp", + "Category", + "Action", + "Connection", + "Token", + "Outcome", + "Details" + ].joined(separator: ",") + let rows = entries.map { entry -> String in + let timestamp = ISO8601DateFormatter().string(from: entry.timestamp) + let cells = [ + timestamp, + entry.category.rawValue, + entry.action, + connectionName(for: entry.connectionId) ?? "", + entry.tokenName ?? "", + entry.outcome, + entry.details ?? "" + ] + return cells.map(Self.escapeCSV).joined(separator: ",") + } + return ([header] + rows).joined(separator: "\n") + "\n" + } + + private static func escapeCSV(_ value: String) -> String { + let needsQuotes = value.contains(",") || value.contains("\"") || value.contains("\n") || value.contains("\r") + guard needsQuotes else { return value } + let escaped = value.replacingOccurrences(of: "\"", with: "\"\"") + return "\"\(escaped)\"" + } + + private static func fileTimestamp() -> String { + let formatter = DateFormatter() + formatter.dateFormat = "yyyyMMdd-HHmmss" + return formatter.string(from: .now) + } } private struct MCPAuditLogRow: View { let entry: AuditEntry + let connectionName: String? var body: some View { HStack(alignment: .top, spacing: 10) { - outcomeBadge + IntegrationStatusIndicator(status: outcomeStatus) + .padding(.top, 2) VStack(alignment: .leading, spacing: 4) { HStack(spacing: 6) { Text(entry.action) @@ -136,8 +251,8 @@ private struct MCPAuditLogRow: View { .font(.caption) .foregroundStyle(.secondary) } - if let connectionId = entry.connectionId { - Text(String(format: String(localized: "Connection: %@"), connectionId.uuidString.prefix(8) + "…")) + if let connectionName { + Text(String(format: String(localized: "Connection: %@"), connectionName)) .font(.caption) .foregroundStyle(.secondary) } @@ -162,20 +277,12 @@ private struct MCPAuditLogRow: View { .help(entry.details ?? entry.action) } - private var outcomeBadge: some View { - Circle() - .fill(outcomeColor) - .frame(width: 8, height: 8) - .padding(.top, 6) - } - - private var outcomeColor: Color { + private var outcomeStatus: IntegrationStatus { switch entry.outcome { - case AuditOutcome.success.rawValue: .green - case AuditOutcome.denied.rawValue: .orange - case AuditOutcome.rateLimited.rawValue: .orange - case AuditOutcome.error.rawValue: .red - default: .secondary + case AuditOutcome.success.rawValue: return .success + case AuditOutcome.denied.rawValue, AuditOutcome.rateLimited.rawValue: return .warning + case AuditOutcome.error.rawValue: return .error + default: return .stopped } } } diff --git a/TablePro/Views/Settings/Sections/MCPSection.swift b/TablePro/Views/Settings/Sections/MCPSection.swift index 0c8902385..f43b37bf0 100644 --- a/TablePro/Views/Settings/Sections/MCPSection.swift +++ b/TablePro/Views/Settings/Sections/MCPSection.swift @@ -1,27 +1,23 @@ -// -// MCPSection.swift -// TablePro -// - import AppKit import SwiftUI struct MCPSection: View { @Binding var settings: MCPSettings @State private var manager = MCPServerManager.shared - @State private var selectedTool: MCPClientTool = .claudeDesktop + @State private var selectedTool: IntegrationClient = .claudeDesktop @State private var tokenList: [MCPAuthToken] = [] @State private var showCreateSheet = false @State private var showRevealSheet = false @State private var revealedToken: MCPAuthToken? @State private var revealedPlaintext: String = "" + @State private var disconnectCandidate: MCPServer.SessionSnapshot? var body: some View { - Section("MCP Server") { - Toggle("Enable MCP Server", isOn: $settings.enabled) + Section(String(localized: "Integrations")) { + Toggle(String(localized: "Enable MCP Server"), isOn: $settings.enabled) if settings.enabled { - LabeledContent("Status") { + LabeledContent(String(localized: "Status")) { MCPStatusIndicator() } } @@ -30,68 +26,55 @@ struct MCPSection: View { if settings.enabled { configurationSection authenticationSection - activityLogSection networkSection - setupSection connectedClientsSection + setupSection Section { - Text("AI access policies are configured per-connection in each connection's settings.") + Text(String(localized: "AI access policies are configured per-connection in each connection's settings.")) .foregroundStyle(.secondary) .font(.callout) } } } - // MARK: - Activity Log - - private var activityLogSection: some View { - Section("Activity Log") { - MCPAuditLogView() - } - } - - // MARK: - Configuration - private var configurationSection: some View { - Section("MCP Configuration") { - LabeledContent("Port") { + Section(String(localized: "Server Configuration")) { + LabeledContent(String(localized: "Port")) { TextField("", value: $settings.port, format: .number.grouping(.never)) .frame(width: 80) .multilineTextAlignment(.trailing) } - LabeledContent("Default row limit") { + LabeledContent(String(localized: "Default row limit")) { TextField("", value: $settings.defaultRowLimit, format: .number.grouping(.never)) .frame(width: 80) .multilineTextAlignment(.trailing) } - LabeledContent("Maximum row limit") { + LabeledContent(String(localized: "Maximum row limit")) { TextField("", value: $settings.maxRowLimit, format: .number.grouping(.never)) .frame(width: 80) .multilineTextAlignment(.trailing) } - LabeledContent("Query timeout") { + LabeledContent(String(localized: "Query timeout")) { HStack(spacing: 4) { TextField("", value: $settings.queryTimeoutSeconds, format: .number.grouping(.never)) .frame(width: 80) .multilineTextAlignment(.trailing) - Text("seconds") + Text(String(localized: "seconds")) .foregroundStyle(.secondary) } } - Toggle("Log MCP queries in history", isOn: $settings.logQueriesInHistory) + Toggle(String(localized: "Log MCP queries in history"), isOn: $settings.logQueriesInHistory) } } - // MARK: - Authentication - private var authenticationSection: some View { - Section("Authentication") { - Toggle("Require authentication", isOn: $settings.requireAuthentication) + Section(String(localized: "Authentication")) { + Toggle(String(localized: "Require authentication"), isOn: $settings.requireAuthentication) if settings.requireAuthentication { MCPTokenListView( @@ -118,44 +101,43 @@ struct MCPSection: View { } } - // MARK: - Network - private var networkSection: some View { - Section("Network") { - Toggle("Allow remote connections", isOn: $settings.allowRemoteConnections) + Section(String(localized: "Network")) { + Toggle(String(localized: "Allow remote connections"), isOn: $settings.allowRemoteConnections) if settings.allowRemoteConnections { Label { - Text("The server will be accessible from other devices on your network. Authentication and TLS are enabled automatically.") + Text(String(localized: "The server will be accessible from other devices on your network. Authentication and TLS are enabled automatically.")) } icon: { Image(systemName: "exclamationmark.triangle.fill") - .foregroundStyle(.orange) + .foregroundStyle(Color(nsColor: .systemOrange)) } .font(.callout) } } } - // MARK: - Setup - private var setupSection: some View { - Section("MCP Setup") { - Picker("Client:", selection: $selectedTool) { - ForEach(MCPClientTool.allCases) { tool in - Text(tool.displayName).tag(tool) + Section(String(localized: "Connect a Client")) { + DisclosureGroup(String(localized: "Setup Instructions")) { + VStack(alignment: .leading, spacing: 12) { + Picker(String(localized: "Client"), selection: $selectedTool) { + ForEach(IntegrationClient.allCases) { tool in + Text(tool.displayName).tag(tool) + } + } + + MCPSetupInstructions(tool: selectedTool, port: settings.port) } + .padding(.top, 4) } - - MCPSetupInstructions(tool: selectedTool, port: settings.port) } } - // MARK: - Connected Clients - private var connectedClientsSection: some View { - Section("Connected Clients") { + Section(String(localized: "Connected Clients")) { if manager.connectedClients.isEmpty { - Text("No clients connected") + Text(String(localized: "No clients connected")) .foregroundStyle(.secondary) } else { ForEach(manager.connectedClients) { client in @@ -173,17 +155,43 @@ struct MCPSection: View { .foregroundStyle(.secondary) } Spacer() - Button("Disconnect") { - Task { await manager.disconnectClient(client.id) } + Button(role: .destructive) { + disconnectCandidate = client + } label: { + Text(String(localized: "Disconnect")) } .controlSize(.small) } } } } + .alert( + String(localized: "Disconnect client?"), + isPresented: disconnectAlertBinding, + presenting: disconnectCandidate + ) { client in + Button(String(localized: "Cancel"), role: .cancel) { + disconnectCandidate = nil + } + Button(String(localized: "Disconnect"), role: .destructive) { + Task { await manager.disconnectClient(client.id) } + disconnectCandidate = nil + } + } message: { client in + Text(String(format: String(localized: "“%@” will be disconnected and any in-flight requests will be cancelled."), client.clientName)) + } } - // MARK: - Token Management + private var disconnectAlertBinding: Binding { + Binding( + get: { disconnectCandidate != nil }, + set: { isPresented in + if !isPresented { + disconnectCandidate = nil + } + } + ) + } private func handleGenerate(name: String, permissions: TokenPermissions, connectionIds: Set?, expiresAt: Date?) { Task { @@ -209,28 +217,9 @@ struct MCPSection: View { } } -// MARK: - MCP Client Tool - -private enum MCPClientTool: String, CaseIterable, Identifiable { - case claudeDesktop, claudeCode, cursor - - var id: String { rawValue } - - var displayName: String { - switch self { - case .claudeDesktop: "Claude Desktop" - case .claudeCode: "Claude Code" - case .cursor: "Cursor" - } - } -} - -// MARK: - Setup Instructions - private struct MCPSetupInstructions: View { - let tool: MCPClientTool + let tool: IntegrationClient let port: Int - @State private var copied = false var body: some View { VStack(alignment: .leading, spacing: 12) { @@ -246,60 +235,33 @@ private struct MCPSetupInstructions: View { } if let snippet = configSnippet { - copyableCodeBlock(snippet) + CopyableCodeBlock(text: snippet) } if let command { - copyableCodeBlock(command) + CopyableCodeBlock(text: command) } } .font(.callout) } - @ViewBuilder - private func copyableCodeBlock(_ text: String) -> some View { - HStack(alignment: .top) { - Text(text) - .font(.system(.caption, design: .monospaced)) - .textSelection(.enabled) - .padding(8) - .frame(maxWidth: .infinity, alignment: .leading) - .background(.quaternary) - .clipShape(RoundedRectangle(cornerRadius: 6)) - - Button { - NSPasteboard.general.clearContents() - NSPasteboard.general.setString(text, forType: .string) - copied = true - Task { @MainActor in - try? await Task.sleep(for: .seconds(1.5)) - copied = false - } - } label: { - Image(systemName: copied ? "checkmark" : "doc.on.doc") - .contentTransition(.symbolEffect(.replace)) - } - .help(String(localized: "Copy to clipboard")) - } - } - private var url: String { "http://127.0.0.1:\(port)/mcp" } private var steps: [String] { switch tool { case .claudeDesktop: - [ - "Open Claude Desktop, go to Settings > Developer", - "Click \"Edit Config\" to open claude_desktop_config.json", - "Add the JSON below inside the file and save", - "Restart Claude Desktop" + return [ + String(localized: "Open Claude Desktop, go to Settings > Developer"), + String(localized: "Click \"Edit Config\" to open claude_desktop_config.json"), + String(localized: "Add the JSON below inside the file and save"), + String(localized: "Restart Claude Desktop") ] case .claudeCode: - ["Run the command below in your terminal"] + return [String(localized: "Run the command below in your terminal")] case .cursor: - [ - "Open Cursor, go to Settings > MCP", - "Click \"+ Add new global MCP server\"", - "Paste the JSON below and save" + return [ + String(localized: "Open Cursor, go to Settings > MCP"), + String(localized: "Click \"+ Add new global MCP server\""), + String(localized: "Paste the JSON below and save") ] } } @@ -307,7 +269,7 @@ private struct MCPSetupInstructions: View { private var configSnippet: String? { switch tool { case .claudeDesktop, .cursor: - """ + return """ { "mcpServers": { "tablepro": { @@ -316,7 +278,8 @@ private struct MCPSetupInstructions: View { } } """ - case .claudeCode: nil + case .claudeCode: + return nil } } @@ -328,27 +291,19 @@ private struct MCPSetupInstructions: View { } } -// MARK: - Status Indicator - private struct MCPStatusIndicator: View { @State private var manager = MCPServerManager.shared var body: some View { - HStack(spacing: 6) { - Circle() - .fill(statusColor) - .frame(width: 8, height: 8) - Text(statusText) - .foregroundStyle(.secondary) - } + IntegrationStatusIndicator(status: status, label: statusText) } - private var statusColor: Color { + private var status: IntegrationStatus { switch manager.state { - case .stopped: .secondary - case .starting: .orange - case .running: .green - case .failed: .red + case .stopped: .stopped + case .starting: .starting + case .running: .running + case .failed: .failed } } From 8f2653fb33d0997023ecebe123d1144fd9ed0d6c Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 18:58:54 +0700 Subject: [PATCH 76/83] chore(integrations): localization sweep, rename stale MCP user-facing strings --- TablePro/TableProApp.swift | 10 ++++---- .../Connection/ConnectionAdvancedView.swift | 23 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/TablePro/TableProApp.swift b/TablePro/TableProApp.swift index 753d4d0d8..e56be1bbd 100644 --- a/TablePro/TableProApp.swift +++ b/TablePro/TableProApp.swift @@ -698,15 +698,15 @@ private struct MCPServerMenuItem: View { case .running: let count = manager.connectedClients.count if count == 0 { - return String(localized: "MCP Server: Running") + return String(localized: "Integrations: Running") } - return String(format: String(localized: "MCP Server: Running (%d clients)"), count) + return String(format: String(localized: "Integrations: Running (%d clients)"), count) case .failed: - return String(localized: "MCP Server: Failed") + return String(localized: "Integrations: Failed") case .stopped: - return String(localized: "MCP Server: Stopped") + return String(localized: "Integrations: Stopped") case .starting: - return String(localized: "MCP Server: Starting...") + return String(localized: "Integrations: Starting...") } } } diff --git a/TablePro/Views/Connection/ConnectionAdvancedView.swift b/TablePro/Views/Connection/ConnectionAdvancedView.swift index 738581024..ba21e8046 100644 --- a/TablePro/Views/Connection/ConnectionAdvancedView.swift +++ b/TablePro/Views/Connection/ConnectionAdvancedView.swift @@ -73,8 +73,8 @@ struct ConnectionAdvancedView: View { .foregroundStyle(.secondary) } - if AppSettingsManager.shared.ai.enabled { - Section(String(localized: "AI")) { + Section { + if AppSettingsManager.shared.ai.enabled { Picker(String(localized: "AI Policy"), selection: $aiPolicy) { Text(String(localized: "Use Default")) .tag(AIConnectionPolicy?.none as AIConnectionPolicy?) @@ -84,18 +84,23 @@ struct ConnectionAdvancedView: View { } } } - } - Section(String(localized: "External Access")) { - Picker(String(localized: "Access Level"), selection: $externalAccess) { + Picker(String(localized: "External Clients"), selection: $externalAccess) { ForEach(ExternalAccessLevel.allCases) { level in Text(level.displayName).tag(level) } } - .pickerStyle(.menu) - Text( - "Controls how external clients (Raycast, Cursor, Claude Desktop) access this connection. Tokens cannot exceed this level even with full-access scope." - ) + .pickerStyle(.segmented) + } header: { + Text(String(localized: "External Access")) + } footer: { + VStack(alignment: .leading, spacing: 4) { + if AppSettingsManager.shared.ai.enabled { + Text(String(localized: "AI Policy controls in-app AI agents. External Clients controls Raycast, Cursor, Claude Desktop, and other MCP clients. Effective scope is the minimum of the requesting token's scope and the External Clients level.")) + } else { + Text(String(localized: "Controls how external clients (Raycast, Cursor, Claude Desktop) access this connection. Tokens cannot exceed this level even with full-access scope.")) + } + } .font(.caption) .foregroundStyle(.secondary) } From 1023f47457802cbe1eb922033e07a2ff78aa5831 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:00:10 +0700 Subject: [PATCH 77/83] test(integrations): cover status indicator accessibility and document changes --- CHANGELOG.md | 15 ++++++ .../IntegrationStatusIndicatorTests.swift | 51 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 TableProTests/Views/Components/IntegrationStatusIndicatorTests.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a6815ddb..2371f1000 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - MCP server lazy-starts on first external request. Manual enable in Settings is no longer required - Settings tab renamed from "MCP" to "Integrations" with new sections for connected clients, activity log, and pairing +- Integrations settings: rename MCP Server section to Integrations, restructure with searchable activity log, native list with keyboard navigation, accessibility labels, color-blind-safe status icons. +- Activity log gained an Export… button that writes the current filtered list to CSV. +- Connection Advanced settings: AI Policy and External Clients now share a single External Access section. The External Clients picker uses a segmented control. - Storage and sync singletons accept dependencies via init for test isolation, matching Apple's URLSession and UserDefaults convention. Production callers using `.shared` are unchanged. `SQLFavoriteStorage` is now an actor so its first access no longer blocks the main thread on SQLite setup. - Create Database dialog is now driver-driven. Each driver discovers its own valid options (PostgreSQL queries `pg_collation` and `pg_database`, MySQL/MariaDB query `information_schema.character_sets`/`collations`). The hardcoded macOS-flavored locale list is gone. Engines that don't support creation hide the Create button instead of failing on click. - Introduced TableRows, Row, and Delta value types in TablePro/Models/Query/ as the foundation for the data grid row model rewrite. No callers migrated yet (Phase C.1 of the DataGrid refactor). @@ -98,6 +101,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - MCP `export_data`: tightened table name validation to reject double-dot, leading-dot, and trailing-dot identifiers (e.g. `schema..table`). `quoteQualifiedIdentifier` now rejects empty segments instead of producing `"schema".""."table"`. - MCP `focus_query_tab`: re-validate that the resolved tab still belongs to the authorized connection between the auth check and the window raise, closing a TOCTOU window where a tab could be re-bound to a different connection. - MCP pairing: cap pending exchange codes at 50 to prevent unbounded memory growth from repeated pairing attempts. +- Pairing approval no longer grants access on Return key; Approve must be clicked. Deny remains the cancel action and Escape still dismisses. +- Pairing approval shows a live countdown for the 5-minute exchange code window and disables Approve when it runs out. +- Pairing approval connection list is searchable with Select All / Deselect All controls and bounded height for many connections. +- Token deletion now requires confirmation in a destructive alert, with the token name in the message. Backspace on a selected token in the list shows the same alert. +- Disconnect on a connected client now requires confirmation before tearing down the session. +- Token list switched to a native macOS list with keyboard navigation, multi-select, and a context menu (Revoke, Copy ID, Delete…). "Deactivate" was renamed to "Revoke" so the UI matches the documented language. +- Activity log layout fixed: the inner list no longer nests inside the settings Form, so vertical scrolling has a single owner. Connection column shows the connection name instead of the UUID prefix and falls back to "Deleted connection (…)" when the connection is gone. +- Activity log gained search across action, token, connection, and details, plus a 90-day retention notice. +- Token reveal warning banner uses thin material with an orange border so it stays visible in Dark Mode. +- Token, audit, and pairing sheets use a flexible minimum height so they no longer clip with larger Dynamic Type sizes. +- Token list "Last used" now uses RelativeDateTimeFormatter so localized strings read correctly (e.g. "5 minutes ago" in en) instead of the broken duplicated " ago" suffix. +- Token reveal, audit refresh, and copy buttons now expose VoiceOver accessibility labels in addition to tooltips. ## [0.36.0] - 2026-04-27 diff --git a/TableProTests/Views/Components/IntegrationStatusIndicatorTests.swift b/TableProTests/Views/Components/IntegrationStatusIndicatorTests.swift new file mode 100644 index 000000000..914ad337b --- /dev/null +++ b/TableProTests/Views/Components/IntegrationStatusIndicatorTests.swift @@ -0,0 +1,51 @@ +@testable import TablePro +import Testing + +@Suite("IntegrationStatusIndicator") +struct IntegrationStatusIndicatorTests { + @Test("Running status exposes a localized accessibility label") + func runningLabel() { + let indicator = IntegrationStatusIndicator(status: .running, label: "Running on port 23000") + let description = indicator.accessibilityDescription + #expect(description.contains("running")) + #expect(description.contains("Running on port 23000")) + } + + @Test("Stopped status mentions stopped in accessibility label") + func stoppedLabel() { + let indicator = IntegrationStatusIndicator(status: .stopped, label: nil) + #expect(indicator.accessibilityDescription.contains("stopped")) + } + + @Test("Failed status mentions failed in accessibility label") + func failedLabel() { + let indicator = IntegrationStatusIndicator(status: .failed, label: nil) + #expect(indicator.accessibilityDescription.contains("failed")) + } + + @Test("Expired status mentions expired in accessibility label") + func expiredLabel() { + let indicator = IntegrationStatusIndicator(status: .expired, label: nil) + #expect(indicator.accessibilityDescription.contains("expired")) + } + + @Test("Revoked status mentions revoked in accessibility label") + func revokedLabel() { + let indicator = IntegrationStatusIndicator(status: .revoked, label: nil) + #expect(indicator.accessibilityDescription.contains("revoked")) + } + + @Test("Active status mentions active in accessibility label") + func activeLabel() { + let indicator = IntegrationStatusIndicator(status: .active, label: nil) + #expect(indicator.accessibilityDescription.contains("active")) + } + + @Test("Warning, success, error, starting all expose distinct labels") + func remainingLabels() { + #expect(IntegrationStatusIndicator(status: .warning, label: nil).accessibilityDescription.contains("warning")) + #expect(IntegrationStatusIndicator(status: .success, label: nil).accessibilityDescription.contains("success")) + #expect(IntegrationStatusIndicator(status: .error, label: nil).accessibilityDescription.contains("error")) + #expect(IntegrationStatusIndicator(status: .starting, label: nil).accessibilityDescription.contains("starting")) + } +} From d6cf1d9aa9e6e005adeb0a32ccc31f7ae4e5c500 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:03:24 +0700 Subject: [PATCH 78/83] fix(integrations): use minWidth on sheet frames, import Combine for Timer.publish --- TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift | 2 +- TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift | 2 +- TablePro/Views/Settings/Sections/PairingApprovalSheet.swift | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift b/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift index 3012a476e..113f93658 100644 --- a/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift +++ b/TablePro/Views/Settings/Sections/MCPTokenCreateSheet.swift @@ -28,7 +28,7 @@ struct MCPTokenCreateSheet: View { actionBar .padding() } - .frame(width: 480, minHeight: 520) + .frame(minWidth: 480, minHeight: 520) .task { connections = ConnectionStorage.shared.loadConnections() } diff --git a/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift b/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift index cc91fd51a..25715f270 100644 --- a/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift +++ b/TablePro/Views/Settings/Sections/MCPTokenRevealSheet.swift @@ -32,7 +32,7 @@ struct MCPTokenRevealSheet: View { } .padding() } - .frame(width: 540, minHeight: 520) + .frame(minWidth: 540, minHeight: 520) } private var warningBanner: some View { diff --git a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift index bbb8176ef..521eaf3ea 100644 --- a/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift +++ b/TablePro/Views/Settings/Sections/PairingApprovalSheet.swift @@ -1,3 +1,4 @@ +import Combine import SwiftUI struct PairingApproval: Sendable { @@ -52,7 +53,7 @@ struct PairingApprovalSheet: View { Divider() actionBar.padding() } - .frame(width: 520, minHeight: 560) + .frame(minWidth: 520, minHeight: 560) .task { connections = ConnectionStorage.shared.loadConnections() if connectionAccess == .all { From 48414a6576b083097a8f7c194aacefd998e96bde Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:13:13 +0700 Subject: [PATCH 79/83] fix(integrations): replace nested TabView with segmented picker to avoid Settings toolbar bleed --- TablePro/Views/Settings/MCPSettingsView.swift | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/TablePro/Views/Settings/MCPSettingsView.swift b/TablePro/Views/Settings/MCPSettingsView.swift index e3c709599..90f52849f 100644 --- a/TablePro/Views/Settings/MCPSettingsView.swift +++ b/TablePro/Views/Settings/MCPSettingsView.swift @@ -3,26 +3,50 @@ import SwiftUI struct MCPSettingsView: View { @Binding var settings: MCPSettings + @State private var selectedPane: IntegrationsPane = .settings + var body: some View { - TabView { - settingsTab - .tabItem { - Label(String(localized: "Settings"), systemImage: "gearshape") + VStack(spacing: 0) { + Picker("", selection: $selectedPane) { + ForEach(IntegrationsPane.allCases) { pane in + Text(pane.label).tag(pane) } + } + .pickerStyle(.segmented) + .labelsHidden() + .padding(.horizontal, 20) + .padding(.top, 16) + .padding(.bottom, 8) + + Divider() - MCPAuditLogView() - .tabItem { - Label(String(localized: "Activity Log"), systemImage: "list.bullet.rectangle") + switch selectedPane { + case .settings: + Form { + MCPSection(settings: $settings) } + .formStyle(.grouped) + .scrollContentBackground(.hidden) + case .activityLog: + MCPAuditLogView() + } } } +} + +private enum IntegrationsPane: String, CaseIterable, Identifiable { + case settings + case activityLog + + var id: String { rawValue } - private var settingsTab: some View { - Form { - MCPSection(settings: $settings) + var label: String { + switch self { + case .settings: + return String(localized: "Settings") + case .activityLog: + return String(localized: "Activity Log") } - .formStyle(.grouped) - .scrollContentBackground(.hidden) } } From 9385b937c93bfce6756fe6b633fa459610e4151b Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:19:08 +0700 Subject: [PATCH 80/83] fix(integrations): activity log search no longer bleeds into Settings toolbar, friendlier time and token labels --- Libs | 1 + Libs/checksums.sha256 | 60 ------------- TablePro/Core/MCP/MCPServerManager.swift | 2 +- TablePro/Core/MCP/MCPTokenStore.swift | 6 +- .../Settings/Sections/MCPAuditLogView.swift | 89 ++++++++++++++----- .../Views/Settings/Sections/MCPSection.swift | 2 +- 6 files changed, 73 insertions(+), 87 deletions(-) create mode 120000 Libs delete mode 100644 Libs/checksums.sha256 diff --git a/Libs b/Libs new file mode 120000 index 000000000..3c910c12c --- /dev/null +++ b/Libs @@ -0,0 +1 @@ +/Users/ngoquocdat/Projects/TablePro/Libs \ No newline at end of file diff --git a/Libs/checksums.sha256 b/Libs/checksums.sha256 deleted file mode 100644 index 6bda7f73f..000000000 --- a/Libs/checksums.sha256 +++ /dev/null @@ -1,60 +0,0 @@ -36e3a521b8da03bafd0f943c4f3b21c8c573bf9d640c6c9e764c0c3632672849 Libs/libbson_arm64.a -b7716e3f295a54feee85c8771332505be2f9a4a430a088d476d60e358d737c9e Libs/libbson_universal.a -1e502e7fb4edc79639140e18d433a1ed1be2931162daecee71a74d09e9f4c550 Libs/libbson_x86_64.a -b7716e3f295a54feee85c8771332505be2f9a4a430a088d476d60e358d737c9e Libs/libbson.a -8d7e31145470a339f4f57930831936db30412393a339598deece6f650214865a Libs/libcassandra_arm64.a -9bfd7d7cb4a7ee9823b4c5141e942a8534de63395983388722dc7c98e5d7731e Libs/libcassandra_universal.a -7f1d058c77b66273db2b3867103c19f62ed0518fb38611b178ce04029213d5d8 Libs/libcassandra_x86_64.a -9bfd7d7cb4a7ee9823b4c5141e942a8534de63395983388722dc7c98e5d7731e Libs/libcassandra.a -a891a67c2619e2ac1dce64dafc6a24bfde9cabe15312dac6b70a19385664ea84 Libs/libcrypto_arm64.a -732adf315bc49f77e2511a9293e49a65e18eb54a3e6d01d8a24eee2d671d2a8a Libs/libcrypto_universal.a -965ccd38fea5cd97bc878dbf58567e4eed2b2337120f8d46a2da62c094b3c821 Libs/libcrypto_x86_64.a -732adf315bc49f77e2511a9293e49a65e18eb54a3e6d01d8a24eee2d671d2a8a Libs/libcrypto.a -1756e47a21076dbfd3bcfb937964dd0af231017f3adc549fdbc114464b304179 Libs/libduckdb_arm64.a -d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f Libs/libduckdb_universal.a -aa5dfb4014c4b227d842ca20c2572434784cdad2de324afdc28fa8af83965ecd Libs/libduckdb_x86_64.a -d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f Libs/libduckdb.a -7e63017fa22c2eb7744eccad13857361a5088aa7b2772ab02cd026c8c7b78341 Libs/libhiredis_arm64.a -f1cfc36a7ab47361e9705fe32b1c919b318f606989478e91a808707d93db55a5 Libs/libhiredis_ssl_arm64.a -fb7a32c2c724cb4f3f880030cb19afbbc7db52121ad8e35e00a2e818da9562cf Libs/libhiredis_ssl_universal.a -7eb76bcb7ad4c10da0a0a5d43de182619f74f11c1ae9096823adc5c85280e34b Libs/libhiredis_ssl_x86_64.a -fb7a32c2c724cb4f3f880030cb19afbbc7db52121ad8e35e00a2e818da9562cf Libs/libhiredis_ssl.a -c855b0bf6fb8a2f52175a8e212c88a99ddf02890a1f88239613728c145607915 Libs/libhiredis_universal.a -5e89a8a3b48590f2c68bdcfc0cfde134145e3156d48264c1fd751dc9ef3be505 Libs/libhiredis_x86_64.a -c855b0bf6fb8a2f52175a8e212c88a99ddf02890a1f88239613728c145607915 Libs/libhiredis.a -b777f7a42766fb08c8e67b2310c67d2d463d77d3554c6092221c3352778622b2 Libs/libmariadb_arm64.a -5326ed729b287ae5dbbcf073aaa70dce29a73c7431e446d5958271af19dac8d8 Libs/libmariadb_universal.a -4f7bbb3d73be178d4211c3bd5b2726b4a12db8b808eaa5212bf8e9eb3c570814 Libs/libmariadb_x86_64.a -5326ed729b287ae5dbbcf073aaa70dce29a73c7431e446d5958271af19dac8d8 Libs/libmariadb.a -9f4c87916ef65eae43b19d7568dc4fd4dffd884dc0cae15913b90965293339a7 Libs/libmongoc_arm64.a -0d7ddc82dc7327a4b5187ffbc68a1419b5e5ff7b2be7b927e16793eef4d34303 Libs/libmongoc_universal.a -635705c7dc8d689efdee5ec1bd8a8cbd0d09ae20db0869480271a293d492de50 Libs/libmongoc_x86_64.a -0d7ddc82dc7327a4b5187ffbc68a1419b5e5ff7b2be7b927e16793eef4d34303 Libs/libmongoc.a -5dbf2cb5ef37d8adbf607db82461b36a3fd7037c11d891383e6e918378a33d78 Libs/libpgcommon_arm64.a -3ca491a723b9d9dfc13b815659b44a82253b540dd6b115f03ac68c5154ec26db Libs/libpgcommon_universal.a -4bfad7376aefa866d1ed0b7e54966ec6c9d70dcfed928e1311c20321bf08881c Libs/libpgcommon_x86_64.a -3ca491a723b9d9dfc13b815659b44a82253b540dd6b115f03ac68c5154ec26db Libs/libpgcommon.a -813b962c5ae1c317bf6facfe68bd1301fa766768e074f3063fc2e8243213fe13 Libs/libpgport_arm64.a -efba529b1ad767de988a58ca2c3fdcc26c38ce79df044a988f41fddbf9fde118 Libs/libpgport_universal.a -bf71cc776245c0ce44bfd7b0286664d5c9771992fd70ec32a0c27fc669e4422f Libs/libpgport_x86_64.a -efba529b1ad767de988a58ca2c3fdcc26c38ce79df044a988f41fddbf9fde118 Libs/libpgport.a -70cb70b88130c1c88ccf108e31e17d45dbbc2d10267db7ff33d63305a6a05baf Libs/libpq_arm64.a -b86ecf68d2b0dd8aa7712d13607c9584df2297aca4cd651428e8ee974c6bdf80 Libs/libpq_universal.a -1ce2b45af228915fad05e07f54e96621af7143e199e002e5100777261a7f4a13 Libs/libpq_x86_64.a -b86ecf68d2b0dd8aa7712d13607c9584df2297aca4cd651428e8ee974c6bdf80 Libs/libpq.a -166e0e23ce60fd2edcae38b6005de106394f7e2bc922a4944317d6aa576f284c Libs/libssh2_arm64.a -445b51e6fdaa0a0eceb8090e6d552a551ec15d91e4370a4cc356c8f561e8b469 Libs/libssh2_universal.a -76681299c4305273cea62e59cfa366ceb5cc320831b87fd6a06143d342f8b7db Libs/libssh2_x86_64.a -445b51e6fdaa0a0eceb8090e6d552a551ec15d91e4370a4cc356c8f561e8b469 Libs/libssh2.a -b3861975896ebf35255d8c3efccdc59ad39874c9b70fdd710ebd15f0a58c4e10 Libs/libssl_arm64.a -3ca208dedf57dbae4f5cb0a22bfbedeba80dc6740d626484d9d815811d64a2aa Libs/libssl_universal.a -34de647ccd0951095f987591562a5236348bac2d4b3e217877559a7b170cf4e4 Libs/libssl_x86_64.a -3ca208dedf57dbae4f5cb0a22bfbedeba80dc6740d626484d9d815811d64a2aa Libs/libssl.a -38a16ca8a041c1be3ca6d4884f7c5e196d14f60bee80004c8f54a41899c17e0f Libs/libsybdb_arm64.a -071e9853ec4bb1f6a19ed99eb91cfe823e83bad178e1e1997deee414cd0e4dfc Libs/libsybdb_universal.a -e437cf1fab3eaf675bdb5aab4443a891763e5325033ddfe369775bd64a22b57b Libs/libsybdb_x86_64.a -071e9853ec4bb1f6a19ed99eb91cfe823e83bad178e1e1997deee414cd0e4dfc Libs/libsybdb.a -beff08628396ffb7c2e23b9f1db08ce92be215fbfd50c6e62088e216d73a0897 Libs/libuv_arm64.a -8f8135b8214cfef035b49486a863f891979efc04d97d75e2bc14cb4e28aed233 Libs/libuv_universal.a -2592a74df696709dcc631e9ad48894763157e9c5a34f0cb6a23a4036bce0c472 Libs/libuv_x86_64.a -8f8135b8214cfef035b49486a863f891979efc04d97d75e2bc14cb4e28aed233 Libs/libuv.a diff --git a/TablePro/Core/MCP/MCPServerManager.swift b/TablePro/Core/MCP/MCPServerManager.swift index a51f0da54..e0616748b 100644 --- a/TablePro/Core/MCP/MCPServerManager.swift +++ b/TablePro/Core/MCP/MCPServerManager.swift @@ -88,7 +88,7 @@ final class MCPServerManager { await newServer.setRouter(router) let bridgeResult = await newTokenStore.generate( - name: "__stdio_bridge__", + name: MCPTokenStore.stdioBridgeTokenName, permissions: .fullAccess ) self.bridgeTokenId = bridgeResult.token.id diff --git a/TablePro/Core/MCP/MCPTokenStore.swift b/TablePro/Core/MCP/MCPTokenStore.swift index cff7e3d89..dc71eaab8 100644 --- a/TablePro/Core/MCP/MCPTokenStore.swift +++ b/TablePro/Core/MCP/MCPTokenStore.swift @@ -152,6 +152,8 @@ enum TokenPermissions: String, Codable, Sendable, CaseIterable, Identifiable { } actor MCPTokenStore { + static let stdioBridgeTokenName = "__stdio_bridge__" + private static let logger = Logger(subsystem: "com.TablePro", category: "MCPTokenStore") private var tokens: [MCPAuthToken] = [] @@ -277,9 +279,9 @@ actor MCPTokenStore { Self.logger.error("Failed to load MCP tokens: \(error.localizedDescription, privacy: .public)") } - let staleCount = tokens.filter({ $0.name == "__stdio_bridge__" }).count + let staleCount = tokens.filter({ $0.name == Self.stdioBridgeTokenName }).count if staleCount > 0 { - tokens.removeAll { $0.name == "__stdio_bridge__" } + tokens.removeAll { $0.name == Self.stdioBridgeTokenName } save() Self.logger.info("Cleaned up \(staleCount) stale bridge token(s)") } diff --git a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift index d8567eac1..66fab596c 100644 --- a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift +++ b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift @@ -14,6 +14,7 @@ struct MCPAuditLogView: View { var body: some View { VStack(alignment: .leading, spacing: 12) { + searchBar filterBar if isLoading { @@ -34,25 +35,47 @@ struct MCPAuditLogView: View { } } .padding() - .searchable( - text: $searchText, - placement: .toolbar, - prompt: Text(String(localized: "Search activity")) - ) .task { await reload() } } + private var searchBar: some View { + HStack(spacing: 8) { + Image(systemName: "magnifyingglass") + .foregroundStyle(.secondary) + TextField(String(localized: "Search activity"), text: $searchText) + .textFieldStyle(.plain) + if !searchText.isEmpty { + Button { + searchText = "" + } label: { + Image(systemName: "xmark.circle.fill") + .foregroundStyle(.secondary) + } + .buttonStyle(.plain) + .accessibilityLabel(String(localized: "Clear search")) + } + } + .padding(.horizontal, 8) + .padding(.vertical, 6) + .background(Color(nsColor: .textBackgroundColor)) + .overlay( + RoundedRectangle(cornerRadius: 6) + .strokeBorder(Color(nsColor: .separatorColor), lineWidth: 1) + ) + .clipShape(RoundedRectangle(cornerRadius: 6)) + } + private var filterBar: some View { HStack(spacing: 12) { Picker(selection: $selectedTokenId) { Text(String(localized: "All tokens")).tag(UUID?.none) ForEach(tokens) { token in - Text(token.name).tag(Optional(token.id)) + Text(displayTokenName(token.name)).tag(Optional(token.id)) } } label: { Text(String(localized: "Token")) } - .frame(maxWidth: 220) + .frame(minWidth: 180, maxWidth: 240) Picker(selection: $selectedCategory) { Text(String(localized: "All categories")).tag(AuditCategory?.none) @@ -62,7 +85,7 @@ struct MCPAuditLogView: View { } label: { Text(String(localized: "Category")) } - .frame(maxWidth: 200) + .frame(minWidth: 180, maxWidth: 220) Picker(selection: $selectedRange) { ForEach(TimeRangeOption.allCases) { option in @@ -71,7 +94,7 @@ struct MCPAuditLogView: View { } label: { Text(String(localized: "Range")) } - .frame(maxWidth: 180) + .frame(minWidth: 160, maxWidth: 200) Spacer() @@ -145,13 +168,17 @@ struct MCPAuditLogView: View { return String(format: String(localized: "Deleted connection (%@)"), String(prefix)) } + private func displayTokenName(_ name: String) -> String { + name == MCPTokenStore.stdioBridgeTokenName ? String(localized: "Built-in CLI") : name + } + private func reload() async { isLoading = true defer { isLoading = false } let store = MCPServerManager.shared.tokenStore if let store { - tokens = await store.list().filter { $0.name != "__stdio_bridge__" } + tokens = await store.list().filter { $0.name != MCPTokenStore.stdioBridgeTokenName } } connections = ConnectionStorage.shared.loadConnections() @@ -234,20 +261,32 @@ private struct MCPAuditLogRow: View { let entry: AuditEntry let connectionName: String? + private static let relativeFormatter: RelativeDateTimeFormatter = { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .full + return formatter + }() + var body: some View { HStack(alignment: .top, spacing: 10) { IntegrationStatusIndicator(status: outcomeStatus) .padding(.top, 2) VStack(alignment: .leading, spacing: 4) { - HStack(spacing: 6) { - Text(entry.action) + HStack(spacing: 8) { + Text(displayActionName) .font(.callout.weight(.medium)) Text(entry.category.displayName) .font(.caption) .foregroundStyle(.secondary) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background( + RoundedRectangle(cornerRadius: 4) + .fill(Color(nsColor: .quaternaryLabelColor)) + ) } if let tokenName = entry.tokenName { - Text(tokenName) + Text(displayTokenName(tokenName)) .font(.caption) .foregroundStyle(.secondary) } @@ -258,23 +297,27 @@ private struct MCPAuditLogRow: View { } if let details = entry.details { Text(details) - .font(.caption2) + .font(.system(.caption2, design: .monospaced)) .foregroundStyle(.tertiary) .lineLimit(2) } } Spacer() - VStack(alignment: .trailing, spacing: 2) { - Text(entry.timestamp, style: .relative) - .font(.caption) - .foregroundStyle(.secondary) - Text(entry.timestamp.formatted(date: .numeric, time: .standard)) - .font(.caption2) - .foregroundStyle(.tertiary) - } + Text(Self.relativeFormatter.localizedString(for: entry.timestamp, relativeTo: .now)) + .font(.caption) + .foregroundStyle(.secondary) } .padding(.vertical, 4) - .help(entry.details ?? entry.action) + .help(entry.timestamp.formatted(date: .complete, time: .standard)) + } + + private var displayActionName: String { + let words = entry.action.split(separator: ".").map { $0.capitalized } + return words.joined(separator: " ") + } + + private func displayTokenName(_ name: String) -> String { + name == MCPTokenStore.stdioBridgeTokenName ? String(localized: "Built-in CLI") : name } private var outcomeStatus: IntegrationStatus { diff --git a/TablePro/Views/Settings/Sections/MCPSection.swift b/TablePro/Views/Settings/Sections/MCPSection.swift index f43b37bf0..644e59f0d 100644 --- a/TablePro/Views/Settings/Sections/MCPSection.swift +++ b/TablePro/Views/Settings/Sections/MCPSection.swift @@ -213,7 +213,7 @@ struct MCPSection: View { private func refreshTokens() async { guard let store = MCPServerManager.shared.tokenStore else { return } - tokenList = await store.list().filter { $0.name != "__stdio_bridge__" } + tokenList = await store.list().filter { $0.name != MCPTokenStore.stdioBridgeTokenName } } } From 1d098cd14c5359293806712e5023e1396c4f73bb Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:19:59 +0700 Subject: [PATCH 81/83] fix: restore Libs/checksums.sha256 accidentally replaced by build-time symlink --- Libs | 1 - Libs/checksums.sha256 | 60 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) delete mode 120000 Libs create mode 100644 Libs/checksums.sha256 diff --git a/Libs b/Libs deleted file mode 120000 index 3c910c12c..000000000 --- a/Libs +++ /dev/null @@ -1 +0,0 @@ -/Users/ngoquocdat/Projects/TablePro/Libs \ No newline at end of file diff --git a/Libs/checksums.sha256 b/Libs/checksums.sha256 new file mode 100644 index 000000000..6bda7f73f --- /dev/null +++ b/Libs/checksums.sha256 @@ -0,0 +1,60 @@ +36e3a521b8da03bafd0f943c4f3b21c8c573bf9d640c6c9e764c0c3632672849 Libs/libbson_arm64.a +b7716e3f295a54feee85c8771332505be2f9a4a430a088d476d60e358d737c9e Libs/libbson_universal.a +1e502e7fb4edc79639140e18d433a1ed1be2931162daecee71a74d09e9f4c550 Libs/libbson_x86_64.a +b7716e3f295a54feee85c8771332505be2f9a4a430a088d476d60e358d737c9e Libs/libbson.a +8d7e31145470a339f4f57930831936db30412393a339598deece6f650214865a Libs/libcassandra_arm64.a +9bfd7d7cb4a7ee9823b4c5141e942a8534de63395983388722dc7c98e5d7731e Libs/libcassandra_universal.a +7f1d058c77b66273db2b3867103c19f62ed0518fb38611b178ce04029213d5d8 Libs/libcassandra_x86_64.a +9bfd7d7cb4a7ee9823b4c5141e942a8534de63395983388722dc7c98e5d7731e Libs/libcassandra.a +a891a67c2619e2ac1dce64dafc6a24bfde9cabe15312dac6b70a19385664ea84 Libs/libcrypto_arm64.a +732adf315bc49f77e2511a9293e49a65e18eb54a3e6d01d8a24eee2d671d2a8a Libs/libcrypto_universal.a +965ccd38fea5cd97bc878dbf58567e4eed2b2337120f8d46a2da62c094b3c821 Libs/libcrypto_x86_64.a +732adf315bc49f77e2511a9293e49a65e18eb54a3e6d01d8a24eee2d671d2a8a Libs/libcrypto.a +1756e47a21076dbfd3bcfb937964dd0af231017f3adc549fdbc114464b304179 Libs/libduckdb_arm64.a +d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f Libs/libduckdb_universal.a +aa5dfb4014c4b227d842ca20c2572434784cdad2de324afdc28fa8af83965ecd Libs/libduckdb_x86_64.a +d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f Libs/libduckdb.a +7e63017fa22c2eb7744eccad13857361a5088aa7b2772ab02cd026c8c7b78341 Libs/libhiredis_arm64.a +f1cfc36a7ab47361e9705fe32b1c919b318f606989478e91a808707d93db55a5 Libs/libhiredis_ssl_arm64.a +fb7a32c2c724cb4f3f880030cb19afbbc7db52121ad8e35e00a2e818da9562cf Libs/libhiredis_ssl_universal.a +7eb76bcb7ad4c10da0a0a5d43de182619f74f11c1ae9096823adc5c85280e34b Libs/libhiredis_ssl_x86_64.a +fb7a32c2c724cb4f3f880030cb19afbbc7db52121ad8e35e00a2e818da9562cf Libs/libhiredis_ssl.a +c855b0bf6fb8a2f52175a8e212c88a99ddf02890a1f88239613728c145607915 Libs/libhiredis_universal.a +5e89a8a3b48590f2c68bdcfc0cfde134145e3156d48264c1fd751dc9ef3be505 Libs/libhiredis_x86_64.a +c855b0bf6fb8a2f52175a8e212c88a99ddf02890a1f88239613728c145607915 Libs/libhiredis.a +b777f7a42766fb08c8e67b2310c67d2d463d77d3554c6092221c3352778622b2 Libs/libmariadb_arm64.a +5326ed729b287ae5dbbcf073aaa70dce29a73c7431e446d5958271af19dac8d8 Libs/libmariadb_universal.a +4f7bbb3d73be178d4211c3bd5b2726b4a12db8b808eaa5212bf8e9eb3c570814 Libs/libmariadb_x86_64.a +5326ed729b287ae5dbbcf073aaa70dce29a73c7431e446d5958271af19dac8d8 Libs/libmariadb.a +9f4c87916ef65eae43b19d7568dc4fd4dffd884dc0cae15913b90965293339a7 Libs/libmongoc_arm64.a +0d7ddc82dc7327a4b5187ffbc68a1419b5e5ff7b2be7b927e16793eef4d34303 Libs/libmongoc_universal.a +635705c7dc8d689efdee5ec1bd8a8cbd0d09ae20db0869480271a293d492de50 Libs/libmongoc_x86_64.a +0d7ddc82dc7327a4b5187ffbc68a1419b5e5ff7b2be7b927e16793eef4d34303 Libs/libmongoc.a +5dbf2cb5ef37d8adbf607db82461b36a3fd7037c11d891383e6e918378a33d78 Libs/libpgcommon_arm64.a +3ca491a723b9d9dfc13b815659b44a82253b540dd6b115f03ac68c5154ec26db Libs/libpgcommon_universal.a +4bfad7376aefa866d1ed0b7e54966ec6c9d70dcfed928e1311c20321bf08881c Libs/libpgcommon_x86_64.a +3ca491a723b9d9dfc13b815659b44a82253b540dd6b115f03ac68c5154ec26db Libs/libpgcommon.a +813b962c5ae1c317bf6facfe68bd1301fa766768e074f3063fc2e8243213fe13 Libs/libpgport_arm64.a +efba529b1ad767de988a58ca2c3fdcc26c38ce79df044a988f41fddbf9fde118 Libs/libpgport_universal.a +bf71cc776245c0ce44bfd7b0286664d5c9771992fd70ec32a0c27fc669e4422f Libs/libpgport_x86_64.a +efba529b1ad767de988a58ca2c3fdcc26c38ce79df044a988f41fddbf9fde118 Libs/libpgport.a +70cb70b88130c1c88ccf108e31e17d45dbbc2d10267db7ff33d63305a6a05baf Libs/libpq_arm64.a +b86ecf68d2b0dd8aa7712d13607c9584df2297aca4cd651428e8ee974c6bdf80 Libs/libpq_universal.a +1ce2b45af228915fad05e07f54e96621af7143e199e002e5100777261a7f4a13 Libs/libpq_x86_64.a +b86ecf68d2b0dd8aa7712d13607c9584df2297aca4cd651428e8ee974c6bdf80 Libs/libpq.a +166e0e23ce60fd2edcae38b6005de106394f7e2bc922a4944317d6aa576f284c Libs/libssh2_arm64.a +445b51e6fdaa0a0eceb8090e6d552a551ec15d91e4370a4cc356c8f561e8b469 Libs/libssh2_universal.a +76681299c4305273cea62e59cfa366ceb5cc320831b87fd6a06143d342f8b7db Libs/libssh2_x86_64.a +445b51e6fdaa0a0eceb8090e6d552a551ec15d91e4370a4cc356c8f561e8b469 Libs/libssh2.a +b3861975896ebf35255d8c3efccdc59ad39874c9b70fdd710ebd15f0a58c4e10 Libs/libssl_arm64.a +3ca208dedf57dbae4f5cb0a22bfbedeba80dc6740d626484d9d815811d64a2aa Libs/libssl_universal.a +34de647ccd0951095f987591562a5236348bac2d4b3e217877559a7b170cf4e4 Libs/libssl_x86_64.a +3ca208dedf57dbae4f5cb0a22bfbedeba80dc6740d626484d9d815811d64a2aa Libs/libssl.a +38a16ca8a041c1be3ca6d4884f7c5e196d14f60bee80004c8f54a41899c17e0f Libs/libsybdb_arm64.a +071e9853ec4bb1f6a19ed99eb91cfe823e83bad178e1e1997deee414cd0e4dfc Libs/libsybdb_universal.a +e437cf1fab3eaf675bdb5aab4443a891763e5325033ddfe369775bd64a22b57b Libs/libsybdb_x86_64.a +071e9853ec4bb1f6a19ed99eb91cfe823e83bad178e1e1997deee414cd0e4dfc Libs/libsybdb.a +beff08628396ffb7c2e23b9f1db08ce92be215fbfd50c6e62088e216d73a0897 Libs/libuv_arm64.a +8f8135b8214cfef035b49486a863f891979efc04d97d75e2bc14cb4e28aed233 Libs/libuv_universal.a +2592a74df696709dcc631e9ad48894763157e9c5a34f0cb6a23a4036bce0c472 Libs/libuv_x86_64.a +8f8135b8214cfef035b49486a863f891979efc04d97d75e2bc14cb4e28aed233 Libs/libuv.a From 2eb0dfaac23b25141f8e6bf5124c37dab26f51a9 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:28:41 +0700 Subject: [PATCH 82/83] fix(integrations): center activity log empty state, distinct message for empty search --- .../Settings/Sections/MCPAuditLogView.swift | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift index 66fab596c..4c72b6878 100644 --- a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift +++ b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift @@ -120,16 +120,19 @@ struct MCPAuditLogView: View { .onChange(of: selectedRange) { _, _ in Task { await reload() } } } + @ViewBuilder private var emptyState: some View { - VStack(spacing: 8) { - Image(systemName: "tray") - .font(.system(size: 32)) - .foregroundStyle(.tertiary) - Text(String(localized: "No activity yet")) - .foregroundStyle(.secondary) + if !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + ContentUnavailableView.search(text: searchText) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else { + ContentUnavailableView( + String(localized: "No activity yet"), + systemImage: "tray", + description: Text(String(localized: "External integrations and MCP client requests will appear here.")) + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) } - .frame(maxWidth: .infinity) - .padding(.vertical, 24) } private var entryList: some View { From 294d853456ea30f5a48dc6095513231f6c590bcf Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 1 May 2026 19:31:26 +0700 Subject: [PATCH 83/83] fix(integrations): force empty state to claim full available height with explicit spacers --- .../Settings/Sections/MCPAuditLogView.swift | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift index 4c72b6878..8ebf5a824 100644 --- a/TablePro/Views/Settings/Sections/MCPAuditLogView.swift +++ b/TablePro/Views/Settings/Sections/MCPAuditLogView.swift @@ -120,19 +120,23 @@ struct MCPAuditLogView: View { .onChange(of: selectedRange) { _, _ in Task { await reload() } } } - @ViewBuilder private var emptyState: some View { - if !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { - ContentUnavailableView.search(text: searchText) - .frame(maxWidth: .infinity, maxHeight: .infinity) - } else { - ContentUnavailableView( - String(localized: "No activity yet"), - systemImage: "tray", - description: Text(String(localized: "External integrations and MCP client requests will appear here.")) - ) - .frame(maxWidth: .infinity, maxHeight: .infinity) + VStack { + Spacer(minLength: 0) + Group { + if !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + ContentUnavailableView.search(text: searchText) + } else { + ContentUnavailableView( + String(localized: "No activity yet"), + systemImage: "tray", + description: Text(String(localized: "External integrations and MCP client requests will appear here.")) + ) + } + } + Spacer(minLength: 0) } + .frame(maxWidth: .infinity, maxHeight: .infinity) } private var entryList: some View {

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 z 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