Nod chat pane: transcript, work cards, composer and failure banners - #591
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
The transcript is folded from events.jsonl by a pure NodTranscript reducer; work cards, the composer and failure banners send NodCommands over control.sock through NodClient. NodGraphSlots is where the graph layer plugs in. Open in zsh tab types the command into a plain shell tab. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
…pane headless Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
…d actions to Nod's chat Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
The model chip lists NodModelCatalog, the chat starts on resolvedModel(for:tier:), and Always in project goes through addAllowlistPattern, so the pane and Settings never disagree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
scgopi
force-pushed
the
feat/nod-chat-pane
branch
from
October 2, 2026 05:09
58f938c to
6254836
Compare
4 of 5 tasks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: scgopi <scgopireddy@gmail.com>
Signed-off-by: scgopi <scgopireddy@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Nod's chat pane: a loop whose backend surface is
.chatopens a chat where a CLI loop's terminal would be, with the same tab strip and splits around it. The layout follows the design's recommendation: 1a's reading column as the base, plus 1b's folded Work block and queued-message row. Stacked on #589 (feat/nod-setup, itself on #583), because the pane uses NodSetup'sNodModelCatalog,resolvedModel(for:tier:)andaddAllowlistPattern. Rebase ontomainonce those merge. Retarget this PR before deleting #589's branch, or GitHub closes it. No wire-contract change:NodProtocol.swiftandPROTOCOL.mdare untouched.Changes
NodTranscript: a pure reducer that foldsNodEventRecords into turns and cards. It handles:turnStartedReplayed records are dropped. A
sessionStartednewer than anything already seen starts a new run, and a turn left open by the old run is closed as interrupted.NodChatPresentation: pure view logic./commands and@mentions. A running loop is messaged and a finished one has its transcript attached; ⇥ swaps the two.NodChatFeature(TCA):NodModelCatalogfor the engine and sendssetModel. Before the firstsessionStarted, the chat shows the model Settings would launch, fromresolvedModel(for:tier:).Delegateactions: Open in zsh tab, edit goal, sign in, raise cap, fork as sibling, run as Composite,/handoff/ask/promote.NodSettings.addAllowlistPattern, because the runtime keeps Always for the session only.fork,sendDraftorrunPlan, that action shows disabled rather than as an error.NodClient: tailsevents.jsonlfrom a byte offset and holds back a torn last line. Sends oneNodCommandper connection overcontrol.sock, with send and receive timeouts. A dependency, so tests and renders replay a scripted log.Views: goal header pinned with the verdict, which opens to show the clauses. Work cards:
Also the composer and its menus, the failure banners, and the steered and queued rows. The composer is an
NSTextViewbecause SwiftUI focus cannot take first responder from a Ghostty surface in the same window.NodGraphSlots: where NodGraphLayer plugs in, agreed with that stream. Slots: context strip, after-turn, above-composer, inbound mail or handoff in place of the prompt bubble, after-goal-check (handoff offer), plan card, mail draft. All default to nothing.Workspace:
LoopWorkspaceViewdrawsNodChatPaneViewin the agent pane for chat loops. "Open in zsh tab" reuses or creates a plain shell tab and types the command at its prompt without running it (TerminalSurfaceClient.typeText).Review renders
NodChatRenderTestsrenders 8 states headless withNSHostingView. Every run lays them out; PNGs are written only when/tmp/nod-chat-rendersexists. The states:/menu,@menuTest plan
RED: xcodebuild test -only-testing:graphcodeTests/NodTranscriptTests, with the first dedupe rule that let any sessionStarted reset seq -> replayedRecordsAreDroppedButANewRunStartsItsOwnSequence failed: transcript.turns.map(.number) was [1, 1, 2], expected [1, 2], exit 65
GREEN: xcodebuild test for the 7 Nod suites (NodTranscriptTests NodEventTailTests NodComposerMenuTests NodChatFeatureTests NodWorkspaceWiringTests NodControlSocketTests NodChatRenderTests) -> pass, 50 tests on 6254836 plus the state-directory test on c909504
REGRESSION: xcodebuild test, full graphcode scheme, private DerivedData, on c909504 -> pass, 2111 tests in 233 suites, exit 0; on 6254836 graphcode-cli and graphcoded builds exit 0, scripts/cli-smoke.sh exit 0, make check exit 0 (c909504 adds one test only)
Checklist
git commit -s) per the DCOxcodebuild testwith private DerivedData, numbers above)make check)