Commit Graph
984 Commits
Author SHA1 Message Date
abkslmandNucleic ae951e45e7 Feature Enhancement Planning
Nucleic-Session: 3CD3A375-8BC1-407E-951F-8EF136B08390
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:50:40 -07:00
abkslmandNucleic 434664f371 Feature Enhancement Planning
Nucleic-Session: 3CD3A375-8BC1-407E-951F-8EF136B08390
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:50:30 -07:00
abkslmandNucleic afa7410dae Feature Enhancement Planning
Nucleic-Session: 3CD3A375-8BC1-407E-951F-8EF136B08390
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:50:20 -07:00
abkslmandNucleic 331aac15f1 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:46:05 -07:00
abkslmandNucleic ff605a3997 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:46:00 -07:00
abkslmandNucleic d8561b325d Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:45:47 -07:00
abkslmandNucleic 09f66f211f Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:41:47 -07:00
abkslmandNucleic fbbff8e26c Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:41:40 -07:00
abkslmandNucleic d404442c68 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:41:26 -07:00
abkslmandNucleic 3871572bc4 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:41:21 -07:00
abkslmandNucleic 79163a4b66 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:41:15 -07:00
abkslmandNucleic 80659ec103 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:40:54 -07:00
abkslmandNucleic 8ae92b7961 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:40:35 -07:00
abkslmandNucleic 96b7d7cc79 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:40:29 -07:00
abkslmandNucleic efc7e4c7fb Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:40:00 -07:00
abkslmandNucleic 087f49d592 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:54 -07:00
abkslmandNucleic d80e94fc24 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:46 -07:00
abkslmandNucleic e15c1d9b89 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:41 -07:00
abkslmandNucleic b0b041f268 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:36 -07:00
abkslmandNucleic ce4028ffc8 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:26 -07:00
abkslmandNucleic f988f660fe Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:19 -07:00
abkslmandNucleic 36e146f258 Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:14 -07:00
abkslmandNucleic 030d814ffe Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:39:08 -07:00
abkslmandNucleic 63a1c9dd9e Network Type Transition Optimization
Nucleic-Session: 40F8C53A-F001-423A-8607-EAE181DBE14B
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:38:55 -07:00
abkslmandNucleic 6ff0a3fb91 Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:40 -07:00
abkslmandNucleic fdb346f41a Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:33 -07:00
abkslmandNucleic 32ef11b000 Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:24 -07:00
abkslmandNucleic d0b63121d3 Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:18 -07:00
abkslmandNucleic 8bedbc8d98 Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:14 -07:00
abkslmandNucleic 92e7c59dd6 Remove Face ID Permission Text
Nucleic-Session: 3EF7F067-2199-41C2-997C-5546C1A8A5C4
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:31:10 -07:00
abkslmandNucleic 693ca29691 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:30:53 -07:00
abkslmandNucleic a45795184e Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:30:15 -07:00
abkslmandNucleic 0dda487167 Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9
Co-authored-by: Nucleic <[email protected]>
2026-07-04 23:29:52 -07:00
abkslm 0996afc47b release(ios/canary): v0.2.0 (build 6) 2026-07-04 22:49:17 -07:00
abkslm 861ca34f06 Merge branch 'dev' into nucleic/trunk 2026-07-04 22:43:59 -07:00
abkslm 88329de96a Merge branch 'dev' into canary 2026-07-04 22:11:37 -07:00
abkslmandClaude Fable 5 3e25ef9559 feat(relay): wire the live Nucleic Private Relay into the desktop + iOS apps (mesh P2 complete)
The relay Worker (nucleic-edge at relay.nucleic.blakeslee.xyz) is deployed, so land the
formerly deploy-gated client side of the data path:

- NucleicProtocol/Sync/RelayTransport.swift: RelayAPI (one base URL for REST + WS,
  membership -> connection token trade), RelayWebSocket (ordered sends, ping keepalive,
  ping-confirmed connect), RelayFrameChannel (client leg, WireFraming inside WS binary,
  presence fail-fast when the room has no host), RelayPresence.
- NucleicCore/Sync/RelayAccess.swift: X25519 PoP enrollment (RelayEnrollment), room
  credential in the login Keychain (separate from the push credential), membership minting
  with re-enroll-on-401.
