From be5e6791933ce066c27954ba7c6759699e0eb371 Mon Sep 17 00:00:00 2001 From: Nucleic Date: Tue, 4 Aug 2026 23:39:54 -0700 Subject: [PATCH] Merge nucleic/clever-jade-shrew-bnrd into dev --- .../NucleicRemote/Views/SessionDetailView.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index d431fad..5617f14 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -408,14 +408,24 @@ struct SessionDetailView: View { // than being sent and silently ignored. set: { on in if on { store.setSessionOrchestra(sessionID) } }), catalog: store.intelligenceCatalog, - enabled: store.connectivity.isLive && !summary.archived, + // Locked once the chat is in Orchestra, matching the Mac's composer: from + // there its model is the supervisor configured on the host, not a stop on + // this rail, and the host refuses a level for it anyway + // (`setSessionIntelligence`) — so the rail parks on the node rather than + // offering moves that would bounce. + enabled: store.connectivity.isLive && !summary.archived && !sessionOrchestra, // Always offered — no Nucleic Control gate. See the new-chat composer. orchestraAvailable: store.intelligenceCatalog.orchestraAvailable, composerText: draft, routeDescription: sessionRouteDescription, unavailableReason: summary.archived ? "This chat is archived." - : (store.connectivity.isLive ? nil : "The Mac that owns this chat is offline."), + : !store.connectivity.isLive + ? "The Mac that owns this chat is offline." + : (sessionOrchestra + ? "This chat runs Orchestra — its supervisor model is set on the " + + "Mac and stays fixed for the life of the chat." + : nil), onPreviewChanged: { intelligencePreview = $0 }) IntelligenceRouteLine( level: level,