clients: prefill a shared account so our devices auto-pair ("just us")

Default the account to a shared identity (overridable, persisted in
UserDefaults/prefs; agent via --account) instead of empty. With it prefilled,
every one of our devices on the same network auto-pairs over the LAN regardless
of room — no setup. Swapped in for the real Sign-in-with-Apple `sub` later.

Verified with the live Mac app: it and an agent in a totally different room
LAN-paired purely via the shared account.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 01:49:35 -05:00
parent c3b9b7940f
commit f7bc8eed4b
4 changed files with 13 additions and 5 deletions

View File

@@ -58,7 +58,7 @@ fn main() {
let host = std::env::var("HOSTNAME").unwrap_or_else(|_| "tether-agent".into());
let name = arg("--name", &host);
// Shared identity: same-account devices pair on the LAN regardless of room.
let account = arg("--account", "");
let account = arg("--account", "pecord@gmail.com");
eprintln!("tether-agent → {server} room={room} source={source}");

View File

@@ -18,6 +18,7 @@ data class FeedItem(val text: String, val source: String, val ts: Long, val id:
/// changes, so we auto-send via OnPrimaryClipChangedListener.
class TetherStore(private val context: Context) {
val serverURL = mutableStateOf(prefs().getString("serverURL", "https://tether.pecord.io")!!)
val account = mutableStateOf(prefs().getString("account", "pecord@gmail.com")!!)
val room = mutableStateOf(RoomIdentity.derive(context))
val feed = mutableStateListOf<FeedItem>()
val connected = mutableStateOf(false)
@@ -30,9 +31,9 @@ class TetherStore(private val context: Context) {
private var counter = 0L
fun connect() {
prefs().edit().putString("serverURL", serverURL.value).apply()
prefs().edit().putString("serverURL", serverURL.value).putString("account", account.value).apply()
disconnect()
val e = Engine(serverURL.value.trim(), room.value, deviceId, "android", android.os.Build.MODEL, "")
val e = Engine(serverURL.value.trim(), room.value, deviceId, "android", android.os.Build.MODEL, account.value)
e.start(Bridge())
engine = e
connected.value = true

View File

@@ -17,6 +17,8 @@ struct FeedItem: Identifiable, Equatable {
@MainActor @Observable
final class MacTetherStore {
var serverURL: String = UserDefaults.standard.string(forKey: "serverURL") ?? "https://tether.pecord.io"
// Prefilled shared identity for now it's just us, so all devices pair.
var account: String = UserDefaults.standard.string(forKey: "account") ?? "pecord@gmail.com"
var room: String = RoomIdentity.derive()
var feed: [FeedItem] = []
var nearby: [Peer] = [] // tether devices on the LAN, for the picker
@@ -45,10 +47,11 @@ final class MacTetherStore {
}
hasAttemptedConnect = true
UserDefaults.standard.set(serverURL, forKey: "serverURL")
UserDefaults.standard.set(account, forKey: "account")
disconnect()
let b = EngineBridge(store: self)
let e = Engine(server: url, room: room, from: deviceID, source: "macos", name: deviceID, account: "")
let e = Engine(server: url, room: room, from: deviceID, source: "macos", name: deviceID, account: account)
e.start(handler: b)
engine = e
bridge = b

View File

@@ -20,6 +20,9 @@ struct FeedItem: Identifiable, Equatable {
@MainActor @Observable
final class TetherStore {
var serverURL: String = UserDefaults.standard.string(forKey: "serverURL") ?? "https://tether.pecord.io"
// Prefilled shared identity for now it's just us, so all devices pair.
// Becomes the Sign-in-with-Apple `sub` once the dev program clears.
var account: String = UserDefaults.standard.string(forKey: "account") ?? "pecord@gmail.com"
var room: String = RoomIdentity.derive()
var feed: [FeedItem] = []
var connected = false
@@ -41,10 +44,11 @@ final class TetherStore {
return
}
UserDefaults.standard.set(serverURL, forKey: "serverURL")
UserDefaults.standard.set(account, forKey: "account")
disconnect()
let b = EngineBridge(store: self)
let e = Engine(server: url, room: room, from: deviceID, source: "ios", name: UIDevice.current.name, account: "")
let e = Engine(server: url, room: room, from: deviceID, source: "ios", name: UIDevice.current.name, account: account)
e.start(handler: b)
engine = e
bridge = b