// PROCITY citygen — canonical Lane A public entry point (barrel). // // Consumers import the whole CityGen API from here (not from plan.js directly), e.g. Lane B's shell: // const citygen = await import('./js/citygen/index.js'); citygen.generatePlan(seed) → CityPlan // Keep this the stable import surface for the lane; internals may move between files behind it. // // (Originated as a Lane F integration shim because the shell imports ./js/citygen/index.js while the // generator ships as plan.js; adopted here as the real Lane A entry point, per the shim's own note.) export { generatePlan, chunkIndex, chunkKey, CHUNK, lotCorners, obbOverlap, isOpen } from './plan.js'; export { shopName, townName, bandName } from './names.js'; export { generatePlanOSM, osmTownKeys, registerTownCache, getTownCache, validateTownCache, MIN_TOWN_SHOPS, medianShopSpacing, MAX_MEDIAN_SPACING_M } from './plan_osm.js'; export { withGigs, gigKeyFor, POSTER_CLEAR } from './gigs.js'; // v9 THE ADDRESS LAYER (ROUND39 item 39.1). Pure, no THREE, no fetch, no plan mutation — it derives // from a plan and never writes to one, so it cannot move a golden. ONE consumer contract across both // town types: print `localityOf(shopId).label`, never branch on `plan.source`. Full contract in the // header of address.js and in LANE_A_NOTES §39. export { createAddresses, STREET_TOLERANCE_M } from './address.js'; // The street-corridor law + venue vocabulary, re-exported so consumers get the whole Lane A contract // from one import (ROUND13). `roadWidth`/`vergeBand`/`poleOffset` are the road-vs-verge split of // `edge.width` — see the note in registry.js; `gigKeyFor` is the one and only genre→audio-key mapping. export { SHOP_TYPES, VENUE_KINDS, genreForVenueKind, roadWidth, vergeBand, poleOffset } from '../core/registry.js'; // planSource selector (round 6; multi-town round 8). Default 'synthetic' → the byte-identical // golden-hash generator; 'osm' → the real-data fixture importer. Lane F wires ?plansrc=osm (+ optional // &town=) to these args so the shell bootstrap picks the producer/town without B–F caring which // ran. Unknown source → synthetic; unknown town → the default town. import { generatePlan as _synth } from './plan.js'; import { generatePlanOSM as _osm } from './plan_osm.js'; import { withGigs as _withGigs } from './gigs.js'; export function generatePlanFor(seed, source = 'synthetic', opts = {}) { const plan = source === 'osm' ? _osm(seed, opts.town, opts) : _synth(seed); // v3 gig layer, gated: ?gigs=1 → shell passes { gigs:true, customBands } and we augment; otherwise // the base plan is returned untouched (byte-identical, goldens frozen — CITY_SPEC prime flag law). return opts.gigs ? _withGigs(plan, seed, opts) : plan; } // Convenience default so `citygen.default` also resolves to the (synthetic) generator. export { generatePlan as default } from './plan.js';