Run daemon on packaged Bare runtime
Rolling release / release (push) Canceled after 14m9s
CI / verify (push) Canceled after 14m18s

This commit is contained in:
2026-09-11 15:52:53 -04:00
parent 562f1a6316
commit a3314db1e9
30 changed files with 2953 additions and 65 deletions
+9 -5
View File
@@ -30,7 +30,7 @@ JARVIS-QVAC has one cognitive loop and one QVAC authority.
~~~mermaid ~~~mermaid
flowchart LR flowchart LR
U[User] --> G[GNOME Shell / ARC] U[User] --> G[GNOME Shell / ARC]
G <--> D[jarvisd / Node 22] G <--> D[jarvisd / packaged Bare]
D --> H[agent-harness] D --> H[agent-harness]
D --> M[Single QVAC master] D --> M[Single QVAC master]
D --> V[Voice + PipeWire] D --> V[Voice + PipeWire]
@@ -62,7 +62,7 @@ desktop permission.
Full runtime support requires: Full runtime support requires:
- Ubuntu GNOME 24.04 or newer, GNOME Shell 46+, and a logged-in user session. - Ubuntu GNOME 24.04 or newer, GNOME Shell 46+, and a logged-in user session.
- Node.js 22.17 or newer. - Bare 1.32.0 or newer, packaged with the application bundle.
- PipeWire and WirePlumber. - PipeWire and WirePlumber.
- xdg-desktop-portal with the GNOME backend. - xdg-desktop-portal with the GNOME backend.
- AT-SPI2 and, for primary Wayland actuation, libei/libeis plus a local EIS - AT-SPI2 and, for primary Wayland actuation, libei/libeis plus a local EIS
@@ -95,9 +95,11 @@ bash ~/.local/share/jarvis-qvac/packaging/first-run.sh
gnome-extensions enable jarvis@qvac.local gnome-extensions enable jarvis@qvac.local
~~~ ~~~
The installer requires Node.js 22.17+, npm, curl, and tar. For a mirror or a The rolling installer first downloads a self-contained architecture bundle
specific Gitea ref, set `JARVIS_SERVER`, `JARVIS_REPO`, or `JARVIS_REF` before with the Bare ELF runtime and all application dependencies. It therefore needs
the command. The downloaded ref must contain the repository packaging files. only curl and tar at runtime. A source fallback needs Node.js/npm when no
published bundle exists for the requested ref. Set `JARVIS_SERVER`,
`JARVIS_REPO`, or `JARVIS_BUNDLE_URL` for a mirror or a specific bundle.
## Install from a checkout ## Install from a checkout
@@ -142,6 +144,7 @@ under the user's cache directory, and user data paths described in
~~~bash ~~~bash
npm test # Node tests, including the vendored harness test npm test # Node tests, including the vendored harness test
npm run bare:smoke # Bare runtime and builtin mapping smoke test
npm run gpu-doctor # QVAC GPU, VRAM, and profile diagnostics npm run gpu-doctor # QVAC GPU, VRAM, and profile diagnostics
npm run cu-doctor # Wayland/X11, portals, AT-SPI, and libei npm run cu-doctor # Wayland/X11, portals, AT-SPI, and libei
npm run voice-doctor # PipeWire, wake bridge, and playback diagnostics npm run voice-doctor # PipeWire, wake bridge, and playback diagnostics
@@ -204,6 +207,7 @@ Artifacts in dist are:
- jarvis-qvac_<version>_<arch>.deb - jarvis-qvac_<version>_<arch>.deb
- jarvis-qvac-extension.zip - jarvis-qvac-extension.zip
- jarvis-qvac-bare-linux-<arch>.tar.gz (self-contained runtime bundle)
- SHA256SUMS - SHA256SUMS
Gitea Actions workflows live under .gitea/workflows. CI runs tests, Python Gitea Actions workflows live under .gitea/workflows. CI runs tests, Python
+9 -3
View File
@@ -1,9 +1,15 @@
import { access } from 'node:fs/promises'; import { access } from 'node:fs/promises';
import { constants } from 'node:fs'; import { constants } from 'node:fs';
import { execFile } from 'node:child_process'; import { spawn } from 'node:child_process';
import { promisify } from 'node:util';
const run = promisify(execFile); const run = (file, args) => new Promise((resolve, reject) => {
const child = spawn(file, args, { stdio: ['ignore', 'pipe', 'pipe'] });
let stdout = ''; let stderr = '';
child.stdout?.on('data', (chunk) => { stdout += chunk; });
child.stderr?.on('data', (chunk) => { stderr += chunk; });
child.once('error', reject);
child.once('close', (code) => code === 0 ? resolve({ stdout, stderr }) : reject(new Error(stderr || `${file} exited ${code}`)));
});
const checks = [ const checks = [
['session', false, async () => process.env.XDG_SESSION_TYPE || 'unknown'], ['session', false, async () => process.env.XDG_SESSION_TYPE || 'unknown'],
['portal', false, async () => { await access('/usr/share/dbus-1/services/org.freedesktop.portal.Desktop.service', constants.F_OK); return 'installed'; }], ['portal', false, async () => { await access('/usr/share/dbus-1/services/org.freedesktop.portal.Desktop.service', constants.F_OK); return 'installed'; }],
+467 -1
View File
@@ -2,5 +2,471 @@
"name": "@jarvis-qvac/computer-use", "name": "@jarvis-qvac/computer-use",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "session.js" "main": "session.js",
"imports": {
"assert": {
"bare": "bare-assert",
"default": "assert"
},
"node:assert": {
"bare": "bare-assert",
"default": "assert"
},
"assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"node:assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"node:async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"node:buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"node:child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"node:cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"console": {
"bare": "bare-console",
"default": "console"
},
"node:console": {
"bare": "bare-console",
"default": "console"
},
"constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"node:constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"node:crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"node:dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"node:diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"dns": {
"bare": "bare-dns",
"default": "dns"
},
"node:dns": {
"bare": "bare-dns",
"default": "dns"
},
"dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"node:dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"node:domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"events": {
"bare": "bare-events",
"default": "events"
},
"node:events": {
"bare": "bare-events",
"default": "events"
},
"fs": {
"bare": "bare-fs",
"default": "fs"
},
"node:fs": {
"bare": "bare-fs",
"default": "fs"
},
"fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"node:fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"http": {
"bare": "bare-http1",
"default": "http"
},
"node:http": {
"bare": "bare-http1",
"default": "http"
},
"http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"node:http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"https": {
"bare": "bare-https",
"default": "https"
},
"node:https": {
"bare": "bare-https",
"default": "https"
},
"inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"node:inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"node:inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"module": {
"bare": "bare-module",
"default": "module"
},
"node:module": {
"bare": "bare-module",
"default": "module"
},
"net": {
"bare": "bare-net",
"default": "net"
},
"node:net": {
"bare": "bare-net",
"default": "net"
},
"os": {
"bare": "bare-os",
"default": "os"
},
"node:os": {
"bare": "bare-os",
"default": "os"
},
"path": {
"bare": "bare-path",
"default": "path"
},
"node:path": {
"bare": "bare-path",
"default": "path"
},
"path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"node:path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"node:path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"node:perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"process": {
"bare": "bare-process",
"default": "process"
},
"node:process": {
"bare": "bare-process",
"default": "process"
},
"punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"node:punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"node:querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"readline": {
"bare": "bare-readline",
"default": "readline"
},
"node:readline": {
"bare": "bare-readline",
"default": "readline"
},
"readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"node:readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"repl": {
"bare": "bare-repl",
"default": "repl"
},
"node:repl": {
"bare": "bare-repl",
"default": "repl"
},
"sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"node:sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"node:sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"stream": {
"bare": "bare-stream",
"default": "stream"
},
"node:stream": {
"bare": "bare-stream",
"default": "stream"
},
"stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"node:stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"node:stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"node:stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"node:string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"node:sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"node:test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"node:test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"timers": {
"bare": "bare-timers",
"default": "timers"
},
"node:timers": {
"bare": "bare-timers",
"default": "timers"
},
"timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"node:timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"tls": {
"bare": "bare-tls",
"default": "tls"
},
"node:tls": {
"bare": "bare-tls",
"default": "tls"
},
"trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"node:trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"tty": {
"bare": "bare-tty",
"default": "tty"
},
"node:tty": {
"bare": "bare-tty",
"default": "tty"
},
"url": {
"bare": "bare-url",
"default": "url"
},
"node:url": {
"bare": "bare-url",
"default": "url"
},
"util": {
"bare": "bare-utils",
"default": "util"
},
"node:util": {
"bare": "bare-utils",
"default": "util"
},
"util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"node:util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"v8": {
"bare": "bare-v8",
"default": "v8"
},
"node:v8": {
"bare": "bare-v8",
"default": "v8"
},
"vm": {
"bare": "bare-vm",
"default": "vm"
},
"node:vm": {
"bare": "bare-vm",
"default": "vm"
},
"wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"node:wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"node:worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"zlib": {
"bare": "bare-zlib",
"default": "zlib"
},
"node:zlib": {
"bare": "bare-zlib",
"default": "zlib"
}
}
} }
+7
View File
@@ -0,0 +1,7 @@
// Bare entrypoint. Keep compatibility globals in this process, then load the
// daemon only after the mapping has been installed. This keeps Node out of the
// installed runtime while allowing the copied CommonJS harness to keep its
// upstream package shape.
await import('bare-node-runtime/global');
const { startDaemon } = await import('./index.js');
await startDaemon();
+5 -1
View File
@@ -3,7 +3,11 @@ const OBJECT = '/io/qvac/Jarvis';
const BUS_NAME = 'io.qvac.Jarvis'; const BUS_NAME = 'io.qvac.Jarvis';
export async function serveOnSessionBus(daemon) { export async function serveOnSessionBus(daemon) {
const dbus = await import('dbus-next'); // dbus-next is CommonJS. Load it through Bare's Node compatibility map so
// its builtin imports use bare-* implementations where supported.
const { createRequire } = await import('node:module');
const require = createRequire(import.meta.url);
const dbus = require('dbus-next', { with: { imports: 'bare-node-runtime/imports' } });
const { Interface } = dbus.interface; const { Interface } = dbus.interface;
class Session extends Interface { class Session extends Interface {
constructor() { super(IFACE); } constructor() { super(IFACE); }
+2 -1
View File
@@ -75,7 +75,7 @@ export class JarvisDaemon extends EventEmitter {
async close() { clearInterval(this._idleTimer); clearInterval(this._telemetryTimer); this.computerRevoke(); this.recovery.save({ state: 'ARMED', mode: this.mode }); await this.voiceLoop?.stop?.(); await this.harness.close(); } async close() { clearInterval(this._idleTimer); clearInterval(this._telemetryTimer); this.computerRevoke(); this.recovery.save({ state: 'ARMED', mode: this.mode }); await this.voiceLoop?.stop?.(); await this.harness.close(); }
} }
if (import.meta.url === `file://${process.argv[1]}`) { export async function startDaemon() {
const daemon = new JarvisDaemon(); const daemon = new JarvisDaemon();
daemon.startVoice().catch((error) => console.error(`jarvisd: voice unavailable: ${error.message}`)); daemon.startVoice().catch((error) => console.error(`jarvisd: voice unavailable: ${error.message}`));
import('./dbus-service.js').then(({ serveOnSessionBus }) => serveOnSessionBus(daemon)).catch((error) => { import('./dbus-service.js').then(({ serveOnSessionBus }) => serveOnSessionBus(daemon)).catch((error) => {
@@ -84,4 +84,5 @@ if (import.meta.url === `file://${process.argv[1]}`) {
}); });
process.on('SIGINT', () => daemon.close().finally(() => process.exit(0))); process.on('SIGINT', () => daemon.close().finally(() => process.exit(0)));
console.log('jarvisd ready; QVAC inference remains GPU-gated'); console.log('jarvisd ready; QVAC inference remains GPU-gated');
return daemon;
} }
+467 -1
View File
@@ -2,5 +2,471 @@
"name": "@jarvis-qvac/daemon", "name": "@jarvis-qvac/daemon",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "index.js" "main": "index.js",
"imports": {
"assert": {
"bare": "bare-assert",
"default": "assert"
},
"node:assert": {
"bare": "bare-assert",
"default": "assert"
},
"assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"node:assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"node:async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"node:buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"node:child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"node:cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"console": {
"bare": "bare-console",
"default": "console"
},
"node:console": {
"bare": "bare-console",
"default": "console"
},
"constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"node:constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"node:crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"node:dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"node:diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"dns": {
"bare": "bare-dns",
"default": "dns"
},
"node:dns": {
"bare": "bare-dns",
"default": "dns"
},
"dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"node:dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"node:domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"events": {
"bare": "bare-events",
"default": "events"
},
"node:events": {
"bare": "bare-events",
"default": "events"
},
"fs": {
"bare": "bare-fs",
"default": "fs"
},
"node:fs": {
"bare": "bare-fs",
"default": "fs"
},
"fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"node:fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"http": {
"bare": "bare-http1",
"default": "http"
},
"node:http": {
"bare": "bare-http1",
"default": "http"
},
"http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"node:http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"https": {
"bare": "bare-https",
"default": "https"
},
"node:https": {
"bare": "bare-https",
"default": "https"
},
"inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"node:inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"node:inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"module": {
"bare": "bare-module",
"default": "module"
},
"node:module": {
"bare": "bare-module",
"default": "module"
},
"net": {
"bare": "bare-net",
"default": "net"
},
"node:net": {
"bare": "bare-net",
"default": "net"
},
"os": {
"bare": "bare-os",
"default": "os"
},
"node:os": {
"bare": "bare-os",
"default": "os"
},
"path": {
"bare": "bare-path",
"default": "path"
},
"node:path": {
"bare": "bare-path",
"default": "path"
},
"path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"node:path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"node:path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"node:perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"process": {
"bare": "bare-process",
"default": "process"
},
"node:process": {
"bare": "bare-process",
"default": "process"
},
"punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"node:punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"node:querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"readline": {
"bare": "bare-readline",
"default": "readline"
},
"node:readline": {
"bare": "bare-readline",
"default": "readline"
},
"readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"node:readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"repl": {
"bare": "bare-repl",
"default": "repl"
},
"node:repl": {
"bare": "bare-repl",
"default": "repl"
},
"sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"node:sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"node:sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"stream": {
"bare": "bare-stream",
"default": "stream"
},
"node:stream": {
"bare": "bare-stream",
"default": "stream"
},
"stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"node:stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"node:stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"node:stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"node:string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"node:sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"node:test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"node:test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"timers": {
"bare": "bare-timers",
"default": "timers"
},
"node:timers": {
"bare": "bare-timers",
"default": "timers"
},
"timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"node:timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"tls": {
"bare": "bare-tls",
"default": "tls"
},
"node:tls": {
"bare": "bare-tls",
"default": "tls"
},
"trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"node:trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"tty": {
"bare": "bare-tty",
"default": "tty"
},
"node:tty": {
"bare": "bare-tty",
"default": "tty"
},
"url": {
"bare": "bare-url",
"default": "url"
},
"node:url": {
"bare": "bare-url",
"default": "url"
},
"util": {
"bare": "bare-utils",
"default": "util"
},
"node:util": {
"bare": "bare-utils",
"default": "util"
},
"util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"node:util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"v8": {
"bare": "bare-v8",
"default": "v8"
},
"node:v8": {
"bare": "bare-v8",
"default": "v8"
},
"vm": {
"bare": "bare-vm",
"default": "vm"
},
"node:vm": {
"bare": "bare-vm",
"default": "vm"
},
"wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"node:wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"node:worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"zlib": {
"bare": "bare-zlib",
"default": "zlib"
},
"node:zlib": {
"bare": "bare-zlib",
"default": "zlib"
}
}
} }
+5 -2
View File
@@ -3,9 +3,12 @@ import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
const harnessPath = process.env.JARVIS_HARNESS_PATH || path.resolve(new URL('../vendor/agent-harness', import.meta.url).pathname); const harnessPath = process.env.JARVIS_HARNESS_PATH || path.resolve(new URL('../vendor/agent-harness', import.meta.url).pathname);
// Bare's module loader accepts the maintained Holepunch compatibility map. The
// second argument is essential for the copied CommonJS harness: it maps its
// Node builtin requests to bare-* modules without creating a second runtime.
const require = createRequire(import.meta.url); const require = createRequire(import.meta.url);
process.env.QVAC_CONFIG_PATH ||= path.resolve(new URL('../qvac.config.json', import.meta.url).pathname); process.env.QVAC_CONFIG_PATH ||= path.resolve(new URL('../qvac.config.json', import.meta.url).pathname);
const Agent = require(path.join(harnessPath, 'index.js')); const Agent = require(path.join(harnessPath, 'index.js'), { with: { imports: 'bare-node-runtime/imports' } });
let loadPromise = null; let loadPromise = null;
let ownerCount = 0; let ownerCount = 0;
@@ -33,7 +36,7 @@ export function sdkPackagePath() {
} }
export function assertSdkVersion() { export function assertSdkVersion() {
const sdkPackage = require(sdkPackagePath()); const sdkPackage = require(sdkPackagePath(), { with: { imports: 'bare-node-runtime/imports' } });
if (!/^0\.19\./.test(sdkPackage.version)) { if (!/^0\.19\./.test(sdkPackage.version)) {
throw new Error(`Jarvis requires vendored @qvac/sdk in the 0.19.x series; found ${sdkPackage.version}`); throw new Error(`Jarvis requires vendored @qvac/sdk in the 0.19.x series; found ${sdkPackage.version}`);
} }
+3
View File
@@ -0,0 +1,3 @@
await import('bare-node-runtime/global');
const { qvacStatus } = await import('./qvac-master.js');
console.log(JSON.stringify(qvacStatus(), null, 2));
+10 -4
View File
@@ -1,13 +1,19 @@
import { spawnSync } from 'node:child_process'; import { access } from 'node:fs/promises';
const commandAvailable = (command) => spawnSync('which', [command], { stdio: 'ignore' }).status === 0; const commandAvailable = async (command) => {
for (const dir of ['/usr/bin', '/usr/local/bin', '/bin']) {
try { await access(`${dir}/${command}`); return true; } catch {}
}
return false;
};
const pipewire = await commandAvailable('pw-cat');
const report = { const report = {
pipewireCapture: commandAvailable('pw-cat'), pipewireCapture: pipewire,
wakeEngine: Boolean(process.env.JARVIS_WAKE_COMMAND), wakeEngine: Boolean(process.env.JARVIS_WAKE_COMMAND),
wakeCommand: process.env.JARVIS_WAKE_COMMAND || null, wakeCommand: process.env.JARVIS_WAKE_COMMAND || null,
sampleRate: 16000, sampleRate: 16000,
channels: 1, channels: 1,
ttsPlayback: commandAvailable('pw-cat'), ttsPlayback: pipewire,
gpuRequired: true, gpuRequired: true,
}; };
console.log(JSON.stringify(report, null, 2)); console.log(JSON.stringify(report, null, 2));
+2 -1
View File
@@ -12,6 +12,7 @@ This directory is the maintained technical reference for the repository.
| Understand the voice loop | [Voice pipeline](voice-pipeline.md) | | Understand the voice loop | [Voice pipeline](voice-pipeline.md) |
| Build desktop control | [Computer use](computer-use.md) | | Build desktop control | [Computer use](computer-use.md) |
| Integrate QVAC | [QVAC runtime](qvac-runtime.md) | | Integrate QVAC | [QVAC runtime](qvac-runtime.md) |
| Run the packaged runtime | [Bare runtime](bare-runtime.md) |
| Understand the agent | [Harness integration](harness-integration.md) | | Understand the agent | [Harness integration](harness-integration.md) |
| Use the D-Bus API | [API reference](api.md) | | Use the D-Bus API | [API reference](api.md) |
| Build and release with Gitea | [CI and releases](ci-gitea.md) | | Build and release with Gitea | [CI and releases](ci-gitea.md) |
@@ -51,6 +52,6 @@ must be verified on the target GNOME session.
- Commands are run from the repository root unless stated otherwise. - Commands are run from the repository root unless stated otherwise.
- Paths beginning with `~` are user-scoped paths. - Paths beginning with `~` are user-scoped paths.
- `jarvisd` means the user service and its Node process. - `jarvisd` means the user service and its packaged Bare process.
- “Master” means the singleton in `daemon/qvac-master.js`. - “Master” means the singleton in `daemon/qvac-master.js`.
- Mermaid diagrams use Gitea-compatible fenced Markdown. - Mermaid diagrams use Gitea-compatible fenced Markdown.
+51
View File
@@ -0,0 +1,51 @@
# Bare runtime
The installed JARVIS daemon runs on the packaged Bare ELF runtime. Node.js is
used in CI for npm dependency resolution and the portable test suite; it is not
required on an end users machine.
```mermaid
flowchart LR
Install[web installer] --> Bundle[rolling Bare bundle]
Bundle --> ELF[bare-runtime ELF]
ELF --> Entry[daemon/bare-entry.js]
Entry --> Compat[bare-node-runtime map]
Compat --> Harness[copied agent harness]
Entry --> QVAC[@qvac/inference in process]
QVAC --> GPU[QVAC GPU backend]
```
Bare has no Node standard library. JARVIS carries the official
`bare-node-runtime` conditional map at the root, daemon, computer-use, and
copied harness package boundaries. Portable source imports such as
`node:fs`, `node:path`, and `node:events` resolve to `bare-fs`, `bare-path`,
and `bare-events`. Process execution resolves to `bare-subprocess`. New direct
runtime code should prefer `bare-*` names when it has no Node test counterpart.
The QVAC boundary has one deliberate runtime switch. Node uses the existing
`@qvac/sdk` surface. Bare uses `@qvac/inference` in process and registers the
LLM plugin once inside the copied harness engine. The daemon remains the single
QVAC owner: no skill, job, or extension creates another inference runtime.
`packaging/prepare-bare-deps.py` applies the same official map to CommonJS
dependencies at bundle-build time. Bare resolves imports at each package
boundary, and some third party CommonJS packages do not declare their own map.
The preparation changes only the release copy under `node_modules`.
Build and verify the bundle with:
```bash
npm ci
npm run bare:smoke
npm run package:bare
```
The installer executes `node_modules/bare-runtime-linux-*/bin/bare` directly.
The `node_modules/.bin/bare` convenience script is a Node launcher and is not
used by the service. The generated systemd unit therefore has no Node
executable in its `ExecStart` line.
GPU policy remains strict. The Bare QVAC engine must report a visible GPU and
the master load path passes `device: "gpu"`, full GPU layer offload, and GPU
multimodal projection settings. A missing or unusable GPU stops inference and
is reported by `gpu-doctor`; it never silently falls back to CPU.
+9 -8
View File
@@ -2,9 +2,10 @@
## Prerequisites ## Prerequisites
Ubuntu GNOME 24.04 or newer, Node.js 22.17+, PipeWire/WirePlumber, GNOME Ubuntu GNOME 24.04 or newer, the packaged Bare runtime, PipeWire/WirePlumber,
desktop portals, GTK4/libadwaita, AT-SPI2, and a QVAC-visible GPU are required GNOME desktop portals, GTK4/libadwaita, AT-SPI2, and a QVAC-visible GPU are
for the full runtime. See [hardware compatibility](hardware-compatibility.md). required for the full runtime. Node.js is a build and test dependency only.
See [hardware compatibility](hardware-compatibility.md).
## Web installation ## Web installation
@@ -14,10 +15,10 @@ For the current Gitea rolling build:
curl -fsSL https://git.ssh.surf/snxraven/gnome-jarvis/raw/branch/main/packaging/web-installer.sh | bash -s -- --enable curl -fsSL https://git.ssh.surf/snxraven/gnome-jarvis/raw/branch/main/packaging/web-installer.sh | bash -s -- --enable
~~~ ~~~
The installer downloads the source archive at the `rolling` ref and delegates The installer downloads the self-contained Bare bundle from the `rolling`
to the repository installer. Omit `--enable` to copy files without starting release and delegates to the repository installer. Omit `--enable` to copy
the service. Pin a reviewed ref or use a mirror with `JARVIS_REF`, files without starting the service. Use `JARVIS_SERVER`, `JARVIS_REPO`, and
`JARVIS_SERVER`, and `JARVIS_REPO`. `JARVIS_BUNDLE_URL` for a mirror.
## Development start ## Development start
@@ -27,7 +28,7 @@ npm test
npm run gpu-doctor npm run gpu-doctor
npm run cu-doctor npm run cu-doctor
npm run voice-doctor npm run voice-doctor
node daemon/index.js bare daemon/bare-entry.js
``` ```
Use `npm run qvac:serve:diagnostic` only when a separate local client needs the Use `npm run qvac:serve:diagnostic` only when a separate local client needs the
+335 -3
View File
@@ -10,15 +10,18 @@
"workspaces": [ "workspaces": [
"daemon", "daemon",
"computer-use", "computer-use",
"apps/control-center" "apps/control-center",
"vendor/agent-harness"
], ],
"dependencies": { "dependencies": {
"@qvac/cli": "0.13.0", "@qvac/cli": "0.13.0",
"@qvac/sdk": "0.19.1", "@qvac/sdk": "0.19.1",
"bare-node-runtime": "1.5.0",
"bare-runtime": "1.32.0",
"dbus-next": "^0.10.2" "dbus-next": "^0.10.2"
}, },
"engines": { "engines": {
"node": ">=22.17.0" "bare": ">=1.30.3"
} }
}, },
"apps/control-center": { "apps/control-center": {
@@ -1741,6 +1744,10 @@
"xache": "^1.2.1" "xache": "^1.2.1"
} }
}, },
"node_modules/agent-harness": {
"resolved": "vendor/agent-harness",
"link": true
},
"node_modules/ajv": { "node_modules/ajv": {
"version": "8.20.0", "version": "8.20.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
@@ -1980,6 +1987,23 @@
"bare-inspect": "^3.1.2" "bare-inspect": "^3.1.2"
} }
}, },
"node_modules/bare-async-hooks": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/bare-async-hooks/-/bare-async-hooks-0.0.0.tgz",
"integrity": "sha512-xNfGwUobaomCGMGAqohAekS3uMCj+4tvI4AoOaJnO7NfpN+dvFdkC5xkeQtmZzs2vxf2TR5J6i5FDd1ImCZERw==",
"license": "Apache-2.0"
},
"node_modules/bare-broadcast-channel": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/bare-broadcast-channel/-/bare-broadcast-channel-0.2.0.tgz",
"integrity": "sha512-MuAwdKWr4cSjNwqvbE3tA9Wn6w69q6iXYnP2Wb0nlDa6sKNSMSfY7LXkV4FzWlq9JFP9d0HkCAKPboTLKnUfWQ==",
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.0.0",
"bare-stream": "^2.7.0",
"bare-structured-clone": "^1.4.0"
}
},
"node_modules/bare-buffer": { "node_modules/bare-buffer": {
"version": "3.7.1", "version": "3.7.1",
"resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.7.1.tgz", "resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.7.1.tgz",
@@ -2020,6 +2044,33 @@
"bare-bundle": "*" "bare-bundle": "*"
} }
}, },
"node_modules/bare-channel": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/bare-channel/-/bare-channel-5.2.4.tgz",
"integrity": "sha512-enkaOtvXUiZsLBSbataxV/QBjehCOK+SUTd2JQWUYW2iIOufpPu9jyZ9bqJqkEquktrK/rpEMVEmKsPzoci/sA==",
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.0.0",
"bare-stream": "^2.7.0",
"bare-structured-clone": "^1.4.0"
},
"engines": {
"bare": ">=1.7.0"
}
},
"node_modules/bare-console": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/bare-console/-/bare-console-6.2.0.tgz",
"integrity": "sha512-qQ+Vasa3NwNdVDcUWKIIEG5p7MKO7uABcV/xBR9MDwQg3QklC5ayemaHzBa/ER4h6TKN2PRQN5IppNwUAMtb8Q==",
"license": "Apache-2.0",
"dependencies": {
"bare-format": "^1.0.2",
"bare-hrtime": "^2.0.0",
"bare-logger": "^2.0.0",
"bare-system-logger": "^1.0.2",
"bare-type": "^1.1.0"
}
},
"node_modules/bare-cov": { "node_modules/bare-cov": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.2.tgz", "resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.2.tgz",
@@ -2072,6 +2123,37 @@
"bare-os": "^3.0.1" "bare-os": "^3.0.1"
} }
}, },
"node_modules/bare-dgram": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bare-dgram/-/bare-dgram-1.1.1.tgz",
"integrity": "sha512-fqL5xD7k6iGL4SdmkW9LXCoMEbrk1Fwg6ZLN0vEG1XaFtTFUmgXxAfbZ6kL+385TZ+nRfLz32xeBZV9gs6lmsw==",
"license": "Apache-2.0",
"dependencies": {
"bare-dns": "^2.0.4",
"bare-events": "^2.5.4"
},
"engines": {
"bare": ">=1.16.0"
},
"peerDependencies": {
"bare-buffer": "*",
"bare-pipe": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
},
"bare-pipe": {
"optional": true
}
}
},
"node_modules/bare-diagnostics-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bare-diagnostics-channel/-/bare-diagnostics-channel-1.1.0.tgz",
"integrity": "sha512-Reu+EQo+eLpB+a5p8UykFEdXndFaRaSgKV38uAMh/qhE2eTeJcdwAwo74hKYyeN8GD3DIFqC9ZlM4bnDc03CIg==",
"license": "Apache-2.0"
},
"node_modules/bare-dns": { "node_modules/bare-dns": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.2.0.tgz", "resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.2.0.tgz",
@@ -2297,6 +2379,15 @@
} }
} }
}, },
"node_modules/bare-logger": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/bare-logger/-/bare-logger-2.0.4.tgz",
"integrity": "sha512-HZB3jmnu0C/hcN4HPtBLe7MA6TuwWHzjn4xalExMLlt20URKNKvRCNEMRsWrcFuBKx3wfC6oWySmGpqpaFcjRg==",
"license": "Apache-2.0",
"dependencies": {
"bare-format": "^1.0.0"
}
},
"node_modules/bare-mime": { "node_modules/bare-mime": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/bare-mime/-/bare-mime-1.0.0.tgz", "resolved": "https://registry.npmjs.org/bare-mime/-/bare-mime-1.0.0.tgz",
@@ -2398,6 +2489,79 @@
"bare-tcp": "^2.0.0" "bare-tcp": "^2.0.0"
} }
}, },
"node_modules/bare-node-runtime": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bare-node-runtime/-/bare-node-runtime-1.5.0.tgz",
"integrity": "sha512-eMRq9WDYd+E0IZ8EG/8iCozZJl511z6vp7kxZyxjDw77ggOZ7bThFpJ72Kztjs8sh0hoe+xhFyZmoqAdVE/Ziw==",
"license": "Apache-2.0",
"dependencies": {
"bare-abort-controller": "^1.0.0",
"bare-assert": "^1.1.0",
"bare-async-hooks": "^0.0.0",
"bare-buffer": "^3.3.1",
"bare-console": "^6.0.1",
"bare-crypto": "^1.11.2",
"bare-dgram": "^1.0.1",
"bare-diagnostics-channel": "^1.1.0",
"bare-dns": "^2.1.4",
"bare-events": "^2.7.0",
"bare-fetch": "^3.0.0",
"bare-fs": "^4.2.3",
"bare-http1": "^4.0.4",
"bare-https": "^3.0.0",
"bare-inspector": "^6.0.1",
"bare-module": "^6.1.2",
"bare-net": "^2.0.2",
"bare-os": "^3.6.2",
"bare-path": "^3.0.0",
"bare-performance": "^2.0.0",
"bare-process": "^4.2.1",
"bare-punycode": "^0.0.0",
"bare-querystring": "^1.0.0",
"bare-readline": "^1.1.0",
"bare-repl": "^6.0.1",
"bare-sqlite": "^0.1.4",
"bare-stream": "^2.7.0",
"bare-string-decoder": "^1.0.0",
"bare-subprocess": "^6.0.0",
"bare-timers": "^3.0.3",
"bare-tls": "^3.0.0",
"bare-tty": "^5.0.3",
"bare-url": "^2.2.2",
"bare-utils": "^1.5.1",
"bare-v8": "^1.0.1",
"bare-vm": "^1.0.0",
"bare-worker": "^4.0.0",
"bare-ws": "^3.0.0",
"bare-zlib": "^1.3.1"
}
},
"node_modules/bare-node-runtime/node_modules/bare-subprocess": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-6.1.0.tgz",
"integrity": "sha512-8L6KtbmreDy4Fc1BdDqaDo9fg0nbedUmTSFQxYPV0uHIM2BBAX8+E0LyMDKgkk0I+mlKto80WYzOnIhT8VDdOg==",
"license": "Apache-2.0",
"dependencies": {
"bare-env": "^3.0.0",
"bare-events": "^2.5.4",
"bare-os": "^3.0.1",
"bare-pipe": "^4.2.0",
"bare-structured-clone": "^1.5.2",
"bare-tcp": "^2.4.1",
"bare-url": "^2.2.2"
},
"engines": {
"bare": ">=1.7.0"
},
"peerDependencies": {
"bare-buffer": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
}
}
},
"node_modules/bare-os": { "node_modules/bare-os": {
"version": "3.9.3", "version": "3.9.3",
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz",
@@ -2510,6 +2674,55 @@
"bare": ">=1.7.0" "bare": ">=1.7.0"
} }
}, },
"node_modules/bare-punycode": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/bare-punycode/-/bare-punycode-0.0.0.tgz",
"integrity": "sha512-PC2Y6mGLytZPJCB9M7CvO5Zb6uWYVUZ+5t3L6vePFuFM6tdC6SsQ+sIsuf0Sa6LHBoWURX7I9yMMbPXMv7TIdQ==",
"license": "Apache-2.0",
"dependencies": {
"punycode": "^2.3.1"
}
},
"node_modules/bare-querystring": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bare-querystring/-/bare-querystring-1.1.0.tgz",
"integrity": "sha512-pUtEM6JrX53MbEJFwO92F0Ch7BwZ67KD7LyglcB8/tvkkVdwTgN1f7oIklRe+NTT/WCYZgwjDFYS9efBxDSq8g==",
"license": "Apache-2.0"
},
"node_modules/bare-readline": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/bare-readline/-/bare-readline-1.3.1.tgz",
"integrity": "sha512-QtSU4ZfgQcDI6AQssjDFqTiRe4rCiciMn+Yqx6siMJZBIftAIFrNSOK0sa5SBrmNv/a7CD9Dm0onUDCRyn5Fdg==",
"license": "Apache-2.0",
"dependencies": {
"bare-ansi-escapes": "^2.0.0",
"bare-stream": "^2.0.0"
}
},
"node_modules/bare-realm": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bare-realm/-/bare-realm-2.0.1.tgz",
"integrity": "sha512-kQbYU6AAQu4XBTQesuz2+PpjBx7MJzf5Qw3nSLzQCzbVglx7Ml85MtWEjUe1AeslXqrd+nFPHMEbL55ouISscA==",
"license": "Apache-2.0",
"engines": {
"bare": ">=1.5.0"
}
},
"node_modules/bare-repl": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/bare-repl/-/bare-repl-6.1.1.tgz",
"integrity": "sha512-vV52s+zLcwf9WB6y09KwHrqHrCR0UUgcKz3NPhPAwmO62ctFYbBfjskBch92wWk7vRrF68dHJj3hmYNCe8d18g==",
"license": "Apache-2.0",
"dependencies": {
"bare-inspect": "^3.0.0",
"bare-module": "^6.4.0",
"bare-path": "^3.0.0",
"bare-pipe": "^4.0.0",
"bare-readline": "^1.0.0",
"bare-stream": "^2.0.0",
"bare-tty": "^5.0.0"
}
},
"node_modules/bare-rpc": { "node_modules/bare-rpc": {
"version": "1.3.8", "version": "1.3.8",
"resolved": "https://registry.npmjs.org/bare-rpc/-/bare-rpc-1.3.8.tgz", "resolved": "https://registry.npmjs.org/bare-rpc/-/bare-rpc-1.3.8.tgz",
@@ -2856,6 +3069,20 @@
"bare": ">=1.7.0" "bare": ">=1.7.0"
} }
}, },
"node_modules/bare-sqlite": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/bare-sqlite/-/bare-sqlite-0.1.4.tgz",
"integrity": "sha512-h2UdmQohSQG98lrMZ31PnhKIZRNT+1cDUZRzboHmsXKp+l4N4UBSJylMDEGL+D4fw6MJfOHWFIzUG20pITGy8Q==",
"license": "Apache-2.0",
"peerDependencies": {
"bare-buffer": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
}
}
},
"node_modules/bare-stdio": { "node_modules/bare-stdio": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/bare-stdio/-/bare-stdio-1.0.3.tgz", "resolved": "https://registry.npmjs.org/bare-stdio/-/bare-stdio-1.0.3.tgz",
@@ -2894,6 +3121,23 @@
} }
} }
}, },
"node_modules/bare-string-decoder": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/bare-string-decoder/-/bare-string-decoder-1.0.0.tgz",
"integrity": "sha512-FjFvfHo88U7borNQSj9ijP2JTb1asqY6K28OZrix4dF9iZf5D2wi1+99CgLlHT3HtYqdwxRhDAiKu8rVstt5rQ==",
"license": "Apache-2.0",
"dependencies": {
"text-decoder": "^1.2.3"
},
"peerDependencies": {
"bare-buffer": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
}
}
},
"node_modules/bare-structured-clone": { "node_modules/bare-structured-clone": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/bare-structured-clone/-/bare-structured-clone-1.6.0.tgz", "resolved": "https://registry.npmjs.org/bare-structured-clone/-/bare-structured-clone-1.6.0.tgz",
@@ -2943,6 +3187,15 @@
} }
} }
}, },
"node_modules/bare-system-logger": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bare-system-logger/-/bare-system-logger-1.0.5.tgz",
"integrity": "sha512-Xnjk5jFJWKrfVfHfusHwUpfiPmZqWUm9gaCUolTlN1pxxf7yDn7mhC+pr885j6VVSLzZwfZYi9nywVI+VakxVg==",
"license": "Apache-2.0",
"dependencies": {
"bare-logger": "^2.0.0"
}
},
"node_modules/bare-tcp": { "node_modules/bare-tcp": {
"version": "2.6.1", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.6.1.tgz", "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.6.1.tgz",
@@ -2965,6 +3218,43 @@
} }
} }
}, },
"node_modules/bare-thread": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/bare-thread/-/bare-thread-1.2.6.tgz",
"integrity": "sha512-191LkhyfdBufeXaVAWWeeJgc3UhG+9FpLGfJDBwHh9KC19dRyUeYOUzOBBDY6nl8xpm/cJyOBmsWiqo55crKxQ==",
"license": "Apache-2.0",
"dependencies": {
"bare-bundle": "^1.9.0",
"bare-module-resolve": "^1.11.2",
"bare-module-traverse": "^2.0.0",
"bare-url": "^2.4.2"
},
"peerDependencies": {
"bare-buffer": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
}
}
},
"node_modules/bare-timers": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/bare-timers/-/bare-timers-3.2.3.tgz",
"integrity": "sha512-PW36nOU4AKbQSrbWlrYhDJgsEWbZST0v8s8FvlgVySUby7CfXdUpXVCTFmgXcpZevQx7BCXqKM/A8NJDHPGkzQ==",
"license": "Apache-2.0",
"engines": {
"bare": ">=1.7.0"
},
"peerDependencies": {
"bare-abort-controller": "*"
},
"peerDependenciesMeta": {
"bare-abort-controller": {
"optional": true
}
}
},
"node_modules/bare-tls": { "node_modules/bare-tls": {
"version": "3.1.10", "version": "3.1.10",
"resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-3.1.10.tgz", "resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-3.1.10.tgz",
@@ -3053,6 +3343,12 @@
"bare-type": "^1.0.6" "bare-type": "^1.0.6"
} }
}, },
"node_modules/bare-v8": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bare-v8/-/bare-v8-1.0.1.tgz",
"integrity": "sha512-/cR5ZvFWQRdtTZ4tx0j7TKvTWce8UnnLqm88fwHtJmfM7HODIBVjQGDT7KkDLeD2d/eHP2pzB71Y8/QyiMMKrQ==",
"license": "Apache-2.0"
},
"node_modules/bare-v8-to-istanbul": { "node_modules/bare-v8-to-istanbul": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/bare-v8-to-istanbul/-/bare-v8-to-istanbul-1.0.4.tgz", "resolved": "https://registry.npmjs.org/bare-v8-to-istanbul/-/bare-v8-to-istanbul-1.0.4.tgz",
@@ -3070,6 +3366,29 @@
"which-runtime": "^1.4.0" "which-runtime": "^1.4.0"
} }
}, },
"node_modules/bare-vm": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bare-vm/-/bare-vm-1.0.1.tgz",
"integrity": "sha512-yLnbRvKt3AhRTmtfTIrYfdTHqGEfIJc+Fgb2DcHejE0HJ+p5adGxxPMvd3893Z7iXVYnalxukNARn4oJSZELHQ==",
"license": "Apache-2.0",
"dependencies": {
"bare-realm": "^2.0.0"
}
},
"node_modules/bare-worker": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/bare-worker/-/bare-worker-4.4.0.tgz",
"integrity": "sha512-zSc1biis9ks03nj/24M7tYS2V0CPhefizzRIxVYdglbbUAgA0zakwSgTKLJshZ6P+9NA55M/eG4k/rBALZVbxg==",
"license": "Apache-2.0",
"dependencies": {
"bare-broadcast-channel": "^0.2.0",
"bare-channel": "^5.1.5",
"bare-events": "^2.2.1",
"bare-module": "^6.4.0",
"bare-stream": "^2.13.3",
"bare-thread": "^1.2.2"
}
},
"node_modules/bare-ws": { "node_modules/bare-ws": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/bare-ws/-/bare-ws-3.1.0.tgz", "resolved": "https://registry.npmjs.org/bare-ws/-/bare-ws-3.1.0.tgz",
@@ -5232,7 +5551,6 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"license": "MIT", "license": "MIT",
"optional": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@@ -6383,6 +6701,20 @@
"funding": { "funding": {
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"
} }
},
"vendor/agent-harness": {
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@qvac/sdk": "0.19.1",
"hyperdispatch": "^1.6.0"
},
"bin": {
"agent-harness": "bin/cli.js"
},
"engines": {
"node": ">=20"
}
} }
} }
} }
+486 -9
View File
@@ -4,27 +4,504 @@
"private": true, "private": true,
"description": "Local-first GNOME voice assistant powered by QVAC and agent-harness.", "description": "Local-first GNOME voice assistant powered by QVAC and agent-harness.",
"type": "module", "type": "module",
"engines": { "node": ">=22.17.0" }, "engines": {
"workspaces": ["daemon", "computer-use", "apps/control-center"], "bare": ">=1.30.3"
},
"workspaces": [
"daemon",
"computer-use",
"apps/control-center",
"vendor/agent-harness"
],
"scripts": { "scripts": {
"start": "node daemon/index.js", "start": "bash packaging/bare-launch.sh daemon/bare-entry.js",
"test": "node --test", "test": "node --test",
"cu-doctor": "node computer-use/doctor.js", "cu-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js computer-use/doctor.js",
"voice-doctor": "node daemon/voice-doctor.js", "voice-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js daemon/voice-doctor.js",
"gpu-doctor": "node daemon/gpu-doctor.js", "gpu-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js daemon/gpu-doctor.js",
"qvac:doctor": "qvac doctor", "qvac:doctor": "qvac doctor",
"qvac:serve:diagnostic": "qvac serve --openai --host 127.0.0.1", "qvac:serve:diagnostic": "qvac serve --openai --host 127.0.0.1",
"qvac:status": "node -e \"import('./daemon/qvac-master.js').then(({qvacStatus})=>console.log(JSON.stringify(qvacStatus(), null, 2)))\"", "qvac:status": "bash packaging/bare-launch.sh daemon/status-entry.js",
"package:extension": "bash packaging/build-extension.sh", "package:extension": "bash packaging/build-extension.sh",
"package": "bash packaging/build-release.sh", "package": "bash packaging/build-release.sh",
"package:bare": "bash packaging/build-runtime-bundle.sh",
"package:test": "bash packaging/test-package.sh", "package:test": "bash packaging/test-package.sh",
"first-run": "bash packaging/first-run.sh", "first-run": "bash packaging/first-run.sh",
"install:user": "bash packaging/install.sh", "install:user": "bash packaging/install.sh",
"uninstall:user": "bash packaging/uninstall.sh" "uninstall:user": "bash packaging/uninstall.sh",
"bare:smoke": "bash packaging/bare-launch.sh packaging/bare-smoke.js"
}, },
"dependencies": { "dependencies": {
"@qvac/cli": "0.13.0", "@qvac/cli": "0.13.0",
"@qvac/sdk": "0.19.1", "@qvac/sdk": "0.19.1",
"dbus-next": "^0.10.2" "dbus-next": "^0.10.2",
"bare-node-runtime": "1.5.0",
"bare-runtime": "1.32.0"
},
"imports": {
"assert": {
"bare": "bare-assert",
"default": "assert"
},
"node:assert": {
"bare": "bare-assert",
"default": "assert"
},
"assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"node:assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"node:async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"node:buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"node:child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"node:cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"console": {
"bare": "bare-console",
"default": "console"
},
"node:console": {
"bare": "bare-console",
"default": "console"
},
"constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"node:constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"node:crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"node:dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"node:diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"dns": {
"bare": "bare-dns",
"default": "dns"
},
"node:dns": {
"bare": "bare-dns",
"default": "dns"
},
"dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"node:dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"node:domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"events": {
"bare": "bare-events",
"default": "events"
},
"node:events": {
"bare": "bare-events",
"default": "events"
},
"fs": {
"bare": "bare-fs",
"default": "fs"
},
"node:fs": {
"bare": "bare-fs",
"default": "fs"
},
"fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"node:fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"http": {
"bare": "bare-http1",
"default": "http"
},
"node:http": {
"bare": "bare-http1",
"default": "http"
},
"http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"node:http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"https": {
"bare": "bare-https",
"default": "https"
},
"node:https": {
"bare": "bare-https",
"default": "https"
},
"inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"node:inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"node:inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"module": {
"bare": "bare-module",
"default": "module"
},
"node:module": {
"bare": "bare-module",
"default": "module"
},
"net": {
"bare": "bare-net",
"default": "net"
},
"node:net": {
"bare": "bare-net",
"default": "net"
},
"os": {
"bare": "bare-os",
"default": "os"
},
"node:os": {
"bare": "bare-os",
"default": "os"
},
"path": {
"bare": "bare-path",
"default": "path"
},
"node:path": {
"bare": "bare-path",
"default": "path"
},
"path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"node:path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"node:path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"node:perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"process": {
"bare": "bare-process",
"default": "process"
},
"node:process": {
"bare": "bare-process",
"default": "process"
},
"punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"node:punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"node:querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"readline": {
"bare": "bare-readline",
"default": "readline"
},
"node:readline": {
"bare": "bare-readline",
"default": "readline"
},
"readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"node:readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"repl": {
"bare": "bare-repl",
"default": "repl"
},
"node:repl": {
"bare": "bare-repl",
"default": "repl"
},
"sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"node:sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"node:sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"stream": {
"bare": "bare-stream",
"default": "stream"
},
"node:stream": {
"bare": "bare-stream",
"default": "stream"
},
"stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"node:stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"node:stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"node:stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"node:string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"node:sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"node:test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"node:test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"timers": {
"bare": "bare-timers",
"default": "timers"
},
"node:timers": {
"bare": "bare-timers",
"default": "timers"
},
"timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"node:timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"tls": {
"bare": "bare-tls",
"default": "tls"
},
"node:tls": {
"bare": "bare-tls",
"default": "tls"
},
"trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"node:trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"tty": {
"bare": "bare-tty",
"default": "tty"
},
"node:tty": {
"bare": "bare-tty",
"default": "tty"
},
"url": {
"bare": "bare-url",
"default": "url"
},
"node:url": {
"bare": "bare-url",
"default": "url"
},
"util": {
"bare": "bare-utils",
"default": "util"
},
"node:util": {
"bare": "bare-utils",
"default": "util"
},
"util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"node:util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"v8": {
"bare": "bare-v8",
"default": "v8"
},
"node:v8": {
"bare": "bare-v8",
"default": "v8"
},
"vm": {
"bare": "bare-vm",
"default": "vm"
},
"node:vm": {
"bare": "bare-vm",
"default": "vm"
},
"wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"node:wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"node:worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"zlib": {
"bare": "bare-zlib",
"default": "zlib"
},
"node:zlib": {
"bare": "bare-zlib",
"default": "zlib"
}
} }
} }
+466
View File
@@ -0,0 +1,466 @@
{
"assert": {
"bare": "bare-assert",
"default": "assert"
},
"node:assert": {
"bare": "bare-assert",
"default": "assert"
},
"assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"node:assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"node:async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"node:buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"node:child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"node:cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"console": {
"bare": "bare-console",
"default": "console"
},
"node:console": {
"bare": "bare-console",
"default": "console"
},
"constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"node:constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"node:crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"node:dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"node:diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"dns": {
"bare": "bare-dns",
"default": "dns"
},
"node:dns": {
"bare": "bare-dns",
"default": "dns"
},
"dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"node:dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"node:domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"events": {
"bare": "bare-events",
"default": "events"
},
"node:events": {
"bare": "bare-events",
"default": "events"
},
"fs": {
"bare": "bare-fs",
"default": "fs"
},
"node:fs": {
"bare": "bare-fs",
"default": "fs"
},
"fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"node:fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"http": {
"bare": "bare-http1",
"default": "http"
},
"node:http": {
"bare": "bare-http1",
"default": "http"
},
"http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"node:http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"https": {
"bare": "bare-https",
"default": "https"
},
"node:https": {
"bare": "bare-https",
"default": "https"
},
"inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"node:inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"node:inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"module": {
"bare": "bare-module",
"default": "module"
},
"node:module": {
"bare": "bare-module",
"default": "module"
},
"net": {
"bare": "bare-net",
"default": "net"
},
"node:net": {
"bare": "bare-net",
"default": "net"
},
"os": {
"bare": "bare-os",
"default": "os"
},
"node:os": {
"bare": "bare-os",
"default": "os"
},
"path": {
"bare": "bare-path",
"default": "path"
},
"node:path": {
"bare": "bare-path",
"default": "path"
},
"path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"node:path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"node:path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"node:perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"process": {
"bare": "bare-process",
"default": "process"
},
"node:process": {
"bare": "bare-process",
"default": "process"
},
"punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"node:punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"node:querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"readline": {
"bare": "bare-readline",
"default": "readline"
},
"node:readline": {
"bare": "bare-readline",
"default": "readline"
},
"readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"node:readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"repl": {
"bare": "bare-repl",
"default": "repl"
},
"node:repl": {
"bare": "bare-repl",
"default": "repl"
},
"sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"node:sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"node:sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"stream": {
"bare": "bare-stream",
"default": "stream"
},
"node:stream": {
"bare": "bare-stream",
"default": "stream"
},
"stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"node:stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"node:stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"node:stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"node:string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"node:sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"node:test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"node:test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"timers": {
"bare": "bare-timers",
"default": "timers"
},
"node:timers": {
"bare": "bare-timers",
"default": "timers"
},
"timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"node:timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"tls": {
"bare": "bare-tls",
"default": "tls"
},
"node:tls": {
"bare": "bare-tls",
"default": "tls"
},
"trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"node:trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"tty": {
"bare": "bare-tty",
"default": "tty"
},
"node:tty": {
"bare": "bare-tty",
"default": "tty"
},
"url": {
"bare": "bare-url",
"default": "url"
},
"node:url": {
"bare": "bare-url",
"default": "url"
},
"util": {
"bare": "bare-utils",
"default": "util"
},
"node:util": {
"bare": "bare-utils",
"default": "util"
},
"util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"node:util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"v8": {
"bare": "bare-v8",
"default": "v8"
},
"node:v8": {
"bare": "bare-v8",
"default": "v8"
},
"vm": {
"bare": "bare-vm",
"default": "vm"
},
"node:vm": {
"bare": "bare-vm",
"default": "vm"
},
"wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"node:wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"node:worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"zlib": {
"bare": "bare-zlib",
"default": "zlib"
},
"node:zlib": {
"bare": "bare-zlib",
"default": "zlib"
}
}
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
case "$(uname -m)" in
x86_64|amd64) BARE="${ROOT_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" ;;
aarch64|arm64) BARE="${ROOT_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ;;
*) BARE="" ;;
esac
if [[ -f "${BARE}" ]]; then chmod 755 "${BARE}"; else BARE="$(command -v bare || true)"; fi
[[ -x "${BARE}" ]] || { echo "Bare runtime not found; run npm ci or install the rolling bundle." >&2; exit 1; }
exec "${BARE}" "$@"
+5
View File
@@ -0,0 +1,5 @@
await import('bare-node-runtime/global');
const [target, ...args] = Bare.argv.slice(2);
if (!target) throw new Error('bare-run requires a module path');
if (globalThis.process?.argv) process.argv.splice(0, process.argv.length, Bare.argv[0], target, ...args);
await import(new URL(`../${target}`, import.meta.url));
+11
View File
@@ -0,0 +1,11 @@
import fs from 'node:fs';
import path from 'node:path';
import os from 'node:os';
import { EventEmitter } from 'node:events';
if (!globalThis.Bare) throw new Error('Bare runtime was not detected');
if (typeof fs.readFileSync !== 'function') throw new Error('bare-fs mapping is missing');
if (path.join('jarvis', 'qvac') !== 'jarvis/qvac') throw new Error('bare-path mapping is missing');
if (typeof os.tmpdir !== 'function') throw new Error('bare-os mapping is missing');
if (typeof EventEmitter !== 'function') throw new Error('bare-events mapping is missing');
console.log(JSON.stringify({ runtime: 'bare', version: Bare.version, tmpdir: os.tmpdir() }));
+3 -2
View File
@@ -3,8 +3,9 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "${ROOT_DIR}" cd "${ROOT_DIR}"
mkdir -p dist mkdir -p dist
rm -f dist/jarvis-qvac_*.deb dist/jarvis-qvac-extension.zip dist/SHA256SUMS rm -f dist/jarvis-qvac_*.deb dist/jarvis-qvac-extension.zip dist/jarvis-qvac-bare-*.tar.gz dist/SHA256SUMS
bash packaging/build-extension.sh bash packaging/build-extension.sh
bash packaging/build-deb.sh bash packaging/build-deb.sh
(cd dist && sha256sum jarvis-qvac_*.deb jarvis-qvac-extension.zip > SHA256SUMS) bash packaging/build-runtime-bundle.sh
(cd dist && sha256sum jarvis-qvac_*.deb jarvis-qvac-extension.zip jarvis-qvac-bare-*.tar.gz > SHA256SUMS)
echo "Release artifacts written to ${ROOT_DIR}/dist" echo "Release artifacts written to ${ROOT_DIR}/dist"
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
OUT_DIR="${ROOT_DIR}/dist"
case "$(uname -m)" in
x86_64|amd64) PLATFORM="linux-x64" ;;
aarch64|arm64) PLATFORM="linux-arm64" ;;
*) echo "Unsupported host architecture: $(uname -m)" >&2; exit 2 ;;
esac
BINARY="${ROOT_DIR}/node_modules/bare-runtime-${PLATFORM}/bin/bare"
[[ -f "${BINARY}" ]] || { echo "Bare platform binary missing; run npm ci first." >&2; exit 1; }
chmod 755 "${BINARY}"
python3 "${ROOT_DIR}/packaging/prepare-bare-deps.py" "${ROOT_DIR}/node_modules"
mkdir -p "${OUT_DIR}"
BUNDLE_DIR="${OUT_DIR}/jarvis-qvac-bare-${PLATFORM}"
rm -rf "${BUNDLE_DIR}" "${OUT_DIR}/jarvis-qvac-bare-${PLATFORM}.tar.gz"
mkdir -p "${BUNDLE_DIR}"
tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./vendor/agent-harness/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${BUNDLE_DIR}"
cp -a "${ROOT_DIR}/node_modules" "${BUNDLE_DIR}/"
tar -C "${OUT_DIR}" -czf "${OUT_DIR}/jarvis-qvac-bare-${PLATFORM}.tar.gz" "jarvis-qvac-bare-${PLATFORM}"
rm -rf "${BUNDLE_DIR}"
echo "${OUT_DIR}/jarvis-qvac-bare-${PLATFORM}.tar.gz"
+10 -8
View File
@@ -2,19 +2,21 @@
set -euo pipefail set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "${ROOT_DIR}" cd "${ROOT_DIR}"
case "$(uname -m)" in
x86_64|amd64) BARE="${ROOT_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" ;;
aarch64|arm64) BARE="${ROOT_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ;;
*) BARE="" ;;
esac
BARE="${BARE:-$(command -v bare || true)}"
[[ -x "${BARE}" ]] || { echo "Packaged Bare runtime not found; reinstall the rolling bundle." >&2; exit 1; }
echo "JARVIS-QVAC first-run setup" echo "JARVIS-QVAC first-run setup"
echo "The daemon is GPU-gated and keeps QVAC behind one master owner." echo "The daemon is GPU-gated and keeps QVAC behind one master owner."
echo echo
echo "[1/5] GPU and QVAC preflight" echo "[1/5] GPU and QVAC preflight"
npm run gpu-doctor || true "${BARE}" packaging/bare-run.js daemon/gpu-doctor.js || true
if command -v timeout >/dev/null; then
timeout --foreground 30s npm run qvac:doctor || echo "QVAC doctor timed out or reported an unavailable host dependency; continuing with local setup."
else
npm run qvac:doctor || true
fi
echo echo
echo "[2/5] Microphone and PipeWire preflight" echo "[2/5] Microphone and PipeWire preflight"
npm run voice-doctor || true "${BARE}" packaging/bare-run.js daemon/voice-doctor.js || true
echo echo
echo "[3/5] Wake phrase and model profile" echo "[3/5] Wake phrase and model profile"
read -r -p "Wake phrase [hey jarvis]: " WAKE_PHRASE read -r -p "Wake phrase [hey jarvis]: " WAKE_PHRASE
@@ -29,7 +31,7 @@ read -r -p "Enable TTS preview? [Y/n]: " TTS_CHOICE
TTS_ENABLED=true TTS_ENABLED=true
[[ "${TTS_CHOICE:-Y}" =~ ^[Nn]$ ]] && TTS_ENABLED=false [[ "${TTS_CHOICE:-Y}" =~ ^[Nn]$ ]] && TTS_ENABLED=false
mkdir -p "${HOME}/.config/jarvis" mkdir -p "${HOME}/.config/jarvis"
node -e 'const fs=require("fs"); const p=process.argv[1], phrase=process.argv[2], profile=process.argv[3], tts=process.argv[4]==="true"; let c={}; try{c=JSON.parse(fs.readFileSync(p,"utf8"))}catch{}; Object.assign(c,{wakePhrase:phrase,modelProfile:profile,ttsEnabled:tts}); fs.writeFileSync(p,JSON.stringify(c,null,2)+"\n")' "${HOME}/.config/jarvis/config.json" "${WAKE_PHRASE}" "${MODEL_PROFILE}" "${TTS_ENABLED}" "${BARE}" packaging/write-config.js "${HOME}/.config/jarvis/config.json" "${WAKE_PHRASE}" "${MODEL_PROFILE}" "${TTS_ENABLED}"
echo "Saved wake phrase: ${WAKE_PHRASE}; model profile: ${MODEL_PROFILE}; TTS: ${TTS_ENABLED}" echo "Saved wake phrase: ${WAKE_PHRASE}; model profile: ${MODEL_PROFILE}; TTS: ${TTS_ENABLED}"
echo echo
echo "[4/5] TTS preview" echo "[4/5] TTS preview"
+16 -9
View File
@@ -1,21 +1,28 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
NODE_BIN="$(command -v node || true)"
if [[ -z "${NODE_BIN}" ]]; then
echo "Node.js is required" >&2
exit 1
fi
command -v zip >/dev/null || { echo "zip is required to register the GNOME extension" >&2; exit 1; } command -v zip >/dev/null || { echo "zip is required to register the GNOME extension" >&2; exit 1; }
APP_DIR="${HOME}/.local/share/jarvis-qvac" APP_DIR="${HOME}/.local/share/jarvis-qvac"
EXT_DIR="${HOME}/.local/share/gnome-shell/extensions/[email protected]" EXT_DIR="${HOME}/.local/share/gnome-shell/extensions/[email protected]"
CONFIG_DIR="${HOME}/.config/jarvis" CONFIG_DIR="${HOME}/.config/jarvis"
CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/jarvis/models" CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/jarvis/models"
mkdir -p "${APP_DIR}" "${EXT_DIR}" "${CONFIG_DIR}" "${HOME}/.config/systemd/user" "${CACHE_DIR}" mkdir -p "${APP_DIR}" "${EXT_DIR}" "${CONFIG_DIR}" "${HOME}/.config/systemd/user" "${CACHE_DIR}"
tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./node_modules' --exclude='*/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${APP_DIR}" if [[ -f "${ROOT_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" || -f "${ROOT_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ]]; then
if [[ ! -d "${APP_DIR}/node_modules" ]]; then tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./vendor/agent-harness/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${APP_DIR}"
( cd "${APP_DIR}" && npm ci --omit=dev --ignore-scripts ) else
tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./node_modules' --exclude='*/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${APP_DIR}"
fi fi
case "$(uname -m)" in
x86_64|amd64) BARE_BIN="${APP_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" ;;
aarch64|arm64) BARE_BIN="${APP_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ;;
*) BARE_BIN="" ;;
esac
if [[ ! -x "${BARE_BIN}" ]]; then BARE_BIN="$(command -v bare || true)"; fi
if [[ -z "${BARE_BIN}" || ! -x "${BARE_BIN}" ]]; then
echo "The installed bundle does not contain a Bare runtime for $(uname -m). Install the official rolling bundle or build it with npm run package:bare." >&2
exit 1
fi
chmod 755 "${BARE_BIN}"
rm -rf "${EXT_DIR}" rm -rf "${EXT_DIR}"
mkdir -p "${EXT_DIR}" mkdir -p "${EXT_DIR}"
EXT_TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jarvis-extension.XXXXXX")" EXT_TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jarvis-extension.XXXXXX")"
@@ -28,7 +35,7 @@ if command -v gnome-extensions >/dev/null && gnome-extensions install --force "$
else else
cp -a "${ROOT_DIR}/apps/gnome-extension/[email protected]/." "${EXT_DIR}/" cp -a "${ROOT_DIR}/apps/gnome-extension/[email protected]/." "${EXT_DIR}/"
fi fi
sed "s#__JARVIS_NODE__#${NODE_BIN}#" "${ROOT_DIR}/packaging/jarvisd.service" > "${HOME}/.config/systemd/user/jarvisd.service" sed "s#__JARVIS_BARE__#${BARE_BIN}#" "${ROOT_DIR}/packaging/jarvisd.service" > "${HOME}/.config/systemd/user/jarvisd.service"
if [[ ! -f "${CONFIG_DIR}/qvac.config.json" ]]; then if [[ ! -f "${CONFIG_DIR}/qvac.config.json" ]]; then
sed "s#__JARVIS_CACHE__#${CACHE_DIR}#g" "${ROOT_DIR}/packaging/qvac.config.template.json" > "${CONFIG_DIR}/qvac.config.json" sed "s#__JARVIS_CACHE__#${CACHE_DIR}#g" "${ROOT_DIR}/packaging/qvac.config.template.json" > "${CONFIG_DIR}/qvac.config.json"
fi fi
+1 -1
View File
@@ -6,7 +6,7 @@ Wants=pipewire.service
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=%h/.local/share/jarvis-qvac WorkingDirectory=%h/.local/share/jarvis-qvac
ExecStart=__JARVIS_NODE__ %h/.local/share/jarvis-qvac/daemon/index.js ExecStart=__JARVIS_BARE__ %h/.local/share/jarvis-qvac/daemon/bare-entry.js
Environment=QVAC_CONFIG_PATH=%h/.config/jarvis/qvac.config.json Environment=QVAC_CONFIG_PATH=%h/.config/jarvis/qvac.config.json
Environment=JARVIS_GPU_REQUIRED=1 Environment=JARVIS_GPU_REQUIRED=1
Environment=JARVIS_QVAC_OWNER=jarvisd Environment=JARVIS_QVAC_OWNER=jarvisd
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env python3
"""Add Bare's conditional builtin map to CommonJS packages in node_modules.
Bare resolves package imports at the package boundary. A number of otherwise
portable npm packages (notably dbus-next's XML parser dependency) still use
bare Node builtin specifiers without declaring a map. Applying the official
bare-node-runtime map at build time keeps those packages usable in the shipped
bundle while leaving the source packages untouched.
"""
import json
import sys
from pathlib import Path
root = Path(sys.argv[1] if len(sys.argv) > 1 else "node_modules")
mapping = json.loads(Path(__file__).with_name("bare-imports.json").read_text())
changed = 0
for package_json in root.rglob("package.json"):
if "/.cache/" in str(package_json) or "/.bin/" in str(package_json):
continue
try:
package = json.loads(package_json.read_text())
except (OSError, json.JSONDecodeError):
continue
imports = package.get("imports")
if imports is not None and not isinstance(imports, dict):
continue
merged = dict(mapping)
if isinstance(imports, dict):
merged.update(imports)
if imports == merged:
continue
package["imports"] = merged
package_json.write_text(json.dumps(package, indent=2) + "\n")
changed += 1
print(f"prepared {changed} package import maps for Bare")
+1 -1
View File
@@ -32,7 +32,7 @@ created="$(curl -fsS -X POST "${AUTH[@]}" "${JSON[@]}" "${API}/releases" --data
release_id="$(jq -r '.id // empty' <<<"${created}")" release_id="$(jq -r '.id // empty' <<<"${created}")"
test -n "${release_id}" test -n "${release_id}"
for asset in dist/jarvis-qvac_*.deb dist/jarvis-qvac-extension.zip dist/SHA256SUMS; do for asset in dist/jarvis-qvac_*.deb dist/jarvis-qvac-extension.zip dist/jarvis-qvac-bare-*.tar.gz dist/SHA256SUMS; do
[[ -f "${asset}" ]] || continue [[ -f "${asset}" ]] || continue
curl -fsS -X POST "${AUTH[@]}" \ curl -fsS -X POST "${AUTH[@]}" \
"${API}/releases/${release_id}/assets?name=$(basename "${asset}")" \ "${API}/releases/${release_id}/assets?name=$(basename "${asset}")" \
+24 -4
View File
@@ -40,16 +40,36 @@ done
command -v curl >/dev/null || { echo "curl is required" >&2; exit 1; } command -v curl >/dev/null || { echo "curl is required" >&2; exit 1; }
command -v tar >/dev/null || { echo "tar is required" >&2; exit 1; } command -v tar >/dev/null || { echo "tar is required" >&2; exit 1; }
command -v npm >/dev/null || { echo "Node.js/npm 22.17+ is required" >&2; exit 1; }
node -e 'const [major,minor]=process.versions.node.split(".").map(Number); if (major < 22 || (major === 22 && minor < 17)) process.exit(1)' \
|| { echo "Node.js 22.17+ is required" >&2; exit 1; }
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jarvis-web-install.XXXXXX")" TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jarvis-web-install.XXXXXX")"
cleanup() { rm -rf "$TMP_DIR"; } cleanup() { rm -rf "$TMP_DIR"; }
trap cleanup EXIT trap cleanup EXIT
ARCHIVE_URL="${SERVER%/}/${REPO}/archive/${REF}.tar.gz" ARCHIVE_URL="${SERVER%/}/${REPO}/archive/${REF}.tar.gz"
ARCHIVE="${TMP_DIR}/jarvis.tar.gz" ARCHIVE="${TMP_DIR}/jarvis.tar.gz"
case "$(uname -m)" in
x86_64|amd64) BUNDLE_NAME="jarvis-qvac-bare-linux-x64.tar.gz" ;;
aarch64|arm64) BUNDLE_NAME="jarvis-qvac-bare-linux-arm64.tar.gz" ;;
*) BUNDLE_NAME="" ;;
esac
BUNDLE_URL="${JARVIS_BUNDLE_URL:-${SERVER%/}/${REPO}/releases/download/rolling/${BUNDLE_NAME}}"
BUNDLE="${TMP_DIR}/${BUNDLE_NAME}"
if [[ -n "${BUNDLE_NAME}" ]]; then
echo "Trying the self-contained Bare bundle ${BUNDLE_NAME}"
if curl --fail --location --silent --show-error --retry 3 --proto '=https' --tlsv1.2 \
--user-agent "${USER_AGENT}" "${BUNDLE_URL}" -o "${BUNDLE}" && test -s "${BUNDLE}"; then
mkdir -p "${TMP_DIR}/bundle"
tar -xzf "${BUNDLE}" -C "${TMP_DIR}/bundle"
SOURCE_DIR="$(find "${TMP_DIR}/bundle" -mindepth 1 -maxdepth 1 -type d -print -quit)"
test -n "${SOURCE_DIR}" || { echo "Bare bundle contained no application directory" >&2; exit 1; }
test -x "${SOURCE_DIR}/packaging/install.sh" || { echo "Bare bundle contained no installer" >&2; exit 1; }
echo "Installing the bundled Bare runtime; Node.js is not required"
exec bash "${SOURCE_DIR}/packaging/install.sh" "$@"
fi
fi
if ! command -v npm >/dev/null || ! command -v node >/dev/null; then
echo "No published Bare bundle was found. Use JARVIS_REF=rolling or set JARVIS_BUNDLE_URL; Node.js is only needed for a source fallback." >&2
exit 1
fi
echo "Downloading JARVIS-QVAC source ref '${REF}' from ${SERVER}" echo "Downloading JARVIS-QVAC source ref '${REF}' from ${SERVER}"
curl --fail --location --silent --show-error --retry 3 --proto '=https' --tlsv1.2 \ curl --fail --location --silent --show-error --retry 3 --proto '=https' --tlsv1.2 \
--user-agent "${USER_AGENT}" \ --user-agent "${USER_AGENT}" \
+6
View File
@@ -0,0 +1,6 @@
import fs from 'node:fs';
const [file, phrase, profile, tts] = Bare.argv.slice(2);
let config = {};
try { config = JSON.parse(fs.readFileSync(file, 'utf8')); } catch {}
Object.assign(config, { wakePhrase: phrase, modelProfile: profile, ttsEnabled: tts === 'true' });
fs.writeFileSync(file, JSON.stringify(config, null, 2) + '\n');
+9 -1
View File
@@ -74,7 +74,15 @@ async function ensureInit() {
paths.ensureQvacRoot(); paths.ensureQvacRoot();
let mod; let mod;
try { try {
mod = await import('@qvac/sdk'); if (typeof Bare !== 'undefined') {
// @qvac/sdk's Bare RPC client is intentionally a stub. Bare hosts use
// the in-process inference surface and register the engines they own.
mod = await import('@qvac/inference');
const { llmPlugin } = await import('@qvac/inference/llamacpp-completion/plugin');
mod.registerPlugin(llmPlugin);
} else {
mod = await import('@qvac/sdk');
}
} catch (err) { } catch (err) {
initError = flattenError(err); initError = flattenError(err);
log('sdk import failed: ' + initError); log('sdk import failed: ' + initError);
+466
View File
@@ -19,5 +19,471 @@
"dependencies": { "dependencies": {
"@qvac/sdk": "0.19.1", "@qvac/sdk": "0.19.1",
"hyperdispatch": "^1.6.0" "hyperdispatch": "^1.6.0"
},
"imports": {
"assert": {
"bare": "bare-assert",
"default": "assert"
},
"node:assert": {
"bare": "bare-assert",
"default": "assert"
},
"assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"node:assert/strict": {
"bare": "bare-assert/strict",
"default": "assert/strict"
},
"async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"node:async_hooks": {
"bare": "bare-async-hooks",
"default": "async_hooks"
},
"buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"node:buffer": {
"bare": "bare-buffer",
"default": "buffer"
},
"child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"node:child_process": {
"bare": "bare-subprocess",
"default": "child_process"
},
"cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"node:cluster": {
"bare": "bare-node-runtime/unsupported",
"default": "cluster"
},
"console": {
"bare": "bare-console",
"default": "console"
},
"node:console": {
"bare": "bare-console",
"default": "console"
},
"constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"node:constants": {
"bare": "bare-node-runtime/unsupported",
"default": "constants"
},
"crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"node:crypto": {
"bare": "bare-crypto",
"default": "crypto"
},
"dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"node:dgram": {
"bare": "bare-dgram",
"default": "dgram"
},
"diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"node:diagnostics_channel": {
"bare": "bare-diagnostics-channel",
"default": "diagnostics_channel"
},
"dns": {
"bare": "bare-dns",
"default": "dns"
},
"node:dns": {
"bare": "bare-dns",
"default": "dns"
},
"dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"node:dns/promises": {
"bare": "bare-dns/promises",
"default": "dns/promises"
},
"domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"node:domain": {
"bare": "bare-node-runtime/unsupported",
"default": "domain"
},
"events": {
"bare": "bare-events",
"default": "events"
},
"node:events": {
"bare": "bare-events",
"default": "events"
},
"fs": {
"bare": "bare-fs",
"default": "fs"
},
"node:fs": {
"bare": "bare-fs",
"default": "fs"
},
"fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"node:fs/promises": {
"bare": "bare-fs/promises",
"default": "fs/promises"
},
"http": {
"bare": "bare-http1",
"default": "http"
},
"node:http": {
"bare": "bare-http1",
"default": "http"
},
"http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"node:http2": {
"bare": "bare-node-runtime/unsupported",
"default": "http2"
},
"https": {
"bare": "bare-https",
"default": "https"
},
"node:https": {
"bare": "bare-https",
"default": "https"
},
"inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"node:inspector": {
"bare": "bare-inspector",
"default": "inspector"
},
"inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"node:inspector/promises": {
"bare": "bare-inspector/promises",
"default": "inspector/promises"
},
"module": {
"bare": "bare-module",
"default": "module"
},
"node:module": {
"bare": "bare-module",
"default": "module"
},
"net": {
"bare": "bare-net",
"default": "net"
},
"node:net": {
"bare": "bare-net",
"default": "net"
},
"os": {
"bare": "bare-os",
"default": "os"
},
"node:os": {
"bare": "bare-os",
"default": "os"
},
"path": {
"bare": "bare-path",
"default": "path"
},
"node:path": {
"bare": "bare-path",
"default": "path"
},
"path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"node:path/posix": {
"bare": "bare-path/posix",
"default": "path/posix"
},
"path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"node:path/win32": {
"bare": "bare-path/win32",
"default": "path/win32"
},
"perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"node:perf_hooks": {
"bare": "bare-performance",
"default": "perf_hooks"
},
"process": {
"bare": "bare-process",
"default": "process"
},
"node:process": {
"bare": "bare-process",
"default": "process"
},
"punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"node:punycode": {
"bare": "bare-punycode",
"default": "punycode"
},
"querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"node:querystring": {
"bare": "bare-querystring",
"default": "querystring"
},
"readline": {
"bare": "bare-readline",
"default": "readline"
},
"node:readline": {
"bare": "bare-readline",
"default": "readline"
},
"readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"node:readline/promises": {
"bare": "bare-readline/promises",
"default": "readline/promises"
},
"repl": {
"bare": "bare-repl",
"default": "repl"
},
"node:repl": {
"bare": "bare-repl",
"default": "repl"
},
"sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"node:sea": {
"bare": "bare-node-runtime/unsupported",
"default": "sea"
},
"sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"node:sqlite": {
"bare": "bare-sqlite",
"default": "sqlite"
},
"stream": {
"bare": "bare-stream",
"default": "stream"
},
"node:stream": {
"bare": "bare-stream",
"default": "stream"
},
"stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"node:stream/consumers": {
"bare": "bare-stream/consumers",
"default": "stream/consumers"
},
"stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"node:stream/promises": {
"bare": "bare-stream/promises",
"default": "stream/promises"
},
"stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"node:stream/web": {
"bare": "bare-stream/web",
"default": "stream/web"
},
"string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"node:string_decoder": {
"bare": "bare-string-decoder",
"default": "string_decoder"
},
"sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"node:sys": {
"bare": "bare-node-runtime/unsupported",
"default": "sys"
},
"test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"node:test": {
"bare": "bare-node-runtime/unsupported",
"default": "test"
},
"test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"node:test/reporters": {
"bare": "bare-node-runtime/unsupported",
"default": "test/reporters"
},
"timers": {
"bare": "bare-timers",
"default": "timers"
},
"node:timers": {
"bare": "bare-timers",
"default": "timers"
},
"timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"node:timers/promises": {
"bare": "bare-timers/promises",
"default": "timers/promises"
},
"tls": {
"bare": "bare-tls",
"default": "tls"
},
"node:tls": {
"bare": "bare-tls",
"default": "tls"
},
"trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"node:trace_events": {
"bare": "bare-node-runtime/unsupported",
"default": "trace_events"
},
"tty": {
"bare": "bare-tty",
"default": "tty"
},
"node:tty": {
"bare": "bare-tty",
"default": "tty"
},
"url": {
"bare": "bare-url",
"default": "url"
},
"node:url": {
"bare": "bare-url",
"default": "url"
},
"util": {
"bare": "bare-utils",
"default": "util"
},
"node:util": {
"bare": "bare-utils",
"default": "util"
},
"util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"node:util/types": {
"bare": "bare-utils/types",
"default": "util/types"
},
"v8": {
"bare": "bare-v8",
"default": "v8"
},
"node:v8": {
"bare": "bare-v8",
"default": "v8"
},
"vm": {
"bare": "bare-vm",
"default": "vm"
},
"node:vm": {
"bare": "bare-vm",
"default": "vm"
},
"wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"node:wasi": {
"bare": "bare-node-runtime/unsupported",
"default": "wasi"
},
"worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"node:worker_threads": {
"bare": "bare-worker",
"default": "worker_threads"
},
"zlib": {
"bare": "bare-zlib",
"default": "zlib"
},
"node:zlib": {
"bare": "bare-zlib",
"default": "zlib"
}
} }
} }