Skip to content

Architecture 5.0.0

KOKOTO-DEV edited this page Aug 26, 2026 · 1 revision

Architecture 5.0.0

KOKOTO WebChat 5.0.0 · shared core/Bukkit Java 17 baseline · Fabric/NeoForge exact-target platforms Java 17/21/25 · Forge exact-target platforms Java 17/21/25

5.0.0 is the KOKOTO WebChat multi-platform split. The shared core stays loader-neutral; loader-native lifecycle, permissions, persistence adapters and Minecraft event hooks live in platform modules.

Modules

kwc-core/
  Platform-neutral models and helpers
  ConfigValues / MessageTokenConfig
  PlatformAdapter / PlatformPlayer / PlatformGameMessage
  LegacyText
  SqliteHistoryStore
  DirectMessageStore / GroupChatStore
  ConversationStoreHost + settings snapshots
  ServerRelay + RelayHost / RelaySettings
  CoreHttpServer + SseHub / SseConnection
  WebChatServer + WebChatHost service contracts
  PinnedMessage
  WebPushManager + WebPushHost

kwc-standalone-frontend/
  Map-independent standalone frontend assets
  standalone/chat.js / standalone/chat.css resources

kwc-adapter-bluemap/
  BlueMap web addon installation
  BlueMap web-root / webapp.conf discovery and patching
  BlueMap addon chat.js / chat.css resources
  BlueMapAdapter + BlueMapAdapterHost

kwc-adapter-squaremap/
  squaremap web-directory discovery
  marked index.html injection
  squaremap KWC chat.js / chat.css resources
  SquaremapAdapter + SquaremapAdapterHost

kwc-adapter-unmined/
  uNmINeD static-export discovery
  current index.html + legacy unmined.index.html marker-checked injection
  uNmINeD KWC chat.js / chat.css resources
  UnminedAdapter + UnminedAdapterHost

kwc-adapter-overviewer/
  Loader-neutral Minecraft Overviewer static output integration
  Positive Overviewer index/asset detection
  KWC-owned addon assets + marked index block only


kwc-platform-bukkit/
  Bukkit / Spigot / Paper lifecycle
  BukkitConfigValuesLoader
  Account/session YAML persistence
  Commands/listeners and Bukkit resources
  DiscordSRV integration
  BukkitPlatformAdapter
  BukkitConversationStoreHost
  BukkitRelayHost
  BukkitWebPushHost
  BukkitWebChatHost
  BukkitBlueMapAdapterHost
  BukkitSquaremapAdapterHost
  BukkitUnminedAdapterHost

kwc-platform-fabric/
  Fabric exact-target lifecycle, compatibility bridge, and command registration
  Fabric player/chat/connection event bridge
  Fabric permission/platform adapter
  Fabric YAML/account/session persistence
  Fabric WebChat/relay/WebPush/conversation hosts
  FabricSquaremapAdapterHost
  FabricUnminedAdapterHost
  Reuses shared core/standalone/map-adapter resources

kwc-platform-neoforge/
  NeoForge exact-target lifecycle, compatibility bridge, and command registration
  NeoForge player/chat/connection event bridge
  Native NeoForge kwc.* permission nodes + platform adapter
  NeoForge YAML/account/session persistence
  NeoForge WebChat/relay/WebPush/conversation hosts
  NeoForgeSquaremapAdapterHost
  NeoForgeUnminedAdapterHost
  Reuses shared core/standalone/map-adapter resources

The Bukkit artifact shades the shared core, standalone frontend, and all loader-neutral web adapters (including kwc-adapter-unmined), so a normal server still installs one file:

kwc-platform-bukkit/target/KOKOTO-WebChat-5.0.0-Bukkit-1.18-26.2.jar

Platform boundary

PlatformAdapter now owns the loader-specific Minecraft operations required by shared web/chat code:

  • online-player snapshots and UUID lookup
  • permission checks
  • main-thread detection/dispatch
  • console-command execution
  • known player-name lookup for guest spoof protection
  • plain Minecraft message delivery
  • interactive URL/reply hover/click delivery through PlatformGameMessage
  • optional ImageEmojis runtime-symbol discovery

BukkitPlatformAdapter converts the loader-neutral interaction description to the existing Bungee chat components. WebChatServer itself is core-owned and imports no Bukkit or Bungee chat APIs.

Relay boundary

The complete signed relay engine is loader-neutral. Core owns HTTP transport, HMAC authentication, source routing, public relay, cross-server DM delivery, configurable public-chat multi-hop forwarding, deduplication and remote DM read receipts. RelayHost supplies only platform callbacks for config, logging, persistence checks and final message/update delivery. Relay protocol headers/IDs remain unchanged.

Storage boundary

Public-chat SQLite history plus direct-message/group-chat persistence are core-owned. DirectMessageStore and GroupChatStore retain their existing database/JSONL formats and public APIs, but obtain data-directory access, identity and online-state resolution, logging, and immutable settings snapshots through ConversationStoreHost. Account/session YAML persistence remains Bukkit-side for now.

HTTP and SSE boundary

JDK HTTP bind/start/stop, context registration/executor ownership, SSE connection metadata/cleanup, and the complete WebChatServer endpoint semantics/orchestration now live in core. WebChatServer receives loader-neutral services through WebChatHost, with narrower contracts for storage/session access, authentication, language lookup, moderation, Discord forwarding, Web Push, resources, audit and announcements. The public endpoint paths and handlers are unchanged.

squaremap adapter boundary

kwc-adapter-squaremap is loader-neutral and has no compile-time squaremap dependency. squaremap exposes its generated web UI through settings.web-directory.path; the adapter discovers existing squaremap config/web roots, installs KWC assets under kokoto-web-chat/, and owns only a marked KWC block in squaremap's index.html. This is intentionally different from the BlueMap webapp.conf integration. Because squaremap may refresh the web directory when its auto-update option is enabled, the adapter re-checks the marked block on KWC startup/reload. Bukkit, Fabric, NeoForge, and Forge provide the same small host surface.

uNmINeD adapter boundary

kwc-adapter-unmined is loader-neutral and has no compile-time uNmINeD dependency. uNmINeD is an external static map generator, so the adapter never expects a server plugin or runtime API. It patches only a positively identified current index.html or legacy unmined.index.html, writes KWC-owned assets under the configured addon path, and leaves map metadata/tiles/libraries untouched. Because uNmINeD can export to arbitrary locations, automatic discovery is deliberately conservative and adapters.unmined.web-root is the normal choice for custom or externally served document roots. Re-exporting the map may replace KWC files; startup/reload restores them idempotently.

Overviewer adapter boundary

kwc-adapter-overviewer is loader-neutral and has no compile-time Minecraft Overviewer dependency. Overviewer generates a static Leaflet web map under its configured outputdir; the adapter only accepts an existing index.html with Overviewer-specific generator metadata and/or the standard overviewerConfig.js/overviewer.js assets. It owns only a marked KWC block and configured addon directory, rejects unrelated Leaflet sites, and leaves Overviewer tiles/configuration/web libraries untouched. Because rendering or --update-web-assets can regenerate index.html, /kchat reload restores the KWC block idempotently.

Standalone frontend boundary

The standalone page no longer resolves its JavaScript or stylesheet from kwc-adapter-bluemap. kwc-standalone-frontend owns a dedicated asset bundle under standalone/, while core owns the HTTP routing, runtime bootstrap values, PWA metadata, and API. The primary standalone HTML embeds the standalone bootstrap bundle directly, so reverse proxies that publish only the configured page path do not also need a /chat/* static-resource rule. The optional internal /chat.js and /chat.css diagnostic resources remain available. The BlueMap addon keeps separate resources under kwc-adapter-bluemap. Fabric, NeoForge, and Forge 26.1.2/26.2 bundle the shared BlueMap assets only for optional BlueMapAPI integration; standalone mode remains independent and does not require BlueMap. The default internal standalone route is /; http.public-prefix defines the external reverse-proxy prefix, /chat by default.

BlueMap adapter boundary

BlueMap-specific web integration no longer lives in kwc-platform-bukkit. kwc-adapter-bluemap owns addon target discovery, webapp.conf patching, generated config.js, and the BlueMap wrapper assets. It depends only on kwc-core and receives filesystem/resource/version/log access through BlueMapAdapterHost. Bukkit supplies those callbacks through BukkitBlueMapAdapterHost. Existing adapters.bluemap.* keys, BlueMap paths, generated files, and deployed Bukkit behavior are unchanged.

Web Push boundary

WebPushManager is now core-owned and uses only JDK APIs plus WebPushHost. VAPID generation/loading, subscription persistence, notification filtering, localization input, encryption, and push delivery no longer depend on Bukkit. BukkitWebPushHost supplies config, storage lookups, language strings, data-directory access, and logging.

Authentication and command boundary

Minecraft account-link permission evaluation now goes through PlatformAdapter.hasPermission, using a loader-neutral PlatformPlayer snapshot. Web console commands are scheduled and dispatched through PlatformAdapter instead of direct Bukkit calls.

What does not change in 5.0.0

  • /kchat
  • plugins/KOKOTO-WebChat/
  • kwc.* permissions
  • relay identifiers/protocol compatibility
  • current BlueMap/squaremap/standalone web behavior and API paths
  • DM/group/public history formats

The KOKOTO WebChat rename is already active. Legacy BMWC naming is not used for current commands or public paths; Relay Protocol v1 wire headers remain unchanged because they are protocol identifiers rather than UI/command branding.

Core-separation status

The 5.0.0 core, Bukkit, standalone frontend, and map-adapter boundaries are established. kwc-platform-fabric and kwc-platform-neoforge both consume the same core/standalone contracts. Loader lifecycle, public game↔web chat, authentication/password, persistence, moderation, standalone hosting, Web Push, signed relay, map adapters, and game-side DM/group/reply/admin command behavior are all wired through the final 5.0.0 platform surfaces. Shared private/admin command behavior lives in GameCommandService; loader-specific reload/status/auth/password registration remains in each platform module. Fabric/NeoForge and Forge 26.1.2/26.2 BlueMap-mod integration uses BlueMapAPI 2.8.0.

Forge platform boundary

kwc-platform-forge adds 16 exact-target Forge projects spanning Minecraft 1.18.2–26.2. Shared KWC HTTP/SSE/storage/auth/relay and loader-neutral map-adapter code is reused; only loader/Minecraft API seams are split across compat118, compatClassic, compatModern, and compat26. This prevents one JAR from claiming binary compatibility across incompatible Forge event and Minecraft profile/permission APIs. BlueMapAPI is hard-linked only on the 26.1.2/26.2 Forge targets; earlier Forge targets keep filesystem/static-map integration.

Clone this wiki locally