Repository navigation
feat(native): complete TV-SIDECHAT and TV-LINEAGE parity - #365
Merged
Merged
Conversation
Bring TV-SIDECHAT and TV-LINEAGE to parity with web and mark both rows done in LEDGER.md (Ref #243). - Side chat (Closes #287, upstream `pingdotgg#31114`): stop forcing runtimeMode on initial side-chat message commands, reject bring-back/delete/post when connection lacks orchestration:operate scope, and guard post-fork send against removed side-chat threads with discard cleanup. - Lineage relationships & unlisted titles (Closes #283, upstream `pingdotgg#29000`): fetch unlisted parent/child titles via orchestration.getThreadTitles keyed on (connection, unlisted_ids, removed_at), prune deleted forks after settlement, preserve fresh titles, and gate merge/stop/child-approval actions behind orchestration:operate. - Subagent/child traits parity (Ref #296, upstream `pingdotgg#27034`): handle legacy ultracode effort fallback/matching, selectable model slug fallback, and Claude minor-version badge collapsing in ComposerLineage without closing #296 (CO-TRAITS remains open). Implemented with Gemini / Antigravity.
Fix unlisted/archived title fetch and resolved precedence, gate side-chat mutations behind orchestration:operate, clear ThreadTitlesFeed active_key on error with backoff and respect closed DetailsView cards, and restore related/active/previous lineage groups with workflow expansion and running counts. Model: Gemini 3.1 Pro (Antigravity)
… parity Keep the Lineage section visible for unlinked running subagents, remote subagents, delegated parents, and live session detach actions; add auto-opening workflow phases with counts, failed labels, elapsed timers, and empty placeholders; render AgentElapsed on subagent and member rows; and wire linked-environment navigation and provider-session detach. Model: Gemini 3.1 Pro (Antigravity)
Derive non-workflow subagent elapsed timing from agent.current(node) so resumed child threads update timing, and store Entity<LiveAgentElapsed> inside window.use_keyed_state with deferred refresh instead of synchronous mid-render cx.notify(). Model: Gemini 3.1 Pro (Antigravity)
This was referenced Nov 14, 2026
parity: fix(threads): side chats inherit parent permissions by default (
pingdotgg/t3code#31114)
#287
Closed
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.
Native client side chat and thread lineage were missing capability checks, post-fork removal recovery, unlisted parent/child title fetching, workflow phase/elapsed parity, linked-environment lineage rows, live session detach, and legacy
ultracode/selectable-model/Claude-version badge handling present on web. This bringsTV-SIDECHATandTV-LINEAGEto parity with web and marks both rowsdoneinapps/native/parity/LEDGER.md.Ref #243 · Closes #287 · Closes #283 · Ref #296
Changes
Closes #287, upstreampingdotgg/t3code#31114):runtimeModeoverride onfirst_message_command.fork_command), failed-start discard, closed cleanup (delete_command), bring-back, delete, and post mutations onorchestration:operatescope (AppState::can_operate_threads,side_chat::Parent::can_operate,side_chat::offered,bring_back_blocked_reason).continue_side_chat_startagainst side-chat threads removed after fork creation ("The side chat is no longer available."+ discard cleanup).Closes #283, upstreampingdotgg/t3code#29000):snapshot.archived_threadsfromlisted_setbefore computingunlisted_title_ids, filter hidden threads and hidden unloaded relations, and prefergetThreadTitlesresolved titles over shell node titles for rows and merge targets.orchestration.getThreadTitlesinThreadTitlesFeedkeyed by(connection, unlisted_ids, removed_at), clearingactive_keyalongsidein_flighton failure with bounded backoff retry (allow_retry()onAppEvent), and forwardingthis.card_openfromDetailsViewso closed details cards do not fire RPCs.groups.related,groups.active, andgroups.previous("Previous agents", collapsed by default), update workflow edge status beforegroup_relationships, renderLineage · N running/Side chats · N runningheadings, and keepLineagevisible (has_lineage()/lineage_len()) when only unlinked running subagents,delegated_from,remote_subagents, orcan_detach && !side_chats.is_empty()exist.AgentTimingandLiveAgentElapsed(AgentElapsed.tsxfull1m 05sand compact1m/1.5h/12hformats) on subagent rows (deriving non-workflow timing fromagent.current(node)), workflow member rows, and workflow phase headers; wrapEntity<LiveAgentElapsed>insidewindow.use_keyed_statewith deferred refresh so 1s ticks redraw only the timer view without notifyingDetailsViewmid-render; auto-open workflow phases onPending -> RunningviaOption<bool>state; showFaileddestructive labels,{settled}/{total} agent(s)counts, phase elapsed, and"No agents yet"empty workflow placeholders.DelegatedFromRow,RemoteSubagentRow, linked-environment target navigation (open_linked_thread), and"More thread actions"->"Disconnect agent session"(can_detach_provider_session/detach_session_commands, gated onorchestration:operate).orchestration:operate.Ref #296, upstreampingdotgg/t3code#27034— keeping#296open forCO-TRAITS):ultracode->xhigheffort fallback and resolved-slug matching,resolve_selectable_modelfallback, andcollapse_claude_minor_versionbadge collapsing inComposerLineage::read_bar.Verification (
6411dd79bd)cargo test -p t3-core -p t3-client:t3-core1343 unit + 8 conformance passed;t3-client108 unit passed.cargo test -p t3-native --features snapshot -- side_chat:: lineage:: thread_details:: --test-threads=1: 12 passed, 0 failed (172filtered out).cargo clippy --workspace --all-targets -- -D warnings: passed (0 errors/warnings).cargo build -p t3-native --bin t3-native --features snapshot: passed.node --test apps/native/parity/sync.test.ts: 42/42 passed.vp fmt --checkand pnpm-backedconformance --check/gen-theme --checkwere not run directly inside this worktree (vp iskipped); theme inputs and conformance fixtures were untouched (t3-coreconformance suite passed 8/8).Snapshots (
1440x900)Previous agentsexpanded,AgentElapsed)SideChatPaneright-panel tabComposerLineage(ProviderSubagentBar)Model: Gemini 3.1 Pro (Antigravity)