fix(sessions): display JSONL-derived session name across all views - #376
Open
RonenMars wants to merge 76 commits into
Open
fix(sessions): display JSONL-derived session name across all views#376RonenMars wants to merge 76 commits into
RonenMars wants to merge 76 commits into
Conversation
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
…orktree-merge-open-prs
…worktree-merge-open-prs
…to worktree-merge-open-prs
…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>
…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
…n' into worktree-merge-open-prs
…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
…' into worktree-merge-open-prs
…o worktree-merge-open-prs # Conflicts: # locales/ar/onboarding.json # locales/en/onboarding.json # locales/he/onboarding.json # locales/ru/onboarding.json
…orktree-merge-open-prs
…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
…nto worktree-merge-open-prs
…ep' into worktree-merge-open-prs # Conflicts: # components/onboarding/OnboardingNavigator.tsx
…ee-merge-open-prs # Conflicts: # package.json
…ge' into worktree-merge-open-prs
…to worktree-merge-open-prs # Conflicts: # jest.setup.js
…ge' into worktree-merge-open-prs
…o worktree-merge-open-prs
…kip-ci] [skip-ci]
…to worktree-merge-open-prs
… [skip-ci] [skip-ci]
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).
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.
Problem
The server returns a JSONL-derived conversation name, but none of the three views displayed it:
useConversations.ts) hardcodedtitlefromproject_name, discarding the server'ssession_nameapp/session/[id].tsx) and session-row (SessionRow.tsx) resolved the title from the user-rename store only, falling straight back toprojectNameand never reading the session's own name fieldSo every conversation and session showed its project name instead of a meaningful title.
Fix
session_name/sessionNameonRawSessionMetaandSession.session_nameoverproject_name.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.