Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b7f470f
feat: add persisted whole-chat summary with background generation
jaaydenh Jun 24, 2026
3cb7a48
test(coderd): include summary_generation in override context assertion
jaaydenh Jun 24, 2026
0bc176d
Merge branch 'main' into chat-summary-62j9
jaaydenh Jun 26, 2026
5c8af68
Merge remote-tracking branch 'origin/main' into work-chat-summary
jaaydenh Jun 29, 2026
313f8b7
fix: address coder-agents-review feedback on chat summary
jaaydenh Jun 29, 2026
5d0a775
test(coderd/x/chatd): pin sentence-terminator boundary behavior
jaaydenh Jun 29, 2026
dc93f55
refactor(coderd/x/chatd): defer summary model override
jaaydenh Jun 29, 2026
877bbf0
refactor(coderd): defer chat cost accounting to follow-up PR
jaaydenh Jun 29, 2026
7a57ac0
fix(coderd/x/chatd): close chat summary history-version and shutdown …
jaaydenh Jun 29, 2026
9850958
fix(coderd/x/chatd): derive summary model options from the loaded tra…
jaaydenh Jun 29, 2026
794c427
docs(coderd/x/chatd): trim verbose comments from chat summary feature
jaaydenh Jun 30, 2026
3088e76
chore: update comment
jaaydenh Jun 30, 2026
b42dba0
chore: cleanup
jaaydenh Jun 30, 2026
4dd0385
chore: cleanup
jaaydenh Jul 1, 2026
bd5b0e4
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 1, 2026
5322128
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 6, 2026
74ea213
Merge remote-tracking branch 'origin/main' into kcjg-chat-summary-fixes
jaaydenh Jul 6, 2026
684b481
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 7, 2026
44af5ad
Merge remote-tracking branch 'origin/main' into kcjg-chat-summary-fixes
jaaydenh Jul 7, 2026
ae92de2
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 7, 2026
36429a4
fix: summary goroutine no longer stalls server shutdown
jaaydenh Jul 8, 2026
ee7bcd3
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 8, 2026
15c3e68
fix(coderd/database/migrations): renumber chat_summary migration to 0…
jaaydenh Jul 8, 2026
dc855a8
chore: improve names
jaaydenh Jul 8, 2026
3780540
fix: format
jaaydenh Jul 8, 2026
6d1fadf
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 13, 2026
7656d56
chore: move ctx closer to usage
jaaydenh Jul 14, 2026
46713c6
chore: update comment
jaaydenh Jul 14, 2026
310be96
chore: improve ctx usage
jaaydenh Jul 14, 2026
546e776
chore: add SkipsEventOnStaleWrite test
jaaydenh Jul 14, 2026
4b99d02
chore: update ctx usage
jaaydenh Jul 14, 2026
9f6b0e9
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 20, 2026
627f975
chore: update esclation logic
jaaydenh Jul 20, 2026
109fb2a
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 21, 2026
a99d1b5
fix: update migration number
jaaydenh Jul 21, 2026
cc36df0
Merge branch 'main' into chat-summary-62j9
jaaydenh Jul 23, 2026
fbb40d6
chore: cleanup
jaaydenh Jul 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions coderd/apidoc/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions coderd/apidoc/swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions coderd/database/db2sdk/db2sdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -1750,6 +1750,9 @@ func Chat(c database.Chat, diffStatus *database.ChatDiffStatus, files []database
if c.LastTurnSummary.Valid {
chat.LastTurnSummary = &c.LastTurnSummary.String
}
if c.Summary.Valid {
chat.Summary = &c.Summary.String
}
if c.LastReasoningEffort.Valid {
lastReasoningEffort := string(c.LastReasoningEffort.ChatReasoningEffort)
chat.LastReasoningEffort = &lastReasoningEffort
Expand Down
1 change: 1 addition & 0 deletions coderd/database/db2sdk/db2sdk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,7 @@ func TestChat_AllFieldsPopulated(t *testing.T) {
ClientType: database.ChatClientTypeUi,
LastError: pqtype.NullRawMessage{RawMessage: lastErrorRaw, Valid: true},
LastTurnSummary: sql.NullString{String: "turn completed", Valid: true},
Summary: sql.NullString{String: "summarized the whole chat", Valid: true},
CreatedAt: now,
UpdatedAt: now,
Archived: true,
Expand Down
11 changes: 11 additions & 0 deletions coderd/database/dbauthz/dbauthz.go
Original file line number Diff line number Diff line change
Expand Up @@ -7452,6 +7452,17 @@ func (q *querier) UpdateChatStatus(ctx context.Context, arg database.UpdateChatS
return q.db.UpdateChatStatus(ctx, arg)
}

func (q *querier) UpdateChatSummary(ctx context.Context, arg database.UpdateChatSummaryParams) (int64, error) {
chat, err := q.db.GetChatByID(ctx, arg.ID)
if err != nil {
return 0, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return 0, err
}
return q.db.UpdateChatSummary(ctx, arg)
}

func (q *querier) UpdateChatTitleByID(ctx context.Context, arg database.UpdateChatTitleByIDParams) (database.Chat, error) {
chat, err := q.db.GetChatByID(ctx, arg.ID)
if err != nil {
Expand Down
11 changes: 11 additions & 0 deletions coderd/database/dbauthz/dbauthz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1917,6 +1917,17 @@ func (s *MethodTestSuite) TestChats() {
dbm.EXPECT().UpdateChatLastTurnSummary(gomock.Any(), arg).Return(int64(1), nil).AnyTimes()
check.Args(arg).Asserts(chat, policy.ActionUpdate).Returns(int64(1))
}))
s.Run("UpdateChatSummary", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
chat := testutil.Fake(s.T(), faker, database.Chat{})
arg := database.UpdateChatSummaryParams{
ID: chat.ID,
ExpectedHistoryVersion: chat.HistoryVersion,
Summary: sql.NullString{String: "summarized the whole chat", Valid: true},
}
dbm.EXPECT().GetChatByID(gomock.Any(), chat.ID).Return(chat, nil).AnyTimes()
dbm.EXPECT().UpdateChatSummary(gomock.Any(), arg).Return(int64(1), nil).AnyTimes()
check.Args(arg).Asserts(chat, policy.ActionUpdate).Returns(int64(1))
}))
s.Run("UpdateChatLastReadMessageID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
chat := testutil.Fake(s.T(), faker, database.Chat{})
arg := database.UpdateChatLastReadMessageIDParams{
Expand Down
8 changes: 8 additions & 0 deletions coderd/database/dbmetrics/querymetrics.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions coderd/database/dbmock/dbmock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions coderd/database/dump.sql

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions coderd/database/migrations/000551_chat_summary.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
-- Drop the view before the columns it references, then recreate it without
-- the summary columns, matching the 000549 chats_expanded definition.
DROP VIEW IF EXISTS chats_expanded;

ALTER TABLE chats
DROP COLUMN summary,
DROP COLUMN summary_generated_at;

CREATE VIEW chats_expanded AS
SELECT c.id,
c.owner_id,
c.workspace_id,
c.title,
c.status,
c.worker_id,
c.started_at,
c.heartbeat_at,
c.created_at,
c.updated_at,
c.parent_chat_id,
c.root_chat_id,
c.last_model_config_id,
c.last_reasoning_effort,
c.archived,
c.last_error,
c.mode,
c.mcp_server_ids,
c.labels,
c.build_id,
c.agent_id,
c.pin_order,
c.last_read_message_id,
c.dynamic_tools,
c.organization_id,
c.plan_mode,
c.client_type,
c.last_turn_summary,
c.snapshot_version,
c.history_version,
c.queue_version,
c.generation_attempt,
c.retry_state,
c.retry_state_version,
c.runner_id,
c.requires_action_deadline_at,
COALESCE(root.user_acl, c.user_acl) AS user_acl,
COALESCE(root.group_acl, c.group_acl) AS group_acl,
owner.username AS owner_username,
owner.name AS owner_name,
c.context_aggregate_hash,
c.context_dirty_since,
c.context_dirty_resources,
c.context_error,
c.compaction_requested_at
FROM ((chats c
LEFT JOIN chats root ON ((root.id = COALESCE(c.root_chat_id, c.parent_chat_id))))
JOIN visible_users owner ON ((owner.id = c.owner_id)));
60 changes: 60 additions & 0 deletions coderd/database/migrations/000551_chat_summary.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
-- Persisted whole-chat summary and its freshness marker, distinct from
-- last_turn_summary (which only reflects the most recent turn).
ALTER TABLE chats
ADD COLUMN summary TEXT,
ADD COLUMN summary_generated_at TIMESTAMPTZ;

-- Recreate chats_expanded: its explicit column list hides new columns otherwise.
DROP VIEW IF EXISTS chats_expanded;

CREATE VIEW chats_expanded AS
SELECT c.id,
c.owner_id,
c.workspace_id,
c.title,
c.status,
c.worker_id,
c.started_at,
c.heartbeat_at,
c.created_at,
c.updated_at,
c.parent_chat_id,
c.root_chat_id,
c.last_model_config_id,
c.last_reasoning_effort,
c.archived,
c.last_error,
c.mode,
c.mcp_server_ids,
c.labels,
c.build_id,
c.agent_id,
c.pin_order,
c.last_read_message_id,
c.dynamic_tools,
c.organization_id,
c.plan_mode,
c.client_type,
c.last_turn_summary,
c.summary,
c.summary_generated_at,
c.snapshot_version,
c.history_version,
c.queue_version,
c.generation_attempt,
c.retry_state,
c.retry_state_version,
c.runner_id,
c.requires_action_deadline_at,
COALESCE(root.user_acl, c.user_acl) AS user_acl,
COALESCE(root.group_acl, c.group_acl) AS group_acl,
owner.username AS owner_username,
owner.name AS owner_name,
c.context_aggregate_hash,
c.context_dirty_since,
c.context_dirty_resources,
c.context_error,
c.compaction_requested_at
FROM ((chats c
LEFT JOIN chats root ON ((root.id = COALESCE(c.root_chat_id, c.parent_chat_id))))
JOIN visible_users owner ON ((owner.id = c.owner_id)));
4 changes: 4 additions & 0 deletions coderd/database/modelqueries.go
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,8 @@ func (q *sqlQuerier) GetAuthorizedChats(ctx context.Context, arg GetChatsParams,
&i.Chat.PlanMode,
&i.Chat.ClientType,
&i.Chat.LastTurnSummary,
&i.Chat.Summary,
&i.Chat.SummaryGeneratedAt,
&i.Chat.SnapshotVersion,
&i.Chat.HistoryVersion,
&i.Chat.QueueVersion,
Expand Down Expand Up @@ -906,6 +908,8 @@ func (q *sqlQuerier) GetAuthorizedChatsByChatFileID(ctx context.Context, fileID
&i.PlanMode,
&i.ClientType,
&i.LastTurnSummary,
&i.Summary,
&i.SummaryGeneratedAt,
&i.SnapshotVersion,
&i.HistoryVersion,
&i.QueueVersion,
Expand Down
6 changes: 5 additions & 1 deletion coderd/database/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions coderd/database/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading