Skip to content

fix(sessions): display JSONL-derived session name across all views - #376

Open
RonenMars wants to merge 76 commits into
mainfrom
fix/session-name-display
Open

fix(sessions): display JSONL-derived session name across all views#376
RonenMars wants to merge 76 commits into
mainfrom
fix/session-name-display

Conversation

@RonenMars

Copy link
Copy Markdown
Owner

Problem

The server returns a JSONL-derived conversation name, but none of the three views displayed it:

  • the list and detail adapters (useConversations.ts) hardcoded title from project_name, discarding the server's session_name
  • the live-session header (app/session/[id].tsx) and session-row (SessionRow.tsx) resolved the title from the user-rename store only, falling straight back to projectName and never reading the session's own name field

So every conversation and session showed its project name instead of a meaningful title.

Fix

  • Declare session_name/sessionName on RawSessionMeta and Session.
  • List + detail adapters prefer session_name over project_name.
  • Live-session header and session-row fallback chain: user rename → JSONL session name → project name (the user-rename override still wins, preserving that system).

Covers all three surfaces the report flagged: history list, conversation view, and the live session view.

Depends on

The server side: streamer must emit session_name (RonenMars/threadbase-streamer#267), which in turn needs the scanner to derive it (RonenMars/threadbase-scanner#53).
This PR is additive and safe to land independently — it just shows nothing new until the server pipeline lands.

RonenMars and others added 30 commits July 20, 2026 21:12
Add typed cache integrity alert contracts across REST, WebSocket, and per-server Zustand state. Sync pending alerts through websocket broadcasts and foreground-aware REST queries so clients converge after reconnects or missed unicasts.

Present low-severity alerts in a banner and auto-open high-severity alerts in a localized resolution modal. Support prune-all, prune-selected, ignore, and reset-rescan actions; require confirmation for destructive choices; refetch on fingerprint conflicts; and surface backup paths on success.

Cover store lifecycle, websocket dispatch, banner and modal interactions, locale parity, backward-compatible 404 handling, successful resolution, and fingerprint conflicts with unit and mocked-transport integration tests.
Mark Features 35/36 and Bugs 5/16 as in-flight; freeze the 2026-07-18
analysis as a snapshot with an updated release verdict.

Co-authored-by: Cursor <cursoragent@cursor.com>

[skip-ci]
Discard empty PTYs the user never typed into so they do not linger in
the hub after abandoning a new session from browse.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add typed cache integrity alert contracts across REST, WebSocket, and per-server Zustand state. Sync pending alerts through websocket broadcasts and foreground-aware REST queries so clients converge after reconnects or missed unicasts.

Present low-severity alerts in a banner and auto-open high-severity alerts in a localized resolution modal. Support prune-all, prune-selected, ignore, and reset-rescan actions; require confirmation for destructive choices; refetch on fingerprint conflicts; and surface backup paths on success.

Cover store lifecycle, websocket dispatch, banner and modal interactions, locale parity, backward-compatible 404 handling, successful resolution, and fingerprint conflicts with unit and mocked-transport integration tests.
Explicit Help & Feedback submissions self-init Sentry like reportOneShot,
show delivery method in the success UI, and keep standing reporting opt-in.

Co-authored-by: Cursor <cursoragent@cursor.com>
Legacy uploads with spaces in filenames broke Claude Code path parsing;
escape spaces so multi-attachment sends remain valid single-token refs.

Co-authored-by: Cursor <cursoragent@cursor.com>
…orktree-merge-open-prs

# Conflicts:
#	__tests__/unit/components/servers/CacheAlertModal.test.tsx
#	components/servers/CacheAlertModal.tsx
#	services/api-client.ts
#	services/query-client.ts
#	stores/servers.ts
#	types/api.ts
…19' into worktree-merge-open-prs [skip-ci]

[skip-ci]
Adds missing viaSentry/viaEmail keys to feedback.json for ar, he, and ru.
The English keys were added in this branch but the other locales were never updated, which i18n-completeness.test.ts catches.
Bumps the npm_and_yarn group with 1 update in the / directory: [shell-quote](https://github.com/ljharb/shell-quote).


Updates `shell-quote` from 1.8.4 to 1.10.0
- [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md)
- [Commits](ljharb/shell-quote@v1.8.4...v1.10.0)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-version: 1.10.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
The conversation screen now polls its delta drain while focused and consumes streamed conversation_events, so an externally launched session reads as a live transcript without resuming it.
Resuming a conversation that may still be open elsewhere shows a confirmation naming what the server detected, and offers Take over only when a real process was matched.
External sessions route to the read-only conversation view instead of the PTY screen, and the discovered-session overtake path is gated off for them.
Session rows show a distinct external-alive indicator derived from the additive liveness fields, falling back to pid for older servers.
Pass Sentry credentials through to the Ship iOS workflow step so the source-map upload in the Xcode bundle phase can authenticate.
Automated version bump after successful TestFlight upload (build 165).

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…search (#351)

## What

Adds a "Rollup / Snapshot Tag Naming" section to `CLAUDE.md` documenting
the `test-<env>/v<version>-<sha>-<date>` convention for throwaway
pre-merge verification snapshots across the `dev` / `pre-release` /
`production` environments.
Updates the deploy workflow's `deploy_ref` input description and both
non-main warning messages to state that a tag or commit SHA is accepted,
not just a branch.
Adds a research note under `docs/research/` comparing the common
industry best practices for building one combined verification artifact
from several open PRs, ranked by relevance to this repo.

## Why

We routinely combine several open PRs into one build to verify them
together before merging each individually, and the naming and deploy
story for that snapshot was undocumented.
The research note records the patterns behind the choice — immutable
snapshot tag, build-once/promote-many with a release-candidate
identifier, and Expo per-PR update channels — so the convention has a
rationale on record.

## Notes

`deploy_ref` already accepted tags via `actions/checkout`, so this is a
wording clarification only with no change to workflow behavior.
This branch bundles two commits: the research note and the convention
change.
The conversation screen now polls its delta drain while focused and consumes streamed conversation_events, so an externally launched session reads as a live transcript without resuming it.
Resuming a conversation that may still be open elsewhere shows a confirmation naming what the server detected, and offers Take over only when a real process was matched.
External sessions route to the read-only conversation view instead of the PTY screen, and the discovered-session overtake path is gated off for them.
Session rows show a distinct external-alive indicator derived from the additive liveness fields, falling back to pid for older servers.
Adds a dead-key test asserting every English key is referenced somewhere in the source, complementing the existing key-parity gate in i18n-completeness.test.ts.
The scanner reads `t('ns:key')` and bare `t('key')` calls, keeps the static prefix of dynamic keys as a prefix match, and picks up keys hoisted into consts before reaching t().
Arrays are treated as leaves since they are fetched whole via `returnObjects: true`.

Removes the 161 keys it flagged across all four locales — 654 removals, since ar and ru carry extra CLDR plural forms.
Every flagged key was verified against a raw grep to rule out false positives.

Repoints the plural and interpolation assertions in i18n.test.ts onto keys the app actually uses, since the previous fixtures were among the dead keys.
Both server remove confirmations built their message from a hardcoded English template literal, so the dialog body stayed in English for he, ru, and ar users while the surrounding title and buttons translated.
The servers:dialog.removeMessage key already existed but had gone unreferenced, which is how the hardcoding went unnoticed.

Points both call sites at the key and adds a {{server}} placeholder to it, since the previous wording was generic while the hardcoded string named the server.
The English output is unchanged; the other three locales are rephrased to match.
Mark in-flight and shipped items from the July launch batch, reconcile
stale Open rows, and set the next mobile actions (typecheck, Maestro,
onboarding).

Co-authored-by: Cursor <cursoragent@cursor.com>

[skip-ci]
Unblocks `voice_dictation` by granting speech-recognition and microphone
via simctl privacy in ensure-release-build.js.

Co-authored-by: Cursor <cursoragent@cursor.com>
Guard Skip/swipe so Welcome cannot dump into an empty Hub, advance
immediately after QR exchange, add back-to-choose, and fix Mac-centric
copy / default port 8766.

Co-authored-by: Cursor <cursoragent@cursor.com>
Attribute browse failures to setup/XCUITest flake rather than FilterSortSheet,
add layout/close testIDs, and make feat1 switch Classic→Tree before drilling.

Co-authored-by: Cursor <cursoragent@cursor.com>
RonenMars and others added 30 commits July 22, 2026 22:06
…o worktree-merge-open-prs

# Conflicts:
#	services/api-client.ts
…gration' into worktree-merge-open-prs

# Conflicts:
#	app.json
#	locales/ar/conversation.json
#	locales/he/conversation.json
#	locales/ru/conversation.json
…into worktree-merge-open-prs

# Conflicts:
#	locales/ar/servers.json
#	locales/en/servers.json
#	locales/he/servers.json
#	locales/ru/servers.json
…6-07-22' into worktree-merge-open-prs

# Conflicts:
#	docs/BACKLOG.md
#	docs/ROADMAP.md
…o worktree-merge-open-prs

# Conflicts:
#	locales/ar/onboarding.json
#	locales/en/onboarding.json
#	locales/he/onboarding.json
#	locales/ru/onboarding.json
…ge' into worktree-merge-open-prs

# Conflicts:
#	components/onboarding/steps/ConnectStep.tsx
#	locales/ar/onboarding.json
#	locales/en/onboarding.json
#	locales/he/onboarding.json
#	locales/ru/onboarding.json
…ep' into worktree-merge-open-prs

# Conflicts:
#	components/onboarding/OnboardingNavigator.tsx
…ee-merge-open-prs

# Conflicts:
#	package.json
…to worktree-merge-open-prs

# Conflicts:
#	jest.setup.js
The API returns a JSONL-derived conversation name, but mobile discarded it: the list and detail adapters hardcoded title from project_name, and the live-session header never read the session's name field.
Wire session_name through the Raw/Session types and both adapters, and add it to the live-view and session-row fallback chains (user rename -> session name -> project name).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant