Skip to content

Release: 3 features, 2 fixes, 3 chores → Main#9894

Merged
h0lybyte merged 9 commits intomainfrom
dev
Apr 9, 2026
Merged

Release: 3 features, 2 fixes, 3 chores → Main#9894
h0lybyte merged 9 commits intomainfrom
dev

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented Apr 9, 2026

Release: Dev → Main

8 atomic commits ready for main

Features

Bug Fixes

Chores

  • chore(mc): preparing v1.0.2 deployment. (bc091dd)
  • chore(irc): updating the gateway to v0.1.10 (44eb894)
  • chore(discordsh-bot|edge|firecracker): preparing another round of minor patch releases. (212e1e3)

This PR is automatically maintained by CI — KBVE Studio

…ring (#9889)

* fix(agones-mc): update fleet image to 1.0.1 and wire deployment_yaml

- Fleet was still referencing ghcr.io/kbve/mc:1.0.0 (never published),
  updated to 1.0.1 which CI just built successfully
- Added deployment_yaml to mc.mdx so CI post-publish automatically
  updates the fleet image tag on future version bumps

* feat(mc): implement AI Skeleton system — spawn, observe, plan, act

- AiSkeletonManager: spawns up to 3 AI Skeletons in starter zone
  (spawn ± 50 blocks), despawns when no players nearby, tracks
  entities with monotonic epochs for stale-intent detection
- NpcTickHandler: fills in Phase 1 (gather skeleton observations as
  JSON, submit to Tokio via JNI) and Phase 3 (parse NpcIntent[],
  validate epoch, apply MoveTo/Attack/Idle/Speak commands)
- Skeletons equipped with stone sword, named "AI Skeleton", use
  Minecraft's pathfinding for MoveTo and tryAttack for combat
- Rust behavior tree already handles the AI logic: flee if low HP,
  attack nearest player in range, wander otherwise

* test(mc): add RCON e2e tests for AI Skeleton system

- Verify behavior_statetree mod loaded
- Check AI Skeleton spawn near world spawn
- Validate skeleton equipment (stone sword)
- Confirm starter zone config around world spawn
- Assert max skeleton count is respected
@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 9, 2026

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 9 package(s) with unknown licenses.
See the Details below.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA db3aafd.
Ensure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice.

License Issues

apps/vm/kubectl/Cargo.toml

PackageVersionLicenseIssue Type
clap>= 4.0.0, < 5.0.0NullUnknown License
serde>= 1.0.0, < 2.0.0NullUnknown License
serde_json>= 1.0.0, < 2.0.0NullUnknown License
tokio>= 1.0.0, < 2.0.0NullUnknown License
tracing>= 0.1.0, < 0.2.0NullUnknown License
tracing-subscriber>= 0.3.0, < 0.4.0NullUnknown License

packages/rust/bevy/bevy_chat/Cargo.toml

PackageVersionLicenseIssue Type
js-sys>= 0.3.0, < 0.4.0NullUnknown License
wasm-bindgen>= 0.2.0, < 0.3.0NullUnknown License
web-sys>= 0.3.0, < 0.4.0NullUnknown License

OpenSSF Scorecard

PackageVersionScoreDetails
cargo/clap >= 4.0.0, < 5.0.0 UnknownUnknown
cargo/serde >= 1.0.0, < 2.0.0 UnknownUnknown
cargo/serde_json >= 1.0.0, < 2.0.0 UnknownUnknown
cargo/tokio >= 1.0.0, < 2.0.0 UnknownUnknown
cargo/tracing >= 0.1.0, < 0.2.0 UnknownUnknown
cargo/tracing-subscriber >= 0.3.0, < 0.4.0 UnknownUnknown
cargo/js-sys >= 0.3.0, < 0.4.0 UnknownUnknown
cargo/wasm-bindgen >= 0.2.0, < 0.3.0 UnknownUnknown
cargo/web-sys >= 0.3.0, < 0.4.0 UnknownUnknown

Scanned Files

  • apps/vm/kubectl/Cargo.toml
  • packages/rust/bevy/bevy_chat/Cargo.toml

@github-actions github-actions Bot changed the title Release: 1 feature → Main Release: 1 feature, 1 chore → Main Apr 9, 2026
…9892)

