Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
00ef254
test: virt monitor e2e on sbm_virt's contracts
lollipopkit Oct 6, 2026
a0657ea
feat(monitor): desk preferences, window session and notifications
lollipopkit Oct 6, 2026
4e293c9
feat(monitor): the panel as a desk — macOS-style desktop, every featu…
lollipopkit Oct 6, 2026
4c4c2c1
fix(monitor): remote desktop viewers fill their window
lollipopkit Oct 6, 2026
677c36e
fix(monitor): review fixes for the desk apps
lollipopkit Oct 6, 2026
fd5834d
fix(monitor): desk windows lay apps out as a column, no toolbar heigh…
lollipopkit Oct 6, 2026
ce9d207
feat(monitor): Bloom, the desk restyled after ClawBox
lollipopkit Oct 7, 2026
6243d1d
feat(monitor): the desk on the lollipopkit Design System
lollipopkit Oct 7, 2026
4faf59e
fix(monitor): snapped and maximised windows keep the design system's …
lollipopkit Oct 7, 2026
1e3a9ee
feat(monitor): every desk app on the lollipopkit Design System
lollipopkit Oct 7, 2026
5b7c535
fix(monitor): a window's title and subtitle share one line
lollipopkit Oct 7, 2026
656d587
feat(monitor): sys, the desk's app framework
lollipopkit Oct 7, 2026
3b34045
feat(monitor): sys services: per-app background, notify, storage, doc…
lollipopkit Oct 7, 2026
e723ccc
feat(monitor): sys intents, Open with and app settings pages
lollipopkit Oct 7, 2026
6efb476
feat(monitor): desk app packages on the agent
lollipopkit Oct 7, 2026
6809b1a
feat(monitor): installed web apps run in sandboxed frames
lollipopkit Oct 7, 2026
29be575
feat(monitor): desk app backends in WebAssembly
lollipopkit Oct 7, 2026
146edba
feat(monitor): desk app SDK and template
lollipopkit Oct 7, 2026
62d170a
fix(monitor): close the holes the desk app review found
lollipopkit Oct 7, 2026
182a1d5
feat(monitor): desk window frame and lk data components from the new …
lollipopkit Oct 7, 2026
94c146f
feat(monitor): desk menubar, dock and notification centre from the ne…
lollipopkit Oct 7, 2026
a0f5092
feat(monitor): Processes and Services on the design's tables
lollipopkit Oct 7, 2026
bec5fa3
feat(monitor): Status on the design's tiles and charts
lollipopkit Oct 7, 2026
41e4633
feat(monitor): Containers on the design's tables
lollipopkit Oct 7, 2026
6c5279c
feat(monitor): Files on the design's table and breadcrumb
lollipopkit Oct 7, 2026
9903caf
feat(monitor): Settings and app icons as the design has them
lollipopkit Oct 7, 2026
4827822
rm(monitor): panel strings nothing uses; Virtualization gets its own …
lollipopkit Oct 7, 2026
a0875f7
fix(monitor): an auto-hidden dock comes out at its screen edge
lollipopkit Oct 7, 2026
b757ecc
docs(monitor): the desk's new window frame, data components and shell…
lollipopkit Oct 7, 2026
aaf9ce0
feat(monitor): the redesigned desk's strings in every locale
lollipopkit Oct 7, 2026
719a69b
feat(monitor): dock items grow in and shrink away
lollipopkit Oct 7, 2026
3ce92de
feat(monitor): desk content follows the wide-window rules
lollipopkit Oct 7, 2026
3f2a1aa
feat(monitor): a per-browser clock and size units for every figure
lollipopkit Oct 7, 2026
9856da2
feat(monitor): system preferences the desk and its apps follow
lollipopkit Oct 7, 2026
7e8dc68
feat(monitor): Settings filled in as the design system has it
lollipopkit Oct 7, 2026
66a6a9a
docs(monitor): wide-window rules and where each preference lives
lollipopkit Oct 7, 2026
b104d4c
feat(monitor): the new Settings' strings in every locale
lollipopkit Oct 7, 2026
3e6bf81
feat(monitor): the Terminal app opens the local shell directly, no SS…
lollipopkit Oct 7, 2026
8b3b935
feat(monitor): New window in Terminal and Files; a closed terminal wi…
lollipopkit Oct 7, 2026
5db5453
rm(monitor): the SSH terminal and the ssh_terminal grant
lollipopkit Oct 7, 2026
2557ab2
feat(monitor): tabs and split panes in Terminal and Files, and window…
lollipopkit Oct 7, 2026
035a3ab
rm(monitor): the app icon beside the app's name in the menubar
lollipopkit Oct 7, 2026
ead0117
feat(monitor): the login screen as the design system draws it
lollipopkit Oct 7, 2026
321a310
fix(monitor): the notification centre blurs the desk while it opens, …
lollipopkit Oct 7, 2026
2b7ab36
fix(monitor): window tabs are the title bar, labelled by each session…
lollipopkit Oct 7, 2026
ad2465d
fix(monitor): the terminal's selection can be seen on the light backg…
lollipopkit Oct 7, 2026
32be47d
fix(monitor): a terminal gets HOME, USER and LOGNAME when the agent w…
lollipopkit Oct 7, 2026
d213e61
feat(monitor): the new-tab button inside the tab capsule, and a path …
lollipopkit Oct 7, 2026
3638fcb
feat(monitor): Files as the design system's desktop has it now
lollipopkit Oct 7, 2026
4958dd6
feat(monitor): a page per app under Settings → Apps
lollipopkit Oct 7, 2026
2a43199
feat(monitor): the design system's tab motion, shared by every one-of…
lollipopkit Oct 7, 2026
8da9924
feat(monitor): pages inside an app slide in and back, and follow a swipe
lollipopkit Oct 7, 2026
179a6cf
fix(monitor): window controls, page motion and scrollbars per the des…
lollipopkit Oct 7, 2026
20daf3f
fix(monitor): each page scrolls by itself, so the bar stays blurred a…
lollipopkit Oct 7, 2026
4674f05
fix(l10n): Indonesian name for a thin pool's volume group
lollipopkit Oct 7, 2026
1403129
fix(monitor): open a typed file path, toggle a bar menu, animate pane…
lollipopkit Oct 7, 2026
118dbda
feat(monitor): install fsbt themes per account, from a file or the th…
lollipopkit Oct 8, 2026
0b539a1
fix(monitor): count an APFS container's used space once
lollipopkit Oct 8, 2026
a514d00
feat(monitor): crossfade the desk between light and dark
lollipopkit Oct 8, 2026
c02ab50
fix(monitor): a theme's shapes round only cards, list rows and buttons
lollipopkit Oct 8, 2026
866c21e
fix(sbm_parser): split a container's memory into used and limit
lollipopkit Oct 8, 2026
1579c3f
rename: desk app packages are .fsba
lollipopkit Oct 8, 2026
b2d57c8
feat(monitor): @lollipopkit/desk-ui, the design system as an Apache-2…
lollipopkit Oct 8, 2026
fd71bcf
opt.(monitor): load only the panel's locale in use
lollipopkit Oct 8, 2026
2e052d8
refactor(monitor): apps get the design system as an interface the age…
lollipopkit Oct 8, 2026
fc340fd
fix(monitor): the dev server proxies /desk-app to the agent
lollipopkit Oct 8, 2026
eb0ab9d
Merge remote-tracking branch 'origin/main' into test/virt-e2e-sbm-virt
lollipopkit Oct 8, 2026
d3ad013
Merge remote-tracking branch 'origin/main' into test/virt-e2e-sbm-virt
lollipopkit Oct 8, 2026
1dedee7
fix(nix): panel npm deps hash after the merge
lollipopkit Oct 8, 2026
23a563a
feat(monitor): Files offers a new tab in its bar while it has one
lollipopkit Oct 8, 2026
c8844fc
feat(monitor): a closed tab shrinks out; closing to one tab fades int…
lollipopkit Oct 8, 2026
8940d1c
feat(monitor): desk files beside the database, lk theme hooks, lkui S…
lollipopkit Oct 8, 2026
c2c5be8
Merge remote-tracking branch 'origin/main' into test/virt-e2e-sbm-virt
lollipopkit Oct 8, 2026
31bfc9c
feat(monitor): window close motion, dock launch bar, round app icons …
lollipopkit Oct 8, 2026
5379827
feat(monitor): Agent mode — tasks an AI agent runs on the machine, on…
lollipopkit Oct 9, 2026
a9d2a53
feat(monitor): Agent mode permissions, search, attachments and the ne…
lollipopkit Oct 9, 2026
bbdfb28
feat(monitor): Agent mode on Windows, always allow, drafts kept, uplo…
lollipopkit Oct 9, 2026
1771eb2
Merge remote-tracking branch 'origin/main' into test/virt-e2e-sbm-virt
lollipopkit Oct 9, 2026
e62de1e
Merge remote-tracking branch 'origin/main' into test/virt-e2e-sbm-virt
lollipopkit Oct 9, 2026
9afba31
feat(monitor): SMTP, Telegram, Discord and ntfy push channels; Bark o…
lollipopkit Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 25 additions & 2 deletions .github/workflows/analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ jobs:
# `store/` because `test/unit/theme_store_tree_test.dart` reads the
# official theme repository the way the store does.
emit dart "$shared|^lib/|^test/|^integration_test/|^crates/|^macos/|^Cargo\.(toml|lock)$|^analysis_options\.yaml$|^docs/schemas/|^store/"
emit frontend "$shared|^monitor/frontend/|^packages/webui/"
emit frontend "$shared|^monitor/frontend/|^monitor/sdk/|^packages/webui/"
# `store/` (and fl_lib, under `$shared`) for the theme manifests the
# docs job validates against that same schema; `assets/catalog/` for
# the catalog the docs describe.
Expand Down Expand Up @@ -224,6 +224,19 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: cargo test --workspace --no-fail-fast

