@@ -133,10 +133,32 @@ final class DatabaseManager {
133133 }
134134 }
135135
136+ // Resolve password override for prompt-for-password connections
137+ var passwordOverride : String ?
138+ if connection. promptForPassword {
139+ if let cached = activeSessions [ connection. id] ? . cachedPassword {
140+ passwordOverride = cached
141+ } else {
142+ let isApiOnly = PluginManager . shared. connectionMode ( for: connection. type) == . apiOnly
143+ guard let prompted = PasswordPromptHelper . prompt (
144+ connectionName: connection. name,
145+ isAPIToken: isApiOnly
146+ ) else {
147+ removeSessionEntry ( for: connection. id)
148+ currentSessionId = nil
149+ throw CancellationError ( )
150+ }
151+ passwordOverride = prompted
152+ }
153+ }
154+
136155 // Create appropriate driver with effective connection
137156 let driver : DatabaseDriver
138157 do {
139- driver = try DatabaseDriverFactory . createDriver ( for: effectiveConnection)
158+ driver = try DatabaseDriverFactory . createDriver (
159+ for: effectiveConnection,
160+ passwordOverride: passwordOverride
161+ )
140162 } catch {
141163 // Close tunnel if SSH was established
142164 if connection. sshConfig. enabled {
@@ -217,7 +239,9 @@ final class DatabaseManager {
217239 session. driver = driver
218240 session. status = driver. status
219241 session. effectiveConnection = effectiveConnection
220-
242+ if let passwordOverride {
243+ session. cachedPassword = passwordOverride
244+ }
221245 setSession ( session, for: connection. id)
222246 }
223247
@@ -418,9 +442,11 @@ final class DatabaseManager {
418442 }
419443
420444 /// Test a connection without keeping it open
421- func testConnection( _ connection: DatabaseConnection , sshPassword: String ? = nil ) async throws
422- -> Bool
423- {
445+ func testConnection(
446+ _ connection: DatabaseConnection ,
447+ sshPassword: String ? = nil ,
448+ passwordOverride: String ? = nil
449+ ) async throws -> Bool {
424450 // Build effective connection (creates SSH tunnel if needed)
425451 let testConnection = try await buildEffectiveConnection (
426452 for: connection,
@@ -429,7 +455,10 @@ final class DatabaseManager {
429455
430456 let result : Bool
431457 do {
432- let driver = try DatabaseDriverFactory . createDriver ( for: testConnection)
458+ let driver = try DatabaseDriverFactory . createDriver (
459+ for: testConnection,
460+ passwordOverride: passwordOverride
461+ )
433462 result = try await driver. testConnection ( )
434463 } catch {
435464 if connection. sshConfig. enabled {
@@ -643,7 +672,10 @@ final class DatabaseManager {
643672
644673 // Use effective connection (tunneled) if available, otherwise original
645674 let connectionForDriver = session. effectiveConnection ?? session. connection
646- let driver = try DatabaseDriverFactory . createDriver ( for: connectionForDriver)
675+ let driver = try DatabaseDriverFactory . createDriver (
676+ for: connectionForDriver,
677+ passwordOverride: session. cachedPassword
678+ )
647679 try await driver. connect ( )
648680
649681 // Apply timeout
@@ -712,8 +744,25 @@ final class DatabaseManager {
712744 // Recreate SSH tunnel if needed and build effective connection
713745 let effectiveConnection = try await buildEffectiveConnection ( for: session. connection)
714746
747+ // Resolve password for prompt-for-password connections
748+ var passwordOverride = activeSessions [ sessionId] ? . cachedPassword
749+ if session. connection. promptForPassword && passwordOverride == nil {
750+ let isApiOnly = PluginManager . shared. connectionMode ( for: session. connection. type) == . apiOnly
751+ guard let prompted = PasswordPromptHelper . prompt (
752+ connectionName: session. connection. name,
753+ isAPIToken: isApiOnly
754+ ) else {
755+ updateSession ( sessionId) { $0. status = . disconnected }
756+ return
757+ }
758+ passwordOverride = prompted
759+ }
760+
715761 // Create new driver and connect
716- let driver = try DatabaseDriverFactory . createDriver ( for: effectiveConnection)
762+ let driver = try DatabaseDriverFactory . createDriver (
763+ for: effectiveConnection,
764+ passwordOverride: passwordOverride
765+ )
717766 try await driver. connect ( )
718767
719768 // Apply timeout
@@ -750,6 +799,9 @@ final class DatabaseManager {
750799 session. driver = driver
751800 session. status = . connected
752801 session. effectiveConnection = effectiveConnection
802+ if let passwordOverride {
803+ session. cachedPassword = passwordOverride
804+ }
753805 }
754806
755807 // Restart health monitoring if the plugin supports it
0 commit comments