feat: insert direct edit constraint solver stage

Adds resolveDirectEditConstraints between compileRoadModel and
compileGeometry, per the parent design's data flow. The stage is an
identity transform until the individual constraint kinds land: it
returns empty road profiles, junction plans and handle manifest, so
compileGeometry's geometry code is untouched and output stays
byte-identical.

Constraint planning is separated from solving up front. Only `exact`
and `recheck` constraints may reach the solver; `disabled`,
`pending`, `conflicted` and `stale` are reported as unapplied with a
reason. SOLVED_KINDS starts empty and grows one entry per kind, so a
partially delivered solver reports what it skipped instead of
publishing half-solved geometry.

diagnostic() moves to src/compile/diagnostics.js so the solver can
share the compiler's diagnostic shape without depending on fs, which
would break the pure-function boundary that lets preview, the full
compile and the CLI export share one implementation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-27 10:29:45 +08:00
parent c5e762e1a9
commit 3297d0c97a
9 changed files with 274 additions and 14 deletions

View File

@@ -324,7 +324,11 @@ function readUpload(request, session) {
function compileWorkbenchInput(input) {
const workspace = path.dirname(input.osmFile);
const initialized = ensureRevisionStore(workspace, input.options);
return compileInput({ ...input, areaConfigSnapshotFile: initialized.paths.activeAreaConfig });
return compileInput({
...input,
areaConfigSnapshotFile: initialized.paths.activeAreaConfig,
editsFile: initialized.paths.activeEdits,
});
}
function readMultipart(request, limit) {
return new Promise((resolve, reject) => {