* feat(discordsh): wire bevy_chat IRC client into bot with graceful degradation (#9850)

Connects the Discord bot to the existing ergo IRC server via bevy_chat::ChatClient
for cross-platform world events. Gracefully degrades if IRC is unavailable.

Startup:
- If IRC_HOST is set, attempts ChatClient::from_env() connection
- On success: stored as Some(ChatClient) in AppState
- On failure: logs warning, stores None — all IRC features silently disabled
- If IRC_HOST not set: logs info, skips entirely

World event emission (fire-and-forget via tokio::spawn):
- Boss killed → #world-events [EVENT:KILL] player defeated boss
- Dungeon victory → #world-events [EVENT:VICTORY] player cleared depth N
- Player death → #world-events [EVENT:DEATH] player was slain
- All events include structured JSON payload for isometric game consumption

New module: discord/game/irc_events.rs
- emit_boss_killed(), emit_rare_drop(), emit_player_death()
- emit_victory(), emit_quest_complete()
- Each checks Option<ChatClient>, no-ops on None

AppState changes:
- new() is now async (for IRC connect)
- irc: Option<ChatClient> field added

All 701 tests pass (IRC is None in test environment).

* feat(bevy_chat): add WASM WebSocket transport for browser IRC clients (#9850)

WASM clients (isometric game in browser) can't do raw TCP to ergo. They
connect via WebSocket to chat.kbve.com (irc-gateway → ergo:8080).

Transport is selected at compile time via cfg(target_arch):
- Native (not wasm32): tokio TcpStream → ergo:6667 (unchanged)
- WASM (wasm32): web_sys::WebSocket → wss://chat.kbve.com

Public API is identical on both platforms:
- ChatClient::new(config) / connect() / send() / disconnect()
- Native: subscribe() returns broadcast::Receiver (async)
- WASM: drain_incoming() returns Vec (polled each frame by Bevy plugin)

WASM client features:
- Automatic IRC registration on WebSocket open (NICK/USER/JOIN)
- PING/PONG keepalive handling
- PRIVMSG parsing with structured ChatMessage decode
- Closures leaked for WebSocket lifetime (standard WASM pattern)
- Non-Send (Rc<RefCell>) — must run on main thread

File structure:
- client_native.rs — tokio TCP (was client.rs)
- client_wasm.rs — web_sys::WebSocket (new)
- lib.rs — conditional export based on target_arch

Cargo.toml changes:
- tokio moved to cfg(not(wasm32)) target dependency
- Added wasm-bindgen, web-sys, js-sys as cfg(wasm32) dependencies
@github-actions github-actions Bot changed the title Release: 1 feature, 1 chore → Main Release: 2 features, 1 chore → Main Apr 9, 2026
* fix(droid): resolve DataCloneError in Dexie BroadcastChannel sync

storeWsMessage stored FlexBuffers-decoded objects directly into Dexie.
toReference().toObject() returns objects containing Uint8Array typed
array views referencing the original ArrayBuffer. Dexie's multi-tab
sync broadcasts changes via BroadcastChannel.postMessage(), which
throws DataCloneError on these typed array views. JSON round-trip
the decoded object before storing to produce a plain cloneable value.

* fix(droid): make ws message storage format-agnostic, fix DataCloneError

storeWsMessage assumed all WebSocket data was FlexBuffers-encoded and
called toReference().toObject(), which returns objects with typed array
views. Dexie's BroadcastChannel multi-tab sync then threw DataCloneError
when trying to postMessage those views.

The ws-worker is protocol-agnostic (IRC text, FlatBuffers, Protobuf)
so the storage layer should be too. Now stores raw bytes as Uint8Array
(natively supported by IndexedDB and BroadcastChannel) and removes the
FlexBuffers decode from the write path. Consumers decode on read using
the appropriate deserializer for their protocol.

* fix(droid): direct ws-worker → db-worker pipeline, fix DataCloneError

Replaced the main-thread bridgeWsToDb pattern with direct worker-to-
worker communication via BroadcastChannel ('kbve_ws_data').

Before: ws-worker → Comlink → main thread → Comlink → db-worker → IDB
After:  ws-worker → BroadcastChannel → db-worker → IDB

- ws-worker broadcasts classified messages (text/binary + timestamp)
  directly to db-worker, main thread never touches raw data
- db-worker stores raw bytes as Uint8Array (format-agnostic, no
  FlexBuffers assumption — supports IRC text, FlatBuffers, Protobuf)
- Removed bridgeWsToDb and unused proxy import from main.ts
- Removed FlexBuffers toReference import from db-worker (was
  causing DataCloneError via Dexie BroadcastChannel sync)
@github-actions github-actions Bot changed the title Release: 2 features, 1 chore → Main Release: 2 features, 1 fix, 1 chore → Main Apr 9, 2026
h0lybyte added 2 commits April 9, 2026 18:40
Add OSRSLinkTooltip React component (client:idle) that intercepts hover
on any element with data-osrs-tooltip attribute inside the panel. Shows
item preview with icon, name, relationship badge, and high alch value.
Uses @kbve/droid openTooltip/closeTooltip for global state coordination.

Add data-osrs-tooltip attributes to:
- OSRSRelatedItems links (name, slug, icon, relationship)
- OSRSRecipes product links (name, icon, relationship=product)
- OSRSRecipes material links (name, icon, relationship=component)

Tooltip follows cursor, auto-hides on mouse leave with 100ms debounce.
@github-actions github-actions Bot changed the title Release: 2 features, 1 fix, 1 chore → Main Release: 3 features, 1 fix, 2 chores → Main Apr 9, 2026
* fix(mc): resolve JVM GC conflict — disable Aikar flags, use ZGC

Aikar flags set G1GC + JVM_XX_OPTS set ZGC = "Multiple garbage
collectors selected" crash on startup. Disable Aikar flags and
use ZGC with generational mode + tuning flags instead.

* fix(mc): enable e2e in CI, add offline mode, detect GC crash early

- Set ONLINE_MODE=false in e2e container — no Mojang auth needed
- Add early JVM GC conflict detection in wait loop — fails fast
  instead of waiting 300s for a server that will never start
- Enable has_test: true + e2e_name in mc.mdx so CI runs e2e before
  publishing, preventing broken images from reaching production
@github-actions github-actions Bot changed the title Release: 3 features, 1 fix, 2 chores → Main Release: 3 features, 2 fixes, 2 chores → Main Apr 9, 2026
@github-actions github-actions Bot changed the title Release: 3 features, 2 fixes, 2 chores → Main Release: 3 features, 2 fixes, 3 chores → Main Apr 9, 2026
* feat(kubectl): add Alpine-based kubectl container image (#9809)

Alpine 3.21 + kubectl 1.33.2 with sh, curl, wget, jq. Non-root user
(uid 65534), drop-ALL-caps safe. Replaces distroless registry.k8s.io/kubectl
which lacks /bin/sh for Job scripts.

* feat(kubectl): add Rust CLI layer, multi-stage Docker build, MDX page (#9809)

Add kbve-kubectl Rust CLI with guest-exec, run, and info subcommands
for KubeVirt VM lifecycle management via QEMU Guest Agent. Multi-stage
Dockerfile using chisel-ubuntu-axum builder. MDX project page wired
for ci-docker pipeline.

* refactor(kubectl): switch to chiseled Ubuntu runtime from Alpine (#9809)

Replace Alpine runtime with scratch-based chiseled Ubuntu 24.04 using
Canonical chisel. Busybox for shell, curl from Ubuntu slice, jq + kubectl
as static binaries. Matches the chisel-ubuntu-axum ecosystem pattern.

* feat(kubectl-e2e): add e2e test suite for kubectl container image (#9809)

Vitest-based e2e tests that build the image, run it, and validate:
shell availability, busybox utilities, kubectl, jq, curl, CA certs,
kbve-kubectl CLI subcommands (info, run, guest-exec), non-root user.

* fix(kubectl): enable e2e testing in MDX pipeline config (#9809)

Set has_test: true, e2e_name: kubectl-e2e, test_framework: typescript
so ci-docker builds and tests the image before publish.

* fix(kubevirt): remove vmx CPU feature blocking macOS VM on AMD host

The macos-builder VM was unschedulable because the vmx (Intel VT-x)
CPU feature was required but the cluster node is AMD EPYC Rome which
exposes svm instead. Also switched evictionStrategy to None for
single-node compatibility and aligned runStrategy with windows-builder.

* refactor(kubectl): optimize Rust CLI — Cow strings, serde_json payloads, parallel tool checks (#9809)

Extract init_tracing(), add kubectl_output() helper with Cow error
returns, use serde_json::json! for guest-exec payload (proper escaping),
parallelize tool availability checks with futures::join_all, simplify
cmd_run match arms.

* perf(kubectl): inline hints, drop futures dep, reduce allocations (#9809)

- Add #[inline] on init_tracing, kubectl_output, check_tool, cmd_run
- Replace futures::join_all with tokio::spawn — drops futures crate
  (7 sub-crates) from the dependency tree
- Hoist TOOLS and VERSION to module-level const
- kubectl_output: try String::from_utf8 first to avoid lossy double
  allocation when output is valid UTF-8
- Extract first_nonempty_line helper for domain parsing
@h0lybyte h0lybyte merged commit 020f031 into main Apr 9, 2026
7 of 8 checks passed
@github-project-automation github-project-automation Bot moved this from Review to Done in KBVE Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

1 participant