Repository navigation
Luban OS: one tray, the host's pointer and keyboard, xdesk arrangements, versions made visible, quick start; release 2026.10.19.2 - #682
Merged
Conversation
…ents, versions, quick start (2026-10-19) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… five on one cell are the line's three and the word's two (F12) The test double-clicked a cell and then triple-clicked the same one: on a quick machine the five clicks are one run (the third selects the line and starts over, the fifth is a word again), on a slow one two. The product counts as xterm does; the test assumed a pause. The line is now three clicks on another cell of the line, and five quick clicks on one cell are asserted to be the word. Design 2026-10-19 §14 (X1). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…check no longer reports it (F10) tiny's luban status --check said busybox did not start: BusyBox called by the name of an applet it was not built with answers "applet not found" with exit 127, which the probe read as a loader failure. That answer means it ran. root_check::started() is the decision, exported and unit-tested. Design 2026-10-19 §14 (X2). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ce, answers in events -- luban history of a domain's system (F13)
run_domain_operation_ ran the routed command in the domain as a plain
command: its data and errors were text on an inherited stdout, and a caller
reading NDJSON (luban, the window) saw nothing -- `luban history desktop-3`
printed nothing for a system of 41 generations, exit 0. With nobody at a
terminal it now takes run_domain_relayed_, the one relayed path `subos new`
already used; the commands that hand the terminal to a program (exec, use,
start, log) keep it. luban's history says when the answer has no list
("could not read" is never "none").
tests/requirements.toml declares the design's requirement IDs (planned until
their commits land); SUBOS-DOMAIN-RELAYED is required with this one.
Design 2026-10-19 §12.4 (X3).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…e prompt mark (F23-F28) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…r's read-only commands make and say nothing; luban run's output is the program's
- subos new --from without a version: when the index cannot be read it stops
("xlings update, or name a version"); when the index has no such package
and one is installed, that one is used and said (data installed_only, the
shape of passed_over; luban passes it on). Each said once though a rootfs
resolves its base twice.
- Inside a Luban system, a user with no ~/.xlings yet: a read-only command
(home::is_read_only_command, told to Config by main before first use) reads
the system's home -- no ~/.xlings made, no notice. The first write says once
where it installs and how to install for every user: from the host,
luban run <system> --user root -- xlings install --system <pkg>; no sudo.
- Running a program in a system (luban run, subos exec) says the injected
variables' count only with -v; a variable that could not be set is said
either way. subos use --shell keeps its report.
Design 2026-10-19 §9.2, §19 (X5; F4, F18, F21).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…wo units, module names unchanged modules/home (xlings.home.format) and modules/store (xlings.store) were each one file under 200 lines, both about what a home is: its layout and what is kept in it. They are one package now (design 2026-10-19 §21: a package is a responsibility with weight, not a file). Module names and imports are unchanged; modules/subos depends on home for xlings.store. Only moved. Design 2026-10-19 §21 (X6). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…y moved 5335 lines flat in one directory, and the tray process, the pointer, the keyboard and the catalogue are about to arrive (design 2026-10-19 §21): the views (launcher, management, system views, console, display), the art and the test script move into their own directories; the app's core stays at the top. Only moved. Design 2026-10-19 §21 (X7). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…package of its own -- only moved - xdesk.compositor's server.cpp (1294 lines, one structure) is a partition (:server, internal) declaring the session's state, and units defining it by area: server (start, loop, provider), windows, input, text (input method, clipboard), output (size, density, fonts, frames), desktop (title bars, panel, launcher, programs). Options moves to an exported partition (:options) the server's parts can see; the public interface is unchanged. - xdesk.layout moves from xdesk-base to a new kit, xdesk-layout: pure logic, about to grow (spaces x arrangements, drag targets, rules), used by the compositor and the unit tests. Module names unchanged. The xdesk e2e tests and test_xdesk_layout pass unchanged. Design 2026-10-19 §21 (X8). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…, search; libxpkg 0.0.66 - libxpkg 0.0.66 (extensions kept as JSON text). Across the recipe boundary a package now carries its status, type, extensions and the loader's warnings: before, a recipe read in the worker came back "dev" with no type. - package_info's package and search_packages' packages[] carry `status`, `extensions` (the recipe's, an object keyed by namespace) and `passed_over`; `xlings info -v` names the namespaces and what the loader dropped. - The handshake's features add package_extensions, domain_relayed and installed_only; the protocol version stays 1.12 (additive). - Specs: xpkg-manifest-v1 §3.1 (extensions: rules, registry, the luban namespace), interface-ndjson-v1 §7.6, §7.7, §10.1; the authoring guide. Design 2026-10-19 §8 (X10). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… by domain, registered in main modules/i18n holds the mechanism every program shares (design 2026-10-19 §7): tr/trf, the language (an override variable, the setting, the system) with a BCP 47 fallback chain (xlings.i18n:locale), catalogues registered by domain, check() of a domain's catalogues, pick() for words that come with data, and a glossary of terms written in English. The module name is unchanged; its 29 importers did not change. modules/ui keeps xlings' words and registers them as the domain "xlings" (xlings.ui.i18n), first thing in xlings' main -- nothing depends on the order static objects start. The check found zh's panel headings keyed by their English text; that convention (such a key is its own English) is now written down and checked rather than accidental. Behaviour unchanged (xlings --help in en and zh as before). Design 2026-10-19 §7, §21 (X9). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ied without waiting - xlings.platform:local_socket: LocalListener and LocalStream, a byte stream between one user's processes addressed by a path -- AF_UNIX on Linux and macOS, and on Windows 10 1803 and later (where unix_*_stream were -1) -- owner-only, non-inheritable, non-blocking, with wait_readable() over several. A listener replaces a socket file a crashed one left, removes its own when closed, and says when a path is too long for the address. - FileLock::try_acquire: the lock now or not at all; held by another is not an error. A process is alive while it holds its lock (no pid). What the Luban OS tray and its windows speak over. Tests run on the three platforms' runners. Design 2026-10-19 §3.2, §3.7 (X11). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ointerLock ('l'), every shape named (0.3); opencaps registry
opensal 0.3 (design 2026-10-19 §15):
- Who draws the pointer, written down: a consumer that wants Cursor draws no
pointer into its frames; it names the shape ('c') or, with CursorImage
(new), sends one ('C': at most 256x256, its hotspot), and the provider draws
it with its own system's pointer -- a moving pointer costs no frame.
Exactly one pointer is shown.
- PointerLock (new): 'l' 1/0 holds the pointer; relative motion comes back
as the PointerRelative event; the provider releases it on its own chord.
- kCursors: the 16 names the Luban theme draws (grabbing, the diagonal
resizes, crosshair, wait, progress, not-allowed, help added).
A side skips what it does not know (§6.3): older peers are unaffected.
opencaps: each registered level may name the package that brings it to a
system (desktop-cursor: luban:cursors); app-capabilities 1 and tray-protocol 1
registered.
Design 2026-10-19 §10, §15 (X15).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…, in one package, with when it goes luban.compat (design 2026-10-19 §15.3) holds each judgement Luban keeps only for an older release, with the version it serves, the version it came in and the condition for removing it: - :editions -- frozen subos:luban-* names and their luban: successors; the service, the luban command and the app now ask it instead of matching the prefix in eight places. - :pointer -- an xdesk of 2026.10.18.1 or before asks for no Cursor and draws no pointer: the host shows its own arrow (used by the host in X23). - :processes -- Luban OS windows of 2026.10.18.1 or before register nowhere: found among the user's processes (platform::own_processes, Linux; macOS and Windows say they could not look), never ended. tools/lint_compat.sh (in the lint suite): outside luban/os/compat, luban/ and apps/ name no frozen edition and write no released version into code. The compatibility spec (§3.1) and the package README list the entries; a test per entry pins the old behaviour and that both lists have it. luban's help names `--from luban:<edition>` as new's xlings equivalent. Design 2026-10-19 §15.3, §21 (X20). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… the lease's name servers in /run, the system's name (F23) A Linux machine (qemu, NAT) had no network unless the system's own init brought it up: the kernel line had no ip= (the Mac's vz path has), and an edition's rcS ran udhcpc in the background, giving up after three tries and writing /etc/resolv.conf into the system's tree. GitHub and GitCode both failed inside desktop-4 while a sandbox on the same host worked. - The kernel takes the lease and sets the name: `ip=::::<name>::dhcp` when the machine has a NIC (not for --net none). - The guest init puts the lease's name servers (/proc/net/pnp) in this boot's /run/luban/resolv.conf and binds it over /etc/resolv.conf: never written into the tree; a link there is left alone and said. - luban_image_test (distro lane, qemu): the machine's hostname is the system's and it has a name server from its lease, nothing written into its tree. Requirement IDs for §27 declared. Design 2026-10-19 §27.2 (X31). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…luban.fish (F26) Since 2026.10.18.1 a system's login shell is the best it has, fish when it has fish, and fish reads no PS1: the mark that says where you are (profile.d/luban.sh) vanished from aabb's `root@aabb ~#`. The same mark and colours now wrap fish's prompt from etc/fish/conf.d/luban.fish. Both scripts are machine state, written when missing -- at a generation, and now also when a sandbox is entered and a machine boots, so a system made before gets it without an upgrade. Design 2026-10-19 §27.6 (X35). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…through an app that answers (F8) - `luban-os __capabilities --json`: version, provides (the root layout and manifest it reads, host-gpu, app-capabilities), needs -- answered before the app reads the home or opens a display (SSH, CI). - luban asks it (service::app_capabilities: five seconds at most, kept by the app file's path and time in <home>/run/luban-os/capabilities.json) before every window it opens -- `luban run/enter --display window`, a machine's window -- and checks both ways: the app provides what the system needs, this luban provides what the app needs (service::window_app). An app that cannot be asked is not taken as compatible: refused with `xlings update luban-os`. The question ends in `--version`, so an app of 2026.10.18.1 prints its version and stops instead of opening a window. Design 2026-10-19 §10.2, §10.3 (X21). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… a pipe keeps what it printed The relay of F13 keyed on "nobody can be asked", which is also true of a pipe: `subos config <n> --json`, read by luban's Port::json from a pipe, came back as events the pipe never sees, so a machine of a domain's system read no policy and started with NAT instead of only its proxy (luban_image_test, distro lane). EventStream::structured() now says a program reads the events (set by `xlings interface`), and only then is a routed command relayed. The domain test asserts the pipe still gets its JSON. Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… preparing its home does, and an archive is imported offline (F14) - The private domain's index is the owner's as it is now: copied the first time (as before) and again whenever an index's version marker differs, so the version luban chose on the host is the one resolved there -- not a snapshot from the first system ever made. - Preparing a system's own home (`self init` in its domain) says each step as progress (`prepare`) and, while quiet, "still preparing ... (25 s)" every ten seconds: `luban new` stood on "resolve" with an empty log. - `luban export x.luban` carries what the system runs on -- every payload its generation links into, the packages its templates declared, the editions it was made from -- and the home's index snapshot (a local index as its content, no .git). Additive: an older luban skips them. - `luban import` unpacks them and makes the system with `subos new --offline-from <dir>`: xlings places the payloads and indexes where the system is made (its domain, or this home) before anything is fetched. Offline test: export, remove every payload, index and source, import under `unshare -rn`. Design 2026-10-19 §9.3, §4.4 (X4). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…lder was a link into the read-only factory (F27) luban_image_test's new check found it on both architectures: inside machine `t`, `hostname` said `luban`. A system's /etc links the factory's files (usr/share/factory/etc), hostname among them, so the guest init's write of the system's name went through a link into the read-only generation and failed silently; the edition's rcS then set the name from that placeholder. The guest now replaces the link with the system's own /etc/hostname (machine state) and says when it cannot. Also: app.cpp's file-time stamp builds on macOS (std::to_string of the clock's count was ambiguous there). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… once, and does not take a second copy of what the system has (F25)
Inside a Luban system a user's first write made an empty ~/.xlings that
fetched every index from the network (302 s here; offline, the same failure
five times), though the system's /xlings has an index and a mirror.
- The first write starts the user's home from the system's: its index
snapshot (the default, its sub-indexes, every named index) and the settings
that say where packages come from (mirror, lang, index_repos,
resource_servers). Nothing that is there is replaced.
- At a terminal it asks once ("install for you only, into ~/.xlings? The
system's packages stay available [Y/n]"); -y does not ask; agent mode
without -y refuses with the exact command plus -y.
- `xlings install X` for what the system has at that version says
"X@v is installed for every user already (the system's)" and installs
nothing; a partial overlap borrows the system's payloads as before.
Design 2026-10-19 §27.5 (X34).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… git bootstrapped to clone with (F25) Offline, `xlings install nvim` in a fresh home printed the same failure five times over minutes: the pointer failed, the git fallback found no git, a child xlings was started to install git, which needed the index, which needed git... A connection failure reaching the index pointer is now remembered for the process and the xlings it starts (XLINGS_NET_UNREACHABLE): no remote clone, no git bootstrap, no second sync, and one error -- "the package index could not be fetched: no network (...)" -- whose next step in a Luban system is the host's `luban status <name> --check`. In a second, not minutes. The self-check has a non-critical `network` item: a default route and a name server, so "could not be fetched" inside a machine has an answer. Design 2026-10-19 §27.4 (X33). Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… luban/apps, one module one src Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…only, one module one src, os/window; only moved
- luban/xdesk/{base,layout,compositor,app}: the xdesk desktop as one
project, its program from the top-level apps/xdesk (it runs inside a
system, never on the host). Checked like a kit: never xlings or Luban.
- luban/kits: what is reusable and knows nothing of Luban (opensal-wlr,
openhal-host, imkit, tray).
- luban/apps/: programs that run inside a system and are not projects of
their own -- the rule written, the directory made with its first member;
the top-level apps/ is the host's (luban, luban-os, gui, xdev).
- A package with one module keeps its files in src/ (xdesk/layout,
os/system); several modules, a directory each.
- luban/os/desktop -> luban/os/window: the Luban OS app's window (SDL3,
Dear ImGui), not a desktop.
Package and module names are unchanged: no import changed. The lints, the
xdesk release script, luban/README.md, the architecture docs (en, zh) and
AGENTS.md follow; design 2026-10-19 §28 (X36).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… luban status, and the version shown is the version made
- `luban search [<keyword>] [--distributions | --desktops] [--json] [-v]`:
what the index offers, grouped as the Luban OS quick start groups it, from
the same service function (quick_start_offers): version, source (official,
community, local), status, tier (desktops by tier, the unrated last), GPU
note, summary in the person's language, whether it can be made here; -v
names what of a recipe's extensions.luban was out of range and ignored.
Offers now carry all of it (Offer::{version, status, source, tier, gpu,
title, summary, highlights, size, available, ignored}); xlings' search
results add archs and keywords.
- `luban ls [<pattern>]`: by name, a part of it or its letters in order;
without one, the output and --json as before.
- `luban status`: `versions xlings · luban · luban-os · index`, and each
disagreement with what to do (an app that cannot say what it can do, an
older Luban OS still running with an icon of its own, luban and xlings
apart); --json has versions.{..., running, mismatches[].next}
(service::versions, which the app's About reads too).
- What `luban new` shows is what it makes: the plan's version is named to
xlings, not resolved again; why it is not the newest comes from the plan.
Design 2026-10-19 §6, §9.1, §11 (X12).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…hared mechanism, no tr(en, zh)
The Luban OS app wrote English and Chinese side by side at 214 call sites
(and in the edition, grant, stage, close and menu tables) and decided the
language itself. Its words are now the domain `luban.os` of xlings.i18n:
apps/luban-os/src/i18n/{en,zh}.cpp (227 words; English complete, Chinese
what it translates), registered first thing in run() with LUBAN_OS_LANG as
the override; tr(key) everywhere; kEditions holds keys. A glossary names the
terms written in English in every language (Compositor, Wayland, GPU, xdesk,
labwc, LXQt, KDE Plasma, T1-T4) with their explanations, for the quick start's
hover. tools/lint_i18n.sh (lint suite): every key used is in English, Chinese
names no other key and takes the same arguments, no tr(en, zh) comes back.
Behaviour unchanged: the luban-os e2e suite (layouts at three sizes in both
languages, visual key frames) passes as before. Design 2026-10-19 §7 (X14).
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…m the app's own grid (X25) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… named, luban rollback --to relayout, notes in luban status (X13) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…, level, struck -- and the app's icon is him, made from the same grid (X25) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ace, switched reversibly by Super+m, columns that split, tiled groups on the canvas; the pointer's shape goes to the host; a configured terminal gets its title and id (X16) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… to draw -- its images as 'C', frames without it (X19) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…s from one; a Windows socket file is looked for in its directory Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…om the Luban theme, its images, an old xdesk's arrow; Ctrl+Alt+K holds the keyboard and lets it go; the title is Luban OS (<system>) (X23) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ee a partition's import) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…_start.cpp); only moved Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…e traditional desktops by what they bring, more systems -- with source, status, tier and version on each card, its panel scrolling with Create in view, six stages; an index that cannot be read is said (X24) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ban-os __tray holds the icon, windows reach it over tray.sock, liveness is a lock; the layout baselines of the pages that moved, recorded again (X22) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…of it, Super+Tab the window, Super+/ shows the keys; keys.json, state.json and the xdesk session keep what the person set; a window's menu with always on top, every workspace and the app's rules (X18) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…2mcpp asks for it) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…n a copy of the layout -- with sizes offered when it rests, gaps that resize, and the maximize button's layouts (X17) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…AT's gateway, in /run/luban/network.env for its init and login shells -- and luban status and the banner say the network in one line (X32) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… output (ls, search, status, the notes), registered by luban and Luban OS, linted (X12) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… raise, the quick start, its index, the tray's start, luban search; the quick start's index read first and in parallel; making a system and entering one with no network (X26) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… version -- not 'could not be read' (the luban-wsl2 lane) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…mmand line first; the quick start, the desktop (four groups, the keyboard and pointer, the tray, xdesk's arrangements, keys, drags, menus, rules), environments (two ways to upgrade, the network line, offline, a user's own packages), the app's processes; generated references (X27) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… system entered with no network (X28) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…elayed, installed_only) Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ay reads what runs as often as it is cheap and writes tray.json only when it changes; a click with Super is not Super alone Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…its interface 1.14; the pointer and tray compat cover 2026.10.19.1 and before Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…n one header -- each under 2k lines Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… (cpu), not under the other tests' load Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
speak-agent
marked this pull request as ready for review
October 19, 2026 09:23
Sunrisepeak
added a commit
to openxlings/xim-pkgindex
that referenced
this pull request
Oct 19, 2026
…desktop/agent-workspace 2026.10.19.1, xlings 2026.10.19.2 (#1001) The index side of openxlings/xlings#682 (design `.agents/docs/2026-10-19-luban-os-one-app-versions-and-quick-start-design.md` in xlings; tasks R1–R10). xlings 2026.10.19.2 is released and mirrored. - R1 `luban:cursors`: the Luban pointer theme, pixel art from `tools/res/cursors/luban.cursors` (Xcursor 24/48/72 px, the default theme, PNGs and `cursors.json` for the host); Apache-2.0. Dependencies: `luban:labwc`, `luban:xdesk` (revision bumps), and `luban:luban-os`, whose window draws the desktop's pointer from it from 2026.10.19.2. - R2 `xim:procps-ng` 4.0.5: static ps/top/free/pgrep/pkill/pidof/uptime/vmstat/watch on both architectures. - R3 `xim:yazi` 26.5.6: upstream's linux aarch64 build. Revision 1, because aarch64 had been given the x86_64 build. - R5 core 2026.10.19.1: cmake, xmake (x86_64), yazi, procps-ng. - R6 desktop 2026.10.19.1: xdesk 2026.10.19.2 in its `xdesk` session, with the Luban pointer theme in place of Adwaita's. agent-workspace 2026.10.19.1 is on the new core, and `luban:xdesk` gets 2026.10.19.2. - Recipes' `extensions` (cards, titles, tiers) for the desktops and editions. - The arch where `install()` runs: `luban.arch()` (`_RUNTIME`, then uname) for core and desktop. Read alone, `os.arch` sent aarch64 down the x86_64 path. - R9 xlings, luban, luban-os and xdesk move to 2026.10.19.2 as latest. The new editions are added to the published-output fixture. - A branch push's dep-namespace check is measured against main. Resources were built by res-build, published to xlings-res (GitHub) and mirrored to GitCode, then checked by content. Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements
.agents/docs/2026-10-19-luban-os-one-app-versions-and-quick-start-design.md(the design's §25 task IDs are in each commit message). Release 2026.10.19.2, interface protocol 1.14: 2026.10.19.1 shipped first with #684's network diagnostics, so this release is one later.keys.json), state and rules, chooser/switcher/sheet/menu overlays, and thexdeskprofile and session.extensions/status/archsover the interface (featurepackage_extensions); a domain's routed commands answer in events (domain_relayed); no silent fallback to an installed edition (installed_only);rollback --to relayout.luban(X12); the craftsman icon (X25).luban/os/compat): an xdesk of 2026.10.19.1 or before gets the host's arrow; Luban OS windows of 2026.10.19.1 or before are named, to be quit from their own tray icon.Companion: openxlings/xim-pkgindex#1001 (luban:cursors, procps-ng, core/agent-workspace/desktop 2026.10.19.1, yazi aarch64, the arch read where install() runs).
Co-authored-by: speak-agent 248744407+speak-agent@users.noreply.github.com