GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: share chat projects with users, groups, and organizations by f0ssel · Pull Request #30431 · coder/coder

Conversation

@f0ssel

@f0ssel f0ssel commented Oct 6, 2026

Copy link
Copy Markdown
Member

Backend for sharing chat projects (experiment chat-projects), stacked on #29583. It follows chat and workspace sharing: an owner can share a project with a user, a group, or the whole organization. To share with the whole organization, add a group entry for the organization's Everyone group. Its group ID is the organization ID, and RBAC already handles it as a special case.

  • API: GET and PATCH /api/experimental/organizations/{organization}/chats/projects/{project}/acl take the same request and response shapes as /chats/{chat}/acl, plus SDK client methods.
  • Roles:
    • use: view the project and its memories, and start chats in it. The agents in those chats read and write the project's memories.
    • admin: everything use can do, plus edit and share the project. Only the owner can delete it, as with workspace sharing.
  • What gets shared: the project's details and its memories. Chats in the project stay private to their owners. A sharee sees their own chats there, plus any chats shared with them separately.
  • Memories: memory permissions come from the project ACL. Anyone who can read the project can create, read, and delete its memories. This lets a sharee's chat agents use memory under the sharee's own permissions.
  • Chat creation: a chat can join a project only if its owner can read the project and create memories in it. Before this change, the chat owner had to own the project. If a sharee loses access, their existing chats lose memory quietly, using the existing resolveProjectMemory fallback.
  • Listing: GET /chats/projects now returns projects the caller owns plus projects shared with them. Site owners still don't see other users' projects in this list.
  • Disable switch: --disable-chat-sharing turns off project sharing too. The endpoints return 403, stored grants are ignored, and roles deny chat_project:share.
  • Validation: a group from another organization is rejected. Otherwise its members who also belong to this organization would get access.

Not included: share notifications (chats send TemplateChatShared; projects would need a new template) and an /acl/available endpoint for the picker.

Generated by Coder Agents.

Implementation notes
  • Migration 000614: adds user_acl and group_acl jsonb columns to chat_projects (typed as ChatACL) and adds the chat_project:share API key scope.
  • New queries:
    • GetChatProjectsAccessibleByUserID replaces GetChatProjectsByOwnerID. It returns owned projects plus ACL matches for org members, and dbauthz post-filters the results.
    • GetChatProjectByIDForUpdate
    • UpdateChatProjectACLByID (dbauthz requires share)
  • ChatProject.RBACObject and ChatProjectMemoryRBACObject attach ACLs unless rbac.ChatACLDisabled().
  • Audit: chat_projects.user_acl and group_acl are tracked.
  • Tests: TestChatProjectSharing covers user/use, admin, group, Everyone (including a member of another org), revocation, and validation. TestChatSharingDisabled covers projects. dbauthz and roles tests are updated.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
f0ssel added 30 commits September 17, 2026 20:27
@f0ssel
feat(coderd/x/chatd): move the memory index into read_memory and cons…
9b46b93
…olidate memories in the background

The system prompt keeps only the memory guidance so it stays stable across
turns; the read_memory tool description carries the current index. After
extraction, a detached consolidation pass merges duplicates and prunes
superseded memories under strict caps (8 mutations, 24h debounce, per
scope advisory lock, fresh memories protected) and records each run in
chat_memory_consolidations, pruned to the newest 20 per scope.
@f0ssel
test(coderd/x/chatd): cover memory consolidation paths; show last con…
08830fc
…solidation in the memory section

Adds mock-based tests for the consolidation debounce, lock, cap, protect
window, journaling, pruning, and failure paths, and surfaces the newest
successful consolidation as a one-line summary under the memory list.
@f0ssel
fix(coderd/x/chatd): guard memory consolidation
3282244
@f0ssel
fix(coderd/x/chatd): harden consolidation and decouple it from extrac…
3f85d61
…tion tests

Revalidation now reads rows FOR UPDATE inside the apply transaction so an
edit committed after the reread cannot be overwritten. Candidates are the
unprotected memories oldest first, so the input cap trims recent entries
rather than the stale duplicates consolidation exists to remove. At the
cap only a run that shrank the scope bypasses the debounce. Journal
mutations are always an array.

Extraction tests use an afterMemoryExtraction seam instead of spawning
consolidation goroutines against strict mocks.
@f0ssel
feat(site): add chat projects to the agents UI
caca5e8
Sidebar project list with create, edit, and delete gated on the
authcheck result, a project page at /agents/projects/:projectId, new
chat in project, and move-to-project from the chat menu. Behind the
chat-projects experiment.
@f0ssel
feat(site): manage project memories from the project page
45728ee
Collapsed memory rows expand to show the description, body, and edit
and delete controls. Delete failures surface an error alert.
@f0ssel
feat(site): add personal memory settings and generalize the memory UI
346d09f
Adds /agents/settings/memory with the personal memory toggle and the
per-organization memory list, and generalizes the project memory
components to serve both scopes.
@f0ssel
feat(site): show the last successful memory consolidation
571a0c8
Summarizes the newest successful consolidation run in one line under
the memory list.
@f0ssel
fix(site): address chat projects UI review findings
217be16
@f0ssel
chore(coderd/x/chatd): format imports
6f1af5c
@f0ssel
Merge branch 'f0ssel/chat-user-memories' into f0ssel/chat-memory-cons…
0c167e8
…olidation
@f0ssel
Merge branch 'f0ssel/chat-memory-consolidation' into f0ssel/chat-proj…
c6d1b37
…ects-ui
@f0ssel
chore(coderd/x/chatd/chattool): format memory test
586ca9d
@f0ssel
Merge branch 'f0ssel/chat-memory-consolidation' into f0ssel/chat-proj…
05f8cf5
…ects-ui
@f0ssel
fix(site): wrap ChatTopBar stories in the dashboard provider
a186494
@f0ssel
feat(site): show chat projects as sidebar folders with a project-fram…
6f3b434
…ed composer
@f0ssel
refactor(site): reduce the chat projects UI to folders, composer, and…
4066d8d
… the memory toggle
@f0ssel
refactor(site): drop the personal memory toggle from the chat project…
c8bb066
…s UI
@f0ssel
fix(coderd): drop chat_count from projects and document the project_i…
2cf4b6c
…d chat filter
@f0ssel
Merge remote-tracking branch 'origin/main' into f0ssel/chat-projects
fd88fa8
# Conflicts:
#	docs/reference/api/schemas.md
@f0ssel
Merge branch 'f0ssel/chat-projects' into f0ssel/chat-project-memories
740d6e8
# Conflicts:
#	coderd/database/db2sdk/db2sdk.go
#	coderd/database/dbauthz/dbauthz.go
#	coderd/database/dbmetrics/querymetrics.go
#	coderd/database/dbmock/dbmock.go
#	coderd/database/modelmethods.go
#	coderd/database/querier.go
#	coderd/database/querier_test.go
#	coderd/database/queries.sql.go
@f0ssel
fix(coderd/x/chatd): harden project memory extraction windows and ret…
7837906
…ries
@f0ssel
fix(coderd/x/chatd): wrap invalid extraction proposals once
de834bf
@f0ssel
Merge branch 'f0ssel/chat-project-memories' into f0ssel/chat-user-mem…
5014966
…ories

# Conflicts:
#	coderd/database/dbauthz/dbauthz.go
#	coderd/database/dbmetrics/querymetrics.go
#	coderd/database/querier.go
#	coderd/database/querier_test.go
#	coderd/database/queries.sql.go
#	coderd/x/chatd/memory_extract_internal_test.go
#	coderd/x/chatd/projectmemory_extract.go
@f0ssel
Merge branch 'f0ssel/chat-user-memories' into f0ssel/chat-memory-cons…
81c608d
…olidation

# Conflicts:
#	coderd/database/dbauthz/dbauthz.go
#	coderd/database/dbmetrics/querymetrics.go
#	coderd/database/querier.go
#	coderd/x/chatd/memory_extract.go
@f0ssel
fix(coderd/x/chatd): lock the scope first and free merge sources befo…
b9c18ac
…re writing the target
@f0ssel
Merge branch 'f0ssel/chat-memory-consolidation' into f0ssel/chat-proj…
8c3ef05
…ects-ui-folders
@f0ssel
fix(site): pin project chats to the project organization and keep unf…
8b2b543
…iled chats visible
@f0ssel
fix(coderd/rbac): make chat projects private to their creator
8b3485d
@f0ssel
feat: add user and group sharing for chat projects
75a5667
jaaydenh and others added 24 commits October 6, 2026 09:26
@jaaydenh
test(site/src/pages/AgentsPage/components): cover project denials in …
5c35c0a
…stories, assert submits in tests

