Complete local Bare smoke path
Rolling release / release (push) Successful in 9m29s

This commit is contained in:
2026-09-11 18:27:56 -04:00
parent 354e25995a
commit 7f92e3311b
4 changed files with 16 additions and 4 deletions
+2 -2
View File
@@ -22,8 +22,8 @@ export async function serveOnSessionBus(daemon) {
Sleep() { daemon.sleep(); } Sleep() { daemon.sleep(); }
Shutdown() { daemon.close(); } Shutdown() { daemon.close(); }
PushToTalk(pressed) { daemon.setPushToTalk?.(Boolean(pressed)); } PushToTalk(pressed) { daemon.setPushToTalk?.(Boolean(pressed)); }
Say(text) { return daemon.say?.(text); } async Say(text) { await daemon.say?.(text); }
Ask(text) { return daemon.ask(text); } async Ask(text) { await daemon.ask(text); }
Cancel() { daemon.cancel(); } Cancel() { daemon.cancel(); }
SetMode(mode) { daemon.mode = mode; daemon.emit('ModeChanged', mode); } SetMode(mode) { daemon.mode = mode; daemon.emit('ModeChanged', mode); }
GetState() { return daemon.state; } GetState() { return daemon.state; }
+9 -1
View File
@@ -105,9 +105,17 @@ export async function loadAuxiliaryModel(name, modelConfig = {}, modelType = und
if (existing) return existing; if (existing) return existing;
const sdk = await qvacSdk(); const sdk = await qvacSdk();
if (typeof sdk.loadModel !== 'function') throw new Error('QVAC SDK does not expose loadModel()'); if (typeof sdk.loadModel !== 'function') throw new Error('QVAC SDK does not expose loadModel()');
const auxiliaryConfig = resolveModelConfigAssets(sdk, modelConfig);
// GPU placement belongs to the LLM model configuration. ASR and TTS have
// their own validated schemas and reject llama.cpp-only keys.
if (!modelType || modelType === 'llm') {
auxiliaryConfig.device = 'gpu';
auxiliaryConfig.gpu_layers = QVAC_MASTER.gpuLayers;
auxiliaryConfig['mmproj-use-gpu'] = true;
}
const loadOptions = { const loadOptions = {
modelSrc: resolveSdkAsset(sdk, name), modelSrc: resolveSdkAsset(sdk, name),
modelConfig: { ...resolveModelConfigAssets(sdk, modelConfig), device: 'gpu', gpu_layers: QVAC_MASTER.gpuLayers, 'mmproj-use-gpu': true }, modelConfig: auxiliaryConfig,
}; };
if (modelType) loadOptions.modelType = modelType; if (modelType) loadOptions.modelType = modelType;
const modelId = await withQvacMaster(() => sdk.loadModel(loadOptions)); const modelId = await withQvacMaster(() => sdk.loadModel(loadOptions));
+1 -1
View File
@@ -7,7 +7,7 @@ export function createComputerActTools({ actuator } = {}) {
['cu_right_click', 'Right-click a coordinate.', { x: { type: 'number' }, y: { type: 'number' } }, 'rightClick'], ['cu_right_click', 'Right-click a coordinate.', { x: { type: 'number' }, y: { type: 'number' } }, 'rightClick'],
['cu_hover', 'Move the visible agent cursor.', { x: { type: 'number' }, y: { type: 'number' } }, 'hover'], ['cu_hover', 'Move the visible agent cursor.', { x: { type: 'number' }, y: { type: 'number' } }, 'hover'],
['cu_scroll', 'Scroll at a target.', { ref: { type: 'string' }, x: { type: 'number' }, y: { type: 'number' }, dy: { type: 'number' }, dx: { type: 'number' } }, 'scroll'], ['cu_scroll', 'Scroll at a target.', { ref: { type: 'string' }, x: { type: 'number' }, y: { type: 'number' }, dy: { type: 'number' }, dx: { type: 'number' } }, 'scroll'],
['cu_drag', 'Drag between semantic refs or coordinates.', { from: {}, to: {} }, 'drag'], ['cu_drag', 'Drag between semantic refs or coordinates.', { from: { type: 'object', properties: { ref: { type: 'string' }, x: { type: 'number' }, y: { type: 'number' } } }, to: { type: 'object', properties: { ref: { type: 'string' }, x: { type: 'number' }, y: { type: 'number' } } } }, 'drag'],
['cu_type', 'Type Unicode through the granted input backend.', { text: { type: 'string' }, ref: { type: 'string' }, submit: { type: 'boolean' } }, 'type'], ['cu_type', 'Type Unicode through the granted input backend.', { text: { type: 'string' }, ref: { type: 'string' }, submit: { type: 'boolean' } }, 'type'],
['cu_key', 'Send a keyboard combination through the granted input backend.', { combo: { type: 'string' } }, 'key'], ['cu_key', 'Send a keyboard combination through the granted input backend.', { combo: { type: 'string' } }, 'key'],
].map(([name, description, properties, method]) => ({ name, permission: 'computer-use', description, parameters: { type: 'object', properties }, execute: call(method) })); ].map(([name, description, properties, method]) => ({ name, permission: 'computer-use', description, parameters: { type: 'object', properties }, execute: call(method) }));
+4
View File
@@ -79,7 +79,11 @@ async function ensureInit() {
// the in-process inference surface and register the engines they own. // the in-process inference surface and register the engines they own.
mod = await import('@qvac/inference'); mod = await import('@qvac/inference');
const { llmPlugin } = await import('@qvac/inference/llamacpp-completion/plugin'); const { llmPlugin } = await import('@qvac/inference/llamacpp-completion/plugin');
const { whisperPlugin } = await import('@qvac/inference/whispercpp-transcription/plugin');
const { ttsPlugin } = await import('@qvac/inference/tts-ggml/plugin');
mod.registerPlugin(llmPlugin); mod.registerPlugin(llmPlugin);
mod.registerPlugin(whisperPlugin);
mod.registerPlugin(ttsPlugin);
} else { } else {
mod = await import('@qvac/sdk'); mod = await import('@qvac/sdk');
} }