Skip to content

chat: the @ list finds every open conversation, on every box, with spaces in the search - #1725

Merged
AbirAbbas merged 12 commits into
devfrom
zeropoint95/mention-list-recents-and-chat-scope
Oct 2, 2026
Merged

AbirAbbas merged 12 commits into
devfrom
zeropoint95/mention-list-recents-and-chat-scope

Conversation

@ZeroPoint95

@ZeroPoint95 ZeroPoint95 commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

A tab reading cloudfl… was on the strip and @chat:cloudfl did not list it. The match was fine; what the list held, and where it was offered, was not.

This is fixed now

1725

What changed

  • Recent conversations are read on every opening of the list, not once per process. A conversation started in another window after the window's first @, or named after it, was never on the list for as long as the window lived.
  • @chat: and @team: keep up to thirty-two rows and scroll, instead of the first eight with no sign of the rest. The bare @ still keeps eight per section beside the tasks and files.
  • Recent rows are keyed by the canonical transcript, the way tabs are, so a home reached through a symlink no longer lists the conversation in front, or every open tab a second time, as recent rows.
  • The new-chat page (+ / ctrl+t) leaves no conversation off. It opens no file, so the window still carried the conversation it came from as the one in front and left it off as if you were typing inside it — @chat:kim beside a lit tell me about kim jong il said no conversation matches.
  • Home's box opens the same list: the prefix words, the teams and conversations sections above the files, the same prefixes, the same recents refresh, and the same choosing code (completeTeamIn, completeChatIn) as a conversation's box. Home leaves no conversation off, because its sentence opens a new one.
  • The words after @ may have spaces. @chat:who found who is kim jong il and @chat:who is closed the list. The token walks back over up to three spaces to the nearest @ that begins a word, and every word must match, in any order, on teams, conversations and files alike: @chat:who is, @team:har bor, @file:tui3 app. Only the last word, the one still being typed, may match by its letters in order; the finished words before it match whole. Several words that match nothing close the list, and the words typed after a mention the list just inserted never reopen it.
  • The manual says what the list holds (every open tab except the one you are in, then the twenty most recent in this project; older ones and other projects' are reached with /resume), the spaces rule, and that home and the new-chat page have the same list.

Tests

TestTheAtListIsTheSameOnEveryBox drives one fixture and the same searches through a conversation's box, home's box and the new-chat page's box, so the three cannot drift apart. The rest: recents re-read on each opening (conversation and home), the scoped cap, canonical keys, the start page, atToken with spaces, every-word matching with the finished-word rule, and the sentence after a chosen mention staying in the box and being sent whole.

Verified in the real binary with the tmux rig and a stub model: a conversation named in a second window showing up in the first window's @chat: list, home's list with its sections, the start-page case from the owner's screenshot, and the spaced searches.

Not done: the task section's own scorer (session.SearchTaskIndex) still treats a spaced needle as one phrase. Matching the words of a transcript rather than only its title is not in this change.

🤖 Generated with Claude Code

ZeroPoint95 and others added 6 commits October 1, 2026 10:55
…t shows them all

Santosh reported a tab reading `cloudfl…` on the strip that `@chat:cloudfl`
did not list. The match was fine; what the list held was not.

- The recent list was a snapshot taken on the window's first `@` and kept
  for the life of the process, so a conversation started in another window
  after that, or named after it, was never on the list. It is read again
  every time the list opens, and not on the letters typed after the `@`.
- A section was cut at eight rows with no sign of the rest. `@chat:` and
  `@team:` keep up to thirty-two and scroll; the bare `@` keeps eight per
  section beside the tasks and files.
- Recent rows are keyed by the canonical transcript, the way tabs are, so a
  home reached through a symlink no longer lists the conversation in front,
  or every open tab a second time, as recent rows.
- The manual says which conversations the list holds: every open tab except
  the one you are typing in, then the twenty most recent in this project.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… prefixes

Home's box had a files-only `@` list, so `@chat:` typed there answered
`no file matches`. One search behaves one way on every box: home's list
now has the prefix words on its first row, the teams and conversations
sections above the files, and the same `@team:`, `@chat:` and `@file:`
prefixes. The catalogs are the same memory the conversation's list copies,
the recent list is read again on each opening, and choosing a team or a
conversation types exactly what it types in a conversation, through the
one function both boxes now share. Home leaves no conversation off,
because its sentence opens a new one.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`+` opens no file, so the window still carries the conversation it came
from as the one in front, and the list left it off as though the person
were typing inside it: `@chat:kim` beside a lit `tell me about kim jung
il` said `no conversation matches`. The sentence typed on the start page
opens a new conversation, so every open one is a reference there.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… list

`@chat:who` found `who is kim jong il` and `@chat:who is` closed the list,
because the token stopped at a space. It now walks back to the nearest `@`
that begins a word, over up to three spaces, and every word of the needle
must match, in any order, on teams, conversations and files alike:
`@chat:who is`, `@team:har bor`, `@file:tui3 app`. Several words that
match nothing close the list, since that is a sentence after a mention;
one word that matches nothing still says so.

One test now drives the same fixture and the same searches through a
conversation's box, home's box and the new-chat page's box, so the three
cannot drift apart again.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
With spaces allowed in the token, `@side-chat is a chat` walked back to
the same `@` and was ranked: `is`, `a` and `chat` all matched `side chat`
by their letters, the list reopened over the sentence, and enter put the
mention back in its place. Two rules close that: a query that begins with
the token this list just inserted, followed by a space, is the person
writing on; and only the last word of a needle, the one still being
typed, may match by its letters in order — the finished words before it
match whole, as a prefix or a substring.

The change entry moves from 1720, which another pull request now
carries, to 1724; the real number is set when the pull request opens.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@ZeroPoint95
ZeroPoint95 marked this pull request as ready for review October 1, 2026 16:48
AbirAbbas and others added 6 commits October 2, 2026 11:06
A bare @ walked back over up to three spaces, so ordinary prose such as
`cc @ara on this` reopened the list on a matching path and enter
replaced the sentence with it. Spaces now belong to prefixed searches
only (`@chat:who is`, `@team:har bor`, `@file:tui3 app`); a bare @ ends
at its first space as it did before, and punctuation after a chosen
mention keeps the list closed.

Home's @ list could panic with an index out of range (on dev too):
opening it replaced the project row that supplied its folder, the
loader then switched roots and cleared the paths under rows already
ranked against them. Home now captures the folder before the edit,
rebuilds rows with every catalog change, ignores walks from an older
target, and the painters guard their indexes.

A pasted opening on home now copies the same catalogs and starts the
same reads as a typed one, and a first spaced search stays open until
its catalog has been read. Recent rows and file walks arriving keep the
row a person chose, and home's arrows keep the list's own cursor with
them. Canonical recent keys are resolved inside the off-loop read, so
the update loop does no symlink walks. Home's two composers draw a
chosen team in its colour. The manual's @ sections are split, short,
and say all of this; the change entry says what moved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit captured home's @ file root from the row the cursor
stood on before the person typed, so a list opened over another
project's conversation offered that project's files while the foot,
and the conversation the sentence then started, used this window's
folder. The list now walks the pinned target or this window's file
root (this machine's folder over --host, like a conversation's own
list); the folder a home sentence opens in is unchanged from dev.
Catalogs and rows still change together when the target moves, a walk
from an older folder is ignored, and keys pressed with the list closed
keep a completed walk.

Every opening, typed or pasted, reads the recent list again, and a
prefixed chat search waits for that answer instead of closing on the
previous catalog. A chosen team is painted from the current team
catalog, which is built only for a row holding a team mark, so a plain
draft row allocates nothing. A conversation with no name of its own and
nothing sent (a tab named only by its unsent draft) is not offered as a
mention. The manual and the change entry say all of this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An opening is now a new @ token, or the list coming back after the
person dismissed it with esc. Letters typed into the same token, caret
moves within it and the no-match rule hiding the list never start
another read or another opening notice; before this, typing
`@chat:no such words` read the recent list ten times. A later token
starts its own read and an older answer cannot replace its rows.

Home's box emptied by backspace drew the grid without syncing its @
list, so the list stayed "open" and the next @ was not an opening: a
conversation started in another window was never offered on home
(Ara's original head did the same). An empty home box now closes its
list, and the next @ reads the recent list again.

A data arrival keeps the row the person chose with the arrows while it
is still offered; when nobody chose, the selection follows the best
match, so a fresh read that puts the exact title on top selects it.
Only the window's own unsent conversation is left off the list; held,
restored and side tabs are offered as before, so a first queued
follow-up stays mentionable. The manual and the change entry say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit let every new @ token start its own recent walk
while earlier ones were still running, and each walk reads every
session folder's meta.json: 64 quick token replacements meant 64
concurrent walks. Now one walk is in flight per window; openings while
it runs share one follow-up walk after it lands, and the answer that
began before them never settles their search as fresh. A burst costs at
most two walks.

After esc on a bare @, a comma or a period reopened the list and read
again, because the separator rule only looked at a non-empty query. A
space or punctuation after esc now keeps the list closed for a bare @
as it does for a typed one; a letter still reopens it with one read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@AbirAbbas

Copy link
Copy Markdown
Collaborator

Taking over: drove the real binary on both roads (plain codeaf and codeaf chat --no-host) with two windows on one project, a 6,700-path project and a 400-conversation project. The core of the PR holds: a conversation named in window B shows up in window A's @chat: without a restart, the start page offers the conversation it came from, @chat:/@team: scroll past eight rows, spaced prefixed searches work on every box, and a symlinked home no longer lists the conversation in front (origin/dev did). Fixed what broke along the way:

  • 7ff632a5f — a bare @ ends at a space again; spaces belong to @team:/@chat:/@file: searches. The three-space walk-back made ordinary prose open the list: cc @ara on this landed on bench/oneroad/marathon/finish.sh, and pressing enter swapped the sentence for that path (about 15% of sampled ask @name … sentences did it). Same commit: home's @ list could panic with index out of range [0] with length 0 (origin/dev too) when its folder changed under rows already ranked; a pasted opening on home skipped the catalogs and reads; recent keys were canonicalised on the update loop; a comma after a chosen mention reopened the list; home drew a chosen team without its colour.
  • 8576f65dc — home's @ files come from the folder the sentence opens in (the one the foot names), not from the project row the cursor was on before typing; a pasted opening reads recents again; team colour comes from the current catalog; the window's own unsent conversation, named only by its draft, is not offered as a mention.
  • 1777c5fa6 — one recent read per @ opening (typing @chat:no such words read the list ten times). Home's box emptied by backspace kept its list "open", so the next @ read nothing, and a conversation started in another window never showed on home (your head did this too). An arriving read keeps a row you picked with the arrows, otherwise selects the best match. Esc then a letter is a new opening, which is what TestAtOnHomeReadsRecentConversationsOnEachOpening expects.
  • 58a967cec — at most one recent walk in flight (a burst of @ openings could start dozens of concurrent walks, each reading every session's meta.json); esc then punctuation on a bare @ stays closed.
  • c990d613a, 1599add2c — merged dev, including chat: onboarding answers the pointer and a second enter, no telemetry notice or command, and free models only on a low account #1720. No overlap problems on the welcome page or home.

The manual pages and the change entry say all of the above. Left for later: switching conversations while a recent read is still in flight and then typing @ at the same position in the new box can reuse the old project's rows for that one opening. Also, every opening re-reads every session's meta.json in the project (same cost as one home refresh), with no cache keyed on the folder.

@AbirAbbas AbirAbbas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified and taken over; merging.

@AbirAbbas
AbirAbbas merged commit 06a3283 into dev Oct 2, 2026
6 checks passed
@AbirAbbas
AbirAbbas deleted the zeropoint95/mention-list-recents-and-chat-scope branch October 2, 2026 18:23
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.

2 participants