Move the project denial copy checks from Vitest into Pixel stories
(unlisted organization, product-wide, no permitted organization) and
drop the assertion-only play function. Assert the project draft, MCP,
and loading tests through the onCreateChat payload instead of
rendered output.
@jaaydenh
Merge remote-tracking branch 'origin/main' into tmp-ui-form-fix
b184f52
# Conflicts:
#	site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.stories.tsx
#	site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.test.tsx
#	site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.tsx
@jaaydenh
Merge commit 'b184f52e3a' into resolve-ui-page
fa9d811
@jaaydenh
Merge remote-tracking branch 'origin/main' into resolve-ui-page
46fff11
@jaaydenh
Merge remote-tracking branch 'origin/f0ssel/chat-projects-ui-page' in…
6690ae5
…to tmp-folders-resync
@jaaydenh
Merge commit 'b184f52e3ad0037c59b7e9f43b3f121260ea09b0' into tmp-fold…
adba332
…ers-resync
@jaaydenh
Merge remote-tracking branch 'origin/main' into f0ssel/chat-projects-…
70fdc62
…ui-folders
@jaaydenh
Merge remote-tracking branch 'origin/f0ssel/chat-projects-ui-page' in…
40a768e
…to tmp-folders-resync
@jaaydenh
Merge branch 'main' into f0ssel/chat-projects-ui-page
f51614c
@jaaydenh
Merge commit 'f51614c84dbe74937f4a0bbe5009006d3a7c622d' into tmp-fold…
5ea37c0
…ers-resync

# Conflicts:
#	site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
@jaaydenh
Merge remote-tracking branch 'origin/main' into f0ssel/chat-projects-…
807cde0
…ui-folders
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): address proje…
5340351
…ct folder review feedback

- Show an empty state when every visible chat is filed in a project.
- Reuse the chat list empty-state copy for empty folders.
- Make the projects loading and error props required.
- Rename ProjectDialogMode to ProjectDialogState.
- Add mock prefixes to new test fixtures.
- Add stories for loading, error, and empty emoji-icon folder states.
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): show the regu…
8a54253
…lar empty state when every chat is in a project

Project chats live only in their folders, so the Chats section uses its
usual empty-state copy when nothing outside a project remains.
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): keep project …
e3e118e
…folders open when navigating between projects

A folder that was open because its project was active now stays open
when the user opens a chat in another project. Only an explicit toggle
collapses a folder.
@jaaydenh
feat(site/src/pages/AgentsPage/components/ChatsSidebar): open a new p…
f81af79
…roject's page after creating it
@jaaydenh
chore: accessibility improvements for orgs
9b634dc
@jaaydenh
fix: disambiguate duplicate project names when deleting
a4518ed
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): scroll projec…
e147257
…t folders with the chat list

The Projects section no longer has its own bounded scroll area. It sits
in the sidebar's scroll area above the Chats section, so expanding a
folder pushes the chats down.
@jaaydenh
Merge branch 'f0ssel/chat-projects-ui-folders' of https://github.com/…
883ac7c
…coder/coder into f0ssel/chat-projects-ui-folders

# Conflicts:
#	site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): leave a proje…
555a158
…ct's page after deleting it
@jaaydenh
feat(site/src/pages/AgentsPage/components/ChatsSidebar): collapse the…
b7cfcbf
… Projects section
@jaaydenh
test(site/src/pages/AgentsPage/components/ChatsSidebar): address revi…
f621f93
…ew feedback on project deletion and stories
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatsSidebar): hide the Chat…
456d2d5
…s empty state while projects load

When every chat belongs to a project, those chats are held back until
the project list loads. The Chats section showed "No agents yet" in the
meantime, which falsely told users their chats did not exist.
@f0ssel
feat: share chat projects with users, groups, and organizations
72221e1
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Docs preview

Check off each page once it's been reviewed. If a page changes in a later push, its checkbox clears automatically so it gets a fresh look. Pages not yet wired into the docs navigation aren't listed here.

  • docs/admin/security/audit-logs.md
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@github-actions github-actions Bot assigned f0ssel Oct 6, 2026
Base automatically changed from f0ssel/chat-projects-ui-folders to main October 6, 2026 15:57
@f0ssel f0ssel mentioned this pull request Oct 6, 2026
feat: add chat project sharing API #30439
Merged
@f0ssel f0ssel closed this Oct 6, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@f0ssel f0ssel

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@f0ssel @jaaydenh
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.