Sessions Integration Feature
Nucleic-Session: FC94353F-9F0D-4BCC-AD7C-0FB14E38C2E5 Co-authored-by: Nucleic <[email protected]>
This commit is contained in:
@@ -867,12 +867,54 @@ final class RemoteStore: ObservableObject {
|
|||||||
|
|
||||||
// MARK: - Plumbing
|
// MARK: - Plumbing
|
||||||
|
|
||||||
/// Route an intent to the active host's connection (mesh P3). Every current intent — subscribe,
|
/// Route an intent to the Mac that owns its target (mesh P3). Sessions/projects/to-dos are shown
|
||||||
/// send-input, approvals, favorite/archive/delete, start-chat — targets a session or project on
|
/// merged across every connected Mac, so an intent goes to the connection that owns the session,
|
||||||
/// the Mac whose list is on screen, i.e. the active one.
|
/// project, or to-do it names — not to a single "active" host. Host-agnostic pulls (list
|
||||||
|
/// sessions/dashboard) broadcast to every live Mac; a project-less to-do capture (no owner) goes
|
||||||
|
/// to the first live Mac. Demo has no connections and mutates the seeded aggregate directly.
|
||||||
private func send(_ msg: ClientMsg) {
|
private func send(_ msg: ClientMsg) {
|
||||||
if demoMode { demoHandle(msg); return }
|
if demoMode { demoHandle(msg); return }
|
||||||
activeConnection?.send(msg)
|
switch msg {
|
||||||
|
// Session-owning intents → the Mac that has this session.
|
||||||
|
case .subscribe(let s):
|
||||||
|
connection(owningSession: s.sessionID)?.send(msg)
|
||||||
|
case .unsubscribe(let id), .interrupt(let id), .deleteSession(let id), .discard(let id),
|
||||||
|
.integrate(let id, _), .renameSession(let id, _), .setFavorite(let id, _),
|
||||||
|
.setArchived(let id, _), .setSessionModel(let id, _), .setSessionEffort(let id, _),
|
||||||
|
.setSessionAuto(let id, _), .setSessionAutoShip(let id, _), .setSessionShipBranch(let id, _),
|
||||||
|
.sendInput(let id, _), .cancelQueuedMessage(let id, _), .fetchDiff(let id):
|
||||||
|
connection(owningSession: id)?.send(msg)
|
||||||
|
|
||||||
|
// Project-owning intents → the Mac that has this project.
|
||||||
|
case .startChat(let req):
|
||||||
|
connection(owningProject: req.projectID)?.send(msg)
|
||||||
|
case .dispatchTodo(_, let projectID):
|
||||||
|
connection(owningProject: projectID)?.send(msg)
|
||||||
|
|
||||||
|
// To-do-owning intents → the Mac that has this to-do.
|
||||||
|
case .setTodoStatus(let id, _), .deleteTodo(let id):
|
||||||
|
connection(owningTodo: id)?.send(msg)
|
||||||
|
|
||||||
|
// A capture with a project goes to that Mac; a project-less one has no owner → first live.
|
||||||
|
case .captureTodo(let req):
|
||||||
|
if let pid = req.projectID, let conn = connection(owningProject: pid) { conn.send(msg) }
|
||||||
|
else { firstLiveConnection?.send(msg) }
|
||||||
|
|
||||||
|
// Approvals carry no sessionID — `respond(_:_:)` routes by the approval's session directly;
|
||||||
|
// a stray one here (or a notification-driven decision) broadcasts and the owner resolves it.
|
||||||
|
case .approvalRespond:
|
||||||
|
broadcastLive(msg)
|
||||||
|
|
||||||
|
// Host-agnostic pulls → every live Mac.
|
||||||
|
case .listSessions, .listDashboard:
|
||||||
|
broadcastLive(msg)
|
||||||
|
|
||||||
|
// Never originated from here (connection-internal, or handled by dedicated loops).
|
||||||
|
case .hello, .ping, .listPeers, .addressUpdate, .meshRoster,
|
||||||
|
.registerLiveActivity, .endLiveActivity,
|
||||||
|
.transferOffer, .transferChunk, .transferCommit, .transferCancel, .fetchTranscript:
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Live Activity push registration (UX_IOS §5.3)
|
// MARK: - Live Activity push registration (UX_IOS §5.3)
|
||||||
|
|||||||
Reference in New Issue
Block a user