/**
* Logistik Europa — Headless-Runner (Phase 0)
* ----------------------------------------------------------------
* Deterministische Level-Durchläufe für die Balance-Verifikation
* gemäß `balance-matrix.md` §3.
*
* Vertrag (aus Kickoff-Briefing §5.4):
* runLevel(levelNum, seed, strategy) → Promise<{
* successful: boolean,
* endBalance: number,
* completedContracts: number,
* lateDeliveries: number,
* durationHours: number,
* hintUsages: number,
* log: Array,
* strategy: string,
* level: number,
* seed: number
* }>
*
* Verfügbare Strategien:
* - `noop` — funktionierende Demo: keine Aktion, Zeit läuft ab,
* success=false. Beweist Runner-Vertrag in Phase 0.
* - `naive` — Skelett, wirft `Phase 2` (FIFO-Auftrag, erstes Fahrzeug).
* - `greedy` — Skelett, wirft `Phase 2` (höchster Wert zuerst).
* - `optimal` — Skelett, wirft `Phase 2` (Orakel mit Bonus-Maximierung).
*
* Browser-Nutzung:
*
*
*
*
* Node-Nutzung (sobald engine.js Node-Export bekommt):
* const Runner = require('./headless-runner');
* const Engine = require('./engine');
* const r = await Runner.runLevel(1, 1, 'noop', { engine: Engine });
*/
(function (root, factory) {
'use strict';
const api = factory();
if (typeof module !== 'undefined' && module.exports) {
module.exports = api; // Node / CommonJS
}
if (typeof root !== 'undefined') {
root.LogistikRunner = api; // Browser global
}
})(typeof window !== 'undefined' ? window : globalThis, function () {
'use strict';
/* ============================================================
SEED-RNG (Mulberry32 — deterministisch, ausreichend für Tests)
Gleicher Seed → identische Sequenz auf jeder Plattform.
============================================================ */
function makeRng(seed) {
let s = (seed >>> 0) || 1;
return function () {
s = (s + 0x6D2B79F5) >>> 0;
let t = s;
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
/* ============================================================
ENGINE-RESOLVE (Browser via window, Node via opts.engine)
============================================================ */
function resolveEngine(opts) {
if (opts && opts.engine) return opts.engine;
if (typeof window !== 'undefined' && window.LogistikEngine) {
return window.LogistikEngine;
}
throw new Error(
'LogistikEngine nicht verfügbar. Im Browser: