feat(mobile): correlate voice tasks and recover results on reconnect
This commit is contained in:
1 parent
9f9f3226a1
commit
b66daed07a
17 files changed
+308
-48
No files matched your search
@@ -1,9 +1,10 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { DeliveryJournal, MobileGatewayClient } from '../../desktop/electron/mobile-adapter.mjs'
|
||||
const [port, directory] = process.argv.slice(2), events = []
|
||||
const client = new MobileGatewayClient(async () => ({ baseUrl: `http://127.0.0.1:${port}`,
|
||||
const makeClient = () => new MobileGatewayClient(async () => ({ baseUrl: `http://127.0.0.1:${port}`,
|
||||
wsUrl: `ws://127.0.0.1:${port}/api/ws?token=local-mobile-integration-token`, token: 'local-mobile-integration-token' }),
|
||||
event => events.push(event), { deviceId: 'phone-fixture', journal: new DeliveryJournal(directory), authorize: async () => {} })
|
||||
let client = makeClient()
|
||||
try {
|
||||
const list = await client.handle({ id: 'list', action: 'sessions.list' })
|
||||
assert.ok(list.sessions.some(row => row.id === 'mobile-integration-session'))
|
||||
@@ -13,9 +14,19 @@ try {
|
||||
model: selected.model, intent: 'research', text: 'MOBIL_GOREV_20260908: Yalnız bağlantı sınaması; dosya değiştirme.' } }
|
||||
assert.equal((await client.handle(request)).state, 'accepted')
|
||||
assert.equal((await client.handle(request)).duplicate, true)
|
||||
for (let i = 0; i < 300 && !events.some(event => event.event === 'message.complete'); i++) await new Promise(resolve => setTimeout(resolve, 100))
|
||||
const result = events.find(event => event.event === 'message.complete')
|
||||
const queued = ['second-task', 'third-task'].map(taskId => ({ ...request, params: { ...request.params, taskId,
|
||||
text: 'MOBIL_SIRA_20260908: Aynı metin ama ayrı kullanıcı görev kimliği.' } }))
|
||||
for (const entry of queued) assert.equal((await client.handle(entry)).state, 'accepted')
|
||||
client.close()
|
||||
client = makeClient()
|
||||
await client.handle({ id: 'open-again', action: 'session.open', params: { sessionId: request.params.sessionId } })
|
||||
for (const entry of [request, ...queued]) assert.equal((await client.handle(entry)).duplicate, true)
|
||||
for (let i = 0; i < 600 && new Set(events.filter(event => event.event === 'task.complete').map(e => e.taskId)).size < 3; i++) await new Promise(resolve => setTimeout(resolve, 100))
|
||||
const results = events.filter(event => event.event === 'task.complete')
|
||||
assert.deepEqual([...new Set(results.map(e => e.taskId))].sort(), ['one-task', 'second-task', 'third-task'])
|
||||
const result = results.find(event => event.taskId === 'one-task')
|
||||
assert.ok(result, 'real runtime completion event missing')
|
||||
assert.equal(result.taskId, 'one-task')
|
||||
assert.equal(result.status, 'complete', JSON.stringify(result)); assert.equal(result.text, 'MOBIL_RUNTIME_OK')
|
||||
console.log(JSON.stringify({ result, duplicateSuppressed: true }))
|
||||
} finally { client.close() }
|
||||
Reference in new issue
Block a user