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

Skip to content

Commit a132d45

Browse files
committed
fix(chatd): address round 4 review — double injection, test coverage, nits
1 parent 0afcf3d commit a132d45

5 files changed

Lines changed: 50 additions & 29 deletions

File tree

coderd/x/chatd/chatd.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5328,6 +5328,7 @@ func (p *Server) runChat(
53285328
}
53295329
if reloadedInstruction != "" {
53305330
reloadedPrompt = chatprompt.InsertSystem(reloadedPrompt, reloadedInstruction)
5331+
instructionInjected = true
53315332
}
53325333
reloadedPrompt = renderPlanPathPrompt(reloadedPrompt, resolvePlanPathBlock(reloadCtx))
53335334
reloadedSkills := skillsFromParts(reloadedMsgs)
@@ -5350,20 +5351,20 @@ func (p *Server) runChat(
53505351
}
53515352
return reloadedPrompt, nil
53525353
},
5353-
DisableChainMode: func() {
5354-
chainModeActive = false
5355-
},
5356-
PrepareMessages: func(msgs []fantasy.Message) []fantasy.Message {
5357-
if instructionInjected || instruction == "" {
5358-
return nil
5359-
}
5360-
instructionInjected = true
5361-
result := chatprompt.InsertSystem(msgs, instruction)
5362-
if skillIndex := chattool.FormatSkillIndex(skills); skillIndex != "" {
5363-
result = chatprompt.InsertSystem(result, skillIndex)
5364-
}
5365-
return result
5366-
},
5354+
DisableChainMode: func() {
5355+
chainModeActive = false
5356+
},
5357+
PrepareMessages: func(msgs []fantasy.Message) []fantasy.Message {
5358+
if instructionInjected || instruction == "" {
5359+
return nil
5360+
}
5361+
instructionInjected = true
5362+
result := chatprompt.InsertSystem(msgs, instruction)
5363+
if skillIndex := chattool.FormatSkillIndex(skills); skillIndex != "" {
5364+
result = chatprompt.InsertSystem(result, skillIndex)
5365+
}
5366+
return result
5367+
},
53675368
OnRetry: func(
53685369
attempt int,
53695370
retryErr error,

coderd/x/chatd/chatloop/chatloop.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -355,16 +355,16 @@ func Run(ctx context.Context, opts RunOptions) error {
355355
// copy copies Message structs by value, so field
356356
// reassignments in addAnthropicPromptCaching only
357357
// affect the prepared slice.
358-
if opts.PrepareMessages != nil {
359-
if updated := opts.PrepareMessages(messages); updated != nil {
360-
messages = updated
361-
}
362-
}
363-
prepared := make([]fantasy.Message, len(messages))
364-
copy(prepared, messages)
365-
if applyAnthropicCaching {
366-
addAnthropicPromptCaching(prepared)
358+
if opts.PrepareMessages != nil {
359+
if updated := opts.PrepareMessages(messages); updated != nil {
360+
messages = updated
367361
}
362+
}
363+
prepared := make([]fantasy.Message, len(messages))
364+
copy(prepared, messages)
365+
if applyAnthropicCaching {
366+
addAnthropicPromptCaching(prepared)
367+
}
368368

369369
call := fantasy.Call{
370370
Prompt: prepared,

coderd/x/chatd/chatloop/chatloop_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,7 @@ func TestRun_PrepareMessagesInjectsSystemContextMidLoop(t *testing.T) {
16011601

16021602
// Simulate: after the tool executes (step 0), instruction
16031603
// becomes available. PrepareMessages injects it before step 1.
1604-
var instructionInjected atomic.Bool
1604+
instructionInjected := make(chan struct{})
16051605
var instructionAvailable atomic.Value
16061606
// The tool sets instruction after execution.
16071607
tool := fantasy.NewAgentTool(
@@ -1624,14 +1624,16 @@ func TestRun_PrepareMessagesInjectsSystemContextMidLoop(t *testing.T) {
16241624
return nil
16251625
},
16261626
PrepareMessages: func(msgs []fantasy.Message) []fantasy.Message {
1627-
if instructionInjected.Load() {
1627+
select {
1628+
case <-instructionInjected:
16281629
return nil
1630+
default:
16291631
}
16301632
instr, ok := instructionAvailable.Load().(string)
16311633
if !ok || instr == "" {
16321634
return nil
16331635
}
1634-
instructionInjected.Store(true)
1636+
close(instructionInjected)
16351637
// Insert a system message after existing system messages.
16361638
result := make([]fantasy.Message, 0, len(msgs)+1)
16371639
inserted := false
@@ -1748,7 +1750,7 @@ func TestRun_PrepareMessagesOnlyFiresOnce(t *testing.T) {
17481750
},
17491751
})
17501752
require.NoError(t, err)
1751-
require.Equal(t, 3, int(streamCalls))
1753+
require.Equal(t, 3, streamCalls)
17521754
// PrepareMessages is called before each of the 3 steps.
17531755
require.Equal(t, 3, int(prepareCalls.Load()))
17541756
}

coderd/x/chatd/chattool/createworkspace_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,6 @@ func TestCreateWorkspace_OnChatUpdatedFiresAfterBuild(t *testing.T) {
11191119
GetChatWorkspaceTTL(gomock.Any()).
11201120
Return("0s", nil)
11211121

1122-
11231122
// UpdateChatWorkspaceBinding — triggers first OnChatUpdated.
11241123
db.EXPECT().
11251124
UpdateChatWorkspaceBinding(gomock.Any(), gomock.Any()).
@@ -1162,7 +1161,6 @@ func TestCreateWorkspace_OnChatUpdatedFiresAfterBuild(t *testing.T) {
11621161
var mu sync.Mutex
11631162
var callbackChats []database.Chat
11641163

1165-
11661164
createFn := func(_ context.Context, _ uuid.UUID, req codersdk.CreateWorkspaceRequest) (codersdk.Workspace, error) {
11671165
return codersdk.Workspace{
11681166
ID: workspaceID,

coderd/x/chatd/instruction_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,4 +266,24 @@ func TestInstructionFromContextFiles(t *testing.T) {
266266
got := instructionFromContextFiles(msgs)
267267
require.Empty(t, got)
268268
})
269+
270+
t.Run("ReconstructsFromContextFileParts", func(t *testing.T) {
271+
t.Parallel()
272+
msgs := []database.ChatMessage{
273+
makeMsg([]codersdk.ChatMessagePart{
274+
{
275+
Type: codersdk.ChatMessagePartTypeContextFile,
276+
ContextFileOS: "linux",
277+
ContextFileDirectory: "/home/coder/project",
278+
ContextFileContent: "project rules",
279+
ContextFilePath: "/home/coder/project/AGENTS.md",
280+
},
281+
}),
282+
}
283+
got := instructionFromContextFiles(msgs)
284+
require.Contains(t, got, "Operating System: linux")
285+
require.Contains(t, got, "Working Directory: /home/coder/project")
286+
require.Contains(t, got, "Source: /home/coder/project/AGENTS.md")
287+
require.Contains(t, got, "project rules")
288+
})
269289
}

0 commit comments

Comments
 (0)