This commit is contained in:
2026-09-11 13:54:10 -04:00
parent 4c81d26274
commit 8f6884ac42
7 changed files with 185 additions and 11 deletions
+11 -2
View File
@@ -1,11 +1,14 @@
import { EventEmitter } from 'node:events';
import { acquireQvac, closeQvac, releaseQvac, Agent } from './qvac-master.js';
import { createRuntimeTools } from '../skills/runtime-tools.js';
import { createPhase2Tools } from '../skills/phase2-tools.js';
import { createQvacTools } from '../skills/qvac-tools.js';
import { VOICE_SYSTEM_PROMPT, parseHudSidecar } from '../skills/voice-prompt.js';
export class HarnessBridge extends EventEmitter {
constructor({ cwd = process.cwd(), model = 'qwen3.5-4b', tools = [], computer, permissionMode = 'ask' } = {}) {
super();
this.options = { cwd, model, tools: [...createRuntimeTools({ computer }), ...tools], permissionMode, origin: 'jarvis-qvac', system: 'You are Jarvis on a local Ubuntu GNOME desktop. Keep spoken replies short, ground claims in local tool results, and never claim cloud access.' };
this.options = { cwd, model, tools: [...createRuntimeTools({ computer }), ...createPhase2Tools({ cwd, computer }), ...createQvacTools(), ...tools], permissionMode, origin: 'jarvis-qvac', system: VOICE_SYSTEM_PROMPT };
this.session = null;
}
@@ -23,7 +26,13 @@ export class HarnessBridge extends EventEmitter {
throw error;
}
for (const event of ['agent_message_chunk', 'tool_call', 'permission', 'ask_user', 'cap-chunk', 'error']) {
this.session.on(event, (payload) => this.emit(event, payload));
this.session.on(event, (payload) => {
if (event === 'agent_message_chunk' && payload?.text) {
const parsed = parseHudSidecar(payload.text);
if (parsed.hud) this.emit('hud_sidecar', parsed.hud);
}
this.emit(event, payload);
});
}
return this.session;
}
+8
View File
@@ -85,6 +85,14 @@ export async function qvacRuntimeState() {
return sdk.state();
}
const MASTER_CALLS = new Set(['assessModelFit', 'getSystemResources', 'state', 'heartbeat']);
export async function callQvac(method, input) {
if (!MASTER_CALLS.has(method)) throw new Error(`QVAC method is not exposed through the master: ${method}`);
const sdk = await Agent.engine.ensureInit();
if (typeof sdk[method] !== 'function') throw new Error(`QVAC SDK does not expose ${method}()`);
return input === undefined ? sdk[method]() : sdk[method](input);
}
export function qvacStatus() {
return { ...QVAC_MASTER, owners: ownerCount, loaded: Agent.engine.getLoaded() };
}