package net.kentonc.si.agent
import android.content.Context
/** All settings, the equivalent of src/config.rs in the Rust original (there
* they're compile-time constants; here they're user-editable, since a remote
* server address changes per device anyway).
*/
data class Config(
val baseUrl: String = DEFAULT.baseUrl,
val apiKey: String = DEFAULT.apiKey,
val model: String = DEFAULT.model,
val temperature: Float = DEFAULT.temperature,
val maxTokens: Int = DEFAULT.maxTokens,
val autoApprove: Boolean = DEFAULT.autoApprove,
) {
companion object {
val DEFAULT = Config(
baseUrl = "http://127.0.0.1:8085",
apiKey = "none",
model = "Qwen3.8-27B-GSQ-RCO-IQ3_XXS-mtp.gguf",
temperature = 0.7f,
maxTokens = 2048,
autoApprove = false,
)
}
}
/** SharedPreferences-backed persistence for [Config]. */
class SettingsStore(context: Context) {
private val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
/** Cached in memory; save() rewrites it and bumps the version counter. */
var config: Config
private set
/** Bumped on every save so UI observing it recomposes with the new values. */
var version: Int = 0
private set
init {
val loaded = load()
if (loaded != null) {
config = loaded
} else {
// First launch: persist the defaults so Settings opens populated.
config = Config.DEFAULT
save(Config.DEFAULT)
}
}
fun load(): Config? {
if (!prefs.contains("base_url")) return null
return Config(
baseUrl = prefs.getString("base_url", Config.DEFAULT.baseUrl)!!,
apiKey = prefs.getString("api_key", Config.DEFAULT.apiKey)!!,
model = prefs.getString("model", Config.DEFAULT.model)!!,
temperature = prefs.getFloat("temperature", Config.DEFAULT.temperature),
maxTokens = prefs.getInt("max_tokens", Config.DEFAULT.maxTokens),
autoApprove = prefs.getBoolean("auto_approve", Config.DEFAULT.autoApprove),
)
}
fun save(c: Config) {
config = c
version++
prefs.edit()
.putString("base_url", c.baseUrl)
.putString("api_key", c.apiKey)
.putString("model", c.model)
.putFloat("temperature", c.temperature)
.putInt("max_tokens", c.maxTokens)
.putBoolean("auto_approve", c.autoApprove)
.apply()
}
}