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
@@ -16,12 +16,28 @@ test('durable reservation survives restart and concurrent resend; content stays
|
||||
assert.equal((await restarted.reserve('phone', 'task', envelope)).state, 'unknown')
|
||||
await journal.accepted(reservations.find(r => r.fresh))
|
||||
assert.equal((await restarted.reserve('phone', 'task', envelope)).state, 'accepted')
|
||||
await Promise.all([journal.update(reservations.find(r => r.fresh), 'complete'), journal.accepted(reservations.find(r => r.fresh))])
|
||||
assert.equal((await restarted.reserve('phone', 'task', envelope)).state, 'complete', 'late acceptance must not overwrite completion')
|
||||
await assert.rejects(restarted.reserve('phone', 'task', { text: 'changed' }), /farklı/)
|
||||
const data = await readFile(join(directory, (await readdir(directory))[0]), 'utf8')
|
||||
assert.ok(!data.includes('private prompt'))
|
||||
} finally { await rm(directory, { recursive: true, force: true }) }
|
||||
})
|
||||
|
||||
test('task events only settle the matching device task and runtime', async () => {
|
||||
const events = [], writes = []
|
||||
const client = new MobileGatewayClient(() => {}, event => events.push(event), {
|
||||
journal: { update: async (...args) => writes.push(args) }, authorize: async () => {} })
|
||||
client.tasks.set('correlation', { taskId: 'phone-task', sessionId: 'stored', runtimeId: 'runtime', reservation: {} })
|
||||
client.onEvent({ type: 'task.complete', session_id: 'other', payload: { task_id: 'correlation', status: 'complete' } })
|
||||
client.onEvent({ type: 'task.complete', session_id: 'runtime', payload: { task_id: 'another-task', status: 'complete' } })
|
||||
assert.equal(events.length, 0)
|
||||
const terminal = { type: 'task.complete', session_id: 'runtime', payload: { task_id: 'correlation', status: 'error', text: 'Test failed' } }
|
||||
client.onEvent(terminal); client.onEvent(terminal)
|
||||
assert.equal(events.length, 1); assert.equal(writes.length, 1)
|
||||
assert.equal(events[0].taskId, 'phone-task'); assert.equal(events[0].status, 'error')
|
||||
})
|
||||
|
||||
test('approval binds exact backend request and forbids permanent/model-generated permissions', async () => {
|
||||
const rpcCalls = []
|
||||
const client = new MobileGatewayClient(() => {}, () => {}, { authorize: async () => {} })
|
||||
|
||||
Reference in new issue
Block a user