# fl_lib's Rust (`fl_theme`, which the agent depends on by path, and its
# bridge to Dart) is a workspace of its own, so `--workspace` above does
# not reach it.
- name: Test fl_lib's Rust
if: matrix.os == 'ubuntu-latest'
run: cargo test --manifest-path packages/fl_lib/rust/Cargo.toml --workspace --no-fail-fast

# The agent runs pi through fl_pi_llm's Rust host, a crate outside this
# workspace (it is its own), so `--workspace` does not reach it either.
- name: Test fl_pi_llm's Rust host
if: matrix.os == 'ubuntu-latest'
run: cargo test --manifest-path packages/fl_pi_llm/rust/Cargo.toml --no-default-features --features reqwest --no-fail-fast

# Only the crates with code of their own for Windows: the native sampler,
# the agent (ConPTY, paths, services) and the script's PowerShell side.
# The rest is platform-neutral and tested above; that `sbm_ffi` builds
Expand All @@ -234,7 +247,9 @@ jobs:

- name: Clippy
if: matrix.os == 'ubuntu-latest'
run: cargo clippy --workspace --all-targets --all-features -- -D warnings
run: |
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo clippy --manifest-path packages/fl_lib/rust/Cargo.toml --workspace --all-targets -- -D warnings

monitorFrontend:
name: Monitor frontend
Expand Down Expand Up @@ -627,13 +642,21 @@ jobs:
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
shared-key: flutter-tests-ffi
workspaces: |
. -> target
packages/fl_lib/rust -> target
save-if: ${{ github.ref == 'refs/heads/main' && matrix.shard == 0 }}

