Replace webpack and Module Federation with Vite 8. The controller build emits one entry per shared module (lib, web_ui, typebox, antd, react, react-dom, react-router) and lists them in manifest.json. The controller turns that into an import map in index.html, and plugins are built as ES modules that import the shared modules by name and are loaded with import(). The shared Vite setup lives in @clusterio/web_ui/vite.mjs. Plugins use clusterioPlugin(), which exposes index, package.json and web/index under the same keys the webpack template used. The --dev and --dev-plugin flags now run the Vite dev server in middleware mode with hot module replacement. Browser polyfills move from web_ui to lib, which is the code that needs them, and lib sets the process and Buffer globals itself. Refs #1127 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clusterio Subspace Storage Plugin
Plugin for the Subspace Storage mod.
Installation
Run the following commands in the folder Clusterio is installed to:
npm install @clusterio/plugin-subspace_storage
npx clusteriocontroller plugin add @clusterio/plugin-subspace_storage
Substitute clusteriocontroller with clusteriohost or clusterioctl if this a dedicate host or ctl installation respectively.
Controller Configuration
subspace_storage.division_method
How to divide items between instances when there isn't enough in storage to give everyone what they ask for.
One of simple, dole or neural_dole.
With simple requests are served in full on a first come first served basis until the storage runs out.
With dole a per item division factor is kept that halves the amount handed out each time a request can't be met and slowly recovers when requests succeed, which spreads the remaining items between instances at the cost of draining the last of an item slowly.
neural_dole does the same with a small neural network estimating a fair share from the recent request history.
Defaults to simple.
subspace_storage.log_item_transfers
Log every item transfer in and out of the storage to the controller console at verbose level.
Defaults to false.
Instance Configuration
subspace_storage.log_item_transfers
Log every item transfer in and out of the storage to the host console at verbose level.
Defaults to false.
Development: inventory updates
The Node sender is in instance.ts; the Factorio receiver is UpdateInvData in the separate mod repository's src/control.lua.
Check both ends when changing inventory synchronization.
Each entry is [name, count, quality] and replaces the absolute count for that name/quality pair; it is not an amount to add or subtract.
With full=true, the receiver clears the previous inventory before applying entries, so an empty full snapshot clears all old state.
Without full=true, entries update only the listed pairs; omitted pairs retain their previous values, and an explicit zero records a zero count.
A new or restarted instance needs a complete snapshot before incremental updates. Keep a complete inventory cache separate from any latest-delta cache: one delta is not enough to initialize a new receiver, and changes across several update windows must not overwrite each other before delivery. Verify empty snapshots, zero counts, multiple qualities, and consecutive deltas when changing this path.