Skip to content

test: virt monitor e2e on sbm_virt's contracts - #1658

Draft
lollipopkit wants to merge 266 commits into
mainfrom
test/virt-e2e-sbm-virt
Draft

lollipopkit wants to merge 266 commits into
mainfrom
test/virt-e2e-sbm-virt

Conversation

@lollipopkit

Copy link
Copy Markdown
Owner

No description provided.

@winnowl

winnowl Bot commented Oct 6, 2026

Copy link
Copy Markdown

Important

Review skipped

This pull request is a draft.

  • Review this pull request now

Commenting @winnowl review does the same.

@coderabbitai

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: be00747d-cf6d-49c2-9ca8-2003c3483227

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

A wasm package's backend.wasm runs in wasmi on the agent, one instance
per call, bounded by fuel, wall time and memory. Its host functions (kv,
status, fs.list/read, exec) need the app's approved permission and the
calling account's grant. The bridge reaches it with backend.call. Adds a
Rust example.
@lollipopkit/desk-sys is the frame side of the app bridge and holds the
one copy of its protocol; a vite template packs a .sbapp. The SDK is
tested against the desk's bridge. Not published.
- A guest re-entering sbm.host traps instead of overflowing the stack.
- Inflating a package is bounded headers included, off the worker.
- The bridge talks over a MessagePort given to the frame's first page;
  a frame that navigates away is dropped.
- Approvals and launch tickets name the package's SHA-256: new code
  always waits for approval.
- Backend calls are limited per agent and account; the clock is checked
  per host call; fs.read takes regular files only; logs drop controls.
- appState is capped at 16 KiB and opens are rate limited in the bridge.
- Built-in ids are reserved; removing an app removes its storage; app
  storage is capped per account.
…design

The window's title bar floats over the content and turns to glass once it
scrolls (or always, a per-browser choice); the sidebar floats inset; an
app may give the bar a heading, make it flush over a table, and add a
footer (sys.WindowFooter). lk gains DataTable, StatTile, LegendChip,
SearchField, ToolbarGroup, StatusBar and NotificationCenter; Group/Row
use the settings group styles. The window area keeps room for a dock on
the left, bottom or right.
…w design

The menubar leads with the server and its live dot, then the front app
(icon and name), its menus, Window and Help; on the right a CPU reading
with the machine at a glance, search, Control Centre, notifications and
the clock. The dock sits left (default), at the bottom or right, can
hide itself and has three icon sizes; with the title bar style these are
per browser (Settings > Appearance). Notifications open as the design's
notification centre with Do Not Disturb.

Other locales get the new keys in a later pass.
Processes: one DataTable of the columns the machine printed, sorted by
the header (the agent's orders), search and kernel threads in the bar,
reading again every 5 s while shown unless paused; a stop is asked in
the status bar, the root retry in a dialog.

Services: state and type in the sidebar, a table with state dots, the
selected unit's facts and actions over the status bar, its log in a
dialog; the listing's notice opens from the status bar.
The machine's name and state lead; stat tiles (CPU and memory open
Processes in that order, the rest their detail) keep the shared card
order; one usage chart with legend chips over a 1 h / 24 h / 7 d range
and a reading under the pointer; network, the busiest processes, system
information and custom commands in cards below. Refresh pauses from the
bar; terminal, files, iperf, power and every reading's detail move to
the View and Go menus. Processes opens in the order it was asked for.
The runtime and version head the sidebar (containers, images with
counts); each list is a table, the selection's actions and logs sit
over the status bar, which carries the store's usage and the second
prune. Run and pull lead the bar; File holds every prune.
Back/forward as a capsule beside the path in the title bar (the folder
in bold), list or grid and new folder/upload at the right; the list is
a sortable table (folders first), the grid big glyph tiles; the sidebar
adds the disk's free space; the status bar counts the folder and names
the selection, with its menu for pointers that cannot right-click. A
tap on a touch screen opens a table row.
Settings' column sits left under the title, groups in the design's
settings cards; the theme moves to Appearance with the title bar and the
dock; sidebar glyphs as designed. Processes, Services and Containers
take the design's icons.
…icon

