feat(proxy): 网关随机 API Key + 启动失败提示
- SettingsViewModel 每次进程生成随机本机 Key,start 失败时暴露错误信息 - Settings 页显示 API Key 与错误提示
This commit is contained in:
parent
f5162bbf74
commit
67e1f060c5
@ -91,6 +91,8 @@ fun SettingsScreen(
|
||||
|
||||
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
|
||||
val proxyRunning by viewModel.proxyRunning.collectAsStateWithLifecycle()
|
||||
val proxyApiKey by viewModel.proxyApiKey.collectAsStateWithLifecycle()
|
||||
val proxyError by viewModel.proxyError.collectAsStateWithLifecycle()
|
||||
var showLanguageDialog by remember { mutableStateOf(false) }
|
||||
|
||||
Scaffold(
|
||||
@ -164,6 +166,8 @@ fun SettingsScreen(
|
||||
item {
|
||||
ProxyGatewayCard(
|
||||
running = proxyRunning,
|
||||
apiKey = proxyApiKey,
|
||||
error = proxyError,
|
||||
onToggle = viewModel::setProxyEnabled
|
||||
)
|
||||
}
|
||||
@ -192,6 +196,8 @@ fun SettingsScreen(
|
||||
@Composable
|
||||
private fun ProxyGatewayCard(
|
||||
running: Boolean,
|
||||
apiKey: String,
|
||||
error: String?,
|
||||
onToggle: (Boolean) -> Unit
|
||||
) {
|
||||
Card(
|
||||
@ -221,6 +227,20 @@ private fun ProxyGatewayCard(
|
||||
color = InkMuted,
|
||||
modifier = Modifier.padding(top = 2.dp)
|
||||
)
|
||||
Text(
|
||||
text = "API Key:$apiKey",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = InkMuted,
|
||||
modifier = Modifier.padding(top = 2.dp)
|
||||
)
|
||||
if (error != null) {
|
||||
Text(
|
||||
text = error,
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = MaterialTheme.colorScheme.error,
|
||||
modifier = Modifier.padding(top = 2.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
Switch(
|
||||
checked = running,
|
||||
|
||||
@ -8,6 +8,7 @@ import com.rainy.token.data.repository.CredentialRepository
|
||||
import com.rainy.token.domain.model.CredentialStatus
|
||||
import com.rainy.token.domain.service.ServiceType
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import java.util.UUID
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
@ -31,15 +32,28 @@ class SettingsViewModel @Inject constructor(
|
||||
/** 本地反代服务运行状态。 */
|
||||
val proxyRunning: StateFlow<Boolean> = localProxyServer.isRunning
|
||||
|
||||
/** 启动/停止本地反代服务。M1b 使用固定本地 Key,后续改为可配置。 */
|
||||
/** 当前本机 API Key(每次进程随机生成,仅提示用)。 */
|
||||
val proxyApiKey: StateFlow<String> = MutableStateFlow(generateProxyKey())
|
||||
|
||||
/** 启动失败时的错误信息。 */
|
||||
private val _proxyError = MutableStateFlow<String?>(null)
|
||||
val proxyError: StateFlow<String?> = _proxyError.asStateFlow()
|
||||
|
||||
/** 启动/停止本地反代服务。 */
|
||||
fun setProxyEnabled(enabled: Boolean) {
|
||||
if (enabled) {
|
||||
localProxyServer.start(ProxyServerConfig(apiKey = "rainytoken"))
|
||||
localProxyServer.start(ProxyServerConfig(apiKey = proxyApiKey.value))
|
||||
.onSuccess { _proxyError.value = null }
|
||||
.onFailure { e -> _proxyError.value = e.message ?: "代理网关启动失败" }
|
||||
} else {
|
||||
localProxyServer.stop()
|
||||
_proxyError.value = null
|
||||
}
|
||||
}
|
||||
|
||||
private fun generateProxyKey(): String =
|
||||
"rainy-" + UUID.randomUUID().toString().replace("-", "").take(16)
|
||||
|
||||
init {
|
||||
refresh()
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ WBAdpt TraeAdpt QoderAdpt RaccoonAdpt OfficialPassthrough
|
||||
- WorkBuddy INTL / Trae SOLO/Work 实际协议归一化
|
||||
- M3 agent2api 全家桶(Qoder / 小浣熊 / CatPaw / AutoClaw / Cline / Accio / ZCode / CodeArts / Loomy)
|
||||
- Qoder 需 COSY 请求签名/编码(ed25519 类原语),已列为攻坚项
|
||||
- M4 长尾 + 官方透传 + 网关配置 UI 完善
|
||||
- M4 长尾 + 官方透传 + 网关配置 UI 完善(已做:随机 API Key / 启动失败提示;待做:端口配置 / 状态持久化)
|
||||
|
||||
## 4. 里程碑
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user