Polish Round

This commit is contained in:
2026-09-11 14:37:56 -04:00
parent cc182f2ef1
commit 660294d0aa
7 changed files with 32 additions and 10 deletions
+1
View File
@@ -17,3 +17,4 @@ jobs:
- run: node --check daemon/dbus-service.js - run: node --check daemon/dbus-service.js
- run: node --check apps/gnome-extension/[email protected]/extension.js - run: node --check apps/gnome-extension/[email protected]/extension.js
- run: python3 -c "import xml.etree.ElementTree as E; E.parse('dbus/io.qvac.Jarvis.Session.xml')" - run: python3 -c "import xml.etree.ElementTree as E; E.parse('dbus/io.qvac.Jarvis.Session.xml')"
- run: python3 -m py_compile apps/control-center/main.py computer-use/py/*.py
+2
View File
@@ -3,3 +3,5 @@ qvac.config.local.json
.env .env
dist/ dist/
*.log *.log
__pycache__/
*.pyc
+12 -6
View File
@@ -1,6 +1,6 @@
# JARVIS-QVAC # JARVIS-QVAC
Local-first Ubuntu GNOME voice assistant scaffold. The cognitive core is the Local-first Ubuntu GNOME voice assistant. The cognitive core is the
already-extracted `/home/raven/dev/agent-harness`, copied into already-extracted `/home/raven/dev/agent-harness`, copied into
`vendor/agent-harness`; Jarvis does not copy or depend on `/home/raven/dev/dlinux`. `vendor/agent-harness`; Jarvis does not copy or depend on `/home/raven/dev/dlinux`.
@@ -25,8 +25,14 @@ GPU inference is a hard requirement. `gpu-doctor` must report a QVAC-visible
GPU and `jarvisd` refuses to continue if the loaded model reports `device: cpu`. GPU and `jarvisd` refuses to continue if the loaded model reports `device: cpu`.
This prevents a misleading CPU mode and competing QVAC workers. This prevents a misleading CPU mode and competing QVAC workers.
Current repository scope is phase-0/phase-1 bootstrap plus the computer-use The repository contains the daemon, single GPU-only QVAC master, copied agent
grant boundary. Portal ScreenCast/RemoteDesktop, AT-SPI, PipeWire audio, the harness, voice loop, GNOME ARC extension, GTK4/libadwaita control center,
full D-Bus adapter, GTK control-center pages, and the voice state machine are computer-use observation and safety boundaries, and the full QVAC capability
the next implementation slices. See [docs/agent-harness-map.md](docs/agent-harness-map.md) skill registry. See [docs/ROADMAP.md](docs/ROADMAP.md),
and [docs/cu-acceptance.md](docs/cu-acceptance.md). [docs/agent-harness-map.md](docs/agent-harness-map.md), and
[docs/cu-acceptance.md](docs/cu-acceptance.md).
Runtime inference refuses to start until the QVAC SDK reports a usable GPU.
The RemoteDesktop/libei input bridge also remains unavailable until the local
GNOME portal session and a real EIS injector are present; Jarvis never claims
that an action succeeded when the backend is missing.
+9
View File
@@ -2,6 +2,8 @@
"""RemoteDesktop consent broker for the local EIS input worker.""" """RemoteDesktop consent broker for the local EIS input worker."""
import json import json
import sys import sys
import os
import subprocess
try: try:
import gi import gi
gi.require_version('Gio', '2.0') gi.require_version('Gio', '2.0')
@@ -26,6 +28,9 @@ try:
session = request('CreateSession', '(a{sv})', ({'session_handle_token': GLib.Variant('s', token)},))['session_handle'] session = request('CreateSession', '(a{sv})', ({'session_handle_token': GLib.Variant('s', token)},))['session_handle']
request('SelectDevices', '(oa{sv})', (session, {'types': GLib.Variant('u', 3), 'persist_mode': GLib.Variant('u', 2)})) request('SelectDevices', '(oa{sv})', (session, {'types': GLib.Variant('u', 3), 'persist_mode': GLib.Variant('u', 2)}))
request('Start', '(osa{sv})', (session, '', {})) request('Start', '(osa{sv})', (session, '', {}))
if not os.environ.get('JARVIS_LIBEI_BRIDGE'):
raise RuntimeError('portal consent succeeded but no local libei injector is configured; refusing to claim input readiness')
injector = subprocess.Popen(os.environ['JARVIS_LIBEI_BRIDGE'], shell=True, stdin=subprocess.PIPE, text=True)
print(json.dumps({'type': 'ready', 'session': session, 'restore_token_present': True}), flush=True) print(json.dumps({'type': 'ready', 'session': session, 'restore_token_present': True}), flush=True)
except Exception as exc: except Exception as exc:
print(json.dumps({'type': 'error', 'reason': str(exc)}), flush=True) print(json.dumps({'type': 'error', 'reason': str(exc)}), flush=True)
@@ -34,5 +39,9 @@ for line in sys.stdin:
action = json.loads(line) action = json.loads(line)
if action.get('type') == 'close': if action.get('type') == 'close':
break break
if 'injector' in globals() and injector.stdin:
injector.stdin.write(json.dumps(action) + '\n'); injector.stdin.flush()
except Exception: except Exception:
continue continue
if 'injector' in globals():
injector.terminate()
+1 -1
View File
@@ -83,5 +83,5 @@ if (import.meta.url === `file://${process.argv[1]}`) {
console.error(`jarvisd: D-Bus unavailable: ${error.message}`); console.error(`jarvisd: D-Bus unavailable: ${error.message}`);
}); });
process.on('SIGINT', () => daemon.close().finally(() => process.exit(0))); process.on('SIGINT', () => daemon.close().finally(() => process.exit(0)));
console.log('jarvisd scaffold ready; use the D-Bus adapter when installed'); console.log('jarvisd ready; QVAC inference remains GPU-gated');
} }
+7 -3
View File
@@ -2,9 +2,13 @@
Run these on Ubuntu GNOME after `npm run cu-doctor` reports its required portal, Run these on Ubuntu GNOME after `npm run cu-doctor` reports its required portal,
PipeWire, AT-SPI, and libei checks as passed. The ydotool result is optional. PipeWire, AT-SPI, and libei checks as passed. The ydotool result is optional.
Phase 6 is observe-only: the explicit The explicit computer-use grant is required, screenshots stay in
computer-use grant is required, screenshots stay in `/tmp/jarvis-cu`, and `/tmp/jarvis-cu`, and actuation is enabled only after the local EIS injector
actuation remains a Phase 7 concern. reports ready.
For live pointer and keyboard injection, configure `JARVIS_LIBEI_BRIDGE` with
the local EIS injector command. The portal helper refuses readiness without it;
this prevents a consent-only session from being mistaken for working input.
1. Observe Settings and toggle Night Light. 1. Observe Settings and toggle Night Light.
2. Type a sentence into Text Editor and save it. 2. Type a sentence into Text Editor and save it.