feat(lab-content-engine): phase 1 - data-driven регистрация всех симуляций

- _register-all.js: строит манифесты из SIMS + THEORY + карта OPEN (40 id),
  регистрирует все симуляции в LabRegistry; LAB_SIM_ALIASES для deep-link
- openSim(): удалена if-цепочка (~60 строк), замена на нормализацию алиасов +
  диспетчеризацию через реестр (early return)
- lab.html: _pilots.js -> _register-all.js (defer, последним)
- _pilots.js удалён (поглощён _register-all.js)

Паритет проверен: исполняемый harness (40 регистраций, dispatch, алиасы,
:arg) ALL PASS; независимое ревью PASS (coverage 40/40, dispatch byte-for-byte).
Lifecycle пока на _pauseAllSims/closeSim (дробовик) — паритет.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 13:49:19 +03:00
parent 81d4c15442
commit ebb2a9b37b
3 changed files with 111 additions and 103 deletions
+12 -58
View File
@@ -106,68 +106,22 @@
// load theory for this sim
loadTheory(id.includes(':') ? id.split(':')[0] : id);
// Контент-движок: мигрированные симуляции открываются через реестр.
if (window.LabRegistry && window.LabRegistry.has(id)) {
const _m = window.LabRegistry.get(id);
const _arg = id.includes(':') ? id.split(':')[1] : undefined;
// ── Контент-движок (Фаза 1): диспетчеризация через реестр ──
// Все каталожные симуляции зарегистрированы в _register-all.js.
// Алиасы deep-link (magnetic/coulomb/thinlens/mirrors/refraction) нормализуем
// в канонический id[:arg] перед обращением к реестру.
var _aliases = window.LAB_SIM_ALIASES || {};
var _cid = _aliases[id.split(':')[0]] || id;
if (window.LabRegistry && window.LabRegistry.has(_cid)) {
const _m = window.LabRegistry.get(_cid);
const _arg = _cid.includes(':') ? _cid.split(':')[1] : undefined;
window.LabRegistry.setActive(_m);
try { _m.open({ id: id, arg: _arg }); } catch (e) { console.error('[LabRegistry] open failed:', id, e); }
try { _m.open({ id: _cid, arg: _arg }); }
catch (e) { console.error('[LabRegistry] open failed:', _cid, e); }
if (window.lucide) lucide.createIcons();
return;
}
if (id === 'graph') _openGraph();
if (id === 'projectile') _openProjectile();
if (id === 'collision') _openCollision();
if (id === 'triangle') _openTriangle();
if (id === 'trigcircle') _openTrigCircle();
if (id === 'magnetic') _openEMField('B'); // backward compat: #magnetic → emfield B-mode
if (id === 'coulomb') _openEMField('E'); // backward compat: #coulomb → emfield E-mode
if (id === 'emfield') _openEMField('E');
if (id.startsWith('emfield:')) { _openEMField(id.split(':')[1]); }
if (id === 'molphys') _openMolPhys();
if (id.startsWith('molphys:')) { _openMolPhys(id.split(':')[1]); }
if (id === 'circuit') _openCircuit();
if (id === 'chemistry') _openChemistry();
if (id.startsWith('chemistry:')) { _openChemistry(id.split(':')[1]); }
if (id === 'dynamics') _openDynamics();
if (id.startsWith('dynamics:')) { _openDynamics(id.split(':')[1]); }
if (id === 'crystal') _openCrystal();
if (id === 'orbitals') _openOrbitals();
if (id === 'stereo') _openStereo();
if (id.startsWith('stereo:')) { _openStereo(id.split(':')[1]); }
if (id === 'chemsandbox') _openChemSandbox();
if (id === 'celldivision') _openCellDivision();
if (id === 'photosynthesis') _openPhotosynthesis();
if (id === 'angrybirds') _openAngryBirds();
if (id === 'quadratic') _openQuadratic();
if (id === 'normaldist') _openNormalDist();
if (id === 'graphtransform') _openGraphTransform();
if (id === 'pendulum') _openPendulum();
if (id === 'equilibrium') _openEquilibrium();
if (id === 'opticsbench') _openOpticsBench('lens');
if (id.startsWith('opticsbench:')) _openOpticsBench(id.split(':')[1]);
if (id === 'thinlens') _openOpticsBench('lens'); // backward compat
if (id === 'mirrors') _openOpticsBench('mirror'); // backward compat
if (id === 'refraction') _openOpticsBench('refraction'); // backward compat
if (id === 'isoprocess') _openIsoprocess();
if (id === 'titration') _openTitration();
if (id === 'probability') _openProbability();
if (id === 'bohratom') _openBohrAtom();
if (id === 'electrolysis') _openElectrolysis();
if (id === 'race') _openRace();
if (id === 'waves') _openWaves();
if (id === 'hydrostatics') _openHydro();
if (id.startsWith('hydrostatics:')) _openHydro(id.split(':')[1]);
if (id === 'radioactive') _openRadioactive();
if (id === 'geometry') _openGeometry();
if (id === 'logic') _openLogic();
if (id === 'heatengine') _openHeatEngine();
if (id === 'stoichiometry') _openStoich();
if (id === 'qualanalysis') _openQualAnalysis();
if (id === 'periodic') _openPeriodic();
if (id === 'organic') _openOrganic();
if (id === 'solutions') _openSolutions();
if (window.console) console.warn('[LabRegistry] неизвестная симуляция:', id);
}
function _simShow(elId) {