Check Point
Rolling release / release (push) Successful in 6m36s

This commit is contained in:
2026-09-12 09:07:09 -04:00
parent e9040d110a
commit a4073b9020
63 changed files with 2459 additions and 632 deletions
+25
View File
@@ -1,3 +1,7 @@
import { mkdtempSync } from 'node:fs';
import { tmpdir } from 'node:os';
import path from 'node:path';
process.env.XDG_STATE_HOME = mkdtempSync(path.join(tmpdir(), 'jarvis-daemon-test-'));
import test from 'node:test';
import assert from 'node:assert/strict';
import { VoiceStateMachine } from '../daemon/voice-state.js';
@@ -145,3 +149,24 @@ test('QVAC scheduler prioritizes voice and keeps one active job', async () => {
assert.deepEqual(order, ['first', 'voice', 'media']);
assert.deepEqual(scheduler.status(), { running: 0, queued: [] });
});
test('shutdown still closes the harness when recovery or voice cleanup fails', async () => {
const daemon = new JarvisDaemon(); let closed = false;
daemon.recovery.save = () => { throw new Error('disk full'); };
daemon.harness = { cancel() {}, close: async () => { closed = true; } };
daemon.voiceLoop = { stop: async () => { throw new Error('voice cleanup'); } };
await assert.rejects(daemon.close(), /voice cleanup/);
assert.equal(closed, true);
});
test('cancel suppresses a late reply and revokes portal input', async () => {
const daemon = new JarvisDaemon(); let resolve; let revoked = false;
daemon.input = { revoke: () => { revoked = true; } };
daemon.harness = { ask: () => new Promise(r => { resolve = r; }), cancel() {}, close: async () => {} };
const replies = []; daemon.on('Reply', text => replies.push(text));
try {
const ask = daemon.ask('hello'); await Promise.resolve(); daemon.cancel();
resolve({ text: 'late answer' }); assert.equal(await ask, '');
assert.deepEqual(replies, []); assert.equal(daemon.state, 'ARMED'); assert.equal(revoked, true);
} finally { await daemon.close(); }
});