From 660294d0aa8b9c0bd752d85b83726b59abfe633c Mon Sep 17 00:00:00 2001 From: Raven Scott Date: Fri, 11 Sep 2026 14:37:56 -0400 Subject: [PATCH] Polish Round --- .github/workflows/ci.yml | 1 + .gitignore | 2 ++ README.md | 18 ++++++++++++------ .../portal_remote_desktop.cpython-314.pyc | Bin 3805 -> 0 bytes computer-use/py/portal_remote_desktop.py | 9 +++++++++ daemon/index.js | 2 +- docs/cu-acceptance.md | 10 +++++++--- 7 files changed, 32 insertions(+), 10 deletions(-) delete mode 100644 computer-use/py/__pycache__/portal_remote_desktop.cpython-314.pyc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f58176..b2a48ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,3 +17,4 @@ jobs: - run: node --check daemon/dbus-service.js - run: node --check apps/gnome-extension/jarvis@qvac.local/extension.js - 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 diff --git a/.gitignore b/.gitignore index f83b803..919060e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ qvac.config.local.json .env dist/ *.log +__pycache__/ +*.pyc diff --git a/README.md b/README.md index e5284cf..ba18881 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 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 `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`. This prevents a misleading CPU mode and competing QVAC workers. -Current repository scope is phase-0/phase-1 bootstrap plus the computer-use -grant boundary. Portal ScreenCast/RemoteDesktop, AT-SPI, PipeWire audio, the -full D-Bus adapter, GTK control-center pages, and the voice state machine are -the next implementation slices. See [docs/agent-harness-map.md](docs/agent-harness-map.md) -and [docs/cu-acceptance.md](docs/cu-acceptance.md). +The repository contains the daemon, single GPU-only QVAC master, copied agent +harness, voice loop, GNOME ARC extension, GTK4/libadwaita control center, +computer-use observation and safety boundaries, and the full QVAC capability +skill registry. See [docs/ROADMAP.md](docs/ROADMAP.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. diff --git a/computer-use/py/__pycache__/portal_remote_desktop.cpython-314.pyc b/computer-use/py/__pycache__/portal_remote_desktop.cpython-314.pyc deleted file mode 100644 index e1e1b2705b027bf0d11bdf8a678f522d1223c3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3805 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 M!yVk?b_(YI0rCBbwEzGB diff --git a/computer-use/py/portal_remote_desktop.py b/computer-use/py/portal_remote_desktop.py index 82e4194..9750ea5 100644 --- a/computer-use/py/portal_remote_desktop.py +++ b/computer-use/py/portal_remote_desktop.py @@ -2,6 +2,8 @@ """RemoteDesktop consent broker for the local EIS input worker.""" import json import sys +import os +import subprocess try: import gi 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'] request('SelectDevices', '(oa{sv})', (session, {'types': GLib.Variant('u', 3), 'persist_mode': GLib.Variant('u', 2)})) 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) except Exception as exc: print(json.dumps({'type': 'error', 'reason': str(exc)}), flush=True) @@ -34,5 +39,9 @@ for line in sys.stdin: action = json.loads(line) if action.get('type') == 'close': break + if 'injector' in globals() and injector.stdin: + injector.stdin.write(json.dumps(action) + '\n'); injector.stdin.flush() except Exception: continue +if 'injector' in globals(): + injector.terminate() diff --git a/daemon/index.js b/daemon/index.js index 4fbf593..a753aef 100644 --- a/daemon/index.js +++ b/daemon/index.js @@ -83,5 +83,5 @@ if (import.meta.url === `file://${process.argv[1]}`) { console.error(`jarvisd: D-Bus unavailable: ${error.message}`); }); 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'); } diff --git a/docs/cu-acceptance.md b/docs/cu-acceptance.md index b021a17..f047f91 100644 --- a/docs/cu-acceptance.md +++ b/docs/cu-acceptance.md @@ -2,9 +2,13 @@ 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. -Phase 6 is observe-only: the explicit -computer-use grant is required, screenshots stay in `/tmp/jarvis-cu`, and -actuation remains a Phase 7 concern. +The explicit computer-use grant is required, screenshots stay in +`/tmp/jarvis-cu`, and actuation is enabled only after the local EIS injector +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. 2. Type a sentence into Text Editor and save it.