44 keys no code reads any more (the old page layout's, and those the
redesigned apps dropped) go from every locale. Virtualization and
Containers no longer share a glyph.
Showing it scheduled its own hiding at once; it now stays out while the
pointer is on the dock or the edge strip, and goes 500 ms after it
leaves (or after a menu it opened closes elsewhere).
An app pinned, opened, closed or unpinned grows along the dock's axis
from a smaller scale (its neighbours slide aside), and shrinks away
faster than it came; the separator too. The dock's first drawing does
not animate; reduced motion turns it off. A running dot can be turned
off per browser.
The design system's content widths: forms and pages cap at 640 and
centre (pane-form), reading at 720, dashboards at 1280 (Status,
Virtualization); tables and lists fill. The gutter is 21 at every
width. Backup's page scrolls in the window body like the rest.
Times go through one formatter on a 24- or 12-hour clock, and sizes are
binary (KiB, 1024) or decimal (KB, 1000), as this browser chose (binary
by default, as the design system writes them).
Per browser: how often live figures are read again and whether at all
(Status, Processes, the menubar's CPU), table density, text size inside
windows, reduced motion, notification banners, the app opened at start
and whether the last windows come back. Apps read them through sys.

The menubar no longer labels Hide, Minimize and Close with ⌘H, ⌘M and
⌘W: the browser keeps those keys, so the labels promised nothing.
Every page is one centred form column opening with a line on what it
governs and where it applies.

- General (this browser): language, 24/12-hour clock, binary or decimal
  units; the app opened at start and whether the last windows come
  back; automatic refresh and its interval; banners and Do Not
  Disturb; the desk's keys.
- Appearance: theme, text size, reduced motion; title bar and table
  density; the dock's position, auto-hide, size and running dots;
  wallpaper.
- Apps (this server): which apps sit in the dock; Files (default view,
  hidden files, what a double-click does), Terminal (font size,
  cursor, bell) and Processes (kernel threads, confirm before stopping)
  as their own settings, which the apps follow; background running;
  installed apps.
- Account: user and role, password, signing out (last, alone).
- Server: the host as it reports itself, the agent's configuration,
  and reboot / shut down (last, alone).

Files hides dot entries by default, as the design has it.
…H form

The app now starts (or, after a reload, rejoins) the SSH-less shell when the
account holds the shell grant, and explains why otherwise. tmux sessions move
to a toolbar menu and a Shell menu; an ended session offers a new one.

A rejoin on a fresh renderer replays the agent's whole buffer, a socket closed
before a session starts says so, and the dev proxy presents its own page's
WebSocket origin as the agent's.
…ndow ends its shell

useWindow() gains openWindow/canOpenWindow (another window of the same app,
up to its instances) and closed (the window is gone, not just unmounted).
Terminal offers New window in its bar and Shell menu; Files in its File menu,
starting at the same folder. Closing a terminal window closes its session
instead of leaving it to hold one of the agent's slots until it times out.
The agent no longer logs into the local sshd for the panel: a terminal is the
agent's own shell on a PTY, under `shell`, for the app and the panel alike.
An open carrying SSH credentials, and the keyboard-interactive answer frame,
are refused by parsing. Migration 023 removes ssh_terminal from every role
(a role that held only it holds nothing) and drops ssh_known_hosts; russh and
the fake sshd go with it, and the terminal tests run real local shells.

A role save that still names ssh_terminal (the app's editor wrote it out) has
it dropped rather than refused (TODO remove). The app and the panel stop
showing and sending the grant.
…s that merge

An app whose manifest sets `panes` gets Ghostty-style tabs and splits inside
one window: each pane runs the app's content with a `useWindow()` of its own
(pane id, appState, title, chrome, `panes` controls), the window shows the
focused pane's toolbar, sidebar, footer and menus, and the layout lives in the
window's appState. Panes stay mounted in one flat list keyed by id, so a
split, a tab switch or a merge never remounts one.

Dragging a window onto another of the app merges it: over the bar or the tab
strip as a tab, over a pane beside it on the nearest side. The source is
absorbed, not closed, so a terminal pane rejoins its session; a tab pulled off
the strip becomes a window. Terminal names tabs from the shell's title and
offers New tab, Split right (⌘D) and Split down (⇧⌘D); Files opens them at its
folder.

The open frame keeps an empty `user` for agents from before migration 023
(TODO remove).
Instances on the left (where there are several) with their accounts, online
dot and "signed in"; on the right the chosen one's remembered accounts (a
signed-in one unlocks without a password), a sign-in form with Remember this
account, a new instance's address, or why it cannot be reached with when it
was last online. A clock whose font, spacing, weight and size are styled per
browser; arrow keys switch instances.

servers keeps several accounts per server: each account's token in this tab's
sessionStorage, the remembered names in localStorage, never a password. The
one session per server a tab held before is read once (TODO remove).

Each account's wallpaper shows before it signs in from a copy this browser
keeps (IndexedDB), written by the desk once its preferences load; an
unauthenticated agent route would hand anyone its accounts' names and images.
…rr, Radarr, Prowlarr

- An MCP sidecar may be built here from a package Dockerfile whose every
  base is pinned by digest: Karakeep's server speaks stdio only, so its
  release image gets a small HTTP bridge.
- Sonarr, Radarr and Prowlarr trust the proxy's forwarded scheme from the
  Docker bridge, or their redirects drop the desk's https.
- The catalog e2e resolves relative redirects as a browser does; every
  catalog app passes it.
…ers), Lidarr, Bazarr, changedetection.io, Excalidraw
…sm, SiYuan, Kiwix, File Browser, Kanboard, Grocy, Wallos, Homebox, Node-RED, Backrest, Langfuse (with its MCP server), AFFiNE, Headscale with Headplane; bcrypt and hex secrets
# Conflicts:
#	crates/sbm_ffi/src/frb_generated.rs
#	docs/src/content/docs/changelog.mdx
#	docs/src/content/docs/zh/changelog.mdx
#	lib/generated/l10n/l10n.dart
#	lib/generated/l10n/l10n_az.dart
#	lib/generated/l10n/l10n_de.dart
#	lib/generated/l10n/l10n_en.dart
#	lib/generated/l10n/l10n_es.dart
#	lib/generated/l10n/l10n_fr.dart
#	lib/generated/l10n/l10n_id.dart
#	lib/generated/l10n/l10n_it.dart
#	lib/generated/l10n/l10n_ja.dart
#	lib/generated/l10n/l10n_ko.dart
#	lib/generated/l10n/l10n_nl.dart
#	lib/generated/l10n/l10n_pt.dart
#	lib/generated/l10n/l10n_ru.dart
#	lib/generated/l10n/l10n_tr.dart
#	lib/generated/l10n/l10n_uk.dart
#	lib/generated/l10n/l10n_zh.dart
#	lib/l10n/app_az.arb
#	lib/l10n/app_de.arb
#	lib/l10n/app_en.arb
#	lib/l10n/app_es.arb
#	lib/l10n/app_fr.arb
#	lib/l10n/app_id.arb
#	lib/l10n/app_it.arb
#	lib/l10n/app_ja.arb
#	lib/l10n/app_ko.arb
#	lib/l10n/app_nl.arb
#	lib/l10n/app_pt.arb
#	lib/l10n/app_ru.arb
#	lib/l10n/app_tr.arb
#	lib/l10n/app_uk.arb
#	lib/l10n/app_zh.arb
#	lib/l10n/app_zh_tw.arb
#	lib/src/rust/frb_generated.dart
#	lib/view/page/storage/file_browser.dart
#	monitor/CLAUDE.md
#	monitor/frontend/index.html
#	monitor/frontend/src/App.svelte
#	monitor/frontend/src/components/LineChart.svelte
#	monitor/frontend/src/components/ReauthDialog.svelte
#	monitor/frontend/src/components/Sidebar.svelte
#	monitor/frontend/src/desk/apps/status/DetailPanel.svelte
#	monitor/frontend/src/desk/apps/virt/VirtConsole.svelte
#	monitor/frontend/src/i18n/de/index.ts
#	monitor/frontend/src/i18n/en/index.ts
#	monitor/frontend/src/i18n/es/index.ts
#	monitor/frontend/src/i18n/fr/index.ts
#	monitor/frontend/src/i18n/i18n-types.ts
#	monitor/frontend/src/i18n/id/index.ts
#	monitor/frontend/src/i18n/init.ts
#	monitor/frontend/src/i18n/it/index.ts
#	monitor/frontend/src/i18n/ja/index.ts
#	monitor/frontend/src/i18n/ko/index.ts
#	monitor/frontend/src/i18n/nl/index.ts
#	monitor/frontend/src/i18n/pt/index.ts
#	monitor/frontend/src/i18n/ru/index.ts
#	monitor/frontend/src/i18n/tr/index.ts
#	monitor/frontend/src/i18n/uk/index.ts
#	monitor/frontend/src/i18n/zh-CN/index.ts
#	monitor/frontend/src/i18n/zh-TW/index.ts
#	monitor/frontend/src/lib/layout.svelte.ts
#	monitor/frontend/src/lib/servers.svelte.ts
#	monitor/frontend/src/lib/theme.svelte.ts
#	monitor/frontend/src/lib/xterm.ts
#	monitor/frontend/src/pages/Dashboard.svelte
#	monitor/frontend/src/pages/ServerSettings.svelte
#	monitor/frontend/src/pages/SystemUsers.svelte
#	monitor/frontend/src/pages/Terminal.svelte
#	monitor/frontend/vitest.config.ts
#	packages/fl_pi_llm
#	packages/webui/src/Modal.svelte
#	packages/webui/src/theme.css
…tore laid out with one; app frames scroll with the desk's scrollbar
…, each with an App Store page to read, open, update and uninstall
…en desks follow installed apps; a frame's restored state reaches it
…, so an install beside another writer is not refused busy
…on a reload, packages only on their systems, a decline read in the install's own write, no approval in the admin's place, install and approve in one step, updates only to later versions, cancelling a job acts on the machine, machine state only for apps granted to act on it, a process group's leader held until it is killed
…uilds, the shipped apps' pass locked per agent, a Windows command's tree ended as a job object, Linux-only e2e tests compiled only there
… does not stop it; the probe's endless job waits instead of spinning; test calls name the request and its wait on failure
# Conflicts:
#	monitor/frontend/package-lock.json
#	monitor/frontend/package.json
… as a close without lingering can make it one
# Conflicts:
#	lib/view/page/storage/file_browser.dart
… gets remote_access, grants and bmc editable
# Conflicts:
#	Cargo.lock
#	README.md
#	README_zh.md
#	docs/src/content/docs/changelog.mdx
#	docs/src/content/docs/zh/changelog.mdx
# Conflicts:
#	CLAUDE.md
#	lib/core/utils/local_exec.dart
#	lib/core/utils/process_tree.dart
#	lib/data/model/ai/ask_ai_models.dart
#	lib/data/provider/ai/global_agent_tools.dart
@socket-security

socket-security Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant