Skip to content

Runtime page, Linux arm64, and dependency audit (0.5.0) - #45

Merged
yannelli merged 40 commits into
mainfrom
release/0.5.0
Oct 9, 2026
Merged

yannelli merged 40 commits into
mainfrom
release/0.5.0

Conversation

@yannelli

@yannelli yannelli commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Phase 1 of the runtime work plus the dependency audit, for 0.5.0. Merges p1/runtime-page, p1/linux-arm64-builds (#44) and sec/dependency-audit.

Runtime: the cloud button connects to the last runtime in one tap and opens the new Runtime page when it cannot. The page holds connection state, trust, keep-alive (runtime.keepAlive, runtime.autoReconnect), saved and Bonjour-discovered runtimes, SSH servers and pairing. The CLI binds a random free port by default, oxbit --lan advertises _oxbit._tcp for the iOS app, --keep-alive stops idle runtimes, and startup errors (port in use, watcher scans, missing node-pty) are reported instead of hanging. Linux x64 and arm64 get desktop AppImage/.deb packages, the arm64 SSH runtime, and arm64 managed language servers.

Security: tar 7.5.22 (8 GHSAs) with unsafe archive entries rejected without crashing the runtime, markdown-it 14.3.2, DOMPurify 3.4.16, desktop rustls 0.23.45, managed bash-language-server 5.8.1 and transitive overrides; bun audit goes from 41 to 3 and the managed lock from 20 to 5. Remaining advisories and reachability are in docs/security.md. Integration fixes: diagnostics arriving after a file's server is turned off are dropped, and the test archives are built synchronously to avoid a tar 7.5.22 pack race.

RuntimeIdentity, the keep-alive default, and the runtime output separator
live in @oxbit/protocol; the RuntimeConnector service types live in
@oxbit/workbench.
The runtime listens before the workspace watcher scans; watcher failures
become fs.watchError events and a stderr line. node-pty loads on first
terminal use, the CLI exits on Node below 24, desktop error frames carry
the error message, SSH startup errors carry the remote stderr tail, and
foreground serve failures print one line.
The supervisor pipes the runtime's stderr into a 4 KiB tail, appends it to
startup errors after the runtime output separator, and sends it as detail
with desktop-runtime-failed. desktop_connection takes an optional keepAlive
that the launch frame carries.
The runtime persists an id in runtime.json and serves { id, name, version,
startedAt } from /api/health, /api/pair, and auth.authenticate. The CLI
binds an OS-assigned port unless --port or PORT is set, records the id in
daemon.json, and prints it from --status. The dev script keeps port 9277.
New @oxbit/feature-runtime package: Runtime tab, status item, runtime.open and
runtime.cloud commands, runtime.keepAlive and runtime.autoReconnect settings.
The web app supplies a RuntimeConnector that replaces ConnectionDialog;
RuntimeClient stores tokens by runtime id and exposes the runtime identity.
createRuntime takes idleShutdown and reports idleSince. The CLI accepts
--keep-alive and OXBIT_KEEP_ALIVE (default: run until stopped). Remote
desktop runtimes take keepAlive from the launch frame, hold the lease while
a client is connected, and outlive a closed stdin until the lease expires.
A reconnect with the same workspace key stops the previous owner and takes
the lock. The server pings clients every 30 s and terminates silent ones.
Each project gets a DesktopRuntimeConnector: one tap restarts a stopped
runtime, SSH projects list their hosts with Start Oxbit on this server, and
startup errors show the runtime's stderr under Details. desktop_connection
receives runtime.keepAlive. The Runtime page replaces TrustDialog, and
pairing is optional in the connector contract.
- Pin Node 24.20.0 and ripgrep 15.1.0 for linux-arm64; remote:prepare builds
  darwin-arm64, linux-x64, and linux-arm64. A Linux host reuses its native
  node-pty build; other Linux targets compile in Docker with per-platform
  node:24.20.0-bookworm manifest digests.
- The release manifest, the iOS pinned-manifest parser, and their tests
  require all three platforms.
- Desktop and iOS SSH map Linux/aarch64 to linux-arm64 and name arm64 in the
  unsupported-host message and connection dialogs.
- OXBIT_SSH_TEST_PLATFORM=linux/arm64 runs remote:test and ios:ssh-live
  against an arm64 sshd container with the linux-arm64 payload.

bundle-tools.mjs reads the per-arch linuxBundleTools lists from binaries.json.

binaries.json lists Tauri's AppImage helpers per arch (x64, arm64) and
refreshes the x86_64 linuxdeploy and linuxdeploy-plugin-appimage pins,
which changed upstream under their mutable release tags.
- release.yml builds the linux-arm64 remote runtime on ubuntu-24.04-arm and
  adds a linux job that builds, signs the updater AppImage, smoke-tests, and
  uploads the .deb and AppImage for x64 and arm64 (arm64 continue-on-error).
  publish waits for it.
- desktop.yml builds the linux-arm64 remote runtime, runs its SSH acceptance
  on an arm64 container, and adds an ubuntu-24.04-arm desktop leg.
- publish-release.mjs requires the Linux x64 files and all three remote
  runtime archives; latest.json lists linux-x86_64 and, when built,
  linux-aarch64.
- Desktop scripts accept linux-arm64: run.mjs allows the host, licenses.mjs
  reads the Rust notice triple from the runtime inventory.
oxbit --lan binds 0.0.0.0 on a free port, allows tauri://localhost and
http origins for every LAN address and the .local name, and advertises
_oxbit._tcp with a dependency-free mDNS responder on node:dgram. Runtimes
bound to 0.0.0.0 or :: allow LAN origins; daemon probes and local links
use 127.0.0.1.
docs/runtime.md covers the random port, runtime identity, --lan with
Bonjour advertising (RFC 6762, RFC 6763 references), --keep-alive, and
startup failure reporting. docs/remote-ssh.md covers the keepAlive lease
and same-workspace reconnect takeover.
Processes.create loads node-pty on first use and returns a promise.
Connect Runtime on the start screen opens the Runtime page as a sheet; inside a
workspace the cloud button runs one-tap. The iOS connector lists Bonjour
runtimes, reconnects paired ones by runtime id, starts SSH runtimes with the
keep-alive setting, and reconnects URL runtimes on foreground when
runtime.autoReconnect is on. Failed connections say whether anything answered.
The page called connector.trust, disconnect, and restart unbound, so trust
failed with 'this.session' undefined. Switch styles now outrank the global
checkbox rules. New browser spec covers pairing from the page, one-tap
reconnect, and the failure explanation; the mobile and tooltip specs use
the page in place of the removed dialog.
The bridge mocks runtime_discovery and runtime_credentials and can seed app
storage. Specs cover listing and pairing a network runtime, keep-alive set on
the start screen carrying into a workspace, and one tap opening the page with
the reason. The Runtime sheet is a labelled dialog.
README describes the assigned port, --lan, --keep-alive, and the cloud button.
runtime.md gains a Runtime page section with the per-app connectors;
settings.md lists runtime.keepAlive and runtime.autoReconnect; the index lists
runtime.md and settings.md; ios.md drops the implemented SSH tunnel item.
- managedPlatforms adds linux-arm64; the install gate uses it.
- artifacts.lock.json pins the upstream aarch64 Linux assets for marksman
  2026-02-08, taplo 0.10.0, ShellCheck 0.11.0, Temurin JRE 21.0.12.1+1, and
  Laravel LSP 0.0.31, and the LemMinX 0.31.2 jar, with sha256 integrity
  computed from the downloads.
- A unit test requires every native server for every managed platform.
- scripts/language/package.ts bundles linux-arm64 caches; the language
  server workflow adds ubuntu-24.04-arm.
- themes.spec.ts writes its screenshots under testInfo.outputPath() instead
  of /private/tmp, which does not exist on Linux.
…ncaught exception

tar 7.5.9 is affected by GHSA-qffp-2rhf-9h96, GHSA-9ppj-qmqm-q256, GHSA-vmf3-w455-68vh,
GHSA-w8wr-v893-vjvp, GHSA-23hp-3jrh-7fpw, GHSA-8x88-c5mf-7j5w, GHSA-gvwx-54wh-qm9j and
GHSA-r292-9mhp-454m. The extract filter threw inside tar's stream handler, which left the
untar promise pending and raised an uncaught exception; it now records the rejection and
throws after extraction.
markdown-it 10.0.0: GHSA-6v5v-wf23-fmfq, GHSA-6vfc-qv3f-vr6c, GHSA-253c-mchw-3w2r.
linkify-it 2.2.0 -> 5.0.2: GHSA-22p9-wv53-3rq4, GHSA-v245-v573-v5vm.
argparse 1 -> 2 removes sprintf-js from the markdown-it path.
@types/markdown-it 14.2.0 removes highlight.js 9.18.5 (GHSA-7wwv-vh3v-89cq).
dompurify 3.4.15: GHSA-p98j-92pf-mc4p, GHSA-6688-9rhm-gjv2.

A render diff of 38 inputs across the previews, agent and hover configurations
shows two parser changes: a pipe inside a table code span splits the cell
(GFM), and linkify keeps a trailing '*b' inside the URL. Link validation and
escaping output are unchanged.
fast-uri 3.1.7 via ajv 8 (root devDependency): GHSA-hrr3-gc8f-f4qj.
vitest 3.2.7 -> 4.1.11: @vitest/mocker GHSA-82fw-gwwq-j7x9; removes tinypool 1.1.1
(GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr).
Overrides: basic-ftp 6.2.2 (GHSA-c475-qrg2-pj4r), ip-address 10.7.1
(GHSA-j6r3-76f7-8jcv, GHSA-h3mg-xc3c-68pw), serialize-javascript 7.0.5
(GHSA-5c6j-r48x-rmvq, GHSA-qj8w-gfj5-8c6v), smol-toml 1.9.0 (GHSA-r4xh-jqrq-34v2),
source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q).
bun.lock entries for brace-expansion move to 1.1.21, 2.1.7 and 5.0.12 within their
parents' ranges (GHSA-6j4f-fj2g-mc7p, GHSA-qhr7-859c-m2p7, GHSA-q2hr-2g5m-vwhr); bun
applies a nested override to every parent, so the entries are set in the lock.
rustls 0.23.43: RUSTSEC-2026-0285 / GHSA-2mjx-qc3c-rqvc. The iOS host and
oxbit-files locks do not include rustls.
… transitive packages

