From a3314db1e9b314f04426ee9e62d4511943f53f9a Mon Sep 17 00:00:00 2001 From: Raven Scott Date: Fri, 11 Sep 2026 15:52:53 -0400 Subject: [PATCH] Run daemon on packaged Bare runtime --- README.md | 14 +- computer-use/doctor.js | 12 +- computer-use/package.json | 468 ++++++++++++++++++++++++++- daemon/bare-entry.js | 7 + daemon/dbus-service.js | 6 +- daemon/index.js | 3 +- daemon/package.json | 468 ++++++++++++++++++++++++++- daemon/qvac-master.js | 7 +- daemon/status-entry.js | 3 + daemon/voice-doctor.js | 14 +- docs/README.md | 3 +- docs/bare-runtime.md | 51 +++ docs/operations.md | 17 +- package-lock.json | 338 +++++++++++++++++++- package.json | 495 ++++++++++++++++++++++++++++- packaging/bare-imports.json | 466 +++++++++++++++++++++++++++ packaging/bare-launch.sh | 11 + packaging/bare-run.js | 5 + packaging/bare-smoke.js | 11 + packaging/build-release.sh | 5 +- packaging/build-runtime-bundle.sh | 22 ++ packaging/first-run.sh | 18 +- packaging/install.sh | 25 +- packaging/jarvisd.service | 2 +- packaging/prepare-bare-deps.py | 35 ++ packaging/publish-gitea-release.sh | 2 +- packaging/web-installer.sh | 28 +- packaging/write-config.js | 6 + vendor/agent-harness/lib/qvac.js | 10 +- vendor/agent-harness/package.json | 466 +++++++++++++++++++++++++++ 30 files changed, 2953 insertions(+), 65 deletions(-) create mode 100644 daemon/bare-entry.js create mode 100644 daemon/status-entry.js create mode 100644 docs/bare-runtime.md create mode 100644 packaging/bare-imports.json create mode 100755 packaging/bare-launch.sh create mode 100644 packaging/bare-run.js create mode 100644 packaging/bare-smoke.js create mode 100755 packaging/build-runtime-bundle.sh create mode 100644 packaging/prepare-bare-deps.py create mode 100644 packaging/write-config.js diff --git a/README.md b/README.md index aaba170..d797ccf 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ JARVIS-QVAC has one cognitive loop and one QVAC authority. ~~~mermaid flowchart LR U[User] --> G[GNOME Shell / ARC] - G <--> D[jarvisd / Node 22] + G <--> D[jarvisd / packaged Bare] D --> H[agent-harness] D --> M[Single QVAC master] D --> V[Voice + PipeWire] @@ -62,7 +62,7 @@ desktop permission. Full runtime support requires: - 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. - xdg-desktop-portal with the GNOME backend. - 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 ~~~ -The installer requires Node.js 22.17+, npm, curl, and tar. For a mirror or a -specific Gitea ref, set `JARVIS_SERVER`, `JARVIS_REPO`, or `JARVIS_REF` before -the command. The downloaded ref must contain the repository packaging files. +The rolling installer first downloads a self-contained architecture bundle +with the Bare ELF runtime and all application dependencies. It therefore needs +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 @@ -142,6 +144,7 @@ under the user's cache directory, and user data paths described in ~~~bash 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 cu-doctor # Wayland/X11, portals, AT-SPI, and libei npm run voice-doctor # PipeWire, wake bridge, and playback diagnostics @@ -204,6 +207,7 @@ Artifacts in dist are: - jarvis-qvac__.deb - jarvis-qvac-extension.zip +- jarvis-qvac-bare-linux-.tar.gz (self-contained runtime bundle) - SHA256SUMS Gitea Actions workflows live under .gitea/workflows. CI runs tests, Python diff --git a/computer-use/doctor.js b/computer-use/doctor.js index 5cad252..08b0e1f 100644 --- a/computer-use/doctor.js +++ b/computer-use/doctor.js @@ -1,9 +1,15 @@ import { access } from 'node:fs/promises'; import { constants } from 'node:fs'; -import { execFile } from 'node:child_process'; -import { promisify } from 'node:util'; +import { spawn } from 'node:child_process'; -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 = [ ['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'; }], diff --git a/computer-use/package.json b/computer-use/package.json index 9a4c58b..cf6b6bd 100644 --- a/computer-use/package.json +++ b/computer-use/package.json @@ -2,5 +2,471 @@ "name": "@jarvis-qvac/computer-use", "private": true, "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" + } + } } diff --git a/daemon/bare-entry.js b/daemon/bare-entry.js new file mode 100644 index 0000000..c6a329b --- /dev/null +++ b/daemon/bare-entry.js @@ -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(); diff --git a/daemon/dbus-service.js b/daemon/dbus-service.js index e6b98ab..c2b8832 100644 --- a/daemon/dbus-service.js +++ b/daemon/dbus-service.js @@ -3,7 +3,11 @@ const OBJECT = '/io/qvac/Jarvis'; const BUS_NAME = 'io.qvac.Jarvis'; 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; class Session extends Interface { constructor() { super(IFACE); } diff --git a/daemon/index.js b/daemon/index.js index a753aef..3e9185c 100644 --- a/daemon/index.js +++ b/daemon/index.js @@ -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(); } } -if (import.meta.url === `file://${process.argv[1]}`) { +export async function startDaemon() { const daemon = new JarvisDaemon(); daemon.startVoice().catch((error) => console.error(`jarvisd: voice unavailable: ${error.message}`)); 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))); console.log('jarvisd ready; QVAC inference remains GPU-gated'); + return daemon; } diff --git a/daemon/package.json b/daemon/package.json index 6648524..bf2da30 100644 --- a/daemon/package.json +++ b/daemon/package.json @@ -2,5 +2,471 @@ "name": "@jarvis-qvac/daemon", "private": true, "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" + } + } } diff --git a/daemon/qvac-master.js b/daemon/qvac-master.js index d9b6d81..50db71e 100644 --- a/daemon/qvac-master.js +++ b/daemon/qvac-master.js @@ -3,9 +3,12 @@ import fs from 'node:fs'; import path from 'node:path'; 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); 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 ownerCount = 0; @@ -33,7 +36,7 @@ export function sdkPackagePath() { } export function assertSdkVersion() { - const sdkPackage = require(sdkPackagePath()); + const sdkPackage = require(sdkPackagePath(), { with: { imports: 'bare-node-runtime/imports' } }); if (!/^0\.19\./.test(sdkPackage.version)) { throw new Error(`Jarvis requires vendored @qvac/sdk in the 0.19.x series; found ${sdkPackage.version}`); } diff --git a/daemon/status-entry.js b/daemon/status-entry.js new file mode 100644 index 0000000..bcbba54 --- /dev/null +++ b/daemon/status-entry.js @@ -0,0 +1,3 @@ +await import('bare-node-runtime/global'); +const { qvacStatus } = await import('./qvac-master.js'); +console.log(JSON.stringify(qvacStatus(), null, 2)); diff --git a/daemon/voice-doctor.js b/daemon/voice-doctor.js index 9664a59..c005506 100644 --- a/daemon/voice-doctor.js +++ b/daemon/voice-doctor.js @@ -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 = { - pipewireCapture: commandAvailable('pw-cat'), + pipewireCapture: pipewire, wakeEngine: Boolean(process.env.JARVIS_WAKE_COMMAND), wakeCommand: process.env.JARVIS_WAKE_COMMAND || null, sampleRate: 16000, channels: 1, - ttsPlayback: commandAvailable('pw-cat'), + ttsPlayback: pipewire, gpuRequired: true, }; console.log(JSON.stringify(report, null, 2)); diff --git a/docs/README.md b/docs/README.md index ba19034..2356175 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,6 +12,7 @@ This directory is the maintained technical reference for the repository. | Understand the voice loop | [Voice pipeline](voice-pipeline.md) | | Build desktop control | [Computer use](computer-use.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) | | Use the D-Bus API | [API reference](api.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. - 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`. - Mermaid diagrams use Gitea-compatible fenced Markdown. diff --git a/docs/bare-runtime.md b/docs/bare-runtime.md new file mode 100644 index 0000000..e6f5e80 --- /dev/null +++ b/docs/bare-runtime.md @@ -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 user’s 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. diff --git a/docs/operations.md b/docs/operations.md index b35b4d9..c3d5dfe 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -2,9 +2,10 @@ ## Prerequisites -Ubuntu GNOME 24.04 or newer, Node.js 22.17+, PipeWire/WirePlumber, GNOME -desktop portals, GTK4/libadwaita, AT-SPI2, and a QVAC-visible GPU are required -for the full runtime. See [hardware compatibility](hardware-compatibility.md). +Ubuntu GNOME 24.04 or newer, the packaged Bare runtime, PipeWire/WirePlumber, +GNOME desktop portals, GTK4/libadwaita, AT-SPI2, and a QVAC-visible GPU are +required for the full runtime. Node.js is a build and test dependency only. +See [hardware compatibility](hardware-compatibility.md). ## 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 ~~~ -The installer downloads the source archive at the `rolling` ref and delegates -to the repository installer. Omit `--enable` to copy files without starting -the service. Pin a reviewed ref or use a mirror with `JARVIS_REF`, -`JARVIS_SERVER`, and `JARVIS_REPO`. +The installer downloads the self-contained Bare bundle from the `rolling` +release and delegates to the repository installer. Omit `--enable` to copy +files without starting the service. Use `JARVIS_SERVER`, `JARVIS_REPO`, and +`JARVIS_BUNDLE_URL` for a mirror. ## Development start @@ -27,7 +28,7 @@ npm test npm run gpu-doctor npm run cu-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 diff --git a/package-lock.json b/package-lock.json index 92cee12..a430cbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,15 +10,18 @@ "workspaces": [ "daemon", "computer-use", - "apps/control-center" + "apps/control-center", + "vendor/agent-harness" ], "dependencies": { "@qvac/cli": "0.13.0", "@qvac/sdk": "0.19.1", + "bare-node-runtime": "1.5.0", + "bare-runtime": "1.32.0", "dbus-next": "^0.10.2" }, "engines": { - "node": ">=22.17.0" + "bare": ">=1.30.3" } }, "apps/control-center": { @@ -1741,6 +1744,10 @@ "xache": "^1.2.1" } }, + "node_modules/agent-harness": { + "resolved": "vendor/agent-harness", + "link": true + }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -1980,6 +1987,23 @@ "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": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.7.1.tgz", @@ -2020,6 +2044,33 @@ "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": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.2.tgz", @@ -2072,6 +2123,37 @@ "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": { "version": "2.2.0", "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": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/bare-mime/-/bare-mime-1.0.0.tgz", @@ -2398,6 +2489,79 @@ "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": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz", @@ -2510,6 +2674,55 @@ "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": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/bare-rpc/-/bare-rpc-1.3.8.tgz", @@ -2856,6 +3069,20 @@ "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": { "version": "1.0.3", "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": { "version": "1.6.0", "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": { "version": "2.6.1", "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": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-3.1.10.tgz", @@ -3053,6 +3343,12 @@ "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": { "version": "1.0.4", "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" } }, + "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": { "version": "3.1.0", "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", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", - "optional": true, "engines": { "node": ">=6" } @@ -6383,6 +6701,20 @@ "funding": { "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" + } } } } diff --git a/package.json b/package.json index 8a6c63c..43b6677 100644 --- a/package.json +++ b/package.json @@ -4,27 +4,504 @@ "private": true, "description": "Local-first GNOME voice assistant powered by QVAC and agent-harness.", "type": "module", - "engines": { "node": ">=22.17.0" }, - "workspaces": ["daemon", "computer-use", "apps/control-center"], + "engines": { + "bare": ">=1.30.3" + }, + "workspaces": [ + "daemon", + "computer-use", + "apps/control-center", + "vendor/agent-harness" + ], "scripts": { - "start": "node daemon/index.js", + "start": "bash packaging/bare-launch.sh daemon/bare-entry.js", "test": "node --test", - "cu-doctor": "node computer-use/doctor.js", - "voice-doctor": "node daemon/voice-doctor.js", - "gpu-doctor": "node daemon/gpu-doctor.js", + "cu-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js computer-use/doctor.js", + "voice-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js daemon/voice-doctor.js", + "gpu-doctor": "bash packaging/bare-launch.sh packaging/bare-run.js daemon/gpu-doctor.js", "qvac:doctor": "qvac doctor", "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": "bash packaging/build-release.sh", + "package:bare": "bash packaging/build-runtime-bundle.sh", "package:test": "bash packaging/test-package.sh", "first-run": "bash packaging/first-run.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": { "@qvac/cli": "0.13.0", "@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" + } } } diff --git a/packaging/bare-imports.json b/packaging/bare-imports.json new file mode 100644 index 0000000..79016c6 --- /dev/null +++ b/packaging/bare-imports.json @@ -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" + } +} diff --git a/packaging/bare-launch.sh b/packaging/bare-launch.sh new file mode 100755 index 0000000..6ba2a21 --- /dev/null +++ b/packaging/bare-launch.sh @@ -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}" "$@" diff --git a/packaging/bare-run.js b/packaging/bare-run.js new file mode 100644 index 0000000..5da7bef --- /dev/null +++ b/packaging/bare-run.js @@ -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)); diff --git a/packaging/bare-smoke.js b/packaging/bare-smoke.js new file mode 100644 index 0000000..f9ec9dd --- /dev/null +++ b/packaging/bare-smoke.js @@ -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() })); diff --git a/packaging/build-release.sh b/packaging/build-release.sh index 6e15d30..450b4fb 100755 --- a/packaging/build-release.sh +++ b/packaging/build-release.sh @@ -3,8 +3,9 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${ROOT_DIR}" 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-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" diff --git a/packaging/build-runtime-bundle.sh b/packaging/build-runtime-bundle.sh new file mode 100755 index 0000000..d8923fc --- /dev/null +++ b/packaging/build-runtime-bundle.sh @@ -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" diff --git a/packaging/first-run.sh b/packaging/first-run.sh index e1edab4..f951861 100755 --- a/packaging/first-run.sh +++ b/packaging/first-run.sh @@ -2,19 +2,21 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" 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 "The daemon is GPU-gated and keeps QVAC behind one master owner." echo echo "[1/5] GPU and QVAC preflight" -npm run gpu-doctor || 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 +"${BARE}" packaging/bare-run.js daemon/gpu-doctor.js || true echo echo "[2/5] Microphone and PipeWire preflight" -npm run voice-doctor || true +"${BARE}" packaging/bare-run.js daemon/voice-doctor.js || true echo echo "[3/5] Wake phrase and model profile" 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_CHOICE:-Y}" =~ ^[Nn]$ ]] && TTS_ENABLED=false 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 echo "[4/5] TTS preview" diff --git a/packaging/install.sh b/packaging/install.sh index 5c2e444..9d19ed0 100755 --- a/packaging/install.sh +++ b/packaging/install.sh @@ -1,21 +1,28 @@ #!/usr/bin/env bash set -euo pipefail 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; } APP_DIR="${HOME}/.local/share/jarvis-qvac" EXT_DIR="${HOME}/.local/share/gnome-shell/extensions/jarvis@qvac.local" CONFIG_DIR="${HOME}/.config/jarvis" CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/jarvis/models" 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 [[ ! -d "${APP_DIR}/node_modules" ]]; then - ( cd "${APP_DIR}" && npm ci --omit=dev --ignore-scripts ) +if [[ -f "${ROOT_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" || -f "${ROOT_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ]]; 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}" +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 +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}" mkdir -p "${EXT_DIR}" 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 cp -a "${ROOT_DIR}/apps/gnome-extension/jarvis@qvac.local/." "${EXT_DIR}/" 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 sed "s#__JARVIS_CACHE__#${CACHE_DIR}#g" "${ROOT_DIR}/packaging/qvac.config.template.json" > "${CONFIG_DIR}/qvac.config.json" fi diff --git a/packaging/jarvisd.service b/packaging/jarvisd.service index b3651ad..1de882d 100644 --- a/packaging/jarvisd.service +++ b/packaging/jarvisd.service @@ -6,7 +6,7 @@ Wants=pipewire.service [Service] Type=simple 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=JARVIS_GPU_REQUIRED=1 Environment=JARVIS_QVAC_OWNER=jarvisd diff --git a/packaging/prepare-bare-deps.py b/packaging/prepare-bare-deps.py new file mode 100644 index 0000000..a26b7c9 --- /dev/null +++ b/packaging/prepare-bare-deps.py @@ -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") diff --git a/packaging/publish-gitea-release.sh b/packaging/publish-gitea-release.sh index fa2ec80..ccab121 100755 --- a/packaging/publish-gitea-release.sh +++ b/packaging/publish-gitea-release.sh @@ -32,7 +32,7 @@ created="$(curl -fsS -X POST "${AUTH[@]}" "${JSON[@]}" "${API}/releases" --data release_id="$(jq -r '.id // empty' <<<"${created}")" 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 curl -fsS -X POST "${AUTH[@]}" \ "${API}/releases/${release_id}/assets?name=$(basename "${asset}")" \ diff --git a/packaging/web-installer.sh b/packaging/web-installer.sh index 81a69bd..3a14a11 100755 --- a/packaging/web-installer.sh +++ b/packaging/web-installer.sh @@ -40,16 +40,36 @@ done 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 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")" cleanup() { rm -rf "$TMP_DIR"; } trap cleanup EXIT ARCHIVE_URL="${SERVER%/}/${REPO}/archive/${REF}.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}" curl --fail --location --silent --show-error --retry 3 --proto '=https' --tlsv1.2 \ --user-agent "${USER_AGENT}" \ diff --git a/packaging/write-config.js b/packaging/write-config.js new file mode 100644 index 0000000..ed6ad45 --- /dev/null +++ b/packaging/write-config.js @@ -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'); diff --git a/vendor/agent-harness/lib/qvac.js b/vendor/agent-harness/lib/qvac.js index 7fe467b..376073d 100644 --- a/vendor/agent-harness/lib/qvac.js +++ b/vendor/agent-harness/lib/qvac.js @@ -74,7 +74,15 @@ async function ensureInit() { paths.ensureQvacRoot(); let mod; 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) { initError = flattenError(err); log('sdk import failed: ' + initError); diff --git a/vendor/agent-harness/package.json b/vendor/agent-harness/package.json index c4c11d6..d50c800 100644 --- a/vendor/agent-harness/package.json +++ b/vendor/agent-harness/package.json @@ -19,5 +19,471 @@ "dependencies": { "@qvac/sdk": "0.19.1", "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" + } } }