@@ -9,6 +9,8 @@ import { voiceSystemPrompt, parseHudSidecar } from '../skills/voice-prompt.js';
|
||||
import { createComputerObserveTools } from '../skills/computer-observe.js';
|
||||
import { createComputerActTools } from '../skills/computer-act.js';
|
||||
import { createPhase9GatewayTool } from '../skills/phase9-tools.js';
|
||||
import { createBrowserTools } from '../skills/browser-tools.js';
|
||||
import { createWebcamTools } from '../skills/webcam-tools.js';
|
||||
import { ensureAgentWorkspace, normalizeAssistantName } from './agent-workspace.js';
|
||||
|
||||
export function harnessRoots(fsAccess) {
|
||||
@@ -18,28 +20,33 @@ export function harnessRoots(fsAccess) {
|
||||
}
|
||||
|
||||
export class HarnessBridge extends EventEmitter {
|
||||
constructor({ cwd, model = QVAC_MASTER.model, tools = [], computer, observer, actuator, permissionMode = 'ask', fsAccess } = {}) {
|
||||
constructor({ cwd, model = QVAC_MASTER.model, tools = [], computer, observer, actuator, browser, camera, webcam, webcamNormalizer, permissionMode = 'ask', fsAccess } = {}) {
|
||||
super();
|
||||
const settings = voiceSettings();
|
||||
const access = fsAccess ?? settings.fsAccess;
|
||||
const assistantName = normalizeAssistantName(settings.assistantName);
|
||||
const workspace = cwd || ensureAgentWorkspace({ name: assistantName, prompt: settings.assistantPrompt });
|
||||
const roots = harnessRoots(access);
|
||||
this.assistantName = assistantName;
|
||||
this.assistantPrompt = settings.assistantPrompt;
|
||||
this.options = {
|
||||
cwd: workspace,
|
||||
roots,
|
||||
model,
|
||||
tools: [
|
||||
...createRuntimeTools({ computer }),
|
||||
...createRuntimeTools({ computer, camera }),
|
||||
...createPhase2Tools({ cwd: workspace, computer, roots: filesystemRoots(access, workspace) }),
|
||||
...createComputerObserveTools({ computer, observer }),
|
||||
...createComputerActTools({ actuator }),
|
||||
...createQvacTools(),
|
||||
...createPhase9GatewayTool(),
|
||||
...createBrowserTools({ browser }),
|
||||
...createWebcamTools({ camera, capture: webcam, normalizer: webcamNormalizer }),
|
||||
...tools,
|
||||
],
|
||||
builtinTools: ['read_file', 'write_file', 'search_replace', 'list_dir', 'grep', 'run_terminal_cmd', 'web_fetch', 'fetch_page', 'google_search', 'web_search', 'wiki_search', 'hn_search', 'code_search', 'todo_write', 'task', 'update_goal', 'memory_search', 'memory_get', 'memory_write'],
|
||||
webFetch: true,
|
||||
browser,
|
||||
permissionMode,
|
||||
origin: 'jarvis-qvac',
|
||||
system: voiceSystemPrompt(assistantName, settings.assistantPrompt),
|
||||
@@ -78,7 +85,19 @@ export class HarnessBridge extends EventEmitter {
|
||||
return this.session;
|
||||
}
|
||||
|
||||
setIdentity(name, extra) {
|
||||
this.assistantName = normalizeAssistantName(name);
|
||||
this.assistantPrompt = extra || '';
|
||||
this.refreshPrompt();
|
||||
}
|
||||
|
||||
refreshPrompt() {
|
||||
if (!this.options) return;
|
||||
this.options.system = voiceSystemPrompt(this.assistantName, this.assistantPrompt);
|
||||
}
|
||||
|
||||
async ask(text) {
|
||||
this.refreshPrompt();
|
||||
if (!this.session) await this.start();
|
||||
// Some QVAC runs deliver the final assistant text through the stream but
|
||||
// omit it from the final envelope after a tool call. Keep the current
|
||||
|
||||
Reference in New Issue
Block a user