fix(context): preserve committed workspace projections

This commit is contained in:
_Kerman
2026-08-03 12:39:39 +08:00
parent 616ee55372
commit f3460a052f
5 changed files with 57 additions and 21 deletions

View File

@@ -1,7 +1,7 @@
import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { afterEach, describe, expect, it } from 'vitest'
import { afterEach, describe, expect, it, vi } from 'vitest'
import { Context } from 'cordis'
import LlmService, { createUserMessage, CallId, HarnessError } from '@deepseek-ai/dsh-llm'
import SessionStore, { SessionId } from '@deepseek-ai/dsh-session'
@@ -354,7 +354,7 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY)('Code Mode: real model writes a p
expect(finalText).toContain('beta-9')
}, 180_000)
it('delivers nested workspace instructions discovered by an fs sub-call after the outer result', async () => {
it('projects nested workspace instructions discovered by an fs sub-call', async () => {
workdir = await mkdtemp(join(tmpdir(), 'dsh-code-mode-workspace-e2e-'))
await mkdir(join(workdir, '.git'), { recursive: true })
await mkdir(join(workdir, 'pkg/deep'), { recursive: true })
@@ -377,16 +377,21 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY)('Code Mode: real model writes a p
const events: SessionEvent[] = [...handle.agent.session.events]
const dispatch = events.find(event => event.type === 'tool/code-dispatch' && event.data.name === 'read')
const outerResult = events.find(event => event.type === 'tool/result')
const workspaceContext = events.find(event => event.type === 'user/message'
&& event.data.source.kind === 'workspace-instructions')
const workspaceContext = await vi.waitFor(() => {
const splice = handle.agent.session.events.findLast(event => event.type === 'agent/inbox/spliced'
&& event.data.inserted.some(message => message.source.kind === 'workspace-instructions'))
const inserted = splice?.type === 'agent/inbox/spliced'
? splice.data.inserted.find(message => message.source.kind === 'workspace-instructions')
: undefined
expect(inserted).toBeDefined()
return inserted!
})
expect(dispatch).toBeDefined()
expect(outerResult).toBeDefined()
expect(workspaceContext).toBeDefined()
expect(workspaceContext!.seq).toBeGreaterThan(outerResult!.seq)
const finalMessage = events.findLast(event => event.type === 'assistant/message')
const answer = finalMessage?.type === 'assistant/message'
? finalMessage.data.message.content.filter(block => block.type === 'text').map(block => block.text).join('')
: ''
expect(answer).toContain(WORKSPACE_PROBE)
const contextText = workspaceContext.content
.filter(block => block.type === 'text')
.map(block => block.text)
.join('\n')
expect(contextText).toContain(WORKSPACE_PROBE)
}, 180_000)
})