- NucleicCore/Sync/RelayListener.swift: host SyncListener demuxing the room socket into
  per-tag virtual FrameChannels via RelayEnvelope; presence-driven reaping; backoff redial;
  injectable RelayRoomSocket seam for tests.
- Wire: additive HostMsg.relayMembership(WireRelayMembership) pushed after every hello
  (SyncHost.register -> AppStore mint) so devices paired before the relay adopt it and the
  ~90-day token refreshes on each connect; the pairing QR also carries a bootstrap
  membership so first contact can ride the relay. Old clients ignore the unknown tag.
- AppStore: .relay joins the listener composite behind the Connection-methods checkbox
  (failure degrades to a status row), advertises relayRoomID in PeerAddresses, mints the
  QR bootstrap in beginPairing.
- Desktop UI: the Nucleic Private Relay toggle is enabled (was "coming soon"); the
  LAN-only banner offers it alongside Tailnet.
- iOS: relay is the last dial candidate in HostConnection pair + reconnect (10s handshake
  watchdog); PairedHost persists relayRoomID/relayMembershipToken/relayURL; the
  relayMembership push updates the registry in place; Settings shows Relay in Transports.

Tests: RelayTransportTests, RelayListenerTests, SyncHostTests relay push + QR bootstrap.
Full suite green (783 core + 113 protocol + 2 new); iOS simulator build succeeds. Live
smoke test against the deployed Worker passed end-to-end (PoP enroll, both token tiers,
two-socket frame round-trip through the Room DO with correct envelope tags).

Known limits: host revoke-on-unpair not wired (endpoint is admin-only); PeerClient
(Mac<->Mac) doesn't dial the relay yet.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-04 21:05:01 -07:00
abkslm f8ce672af6 Merge branch 'dev' into nucleic/trunk 2026-07-04 20:15:01 -07:00
abkslm fad4f23b60 Merge branch 'dev' into canary 2026-07-04 19:14:47 -07:00
abkslm b587702ff5 Merge claude/keen-shamir-122122 into dev (mesh P3 multiplexer)
The iOS [HostID: HostConnection] multiplexer: connect to all paired Macs at once, mirror the active
one, instant host switching, cross-host badge/Live Activity. Compile + demo-verified; the live
multi-connection path needs a two-Mac test (may be rolled back).

Resolves the RemoteStore.swift overlap with dev's Tailnet-node-name/auth-key change by taking the
multiplexer version (which moved the tailnet config into HostConnection); dev's authKey removal is
re-applied there.

Co-Authored-By: Claude Opus 4.8 <[email protected]>

# Conflicts:
#	ios/NucleicRemote/NucleicRemote/Models/RemoteStore.swift
2026-07-04 18:56:54 -07:00
abkslm ce8771fa99 Merge branch 'dev' into nucleic/trunk 2026-07-04 18:37:15 -07:00
abkslmandNucleic 0b9afb22f3 nvrsion: Add: Adjust Tailscale Node Name format and remove “Tailscale auth key” setting to enable immediate browser login when toggle is enabled.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-04 18:37:15 -07:00
abkslmandNucleic e463489b62 Tailscale Auth Key Logic
Nucleic-Session: 5360EC95-9A29-4CB4-8061-E869AC2BC518
Co-authored-by: Nucleic <[email protected]>
2026-07-04 18:36:00 -07:00
abkslmandNucleic 60c59bc8ba Tailscale Auth Key Logic
Nucleic-Session: 5360EC95-9A29-4CB4-8061-E869AC2BC518
Co-authored-by: Nucleic <[email protected]>
2026-07-04 18:35:49 -07:00
abkslmandNucleic f98c78ec2e Tailscale Auth Key Logic
Nucleic-Session: 5360EC95-9A29-4CB4-8061-E869AC2BC518
Co-authored-by: Nucleic <[email protected]>
2026-07-04 18:35:32 -07:00
abkslmandClaude Opus 4.8 a24f113996 Mesh P3: wire RemoteStore onto the [HostID: HostConnection] multiplexer
Completes the multiplexer rewire begun in f335eb4. RemoteStore no longer runs an inline single
connection — it owns `connections: [HostID: HostConnection]` and connects every paired Mac at once,
so all your Macs are live simultaneously.

- reconnect() connects/reconnects all paired hosts (dropping since-unpaired ones); pair() adds a new
  connection and makes it active while the others keep running; unpair() drops the active Mac and
  switches to a remaining one.
