- Rust 57.5%
- Shell 21.5%
- JavaScript 8.4%
- HTML 4.3%
- CSS 2.9%
- Other 5.4%
|
Some checks failed
Build & Test / check (push) Failing after 19s
hero_proc#102 D-10 sweep (T2, s114). Wires hero_livekit fully to the canonical
service.toml + service_base!() + handle_info_flag contract across all four
service binaries (hero_livekit_server, hero_livekit_admin, lk-backend,
hero_do_hero_livekit).
- service.toml at every binary crate root (server + admin updated to drop the
pre-30a0b34e HERO_SOCKET_DIR/HOME workaround and ship the canonical
PATH_ROOT default; backend + rhai service.toml authored from scratch).
All four list the same 4-binary set with TCP block for lk-backend (port
8080) and empty sockets/tcp for the hero_do_hero_livekit cli.
- main.rs wired via herolib_core::service_base!() + validate_service_toml +
handle_info_flag in all four; server + admin also call print_startup_banner
+ prepare_sockets. Rhai uses the subcommand-gated nth(1)==Some("--info")
pattern so the script runner's own argv handling isn't disturbed.
- HeroLogger absorption (lesson #21 broadened): hero_proc_sdk's logger.rs +
HeroLogger struct were deleted upstream at cc836a7 / 03e7ed83. Three sites
needed adjustment — AuthorizedOsisLivekit drops its Arc<HeroLogger> field
and the constructor's logger param, the lone deny-log call converts to
tracing::warn!, and both startup-info call sites in server + admin
collapse to tracing::info!. Authz behavior is preserved; structured-log
shipping is off until a herolib_core::logger::Logger migration lands.
- Cargo.lock absorbs the s113 cascade: hero_proc_sdk c9730d17→03e7ed83,
hero_rpc 8a8d66d8, herolib_core d20792fd. Dep audit strips 8 zero-match
entries (server: hero_proc_sdk, tracing-subscriber; admin: dirs,
tower-service, http-body-util, bytes; rhai: hero_rpc_openrpc, serde,
serde_json, thiserror, dirs) and adds herolib_core to backend + rhai.
- osis_server_generated.rs is regenerated by build.rs against the new
hero_rpc_osis tip (adds *_list_full helpers, drops dead service-method
scaffolding); per D-03 the change is at the generator layer.
- .gitignore covers crates/hero_livekit_sdk/src/generated/ — emitted by the
openrpc_client! macro at the new lib-relative path.
D-10 acceptance: 5/5 met.
- service.toml at every crate root.
- service_base!() + validate + handle_info_flag on every binary.
- lab infocheck: 4 crates clean, 0 findings.
- smoke 6/6: server rpc.sock {health, openrpc.json, well-known,
system.ping}; admin admin.sock {health, well-known}. PATH_ROOT
confirmed in /proc/$pid/environ for both daemons.
- cargo test --workspace --release: 30 passed, 0 failed, 2 ignored.
Lessons:
- Lesson #19 N/A (no top-level CLI orchestrator).
- Lesson #20 N/A (every daemon uses src/main.rs, not src/bin/<name>.rs).
- Lesson #21 confirmed again — cargo update can land deletions; HeroLogger
cascade-absorb pattern from s113 applies to consumers with struct-field
threading too, not just `let _logger = ...` lines.
Signed-off-by: mik-tf
|
||
|---|---|---|
| .cargo | ||
| .forgejo/workflows | ||
| crates | ||
| docs | ||
| schemas/livekit | ||
| scripts | ||
| sdk/js | ||
| .gitignore | ||
| buildenv.sh | ||
| Cargo.lock | ||
| Cargo.toml | ||
| Cargo.toml.hero_builder_backup | ||
| Makefile | ||
| README.md | ||
| rust-toolchain.toml | ||
| rustfmt.toml | ||
hero_livekit
LiveKit SFU orchestrator for the Hero OS Suite. Downloads, configures,
and supervises the upstream livekit-server and lk-backend binaries,
and exposes a typed OpenRPC surface plus an admin + meeting UI.
HERO_SOCKET_DIRdefaults to~/hero/var/socketswhen unset. All socket paths below resolve to$HERO_SOCKET_DIR/hero_livekit/<sock>.
┌───────────────────────────────────────────────────┐
│ hero_livekit_admin (Askama/Bootstrap dashboard) │
│ - Server lifecycle tab │
│ - Rooms / Tokens / Join │
│ - /join/{room} (livekit-client meeting page) │
└───────────────┬────────────────┬──────────────────┘
│ JSON-RPC │ ws://host:7880
▼ │
┌────────────────────────────────┐ │
│ hero_livekit_server │ │
│ (OServer, OSchema-based) │ │
│ rpc.sock + admin.sock │ │
│ spawns & supervises: │ │
│ livekit-server │────┘
│ lk-backend │
└────────────────────────────────┘
│ │
▼ ▼
~/hero/bin/ Redis (127.0.0.1:6379)
livekit-server
lk-backend
Crates
| Crate | Purpose |
|---|---|
hero_livekit_server |
OServer-backed supervisor. Generates types + CRUD + OpenRPC spec from schemas/livekit/livekit.oschema. |
hero_livekit_admin |
Axum-based admin dashboard + meeting page (embeds livekit-client). |
hero_livekit_examples |
Tiny CLI programs that call the generated OpenRPC client. |
Quickstart
Prerequisites on the host: Redis running at 127.0.0.1:6379.
# Build and install both binaries to ~/hero/bin/
make install
# Start the supervisor (foreground — hero_proc can also manage it via --start)
~/hero/bin/hero_livekit_server &
# Start the admin UI (binds to $HERO_SOCKET_DIR/hero_livekit/ui.sock)
~/hero/bin/hero_livekit_admin &
Then open the hero_router dashboard (usually http://127.0.0.1:9988/) and
click Hero LiveKit Admin, or go directly to
http://127.0.0.1:9988/hero_livekit/ui/.
In the UI, run the Server tab flow once:
- Install — downloads
livekit-server+lk-backendto~/hero/bin/ - Configure — generates
livekit.yaml+backend.envwith a random API secret, persists toruntime.json - Start — spawns both processes
Then go to Join and click Start a new meeting to open a browser
meeting page backed by livekit-client.
Documentation
docs/architecture.md— processes, sockets, port layoutdocs/configuration.md— where state lives on diskdocs/api.md— RPC method referencedocs/ui.md— admin dashboard + meeting page
Service lifecycle via hero_proc
scripts/nu_service.nu is a Nushell module that registers and supervises
hero_livekit_server and hero_livekit_admin under hero_proc.
It provides four subcommands: install, start, stop, status.
use scripts/nu_service.nu
nu_service install # cargo-install the binaries into ~/hero/bin
nu_service start # register + start actions and service in hero_proc
nu_service status # show current state
nu_service stop # tear down the registrations
Add --root to any subcommand when hero_proc is running as root. Prerequisite:
the hero_skills tools/modules/
directory must be reachable via NU_LIB_DIRS, and hero_proc must be running.
Scripting (Rhai)
crates/hero_livekit_rhai ships a hero_do_hero_livekit binary that exposes the
full LiveKitService OpenRPC surface to Rhai scripts. Build
and install it with:
make install-rhai
then run one of the bundled examples:
hero_do_hero_livekit crates/hero_livekit_rhai/examples/rhai/01_status.rhai
hero_do_hero_livekit crates/hero_livekit_rhai/examples/rhai/02_list_rooms.rhai
The binary auto-injects SCRIPT_DIR, SCRIPT_FILE, and ARGS into the Rhai
scope. See the files under crates/hero_livekit_rhai/examples/rhai/ for patterns:
01_status.rhai— connect + print the current service state02_list_rooms.rhai— enumerate active rooms03_create_delete_room.rhai— room CRUD round-trip04_issue_token.rhai— mint a JWT with grants05_full_lifecycle.rhai— install → configure → start → create → token → stop
Scripts default to $HERO_SOCKET_DIR/hero_livekit/rpc.sock (falling back to
~/hero/var/sockets/hero_livekit/rpc.sock); pass an explicit path to
livekit_client("/custom/path/rpc.sock") to override.
License
See individual crates.