fix: show agent messages before workspace lookup and bump to 1.2.24
This commit is contained in:
@@ -47,6 +47,92 @@ function harness(requestApi) {
|
||||
return { ...api, state, selectedModel, messageStateRef, advance: ms => { now += ms } }
|
||||
}
|
||||
|
||||
test('shows and persists the question, pending state and timer before a slow module snapshot finishes', async () => {
|
||||
const snapshot = deferred(), completion = deferred()
|
||||
const bodies = []
|
||||
let loads = 0
|
||||
const h = harness((_, request) => { bodies.push(JSON.parse(request.body)); return completion.promise })
|
||||
const running = h.requestPlan('원격 차량 속도 제한 위치', [], [], {
|
||||
environment: 'remote', workspaceTarget: 'ssh:100.64.0.10', executeTool: async () => result(),
|
||||
loadInitialContext: signal => { loads++; assert.equal(signal.aborted, false); return snapshot.promise }
|
||||
})
|
||||
assert.equal(h.state.messages[0].content, '원격 차량 속도 제한 위치')
|
||||
assert.equal(h.state.saved[0][0].role, 'user')
|
||||
assert.equal(h.state.pending, true)
|
||||
assert.equal(h.state.requestStartedAt, 1000)
|
||||
assert.equal(h.state.activity, '모듈 상태 조회 중')
|
||||
assert.equal(bodies.length, 0)
|
||||
await h.requestPlan('중복 전송', [], [], { loadInitialContext: () => { loads++; return snapshot.promise } })
|
||||
assert.equal(loads, 1)
|
||||
assert.equal(h.state.messages.length, 1)
|
||||
h.advance(5000)
|
||||
h.selectedModel.provider = 'OPENAI'
|
||||
snapshot.resolve({ modules: [{ name: 'Control', state: 'running', parameters: ['sim_mode:=false'], files: [] }], runtimeLogs: [] })
|
||||
await tick()
|
||||
assert.equal(bodies.length, 1)
|
||||
assert.equal(bodies[0].provider, 'QWEN')
|
||||
assert.equal(bodies[0].modules[0].state, 'running')
|
||||
assert.deepEqual(bodies[0].modules[0].parameters, ['sim_mode:=false'])
|
||||
h.advance(2000)
|
||||
completion.resolve(response())
|
||||
await running
|
||||
assert.equal(h.state.messages[1].durationMs, 7000)
|
||||
assert.equal(h.state.pending, false)
|
||||
})
|
||||
|
||||
for (const reject of [false, true]) test(`cancels during initial module lookup and ignores its late ${reject ? 'failure' : 'result'} without affecting a new request`, async () => {
|
||||
const old = deferred(), next = deferred()
|
||||
let calls = 0, signal
|
||||
const h = harness(async () => { calls++; return response() })
|
||||
const first = h.requestPlan('첫 질문', [], [], { loadInitialContext: current => { signal = current; return old.promise } })
|
||||
h.stop()
|
||||
assert.equal(signal.aborted, true)
|
||||
assert.equal(h.state.pending, false)
|
||||
const second = h.requestPlan('다음 질문', [], [], { loadInitialContext: () => next.promise })
|
||||
if (reject) old.reject(Error('늦게 도착한 SSH 오류'))
|
||||
else old.resolve({ modules: [], runtimeLogs: [] })
|
||||
await first
|
||||
assert.equal(calls, 0)
|
||||
assert.equal(h.state.pending, true)
|
||||
assert.equal(h.state.activity, '모듈 상태 조회 중')
|
||||
assert.equal(h.state.messages.length, 2)
|
||||
assert.equal(h.state.notices, 0)
|
||||
next.resolve({ modules: [], runtimeLogs: [] })
|
||||
await second
|
||||
assert.equal(calls, 1)
|
||||
assert.equal(h.state.messages.length, 3)
|
||||
})
|
||||
|
||||
test('initial snapshot errors preserve the question and show a timed error without calling the model', async () => {
|
||||
const snapshot = deferred()
|
||||
let calls = 0
|
||||
const h = harness(async () => { calls++; return response() })
|
||||
const running = h.requestPlan('질문', [], [], { loadInitialContext: () => snapshot.promise })
|
||||
h.advance(3000)
|
||||
snapshot.reject(Error('원격 모듈 상태 조회 실패'))
|
||||
await running
|
||||
assert.equal(calls, 0)
|
||||
assert.equal(h.state.messages[0].content, '질문')
|
||||
assert.equal(h.state.messages[1].content, '원격 모듈 상태 조회 실패')
|
||||
assert.equal(h.state.messages[1].durationMs, 3000)
|
||||
assert.equal(h.state.pending, false)
|
||||
assert.equal(h.state.requestStartedAt, null)
|
||||
assert.equal(h.state.activity, '')
|
||||
})
|
||||
|
||||
test('scope changes during initial snapshot loading suppress later API calls and errors', async () => {
|
||||
const snapshot = deferred()
|
||||
let calls = 0
|
||||
const h = harness(async () => { calls++; return response() })
|
||||
const running = h.requestPlan('이전 강좌 질문', [], [], { loadInitialContext: () => snapshot.promise })
|
||||
h.messageStateRef.current.session = {}
|
||||
snapshot.resolve({ modules: [], runtimeLogs: [] })
|
||||
await running
|
||||
assert.equal(calls, 0)
|
||||
assert.equal(h.state.messages.length, 1)
|
||||
assert.equal(h.state.notices, 0)
|
||||
})
|
||||
|
||||
test('publishes completed stages immediately without persisting progress or adding model calls', async () => {
|
||||
const first = deferred(), tool = deferred(), final = deferred()
|
||||
let calls = 0
|
||||
|
||||
Reference in New Issue
Block a user