bash-language-server 5.6.0 -> 5.8.1 moves editorconfig to 3.0.2: minimatch 10.2.6
(GHSA-3ppc-4f35-3m26, GHSA-7r86-cg39-jmmj, GHSA-23c5-xmqv-rm74) and brace-expansion
5.0.12 (GHSA-6j4f-fj2g-mc7p, GHSA-qhr7-859c-m2p7, GHSA-q2hr-2g5m-vwhr).
Overrides: fast-uri 3.1.8, source-map-js 1.2.2, ip-address 10.7.3, protobufjs 8.8.0,
basic-ftp 6.2.2, @opentelemetry/core, resources and sdk-trace-base 2.12.0.
intelephense stays at 1.18.5 (latest). Its lib/intelephense.js bundles its
dependencies, so the overridden node_modules copies are not loaded.
Adds scripts/osv-cargo.mjs to query OSV for Cargo.lock crates.
# Conflicts:
#	apps/runtime/tests/lsp-manager.test.ts
… off

acceptDiagnostics waited on remoteVersions() and then stored diagnostics
even if the file switch was turned off during the wait. Also type the
linux-arm64 managed platform and note that Linux packages now ship.
# Conflicts:
#	apps/ios/src-tauri/src/ssh/live_runtime_tests.rs
#	docs/INDEX.md
tar 7.5.22's async pack writes a hardlink entry after the stream ends in
about one run in four, which surfaced as an uncaught ZlibError in vitest.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
oxbit ab18608 Commit Preview URL

Branch Preview URL
Oct 09 2026, 08:38 AM

A launch with the owner's own workspace key now takes over its orphaned
runtime, so the smoke test checks that another owner is still rejected.
@yannelli
yannelli merged commit 95ca929 into main Oct 9, 2026
12 of 19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant