Commit Graph
610 Commits
Author SHA1 Message Date
abkslmandClaude Fable 5 e623247117 Merge branch 'claude/vigorous-nash-457773' into dev
Tailscale (Tailnet) sync transport: transport picker in Settings ▸ Remote,
interactive browser login, and LAN↔tailnet fallback.

Semantic merge fixes (both sides compiled alone but not together):
- handleTransportFailure (dev's friendly transport errors) now checks
  connectivity.isLive — .connected gained a transport payload on the branch —
  and stays silent while the branch's connect chain still has candidates to
  try, so a LAN probe failing over to the tailnet doesn't flash a red error.
- Chain-exhaustion paths keep a friendlier transport-level failure message
  when onFailed already surfaced one instead of clobbering it with the
  generic handshake error.

Verified on the merge: swift build + 37 sync/transport/store tests green
(incl. dev's FilePairedDeviceStore + the now-fixed contract tests), iOS
simulator build green.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-03 16:22:13 -07:00
abkslmandClaude Fable 5 272039cca5 Tailnet: interactive browser login + LAN↔tailnet fallback
Browser login — the auth key is now optional on both platforms. When the
embedded node starts with no key, TailnetNode asks the backend (LocalAPI
backendStatus — IPN state, deliberately not filesystem heuristics: tsnet
writes logs and a machine key on every start, registered or not) whether a
login is needed, triggers login-interactive, surfaces the auth URL through a
new statusStream()/.needsLogin, and waits for Running (4-minute deadline,
generation-fenced against stop/restart). The Mac auto-opens the login page
from Settings ▸ Remote and shows a re-open button; the iPhone auto-opens only
during user-initiated pairing (a background reconnect that suddenly needs a
login must not eject the user to Safari — Settings ▸ Tailscale carries the
link). The remote-access toggle now reflects the in-flight start instead of
snapping off for the whole login window, and toggling off mid-start is
honored at both commit points (before and after host.start).

LAN↔tailnet fallback — picking Tailnet now keeps LAN on too: the host runs
both listeners under a new CompositeSyncListener (merged accept stream; one
child ending doesn't end the rest) and the pairing QR carries both hints.
The phone builds an ordered candidate chain — LAN first (QR hint or Bonjour),
tailnet second — and walks it on pair and reconnect, so a phone that leaves
the Mac's Wi‑Fi rolls over to the tailnet and rolls back when it returns.
A per-channel 4s connect guard (readiness-checking, bound to exactly its
channel) keeps a stale LAN hint from hanging the chain; a stale-client guard
in consume() keeps a replaced client's tail events from advancing it; chain
exhaustion during pairing lands in a terminal failure instead of spinning on
"Connecting…"; routine pre-fallback handshake errors no longer flash the red
error bubble. "Connected · LAN / Tailnet" shows whichever transport won.

Multi-agent review: 11 confirmed findings (incl. the login gate being dead
code via tsnet's eager state-dir writes, and two connect-timeout races), all
fixed and re-verified. Suite green (24 sync-related tests incl. 3 new
CompositeSyncListener tests); macOS + iOS builds clean.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-03 16:14:45 -07:00
abkslmandClaude Fable 5 94a962bd20 Add Tailscale (Tailnet) as a sync transport between Mac and iPhone
Settings ▸ Remote gains a "Connect via" picker — LAN (default), Tailscale
(tailnet), or Relay (disabled, coming soon). On Tailnet, both devices run an
embedded tsnet node via TailscaleKit (tailscale/libtailscale) and sync frames
flow over the user's tailnet, so the phone can connect from anywhere the
tailnet reaches; Noise E2EE runs above the transport unchanged.

- NucleicTailnet (new target, macOS + iOS): TailnetNode wraps TailscaleKit's
  node lifecycle (auth-key login, generation-fenced start/stop since up() is
  un-cancellable) and drops to the framework's public C API for the data path
  — tailscale_dial/listen/accept hand back full-duplex socketpair fds, wrapped
  by FDFrameChannel (DispatchIO) into the shared FrameChannel seam. The Swift
  wrapper's one-way connection actors can't carry a bidirectional stream.
- Host: TailnetListener adopts SyncListener; startSyncServer is single-flight
  and honors toggle-off/picker changes at the commit point; pairing QRs carry
  transport + tailnet IP/port hints (PairingPayload additive optional fields,
  forward/backward compatible over CBOR).
- iPhone: pair/reconnect dial over whichever transport the pairing recorded;
  Settings gains a Tailscale auth-key field (Keychain, committed on editing
  end); connectivity chip shows "Connected · Tailnet".
- TailscaleKit has no SwiftPM distribution: scripts/build-tailscalekit.sh
  builds a pinned libtailscale commit into an untracked local xcframework;
  Package.swift links it only when present (everything builds without it, the
  picker then reports Tailscale support as not built in), and the script
  clears SwiftPM's content-keyed manifest cache so the toggle is picked up.
- iOS floor 17.0 → 18.1 (TailscaleKit requires the iOS 18 Swift runtime);
  package-app.sh embeds the framework in the .app like Sparkle.

703-test suite: no new failures (the 7 fake-claude/fake-grok staging issues
reproduce identically on an untouched checkout — pre-existing, tracked
separately). New coverage: FDFrameChannel over socketpairs, pairing-payload
version-skew both directions, transport-setting resolution.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-03 03:50:45 -07:00
abkslmandNucleic 22d0752329 nvrsion: Add fix for QR Code Scan Failure in AppStore, Sync, and Tests; explore connection failures over local network; update Info.plist, Models, and SettingsView.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-03 01:42:40 -07:00
abkslmandNucleic 2c634e7db6 QR Code Scan Failure
Nucleic-Session: 80E30D7B-70A8-479A-A9A8-7E267486EAE1
Co-authored-by: Nucleic <[email protected]>
2026-07-03 01:41:42 -07:00
abkslmandNucleic 308fc28448 QR Code Scan Failure
Nucleic-Session: 80E30D7B-70A8-479A-A9A8-7E267486EAE1
Co-authored-by: Nucleic <[email protected]>
2026-07-03 01:41:04 -07:00
abkslmandNucleic 701bd6e6ab QR Code Scan Failure
Nucleic-Session: 80E30D7B-70A8-479A-A9A8-7E267486EAE1
Co-authored-by: Nucleic <[email protected]>
2026-07-03 01:40:53 -07:00
abkslmandNucleic 16da64da3b QR Code Scan Failure
Nucleic-Session: 80E30D7B-70A8-479A-A9A8-7E267486EAE1
Co-authored-by: Nucleic <[email protected]>
2026-07-03 01:40:46 -07:00
abkslm 60eea6ece2 release(ios/canary): v0.2.0 (build 5) 2026-07-02 22:50:41 -07:00
abkslm cb6976baa4 release(ios/beta): v0.2.0 (build 4) 2026-07-02 22:32:37 -07:00
abkslm 48732940d3 Merge branch 'canary' into staging 2026-07-02 22:23:13 -07:00
abkslm 572262c224 Merge branch 'dev' into canary 2026-07-02 22:23:03 -07:00
abkslm bc006e4e40 Merge branch 'canary' into staging 2026-07-02 22:15:20 -07:00
abkslm 1a9eff585e Merge branch 'dev' into canary 2026-07-02 22:13:52 -07:00
abkslm cce6a0c4d9 Merge branch 'dev' into nucleic/trunk 2026-07-02 22:12:16 -07:00
abkslmandNucleic f668a204ab nvrsion: Add: Adjust iOS beta channel release targets to “Nucleic Remote (Beta)” in BUILD.md, Makefile, app-logo-beta.icon/icon.json, ios/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj, scripts/ios-release.sh, signing/README.md.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 22:12:15 -07:00
abkslmandNucleic 65a7897233 iOS Beta Target Adjustment
Nucleic-Session: B5F39681-AF29-4F9A-8666-16E1FD5009A3
Co-authored-by: Nucleic <[email protected]>
2026-07-02 22:04:54 -07:00
abkslmandNucleic 528f1b08db iOS Beta Target Adjustment
Nucleic-Session: B5F39681-AF29-4F9A-8666-16E1FD5009A3
Co-authored-by: Nucleic <[email protected]>
2026-07-02 22:04:47 -07:00
abkslmandNucleic 137ca12a4d iOS Beta Target Adjustment
Nucleic-Session: B5F39681-AF29-4F9A-8666-16E1FD5009A3
Co-authored-by: Nucleic <[email protected]>
2026-07-02 22:04:40 -07:00
abkslmandNucleic 962a6014d8 iOS Beta Target Adjustment
Nucleic-Session: B5F39681-AF29-4F9A-8666-16E1FD5009A3
Co-authored-by: Nucleic <[email protected]>
2026-07-02 22:04:34 -07:00
abkslmandNucleic b10b26ba37 nvrsion: Add: Align iOS remote banner cases (beta, canary, etc) to desktop version to fix divergence in build number hash.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:58:03 -07:00
abkslm 423a356fe2 Merge branch 'dev' into nucleic/trunk 2026-07-02 21:58:03 -07:00
abkslmandNucleic e960e6e4d5 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:57:48 -07:00
abkslmandNucleic 7b5bdc9d0b nvrsion: Add: Adjust Canary Build Auto-Update to run every hour, fix Keychain permission audit by updating files: ControlAuth.swift, GitHubCredentials.swift, HeartbeatReporter.swift, KeychainOwnedAccess.swift, HostIdentityStore.swift, PushRelayClient.swift, refactor Remote Build Icon to use “bell.and.waves.left.and.right.fill” in ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift, add a Remote Release Channel Check in AppStore.swift, Sync/ConnectionHandler.swift, Sync/SyncHostBridge.swift, Sync/ReleaseChannel.swift, Sync/SyncClient.swift, Sync/WireMessages.swift, tests/SyncHostTests.swift, tests/SyncTestSupport.swift, and align build number hash in ios/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj, ios/NucleicRemote/NucleicRemote/Info.plist, ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:54:40 -07:00
abkslm 1f11f6f330 Merge branch 'dev' into nucleic/trunk 2026-07-02 21:54:40 -07:00
abkslmandNucleic 36083dc4e3 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:53:46 -07:00
abkslmandNucleic 7379bfba49 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:53:23 -07:00
abkslmandNucleic aa38f931e1 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:52:27 -07:00
abkslmandNucleic 41ee43aa75 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:52:14 -07:00
abkslmandNucleic 9bc685aa3f Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:52:07 -07:00
abkslmandNucleic 159d7636a2 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:52:00 -07:00
abkslmandNucleic 1ec8871536 Build Number Hash Alignment
Nucleic-Session: F8E9CC32-59CC-4022-B42C-0B0694C57F42
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:51:55 -07:00
abkslm 33e0459451 release(ios/beta): v0.1.0 (build 3) 2026-07-02 21:45:51 -07:00
abkslmandNucleic c6175b7185 Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:42:08 -07:00
abkslmandNucleic d3cc7796dd Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:41:33 -07:00
abkslmandNucleic a06c2c58ad Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:41:06 -07:00
abkslmandNucleic 51b5820a81 Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:40:59 -07:00
abkslmandNucleic d3515605f7 Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:40:54 -07:00
abkslmandNucleic 566135ae89 Add Remote Release Channel Check
Nucleic-Session: 7D1A5F60-CF2F-44E6-B060-51C4C2EA79D1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:40:49 -07:00
abkslmandNucleic f7db53d5e9 Update Remote Build Icon
Nucleic-Session: E79EC03D-CA77-4899-9DCC-85A053633105
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:37:42 -07:00
abkslm 63b754b2dd release(ios/canary): v0.1.0 (build 2) 2026-07-02 21:21:47 -07:00
abkslm 7e75880eb5 Merge branch 'dev' into canary 2026-07-02 21:09:54 -07:00
abkslmandNucleic 535c092fcc nvrsion: Add: Update Info.plist to reflect no encryption requirement for TestFlight versions.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:09:09 -07:00
abkslm 91b059a2bd Merge branch 'dev' into nucleic/trunk 2026-07-02 21:09:09 -07:00
abkslmandNucleic 2b97633b99 Create TestFlight Versions
Nucleic-Session: 1E7DF522-F57E-4717-8A39-4AA9781F3DBB
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:08:54 -07:00
abkslm 36e2d4ff04 Merge branch 'dev' into canary 2026-07-02 20:10:30 -07:00
abkslmandNucleic 1bf1f4e658 nvrsion: Add “To-do” count stat card to iOS app.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 19:37:45 -07:00
abkslm f1c1452a24 Merge branch 'dev' into nucleic/trunk 2026-07-02 19:37:45 -07:00
abkslmandNucleic 62b242da5f Adjust Stat Card Layout
Nucleic-Session: 0112C718-2A09-4547-9C71-C6C8A08BA385
Co-authored-by: Nucleic <[email protected]>
2026-07-02 19:37:34 -07:00
abkslmandNucleic b53864f5d0 Adjust Stat Card Layout
Nucleic-Session: 0112C718-2A09-4547-9C71-C6C8A08BA385
Co-authored-by: Nucleic <[email protected]>
2026-07-02 19:37:27 -07:00