Skip to content

feat: move a chat family between projects in chatd - #30893

Open
ibetitsmike wants to merge 1 commit into
mainfrom
mike/move-chats-chatd
Open

ibetitsmike wants to merge 1 commit into
mainfrom
mike/move-chats-chatd

Conversation

@ibetitsmike

@ibetitsmike ibetitsmike commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

chatd can now move a root chat, together with its subagent chats, into a project, to another project, or out of its project. Nothing calls this yet. #30894 adds the API.

Stack (moving chats between projects, bottom first):

  1. This PR: the move in chatd
  2. feat: move chats between projects through the chat update API #30894: PATCH /api/v2/chats/{chat} takes project_id
  3. feat(site/src): move chats between projects from the chat menu #30895: Move to project in the chat menu
  4. feat(site/src/pages/AgentsPage/components): drag chats onto project folders in the sidebar #30795: drag a chat onto a project folder in the sidebar

Why: today a chat keeps the project it was created with. A move must follow the family rules of archiving, because a step that runs during a move would still have the memory tools of the old project.

  • chatstate.Tx.SetProject runs only from W, E0 and E1, like SetArchived. SetFamilyProject() locks the root row before its subagents, in the same order as archiving, so a busy family gets ErrTransitionNotAllowed and nothing changes.
  • A move to the project the chat is already in changes nothing, even while the chat runs. The check reads the locked root row, so it waits for a move that is still in flight.
  • Only the root row stores project_id, and subagents use the project of the root. After the commit, chatd publishes a new project_change watch event for each chat of the family. The move keeps updated_at, so lists keep their order.
  • A root chat outside a project now has an empty memory index. When a chat leaves its project, or its project is deleted, its next turn start commits one memory index update that removes the memories the model saw there.

What to scrutinize: the lock order and the same-project check under the lock in SetFamilyProject() (chatstate/family.go), and the turn-start condition in memoryIndexMessage() (memory.go).

Generated (make gen): queries.sql.go, querier.go, dbmock and dbmetrics come from queries/chats.sql. coderd/apidoc, docs/reference/api/schemas.md and typesGenerated.ts come from the new watch event kind, which is also why two chats.test.ts fixtures gain project_change: false.

coderd/x/chatd/ARCHITECTURE.md has no edit. Lines 60 (the project of a root chat can now change), 126 (the transition list needs SetProject), 470 (the move follows the family rules of archiving) and 1009 (a chat that leaves its project gets its memory index removed) need the author's update.

Testing

  • make pre-commit passes. go test passes for coderd/x/chatd/chatstate, coderd/database/dbauthz (TestMethodTestSuite) and the chatd memory tests.
  • TestSetFamilyProjectLocksRootFirst fails with 55P03 when a subagent row is locked first. TestSetFamilyProjectKeepsTheCurrentProject covers the same-project move during a run. The transition matrix test gains SetProject cases for W, E0 and E1.
  • TestMovedChatUsesNewProject runs two real turns around a move: the second turn uses the instructions and memories of the new project, and OutOfProject fails without the memory index removal.

Xum opened this PR on behalf of @ibetitsmike.

chatd gains MoveChatToProject, which sets the project of a root chat.
Its subagent chats follow because they use the project of the root.

The chatstate machine gets a SetProject transition, allowed only from
W, E0 and E1, like SetArchived. SetFamilyProject locks the root row
before its subagents, in the same order as archiving, so a busy family
gets ErrTransitionNotAllowed and a move never overlaps a step. A move to
the project the chat is already in changes nothing, even while the chat
runs. After the commit, chatd publishes a project_change watch event for
each chat of the family.

A root chat outside a project now has an empty memory index, so a chat
that leaves its project, or whose project is deleted, gets the memories
it saw removed at its next turn start.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T20:59:27.792075Z b06cf6d Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@nickvigilante nickvigilante left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Docs LGTM

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b06cf6d4bd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread codersdk/chats.go
@pr-queue-manager
pr-queue-manager Bot requested a review from ThomasK33 October 16, 2026 14:21
@ibetitsmike

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: b06cf6d4bd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

This branch has not been deployed

No deployments
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