From c10c14948c550c01b2a0c18be51abdcc6451ba9a Mon Sep 17 00:00:00 2001 From: "exe.dev user" Date: Tue, 8 Sep 2026 17:52:56 +0000 Subject: [PATCH 1/4] Add self-update foundations and fence unsafe CLI draining --- docs/ui-self-update-evidence/README.md | 18 + .../ui-self-update-evidence/after-desktop.png | Bin 0 -> 64076 bytes docs/ui-self-update-evidence/after-mobile.png | Bin 0 -> 49480 bytes .../before-desktop.png | Bin 0 -> 38240 bytes .../ui-self-update-evidence/before-mobile.png | Bin 0 -> 29015 bytes docs/ui-self-updates.md | 154 ++++++ src/cli/state.ts | 22 +- src/components/update-setting.tsx | 149 ++++++ src/features/settings/navigation.ts | 11 + src/routes/settings.tsx | 4 + src/server.ts | 8 + src/server/runs/store.server.ts | 2 +- src/server/updates.server.ts | 119 +++++ src/updater/contract.ts | 109 +++++ src/updater/journal.ts | 169 +++++++ src/updater/lock.ts | 45 ++ src/updater/releases.ts | 215 +++++++++ src/updater/security.ts | 52 ++ src/updater/snapshot.ts | 209 +++++++++ tests/releases.test.ts | 2 +- tests/settings-navigation.test.ts | 3 +- tests/steering.test.ts | 17 + tests/ui-updates.test.ts | 443 ++++++++++++++++++ 23 files changed, 1743 insertions(+), 8 deletions(-) create mode 100644 docs/ui-self-update-evidence/README.md create mode 100644 docs/ui-self-update-evidence/after-desktop.png create mode 100644 docs/ui-self-update-evidence/after-mobile.png create mode 100644 docs/ui-self-update-evidence/before-desktop.png create mode 100644 docs/ui-self-update-evidence/before-mobile.png create mode 100644 docs/ui-self-updates.md create mode 100644 src/components/update-setting.tsx create mode 100644 src/server/updates.server.ts create mode 100644 src/updater/contract.ts create mode 100644 src/updater/journal.ts create mode 100644 src/updater/lock.ts create mode 100644 src/updater/releases.ts create mode 100644 src/updater/security.ts create mode 100644 src/updater/snapshot.ts create mode 100644 tests/ui-updates.test.ts diff --git a/docs/ui-self-update-evidence/README.md b/docs/ui-self-update-evidence/README.md new file mode 100644 index 0000000..cfc2c36 --- /dev/null +++ b/docs/ui-self-update-evidence/README.md @@ -0,0 +1,18 @@ +# Settings update status: rendered evidence + +Actual Chromium screenshots of the source app with isolated disposable data, +light theme, device scale factor 1. Baseline: `7415789` (0.1.40). After: this +implementation branch. Both states use `/settings`, search `software update`, +the same viewports and the same empty app data. Screenshots are full-page captures +and therefore may differ in total image height as content changes. + +| Viewport | Before | After | +| --- | --- | --- | +| Desktop 1440 × 1000 | [Before desktop](before-desktop.png) | [After desktop](after-desktop.png) | +| Mobile 390 × 844 | [Before mobile](before-mobile.png) | [After mobile](after-mobile.png) | + +Before: no matching setting. After: source-build capability, externally managed +reason and disabled update check. These images show the implemented status UI, +not a working enrollment/activation/reconnect flow. No mockups substitute for +missing lifecycle screenshots. Screenshot scripts and server logs remain in +`/tmp`, outside the PR. diff --git a/docs/ui-self-update-evidence/after-desktop.png b/docs/ui-self-update-evidence/after-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..92c7ac54b486cb60e7bd9ef2ad2487bfe3190c99 GIT binary patch literal 64076 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⪼e{=^i%S( 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�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 I_V~sB07?8~;s5{u literal 0 HcmV?d00001 diff --git a/docs/ui-self-updates.md b/docs/ui-self-updates.md new file mode 100644 index 0000000..2ba2f2e --- /dev/null +++ b/docs/ui-self-updates.md @@ -0,0 +1,154 @@ +# UI self-updates: implementation status + +**Draft, incomplete. UI activation is disabled for every installation.** This +branch is not an implementation of all three approved phases and must not be +released as a working self-updater. No enrollment command or updater service is +installed by this code. Do not delete legacy lock files to enable the UI. + +The approved design is available at +[the immutable design revision](https://github.com/srctl/roost/blob/47093a36a0858e9948e68cba7c403e56ee61425e/docs/ui-self-update-design.md) +and [design PR #10](https://github.com/srctl/roost/pull/10). This branch starts at +`7415789` (0.1.40); it does not assume the design PR has merged. + +## Implemented behavior + +Settings has a searchable Updates section. Source/orchestrated installations +report externally managed status. Packaged installations report unsupported +architecture/service-manager reasons or that enrollment and activation remain +unimplemented. Nothing infers privileges from Linux x64, a proxy login, or the +presence of `ROOST_HOME` alone. + +A native-authenticated packaged installation with a configured repository can +request bounded, rate-limited stable-release metadata. The check pins repository, +release/asset IDs, SHA-256 digest, advertised size, version and expiry. It rejects +ambiguous artifacts, drafts and prereleases. Conditional requests retain the +original offer expiry; a 304 does not authorize an expired offer. Remote notes +are rendered as plain React text. Network failures are not “up to date.” Metadata +alone is not evidence of artifact or migration compatibility. + +`GET /api/updates` exposes only local capability when native authentication is +absent; remote metadata and CSRF tokens require a native session. The check POST +requires a recent session, exact origin/host, JSON, a session-bound CSRF token and +an empty allowlisted body. Activation POSTs cannot invoke the legacy CLI or any +other executable. No browser request can install privileges. + +The default web process does not inherit a terminal's GitHub credentials into +this release checker. The checker primitive supports an explicitly supplied +read-only credential, with redirects disabled. Private-repository credential +provisioning for a future supervised helper remains outstanding. + +Current CLI setup/update/start/stop operations now acquire an inherited-file- +descriptor `flock` lock as well as the legacy exclusive-create lock. The kernel +lock file is never unlinked. The legacy lock remains necessary to exclude old +binaries; a hard interruption can still leave that legacy file. This is not the +permanent enrollment sentinel or automatic stale-lock recovery described in the +design. `flock` from util-linux is required for this Linux CLI path. + +The 0.1.40 coding worker already observes existing workers during maintenance and +fences ambiguous Herdr recovery/submission. Those protections remain intact. +CLI draining now includes steering, missing workers and null observations. A +maintenance predicate also prevents claiming new steering. Conservatively, review +jobs remain blockers even if their last observation was idle. Nothing replays a +prompt or forcibly stops a worker. + +## Recovery primitives, not an activated recovery engine + +The new internal modules provide a versioned compatibility contract, durable +private JSON replacement with file/directory fsync, journal identity/sequence +validation and conservative recovery decisions. A committed record cannot be +rewritten as a restoring record. Unknown/corrupt evidence is rejected. + +The snapshot primitive copies complete managed app data into a private operation +directory, requires both SQLite stores, verifies database integrity and content +digests, checks space/inode headroom, and rejects links, hard links, special files +and nested mounts. It compares source content before/after copying and never +accepts an existing partial snapshot. It assumes an external supervisor has +already stopped and fenced writers; it does **not** establish that condition. +Configuration/release identity capture must still be integrated with the engine. + +These modules are exercised with disposable files and child processes. They are +not called by HTTP activation or the existing CLI update transaction. There is +no automatic retention deletion; test snapshots are removed only with their +disposable fixture. Future enrollment must protect and retain at least the last +complete recovery pair, never reclaim it just to make room for an update. + +The compatibility contract defaults to refusing absent/unknown app/auth ranges, +helper protocol, data format or bundled Codex version. It requires unchanged +excluded mutable state. It is not yet emitted by packaging or enforced by an +activation engine; existing release bundles therefore have no qualified UI +migration contract. Managed-data snapshots cannot restore `~/.codex`, browser +profiles, external worktrees, remote Herdr infrastructure or external actions. + +## Remaining implementation and acceptance gates + +1. Enrolled installation validation (including distribution, mount durability, + canonical identities and service authority); pinned separately supervised + helper; private socket peer credentials; root-owned fixed-unit noninteractive + service policy; permanent legacy CLI sentinel; shared CLI/helper routing. +2. Bounded artifact streaming/extraction and runtime execution preflight tied to + immutable accepted offers; packaging compatibility contract; durable actor, + idempotency and offer acceptance records. +3. Full transaction executor, cancellation/deferral, writer/quiescence barrier, + complete snapshot/config pair, systemd stop/group verification, candidate + startup capability and side-effect gate, bounded multi-surface probes, durable + commit, data/release rollback and resumable rename intents. +4. Boot ordering and manual-launch guard, independent read-only diagnostics and + a tested operator repair procedure. Never run an old release against migrated + candidate data or automatically restore data after committed work. +5. UI version confirmation, durable operation observation, lost-response + reconciliation, multi-tab maintenance, retained drafts, reconnect/reauth and + one-time asset reload. No activation controls are exposed before these gates. +6. Real disposable Ubuntu 24.04 systemd and reboot/fault-injection qualification, + followed by authenticated browser update/rollback acceptance. Additional + distributions and changed bundled runtimes require separate evidence. + +There is intentionally no operator enrollment recipe yet: installing an +unqualified helper would bypass these gates. Continue the documented +[operator-managed installation/update workflow](install.md) with its existing +limitations. Do not claim zero downtime, universal recovery, or rollback of +external effects. + +## Verification matrix and infrastructure limits + +| Design layer | Available evidence | Still required | +| --- | --- | --- | +| Release | Numeric stable versions; offer identity/digest/size/expiry validation; duplicate/draft/prerelease rejection; HTTP failure/backoff/coalescing; byte bounds; redirect refusal; unknown compatibility refusal | Live offline/private/429 behavior; approved artifact replaced at download; bounded hostile archive extraction; ABI execution; packaged migration compatibility | +| Authorization | Recent-session/origin/host/JSON/CSRF and field-allowlist tests; unauthenticated source activation/check rejection; no-store status | Native end-to-end activation; revocation races; accepted-operation authorization consumption; idempotency conflicts | +| Concurrency | Real kernel flock exclusion against another client and CLI; SIGKILL releases kernel ownership; lock symlinks rejected; legacy exclusion retained | Helper versus CLI/enrollment races; permanent old-CLI fence; reboot identity; durable acceptance under lost replies | +| Work | Existing 0.1.40 coding observation/recovery regressions; steering barrier; active/missing/null observations block CLI draining | Global submission/tool/delegation quiescence at stop boundary; external idle attestation; authenticated update initiated by active coding work | +| Data | Both SQLite databases and managed files copied/verified; tampering rejected; links refused; capacity refusal; journal corruption/identity/sequence checks | Large datasets; WAL/SHM crash boundaries; all mount/layout cases; disk/inode exhaustion during writes; copy interruption; config pairing; rollback restore transaction | +| Lifecycle | Existing fake-service CLI rollback regressions | Real systemd update, rollback, group-empty proof, slow shutdown/orphans, port collision, candidate assets/auth, helper survival, initially stopped installation | +| Fault injection | Child lock-owner SIGKILL; recovery decision rules; commit-to-restore refusal | Process kill and actual VM reboot at every journal/snapshot/rename/start/commit/admission boundary; failed rollback/manual recovery | +| Browser | Actual matched desktop/mobile Settings screenshots; source capability and disabled controls | Accepted update/rollback, lost response/disconnect, retained drafts, multi-tab synchronization, reauth, stale assets, assistive-technology validation | + +Read-only infrastructure research found Docker 29.1.3 reachable outside the +sandbox, with no existing test images; Docker alone is not evidence of a +rebootable Ubuntu systemd VM. No local QEMU or systemd-nspawn runner was found. +The documented exe.dev SSH host fingerprint was verified against its official +reference using a temporary known-hosts file. The API then rejected the available +credentials (`Permission denied (publickey,keyboard-interactive)`). No host SSH +configuration was changed and no VM was provisioned. An authorized disposable +Ubuntu 24.04 VM/runner and access method are needed to close the real lifecycle +and reboot test gap. No live Roost service/configuration/storage was modified, +enrolled, restarted, or updated. + +## Checks completed for this draft + +All repository check components passed: lint, TypeScript, 173 unit tests, app and +CLI builds, production-auth smoke, site TypeScript, six site tests and both site +builds. The final updater-focused rerun passed all 12 tests. Chromium verified +Settings in two tabs at both desktop/mobile viewports, search and Escape-to-clear, +no horizontal overflow, disabled source checks and denied source activation. + +The first check attempts inherited Roost/Codex/Herdr/listener environment values +and a `0077` umask. These conflicted with unrelated test assumptions. Checks were +run with those runtime/listener variables removed and a `0022` umask scoped to +the test subprocess; production-auth/site checks were completed separately after +the listener override was removed. The new snapshot/journal tests also passed +under the original restrictive umask. This does not qualify systemd updates, +boot recovery or the unimplemented activation flow. + +Docker-based VM emulation was not attempted. The available Docker daemon may be +a route to future disposable qualification; its availability has not established +that the full VM/reboot matrix can run here. Infrastructure limitations are +separate from the unfinished implementation listed above. diff --git a/src/cli/state.ts b/src/cli/state.ts index c9cc89e..bdb71d6 100644 --- a/src/cli/state.ts +++ b/src/cli/state.ts @@ -2,6 +2,7 @@ import { existsSync } from "node:fs"; import { mkdir, open, readFile, rm } from "node:fs/promises"; import { join } from "node:path"; import { DatabaseSync } from "node:sqlite"; +import { withKernelLock } from "../updater/lock"; export function maintenance(root: string, enabled: boolean) { const path = join(root, "data/roost.sqlite"); @@ -26,11 +27,13 @@ export function activeRuns(root: string): number { const runs = Number( db - .prepare("SELECT count(*) AS count FROM runs WHERE status='running'") + .prepare( + "SELECT count(*) AS count FROM runs WHERE status IN ('running','steering')", + ) .get()?.count ?? 0, ); - // Older installations predate coding jobs. A detached Herdr server still - // belongs to Roost's systemd cgroup and will be killed when Roost stops. + // Older installations predate coding jobs. Missing and unknown workers are + // not evidence of quiescence; preserve them for operator inspection. const hasCodingJobs = db .prepare( "SELECT 1 FROM sqlite_master WHERE type='table' AND name='coding_jobs'", @@ -40,7 +43,7 @@ export function activeRuns(root: string): number { ? Number( db .prepare( - "SELECT count(*) AS count FROM coding_jobs WHERE status IN ('starting','running') OR (status IN ('blocked','review') AND lastWorkerState NOT IN ('not_started','missing'))", + "SELECT count(*) AS count FROM coding_jobs WHERE status IN ('starting','running') OR (status IN ('blocked','review') AND (lastWorkerState IS NULL OR lastWorkerState != 'not_started'))", ) .get()?.count ?? 0, ) @@ -51,7 +54,7 @@ export function activeRuns(root: string): number { } } -export async function withLock( +async function withLegacyLock( root: string, action: () => Promise, ): Promise { @@ -79,3 +82,12 @@ export async function withLock( export async function readJson(path: string): Promise { return JSON.parse(await readFile(path, "utf8")) as T; } + +// Keep the legacy exclusion file as well: older binaries know nothing about flock. +// Enrollment must retain a permanent sentinel before routing clients to a helper. +export async function withLock( + root: string, + action: () => Promise, +): Promise { + return withKernelLock(root, () => withLegacyLock(root, action)); +} diff --git a/src/components/update-setting.tsx b/src/components/update-setting.tsx new file mode 100644 index 0000000..a644a50 --- /dev/null +++ b/src/components/update-setting.tsx @@ -0,0 +1,149 @@ +import * as stylex from "@stylexjs/stylex"; +import { useEffect, useState } from "react"; +import { colors } from "../styles/tokens.stylex"; +import type { Capability } from "../updater/contract"; +import type { Offer } from "../updater/releases"; +import { Button } from "./ui/button"; + +type Status = { + capability: Capability; + version: string; + latest: Offer | null; + canCheck: boolean; + csrf: string | null; + recent: boolean; +}; + +export function UpdateSetting() { + const [status, setStatus] = useState(null); + const [message, setMessage] = useState("Loading update availability…"); + const [checking, setChecking] = useState(false); + useEffect(() => { + const abort = new AbortController(); + fetch("/api/updates", { cache: "no-store", signal: abort.signal }) + .then(async (response) => { + if (!response.ok) + throw new Error( + "Could not load update availability. Sign in or reload to retry.", + ); + return (await response.json()) as Status; + }) + .then((value) => { + setStatus(value); + setMessage(""); + }) + .catch(() => { + if (!abort.signal.aborted) + setMessage( + "Could not load update availability. Sign in or reload to retry.", + ); + }); + return () => abort.abort(); + }, []); + async function check() { + if (!status?.csrf || checking) return; + setChecking(true); + setMessage("Checking published releases…"); + try { + const response = await fetch("/api/updates/check", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Roost-CSRF": status.csrf, + }, + body: "{}", + signal: AbortSignal.timeout(20000), + }); + const result = (await response.json()) as { + latest?: Offer; + error?: string; + }; + if (!response.ok || !result.latest) + throw new Error(result.error ?? "Could not check releases."); + setStatus({ ...status, latest: result.latest }); + setMessage( + "Release metadata checked. Activation compatibility has not been verified.", + ); + } catch (error) { + setMessage( + error instanceof Error + ? error.message + : "Could not check releases. Try again.", + ); + } finally { + setChecking(false); + } + } + return ( +
+

Software updates

+ {status && ( + <> +

+ Running version:{" "} + + {status.version === "dev" ? "Source build" : status.version} + +

+

{status.capability.reason}

+ {status.latest && ( + <> +

+ Latest published stable release:{" "} + {status.latest.version} +

+

+ Checked {new Date(status.latest.checkedAt).toLocaleString()}. + Compatibility is not yet verified. +

+
+ Release notes +

+ {status.latest.notes || "No release notes provided."} +

+
+ + )} + + {!status.canCheck && ( +

+ Release checks require a packaged installation with a configured + repository and native passkey sign-in. +

+ )} + {status.canCheck && !status.recent && ( +

+ Sign in again to check for updates. +

+ )} +

+ UI installation and restart are not enabled in this build. Updates + require an outage; external actions cannot be undone. +

+ + )} +

+ {message} +

+
+ ); +} +const styles = stylex.create({ + card: { + padding: 20, + borderWidth: 1, + borderStyle: "solid", + borderColor: colors.border, + borderRadius: 12, + backgroundColor: colors.surface, + overflowWrap: "anywhere", + }, + title: { marginTop: 0, fontSize: 18 }, + muted: { color: colors.muted, fontSize: 14 }, + notes: { whiteSpace: "pre-wrap" }, +}); diff --git a/src/features/settings/navigation.ts b/src/features/settings/navigation.ts index 61146d8..8637e54 100644 --- a/src/features/settings/navigation.ts +++ b/src/features/settings/navigation.ts @@ -14,6 +14,11 @@ export const settingsGroups = [ label: "Account & security", description: "Codex sign-in and access to Roost.", }, + { + id: "updates", + label: "Updates", + description: "Software version, release checks, and update availability.", + }, ] as const; export type SettingsGroup = (typeof settingsGroups)[number]["id"]; @@ -25,6 +30,12 @@ export function readSettingsGroup(value: unknown): SettingsGroup { // Index the controls and their vocabulary, including options revealed by another // setting. Keep related controls together so their dependencies remain clear. export const settingsEntries = [ + { + id: "updates", + group: "updates", + terms: + "Software update upgrade release version restart recovery installation systemd setup externally managed", + }, { id: "theme", group: "appearance", diff --git a/src/routes/settings.tsx b/src/routes/settings.tsx index bc56c4e..9b802a4 100644 --- a/src/routes/settings.tsx +++ b/src/routes/settings.tsx @@ -12,6 +12,7 @@ import { PasskeySetting } from "../components/passkey-setting"; import { PushNotifications } from "../components/push-notifications"; import { ThemeSetting } from "../components/theme-setting"; import { Button } from "../components/ui/button"; +import { UpdateSetting } from "../components/update-setting"; import { getCodexAccount, getCodexLogin } from "../features/auth/functions"; import { getPushSettings } from "../features/notifications/functions"; import { @@ -164,6 +165,9 @@ function SettingsPage() { +

Looking for an agent’s model, instructions, or automations? Open that agent to manage its settings. diff --git a/src/server.ts b/src/server.ts index 652f711..820e03e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -9,12 +9,20 @@ import { nativeAuthEnabled } from "./server/auth/store.server"; import { compressHtml } from "./server/html-compression.server"; import { followStartupRedirect } from "./server/startup-response.server"; +import { updatesRequest } from "./server/updates.server"; + const handler = createStartHandler(defaultStreamHandler); export default createServerEntry({ async fetch(request, options) { const auth = await authGate(request, authPage); if (auth) return auth; + if ( + ["/api/updates", "/api/updates/check"].includes( + new URL(request.url).pathname, + ) + ) + return updatesRequest(request); const response = await followStartupRedirect( request, await handler(request, options), diff --git a/src/server/runs/store.server.ts b/src/server/runs/store.server.ts index a455841..abde7d4 100644 --- a/src/server/runs/store.server.ts +++ b/src/server/runs/store.server.ts @@ -330,7 +330,7 @@ export const claimSteeringRun = (run: Run) => (db) => db .prepare( - "UPDATE runs SET status='steering',owner=?,startedAt=?,threadId=(SELECT threadId FROM runs WHERE id=?) WHERE id=(SELECT q.id FROM runs q WHERE q.agentId=? AND q.kind='chat' AND q.status='queued' AND q.cancelRequested=0 AND EXISTS (SELECT 1 FROM runs r WHERE r.id=? AND r.owner=? AND r.status='running' AND r.kind IN ('chat','handoff') AND r.cancelRequested=0) AND EXISTS (SELECT 1 FROM worker_lease WHERE owner=? AND heartbeat>?) ORDER BY q.createdAt,q.rowid LIMIT 1) RETURNING *", + "UPDATE runs SET status='steering',owner=?,startedAt=?,threadId=(SELECT threadId FROM runs WHERE id=?) WHERE id=(SELECT q.id FROM runs q WHERE q.agentId=? AND q.kind='chat' AND q.status='queued' AND (SELECT maintenance FROM runtime_control WHERE id=1)=0 AND q.cancelRequested=0 AND EXISTS (SELECT 1 FROM runs r WHERE r.id=? AND r.owner=? AND r.status='running' AND r.kind IN ('chat','handoff') AND r.cancelRequested=0) AND EXISTS (SELECT 1 FROM worker_lease WHERE owner=? AND heartbeat>?) ORDER BY q.createdAt,q.rowid LIMIT 1) RETURNING *", ) .get( run.owner, diff --git a/src/server/updates.server.ts b/src/server/updates.server.ts new file mode 100644 index 0000000..89c3046 --- /dev/null +++ b/src/server/updates.server.ts @@ -0,0 +1,119 @@ +import { randomBytes } from "node:crypto"; +import { existsSync } from "node:fs"; +import { readFile, realpath } from "node:fs/promises"; +import { join } from "node:path"; +import { capability } from "../updater/contract"; +import { ReleaseChecker } from "../updater/releases"; +import { authorizeMutation, csrfToken, updateBody } from "../updater/security"; +import { sessionId } from "./auth/session.server"; +import { openAuth } from "./auth/store.server"; + +const secret = randomBytes(32).toString("hex"); +let checker: ReleaseChecker | undefined; +const json = (value: unknown, status = 200) => + Response.json(value, { + status, + headers: { + "Cache-Control": "private, no-store", + "X-Content-Type-Options": "nosniff", + }, + }); + +async function installation() { + // ROOST_HOME alone is also present in agent/source environments. The packaged + // launcher supplies the version and fixes DATA_DIR; require both identities. + const root = process.env.ROOST_HOME; + if ( + !root || + !process.env.ROOST_RELEASE_VERSION || + process.env.ROOST_DATA_DIR !== join(root, "data") + ) + return { packaged: false, repository: undefined }; + try { + const c = JSON.parse(await readFile(join(root, "config.json"), "utf8")) as { + root?: string; + uid?: number; + repository?: string; + }; + if (c.root !== (await realpath(root)) || c.uid !== process.getuid?.()) + return { packaged: false, repository: undefined }; + return { packaged: true, repository: c.repository }; + } catch { + return { packaged: false, repository: undefined }; + } +} + +/** Phase-one status only. The activation route deliberately has no command, + * spawn, filesystem mutation, enrollment, or fallback to the legacy CLI. */ +export async function updatesRequest(request: Request) { + const facts = await installation(); + const status = capability({ + ...facts, + platform: process.platform, + arch: process.arch, + systemd: existsSync("/run/systemd/system"), + }); + const auth = openAuth(); + try { + const session = auth?.session(sessionId(request)); + if ( + auth && + (!session || + new URL(request.url).host !== new URL(auth.config().origin).host) + ) + return json({ error: "Native sign-in required." }, 401); + if (facts.repository && checker?.repository !== facts.repository) + checker = new ReleaseChecker(facts.repository); + const url = new URL(request.url); + if (request.method === "GET" && url.pathname === "/api/updates") { + return json({ + capability: status, + version: facts.packaged ? process.env.ROOST_RELEASE_VERSION : "dev", + latest: session ? (checker?.cached ?? null) : null, + canCheck: Boolean(session && facts.repository), + csrf: session ? csrfToken(secret, session.id) : null, + recent: Boolean(session && session.created >= Date.now() - 5 * 60_000), + }); + } + if (request.method !== "POST") + return json({ error: "Method not allowed." }, 405); + if (!auth || !session) + return json({ error: "Native passkey sign-in required." }, 401); + try { + authorizeMutation(request, { + origin: auth.config().origin, + session, + secret, + }); + await updateBody(request, []); + } catch { + return json( + { error: "Sign in again and retry this request from Settings." }, + 403, + ); + } + if (url.pathname === "/api/updates/check") { + if (!facts.repository || !checker) + return json( + { error: "No packaged release repository is configured." }, + 409, + ); + if (!auth.limit("updates-check", 2)) + return json({ error: "Wait a minute before checking again." }, 429); + try { + return json({ latest: await checker.check() }); + } catch { + return json( + { + error: + "Could not check releases. Check network and configured repository access, then retry in a minute.", + }, + 503, + ); + } + } + return json({ error: status.reason }, 409); + } finally { + auth?.close(); + } +} diff --git a/src/updater/contract.ts b/src/updater/contract.ts new file mode 100644 index 0000000..a485bb9 --- /dev/null +++ b/src/updater/contract.ts @@ -0,0 +1,109 @@ +/** This protocol is independent of the application release/bundle schema. */ +export const updaterProtocol = 1; +export const stableVersion = + /^(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})(?![\s\S])/; + +export function compareVersions(a: string, b: string) { + if (!stableVersion.test(a) || !stableVersion.test(b)) + throw new Error("Invalid stable version."); + const left = a.split(".").map(Number); + const right = b.split(".").map(Number); + for (let i = 0; i < 3; i++) { + if (left[i] !== right[i]) return left[i]! > right[i]! ? 1 : -1; + } + return 0; +} + +export type Compatibility = { + protocol: 1; + app: { min: number; max: number; output: number }; + auth: { min: number; max: number; output: number }; + data: "complete-snapshot-v1"; + externalState: "unchanged"; + codex: string; +}; + +export function compatibility(value: unknown): Compatibility { + const c = value as Compatibility; + const range = (r: Compatibility["app"]) => + r && + [r.min, r.max, r.output].every( + (n) => Number.isSafeInteger(n) && n >= 0 && n <= 10000, + ) && + r.min <= r.max && + r.output >= r.max; + if ( + !c || + c.protocol !== updaterProtocol || + !range(c.app) || + !range(c.auth) || + c.data !== "complete-snapshot-v1" || + c.externalState !== "unchanged" || + !stableVersion.test(c.codex) + ) + throw new Error("Release has no supported update compatibility contract."); + return c; +} + +export function assertCompatible( + value: unknown, + installed: { app: number; auth: number; codex: string }, +) { + const c = compatibility(value); + if ( + installed.app < c.app.min || + installed.app > c.app.max || + installed.auth < c.auth.min || + installed.auth > c.auth.max || + installed.codex !== c.codex + ) + throw new Error( + "Database or bundled Codex compatibility requires terminal maintenance.", + ); + return c; +} + +export type Capability = { + code: + | "externally-managed" + | "unsupported-platform" + | "unsupported-service-manager" + | "setup-required" + | "qualification-required"; + reason: string; + canActivate: false; +}; + +export function capability(facts: { + packaged: boolean; + platform: string; + arch: string; + systemd: boolean; +}): Capability { + if (!facts.packaged) + return { + code: "externally-managed", + reason: + "This source or orchestrated installation is externally managed. Update it through its deployment workflow.", + canActivate: false, + }; + if (facts.platform !== "linux" || facts.arch !== "x64") + return { + code: "unsupported-platform", + reason: "UI updates initially require a packaged Linux x64 installation.", + canActivate: false, + }; + if (!facts.systemd) + return { + code: "unsupported-service-manager", + reason: + "This installation does not have the required systemd supervisor.", + canActivate: false, + }; + return { + code: "qualification-required", + reason: + "This build does not include updater enrollment or activation. Supervised recovery still requires implementation and lifecycle qualification. Continue using operator-managed updates.", + canActivate: false, + }; +} diff --git a/src/updater/journal.ts b/src/updater/journal.ts new file mode 100644 index 0000000..7becdd3 --- /dev/null +++ b/src/updater/journal.ts @@ -0,0 +1,169 @@ +import { randomUUID } from "node:crypto"; +import { constants } from "node:fs"; +import { mkdir, open, rename, rm } from "node:fs/promises"; +import { dirname, join } from "node:path"; + +export const phases = [ + "accepted", + "staged", + "draining", + "stopping", + "snapshot-complete", + "activating", + "verifying", + "committed", + "restoring", + "rolled-back", + "succeeded", + "cancelled", + "deferred", + "failed", + "manual-recovery", +] as const; +export type Phase = (typeof phases)[number]; +export type Journal = { + protocol: 1; + id: string; + sequence: number; + phase: Phase; + previous: string; + candidate: string; + wasRunning: boolean; + snapshotDigest?: string; + updatedAt: number; +}; +export const operationId = + /^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}(?![\s\S])/; +const version = + /^(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})(?![\s\S])/; + +export async function syncDirectory(path: string) { + const fd = await open(path, constants.O_RDONLY | constants.O_DIRECTORY); + try { + await fd.sync(); + } finally { + await fd.close(); + } +} + +export async function durableJson(path: string, value: unknown) { + const temporary = `${path}.${randomUUID()}.tmp`; + const fd = await open(temporary, "wx", 0o600); + try { + await fd.writeFile(`${JSON.stringify(value)}\n`); + await fd.sync(); + } finally { + await fd.close(); + } + try { + await rename(temporary, path); + await syncDirectory(dirname(path)); + } finally { + await rm(temporary, { force: true }); + } +} + +export function validateJournal(value: unknown): Journal { + const j = value as Journal; + if ( + j?.protocol !== 1 || + !operationId.test(j.id) || + !Number.isSafeInteger(j.sequence) || + j.sequence < 1 || + !phases.includes(j.phase) || + !version.test(j.previous) || + !version.test(j.candidate) || + j.previous === j.candidate || + typeof j.wasRunning !== "boolean" || + !Number.isSafeInteger(j.updatedAt) || + (j.snapshotDigest !== undefined && !/^[a-f0-9]{64}$/.test(j.snapshotDigest)) + ) + throw new Error("Invalid update journal; manual recovery required."); + if ( + [ + "snapshot-complete", + "activating", + "verifying", + "committed", + "restoring", + "rolled-back", + "succeeded", + ].includes(j.phase) && + !j.snapshotDigest + ) + throw new Error("Update journal has no complete snapshot evidence."); + return j; +} + +export async function readJournal(root: string, id: string) { + if (!operationId.test(id)) throw new Error("Invalid operation ID."); + const fd = await open( + join(root, "updates", id, "journal.json"), + constants.O_RDONLY | constants.O_NOFOLLOW, + ); + try { + const stat = await fd.stat(); + if (!stat.isFile() || stat.size > 16384 || (stat.mode & 0o077) !== 0) + throw new Error("Unsafe update journal; manual recovery required."); + const journal = validateJournal(JSON.parse(await fd.readFile("utf8"))); + if (journal.id !== id) throw new Error("Update journal identity mismatch."); + return journal; + } finally { + await fd.close(); + } +} + +export async function writeJournal(root: string, journal: Journal) { + validateJournal(journal); + const directory = join(root, "updates", journal.id); + await mkdir(dirname(directory), { recursive: true, mode: 0o700 }); + await syncDirectory(root); + try { + await mkdir(directory, { mode: 0o700 }); + if (journal.sequence !== 1) + throw new Error("Initial journal sequence must be one."); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; + const previous = await readJournal(root, journal.id); + if ( + journal.sequence !== previous.sequence + 1 || + journal.previous !== previous.previous || + journal.candidate !== previous.candidate || + journal.wasRunning !== previous.wasRunning || + (previous.snapshotDigest && + journal.snapshotDigest !== previous.snapshotDigest) || + (["committed", "succeeded"].includes(previous.phase) && + !["committed", "succeeded", "manual-recovery"].includes(journal.phase)) + ) + throw new Error("Conflicting update journal transition."); + } + await syncDirectory(dirname(directory)); + await durableJson(join(directory, "journal.json"), journal); +} + +/** A recovery plan is deliberately conservative and never infers commit from a + * symlink or from an app answering health requests. Execute under kernel lock. */ +export function recoveryPlan(journal: Journal) { + validateJournal(journal); + switch (journal.phase) { + case "accepted": + case "staged": + case "draining": + return "preserve-old"; + case "stopping": + return "probe-old-behind-gate"; + case "snapshot-complete": + case "activating": + case "verifying": + case "restoring": + return "restore-matching-pair"; + case "committed": + return "finish-commit-never-restore"; + case "rolled-back": + return "finish-rollback"; + case "manual-recovery": + return "manual-recovery"; + default: + return "terminal"; + } +} diff --git a/src/updater/lock.ts b/src/updater/lock.ts new file mode 100644 index 0000000..a35ee5f --- /dev/null +++ b/src/updater/lock.ts @@ -0,0 +1,45 @@ +import { spawn } from "node:child_process"; +import { constants } from "node:fs"; +import { mkdir, open } from "node:fs/promises"; +import { join } from "node:path"; + +/** flock locks the inherited open file description; the parent's fd owns it + * after flock exits. Closing that fd (including process death) releases it. + * Never unlink this file: doing so would create two independent lock domains. */ +export async function withKernelLock( + root: string, + action: () => Promise, +) { + await mkdir(root, { recursive: true, mode: 0o700 }); + const fd = await open( + join(root, "updater.lock"), + constants.O_RDWR | constants.O_CREAT | constants.O_NOFOLLOW, + 0o600, + ); + try { + const info = await fd.stat(); + if ( + !info.isFile() || + info.nlink !== 1 || + info.uid !== process.getuid?.() || + (info.mode & 0o077) !== 0 + ) + throw new Error("Unsafe installation lock."); + await new Promise((resolve, reject) => { + const child = spawn("flock", ["--exclusive", "--nonblock", "3"], { + stdio: ["ignore", "ignore", "ignore", fd.fd], + }); + child.once("error", reject); + child.once("exit", (code) => + code === 0 + ? resolve() + : reject( + new Error("Another Roost installation operation is active."), + ), + ); + }); + return await action(); + } finally { + await fd.close(); + } +} diff --git a/src/updater/releases.ts b/src/updater/releases.ts new file mode 100644 index 0000000..976c824 --- /dev/null +++ b/src/updater/releases.ts @@ -0,0 +1,215 @@ +import { createHash } from "node:crypto"; +import { compareVersions, stableVersion } from "./contract"; + +export type Offer = { + id: string; + repository: string; + releaseId: number; + assetId: number; + version: string; + digest: string; + size: number; + notes: string; + checkedAt: number; + expiresAt: number; +}; +const repositoryPattern = + /^[A-Za-z0-9][A-Za-z0-9-]{0,38}\/[A-Za-z0-9_.-]{1,100}(?![\s\S])/; +export const maxArchiveBytes = 512 * 1024 * 1024; + +export function validateRepository(repository: string) { + if ( + !repositoryPattern.test(repository) || + [".", ".."].includes(repository.split("/")[1]!) + ) + throw new Error("Invalid configured release repository."); +} + +export async function boundedBytes(response: Response, maximum: number) { + if (!response.body) throw new Error("Empty release response."); + const advertised = response.headers.get("content-length"); + if ( + advertised && + (!/^\d+$/.test(advertised) || Number(advertised) > maximum) + ) { + await response.body.cancel(); + throw new Error("Release response exceeds its size limit."); + } + const reader = response.body.getReader(); + let expired = false; + const timeout = setTimeout(() => { + expired = true; + void reader.cancel("Response read deadline exceeded.").catch(() => {}); + }, 15000); + const chunks: Uint8Array[] = []; + let size = 0; + try { + while (true) { + const { value, done } = await reader.read(); + if (expired) throw new Error("Response read deadline exceeded."); + if (done) break; + size += value.length; + if (size > maximum) + throw new Error("Release response exceeds its size limit."); + chunks.push(value); + } + return Buffer.concat(chunks, size); + } finally { + clearTimeout(timeout); + await reader.cancel().catch(() => {}); + reader.releaseLock(); + } +} + +export function parseOffer( + value: unknown, + repository: string, + now: number, +): Offer { + validateRepository(repository); + const release = value as { + id: number; + tag_name: string; + draft: boolean; + prerelease: boolean; + body?: string; + assets: { + id: number; + name: string; + size: number; + digest: string; + url: string; + }[]; + }; + const version = + typeof release?.tag_name === "string" ? release.tag_name.slice(1) : ""; + if ( + release?.draft !== false || + release.prerelease !== false || + !Number.isSafeInteger(release.id) || + release.id <= 0 || + release.tag_name !== `v${version}` || + !stableVersion.test(version) || + !Array.isArray(release.assets) || + release.assets.length > 100 + ) + throw new Error("Release is not a published stable version."); + const matches = release.assets.filter( + (a) => a?.name === "roost-linux-x64.tar.gz", + ); + const asset = matches[0]; + if ( + matches.length !== 1 || + !asset || + !Number.isSafeInteger(asset.id) || + asset.id <= 0 || + !Number.isSafeInteger(asset.size) || + asset.size <= 0 || + asset.size > maxArchiveBytes || + !/^sha256:[a-f0-9]{64}$/.test(asset.digest) || + asset.url !== + `https://api.github.com/repos/${repository}/releases/assets/${asset.id}` + ) + throw new Error( + "Release has no unambiguous bounded Linux x64 artifact with a SHA-256 digest.", + ); + const identity = { + repository, + releaseId: release.id, + assetId: asset.id, + version, + digest: asset.digest, + size: asset.size, + }; + const expiresAt = now + 15 * 60_000; + return { + ...identity, + id: createHash("sha256") + .update(JSON.stringify({ ...identity, expiresAt })) + .digest("hex"), + notes: typeof release.body === "string" ? release.body.slice(0, 16000) : "", + checkedAt: now, + expiresAt, + }; +} + +/** One bounded cache per configured installation, no browser-controlled sources. + * ETags are sent only to the GitHub API; authorization never follows redirects. */ +export class ReleaseChecker { + private cache?: { offer: Offer; etag: string | null }; + private nextCheck = 0; + private pending?: Promise; + constructor( + readonly repository: string, + private readonly fetcher: typeof fetch = fetch, + private readonly token?: string, + private readonly clock = Date.now, + ) { + validateRepository(repository); + } + + get cached() { + return this.cache?.offer; + } + + check(): Promise { + if (this.pending) return this.pending; + if (this.clock() < this.nextCheck) + return Promise.reject(new Error("Wait a minute before checking again.")); + this.nextCheck = this.clock() + 60_000; + this.pending = this.lookup().finally(() => { + this.pending = undefined; + }); + return this.pending; + } + + private async lookup() { + const headers: Record = { + Accept: "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", + ...(this.token ? { Authorization: `Bearer ${this.token}` } : {}), + ...(this.cache?.etag ? { "If-None-Match": this.cache.etag } : {}), + }; + const response = await this.fetcher( + `https://api.github.com/repos/${this.repository}/releases/latest`, + { + headers, + redirect: "error", + signal: AbortSignal.timeout(15000), + }, + ); + if (response.status === 304 && this.cache) { + // Retain the pinned offer identity/expiry; a 304 does not renew authorization. + this.cache.offer = { ...this.cache.offer, checkedAt: this.clock() }; + return this.cache.offer; + } + if (!response.ok) { + await response.body?.cancel(); + throw new Error( + `Release check failed (HTTP ${response.status}). Check network and configured repository access.`, + ); + } + const value: unknown = JSON.parse( + (await boundedBytes(response, 2 * 1024 * 1024)).toString("utf8"), + ); + const offer = parseOffer(value, this.repository, this.clock()); + this.cache = { offer, etag: response.headers.get("etag") }; + return offer; + } +} + +export function assertOffer( + offer: Offer, + approvedId: string, + installedVersion: string, + now = Date.now(), +) { + if ( + offer.id !== approvedId || + offer.expiresAt <= now || + compareVersions(offer.version, installedVersion) <= 0 + ) + throw new Error( + "Offer expired, changed, or is not a newer version. Check again.", + ); +} diff --git a/src/updater/security.ts b/src/updater/security.ts new file mode 100644 index 0000000..a635a16 --- /dev/null +++ b/src/updater/security.ts @@ -0,0 +1,52 @@ +import { createHmac, timingSafeEqual } from "node:crypto"; +import { boundedBytes } from "./releases"; + +export function csrfToken(secret: string, session: string) { + return createHmac("sha256", secret) + .update(`roost-update-v1:${session}`) + .digest("hex"); +} + +export function authorizeMutation( + request: Request, + context: { + origin: string; + session: { id: string; created: number } | undefined; + secret: string; + now?: number; + }, +) { + const { session, origin, secret, now = Date.now() } = context; + if (!session || session.created < now - 5 * 60_000 || session.created > now) + throw new Error("Recent native passkey authentication required."); + if ( + request.method !== "POST" || + new URL(request.url).host !== new URL(origin).host || + request.headers.get("origin") !== origin || + request.headers.get("sec-fetch-site") === "cross-site" || + request.headers.get("content-type")?.split(";")[0] !== "application/json" + ) + throw new Error("Invalid update request origin or content type."); + const supplied = request.headers.get("x-roost-csrf") ?? ""; + const expected = csrfToken(secret, session.id); + if ( + !/^[a-f0-9]{64}$/.test(supplied) || + !timingSafeEqual(Buffer.from(supplied), Buffer.from(expected)) + ) + throw new Error("Invalid update CSRF token."); +} + +export async function updateBody(request: Request, allowed: readonly string[]) { + const response = new Response(request.body, { headers: request.headers }); + const value: unknown = JSON.parse( + (await boundedBytes(response, 2048)).toString("utf8"), + ); + if ( + !value || + typeof value !== "object" || + Array.isArray(value) || + Object.keys(value).some((key) => !allowed.includes(key)) + ) + throw new Error("Unexpected update fields."); + return value as Record; +} diff --git a/src/updater/snapshot.ts b/src/updater/snapshot.ts new file mode 100644 index 0000000..61fb649 --- /dev/null +++ b/src/updater/snapshot.ts @@ -0,0 +1,209 @@ +import { createHash } from "node:crypto"; +import { createReadStream } from "node:fs"; +import { + chmod, + cp, + lstat, + mkdir, + open, + readdir, + readFile, + realpath, + statfs, +} from "node:fs/promises"; +import { dirname, join, relative, resolve } from "node:path"; +import { DatabaseSync } from "node:sqlite"; +import { durableJson, operationId, syncDirectory } from "./journal"; + +type Entry = { + path: string; + kind: "file" | "directory"; + size: number; + mode: number; + digest?: string; +}; +export type Snapshot = { + schema: 1; + entries: Entry[]; + digest: string; + bytes: number; +}; +const maximumFiles = 250000; + +async function hashFile(path: string) { + const hash = createHash("sha256"); + for await (const chunk of createReadStream(path)) hash.update(chunk); + return hash.digest("hex"); +} +const manifestDigest = (entries: Entry[]) => + createHash("sha256").update(JSON.stringify(entries)).digest("hex"); + +/** Complete managed data only. Initial contract refuses symlinks, hard links, + * device files, and mounts, instead of silently excluding mutable state. The + * supervisor must first prove all writers stopped; a scan is not that proof. */ +async function scan(directory: string): Promise { + const root = await realpath(directory); + if (root !== resolve(directory)) + throw new Error("Snapshot data path must be canonical."); + const rootStat = await lstat(root); + if (!rootStat.isDirectory()) + throw new Error("Snapshot data is not a directory."); + const mounts = await readFile("/proc/self/mountinfo", "utf8"); + const decode = (path: string) => + path.replace(/\\([0-7]{3})/g, (_, octal: string) => + String.fromCharCode(Number.parseInt(octal, 8)), + ); + for (const line of mounts.trim().split("\n")) { + const mount = decode(line.split(" ")[4] ?? ""); + if (mount === root || mount.startsWith(`${root}/`)) + throw new Error("Mounted data requires operator-managed backup."); + } + const entries: Entry[] = []; + let bytes = 0; + async function visit(path: string) { + const info = await lstat(path); + if ( + info.dev !== rootStat.dev || + info.isSymbolicLink() || + (!info.isDirectory() && !info.isFile()) || + (info.isFile() && info.nlink !== 1) + ) + throw new Error( + "Unsupported link, mount, or special file in managed data.", + ); + if (entries.length >= maximumFiles) + throw new Error("Snapshot file count limit exceeded."); + const entry: Entry = { + path: relative(root, path), + kind: info.isDirectory() ? "directory" : "file", + size: info.isFile() ? info.size : 0, + mode: info.mode & 0o700, + }; + if (info.isFile()) { + entry.digest = await hashFile(path); + bytes += info.size; + } + entries.push(entry); + if (info.isDirectory()) + for (const child of (await readdir(path)).sort()) + await visit(join(path, child)); + } + await visit(root); + return { schema: 1, entries, digest: manifestDigest(entries), bytes }; +} + +export async function requireHeadroom( + root: string, + bytes: number, + files: number, + staging = 0, +) { + const free = await statfs(root, { bigint: true }); + if ( + ![bytes, files, staging].every( + (value) => Number.isSafeInteger(value) && value >= 0, + ) + ) + throw new Error("Invalid capacity estimate."); + if ( + free.bavail * free.bsize < + BigInt(bytes) * 3n + BigInt(staging) + 128n * 1024n * 1024n || + free.ffree < BigInt(files) * 3n + 1024n + ) + throw new Error( + "Insufficient free space or inodes for snapshot and recovery.", + ); +} + +function integrity(directory: string) { + for (const name of ["roost.sqlite", "auth.sqlite"]) { + const path = join(directory, name); + // Both stores are required for the native-auth update contract. + const db = new DatabaseSync(path, { readOnly: true }); + try { + if ( + db + .prepare("PRAGMA integrity_check") + .all() + .some((row) => row.integrity_check !== "ok") + ) + throw new Error("Snapshot database integrity check failed."); + } finally { + db.close(); + } + } +} + +export async function createSnapshot(root: string, id: string) { + if (!operationId.test(id)) throw new Error("Invalid operation ID."); + const source = join(root, "data"); + const before = await scan(source); + await requireHeadroom(root, before.bytes, before.entries.length); + const directory = join(root, "updates", id); + await mkdir(directory, { recursive: true, mode: 0o700 }); + const snapshot = join(directory, "snapshot"); + await mkdir(snapshot, { mode: 0o700 }); // Existing/partial snapshot is never reused. + for (const child of await readdir(source)) { + await cp(join(source, child), join(snapshot, child), { + recursive: true, + dereference: false, + preserveTimestamps: true, + force: false, + errorOnExist: true, + }); + } + // Copy permissions are deliberately reduced to owner-only access. Original + // owner executable bits remain, but secrets never become group/world readable. + for (const entry of before.entries) { + const target = join(snapshot, entry.path); + await chmod(target, entry.mode); + const fd = await open(target, "r"); + try { + await fd.sync(); + } finally { + await fd.close(); + } + } + integrity(snapshot); + const copied = await scan(snapshot); + const after = await scan(source); + if (copied.digest !== before.digest || after.digest !== before.digest) + throw new Error( + "Managed data changed during snapshot; writers are not quiescent.", + ); + await durableJson(join(directory, "snapshot.json"), copied); + await syncDirectory(directory); + await syncDirectory(dirname(directory)); + return copied.digest; +} + +export async function verifySnapshot( + root: string, + id: string, + expected: string, +) { + if (!operationId.test(id) || !/^[a-f0-9]{64}$/.test(expected)) + throw new Error("Invalid snapshot identity."); + const directory = join(root, "updates", id); + const fd = await open(join(directory, "snapshot.json"), "r"); + let value: Snapshot; + try { + if ((await fd.stat()).size > 64 * 1024 * 1024) + throw new Error("Snapshot manifest too large."); + value = JSON.parse(await fd.readFile("utf8")) as Snapshot; + } finally { + await fd.close(); + } + if ( + value.schema !== 1 || + value.digest !== expected || + !Array.isArray(value.entries) || + manifestDigest(value.entries) !== expected + ) + throw new Error("Snapshot manifest does not match the journal."); + integrity(join(directory, "snapshot")); + const actual = await scan(join(directory, "snapshot")); + if (actual.digest !== expected) + throw new Error("Snapshot data failed digest verification."); + return actual; +} diff --git a/tests/releases.test.ts b/tests/releases.test.ts index d51dc08..e88a055 100644 --- a/tests/releases.test.ts +++ b/tests/releases.test.ts @@ -54,7 +54,7 @@ test("update work detection includes resumable coding jobs and supports older da ["review", "idle", 1], ["queued", "unknown", 0], ["blocked", "not_started", 0], - ["blocked", "missing", 0], + ["blocked", "missing", 1], ["completed", "idle", 0], ["cancelled", "idle", 0], ["failed", "unknown", 0], diff --git a/tests/settings-navigation.test.ts b/tests/settings-navigation.test.ts index 02d74a4..de40e17 100644 --- a/tests/settings-navigation.test.ts +++ b/tests/settings-navigation.test.ts @@ -15,6 +15,7 @@ test("unknown settings groups fall back to appearance", () => { test("search finds existing controls, conditional options, and vocabulary across groups", () => { const cases = [ + ["software update", "updates"], [" THINKING summaries ", "conversation"], ["tool inputs", "conversation"], ["messages", "conversation"], @@ -51,7 +52,7 @@ test("search finds existing controls, conditional options, and vocabulary across findSettings("codex").map((entry) => entry.id), ["conversation", "account"], ); - assert.equal(findSettings(" \n ").length, 5); + assert.equal(findSettings(" \n ").length, 6); assert.equal(findSettings("nothing-matches-this").length, 0); assert.equal(findSettings("passkeys trackers").length, 0); }); diff --git a/tests/steering.test.ts b/tests/steering.test.ts index a50f4e1..32a1d9e 100644 --- a/tests/steering.test.ts +++ b/tests/steering.test.ts @@ -200,6 +200,23 @@ test("finished turns leave pending messages queued; ownership and restart recove await run(claimSteeringRun({ ...first, owner: "foreign" })), undefined, ); + await run( + withAgentStore((db) => + db.prepare("UPDATE runtime_control SET maintenance=1 WHERE id=1").run(), + ), + ); + assert.equal(await run(claimSteeringRun(first)), undefined); + assert.equal( + (await run(listRuns(agentId))).find( + (entry) => entry.id === second.messageId, + )?.status, + "queued", + ); + await run( + withAgentStore((db) => + db.prepare("UPDATE runtime_control SET maintenance=0 WHERE id=1").run(), + ), + ); await run(finishRun(first, "completed", [])); assert.equal(await run(claimSteeringRun(first)), undefined); const next = (await run(claimRun("owner")))!; diff --git a/tests/ui-updates.test.ts b/tests/ui-updates.test.ts new file mode 100644 index 0000000..ba90a2e --- /dev/null +++ b/tests/ui-updates.test.ts @@ -0,0 +1,443 @@ +import assert from "node:assert/strict"; +import { spawn } from "node:child_process"; +import { randomUUID } from "node:crypto"; +import { once } from "node:events"; +import { + chmod, + mkdir, + mkdtemp, + readFile, + rm, + symlink, + writeFile, +} from "node:fs/promises"; +import { join } from "node:path"; +import { DatabaseSync } from "node:sqlite"; +import { test } from "node:test"; +import { activeRuns, withLock } from "../src/cli/state"; +import { updatesRequest } from "../src/server/updates.server"; +import { + assertCompatible, + capability, + compareVersions, +} from "../src/updater/contract"; +import { + type Journal, + phases, + readJournal, + recoveryPlan, + writeJournal, +} from "../src/updater/journal"; +import { withKernelLock } from "../src/updater/lock"; +import { + assertOffer, + boundedBytes, + parseOffer, + ReleaseChecker, +} from "../src/updater/releases"; +import { + authorizeMutation, + csrfToken, + updateBody, +} from "../src/updater/security"; +import { + createSnapshot, + requireHeadroom, + verifySnapshot, +} from "../src/updater/snapshot"; + +const metadata = () => ({ + id: 2, + tag_name: "v0.2.0", + draft: false, + prerelease: false, + body: "", + assets: [ + { + id: 3, + name: "roost-linux-x64.tar.gz", + digest: `sha256:${"a".repeat(64)}`, + size: 1234, + url: "https://api.github.com/repos/srctl/roost/releases/assets/3", + }, + ], +}); +const contract = { + protocol: 1, + app: { min: 10, max: 10, output: 10 }, + auth: { min: 0, max: 0, output: 0 }, + data: "complete-snapshot-v1", + externalState: "unchanged", + codex: "0.153.4", +}; + +test("capability never infers enrollment or activates unqualified installations", () => { + for (const facts of [ + { packaged: false, platform: "linux", arch: "x64", systemd: true }, + { packaged: true, platform: "linux", arch: "arm64", systemd: true }, + { packaged: true, platform: "linux", arch: "x64", systemd: false }, + { packaged: true, platform: "linux", arch: "x64", systemd: true }, + ]) + assert.equal(capability(facts).canActivate, false); + assert.equal( + capability({ + packaged: false, + platform: "darwin", + arch: "arm64", + systemd: false, + }).code, + "externally-managed", + ); +}); + +test("stable numeric versions and explicit database/runtime compatibility default deny", () => { + assert.equal(compareVersions("0.1.40", "0.1.9"), 1); + assert.equal(compareVersions("1.0.0", "1.0.0"), 0); + for (const invalid of [ + "1.2.3-beta", + "01.2.3", + "9007199254740992.1.0", + "v1.2.3", + "1.2.3\n", + ]) + assert.throws(() => compareVersions(invalid, "1.2.3")); + assertCompatible(contract, { app: 10, auth: 0, codex: "0.153.4" }); + for (const installed of [ + { app: 11, auth: 0, codex: "0.153.4" }, + { app: 9, auth: 0, codex: "0.153.4" }, + { app: 10, auth: 1, codex: "0.153.4" }, + { app: 10, auth: 0, codex: "0.154.0" }, + ]) + assert.throws(() => assertCompatible(contract, installed)); + assert.throws(() => + assertCompatible(undefined, { app: 10, auth: 0, codex: "0.153.4" }), + ); +}); + +test("offers pin stable release, asset identity, digest, size and expiry", () => { + const source = metadata(); + const offer = parseOffer(source, "srctl/roost", 1000); + assertOffer(offer, offer.id, "0.1.40", 2000); + assert.throws(() => assertOffer(offer, offer.id, "0.2.0", 2000)); + assert.throws(() => assertOffer(offer, offer.id, "0.1.40", offer.expiresAt)); + const changed = metadata(); + changed.assets[0]!.id = 4; + changed.assets[0]!.url = + "https://api.github.com/repos/srctl/roost/releases/assets/4"; + assert.notEqual(parseOffer(changed, "srctl/roost", 1000).id, offer.id); + for (const changed of [ + { ...source, draft: true }, + { ...source, prerelease: true }, + { ...source, tag_name: "v0.2.0-rc1" }, + { ...source, assets: [...source.assets, ...source.assets] }, + { ...source, assets: [{ ...source.assets[0], digest: "" }] }, + { + ...source, + assets: [{ ...source.assets[0], url: "https://evil.example/archive" }], + }, + { ...source, assets: [{ ...source.assets[0], size: 2 ** 40 }] }, + ]) + assert.throws(() => parseOffer(changed, "srctl/roost", 1000)); +}); + +test("metadata checks coalesce, back off and never redirect credentials", async () => { + let calls = 0; + let now = 1000; + const fetcher = (async (_url, init) => { + calls++; + assert.equal(init?.redirect, "error"); + assert.equal( + (init!.headers as Record).Authorization, + "Bearer private-token", + ); + return Response.json(metadata(), { headers: { etag: '"pinned"' } }); + }) as typeof fetch; + const checker = new ReleaseChecker( + "srctl/roost", + fetcher, + "private-token", + () => now, + ); + const [a, b] = await Promise.all([checker.check(), checker.check()]); + assert.deepEqual(a, b); + assert.equal(calls, 1); + await assert.rejects(checker.check(), /Wait a minute/); + now += 60001; + await checker.check(); + assert.equal(calls, 2); + for (const status of [401, 404, 429, 500]) { + const failed = new ReleaseChecker( + "srctl/roost", + async () => new Response("private-token", { status }), + ); + await assert.rejects( + failed.check(), + (error: Error) => !error.message.includes("private-token"), + ); + assert.equal(failed.cached, undefined); + } +}); + +test("streamed metadata and request bodies enforce actual byte limits and field allowlists", async () => { + await assert.rejects(boundedBytes(new Response("12345"), 4), /size limit/); + await assert.rejects( + boundedBytes( + new Response("1", { headers: { "content-length": "100" } }), + 4, + ), + /size limit/, + ); + assert.equal( + (await boundedBytes(new Response("1234"), 4)).toString(), + "1234", + ); + const request = (value: unknown) => + new Request("https://roost.example/api/updates", { + method: "POST", + body: JSON.stringify(value), + }); + for (const value of [ + { unit: "other" }, + { path: "/" }, + { url: "https://evil.example" }, + [], + null, + ]) + await assert.rejects(updateBody(request(value), [])); + assert.deepEqual(await updateBody(request({}), []), {}); +}); + +test("mutations require recent native authentication, exact host/origin, JSON and session-bound CSRF", () => { + const context = { + origin: "https://roost.example", + session: { id: "session-a", created: 1000 }, + secret: "server-secret", + now: 2000, + }; + const headers = { + origin: context.origin, + "content-type": "application/json", + "x-roost-csrf": csrfToken(context.secret, context.session.id), + }; + const request = (patch = {}, url = context.origin) => + new Request(`${url}/api/updates`, { + method: "POST", + headers: { ...headers, ...patch }, + body: "{}", + }); + authorizeMutation(request(), context); + for (const patch of [ + { origin: "" }, + { origin: "https://evil.example" }, + { "sec-fetch-site": "cross-site" }, + { "content-type": "text/plain" }, + { "x-roost-csrf": csrfToken(context.secret, "session-b") }, + { "x-roost-csrf": "" }, + ]) + assert.throws(() => authorizeMutation(request(patch), context)); + assert.throws(() => + authorizeMutation(request({}, "https://evil.example"), context), + ); + assert.throws(() => + authorizeMutation(request(), { ...context, session: undefined }), + ); + assert.throws(() => + authorizeMutation(request(), { ...context, now: 400000 }), + ); + assert.throws(() => + authorizeMutation(new Request(context.origin, { headers }), context), + ); +}); + +test("kernel ownership survives flock exit, excludes CLI, releases after SIGKILL, rejects symlink locks", async () => { + const root = await mkdtemp("/tmp/ui-update-kernel-"); + try { + await withKernelLock(root, async () => { + await assert.rejects( + withKernelLock(root, async () => {}), + /operation is active/, + ); + await assert.rejects( + withLock(root, async () => {}), + /operation is active/, + ); + }); + const child = spawn( + process.execPath, + [ + "--import", + "tsx", + "--input-type=module", + "-e", + `import { withKernelLock } from './src/updater/lock.ts'; await withKernelLock(${JSON.stringify(root)},async()=>{console.log('owned');await new Promise(()=>{setInterval(()=>{},1000)});});`, + ], + { stdio: ["ignore", "pipe", "pipe"] }, + ); + await once(child.stdout!, "data"); + child.kill("SIGKILL"); + await once(child, "exit"); + await withKernelLock(root, async () => {}); + await rm(join(root, "updater.lock")); + await writeFile(join(root, "target"), "unchanged"); + await symlink(join(root, "target"), join(root, "updater.lock")); + await assert.rejects(withKernelLock(root, async () => {})); + assert.equal(await readFile(join(root, "target"), "utf8"), "unchanged"); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("journal recovery decisions never restore after durable commit and reject corrupt evidence", async () => { + const root = await mkdtemp("/tmp/ui-update-journal-"); + const journal: Journal = { + protocol: 1, + id: randomUUID(), + sequence: 1, + phase: "accepted", + previous: "0.1.40", + candidate: "0.2.0", + wasRunning: true, + updatedAt: 1000, + }; + try { + await writeJournal(root, journal); + assert.deepEqual(await readJournal(root, journal.id), journal); + for (const phase of phases) { + const value = { ...journal, phase, snapshotDigest: "a".repeat(64) }; + const plan = recoveryPlan(value); + if (phase === "committed") + assert.equal(plan, "finish-commit-never-restore"); + if ( + ["snapshot-complete", "activating", "verifying", "restoring"].includes( + phase, + ) + ) + assert.equal(plan, "restore-matching-pair"); + } + assert.throws(() => recoveryPlan({ ...journal, phase: "verifying" })); + await writeFile(join(root, "updates", journal.id, "journal.json"), "{"); + await assert.rejects(readJournal(root, journal.id)); + await assert.rejects(readJournal(root, "../data")); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("complete protected snapshots include both databases and files; tampering and links fail closed", async () => { + const root = await mkdtemp("/tmp/ui-update-snapshot-"); + try { + await mkdir(join(root, "data"), { mode: 0o700 }); + for (const name of ["roost.sqlite", "auth.sqlite"]) { + const db = new DatabaseSync(join(root, "data", name)); + db.exec( + "CREATE TABLE saved(value TEXT); INSERT INTO saved VALUES ('preserved')", + ); + db.close(); + await chmod(join(root, "data", name), 0o600); + } + await writeFile(join(root, "data", "secret.txt"), "private", { + mode: 0o600, + }); + const id = randomUUID(); + const digest = await createSnapshot(root, id); + const snapshot = await verifySnapshot(root, id, digest); + assert.equal(snapshot.entries.filter((e) => e.kind === "file").length, 3); + await writeFile( + join(root, "updates", id, "snapshot", "secret.txt"), + "modified", + ); + await assert.rejects( + verifySnapshot(root, id, digest), + /digest verification/, + ); + await symlink("/tmp", join(root, "data", "external")); + await assert.rejects( + createSnapshot(root, randomUUID()), + /Unsupported link/, + ); + await assert.rejects( + requireHeadroom(root, Number.MAX_SAFE_INTEGER, 100), + /Insufficient/, + ); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("steering, missing and null worker observations all defer service stop", async () => { + const root = await mkdtemp("/tmp/ui-update-work-"); + await mkdir(join(root, "data")); + const db = new DatabaseSync(join(root, "data", "roost.sqlite")); + try { + db.exec( + "CREATE TABLE runs(status TEXT); INSERT INTO runs VALUES('steering'); CREATE TABLE coding_jobs(status TEXT,lastWorkerState TEXT); INSERT INTO coding_jobs VALUES('blocked','missing'),('review',NULL),('queued','unknown')", + ); + assert.equal(activeRuns(root), 3); + } finally { + db.close(); + await rm(root, { recursive: true, force: true }); + } +}); + +test("journal updates reject sequence reuse and rollback after commit", async () => { + const root = await mkdtemp("/tmp/ui-update-journal-sequence-"); + try { + const journal: Journal = { + protocol: 1, + id: randomUUID(), + sequence: 1, + phase: "accepted", + previous: "0.1.40", + candidate: "0.2.0", + wasRunning: true, + updatedAt: 1000, + }; + await writeJournal(root, journal); + await assert.rejects(writeJournal(root, journal), /Conflicting/); + const committed: Journal = { + ...journal, + sequence: 2, + phase: "committed", + snapshotDigest: "a".repeat(64), + }; + await writeJournal(root, committed); + await assert.rejects( + writeJournal(root, { ...committed, sequence: 3, phase: "restoring" }), + /Conflicting/, + ); + assert.equal((await readJournal(root, journal.id)).phase, "committed"); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("source status is read-only and unauthenticated activation cannot reach any updater", async () => { + const directory = await mkdtemp("/tmp/ui-update-http-"); + const old = process.env.ROOST_DATA_DIR; + process.env.ROOST_DATA_DIR = directory; + try { + const response = await updatesRequest( + new Request("https://roost.example/api/updates"), + ); + assert.equal(response.status, 200); + assert.equal(response.headers.get("cache-control"), "private, no-store"); + const status = await response.json(); + assert.equal(status.capability.canActivate, false); + assert.equal(status.version, "dev"); + assert.equal(status.canCheck, false); + assert.equal(status.csrf, null); + for (const path of ["/api/updates", "/api/updates/check"]) { + const denied = await updatesRequest( + new Request(`https://roost.example${path}`, { + method: "POST", + body: JSON.stringify({ unit: "arbitrary.service" }), + }), + ); + assert.equal(denied.status, 401); + } + } finally { + if (old === undefined) delete process.env.ROOST_DATA_DIR; + else process.env.ROOST_DATA_DIR = old; + await rm(directory, { recursive: true, force: true }); + } +}); From 264893ee31d97357501e52f949cd453474996226 Mon Sep 17 00:00:00 2001 From: "exe.dev user" Date: Tue, 8 Sep 2026 19:42:15 +0000 Subject: [PATCH 2/4] Implement supervised UI self-update transactions and recovery --- docs/ui-self-update-evidence/README.md | 158 ++++- .../ui-self-update-evidence/after-desktop.png | Bin 64076 -> 64425 bytes docs/ui-self-update-evidence/after-mobile.png | Bin 49480 -> 49946 bytes .../confirmation-fixture-desktop.png | Bin 0 -> 70956 bytes .../confirmation-fixture-mobile.png | Bin 0 -> 54055 bytes docs/ui-self-updates.md | 363 ++++++----- scripts/package-release.mjs | 15 + scripts/test-updates-browser.mjs | 174 ++++++ scripts/test-updates-systemd.ts | 85 +++ src/cli/main.ts | 167 ++++- src/cli/state.ts | 4 + src/components/conversation/composer.tsx | 27 +- src/components/ui/button.tsx | 16 +- src/components/update-notice.tsx | 50 ++ src/components/update-setting.tsx | 335 ++++++++-- src/features/agents/functions.ts | 8 +- src/features/chat/functions.ts | 11 +- src/features/coding/functions.ts | 1 - src/features/updates/drafts.ts | 63 ++ src/features/updates/state.ts | 101 ++++ src/routes/__root.tsx | 2 + src/routes/agents.$agentId_.jobs.tsx | 1 + src/server.ts | 48 +- src/server/codex/login.server.ts | 3 + src/server/coding/worker.server.ts | 1 + src/server/computer/session.server.ts | 4 + src/server/computer/socket.server.ts | 8 + src/server/runs/worker.server.ts | 16 +- src/server/update-gate.server.ts | 125 ++++ src/server/updates.server.ts | 189 +++++- src/server/worker-plugin.ts | 8 + src/updater/artifact.ts | 179 ++++++ src/updater/client.ts | 37 ++ src/updater/contract.ts | 22 +- src/updater/daemon.ts | 247 ++++++++ src/updater/engine.ts | 570 ++++++++++++++++++ src/updater/enrollment.ts | 230 +++++++ src/updater/extract.py | 68 +++ src/updater/gate.ts | 69 +++ src/updater/lock.ts | 27 +- src/updater/peer-broker.py | 54 ++ src/updater/process.ts | 42 ++ src/updater/releases.ts | 6 +- src/updater/snapshot.ts | 70 ++- src/updater/systemd.ts | 231 +++++++ tests/ui-updates.test.ts | 38 ++ tests/update-artifact.test.ts | 71 +++ tests/update-download.test.ts | 172 ++++++ tests/update-drafts.test.ts | 93 +++ tests/update-engine.test.ts | 351 +++++++++++ tests/update-gate.test.ts | 93 +++ tests/update-http.test.ts | 60 ++ tests/update-socket.test.ts | 63 ++ tests/update-work.test.ts | 71 +++ 54 files changed, 4522 insertions(+), 325 deletions(-) create mode 100644 docs/ui-self-update-evidence/confirmation-fixture-desktop.png create mode 100644 docs/ui-self-update-evidence/confirmation-fixture-mobile.png create mode 100644 scripts/test-updates-browser.mjs create mode 100644 scripts/test-updates-systemd.ts create mode 100644 src/components/update-notice.tsx create mode 100644 src/features/updates/drafts.ts create mode 100644 src/features/updates/state.ts create mode 100644 src/server/update-gate.server.ts create mode 100644 src/updater/artifact.ts create mode 100644 src/updater/client.ts create mode 100644 src/updater/daemon.ts create mode 100644 src/updater/engine.ts create mode 100644 src/updater/enrollment.ts create mode 100644 src/updater/extract.py create mode 100644 src/updater/gate.ts create mode 100644 src/updater/peer-broker.py create mode 100644 src/updater/process.ts create mode 100644 src/updater/systemd.ts create mode 100644 tests/update-artifact.test.ts create mode 100644 tests/update-download.test.ts create mode 100644 tests/update-drafts.test.ts create mode 100644 tests/update-engine.test.ts create mode 100644 tests/update-gate.test.ts create mode 100644 tests/update-http.test.ts create mode 100644 tests/update-socket.test.ts create mode 100644 tests/update-work.test.ts diff --git a/docs/ui-self-update-evidence/README.md b/docs/ui-self-update-evidence/README.md index cfc2c36..2aa10d1 100644 --- a/docs/ui-self-update-evidence/README.md +++ b/docs/ui-self-update-evidence/README.md @@ -1,18 +1,154 @@ -# Settings update status: rendered evidence +# UI self-update evidence -Actual Chromium screenshots of the source app with isolated disposable data, -light theme, device scale factor 1. Baseline: `7415789` (0.1.40). After: this -implementation branch. Both states use `/settings`, search `software update`, -the same viewports and the same empty app data. Screenshots are full-page captures -and therefore may differ in total image height as content changes. +These results distinguish implemented behavior from release qualification. +**The production helper's activation gate remains false; PR #11 remains a draft.** +No live Roost service, configuration or data was enrolled, stopped, updated or +restored. Test guest files, keys, disk images and raw logs remain outside the PR. + +## Matched rendered screenshots + +Actual Chromium screenshots of the source app with isolated empty data, light +theme, device scale factor 1. Baseline: `7415789` (0.1.40). After: this branch. +Both use `/settings`, search `software update`, and the same viewports. Full-page +capture height may vary with content. Before has no matching setting; after +shows the source-build external-management reason and disabled update check. | Viewport | Before | After | | --- | --- | --- | | Desktop 1440 × 1000 | [Before desktop](before-desktop.png) | [After desktop](after-desktop.png) | | Mobile 390 × 844 | [Before mobile](before-mobile.png) | [After mobile](after-mobile.png) | -Before: no matching setting. After: source-build capability, externally managed -reason and disabled update check. These images show the implemented status UI, -not a working enrollment/activation/reconnect flow. No mockups substitute for -missing lifecycle screenshots. Screenshot scripts and server logs remain in -`/tmp`, outside the PR. +Supplemental **rendered API-fixture views**, not matched lifecycle evidence: +[desktop confirmation](confirmation-fixture-desktop.png) and +[mobile confirmation](confirmation-fixture-mobile.png). These exercise the real +component with a deterministic qualified-offer response; they do not imply that +this unqualified helper permits activation. No image is a mockup. + +## Automated checks + +`pnpm check` passed: lint, TypeScript, 191 unit tests, app/CLI builds, +production-auth smoke (enrollment, login, private pages/API, desktop upgrades, +revocation, recovery), six site tests, site TypeScript and both site builds. +Runtime/listener environment variables inherited from Roost were removed for +these tests; umask 0022 was scoped to the check subprocess for existing packaging +expectations. Tests use disposable roots and independent subprocesses. + +Updater tests cover successful and initially-stopped transactions, coherent +rollback, retained failed data, post-commit repair preserving new work, duplicate/ +conflicting requests, concurrent engines/kernel locks and SIGKILL lock release, +durable repeated cancellation, failed preparation/uncertain-work deferral, +corrupt evidence, and startup/HTTP gates. Simulated interruption coverage includes +20 journal/lifecycle boundaries plus both rollback data-renames, with assertions +on release/data pairing and admission. The probes assert database admission is +closed, including recovery after commit. Snapshot tests include both databases, +files, integrity, permissions, tampering, links and headroom refusal. + +Release tests cover numeric versions, pinned offer identity/digest/size/expiry, +HTTP failure/backoff/coalescing, streamed limits, changed artifacts, hostile +redirects and credential stripping, bounded safe extraction, runtime/manifest +validation, repeated identical staging and compatibility refusal. Security tests +cover recent native sessions, exact origin/host, JSON/CSRF, field allowlists, +unauthenticated rejection and session revocation while reading a streamed body. +Coding tests retain 0.1.40's recovery/observation coverage and explicitly reject +working, missing, unknown, stale, cancelled or identity-uncertain workers. + +`scripts/test-updates-browser.mjs` +passes at 1440×1000 and 390×844 using real Chromium rendering and deterministic +update API responses: exact version confirmation, lost acceptance response, +reload, two tabs, cancellation, network outage, reauth notice and no horizontal +overflow. Draft tests verify per-conversation/tab retention and sent-draft +clearing without replay. Additional actual composer checks with two disposable +agents passed reload and conversation isolation at both viewport sizes, with no +prompt-bearing POST requests. To reproduce against a disposable preview: + +```sh +PLAYWRIGHT_MODULE=/path/to/playwright/index.mjs \ +CHROME_BINARY=/path/to/chromium \ +UPDATE_TEST_URL=http://127.0.0.1:4191 \ +node scripts/test-updates-browser.mjs +``` + +## Real systemd and reboot evidence + +The available Docker daemon can run a disposable **userspace QEMU VM**; no paid +VM or additional exe.dev SSH access was required. The test container drops all +Linux capabilities, uses `no-new-privileges`, no host mounts/devices and TCG +emulation (no KVM). QEMU 8.2.2 boots an Ubuntu 24.04.4 amd64 cloud image with +systemd 255 and a sparse 8 GiB ext4 guest disk, 1 GiB guest RAM, two virtual CPUs. +The container memory limit is 4 GiB: the initial 2 GiB container limit caused an +OOM during fixture transfer/setup and was increased only for that container. + +The official image was downloaded from +[Ubuntu's Noble cloud-image directory](https://cloud-images.ubuntu.com/noble/current/) +and checked against its SHA256SUMS: +`d0fe84bb5f80853425fa6be28e2c106f30104c3cfe8611933f2e65c9b63f0e30`. +Cloud-init installed generated **test** authorized keys and a pinned test host +key. SSH used strict host-key checking. No host credentials or SSH authentication +were bypassed, and no host service/configuration was changed. + +Inside that guest only, the packaged CLI installed `roost-1000.service`, native +auth storage and explicit enrollment. The helper runs in its own systemd control +group, pinned to the retained 0.1.40 **test build**. Lifecycle candidates are copies +of built packages with test version manifests; they are not published releases. +`scripts/test-updates-systemd.ts` +requires a disposable guest marker and fixed guest identity/root. Its real adapter +controls systemd, drains, snapshots, probes and recovers. Only artifact staging is +replaced by preinstalled fixtures; network pinning/extraction is tested separately. +Standalone daemon invocations are rejected unless their PID is the fixed systemd +helper unit's main PID; a separate lifetime lock also protects its socket/gate. +The product helper stays unqualified; the test driver invokes the engine directly. + +Recorded results: + +* Real 0.1.40→0.1.41 fixture update succeeded; app and helper remained active. +* A deliberately broken 0.1.42 candidate changed a data sentinel then failed + startup. Within the bounded probe/recovery sequence, the engine restored + 0.1.41 and the original sentinel, retained the candidate sentinel in failed + data, and returned both services to active state. +* A real QMP system reset at the 0.1.43 verification boundary changed the guest + boot ID. The boot helper restored 0.1.41, verified it and opened admission. +* The final shell-probe fixture 0.1.44 reached durable commit/admission-open, + then a new data sentinel was fsynced before a second real VM reset. + Recovery preserved 0.1.44 and that sentinel and returned both services to active state. + +* Real engine/helper SIGKILL recovery is confirmed at 17 boundaries: accepted, + staged, draining, stopping, service-stopped, snapshot-complete, activating, + pointer-renamed, verifying, service-started, and before journal writes for + staged, draining, stopping, snapshot-complete, activating, verifying and + committed. Systemd recorded signal 9 for each injected driver death; code/data + and admission were checked after helper recovery. One initial service-stopped + attempt exited during preparation and was excluded, then rerun with an explicit + boundary-file assertion and confirmed SIGKILL. +* The final supervised-only build rejected a standalone/duplicate helper without + changing the active gate or socket. A real initially-stopped 0.1.44→0.1.46 + update succeeded, kept the app stopped, retained new data and left the helper + active. CLI start/stop used the private helper route. + +The test-only lifecycle driver can be bundled with Vite SSR, copied to the guest, +and run as the installation user in a separate systemd unit. It accepts a target +fixture version, a boundary and `run`, `kill` or `reboot`; in reboot mode the outer +harness resets QEMU through its private QMP socket. The marker is +`/etc/roost-update-disposable`; root is `/home/ubuntu/roost-update-test`, UID 1000, +user `ubuntu`. These are test harness requirements, not production configuration. + +## Complete design matrix: remaining qualification gaps + +| Layer | Implemented/tested here | Evidence still required before activation qualification | +| --- | --- | --- | +| Release | Pinned metadata/download/extraction/compatibility integration and hostile/offline fixtures | Authenticated full browser→helper transaction using a gate-aware compatible release artifact from an authorized test release source; broader ABI/legacy-schema fixture coverage | +| Authorization | Native session/origin/CSRF/body bounds and revocation race; existing production passkey smoke | Full native-passkey browser update/rollback through the real helper; credential/authorization behavior across all restart races | +| Concurrency | Shared real kernel locking, durable idempotency, simultaneous engines, private socket, fixed-unit policy and legacy fence | Full enrollment/setup/start/stop/UI race stress; separate-UID broker integration on hardened policy without the disposable cloud user's broader test sudo privileges | +| Work | Admission/observation split, steering and coding recovery regressions, fresh idle identity, global task/request/login/desktop quiescence | Real remote coding/chat/tool/delegation activity and cancellation at every stop race; real automation schedule expiry/catch-up during downtime | +| Data | Complete protected snapshot and matching-pair restore, failed-data retention, SQLite integrity, link/mount refusal and capacity checks | Large data, retained WAL crash fixtures, true block/inode exhaustion and copy/fsync failure injection throughout snapshot/restore; additional migration fixtures | +| Lifecycle | Real systemd success, failed-startup rollback, separate helper survival, gated shell/assets/auth/schema probes, initially-stopped CLI update and standalone-helper rejection | Slow shutdown/orphan/port collision, independently bad assets/auth and external writer scenarios | +| Faults | Simulated before/after journal and data-rename cases; 17 audited real SIGKILL boundaries and real VM resets before/after commit | Full real reboot matrix at every boundary; SIGKILL within writes/fsync and both rollback data-renames; real corrupt-evidence and failed-rollback injection | +| Browser | Actual matched screenshots and rendered desktop/mobile lost-response/reload/two-tab/cancel/reauth cases; draft persistence tests | Full authenticated systemd lifecycle in the browser, rollback reauth and stale-asset recovery; assistive-technology and additional mobile-browser validation | + +Disposable VM infrastructure is now available, so it is **not** the remaining +blocker. Qualification needs the additional fixtures/runs above and an authorized +compatible release test source; no publishing/release was authorized in this +assignment. No additional production updater code is intentionally deferred to +that runner. Keep the build gate false and the PR draft until the complete design +acceptance matrix, including browser-to-helper lifecycle, is verified. These +results do not promise zero downtime or recovery from arbitrary later bugs, +publisher compromise, external effects or storage failure. diff --git a/docs/ui-self-update-evidence/after-desktop.png b/docs/ui-self-update-evidence/after-desktop.png index 92c7ac54b486cb60e7bd9ef2ad2487bfe3190c99..ac999e85a7f1d95a3f58e3a1afa474073e862952 100644 GIT binary patch delta 18421 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 N002ovPDHLkV1hs`%0U1C diff --git a/docs/ui-self-update-evidence/after-mobile.png b/docs/ui-self-update-evidence/after-mobile.png index ad3435d769efb6df235c8ea544b6725c7c14ad35..e6f4d8ba1f8e6c0c5bcd73c80bfb8d7a1f711b33 100644 GIT binary patch literal 49946 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 Ike=`V02ZTE+5i9m literal 49480 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 literal 0 HcmV?d00001 diff --git a/docs/ui-self-update-evidence/confirmation-fixture-mobile.png b/docs/ui-self-update-evidence/confirmation-fixture-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..5af0d175903334bcb38af2cad3601893e594e57d GIT binary patch literal 54055 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 literal 0 HcmV?d00001 diff --git a/docs/ui-self-updates.md b/docs/ui-self-updates.md index 2ba2f2e..0a5cc1c 100644 --- a/docs/ui-self-updates.md +++ b/docs/ui-self-updates.md @@ -1,154 +1,209 @@ -# UI self-updates: implementation status - -**Draft, incomplete. UI activation is disabled for every installation.** This -branch is not an implementation of all three approved phases and must not be -released as a working self-updater. No enrollment command or updater service is -installed by this code. Do not delete legacy lock files to enable the UI. - -The approved design is available at -[the immutable design revision](https://github.com/srctl/roost/blob/47093a36a0858e9948e68cba7c403e56ee61425e/docs/ui-self-update-design.md) -and [design PR #10](https://github.com/srctl/roost/pull/10). This branch starts at -`7415789` (0.1.40); it does not assume the design PR has merged. - -## Implemented behavior - -Settings has a searchable Updates section. Source/orchestrated installations -report externally managed status. Packaged installations report unsupported -architecture/service-manager reasons or that enrollment and activation remain -unimplemented. Nothing infers privileges from Linux x64, a proxy login, or the -presence of `ROOST_HOME` alone. - -A native-authenticated packaged installation with a configured repository can -request bounded, rate-limited stable-release metadata. The check pins repository, -release/asset IDs, SHA-256 digest, advertised size, version and expiry. It rejects -ambiguous artifacts, drafts and prereleases. Conditional requests retain the -original offer expiry; a 304 does not authorize an expired offer. Remote notes -are rendered as plain React text. Network failures are not “up to date.” Metadata -alone is not evidence of artifact or migration compatibility. - -`GET /api/updates` exposes only local capability when native authentication is -absent; remote metadata and CSRF tokens require a native session. The check POST -requires a recent session, exact origin/host, JSON, a session-bound CSRF token and -an empty allowlisted body. Activation POSTs cannot invoke the legacy CLI or any -other executable. No browser request can install privileges. - -The default web process does not inherit a terminal's GitHub credentials into -this release checker. The checker primitive supports an explicitly supplied -read-only credential, with redirects disabled. Private-repository credential -provisioning for a future supervised helper remains outstanding. - -Current CLI setup/update/start/stop operations now acquire an inherited-file- -descriptor `flock` lock as well as the legacy exclusive-create lock. The kernel -lock file is never unlinked. The legacy lock remains necessary to exclude old -binaries; a hard interruption can still leave that legacy file. This is not the -permanent enrollment sentinel or automatic stale-lock recovery described in the -design. `flock` from util-linux is required for this Linux CLI path. - -The 0.1.40 coding worker already observes existing workers during maintenance and -fences ambiguous Herdr recovery/submission. Those protections remain intact. -CLI draining now includes steering, missing workers and null observations. A -maintenance predicate also prevents claiming new steering. Conservatively, review -jobs remain blockers even if their last observation was idle. Nothing replays a -prompt or forcibly stops a worker. - -## Recovery primitives, not an activated recovery engine - -The new internal modules provide a versioned compatibility contract, durable -private JSON replacement with file/directory fsync, journal identity/sequence -validation and conservative recovery decisions. A committed record cannot be -rewritten as a restoring record. Unknown/corrupt evidence is rejected. - -The snapshot primitive copies complete managed app data into a private operation -directory, requires both SQLite stores, verifies database integrity and content -digests, checks space/inode headroom, and rejects links, hard links, special files -and nested mounts. It compares source content before/after copying and never -accepts an existing partial snapshot. It assumes an external supervisor has -already stopped and fenced writers; it does **not** establish that condition. -Configuration/release identity capture must still be integrated with the engine. - -These modules are exercised with disposable files and child processes. They are -not called by HTTP activation or the existing CLI update transaction. There is -no automatic retention deletion; test snapshots are removed only with their -disposable fixture. Future enrollment must protect and retain at least the last -complete recovery pair, never reclaim it just to make room for an update. - -The compatibility contract defaults to refusing absent/unknown app/auth ranges, -helper protocol, data format or bundled Codex version. It requires unchanged -excluded mutable state. It is not yet emitted by packaging or enforced by an -activation engine; existing release bundles therefore have no qualified UI -migration contract. Managed-data snapshots cannot restore `~/.codex`, browser -profiles, external worktrees, remote Herdr infrastructure or external actions. - -## Remaining implementation and acceptance gates - -1. Enrolled installation validation (including distribution, mount durability, - canonical identities and service authority); pinned separately supervised - helper; private socket peer credentials; root-owned fixed-unit noninteractive - service policy; permanent legacy CLI sentinel; shared CLI/helper routing. -2. Bounded artifact streaming/extraction and runtime execution preflight tied to - immutable accepted offers; packaging compatibility contract; durable actor, - idempotency and offer acceptance records. -3. Full transaction executor, cancellation/deferral, writer/quiescence barrier, - complete snapshot/config pair, systemd stop/group verification, candidate - startup capability and side-effect gate, bounded multi-surface probes, durable - commit, data/release rollback and resumable rename intents. -4. Boot ordering and manual-launch guard, independent read-only diagnostics and - a tested operator repair procedure. Never run an old release against migrated - candidate data or automatically restore data after committed work. -5. UI version confirmation, durable operation observation, lost-response - reconciliation, multi-tab maintenance, retained drafts, reconnect/reauth and - one-time asset reload. No activation controls are exposed before these gates. -6. Real disposable Ubuntu 24.04 systemd and reboot/fault-injection qualification, - followed by authenticated browser update/rollback acceptance. Additional - distributions and changed bundled runtimes require separate evidence. - -There is intentionally no operator enrollment recipe yet: installing an -unqualified helper would bypass these gates. Continue the documented -[operator-managed installation/update workflow](install.md) with its existing -limitations. Do not claim zero downtime, universal recovery, or rollback of -external effects. - -## Verification matrix and infrastructure limits - -| Design layer | Available evidence | Still required | -| --- | --- | --- | -| Release | Numeric stable versions; offer identity/digest/size/expiry validation; duplicate/draft/prerelease rejection; HTTP failure/backoff/coalescing; byte bounds; redirect refusal; unknown compatibility refusal | Live offline/private/429 behavior; approved artifact replaced at download; bounded hostile archive extraction; ABI execution; packaged migration compatibility | -| Authorization | Recent-session/origin/host/JSON/CSRF and field-allowlist tests; unauthenticated source activation/check rejection; no-store status | Native end-to-end activation; revocation races; accepted-operation authorization consumption; idempotency conflicts | -| Concurrency | Real kernel flock exclusion against another client and CLI; SIGKILL releases kernel ownership; lock symlinks rejected; legacy exclusion retained | Helper versus CLI/enrollment races; permanent old-CLI fence; reboot identity; durable acceptance under lost replies | -| Work | Existing 0.1.40 coding observation/recovery regressions; steering barrier; active/missing/null observations block CLI draining | Global submission/tool/delegation quiescence at stop boundary; external idle attestation; authenticated update initiated by active coding work | -| Data | Both SQLite databases and managed files copied/verified; tampering rejected; links refused; capacity refusal; journal corruption/identity/sequence checks | Large datasets; WAL/SHM crash boundaries; all mount/layout cases; disk/inode exhaustion during writes; copy interruption; config pairing; rollback restore transaction | -| Lifecycle | Existing fake-service CLI rollback regressions | Real systemd update, rollback, group-empty proof, slow shutdown/orphans, port collision, candidate assets/auth, helper survival, initially stopped installation | -| Fault injection | Child lock-owner SIGKILL; recovery decision rules; commit-to-restore refusal | Process kill and actual VM reboot at every journal/snapshot/rename/start/commit/admission boundary; failed rollback/manual recovery | -| Browser | Actual matched desktop/mobile Settings screenshots; source capability and disabled controls | Accepted update/rollback, lost response/disconnect, retained drafts, multi-tab synchronization, reauth, stale assets, assistive-technology validation | - -Read-only infrastructure research found Docker 29.1.3 reachable outside the -sandbox, with no existing test images; Docker alone is not evidence of a -rebootable Ubuntu systemd VM. No local QEMU or systemd-nspawn runner was found. -The documented exe.dev SSH host fingerprint was verified against its official -reference using a temporary known-hosts file. The API then rejected the available -credentials (`Permission denied (publickey,keyboard-interactive)`). No host SSH -configuration was changed and no VM was provisioned. An authorized disposable -Ubuntu 24.04 VM/runner and access method are needed to close the real lifecycle -and reboot test gap. No live Roost service/configuration/storage was modified, -enrolled, restarted, or updated. - -## Checks completed for this draft - -All repository check components passed: lint, TypeScript, 173 unit tests, app and -CLI builds, production-auth smoke, site TypeScript, six site tests and both site -builds. The final updater-focused rerun passed all 12 tests. Chromium verified -Settings in two tabs at both desktop/mobile viewports, search and Escape-to-clear, -no horizontal overflow, disabled source checks and denied source activation. - -The first check attempts inherited Roost/Codex/Herdr/listener environment values -and a `0077` umask. These conflicted with unrelated test assumptions. Checks were -run with those runtime/listener variables removed and a `0022` umask scoped to -the test subprocess; production-auth/site checks were completed separately after -the listener override was removed. The new snapshot/journal tests also passed -under the original restrictive umask. This does not qualify systemd updates, -boot recovery or the unimplemented activation flow. - -Docker-based VM emulation was not attempted. The available Docker daemon may be -a route to future disposable qualification; its availability has not established -that the full VM/reboot matrix can run here. Infrastructure limitations are -separate from the unfinished implementation listed above. +# UI self-updates + +This draft implements the supervised update path, enrollment, recovery engine, +and UI. **Activation remains disabled in the shipped helper until the complete +qualification matrix passes.** There is no environment variable, HTTP flag, or +enrollment option that bypasses that build decision. Enrollment installs real +service authority and is an explicit operator action, not an activation bypass. + +The implementation starts from `7415789` (0.1.40), including its coding-job +protection and recovery changes. It follows the +[approved design revision](https://github.com/srctl/roost/blob/47093a36a0858e9948e68cba7c403e56ee61425e/docs/ui-self-update-design.md); +[design PR #10](https://github.com/srctl/roost/pull/10) is separate from this PR. + +## Initial supported contract + +Only explicitly enrolled, packaged Linux x64 installations on Ubuntu 24.04, +systemd and persistent local ext4 storage are candidates for qualification. +The application unit must match Roost's generated unit, with only the updater +startup drop-in. Custom hooks, additional overrides, noncanonical/shared writable +installation paths (the installation root must be mode 0700), externally managed deployments and other service managers +are unsupported. Source installations show their external-management reason in +Settings and cannot activate an update. + +Both the previous and candidate packages must include the startup gate and a +compatible `compatibility.json`: updater protocol 1, app/auth schema input ranges +and output versions, complete managed-data snapshots, unchanged excluded state, +and the same bundled Codex version. Packages predating this contract, including +the original 0.1.40 release, need a normal operator-managed upgrade to a gate-aware +release **before enrollment**. Merely adding a manifest to an old binary is unsafe. +Bundled Node and Codex must execute on the host; changed Codex versions require +terminal maintenance and separate compatibility review. No external model API +connection is required for candidate health. + +The installation user is a trust boundary. Same-user arbitrary code can access +its installation, data and private helper socket. Independent operator service +changes, external writers and remote effects are outside the recovery guarantee. +Updates cause downtime; they do not provide universal recovery or undo external +actions such as messages, commits or remote provisioning. + +## Operator enrollment + +Do this only during an authorized maintenance window, using a packaged, +gate-aware release. These commands are documentation, not automatic deployment: + +```sh +roost auth setup --origin https://your-roost-host +# Register the native passkey using the private link before relying on UI controls. +roost updates enroll +roost updates status +``` + +Enrollment verifies installation identity/layout, Python 3 with Linux +`SO_PEERCRED`, systemd, ext4 and the application unit. It requires interactive +operator sudo authorization and installs root-owned files: + +* `/etc/systemd/system/roost-UID-updater.service`, running as the installation + user, pinned to the enrolled release's Node/CLI outside the app control group; +* `/etc/systemd/system/roost-UID.service.d/updater.conf`, ordering startup after + the helper and supplying its fixed startup capability file; +* `/etc/sudoers.d/roost-UID-updater`, allowing **only** noninteractive + `/usr/bin/systemctl start roost-UID.service` and + `/usr/bin/systemctl stop roost-UID.service`. + +HTTP has no enrollment, repair, shell, path, URL or unit-control operation. +The daemon verifies that it is the fixed helper unit's main PID; it cannot be run +as an unsupervised CLI subprocess. The helper accepts bounded protocol messages on `ROOST_HOME/updates/helper.sock`, +mode 0600, through a separately supervised Python peer-credential bridge. Only +its own UID is accepted. The socket and operation directories are private. + +Enrollment leaves `ROOST_HOME/operation.lock` as a permanent legacy CLI fence. +**Do not delete it as a stale PID file.** Current CLI setup/update/start/stop and +the helper share a kernel `flock` domain, `updater.lock`; enrolled updates and +start/stop route through the helper. Enrolled `roost update` prints the offer; +`roost update --version EXACT_VERSION` explicitly confirms it. Never unlink that kernel lock file either. +`updater-owner.json` records PID, boot ID and process-start ticks for diagnostics; +it may be stale after exit and never grants ownership. A separate lifetime +`updater-supervisor.lock` prevents a second helper invocation from replacing the +active socket or changing its gate; it never replaces the shared transaction lock. `flock` (util-linux), +Python 3, findmnt and systemd/sudo are required on the initial platform. + +Repeating enrollment with the same pinned helper is supported after partial +setup. Re-enrolling from a different release refuses to replace a running helper. +Helper upgrades are separate operator maintenance: finish/recover all operations, +stop the app and helper, review the new helper's protocol compatibility, then +replace the pinned helper unit and enrollment metadata under the installation +lock. There is intentionally no automatic helper upgrade or uninstall command. +Do not remove the legacy fence while any older CLI can access this installation. + +For a private repository, provision a read-only release credential explicitly as +`ROOST_HOME/updates/github-token`, a regular installation-user-owned file, mode +0600, at most 1024 bytes. Restart only the helper during authorized idle +maintenance to load a changed credential. It is never returned to the browser or +inherited from the web process. API requests cannot redirect that credential; +artifact redirects permit only GitHub's fixed release asset hosts without the +authorization header. + +## Transaction and recovery + +Settings checks the configured repository's published stable release. The offer +pins repository, release ID, asset ID, version, SHA-256 digest, size and expiry. +“Published” is not a promise of compatibility: downloaded manifests, schemas and +bundled runtime execution are checked before stopping. A same-publisher API digest +detects replacement/corruption, not publisher compromise. Missing digests, changed +identities, downgrade/equal versions, drafts/prereleases and expired offers fail. +Downloads, metadata, request bodies, redirects and extraction are bounded. +Extraction accepts regular files/directories only, rejects links, devices, path +escapes, duplicates and unsupported extensions, and caps expanded bytes and files. + +Activation requires exact version confirmation and a native passkey session less +than five minutes old, exact Origin/host, JSON, a session-bound CSRF token and a +bounded idempotency key. Session validity is rechecked after reading the body. +Acceptance is journaled/fsynced before acknowledgement. Repeating the accepted +key returns its operation; changing its actor/offer/version conflicts. Once +accepted, session expiry does not cancel recovery. No lost response triggers an +automatic POST retry. + +The helper holds the installation lock across staging, drain, stop, snapshot, +activation, probe and commit. It blocks new conversation/steering/automation/ +delegation/coding claims transactionally while continuing existing coding-worker +observation. Running, missing, unknown, stale or identity-uncertain workers defer +the update. Review status alone is insufficient: idle identity must be verified +and fresh. Queued jobs remain queued. In-flight requests, login, desktop viewers/ +actions and background tasks must finish before stopping. The five-minute drain +deadline never authorizes forced termination or replay. Cancellation is durable +before the stop boundary; a later cancel request is refused. + +After closing all writers, the helper stops the exact service and verifies its +control group empty. The complete `data` tree (both SQLite stores, sidecars, +managed files/memory/workspaces) is copied, integrity/digest checked and fsynced. +Config is retained alongside the snapshot for diagnosis/operator recovery. +Symlinks, hard links, special files and nested mounts are rejected rather than +silently excluded. Capacity checks reserve staged bytes, snapshot/restore space +and inode headroom. Snapshot permissions are reduced to owner-only access. +Snapshots are secrets; they can contain credentials and conversation content. + +The candidate starts behind a capability-bound gate that blocks ordinary HTTP, +auth writes, worker claims, login and external effects. A two-minute probe checks +expected version/operation, app and auth database integrity/schema, packaged +assets and worker initialization. A durable commit precedes opening admission. +A previously stopped CLI installation is probed but returned to stopped state. + +Before commit, failure restores a verified copy of the snapshot and selects the +matching previous release. Candidate data is retained separately as `failed-data`; +the original snapshot remains untouched. Recovery resumes interrupted pointer/ +data renames and re-probes the previous version behind the gate. After commit, +automatic recovery never restores old data or discards new work. Missing/corrupt +evidence, an unexpected pointer or failed recovery keeps maintenance closed. +Boot recovery runs in the pinned helper; the app also rejects startup without +current-boot readiness and a valid open/verification gate. + +## Status, reconnect and repair + +The searchable Settings section shows actual phases, blockers and downloaded +bytes, never invented percentages. It supports cancellation, deferral, recent +authentication, cached outage messaging, multi-tab observation and manual asset +reload while preserving the route. Polling backs off after disconnection. An +unconfirmed response stays pending until its request key matches durable status +or the operator explicitly dismisses it after inspection. A closed app cannot +serve fresh progress; the browser says it is reconnecting. + +Unsubmitted composer text and uploaded attachment references are retained in +bounded browser-local storage, separately per tab and conversation. Sending +clears that tab's draft; reload never submits it. Storage failure is surfaced. +Do not rely on browser drafts as a backup, and use a trusted browser profile. +Mutating submit controls pause during drain while read/navigation and deliberate +stop controls remain available; server barriers enforce the admission decision. + +The independent terminal diagnostic command works even when the app/socket is down: + +```sh +roost updates status +roost updates status --id OPERATION_UUID +journalctl -u roost-UID-updater.service +journalctl -u roost-UID.service +``` + +It reports the fixed units, installation, gate, advisory lock owner, phases and +matching snapshot locations under `ROOST_HOME/updates/OPERATION_UUID/`. +Do not publish those directories or raw data/config files. Retain journals, +`snapshot.json`, `snapshot/`, saved config, `failed-data/` and both releases while +investigating. Never guess a snapshot or delete a lock to resume service. + +For an intact manual-recovery operation, after fixing the underlying problem, +the terminal-only repair retries the recorded decision with explicit version: + +```sh +# Only for an uncommitted operation, using its recorded previous version: +roost updates repair --id OPERATION_UUID --decision restore --confirm-version 0.1.40 +# Only for a committed operation, using its recorded candidate version: +roost updates repair --id OPERATION_UUID --decision resume --confirm-version 0.1.41 +``` + +The helper rejects the wrong decision/version. Repair cannot bypass failed +snapshot integrity or resurrect corrupt/missing journals; those require manual +forensic recovery from independently verified backups with the app stopped. +After commit, no automatic “restore previous data” option is offered. + +Retention is conservative: **no automatic deletion** of operations, snapshots, +failed data, or retained releases. Operators may archive old terminal operations +only during idle maintenance after keeping the last verified recovery pair and +the helper's pinned release. Never reclaim the only recovery pair to make an +update fit. Large installations may need operator-managed backup/update instead. + +## Verification and qualification + +See [verification evidence](ui-self-update-evidence/README.md) for matched rendered +screenshots, exact test results, disposable VM setup and remaining acceptance +gaps. Unqualified activation remains disabled despite the implemented engine and +UI. This is a safety gate pending evidence, not an HTTP-accessible override. diff --git a/scripts/package-release.mjs b/scripts/package-release.mjs index 7498cc5..7b45a3a 100644 --- a/scripts/package-release.mjs +++ b/scripts/package-release.mjs @@ -182,6 +182,21 @@ writeFileSync( )}\n`, ); +writeFileSync( + join(bundle, "compatibility.json"), + JSON.stringify({ + protocol: 1, + startupGate: 1, + app: { min: 0, max: 10, output: 10 }, + auth: { min: 0, max: 0, output: 0 }, + data: "complete-snapshot-v1", + externalState: "unchanged", + codex: pins.codex.version, + }), +); +for (const file of ["extract.py", "peer-broker.py"]) + copyReleaseTree(join(root, "src/updater", file), join(bundle, "cli", file)); + const archive = join(output, "roost-linux-x64.tar.gz"); execFileSync( diff --git a/scripts/test-updates-browser.mjs b/scripts/test-updates-browser.mjs new file mode 100644 index 0000000..2314222 --- /dev/null +++ b/scripts/test-updates-browser.mjs @@ -0,0 +1,174 @@ +/** Run against a disposable development preview. The qualified API responses are + * fixtures: this verifies rendered browser behavior, not release qualification. + * PLAYWRIGHT_MODULE may point to an existing Playwright installation. */ +import assert from "node:assert/strict"; + +const { chromium } = await import( + process.env.PLAYWRIGHT_MODULE ?? "playwright" +); +const base = process.env.UPDATE_TEST_URL ?? "http://127.0.0.1:4191"; +if (!/^http:\/\/(127\.0\.0\.1|localhost):\d+$/.test(base)) + throw new Error("Browser harness requires a disposable loopback preview."); +const browser = await chromium.launch({ + ...(process.env.CHROME_BINARY + ? { executablePath: process.env.CHROME_BINARY } + : {}), + args: ["--no-sandbox"], +}); +try { + for (const viewport of [ + { width: 1440, height: 1000 }, + { width: 390, height: 844 }, + ]) { + const context = await browser.newContext({ viewport }); + let posts = 0, + cancels = 0, + offline = false, + unauthorized = false; + let acceptedKey; + const status = { + capability: { + code: "supported", + reason: "Qualified updater fixture.", + canActivate: true, + }, + version: "0.1.40", + latest: { + id: "a".repeat(64), + version: "0.1.41", + notes: "", + checkedAt: Date.now(), + expiresAt: Date.now() + 600000, + }, + operation: null, + csrf: "fixture", + recent: true, + canCheck: true, + enrolled: true, + }; + await context.route("**/api/updates**", async (route) => { + const request = route.request(); + if (request.method() === "POST") { + if (request.url().endsWith("/cancel")) { + cancels++; + status.operation.phase = "cancelled"; + status.operation.cancellable = false; + return route.fulfill({ json: { operation: status.operation } }); + } + posts++; + acceptedKey = request.postDataJSON().key; + return route.abort("connectionreset"); // acceptance response was lost + } + if (offline) return route.abort("connectionrefused"); + if (unauthorized) + return route.fulfill({ status: 401, json: { error: "Sign in" } }); + return route.fulfill({ json: status }); + }); + const page = await context.newPage(); + const open = async (p) => { + await p.goto(`${base}/settings?group=updates`); + await p.getByRole("heading", { name: "Software updates" }).waitFor(); + await p.waitForTimeout(2500); + }; + await open(page); + await page + .getByRole("button", { name: "Update to 0.1.41", exact: true }) + .click(); + if (process.env.UPDATE_SCREENSHOT_DIR) { + await page.waitForTimeout(500); + await page.screenshot({ + path: `${process.env.UPDATE_SCREENSHOT_DIR}/confirmation-fixture-${viewport.width === 390 ? "mobile" : "desktop"}.png`, + fullPage: true, + }); + } + const confirm = page.getByRole("button", { + name: "Confirm update and outage", + }); + assert.equal(await confirm.isDisabled(), true); + await page.getByLabel("Type 0.1.41 to confirm").fill("0.1.40"); + assert.equal(await confirm.isDisabled(), true); + await page.getByLabel("Type 0.1.41 to confirm").press("Escape"); + assert.equal( + await page + .getByRole("button", { name: "Update to 0.1.41", exact: true }) + .evaluate((element) => element === document.activeElement), + true, + ); + await page + .getByRole("button", { name: "Update to 0.1.41", exact: true }) + .click(); + await page.getByLabel("Type 0.1.41 to confirm").fill("0.1.41"); + await confirm.click(); + await page + .getByText("Acceptance response was lost or refused.", { exact: false }) + .waitFor(); + assert.equal(posts, 1); + await page.reload(); + await page + .getByText("Checking an earlier confirmation.", { exact: false }) + .waitFor(); + assert.equal( + await page + .getByRole("button", { name: "Update to 0.1.41", exact: true }) + .isDisabled(), + true, + ); + const other = await context.newPage(); + await open(other); + assert.equal( + await other + .getByRole("button", { name: "Update to 0.1.41", exact: true }) + .isDisabled(), + true, + ); + status.operation = { + id: "11111111-1111-4111-8111-111111111111", + requestKey: acceptedKey, + phase: "draining", + version: "0.1.41", + previous: "0.1.40", + updatedAt: Date.now(), + cancellable: true, + committed: false, + blockers: ["A coding worker is uncertain."], + }; + await page + .getByRole("button", { name: "Cancel update", exact: true }) + .waitFor(); + await other + .getByRole("button", { name: "Cancel update", exact: true }) + .waitFor(); + offline = true; + await page + .getByText("Reconnecting…", { exact: false }) + .waitFor({ timeout: 15000 }); + assert.equal(posts, 1); + offline = false; + await page + .getByRole("button", { name: "Cancel update", exact: true }) + .click(); + await page + .getByText("Update cancelled", { exact: true }) + .waitFor({ timeout: 30000 }); + assert.equal(cancels, 1); + assert.equal(posts, 1); + unauthorized = true; + await page + .getByText("Sign in again to read the durable update result.", { + exact: false, + }) + .waitFor({ timeout: 15000 }); + assert.equal( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + true, + ); + await context.close(); + console.log( + `PASS rendered update confirmation/lost response/reload/two tabs/cancel/reauth ${viewport.width}x${viewport.height}`, + ); + } +} finally { + await browser.close(); +} diff --git a/scripts/test-updates-systemd.ts b/scripts/test-updates-systemd.ts new file mode 100644 index 0000000..ce3fefa --- /dev/null +++ b/scripts/test-updates-systemd.ts @@ -0,0 +1,85 @@ +/** Disposable-guest-only lifecycle driver. Never used by application or helper. + * Bundle with Vite SSR and run as the guest installation user in its own systemd + * unit. The guest must have the explicit marker below and this exact test root. */ + +import { randomUUID } from "node:crypto"; +import { existsSync } from "node:fs"; +import { readFile, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import { UpdateEngine } from "../src/updater/engine"; +import { readGate } from "../src/updater/gate"; +import { durableJson } from "../src/updater/journal"; +import { parseOffer } from "../src/updater/releases"; +import { systemdAdapter } from "../src/updater/systemd"; + +const root = "/home/ubuntu/roost-update-test"; +if (!existsSync("/etc/roost-update-disposable") || process.getuid?.() !== 1000) + throw new Error( + "This driver requires the explicitly marked disposable Ubuntu guest.", + ); +const config = JSON.parse(await readFile(join(root, "config.json"), "utf8")); +if (config.root !== root || config.user !== "ubuntu") + throw new Error("Fixture installation mismatch."); +const [version = "0.1.41", boundary = "none", mode = "run"] = + process.argv.slice(2); +const adapter = systemdAdapter(config, join(root, "current", "cli")); +const readyDeadline = Date.now() + 120000; +while (true) { + const open = readGate(root).mode === "open"; + let healthy = false; + if (open) { + if (!(await adapter.running())) healthy = true; + else + try { + healthy = ( + await fetch(`http://127.0.0.1:${config.port}/api/health`, { + signal: AbortSignal.timeout(2000), + }) + ).ok; + } catch { + /* Wait for the test app. */ + } + } + if (healthy) break; + if (Date.now() > readyDeadline) + throw new Error("Disposable fixture did not become ready."); + await delay(500); +} +// Artifacts are preinstalled copies of the built package in this lifecycle test. +// Network pinning and hostile archive rejection have separate isolated tests. +adapter.stage = async () => {}; +const engine = new UpdateEngine(root, adapter, 30000, async (phase) => { + if (phase !== boundary) return; + await durableJson(join(root, "boundary.json"), { phase, mode }); + if (mode === "kill") process.kill(process.pid, "SIGKILL"); + if (mode === "reboot") await new Promise(() => setInterval(() => {}, 1000)); +}); +const offer = parseOffer( + { + id: 1, + tag_name: `v${version}`, + draft: false, + prerelease: false, + assets: [ + { + id: 2, + name: "roost-linux-x64.tar.gz", + size: 1, + digest: `sha256:${"a".repeat(64)}`, + url: "https://api.github.com/repos/srctl/roost/releases/assets/2", + }, + ], + }, + "srctl/roost", + Date.now(), +); +const operation = await engine.accept({ + actor: "b".repeat(64), + key: randomUUID(), + offer, + confirmedVersion: version, +}); +await writeFile(join(root, "test-operation"), operation.id, { mode: 0o600 }); +await engine.settled(); +console.log(JSON.stringify(await engine.status())); diff --git a/src/cli/main.ts b/src/cli/main.ts index 5dcd765..ded23e1 100644 --- a/src/cli/main.ts +++ b/src/cli/main.ts @@ -15,6 +15,11 @@ import { dirname, join, resolve } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; import { Effect } from "effect"; import { AuthStore } from "../server/auth/store.server"; +import { updaterRequest } from "../updater/client"; +import { serveUpdater } from "../updater/daemon"; +import { enroll, readEnrollment } from "../updater/enrollment"; +import { readGate, startupGuard } from "../updater/gate"; +import { withKernelLock } from "../updater/lock"; import { activate, downloadRelease, @@ -45,6 +50,9 @@ const help = `Roost roost setup [--repository owner/repo] [--port 3000] [--skip-login] roost setup --login Sign in with the bundled Codex roost update [--version 0.1.0] + roost updates enroll Explicit operator enrollment (sudo) + roost updates status [--id UUID] Read-only helper diagnostics + roost updates repair --id UUID --decision restore|resume --confirm-version X.Y.Z roost auth setup --origin https://roost.example.com roost auth recover [--origin https://roost.example.com] roost server start @@ -256,6 +264,88 @@ async function main() { return; } + if (action === "updates") { + const [operation, ...rest] = args; + if (operation === "serve") { + flags(rest, {}); + await serveUpdater(root, join(bundle, "cli")); + return; + } + if (operation === "enroll") { + flags(rest, {}); + await enroll(await config(), (await readRelease(bundle)).version); + return; + } + if (operation === "repair") { + const options = flags(rest, { + "--id": "value", + "--decision": "value", + "--confirm-version": "value", + }); + console.log( + await updaterRequest(root, { + action: "repair", + id: options["--id"], + decision: options["--decision"], + version: options["--confirm-version"], + }), + ); + return; + } + if (operation === "status") { + const options = flags(rest, { "--id": "value" }); + // Diagnostics are independently available even if the web app/socket is down. + const { readJournal } = await import("../updater/journal"); + const { readdir } = await import("node:fs/promises"); + const enrollment = await readEnrollment(root); + console.log( + JSON.stringify( + { + unit: serviceName(enrollment.installation), + helper: `roost-${enrollment.installation.uid}-updater.service`, + root, + gate: { + mode: readGate(root).mode, + operation: readGate(root).operation, + }, + lockOwner: existsSync(join(root, "updater-owner.json")) + ? JSON.parse( + await readFile(join(root, "updater-owner.json"), "utf8"), + ) + : null, + }, + null, + 2, + ), + ); + for (const id of await readdir(join(root, "updates"))) { + if ( + !/^[a-f0-9-]{36}$/.test(id) || + (options["--id"] && id !== options["--id"]) + ) + continue; + const journal = await readJournal(root, id); + console.log( + JSON.stringify( + { + id, + phase: journal.phase, + previous: journal.previous, + candidate: journal.candidate, + snapshotDigest: journal.snapshotDigest, + location: join(root, "updates", id), + }, + null, + 2, + ), + ); + } + return; + } + throw new Error( + "Use roost updates enroll or status. Recovery runs automatically in the supervised helper; inspect its journal before operator repair.", + ); + } if (action === "auth") { const [operation, ...rest] = args; if (operation !== "setup" && operation !== "recover") @@ -263,20 +353,29 @@ async function main() { const options = flags(rest, { "--origin": "value" }); if (operation === "setup" && !options["--origin"]) throw new Error("Specify --origin https://your-host."); - const store = new AuthStore( - resolve(process.env.ROOST_DATA_DIR ?? join(root, "data")), - ); - try { - const link = store.setup(options["--origin"], operation === "recover"); - console.log( - "Open this private, single-use link within 15 minutes to register your passkey:", + await withKernelLock(root, async () => { + if ( + existsSync(join(root, "updater.json")) && + readGate(root).mode !== "open" + ) + throw new Error( + "Authentication recovery must wait for updater recovery.", + ); + const store = new AuthStore( + resolve(process.env.ROOST_DATA_DIR ?? join(root, "data")), ); - console.log(link); - if (operation === "recover") - console.log("Previous passkeys and sessions were revoked."); - } finally { - store.close(); - } + try { + const link = store.setup(options["--origin"], operation === "recover"); + console.log( + "Open this private, single-use link within 15 minutes to register your passkey:", + ); + console.log(link); + if (operation === "recover") + console.log("Previous passkeys and sessions were revoked."); + } finally { + store.close(); + } + }); return; } if (process.platform !== "linux" || process.arch !== "x64") @@ -298,7 +397,37 @@ async function main() { } if (action === "update") { const options = flags(args, { "--version": "value" }); - await withLock(root, () => update(options)); + if (existsSync(join(root, "updater.json"))) { + const status = await updaterRequest<{ + latest?: { id: string; version: string; expiresAt: number }; + }>(root, { action: "status" }); + const offer = + status.latest && status.latest.expiresAt > Date.now() + ? status.latest + : await updaterRequest<{ id: string; version: string }>(root, { + action: "check", + }); + if (!options["--version"]) + throw new Error( + `Confirm the exact offer with roost update --version ${offer.version}. This requires an outage.`, + ); + if (options["--version"] !== offer.version) + throw new Error( + "Enrolled CLI updates accept only the pinned latest stable offer.", + ); + const { createHash, randomUUID } = await import("node:crypto"); + console.log( + await updaterRequest(root, { + action: "accept", + offerId: offer.id, + version: offer.version, + key: randomUUID(), + actor: createHash("sha256") + .update(`operator:${userInfo().uid}`) + .digest("hex"), + }), + ); + } else await withLock(root, () => update(options)); return; } @@ -312,6 +441,8 @@ async function main() { const c = await config(); if (operation === "run") { const release = await readRelease(bundle); + startupGuard(root, release.version, process.env.ROOST_UPDATE_TOKEN); + process.env.ROOST_PUBLIC_DIR = join(bundle, "app/public"); process.env.HOST = "127.0.0.1"; process.env.NITRO_HOST = "127.0.0.1"; process.env.PORT = String(c.port); @@ -340,11 +471,17 @@ async function main() { return; } if (operation === "start") { - await withLock(root, () => start(c)); + if (existsSync(join(root, "updater.json"))) + await updaterRequest(root, { action: "start" }); + else await withLock(root, () => start(c)); return; } if (operation === "stop") { + if (existsSync(join(root, "updater.json"))) { + await updaterRequest(root, { action: "stop" }); + return; + } await withLock(root, async () => { await service(c, "stop"); console.log( diff --git a/src/cli/state.ts b/src/cli/state.ts index bdb71d6..958d454 100644 --- a/src/cli/state.ts +++ b/src/cli/state.ts @@ -89,5 +89,9 @@ export async function withLock( root: string, action: () => Promise, ): Promise { + if (existsSync(join(root, "updater.json"))) + throw new Error( + "This installation is enrolled. Use the supervised updater; setup and legacy direct operations are fenced.", + ); return withKernelLock(root, () => withLegacyLock(root, action)); } diff --git a/src/components/conversation/composer.tsx b/src/components/conversation/composer.tsx index debdaaa..5fcea00 100644 --- a/src/components/conversation/composer.tsx +++ b/src/components/conversation/composer.tsx @@ -15,6 +15,8 @@ import { MAX_FILE_BYTES, } from "../../features/chat/files"; import { usePreferences } from "../../features/settings/preferences"; +import { readDraft, saveDraft } from "../../features/updates/drafts"; +import { useUpdateBlocked } from "../../features/updates/state"; import { motion } from "../../styles/motion.stylex"; import { colors } from "../../styles/tokens.stylex"; import { Appear } from "../ui/appear"; @@ -38,11 +40,29 @@ export function Composer({ onSend: (text: string, files: readonly FileAttachment[]) => Promise; onStop: () => void; }) { + const updating = useUpdateBlocked(); const [hydrated, setHydrated] = useState(false); useEffect(() => setHydrated(true), []); const [text, setText] = useState(""); const hasText = text.trim().length > 0; const [files, setFiles] = useState([]); + const [draftLoaded, setDraftLoaded] = useState(null); + useEffect(() => { + const draft = readDraft(agentId); + setText(draft?.text ?? ""); + setFiles(draft?.files ?? []); + setDraftLoaded(agentId); + }, [agentId]); + useEffect(() => { + if (draftLoaded === agentId) + try { + saveDraft(agentId, text, files); + } catch { + setUploadError( + "Draft could not be retained locally. Keep this tab open during an update.", + ); + } + }, [agentId, text, files, draftLoaded]); const [uploading, setUploading] = useState(false); const [sending, setSending] = useState(false); const submitting = useRef(false); @@ -81,10 +101,11 @@ export function Composer({ // away from the tap. Keep focus; the native click still submits the form. if (event.button === 0 && document.activeElement === input.current) event.preventDefault(); + if (updating) return; } async function attach(selected: FileList | readonly File[] | null) { - if (!selected?.length) return; + if (!selected?.length || updating) return; if (loading || submitting.current || uploading) { setUploadError( uploading @@ -140,6 +161,7 @@ export function Composer({ async function submit(event: FormEvent) { event.preventDefault(); + if (updating) return; if ( loading || submitting.current || @@ -236,6 +258,7 @@ export function Composer({ uploading || files.length >= MAX_ATTACHMENTS } + blockDuringUpdate onClick={() => fileInput.current?.click()} xstyle={styles.attachButton} > @@ -268,6 +291,7 @@ export function Composer({ !event.nativeEvent.isComposing ) { event.preventDefault(); + if (updating) return; event.currentTarget.form?.requestSubmit(); } }} @@ -279,6 +303,7 @@ export function Composer({ key="stop" type="button" onMouseDown={keepInputFocus} + allowDuringUpdate onClick={onStop} disabled={!hydrated} aria-label="Stop response" diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index dbaae96..532fc8a 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -1,20 +1,34 @@ import { Button as ButtonPrimitive } from "@base-ui/react/button"; import * as stylex from "@stylexjs/stylex"; +import { useUpdateBlocked } from "../../features/updates/state"; import { motion } from "../../styles/motion.stylex"; import { colors } from "../../styles/tokens.stylex"; // Adapted from shadcn/ui's Base UI button; see THIRD_PARTY_NOTICES.md. export function Button({ + allowDuringUpdate = false, + blockDuringUpdate = false, xstyle, className, ...props -}: ButtonPrimitive.Props & { xstyle?: stylex.StyleXStyles }) { +}: ButtonPrimitive.Props & { + xstyle?: stylex.StyleXStyles; + allowDuringUpdate?: boolean; + blockDuringUpdate?: boolean; +}) { + const updating = useUpdateBlocked(); const base = stylex.props(styles.button, xstyle); return ( [ base.className, diff --git a/src/components/update-notice.tsx b/src/components/update-notice.tsx new file mode 100644 index 0000000..bbf27f6 --- /dev/null +++ b/src/components/update-notice.tsx @@ -0,0 +1,50 @@ +import { Link } from "@tanstack/react-router"; +import { useEffect, useState } from "react"; +import { + isUpdateActive, + phaseLabel, + publishUpdate, + type UpdateStatus, + useUpdateBlocked, +} from "../features/updates/state"; +export function UpdateNotice() { + const blocked = useUpdateBlocked(); + const [status, setStatus] = useState(null); + useEffect(() => { + let stopped = false; + let timer: ReturnType; + const poll = async () => { + try { + const response = await fetch("/api/updates", { + cache: "no-store", + signal: AbortSignal.timeout(5000), + }); + if (response.ok) { + const next = (await response.json()) as UpdateStatus; + if (!stopped) { + setStatus(next); + publishUpdate(next); + } + } + } catch { + /* Keep the last known admission notice during an outage. */ + } finally { + if (!stopped) timer = setTimeout(poll, 4000); + } + }; + void poll(); + return () => { + stopped = true; + clearTimeout(timer); + }; + }, []); + return status && isUpdateActive(status.operation) ? ( +

+ ) : null; +} diff --git a/src/components/update-setting.tsx b/src/components/update-setting.tsx index a644a50..f2e1b7f 100644 --- a/src/components/update-setting.tsx +++ b/src/components/update-setting.tsx @@ -1,77 +1,163 @@ import * as stylex from "@stylexjs/stylex"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; +import { + isUpdateActive, + pendingAcceptance, + pendingKey, + phaseLabel, + publishUpdate, + rememberAcceptance, + rememberResult, + type UpdateStatus, +} from "../features/updates/state"; import { colors } from "../styles/tokens.stylex"; -import type { Capability } from "../updater/contract"; -import type { Offer } from "../updater/releases"; +import { compareVersions, stableVersion } from "../updater/contract"; import { Button } from "./ui/button"; -type Status = { - capability: Capability; - version: string; - latest: Offer | null; - canCheck: boolean; - csrf: string | null; - recent: boolean; -}; - export function UpdateSetting() { - const [status, setStatus] = useState(null); + const [status, setStatus] = useState(null); const [message, setMessage] = useState("Loading update availability…"); const [checking, setChecking] = useState(false); + const [confirm, setConfirm] = useState(false); + const [version, setVersion] = useState(""); + const [sending, setSending] = useState(false); + const [uncertain, setUncertain] = useState(false); + const newer = + !!status?.latest && + stableVersion.test(status.version) && + compareVersions(status.latest.version, status.version) > 0; + const confirmation = useRef(null); + const confirmationTrigger = useRef(null); + function closeConfirmation() { + setConfirm(false); + confirmationTrigger.current?.focus(); + } useEffect(() => { - const abort = new AbortController(); - fetch("/api/updates", { cache: "no-store", signal: abort.signal }) - .then(async (response) => { - if (!response.ok) - throw new Error( - "Could not load update availability. Sign in or reload to retry.", + let stopped = false; + let timer: ReturnType; + let attempt = 0; + setUncertain(!!pendingAcceptance()); + const poll = async () => { + try { + const response = await fetch("/api/updates", { + cache: "no-store", + signal: AbortSignal.timeout(10000), + }); + if (response.status === 401) { + setMessage( + "Sign in again to read the durable update result. Do not resubmit the update.", ); - return (await response.json()) as Status; - }) - .then((value) => { + return; + } + if (!response.ok) throw new Error(); + const value = (await response.json()) as UpdateStatus; + if (stopped) return; setStatus(value); - setMessage(""); - }) - .catch(() => { - if (!abort.signal.aborted) + publishUpdate(value); + if (!rememberResult(value.operation)) { setMessage( - "Could not load update availability. Sign in or reload to retry.", + "Browser storage is unavailable. Keep this tab open to observe the operation.", ); - }); - return () => abort.abort(); + return; + } + attempt = 0; + const pending = pendingAcceptance(); + setUncertain(!!pending && pending.key !== value.operation?.requestKey); + if ( + value.operation && + (!pending || pending.key === value.operation.requestKey) + ) { + setMessage(value.error ?? ""); + } else if (!pending) setMessage(value.error ?? ""); + } catch { + if (!stopped) + setMessage( + "Reconnecting… Roost may be restarting. No result has been confirmed; no request will be replayed.", + ); + attempt++; + } finally { + if (!stopped) + timer = setTimeout( + poll, + Math.min(30000, 2000 * 2 ** Math.min(attempt, 4)) + + Math.random() * 500, + ); + } + }; + void poll(); + const changed = () => { + setUncertain(!!pendingAcceptance()); + }; + window.addEventListener("storage", changed); + return () => { + stopped = true; + clearTimeout(timer); + window.removeEventListener("storage", changed); + }; }, []); + useEffect(() => { + if (confirm) confirmation.current?.focus(); + }, [confirm]); + async function post(path: string, body: unknown) { + const response = await fetch(path, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Roost-CSRF": status?.csrf ?? "", + }, + body: JSON.stringify(body), + signal: AbortSignal.timeout(22000), + }); + const result = await response.json(); + if (!response.ok) throw new Error(result.error ?? "Request not confirmed."); + return result; + } async function check() { - if (!status?.csrf || checking) return; setChecking(true); - setMessage("Checking published releases…"); try { - const response = await fetch("/api/updates/check", { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Roost-CSRF": status.csrf, - }, - body: "{}", - signal: AbortSignal.timeout(20000), - }); - const result = (await response.json()) as { - latest?: Offer; - error?: string; - }; - if (!response.ok || !result.latest) - throw new Error(result.error ?? "Could not check releases."); - setStatus({ ...status, latest: result.latest }); + const result = await post("/api/updates/check", {}); + setStatus((s) => (s ? { ...s, latest: result.latest } : s)); + setMessage( + "Release metadata checked. The updater verifies artifact and migration compatibility before stopping Roost.", + ); + } catch (e) { + setMessage(e instanceof Error ? e.message : "Check failed."); + } finally { + setChecking(false); + } + } + async function activate() { + if (!status?.latest || sending || version !== status.latest.version) return; + const key = crypto.randomUUID(); + try { + rememberAcceptance(key, version); + } catch { setMessage( - "Release metadata checked. Activation compatibility has not been verified.", + "Browser storage is unavailable. Enable it before updating so acceptance can be reconciled after a disconnect.", ); - } catch (error) { + return; + } + setSending(true); + setUncertain(true); + setConfirm(false); + try { + const result = await post("/api/updates", { + offerId: status.latest.id, + version, + key, + }); + setStatus({ ...status, operation: result.operation }); + if (!rememberResult(result.operation)) + setMessage( + "The update was accepted, but browser storage is unavailable. Keep this tab open to observe it.", + ); + setUncertain(false); + } catch { setMessage( - error instanceof Error - ? error.message - : "Could not check releases. Try again.", + "Acceptance response was lost or refused. Reading durable status; do not submit again. If no operation appears, inspect updater status before a new confirmation.", ); } finally { - setChecking(false); + setSending(false); } } return ( @@ -94,7 +180,6 @@ export function UpdateSetting() {

Checked {new Date(status.latest.checkedAt).toLocaleString()}. - Compatibility is not yet verified.

Release notes @@ -105,7 +190,13 @@ export function UpdateSetting() { )} + )} + {confirm && ( +
+

+ Roost will be unavailable briefly. Active or uncertain work + defers the update. Startup failure may restore the previous + release and matching data. External actions cannot be undone. +

+ + + +
+ )} + {status.operation && ( +
+

+ {phaseLabel[status.operation.phase] ?? status.operation.phase} +

+ {status.operation.bytes !== undefined && ( +

+ {status.operation.bytes.toLocaleString()} bytes downloaded +

+ )} + {status.operation.blockers?.map((b) => ( +

{b}

+ ))} + {status.operation.error &&

{status.operation.error}

} + {status.operation.cancellable && ( + + )} + {!isUpdateActive(status.operation) && ( + + )} +
+ )} + {!status.capability.canActivate && ( +

+ UI installation and restart are not enabled for this installation. + Updates require an outage; external actions cannot be undone.

)} -

- UI installation and restart are not enabled in this build. Updates - require an outage; external actions cannot be undone. -

)} + {uncertain && ( +

+ Checking an earlier confirmation. No activation request will be + automatically repeated. +

+ )} + {uncertain && status && !isUpdateActive(status.operation) && ( + + )}

{message}

diff --git a/src/features/agents/functions.ts b/src/features/agents/functions.ts index ff2daa6..0214729 100644 --- a/src/features/agents/functions.ts +++ b/src/features/agents/functions.ts @@ -36,9 +36,11 @@ const result = ( ), ); -export const getAgents = createServerFn({ method: "GET" }) - .middleware([available]) - .handler(() => result(listAgents())); +// Read-only navigation remains available during update drain. Full startup gates +// still reject ordinary HTTP before any loader runs. +export const getAgents = createServerFn({ method: "GET" }).handler(() => + result(listAgents()), +); export const getConnection = createServerFn({ method: "GET" }) .middleware([available]) diff --git a/src/features/chat/functions.ts b/src/features/chat/functions.ts index 2f6a5c4..e889a22 100644 --- a/src/features/chat/functions.ts +++ b/src/features/chat/functions.ts @@ -3,9 +3,11 @@ import { setResponseHeader } from "@tanstack/react-start/server"; import { Effect, Schema } from "effect"; import { withAgentStore } from "../../server/agents/store.server"; import { available } from "../../server/available"; +import { isMaintenance } from "../../server/maintenance.server"; import { readConversationSnapshot } from "../../server/runs/conversation-snapshot.server"; import { cancelRun, enqueueChat } from "../../server/runs/store.server"; import { ensureTimeline, startWorker } from "../../server/runs/worker.server"; +import { appGate } from "../../updater/gate"; import { SendMessage } from "./schema"; const result = (effect: Effect.Effect) => @@ -33,7 +35,6 @@ export type InitialConversation = Awaited< >; export const getConversation = createServerFn({ method: "GET" }) - .middleware([available]) .validator( Schema.decodeUnknownSync( Schema.Struct({ @@ -43,7 +44,12 @@ export const getConversation = createServerFn({ method: "GET" }) }), ), ) - .handler(({ data }) => { + .handler(async ({ data }) => { + if ( + appGate().mode === "drain" || + (await Effect.runPromise(withAgentStore(isMaintenance))) + ) + return result(readConversationSnapshot(data.agentId, data)); startWorker(); return result( @@ -79,7 +85,6 @@ export const stopMessage = createServerFn({ method: "POST" }) .handler(({ data }) => result(cancelRun(data.agentId, data.id))); export const getActivityOutput = createServerFn({ method: "GET" }) - .middleware([available]) .validator( Schema.decodeUnknownSync( Schema.Struct({ agentId: Schema.UUID, id: Schema.String }), diff --git a/src/features/coding/functions.ts b/src/features/coding/functions.ts index 079fd37..d75d697 100644 --- a/src/features/coding/functions.ts +++ b/src/features/coding/functions.ts @@ -64,7 +64,6 @@ export const removeExecutionProfile = createServerFn({ method: "POST" }) ); export const getCodingJobs = createServerFn({ method: "GET" }) - .middleware([available]) .validator(Schema.decodeUnknownSync(AgentInput)) .handler(({ data }) => result(listCodingJobs(data.agentId))); diff --git a/src/features/updates/drafts.ts b/src/features/updates/drafts.ts new file mode 100644 index 0000000..9808ef8 --- /dev/null +++ b/src/features/updates/drafts.ts @@ -0,0 +1,63 @@ +import { type FileAttachment, MAX_FILE_BYTES } from "../chat/files"; + +const prefix = "roost-composer-draft-v2:"; +function tab() { + let value = sessionStorage.getItem("roost-draft-tab"); + if (!value) { + value = crypto.randomUUID(); + sessionStorage.setItem("roost-draft-tab", value); + } + return value; +} +export function readDraft( + agentId: string, +): { text: string; files: FileAttachment[] } | null { + try { + const validFile = (file: FileAttachment | null) => + file && + typeof file.id === "string" && + /^[a-f0-9-]{36}$/.test(file.id) && + typeof file.name === "string" && + file.name.length <= 1000 && + typeof file.mimeType === "string" && + file.mimeType.length <= 256 && + ["attachment", "artifact"].includes(file.kind) && + Number.isSafeInteger(file.size) && + file.size >= 0 && + file.size <= MAX_FILE_BYTES && + file.url === `/api/files?agentId=${agentId}&id=${file.id}`; + const own = localStorage.getItem(`${prefix}${agentId}:${tab()}`); + const entries = own + ? [own] + : Object.keys(localStorage) + .filter((key) => key.startsWith(`${prefix}${agentId}:`)) + .map((key) => localStorage.getItem(key)!); + const values = entries + .map((value) => JSON.parse(value)) + .filter( + (value) => + typeof value.text === "string" && + value.text.length < 1024 * 1024 && + Array.isArray(value.files) && + value.files.length <= 5 && + value.files.every(validFile), + ) + .sort((a, b) => b.updatedAt - a.updatedAt); + return values[0] ?? null; + } catch { + return null; + } +} +export function saveDraft( + agentId: string, + text: string, + files: readonly FileAttachment[], +) { + const value = JSON.stringify({ text, files, updatedAt: Date.now() }); + if (value.length > 2 * 1024 * 1024) + throw new Error("Draft exceeds local storage limit."); + const key = `${prefix}${agentId}:${tab()}`; + // Empty drafts are tombstones for this tab, so reload cannot revive another + // tab's already-sent draft. Other tabs' independent drafts are preserved. + localStorage.setItem(key, value); +} diff --git a/src/features/updates/state.ts b/src/features/updates/state.ts new file mode 100644 index 0000000..35631a8 --- /dev/null +++ b/src/features/updates/state.ts @@ -0,0 +1,101 @@ +import { useSyncExternalStore } from "react"; +import type { UpdateSummary } from "../../updater/daemon"; +export type UpdateStatus = { + capability: { code: string; reason: string; canActivate: boolean }; + version: string; + latest: { + id: string; + version: string; + notes: string; + checkedAt: number; + expiresAt: number; + } | null; + operation: UpdateSummary | null; + csrf: string | null; + recent: boolean; + canCheck: boolean; + enrolled: boolean; + error?: string; +}; +let blocked = false; +const subscribers = new Set<() => void>(); +export const isUpdateActive = (operation: UpdateSummary | null) => + !!operation && + !["succeeded", "rolled-back", "failed", "cancelled", "deferred"].includes( + operation.phase, + ); +export function publishUpdate(status: UpdateStatus) { + const next = + !!status.operation && + [ + "draining", + "stopping", + "snapshot-complete", + "activating", + "verifying", + "committed", + "restoring", + "manual-recovery", + ].includes(status.operation.phase); + if (next !== blocked) { + blocked = next; + for (const listener of subscribers) listener(); + } +} +export function useUpdateBlocked() { + return useSyncExternalStore( + (listener) => { + subscribers.add(listener); + return () => { + subscribers.delete(listener); + }; + }, + () => blocked, + () => false, + ); +} +export const pendingKey = "roost-update-pending-v1"; +export function rememberAcceptance(key: string, version: string) { + localStorage.setItem( + pendingKey, + JSON.stringify({ key, version, created: Date.now() }), + ); +} +export function pendingAcceptance(): { key: string; version: string } | null { + try { + return JSON.parse(localStorage.getItem(pendingKey) ?? "null"); + } catch { + return null; + } +} +export function rememberResult(operation: UpdateSummary | null) { + if (!operation) return true; + try { + localStorage.setItem("roost-update-operation-v1", operation.id); + if ( + !isUpdateActive(operation) && + pendingAcceptance()?.key === operation.requestKey + ) + localStorage.removeItem(pendingKey); + return true; + } catch { + return false; + } +} +export const phaseLabel: Record = { + accepted: "Downloading", + staged: "Verifying", + draining: "Waiting for work", + stopping: "Stopping writers and backing up", + "snapshot-complete": "Backup complete", + activating: "Switching release", + verifying: "Checking startup", + committed: "Committing update", + restoring: "Restoring previous version and data", + "rolled-back": "Previous version and data restored", + succeeded: "Update succeeded", + cancelled: "Update cancelled", + deferred: "Update deferred — work is still active", + failed: "Update failed before activation", + "manual-recovery": "Manual recovery required", +}; diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 4d42e84..d88e64c 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -2,6 +2,7 @@ import * as stylex from "@stylexjs/stylex"; import { createRootRoute, HeadContent, Scripts } from "@tanstack/react-router"; import type { ReactNode } from "react"; import { App } from "../app"; +import { UpdateNotice } from "../components/update-notice"; import { getAgents } from "../features/agents/functions"; import { getComputerStatus } from "../features/computer/functions"; import { getDashboardSetting } from "../features/dashboards/functions"; @@ -93,6 +94,7 @@ function RootDocument({ children }: { children: ReactNode }) { + {children} diff --git a/src/routes/agents.$agentId_.jobs.tsx b/src/routes/agents.$agentId_.jobs.tsx index 4bf4980..44c5ef1 100644 --- a/src/routes/agents.$agentId_.jobs.tsx +++ b/src/routes/agents.$agentId_.jobs.tsx @@ -217,6 +217,7 @@ function AgentJobs({