dev-updater now carries a built-in service implementation, generated from a template and driven through the identical interface a project-supplied script uses, so a project whose service is unremarkable no longer writes one. ai-app's was unremarkable: `ExecStart=$BINARY` and `command="$BINARY"` with no arguments and no environment. 233 lines of it, and the half that matters most -- the OpenRC branch, which neither project can exercise from a systemd machine -- existed twice, so a fix found by testing would have had two places to land and no way to notice the second. The field keeps its name; `Managed` takes the command, resolved against the component's `cwd`. The one thing the script said that the built-in cannot is kept, in AGENTS.md rather than lost: Stop on this card takes down the server a phone reaches through the tunnel, while Dev Updater itself is unaffected because it uses its own port -- which is exactly what makes that button easy to press and easy to regret. NOT SAFE TO PULL BLIND. A managed service is named after the component, so this one becomes `app-backend` while the installed one still has the name the script gave it. Uninstall from the backend card *before* taking this change, then Install after; pulling first orphans a service that stays enabled and starts at boot with nothing pointing at it.
42 lines
1.9 KiB
Plaintext
42 lines
1.9 KiB
Plaintext
// Read by Dev Updater. Structured as the body of the config: no outer
|
|
// parentheses, so nothing here is indented for the sake of a wrapper.
|
|
//
|
|
// This file sits at the checkout root because the project Dev Updater
|
|
// serves is the whole repository -- one checkout producing two things.
|
|
// Each component says where it lives with `cwd`, relative to this
|
|
// directory, rather than one of them reaching out of the other with `../`.
|
|
|
|
// What to call this project before there is a build to read a label from.
|
|
// A built APK wins: it is the authority on what will actually install.
|
|
label: "AI Sessions",
|
|
|
|
// Walked in order, and the order is the point: the backend is built and
|
|
// delivered first, so a failing APK build leaves the phone the APK it
|
|
// already had rather than half of a matched pair.
|
|
components: [
|
|
Server(
|
|
name: "backend",
|
|
build: "cargo build --release",
|
|
cwd: "server",
|
|
// Dev Updater's own built-in service implementation, generated
|
|
// into its data directory and driven through the same interface a
|
|
// project-supplied script would be. ai-app carried a script of its
|
|
// own until 2026-08-28; it ran `target/release/ai-server` with no
|
|
// arguments and no environment, which is the generic case exactly,
|
|
// so it was two copies of one thing and the copy that could not be
|
|
// tested from here -- the OpenRC branch -- was duplicated with it.
|
|
//
|
|
// Resolved against this component's `cwd`, so this is
|
|
// `server/target/release/ai-server`.
|
|
service: Managed("target/release/ai-server"),
|
|
),
|
|
Apk(
|
|
name: "app",
|
|
// Resolved against this directory, and run in `app/` -- the script
|
|
// cds to its own directory anyway, so the cwd is here to say where
|
|
// the app is rather than because the build needs it.
|
|
build: "app/build-apk.sh",
|
|
cwd: "app",
|
|
),
|
|
],
|