- The flat @Published state (connectivity/sessions/dashboard/capabilities/…) mirrors the *active*
  connection via callbacks, so switchHost() is now instant — every Mac is already connected, so it
  just re-points at the target's live state (no reconnect).
- Aggregate concerns merge across hosts: the app-icon badge counts needs-you across ALL Macs, Live
  Activity summarizes all live sessions, and an approval answered from a notification is broadcast to
  every connection (the owner resolves it; the notification carries no hostID yet). Intents (send /
  open / approvals) route to the active connection.

Removed ~450 lines of connection machine from RemoteStore (now in HostConnection); kept
friendlyTransportError/showError/dismissError. Demo bypasses connections (seeds state directly).

Compiles (iOS Simulator BUILD SUCCEEDED) and the demo host switcher is runtime-verified (screenshots:
switching Macs swaps the session list + tab badge). The LIVE multi-connection path — simultaneous
dials, reconnect/teardown, the shared embedded tailnet node — is compile-verified only; it needs two
real Macs to validate.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-04 18:22:39 -07:00
abkslm 420b363d1c Merge branch 'dev' into nucleic/trunk 2026-07-04 18:03:50 -07:00
abkslmandClaude Opus 4.8 4f12b18d63 Mesh P3 (multiplexer, WIP): extract HostConnection engine
Begins the simultaneous multiplexer. HostConnection.swift is the per-host connection engine lifted
out of RemoteStore: one instance owns a single Mac's SyncClient, LAN→tailnet candidate chain,
reconnect backoff, tailnet-node lifecycle, and event stream, and keeps that Mac's projection
(connectivity, sessions, dashboard, capabilities, meshPeers). It talks back to its owner through a
Callbacks struct so aggregate concerns — the badge, Live Activity, notifications, and the single open
transcript — can be merged across hosts by the coordinator.

Not yet wired: RemoteStore still runs its own inline single-connection machine. The next step swaps
RemoteStore onto a `[HostID: HostConnection]` map (connect all paired Macs, aggregate their sessions,
route intents by host) — the behavior-critical part, to be verified with two real Macs. Compiles
(iOS Simulator BUILD SUCCEEDED); no behavior change yet (the engine is unused until the rewire).

Also: RemoteStore.friendlyTransportError made non-private so the engine shares it.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-04 17:56:31 -07:00
abkslm fb6a68fd34 Merge claude/keen-shamir-122122 into dev (mesh P5 finish + P3 host switcher)
Mesh P5 feature-complete except the two-Mac memory-carry spike: moved/arrived-session
visibility, relaunch recovery, bulk hand-off, stranded-arrival activate-anyway. Plus the
iOS build fix (equivalent to dev's f021ef8) and P3 foundation: paired-host registry +
migration and a host switcher (switch active Mac; 2-host demo, simulator-verified).

Co-Authored-By: Claude Opus 4.8 <[email protected]>

# Conflicts:
#	ios/NucleicRemote/NucleicRemote/Models/RemoteStore.swift
2026-07-04 17:49:10 -07:00
abkslmandClaude Opus 4.8 7b7e13aa20 Mesh P3: host switcher (switch active Mac) + 2-host demo
The safe, verifiable slice of iOS multi-host: switch which paired Mac the phone views, reusing the
existing (proven) single-connection reconnect — no rewrite of the connection state machine. The
simultaneous [HostID: HostConnection] multiplexer stays deferred (it needs two real Macs to verify).

RemoteStore: an `activeHostID` (the paired Mac the flat projection reflects); `hostChoices` (paired
registry live, mock hosts in demo); `switchHost(to:)` — live re-points via reconnect(), demo swaps
the mock host preserving in-demo edits; `reconnect()`/`pair()` set the active host; `unpair()` now
forgets the *active* Mac and switches to a remaining one if any (identical for a single host). Demo
seeds two mock Macs ("Andrew's Mac", "Studio Mac") with distinct sessions/dashboards.

SessionsView: a host-switcher menu in the toolbar, shown only when >1 Mac.

Verified in the iOS Simulator (demo mode): the switcher lists both Macs, and switching swaps the
whole session projection + the tab badge (screenshots taken). Single-host behavior is unchanged
(one host ⇒ switcher hidden ⇒ flat state exactly as before).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-04 17:40:00 -07:00