feat: preserve compact agent context and bump to 1.2.25
This commit is contained in:
@@ -15,6 +15,7 @@ const evidenceApi = compile(fs.readFileSync(require.resolve('../src/renderer/src
|
||||
const context = compile(fs.readFileSync(require.resolve('../src/renderer/src/features/workspace/agentContext.ts'), 'utf8'), {
|
||||
require: name => { assert.equal(name, './agentEvidence'); return evidenceApi }
|
||||
})
|
||||
const conversation = compile(fs.readFileSync(require.resolve('../src/renderer/src/features/workspace/agentConversationContext.ts'), 'utf8'))
|
||||
const source = ts.createSourceFile('useAiAgent.ts', fs.readFileSync(require.resolve('../src/renderer/src/features/workspace/useAiAgent.ts'), 'utf8'), ts.ScriptTarget.Latest, true)
|
||||
const hook = source.statements.find(node => ts.isFunctionDeclaration(node) && node.name?.text === 'useAiAgent')
|
||||
const functions = hook.body.statements.filter(node => ts.isVariableStatement(node) && ['requestPlan', 'stop'].includes(node.declarationList.declarations[0].name.getText(source)))
|
||||
@@ -29,10 +30,10 @@ function harness(requestApi) {
|
||||
let now = 1000
|
||||
class Clock extends Date { static now() { return now } }
|
||||
const state = { pending: false, activity: '', steps: [], messages: [], saved: [], notices: 0, requestStartedAt: null }
|
||||
const messageStateRef = { current: { session } }
|
||||
const messageStateRef = { current: { session, messages: [] } }
|
||||
const selectedModel = { provider: 'QWEN', model: 'fixture', imagesEnabled: true }
|
||||
const api = compile(functions.map(node => `export ${node.getText(source)}`).join('\n'), {
|
||||
...context, session, messageStateRef, AbortController, FormData,
|
||||
...context, ...conversation, session, messageStateRef, AbortController, FormData,
|
||||
Date: Clock,
|
||||
courseId: 'course', weekNumber: 3, pending: false, historyLoading: false, statusLoading: false,
|
||||
selectedModel,
|
||||
@@ -41,7 +42,7 @@ function harness(requestApi) {
|
||||
setRequestStartedAt: value => { state.requestStartedAt = value },
|
||||
setActivity: value => { state.activity = value },
|
||||
setProgressSteps: value => { state.steps = typeof value === 'function' ? value(state.steps) : value },
|
||||
updateMessages: update => { state.messages = update(state.messages); state.saved.push(plain(state.messages)) },
|
||||
updateMessages: update => { state.messages = update(state.messages); messageStateRef.current.messages = state.messages; state.saved.push(plain(state.messages)) },
|
||||
onResponseRef: { current: () => { state.notices++ } }, requestApi
|
||||
})
|
||||
return { ...api, state, selectedModel, messageStateRef, advance: ms => { now += ms } }
|
||||
@@ -219,6 +220,30 @@ test('remote target and observed source ranges reach each provider request inclu
|
||||
assert.match(bodies[2].request, /자료 조회는 종료되었습니다/)
|
||||
})
|
||||
|
||||
test('sends only prior same-workspace context and keeps it stable throughout tool lookups', async () => {
|
||||
const bodies = []
|
||||
const h = harness(async (_, request) => {
|
||||
bodies.push(JSON.parse(request.body))
|
||||
const reply = bodies.length === 2 ? response([{ id: 'read', name: 'files.read', moduleName: 'Control', args: { path: 'config.yaml' } }]) : response()
|
||||
return { ...reply, plan: { ...reply.plan, conversationSummary: 'Control의 config.yaml 설명을 진행 중입니다.' } }
|
||||
})
|
||||
const options = { environment: 'local', workspaceTarget: 'local-host', workspaceRoot: '/workspace/a', executeTool: async () => result() }
|
||||
await h.requestPlan('Control 설정 위치', [], [], options)
|
||||
assert.equal(bodies[0].conversationContext, undefined)
|
||||
await h.requestPlan('그 파일 설명해줘', [], [], options)
|
||||
assert.equal(bodies.length, 3)
|
||||
assert.equal(bodies[1].conversationContext.recentMessages[0].content, 'Control 설정 위치')
|
||||
assert.equal(bodies[1].conversationContext.summary, 'Control의 config.yaml 설명을 진행 중입니다.')
|
||||
assert.equal(h.state.saved[1][1].plan.conversationSummary, 'Control의 config.yaml 설명을 진행 중입니다.')
|
||||
assert.equal(JSON.stringify(bodies[1].conversationContext).includes('그 파일 설명해줘'), false)
|
||||
assert.deepEqual(bodies[1].conversationContext, bodies[2].conversationContext)
|
||||
assert.equal(bodies[1].workspaceRoot, undefined)
|
||||
await h.requestPlan('다른 원격 질문', [], [], { ...options, environment: 'remote', workspaceTarget: 'ssh:device' })
|
||||
assert.equal(bodies.at(-1).conversationContext, undefined)
|
||||
await h.requestPlan('다른 로컬 폴더', [], [], { ...options, workspaceRoot: '/workspace/b' })
|
||||
assert.equal(bodies.at(-1).conversationContext, undefined)
|
||||
})
|
||||
|
||||
test('errors replace temporary progress with the existing error reply', async () => {
|
||||
let calls = 0
|
||||
const h = harness(async () => {
|
||||
|
||||
Reference in New Issue
Block a user