# FFI-dependent suites (frb_parser/windows/server_status_update_req...)
# load the dylib from target/debug via test/helpers/rust_lib_helper.dart
- name: Build native FFI library
run: cargo build -p sbm_ffi

# Every test loads fl_lib's Rust (theme packages) from its own target/
# (`test/flutter_test_config.dart`): a workspace of its own.
- name: Build fl_lib's Rust
run: cargo build --manifest-path packages/fl_lib/rust/Cargo.toml -p fl_lib_ffi

# `flutter test` builds sbm_ffi again through the build hook, for a
# library no unit test loads (they take the one built above).
- uses: ./.github/actions/build-hook-cache
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/monitor-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,16 @@ jobs:
- name: Check out IronRDP
run: git submodule update --init --depth 1 third_party/ironrdp

# The agent reads theme packages with fl_lib's `fl_theme`
# (`packages/fl_lib/rust/theme`), a path dependency into this submodule.
- name: Check out fl_lib
run: git submodule update --init --depth 1 packages/fl_lib

# Agent mode runs pi through `fl_pi_llm`'s Rust host
# (`packages/fl_pi_llm/rust`), a path dependency into this submodule.
- name: Check out fl_pi_llm
run: git submodule update --init --depth 1 packages/fl_pi_llm

- name: Install musl toolchain
if: matrix.platform == 'linux'
run: |
Expand Down
7 changes: 4 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@ Flutter app for managing servers, in a Rust workspace monorepo. Feature notes li
- `crates/sbm_parser/` — status command manifest, scripts, parsers (pure, raw counters; rates stay with the caller), locked by `tests/dart_compat.rs` / `script_compat.rs`. Porting: move a module's Dart tests to Rust first, delete the Dart side only once the FFI result matches. `ProcKill` checks a PID against the process table's `START_ID`.
- `crates/sbm_virt/` — one virtualization model for libvirt (pure command layer) and the PVE API client (session, TOTP, tickets, pinning, console; over a stream the caller dials: `TcpDial` agent, `LoopbackDial` app).
- `crates/sbm_redfish/` — the BMC client; app via `sbm_ffi::api::bmc`. Also decides PVE certificate pins (`certPinAccepts`); pins are SHA-256 lowercase hex.
- Theme packages (`.fsbt`) and the theme store are read and checked in Rust, in fl_lib: `packages/fl_lib/rust/theme` (`fl_theme`, its own Cargo workspace), which the agent depends on by path and the app reaches through fl_lib's build hook. Flutter tests load `packages/fl_lib/rust/target/debug/libfl_lib_ffi.*` (`test/flutter_test_config.dart`): `cargo build --manifest-path packages/fl_lib/rust/Cargo.toml -p fl_lib_ffi` first.
- `crates/sbm_ffi/` — FRB bindings. `crates/sbm_native/` — native sampler, monitor only.
- `monitor/` — the agent (Rust + Svelte panel), see `monitor/CLAUDE.md`. Machine pages are listed as `features` in `/capabilities`.
- `monitor/` — the agent (Rust + Svelte panel), see `monitor/CLAUDE.md`. `monitor/sdk/`: what installed desk apps use: `lkui` (the bridge client, on npm; Apache-2.0 for closed third-party apps; it also puts the desk's design system, served by the agent, on the app's page) and a template. Machine pages are listed as `features` in `/capabilities`.
- `lib/core/` utilities, `lib/view/` UI, `lib/data/{model,provider,store}/`, `lib/src/rust/` generated, `lib/hive/` legacy adapters for `HiveImport` only (TODO: remove).
- `packages/` — Dart forks as submodules (dartssh2, xterm, fl_lib, fl_build, flutter_pty, …) and the in-repo `webui`. `third_party/` — `ish-arm64`, `ironrdp`. `website/` — Svelte + bun.
- **The Agent is `packages/fl_pi_llm`** (submodule shared with GPT Box, its own Cargo workspace; PR changes there). This app hooks in at `lib/core/llm/` (`LlmHost`, `AgentTools`, `AgentScope`/`TerminalHosts`/`AgentChats`). `.claude/skills/serverbox-help` ships as assets: a new file needs its directory in `pubspec.yaml`, and its docs links must exist (`builtin_skill_test.dart`). Tests load `build/native_assets/<os>/libfl_pi_llm.*`.
- **The Agent is `packages/fl_pi_llm`** (submodule shared with GPT Box, its own Cargo workspace; PR changes there). Its memory (`/memories`, `memory_*` tools) is Rust (`rust/src/memory.rs`, `LlmMemory` in Dart, shared with the monitor); `ui`'s `MemoryStore` only keeps the files. This app hooks in at `lib/core/llm/` (`LlmHost`, `AgentTools`, `AgentScope`/`TerminalHosts`/`AgentChats`). `.claude/skills/serverbox-help` ships as assets: a new file needs its directory in `pubspec.yaml`, and its docs links must exist (`builtin_skill_test.dart`). Tests load `build/native_assets/<os>/libfl_pi_llm.*`.
- Themes are fl_lib's (`package:fl_lib/theme.dart`); this app describes itself in `lib/core/service/theme_host.dart`. `SettingStore` keys are fixed — renaming one loses it. `store/` is the official theme repository (details: `docs/src/content/docs/development/themes.md`, the `serverbox-theme` skill); **editing a theme bundled as `assets/store_themes/<id>.fsbt` means repacking it** (`theme_bundled_test.dart`).
- `lollipopkit/shellbox-rootfs` is not a submodule: the app reads its signed manifest (`assets/rootfs_manifest.json` offline, key `RootfsManifestTrust.publicKey`).
- `ScriptConstants.version` and the `v<N>` in `ScriptConstants.scriptFile` must stay equal.
Expand Down Expand Up @@ -89,4 +90,4 @@ A server is reached over SSH, a monitor agent, both, or is this device (`Spi.loc

## Feature notes

`crates/sbm_ffi/CLAUDE.md` (SSH crypto) · `ios/CLAUDE.md` · `macos/CLAUDE.md` · `android/CLAUDE.md` · `lib/data/store/CLAUDE.md` · `lib/data/model/file/CLAUDE.md` (SFTP/SCP) · `lib/data/model/server/benchmark/CLAUDE.md` · `lib/core/service/CLAUDE.md` (watch, home widgets) · `lib/view/page/server/monitor_settings/CLAUDE.md` · `docs/dev/virt.md` · `monitor/CLAUDE.md`.
`crates/sbm_ffi/CLAUDE.md` (SSH crypto) · `ios/CLAUDE.md` · `macos/CLAUDE.md` · `android/CLAUDE.md` · `lib/data/store/CLAUDE.md` · `lib/data/model/file/CLAUDE.md` (SFTP/SCP) · `lib/data/model/server/benchmark/CLAUDE.md` · `lib/core/service/CLAUDE.md` (watch, home widgets) · `lib/view/page/server/monitor_settings/CLAUDE.md` · `docs/dev/virt.md` · `monitor/CLAUDE.md` · `monitor/frontend/src/desk/CLAUDE.md` (the panel's desk).
Loading
Loading