@crazyhappyone/auto-graph 0.2.11 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.cjs +112 -8
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +112 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +112 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +112 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/dsl/diagnostics.ts","../../src/exporters/arrow.ts","../../src/exporters/excalidraw.ts","../../src/exporters/svg.ts","../../src/geometry/boxes.ts","../../src/geometry/spatial-index.ts","../../src/constraints/solver.ts","../../src/geometry/shapes.ts","../../src/geometry/containers.ts","../../src/text/types.ts","../../src/text/fallback.ts","../../src/text/node-canvas.ts","../../src/text/pretext.ts","../../src/text/default.ts","../../src/labels/fit.ts","../../src/dsl/normalize.ts","../../src/ir/diagnostics.ts","../../src/layout/dagre.ts","../../src/layout/recursive.ts","../../src/routing/binary-heap.ts","../../src/routing/astar.ts","../../src/routing/visibility-router.ts","../../src/routing/routes.ts","../../src/solver/solve.ts","../../src/dsl/edges.ts","../../src/dsl/schema.ts","../../src/dsl/parse.ts","../../src/dsl/render.ts","../../src/cli/io.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"names":["point","renderGroup","renderMatrixBlock","renderTableBlock","renderEvidencePanel","renderNode","cell","compartments","line","offset","movingCenter","fixedCenter","contentBox","style","require","createRequire","prepareWithSegments","layoutWithLines","measureNaturalWidth","normalizeMinSize","Graph","layout","simplifyRoute","expandBox","aStarSearch","manhattan","reconstructPath","bestPoints","rerouted","squaredDistance","areCollinear","exit","segmentBox","rangesOverlap","DEFAULT_MATRIX_CELL_SIZE","DEFAULT_TABLE_CELL_SIZE","DEFAULT_PANEL_ITEM_HEIGHT","alignmentValue","distributionStart","lanes","defaultMatrixRowHeaderWidth","tableCellBox","_","panelItemText","compartmentRows","labelOffset","segmentIntersectsBox","pointInsideBox","segmentIntersectsBoxEdge","labelPlacementOnPolyline","nonZeroSegments","z","Buffer","parseDocument","hasErrorDiagnostics","stat","readFile","path","dirname","mkdtemp","join","writeFile","rename","rm","CommanderError","Command","formatPath"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DslDiagnostic, DslDiagnosticLayer } from \"./types.js\";\n\nconst SEVERITY_RANK = new Map([\n\t[\"error\", 0],\n\t[\"warning\", 1],\n\t[\"info\", 2],\n] as const);\n\nconst LAYER_RANK = new Map<DslDiagnosticLayer, number>([\n\t[\"parse\", 0],\n\t[\"validate\", 1],\n\t[\"solve\", 2],\n\t[\"export\", 3],\n\t[\"io\", 4],\n]);\n\nexport function sortDslDiagnostics(\n\tdiagnostics: DslDiagnostic[],\n): DslDiagnostic[] {\n\treturn [...diagnostics].sort((a, b) => {\n\t\tconst severityDelta =\n\t\t\t(SEVERITY_RANK.get(a.severity) ?? 99) -\n\t\t\t(SEVERITY_RANK.get(b.severity) ?? 99);\n\t\tif (severityDelta !== 0) {\n\t\t\treturn severityDelta;\n\t\t}\n\n\t\tconst layerDelta =\n\t\t\t(LAYER_RANK.get(a.layer) ?? 99) - (LAYER_RANK.get(b.layer) ?? 99);\n\t\tif (layerDelta !== 0) {\n\t\t\treturn layerDelta;\n\t\t}\n\n\t\tconst pathDelta = pathKey(a.path).localeCompare(pathKey(b.path));\n\t\tif (pathDelta !== 0) {\n\t\t\treturn pathDelta;\n\t\t}\n\n\t\treturn a.code.localeCompare(b.code);\n\t});\n}\n\nexport function createSchemaDiagnostic(\n\tpath: Array<string | number>,\n\tmessage: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"validate\",\n\t\tcode: \"validate.schema.invalid\",\n\t\tmessage,\n\t\tpath,\n\t\thint: hintForPath(path),\n\t};\n}\n\nexport function createParseDiagnostic(\n\tcode: string,\n\tmessage: string,\n\thint: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"parse\",\n\t\tcode,\n\t\tmessage,\n\t\thint,\n\t};\n}\n\nfunction hintForPath(path: Array<string | number>): string {\n\tconst pathText = pathKey(path);\n\n\tif (pathText.endsWith(\".shape\")) {\n\t\treturn \"Use one of: rectangle, rounded-rectangle, ellipse, diamond, parallelogram, hexagon, cylinder.\";\n\t}\n\n\tif (pathText.endsWith(\".format\")) {\n\t\treturn \"Use output format svg or excalidraw.\";\n\t}\n\n\tif (pathText.includes(\".position.\")) {\n\t\treturn \"Use finite numeric x and y coordinates.\";\n\t}\n\n\treturn \"Check the DSL value at this path against the supported schema.\";\n}\n\nfunction pathKey(path: DslDiagnostic[\"path\"]): string {\n\treturn (path ?? []).map(String).join(\".\");\n}\n","import type { Point } from \"../ir/geometry.js\";\n\nexport interface Arrowhead {\n\ttip: Point;\n\tleft: Point;\n\tright: Point;\n\tdirection: Point;\n}\n\nexport function computeArrowhead(\n\tpoints: readonly Point[],\n\toptions: { length?: number; width?: number } = {},\n): Arrowhead {\n\tconst { length = 10, width = 8 } = options;\n\n\tfor (let index = points.length - 1; index > 0; index -= 1) {\n\t\tconst tip = points[index];\n\t\tconst previous = points[index - 1];\n\t\tif (tip === undefined || previous === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst dx = tip.x - previous.x;\n\t\tconst dy = tip.y - previous.y;\n\t\tconst magnitude = Math.hypot(dx, dy);\n\t\tif (magnitude === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst direction = { x: dx / magnitude, y: dy / magnitude };\n\t\tconst perpendicular = { x: -direction.y, y: direction.x };\n\t\tconst base = {\n\t\t\tx: tip.x - direction.x * length,\n\t\t\ty: tip.y - direction.y * length,\n\t\t};\n\t\tconst halfWidth = width / 2;\n\n\t\treturn {\n\t\t\ttip: { ...tip },\n\t\t\tleft: {\n\t\t\t\tx: base.x + perpendicular.x * halfWidth,\n\t\t\t\ty: base.y + perpendicular.y * halfWidth,\n\t\t\t},\n\t\t\tright: {\n\t\t\t\tx: base.x - perpendicular.x * halfWidth,\n\t\t\t\ty: base.y - perpendicular.y * halfWidth,\n\t\t\t},\n\t\t\tdirection,\n\t\t};\n\t}\n\n\tthrow new TypeError(\"Arrowhead requires at least one non-zero segment\");\n}\n","import type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedTableBlock,\n\tEdgeArrowhead,\n\tLabel,\n\tNodeShape,\n} from \"../ir/elements.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport type { ExportOptions } from \"./types.js\";\n\ntype ExcalidrawElement =\n\t| ExcalidrawShapeElement\n\t| ExcalidrawTextElement\n\t| ExcalidrawArrowElement;\n\ntype ExcalidrawElementType =\n\t| \"rectangle\"\n\t| \"ellipse\"\n\t| \"diamond\"\n\t| \"parallelogram\"\n\t| \"hexagon\"\n\t| \"cylinder\"\n\t| \"text\"\n\t| \"arrow\";\n\ninterface ExcalidrawElementBase<TType extends ExcalidrawElementType> {\n\tid: string;\n\ttype: TType;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\tangle: 0;\n\tstrokeColor: string;\n\tbackgroundColor: string;\n\tfillStyle: \"solid\";\n\tstrokeWidth: number;\n\tstrokeStyle: \"solid\" | \"dashed\";\n\troughness: 0;\n\topacity: 100;\n\tgroupIds: string[];\n\tseed: number;\n\tversion: 1;\n\tversionNonce: number;\n\tisDeleted: false;\n\tboundElements: null;\n\tupdated: 0;\n\tlink: null;\n\tlocked: false;\n}\n\ninterface ExcalidrawShapeElement\n\textends ExcalidrawElementBase<\n\t\t| \"rectangle\"\n\t\t| \"ellipse\"\n\t\t| \"diamond\"\n\t\t| \"parallelogram\"\n\t\t| \"hexagon\"\n\t\t| \"cylinder\"\n\t> {\n\ttype:\n\t\t| \"rectangle\"\n\t\t| \"ellipse\"\n\t\t| \"diamond\"\n\t\t| \"parallelogram\"\n\t\t| \"hexagon\"\n\t\t| \"cylinder\";\n}\n\ninterface ExcalidrawTextElement extends ExcalidrawElementBase<\"text\"> {\n\ttype: \"text\";\n\ttext: string;\n\tfontSize: number;\n\tfontFamily: 1;\n\ttextAlign: \"center\" | \"left\";\n\tverticalAlign: \"middle\" | \"top\";\n\tbaseline: number;\n\tcontainerId: string | null;\n\toriginalText: string;\n\tlineHeight: number;\n}\n\ninterface ExcalidrawArrowElement extends ExcalidrawElementBase<\"arrow\"> {\n\ttype: \"arrow\";\n\tpoints: Point[];\n\tstartBinding: { elementId: string; focus: 0; gap: 0 };\n\tendBinding: { elementId: string; focus: 0; gap: 0 };\n\tstartArrowhead: null;\n\tendArrowhead: \"arrow\" | \"triangle\" | \"triangle_outline\";\n}\n\nexport function exportExcalidraw(\n\tdiagram: CoordinatedDiagram,\n\toptions: ExportOptions = {},\n): string {\n\tconst elements: ExcalidrawElement[] = [];\n\tconst groupIdByChildId = createGroupMembership(diagram.groups);\n\n\tfor (const group of diagram.groups) {\n\t\tconst groupElementId = groupElementIdFor(group.id);\n\t\telements.push(renderGroup(group));\n\t\tconst text = renderText(\n\t\t\t`group-text:${group.id}`,\n\t\t\tgroup.label,\n\t\t\tgroup.box,\n\t\t\tgroupElementId,\n\t\t\tgroupIdByChildId.get(group.id) ?? [],\n\t\t);\n\t\tif (text !== undefined) {\n\t\t\telements.push(text);\n\t\t}\n\t}\n\n\tfor (const node of diagram.nodes) {\n\t\telements.push(renderNode(node, groupIdByChildId.get(node.id) ?? []));\n\t\tconst text = renderText(\n\t\t\t`node-text:${node.id}`,\n\t\t\tnode.label,\n\t\t\tnode.box,\n\t\t\t`node:${node.id}`,\n\t\t\tgroupIdByChildId.get(node.id) ?? [],\n\t\t);\n\t\tif (text !== undefined) {\n\t\t\telements.push(text);\n\t\t}\n\t}\n\n\tfor (const matrix of diagram.matrices ?? []) {\n\t\telements.push(...renderMatrixBlock(matrix as CoordinatedMatrixBlock));\n\t}\n\n\tfor (const table of diagram.tables ?? []) {\n\t\telements.push(...renderTableBlock(table as CoordinatedTableBlock));\n\t}\n\n\tfor (const panel of diagram.evidencePanels ?? []) {\n\t\telements.push(...renderEvidencePanel(panel as CoordinatedEvidencePanel));\n\t}\n\n\tfor (const edge of diagram.edges) {\n\t\telements.push(renderArrow(edge));\n\t}\n\n\tconst scene = {\n\t\ttype: \"excalidraw\",\n\t\tversion: 2,\n\t\tsource: \"auto-graph\",\n\t\telements,\n\t\tappState: {\n\t\t\tname: options.title ?? diagram.title ?? diagram.id,\n\t\t\tviewBackgroundColor: \"#ffffff\",\n\t\t\tgridSize: null,\n\t\t\t...(options.viewportPadding === undefined\n\t\t\t\t? {}\n\t\t\t\t: viewportAppState(diagram.bounds, options.viewportPadding)),\n\t\t},\n\t\tfiles: {},\n\t};\n\n\treturn `${JSON.stringify(scene, null, 2)}\\n`;\n}\n\nfunction viewportAppState(\n\tbounds: Box,\n\tpadding: number,\n): {\n\tscrollX: number;\n\tscrollY: number;\n\tzoom: { value: number };\n} {\n\tconst safePadding = Number.isFinite(padding) ? Math.max(0, padding) : 0;\n\treturn {\n\t\tscrollX: finite(-bounds.x + safePadding),\n\t\tscrollY: finite(-bounds.y + safePadding),\n\t\tzoom: { value: 1 },\n\t};\n}\n\nfunction renderGroup(group: CoordinatedGroup): ExcalidrawShapeElement {\n\treturn {\n\t\t...baseElement(`group:${group.id}`, \"rectangle\", group.box),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeStyle: \"dashed\",\n\t\tgroupIds: groupGroupIds(group.id),\n\t};\n}\n\nfunction renderNode(\n\tnode: CoordinatedNode,\n\tgroupIds: string[],\n): ExcalidrawShapeElement {\n\treturn {\n\t\t...baseElement(`node:${node.id}`, mapShape(node.shape), node.box),\n\t\tgroupIds,\n\t};\n}\n\nfunction renderMatrixBlock(\n\tmatrix: CoordinatedMatrixBlock,\n): ExcalidrawElement[] {\n\tconst containerId = `matrix:${matrix.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\tmatrix.id,\n\t\t`row | ${matrix.cols.join(\" | \")}`,\n\t\t...matrix.rows.map((rowId, rowIndex) => {\n\t\t\tconst row = matrix.cells[rowIndex] ?? [];\n\t\t\treturn `${rowId}: ${matrix.cols\n\t\t\t\t.map((_, columnIndex) => row[columnIndex]?.text ?? \"\")\n\t\t\t\t.join(\" | \")}`;\n\t\t}),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", matrix.box),\n\t\t\tbackgroundColor: matrix.style?.fill ?? \"#f8fafc\",\n\t\t\tstrokeColor: matrix.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`matrix-text:${matrix.id}`,\n\t\t\tlabel,\n\t\t\tmatrix.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderTableBlock(table: CoordinatedTableBlock): ExcalidrawElement[] {\n\tconst containerId = `table:${table.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\ttable.columns.map((column) => column.label.text).join(\" | \"),\n\t\t...table.rows.map((row) =>\n\t\t\ttable.columns\n\t\t\t\t.map((column) => row.cells[column.id]?.text ?? \"\")\n\t\t\t\t.join(\" | \"),\n\t\t),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", table.box),\n\t\t\tbackgroundColor: table.style?.fill ?? \"#f8fafc\",\n\t\t\tstrokeColor: table.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`table-text:${table.id}`,\n\t\t\tlabel,\n\t\t\ttable.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderEvidencePanel(\n\tpanel: CoordinatedEvidencePanel,\n): ExcalidrawElement[] {\n\tconst containerId = `evidence-panel:${panel.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\t`${panel.kind}: ${panel.id}`,\n\t\t...panel.items.map((item) =>\n\t\t\titem.detail?.text === undefined\n\t\t\t\t? item.label.text\n\t\t\t\t: `${item.label.text}: ${item.detail.text}`,\n\t\t),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", panel.box),\n\t\t\tbackgroundColor: panel.style?.fill ?? panelKindFill(panel.kind),\n\t\t\tstrokeColor: panel.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`evidence-panel-text:${panel.id}`,\n\t\t\tlabel,\n\t\t\tpanel.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderArrow(edge: CoordinatedEdge): ExcalidrawArrowElement {\n\tconst first = edge.points[0];\n\tif (first === undefined) {\n\t\tthrow new TypeError(\n\t\t\t`Excalidraw edge ${edge.id} requires at least one point`,\n\t\t);\n\t}\n\n\tconst relativePoints = edge.points.map((point) => ({\n\t\tx: point.x - first.x,\n\t\ty: point.y - first.y,\n\t}));\n\tconst box = pointsBox(relativePoints);\n\n\treturn {\n\t\t...baseElement(`edge:${edge.id}`, \"arrow\", {\n\t\t\tx: first.x,\n\t\t\ty: first.y,\n\t\t\twidth: box.width,\n\t\t\theight: box.height,\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeStyle: edge.style ?? \"solid\",\n\t\tpoints: relativePoints,\n\t\tstartBinding: { elementId: `node:${edge.source.nodeId}`, focus: 0, gap: 0 },\n\t\tendBinding: { elementId: `node:${edge.target.nodeId}`, focus: 0, gap: 0 },\n\t\tstartArrowhead: null,\n\t\tendArrowhead: mapArrowhead(edge.arrowhead),\n\t};\n}\n\nfunction renderText(\n\tid: string,\n\tlabel: Label | undefined,\n\tbox: Box,\n\tcontainerId: string,\n\tgroupIds: string[],\n): ExcalidrawTextElement | undefined {\n\tif (label?.text === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst fontSize = 14;\n\treturn {\n\t\t...baseElement(id, \"text\", {\n\t\t\tx: box.x,\n\t\t\ty: box.y + box.height / 2 - fontSize / 2,\n\t\t\twidth: box.width,\n\t\t\theight: fontSize,\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeColor: \"#111827\",\n\t\tgroupIds,\n\t\ttext: label.text,\n\t\tfontSize,\n\t\tfontFamily: 1,\n\t\ttextAlign: \"center\",\n\t\tverticalAlign: \"middle\",\n\t\tbaseline: fontSize,\n\t\tcontainerId,\n\t\toriginalText: label.text,\n\t\tlineHeight: 1.25,\n\t\tboundElements: null,\n\t\tlink: null,\n\t\tlocked: false,\n\t\tseed: seedFor(id),\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t};\n}\n\nfunction renderTextBlock(\n\tid: string,\n\ttext: string,\n\tbox: Box,\n\tcontainerId: string,\n\tgroupIds: string[],\n): ExcalidrawTextElement {\n\tconst fontSize = 12;\n\treturn {\n\t\t...baseElement(id, \"text\", {\n\t\t\tx: box.x + 8,\n\t\t\ty: box.y + 8,\n\t\t\twidth: Math.max(0, box.width - 16),\n\t\t\theight: Math.max(fontSize, box.height - 16),\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeColor: \"#111827\",\n\t\tgroupIds,\n\t\ttext,\n\t\tfontSize,\n\t\tfontFamily: 1,\n\t\ttextAlign: \"left\",\n\t\tverticalAlign: \"top\",\n\t\tbaseline: fontSize,\n\t\tcontainerId,\n\t\toriginalText: text,\n\t\tlineHeight: 1.25,\n\t\tboundElements: null,\n\t\tlink: null,\n\t\tlocked: false,\n\t\tseed: seedFor(id),\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t};\n}\n\nfunction baseElement<TType extends ExcalidrawElementType>(\n\tid: string,\n\ttype: TType,\n\tbox: Box,\n): ExcalidrawElementBase<TType> {\n\treturn {\n\t\tid,\n\t\ttype,\n\t\tx: finite(box.x),\n\t\ty: finite(box.y),\n\t\twidth: finite(box.width),\n\t\theight: finite(box.height),\n\t\tangle: 0,\n\t\tstrokeColor: \"#374151\",\n\t\tbackgroundColor: \"#f8fafc\",\n\t\tfillStyle: \"solid\",\n\t\tstrokeWidth: 1,\n\t\tstrokeStyle: \"solid\",\n\t\troughness: 0,\n\t\topacity: 100,\n\t\tgroupIds: [],\n\t\tseed: seedFor(id),\n\t\tversion: 1,\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t\tisDeleted: false,\n\t\tboundElements: null,\n\t\tupdated: 0,\n\t\tlink: null,\n\t\tlocked: false,\n\t};\n}\n\nfunction mapShape(shape: NodeShape): ExcalidrawShapeElement[\"type\"] {\n\tswitch (shape) {\n\t\tcase \"rounded-rectangle\":\n\t\tcase \"rectangle\":\n\t\t\treturn \"rectangle\";\n\t\tcase \"ellipse\":\n\t\t\treturn \"ellipse\";\n\t\tcase \"diamond\":\n\t\t\treturn \"diamond\";\n\t\tcase \"parallelogram\":\n\t\t\treturn \"parallelogram\";\n\t\tcase \"hexagon\":\n\t\t\treturn \"hexagon\";\n\t\tcase \"cylinder\":\n\t\t\treturn \"cylinder\";\n\t}\n}\n\nfunction mapArrowhead(\n\tarrowhead: EdgeArrowhead | undefined,\n): ExcalidrawArrowElement[\"endArrowhead\"] {\n\tswitch (arrowhead) {\n\t\tcase undefined:\n\t\t\treturn \"arrow\";\n\t\tcase \"triangle\":\n\t\t\treturn \"triangle\";\n\t\tcase \"hollowTriangle\":\n\t\t\treturn \"triangle_outline\";\n\t}\n}\n\nfunction createGroupMembership(\n\tgroups: readonly CoordinatedGroup[],\n): Map<string, string[]> {\n\tconst membership = new Map<string, string[]>();\n\tfor (const group of groups) {\n\t\tconst groupElementId = groupElementIdFor(group.id);\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\taddMembership(membership, nodeId, groupElementId);\n\t\t}\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\taddMembership(membership, childGroupId, groupElementId);\n\t\t}\n\t}\n\treturn membership;\n}\n\nfunction addMembership(\n\tmembership: Map<string, string[]>,\n\tchildId: string,\n\tgroupElementId: string,\n): void {\n\tconst existing = membership.get(childId) ?? [];\n\tmembership.set(childId, [...existing, groupElementId].sort());\n}\n\nfunction groupGroupIds(groupId: string): string[] {\n\treturn [groupElementIdFor(groupId)];\n}\n\nfunction groupElementIdFor(groupId: string): string {\n\treturn `group:${groupId}`;\n}\n\nfunction blockText(lines: readonly string[]): string {\n\treturn lines.filter((line) => line.length > 0).join(\"\\n\");\n}\n\nfunction panelKindFill(kind: CoordinatedEvidencePanel[\"kind\"]): string {\n\tswitch (kind) {\n\t\tcase \"legend\":\n\t\t\treturn \"#ecfdf5\";\n\t\tcase \"rule\":\n\t\t\treturn \"#eff6ff\";\n\t\tcase \"note\":\n\t\t\treturn \"#fffbeb\";\n\t\tcase \"verification\":\n\t\t\treturn \"#fef2f2\";\n\t}\n}\n\nfunction pointsBox(points: readonly Point[]): Box {\n\tconst xs = points.map((point) => point.x);\n\tconst ys = points.map((point) => point.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY,\n\t};\n}\n\nfunction finite(value: number): number {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(\n\t\t\t\"Excalidraw export requires finite coordinated numbers\",\n\t\t);\n\t}\n\treturn Number.parseFloat(value.toFixed(3));\n}\n\nfunction seedFor(id: string): number {\n\tlet hash = 2166136261;\n\tfor (let index = 0; index < id.length; index += 1) {\n\t\thash ^= id.charCodeAt(index);\n\t\thash = Math.imul(hash, 16777619);\n\t}\n\treturn Math.abs(hash);\n}\n","import type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedFrame,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedTableBlock,\n\tLabel,\n\tNodeShape,\n\tSwimlane,\n} from \"../ir/elements.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport type { SolvedTextAnnotation } from \"../ir/label-layout.js\";\nimport { computeArrowhead } from \"./arrow.js\";\nimport type { ExportOptions } from \"./types.js\";\n\nconst NODE_FILL = \"#f8fafc\";\nconst GROUP_FILL = \"#f9fafb\";\nconst STROKE = \"#374151\";\nconst EDGE_STROKE = \"#111827\";\nconst FONT_FAMILY = \"Arial, sans-serif\";\nconst EVIDENCE_FILL = \"#f8fafc\";\nconst EVIDENCE_HEADER_FILL = \"#e5e7eb\";\nconst EVIDENCE_TEXT_FONT_SIZE = 10;\nconst EVIDENCE_TEXT_LINE_HEIGHT = 12;\nconst EVIDENCE_PANEL_KIND_FILL = {\n\tlegend: \"#ecfdf5\",\n\trule: \"#eff6ff\",\n\tnote: \"#fffbeb\",\n\tverification: \"#fef2f2\",\n} as const;\n\nexport function exportSvg(\n\tdiagram: CoordinatedDiagram,\n\toptions: ExportOptions = {},\n): string {\n\tconst title = options.title ?? diagram.title;\n\tconst annotations = diagram.textAnnotations ?? [];\n\treturn `${[\n\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" viewBox=\"${formatBoxViewBox(diagram.bounds)}\">`,\n\t\t...(title === undefined ? [] : [` <title>${escapeXml(title)}</title>`]),\n\t\t...(options.viewportPadding === undefined\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t` <metadata data-dge-viewport=\"${escapeAttribute(viewportMetadata(diagram.bounds, options.viewportPadding))}\"></metadata>`,\n\t\t\t\t]),\n\t\t` <rect class=\"background\" x=\"${formatNumber(diagram.bounds.x)}\" y=\"${formatNumber(diagram.bounds.y)}\" width=\"${formatNumber(diagram.bounds.width)}\" height=\"${formatNumber(diagram.bounds.height)}\" fill=\"#ffffff\"/>`,\n\t\t...(diagram.frame === undefined\n\t\t\t? []\n\t\t\t: [indent(renderFrame(diagram.frame, annotations))]),\n\t\t...(diagram.swimlanes ?? []).flatMap((swimlane) =>\n\t\t\trenderSwimlane(swimlane, annotations),\n\t\t),\n\t\t...diagram.groups.map((group) => indent(renderGroup(group))),\n\t\t...(diagram.matrices ?? []).flatMap((matrix) =>\n\t\t\tindentLines(renderMatrixBlock(matrix as CoordinatedMatrixBlock)),\n\t\t),\n\t\t...(diagram.tables ?? []).flatMap((table) =>\n\t\t\tindentLines(renderTableBlock(table as CoordinatedTableBlock)),\n\t\t),\n\t\t...(diagram.evidencePanels ?? []).flatMap((panel) =>\n\t\t\tindentLines(renderEvidencePanel(panel as CoordinatedEvidencePanel)),\n\t\t),\n\t\t...diagram.edges.flatMap((edge) => {\n\t\t\tconst path = renderEdgePath(edge);\n\t\t\treturn path === undefined\n\t\t\t\t? []\n\t\t\t\t: [indent(path), indent(renderArrowhead(edge))];\n\t\t}),\n\t\t...diagram.nodes.map((node) => indent(renderNode(node))),\n\t\t...diagram.nodes.flatMap((node) => renderCompartments(node, annotations)),\n\t\t...diagram.nodes.flatMap((node) => renderPorts(node, annotations)),\n\t\t...diagram.groups.flatMap((group) =>\n\t\t\trenderLabel(group.label, group.box, group, annotations, \"group-label\"),\n\t\t),\n\t\t...diagram.nodes.flatMap((node) =>\n\t\t\tnode.compartments === undefined\n\t\t\t\t? renderLabel(node.label, node.box, node, annotations, \"node-label\")\n\t\t\t\t: [],\n\t\t),\n\t\t...diagram.edges.flatMap((edge) => renderEdgeLabel(edge, annotations)),\n\t\t\"</svg>\",\n\t].join(\"\\n\")}\\n`;\n}\n\nfunction viewportMetadata(bounds: Box, padding: number): string {\n\tconst safePadding = Number.isFinite(padding) ? Math.max(0, padding) : 0;\n\treturn JSON.stringify({\n\t\tx: bounds.x - safePadding,\n\t\ty: bounds.y - safePadding,\n\t\twidth: bounds.width + safePadding * 2,\n\t\theight: bounds.height + safePadding * 2,\n\t\tpadding: safePadding,\n\t});\n}\n\nfunction renderGroup(group: CoordinatedGroup): string {\n\treturn `<rect class=\"group\" data-id=\"${escapeAttribute(group.id)}\" x=\"${formatNumber(group.box.x)}\" y=\"${formatNumber(group.box.y)}\" width=\"${formatNumber(group.box.width)}\" height=\"${formatNumber(group.box.height)}\" fill=\"${GROUP_FILL}\" stroke=\"${STROKE}\" stroke-dasharray=\"6 4\"/>`;\n}\n\nfunction renderMatrixBlock(matrix: CoordinatedMatrixBlock): string[] {\n\tconst columnCount = Math.max(1, matrix.cols.length);\n\tconst rowCount = matrix.rows.length;\n\tconst rowHeaderWidth =\n\t\trowCount > 0 ? Math.min(96, matrix.box.width * 0.28) : 0;\n\tconst dataWidth = Math.max(0, matrix.box.width - rowHeaderWidth);\n\tconst cellWidth = dataWidth / columnCount;\n\tconst rowHeight = matrix.box.height / Math.max(1, rowCount + 1);\n\tconst lines = [\n\t\t`<g class=\"matrix-block\" data-id=\"${escapeAttribute(matrix.id)}\" data-row-count=\"${rowCount}\" data-column-count=\"${matrix.cols.length}\">`,\n\t\t` <rect class=\"matrix-frame\" x=\"${formatNumber(matrix.box.x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(matrix.box.width)}\" height=\"${formatNumber(matrix.box.height)}\" fill=\"${escapeAttribute(matrix.style?.fill ?? EVIDENCE_FILL)}\" stroke=\"${escapeAttribute(matrix.style?.stroke ?? STROKE)}\"/>`,\n\t];\n\n\tif (rowHeaderWidth > 0) {\n\t\tlines.push(\n\t\t\t` <rect class=\"matrix-corner-header\" x=\"${formatNumber(matrix.box.x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(rowHeaderWidth)}\" height=\"${formatNumber(rowHeight)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t);\n\t}\n\n\tfor (\n\t\tlet columnIndex = 0;\n\t\tcolumnIndex < matrix.cols.length;\n\t\tcolumnIndex += 1\n\t) {\n\t\tconst column = matrix.cols[columnIndex];\n\t\tif (column === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst x = matrix.box.x + rowHeaderWidth + columnIndex * cellWidth;\n\t\tlines.push(\n\t\t\t` <rect class=\"matrix-column-header\" data-col=\"${escapeAttribute(column)}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(cellWidth)}\" height=\"${formatNumber(rowHeight)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\trenderEvidenceText(\n\t\t\t\t\"matrix-column-label\",\n\t\t\t\tmatrix.columnLabelLayouts?.[columnIndex]?.lines ?? [column],\n\t\t\t\t{\n\t\t\t\t\tx,\n\t\t\t\t\ty: matrix.box.y,\n\t\t\t\t\twidth: cellWidth,\n\t\t\t\t\theight: rowHeight,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\tfor (let rowIndex = 0; rowIndex < matrix.rows.length; rowIndex += 1) {\n\t\tconst row = matrix.rows[rowIndex];\n\t\tconst cells = matrix.cells[rowIndex] ?? [];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (rowHeaderWidth > 0) {\n\t\t\tconst rowHeaderBox = {\n\t\t\t\tx: matrix.box.x,\n\t\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\t\twidth: rowHeaderWidth,\n\t\t\t\theight: rowHeight,\n\t\t\t};\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"matrix-row-header\" data-row=\"${escapeAttribute(row)}\" x=\"${formatNumber(rowHeaderBox.x)}\" y=\"${formatNumber(rowHeaderBox.y)}\" width=\"${formatNumber(rowHeaderBox.width)}\" height=\"${formatNumber(rowHeaderBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\t\trenderEvidenceText(\n\t\t\t\t\t\"matrix-row-label\",\n\t\t\t\t\tmatrix.rowLabelLayouts?.[rowIndex]?.lines ?? [row],\n\t\t\t\t\trowHeaderBox,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tfor (\n\t\t\tlet columnIndex = 0;\n\t\t\tcolumnIndex < matrix.cols.length;\n\t\t\tcolumnIndex += 1\n\t\t) {\n\t\t\tconst column = matrix.cols[columnIndex];\n\t\t\tif (column === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cell = cells[columnIndex] ?? { text: \"\" };\n\t\t\tconst box = {\n\t\t\t\tx: matrix.box.x + rowHeaderWidth + columnIndex * cellWidth,\n\t\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\t\twidth: cellWidth,\n\t\t\t\theight: rowHeight,\n\t\t\t};\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"matrix-cell\" data-row=\"${escapeAttribute(row)}\" data-col=\"${escapeAttribute(column)}\" x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\" fill=\"${escapeAttribute(cell.style?.fill ?? \"#ffffff\")}\" stroke=\"${escapeAttribute(cell.style?.stroke ?? STROKE)}\"/>`,\n\t\t\t\trenderEvidenceText(\n\t\t\t\t\t\"matrix-cell-label\",\n\t\t\t\t\tmatrix.cellLabelLayouts?.[rowIndex]?.[columnIndex]?.lines ?? [\n\t\t\t\t\t\tcell.text,\n\t\t\t\t\t],\n\t\t\t\t\tbox,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tlines.push(\"</g>\");\n\treturn lines;\n}\n\nfunction renderTableBlock(table: CoordinatedTableBlock): string[] {\n\tconst columnCount = Math.max(1, table.columns.length);\n\tconst rowHeight = table.box.height / Math.max(1, table.rows.length + 1);\n\tconst lines = [\n\t\t`<g class=\"table-block\" data-id=\"${escapeAttribute(table.id)}\" data-row-count=\"${table.rows.length}\" data-column-count=\"${table.columns.length}\">`,\n\t\t` <rect class=\"table-frame\" x=\"${formatNumber(table.box.x)}\" y=\"${formatNumber(table.box.y)}\" width=\"${formatNumber(table.box.width)}\" height=\"${formatNumber(table.box.height)}\" fill=\"${escapeAttribute(table.style?.fill ?? EVIDENCE_FILL)}\" stroke=\"${escapeAttribute(table.style?.stroke ?? STROKE)}\"/>`,\n\t\t` <g class=\"table-header\" data-column-count=\"${table.columns.length}\">`,\n\t];\n\n\tfor (\n\t\tlet columnIndex = 0;\n\t\tcolumnIndex < table.columns.length;\n\t\tcolumnIndex += 1\n\t) {\n\t\tconst column = table.columns[columnIndex];\n\t\tif (column === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst columnBox = tableCellBox(\n\t\t\ttable,\n\t\t\tcolumnIndex,\n\t\t\t0,\n\t\t\trowHeight,\n\t\t\tcolumnCount,\n\t\t);\n\t\tlines.push(\n\t\t\t` <rect class=\"table-header-cell\" data-col=\"${escapeAttribute(column.id)}\" x=\"${formatNumber(columnBox.x)}\" y=\"${formatNumber(columnBox.y)}\" width=\"${formatNumber(columnBox.width)}\" height=\"${formatNumber(columnBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\t` ${renderEvidenceText(\"table-header-label\", table.columnLabelLayouts?.[columnIndex]?.lines ?? [column.label.text], columnBox)}`,\n\t\t);\n\t}\n\tlines.push(\" </g>\");\n\n\tfor (let rowIndex = 0; rowIndex < table.rows.length; rowIndex += 1) {\n\t\tconst row = table.rows[rowIndex];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rowBox = {\n\t\t\tx: table.box.x,\n\t\t\ty: table.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: table.box.width,\n\t\t\theight: rowHeight,\n\t\t};\n\t\tconst rowClass = rowIndex % 2 === 0 ? \"table-row-even\" : \"table-row-odd\";\n\t\tlines.push(\n\t\t\t` <g class=\"table-row ${rowClass}\" data-row=\"${escapeAttribute(row.id)}\">`,\n\t\t\t` <rect class=\"${rowClass}\" data-row=\"${escapeAttribute(row.id)}\" x=\"${formatNumber(rowBox.x)}\" y=\"${formatNumber(rowBox.y)}\" width=\"${formatNumber(rowBox.width)}\" height=\"${formatNumber(rowBox.height)}\" fill=\"${rowIndex % 2 === 0 ? \"#ffffff\" : \"#f3f4f6\"}\" stroke=\"none\"/>`,\n\t\t);\n\t\tfor (\n\t\t\tlet columnIndex = 0;\n\t\t\tcolumnIndex < table.columns.length;\n\t\t\tcolumnIndex += 1\n\t\t) {\n\t\t\tconst column = table.columns[columnIndex];\n\t\t\tif (column === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cell = row.cells[column.id] ?? { text: \"\" };\n\t\t\tconst cellBox = tableCellBox(\n\t\t\t\ttable,\n\t\t\t\tcolumnIndex,\n\t\t\t\trowIndex + 1,\n\t\t\t\trowHeight,\n\t\t\t\tcolumnCount,\n\t\t\t);\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"table-cell\" data-col=\"${escapeAttribute(column.id)}\" x=\"${formatNumber(cellBox.x)}\" y=\"${formatNumber(cellBox.y)}\" width=\"${formatNumber(cellBox.width)}\" height=\"${formatNumber(cellBox.height)}\" fill=\"${escapeAttribute(cell.style?.fill ?? \"transparent\")}\" stroke=\"${escapeAttribute(cell.style?.stroke ?? STROKE)}\"/>`,\n\t\t\t\t` ${renderEvidenceText(\"table-cell-label\", table.cellLabelLayouts?.[rowIndex]?.[columnIndex]?.lines ?? [cell.text], cellBox)}`,\n\t\t\t);\n\t\t}\n\t\tlines.push(\" </g>\");\n\t}\n\n\tlines.push(\"</g>\");\n\treturn lines;\n}\n\nfunction renderEvidencePanel(panel: CoordinatedEvidencePanel): string[] {\n\tconst titleWidth = Math.min(panel.box.width * 0.36, 140);\n\tconst itemBox = {\n\t\tx: panel.box.x + titleWidth,\n\t\ty: panel.box.y,\n\t\twidth: panel.box.width - titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst titleBox = {\n\t\tx: panel.box.x,\n\t\ty: panel.box.y,\n\t\twidth: titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst itemHeight = panel.box.height / Math.max(1, panel.items.length);\n\tconst lines = [\n\t\t`<g class=\"evidence-panel evidence-panel--${panel.kind}\" data-id=\"${escapeAttribute(panel.id)}\" data-kind=\"${escapeAttribute(panel.kind)}\" data-item-count=\"${panel.items.length}\">`,\n\t\t` <rect class=\"evidence-panel-frame\" x=\"${formatNumber(panel.box.x)}\" y=\"${formatNumber(panel.box.y)}\" width=\"${formatNumber(panel.box.width)}\" height=\"${formatNumber(panel.box.height)}\" fill=\"${escapeAttribute(panel.style?.fill ?? EVIDENCE_PANEL_KIND_FILL[panel.kind])}\" stroke=\"${escapeAttribute(panel.style?.stroke ?? STROKE)}\"/>`,\n\t\t` <g class=\"evidence-panel-title-cell\">`,\n\t\t` <rect class=\"evidence-panel-title-bg\" x=\"${formatNumber(titleBox.x)}\" y=\"${formatNumber(titleBox.y)}\" width=\"${formatNumber(titleBox.width)}\" height=\"${formatNumber(titleBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t` ${renderEvidenceText(\"evidence-panel-title\", panel.titleLayout?.lines ?? [`${panel.kind}: ${panel.id}`], titleBox)}`,\n\t\t\" </g>\",\n\t\t` <g class=\"evidence-panel-items-cell\">`,\n\t\t` <rect class=\"evidence-panel-items-bg\" x=\"${formatNumber(itemBox.x)}\" y=\"${formatNumber(itemBox.y)}\" width=\"${formatNumber(itemBox.width)}\" height=\"${formatNumber(itemBox.height)}\" fill=\"transparent\" stroke=\"${STROKE}\"/>`,\n\t];\n\n\tfor (let index = 0; index < panel.items.length; index += 1) {\n\t\tconst item = panel.items[index];\n\t\tif (item === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst text = panelItemText(item.label.text, item.detail?.text);\n\t\tconst box = {\n\t\t\tx: itemBox.x,\n\t\t\ty: itemBox.y + index * itemHeight,\n\t\t\twidth: itemBox.width,\n\t\t\theight: itemHeight,\n\t\t};\n\t\tlines.push(\n\t\t\t` <rect class=\"evidence-panel-item\" data-item=\"${escapeAttribute(item.id ?? String(index))}\" x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\" fill=\"${escapeAttribute(item.style?.fill ?? \"transparent\")}\" stroke=\"${escapeAttribute(item.style?.stroke ?? \"none\")}\"/>`,\n\t\t\t` ${renderEvidenceText(\"evidence-panel-item-label\", panel.itemLayouts?.[index]?.lines ?? [text], box)}`,\n\t\t);\n\t}\n\n\tlines.push(\" </g>\", \"</g>\");\n\treturn lines;\n}\n\nfunction renderNode(node: CoordinatedNode): string {\n\tconst fill = node.style?.fill ?? NODE_FILL;\n\tconst stroke = node.style?.stroke ?? STROKE;\n\tconst common = `class=\"node node-${node.shape}\" data-id=\"${escapeAttribute(node.id)}\" fill=\"${escapeAttribute(fill)}\" stroke=\"${escapeAttribute(stroke)}\"`;\n\tswitch (node.shape) {\n\t\tcase \"rectangle\":\n\t\t\treturn renderRect(node.box, common);\n\t\tcase \"rounded-rectangle\":\n\t\t\treturn renderRect(node.box, `${common} rx=\"8\" ry=\"8\"`);\n\t\tcase \"ellipse\":\n\t\t\treturn `<ellipse ${common} cx=\"${formatNumber(node.box.x + node.box.width / 2)}\" cy=\"${formatNumber(node.box.y + node.box.height / 2)}\" rx=\"${formatNumber(node.box.width / 2)}\" ry=\"${formatNumber(node.box.height / 2)}\"/>`;\n\t\tcase \"diamond\":\n\t\tcase \"parallelogram\":\n\t\tcase \"hexagon\":\n\t\t\treturn `<polygon ${common} points=\"${formatPoints(shapePoints(node.shape, node.box))}\"/>`;\n\t\tcase \"cylinder\":\n\t\t\treturn `<path ${common} d=\"${formatCylinderPath(node.box)}\"/>`;\n\t}\n}\n\nfunction renderFrame(\n\tframe: CoordinatedFrame,\n\tannotations: readonly SolvedTextAnnotation[],\n): string {\n\tconst stroke = frame.style?.stroke ?? \"#6b7280\";\n\tconst fill = frame.style?.fill ?? \"transparent\";\n\treturn [\n\t\t`<g class=\"sysml-frame\" data-kind=\"${escapeAttribute(frame.kind)}\">`,\n\t\t` <rect class=\"sysml-frame-border\" x=\"${formatNumber(frame.box.x)}\" y=\"${formatNumber(frame.box.y)}\" width=\"${formatNumber(frame.box.width)}\" height=\"${formatNumber(frame.box.height)}\" fill=\"${escapeAttribute(fill)}\" stroke=\"${escapeAttribute(stroke)}\"/>`,\n\t\t` <path class=\"sysml-title-tab\" d=\"M ${formatNumber(frame.titleBox.x)} ${formatNumber(frame.titleBox.y + frame.titleBox.height)} L ${formatNumber(frame.titleBox.x)} ${formatNumber(frame.titleBox.y)} L ${formatNumber(frame.titleBox.x + frame.titleBox.width - 16)} ${formatNumber(frame.titleBox.y)} L ${formatNumber(frame.titleBox.x + frame.titleBox.width)} ${formatNumber(frame.titleBox.y + frame.titleBox.height)} Z\" fill=\"#f3f4f6\" stroke=\"${escapeAttribute(stroke)}\"/>`,\n\t\t...(renderSolvedTextAnnotation(\n\t\t\tfindAnnotation(annotations, \"frame-title\", frame.kind),\n\t\t\t`sysml-title-tab-label`,\n\t\t\t{\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t\tfallbackText: frame.titleTab,\n\t\t\t\tfallbackFontSize: 12,\n\t\t\t},\n\t\t) ?? [\n\t\t\t` <text class=\"sysml-title-tab-label\" x=\"${formatNumber(frame.titleBox.x + 8)}\" y=\"${formatNumber(frame.titleBox.y + frame.titleBox.height / 2)}\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(frame.titleTab)}</text>`,\n\t\t]),\n\t\t\"</g>\",\n\t].join(\"\\n\");\n}\n\nfunction renderSwimlane(\n\tswimlane: Swimlane,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tif (swimlane.box === undefined) {\n\t\treturn [];\n\t}\n\tconst lines = [\n\t\t` <g class=\"swimlane\" data-id=\"${escapeAttribute(swimlane.id)}\">`,\n\t\t` <rect class=\"swimlane-frame\" x=\"${formatNumber(swimlane.box.x)}\" y=\"${formatNumber(swimlane.box.y)}\" width=\"${formatNumber(swimlane.box.width)}\" height=\"${formatNumber(swimlane.box.height)}\" fill=\"#ffffff\" stroke=\"${STROKE}\"/>`,\n\t];\n\tfor (const lane of swimlane.lanes) {\n\t\tif (lane.box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(\n\t\t\t` <rect class=\"swimlane-lane\" data-lane=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.box.x)}\" y=\"${formatNumber(lane.box.y)}\" width=\"${formatNumber(lane.box.width)}\" height=\"${formatNumber(lane.box.height)}\" fill=\"none\" stroke=\"${STROKE}\"/>`,\n\t\t);\n\t\tif (lane.headerBox !== undefined) {\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"swimlane-header\" data-lane-header=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.headerBox.x)}\" y=\"${formatNumber(lane.headerBox.y)}\" width=\"${formatNumber(lane.headerBox.width)}\" height=\"${formatNumber(lane.headerBox.height)}\" fill=\"#f3f4f6\" stroke=\"${STROKE}\"/>`,\n\t\t\t);\n\t\t}\n\t\tif (lane.contentBox !== undefined) {\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"swimlane-content\" data-lane-content=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.contentBox.x)}\" y=\"${formatNumber(lane.contentBox.y)}\" width=\"${formatNumber(lane.contentBox.width)}\" height=\"${formatNumber(lane.contentBox.height)}\" fill=\"none\" stroke=\"none\"/>`,\n\t\t\t);\n\t\t}\n\t\tif (lane.label?.text !== undefined) {\n\t\t\tconst annotation = findAnnotation(\n\t\t\t\tannotations,\n\t\t\t\t\"swimlane-label\",\n\t\t\t\t`${swimlane.id}.${lane.id}`,\n\t\t\t);\n\t\t\tlines.push(\n\t\t\t\t...(annotation === undefined\n\t\t\t\t\t? [\n\t\t\t\t\t\t\trenderSwimlaneLabel(\n\t\t\t\t\t\t\t\tswimlane,\n\t\t\t\t\t\t\t\tlane.label.text,\n\t\t\t\t\t\t\t\tlane.headerBox ?? lane.box,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: (renderSolvedTextAnnotation(annotation, \"swimlane-label\", {\n\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t\trotate: swimlane.orientation === \"horizontal\",\n\t\t\t\t\t\t}) ?? [])),\n\t\t\t);\n\t\t}\n\t}\n\tlines.push(\" </g>\");\n\treturn lines;\n}\n\nfunction renderPorts(\n\tnode: CoordinatedNode,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\treturn (node.ports ?? []).flatMap((port) => [\n\t\t` <rect class=\"port\" data-kind=\"${escapeAttribute(port.kind)}\" data-port=\"${escapeAttribute(`${node.id}.${port.id}`)}\" x=\"${formatNumber(port.box.x)}\" y=\"${formatNumber(port.box.y)}\" width=\"${formatNumber(port.box.width)}\" height=\"${formatNumber(port.box.height)}\" fill=\"${escapeAttribute(port.style?.fill ?? \"#d9ead3\")}\" stroke=\"${escapeAttribute(port.style?.stroke ?? STROKE)}\"/>`,\n\t\t...(port.label?.text === undefined\n\t\t\t? []\n\t\t\t: (() => {\n\t\t\t\t\tconst annotation = findAnnotation(\n\t\t\t\t\t\tannotations,\n\t\t\t\t\t\t\"port-label\",\n\t\t\t\t\t\t`${node.id}.${port.id}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn annotation === undefined\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t` <text class=\"port-label\" data-for=\"${escapeAttribute(`${node.id}.${port.id}`)}\" x=\"${formatNumber(portLabelX(port.anchor.x, port.side))}\" y=\"${formatNumber(port.anchor.y - 8)}\" text-anchor=\"${port.side === \"left\" ? \"end\" : \"start\"}\" font-family=\"${FONT_FAMILY}\" font-size=\"10\" fill=\"#111827\">${escapeXml(port.label.text)}</text>`,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: (renderSolvedTextAnnotation(annotation, \"port-label\", {\n\t\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t\t\ttextAnchor: port.side === \"left\" ? \"end\" : \"start\",\n\t\t\t\t\t\t\t}) ?? []);\n\t\t\t\t})()),\n\t]);\n}\n\nfunction renderCompartments(\n\tnode: CoordinatedNode,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tconst compartments = node.compartments;\n\tif (compartments === undefined) {\n\t\treturn [];\n\t}\n\tconst rows = [\n\t\t...(compartments.stereotype === undefined\n\t\t\t? []\n\t\t\t: [{ className: \"stereotype\", text: compartments.stereotype }]),\n\t\t{\n\t\t\tclassName: \"name\",\n\t\t\ttext: compartments.name ?? node.label?.text ?? node.id,\n\t\t},\n\t\t...(compartments.properties ?? []).map((text) => ({\n\t\t\tclassName: \"properties\",\n\t\t\ttext,\n\t\t})),\n\t\t...(compartments.constraints ?? []).map((text) => ({\n\t\t\tclassName: \"constraints\",\n\t\t\ttext,\n\t\t})),\n\t];\n\tconst lines = [\n\t\t` <g class=\"compartment\" data-for=\"${escapeAttribute(node.id)}\">`,\n\t];\n\tfor (let index = 0; index < rows.length; index += 1) {\n\t\tconst row = rows[index];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst y = node.box.y + 18 + index * 16;\n\t\tif (index > 1) {\n\t\t\tlines.push(\n\t\t\t\t` <line class=\"compartment-separator\" x1=\"${formatNumber(node.box.x)}\" y1=\"${formatNumber(y - 12)}\" x2=\"${formatNumber(node.box.x + node.box.width)}\" y2=\"${formatNumber(y - 12)}\" stroke=\"${STROKE}\"/>`,\n\t\t\t);\n\t\t}\n\t\tconst annotation = findAnnotation(\n\t\t\tannotations,\n\t\t\t\"compartment-row\",\n\t\t\tnode.id,\n\t\t\tindex,\n\t\t);\n\t\tlines.push(\n\t\t\t...(annotation === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t` <text class=\"compartment-${row.className}\" x=\"${formatNumber(node.box.x + node.box.width / 2)}\" y=\"${formatNumber(y)}\" text-anchor=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"11\" fill=\"#111827\">${escapeXml(row.text)}</text>`,\n\t\t\t\t\t]\n\t\t\t\t: (renderSolvedTextAnnotation(\n\t\t\t\t\t\tannotation,\n\t\t\t\t\t\t`compartment-${row.className}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t},\n\t\t\t\t\t) ?? [])),\n\t\t);\n\t}\n\tlines.push(\" </g>\");\n\treturn lines;\n}\n\nfunction tableCellBox(\n\ttable: CoordinatedTableBlock,\n\tcolumnIndex: number,\n\trowIndex: number,\n\trowHeight: number,\n\tcolumnCount: number,\n): Box {\n\tconst x =\n\t\ttable.columnXOffsets[columnIndex] ??\n\t\ttable.box.x + (table.box.width / columnCount) * columnIndex;\n\tconst nextX =\n\t\ttable.columnXOffsets[columnIndex + 1] ?? table.box.x + table.box.width;\n\treturn {\n\t\tx,\n\t\ty: table.box.y + rowIndex * rowHeight,\n\t\twidth: nextX - x,\n\t\theight: rowHeight,\n\t};\n}\n\nfunction renderEvidenceText(\n\tclassName: string,\n\tlines: readonly string[],\n\tbox: Box,\n): string {\n\tconst fontSize = EVIDENCE_TEXT_FONT_SIZE;\n\tconst lineHeight = EVIDENCE_TEXT_LINE_HEIGHT;\n\tconst x = box.x + box.width / 2;\n\n\tif (lines.length <= 1) {\n\t\treturn `<text class=\"${className}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(box.y + box.height / 2)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(fontSize)}\" fill=\"#111827\">${escapeXml(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst totalHeight = (lines.length - 1) * lineHeight;\n\tconst firstBaselineY = box.y + box.height / 2 - totalHeight / 2;\n\treturn [\n\t\t`<text class=\"${className}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(firstBaselineY)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(fontSize)}\" fill=\"#111827\">`,\n\t\t...lines.map(\n\t\t\t(line, index) =>\n\t\t\t\t` <tspan x=\"${formatNumber(x)}\" y=\"${formatNumber(firstBaselineY + index * lineHeight)}\">${escapeXml(line)}</tspan>`,\n\t\t),\n\t\t\"</text>\",\n\t].join(\"\\n\");\n}\n\nfunction panelItemText(label: string, detail: string | undefined): string {\n\treturn detail === undefined ? label : `${label}: ${detail}`;\n}\nfunction renderLabel(\n\tlabel: Label | undefined,\n\tbox: Box,\n\titem: CoordinatedNode | CoordinatedGroup,\n\tannotations: readonly SolvedTextAnnotation[],\n\tsurfaceKind: SolvedTextAnnotation[\"surfaceKind\"],\n): string[] {\n\tconst annotation = findAnnotation(annotations, surfaceKind, item.id);\n\tif (annotation !== undefined) {\n\t\treturn (\n\t\t\trenderSolvedTextAnnotation(annotation, \"label\", {\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t}) ?? []\n\t\t);\n\t}\n\tconst labelLayout = item.labelLayout;\n\tif (labelLayout?.lines !== undefined && labelLayout.lines.length > 0) {\n\t\tconst offset = { x: box.x, y: box.y };\n\t\treturn [\n\t\t\t` <text class=\"label\" data-for=\"${escapeAttribute(item.id)}\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(labelLayout.font.fontSize)}\" fill=\"#111827\">`,\n\t\t\t...labelLayout.lines.map(\n\t\t\t\t(line) =>\n\t\t\t\t\t` <tspan x=\"${formatNumber(offset.x + line.box.x)}\" y=\"${formatNumber(offset.y + line.baselineY)}\">${escapeXml(line.text)}</tspan>`,\n\t\t\t),\n\t\t\t\" </text>\",\n\t\t];\n\t}\n\tif (label?.text === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t` <text class=\"label\" data-for=\"${escapeAttribute(item.id)}\" x=\"${formatNumber(box.x + box.width / 2)}\" y=\"${formatNumber(box.y + box.height / 2)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"14\" fill=\"#111827\">${escapeXml(label.text)}</text>`,\n\t];\n}\n\nfunction renderEdgePath(edge: CoordinatedEdge): string | undefined {\n\tif (edge.points.length < 2) {\n\t\treturn undefined;\n\t}\n\tconst dash = edge.style === \"dashed\" ? ' stroke-dasharray=\"6 4\"' : \"\";\n\treturn `<path class=\"edge\" data-id=\"${escapeAttribute(edge.id)}\" d=\"${formatPath(pathPointsBeforeArrowhead(edge.points))}\" fill=\"none\" stroke=\"${EDGE_STROKE}\" stroke-width=\"1.5\"${dash}/>`;\n}\n\nfunction renderEdgeLabel(\n\tedge: CoordinatedEdge,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tif (edge.label?.text === undefined || edge.points.length < 2) {\n\t\treturn [];\n\t}\n\tconst annotation = findAnnotation(annotations, \"edge-label\", edge.id);\n\tif (annotation !== undefined) {\n\t\treturn (\n\t\t\trenderSolvedTextAnnotation(annotation, \"edge-label\", {\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t}) ?? []\n\t\t);\n\t}\n\tconst placement = labelPlacementOnPolyline(edge.points);\n\tif (placement === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t` <text class=\"edge-label\" data-for=\"${escapeAttribute(edge.id)}\" x=\"${formatNumber(placement.x)}\" y=\"${formatNumber(placement.y)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(edge.label.text)}</text>`,\n\t];\n}\n\nfunction renderArrowhead(edge: CoordinatedEdge): string {\n\tconst arrowhead = computeArrowhead(edge.points);\n\tconst fill = edge.arrowhead === \"hollowTriangle\" ? \"none\" : EDGE_STROKE;\n\treturn `<polygon class=\"edge-arrowhead\" data-edge=\"${escapeAttribute(edge.id)}\" points=\"${formatPoints([arrowhead.tip, arrowhead.left, arrowhead.right])}\" fill=\"${fill}\" stroke=\"${EDGE_STROKE}\"/>`;\n}\n\nfunction renderSolvedTextAnnotation(\n\tannotation: SolvedTextAnnotation | undefined,\n\tclassName: string,\n\toptions: {\n\t\tindent: string;\n\t\tmode: \"center\" | \"start\";\n\t\ttextAnchor?: string;\n\t\trotate?: boolean;\n\t\tfallbackText?: string;\n\t\tfallbackFontSize?: number;\n\t},\n): string[] | undefined {\n\tif (annotation === undefined) {\n\t\treturn undefined;\n\t}\n\tconst x =\n\t\toptions.mode === \"center\"\n\t\t\t? annotation.box.x + annotation.box.width / 2\n\t\t\t: annotation.box.x;\n\tconst y =\n\t\toptions.mode === \"center\"\n\t\t\t? annotation.box.y + annotation.box.height / 2\n\t\t\t: annotation.box.y + annotation.box.height;\n\tconst rotate = options.rotate\n\t\t? ` transform=\"rotate(-90 ${formatNumber(x)} ${formatNumber(y)})\"`\n\t\t: \"\";\n\tconst attrs = [\n\t\t`class=\"${className}\"`,\n\t\t`data-for=\"${escapeAttribute(annotation.ownerId)}\"`,\n\t\t`data-text-surface=\"${escapeAttribute(annotation.surfaceKind)}\"`,\n\t\t`data-owner-id=\"${escapeAttribute(annotation.ownerId)}\"`,\n\t\t`data-text-backend=\"${escapeAttribute(annotation.textBackend ?? \"deterministic\")}\"`,\n\t\t`font-family=\"${escapeAttribute(annotation.fontFamily)}\"`,\n\t\t`font-size=\"${formatNumber(annotation.fontSize)}\"`,\n\t\t`fill=\"#111827\"`,\n\t];\n\tif (options.mode === \"center\") {\n\t\tattrs.push('text-anchor=\"middle\"');\n\t} else {\n\t\tattrs.push(`text-anchor=\"${options.textAnchor ?? \"start\"}\"`);\n\t}\n\tif (annotation.lines.length > 1) {\n\t\treturn [\n\t\t\t`${options.indent}<text ${attrs.join(\" \")}${rotate}>`,\n\t\t\t...annotation.lines.map(\n\t\t\t\t(line) =>\n\t\t\t\t\t`${options.indent} <tspan x=\"${formatNumber(textLineX(annotation, line, options))}\" y=\"${formatNumber(annotation.box.y + line.baselineY)}\">${escapeXml(line.text)}</tspan>`,\n\t\t\t),\n\t\t\t`${options.indent}</text>`,\n\t\t];\n\t}\n\tconst line = annotation.lines[0];\n\tconst text = line?.text ?? options.fallbackText ?? annotation.text;\n\tconst singleLineAttrs =\n\t\toptions.mode === \"center\"\n\t\t\t? [...attrs, 'dominant-baseline=\"middle\"']\n\t\t\t: attrs;\n\treturn [\n\t\t`${options.indent}<text ${singleLineAttrs.join(\" \")} x=\"${formatNumber(x)}\" y=\"${formatNumber(y)}\"${rotate}>${escapeXml(text)}</text>`,\n\t];\n}\n\nfunction textLineX(\n\tannotation: SolvedTextAnnotation,\n\tline: SolvedTextAnnotation[\"lines\"][number],\n\toptions: {\n\t\tmode: \"center\" | \"start\";\n\t\ttextAnchor?: string;\n\t},\n): number {\n\tif (options.mode === \"center\") {\n\t\treturn annotation.box.x + line.box.x + line.box.width / 2;\n\t}\n\tif ((options.textAnchor ?? \"start\") === \"end\") {\n\t\treturn annotation.box.x + line.box.x + line.box.width;\n\t}\n\treturn annotation.box.x + line.box.x;\n}\n\nfunction findAnnotation(\n\tannotations: readonly SolvedTextAnnotation[],\n\tsurfaceKind: SolvedTextAnnotation[\"surfaceKind\"],\n\townerId: string,\n\tindex?: number,\n): SolvedTextAnnotation | undefined {\n\treturn annotations.find((annotation) => {\n\t\tif (annotation.surfaceKind !== surfaceKind) {\n\t\t\treturn false;\n\t\t}\n\t\tif (annotation.ownerId !== ownerId) {\n\t\t\treturn false;\n\t\t}\n\t\tif (index === undefined) {\n\t\t\treturn annotation.surfaceIndex === undefined;\n\t\t}\n\t\treturn annotation.surfaceIndex === index;\n\t});\n}\n\nfunction renderSwimlaneLabel(\n\tswimlane: Swimlane,\n\ttext: string,\n\tlabelBox: Box,\n): string {\n\tconst x = labelBox.x + labelBox.width / 2;\n\tconst y = labelBox.y + labelBox.height / 2;\n\tconst transform =\n\t\tswimlane.orientation === \"horizontal\"\n\t\t\t? ` transform=\"rotate(-90 ${formatNumber(x)} ${formatNumber(y)})\"`\n\t\t\t: \"\";\n\treturn ` <text class=\"swimlane-label\" x=\"${formatNumber(x)}\" y=\"${formatNumber(y)}\" text-anchor=\"middle\" dominant-baseline=\"middle\"${transform} font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(text)}</text>`;\n}\n\nfunction renderRect(box: Box, attributes: string): string {\n\treturn `<rect ${attributes} x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\"/>`;\n}\n\nfunction portLabelX(x: number, side: string): number {\n\tif (side === \"left\") {\n\t\treturn x - 8;\n\t}\n\tif (side === \"right\") {\n\t\treturn x + 8;\n\t}\n\treturn x + 8;\n}\n\nfunction labelPlacementOnPolyline(points: readonly Point[]): Point | undefined {\n\tconst segments = nonZeroSegments(points);\n\tconst totalLength = segments.reduce(\n\t\t(sum, segment) => sum + segment.length,\n\t\t0,\n\t);\n\tif (totalLength <= 0) {\n\t\treturn undefined;\n\t}\n\tlet remaining = totalLength / 2;\n\tfor (const segment of segments) {\n\t\tif (remaining <= segment.length) {\n\t\t\tconst ratio = remaining / segment.length;\n\t\t\tconst x = segment.start.x + (segment.end.x - segment.start.x) * ratio;\n\t\t\tconst y = segment.start.y + (segment.end.y - segment.start.y) * ratio;\n\t\t\tconst offset = labelOffset(segment);\n\t\t\treturn { x: x + offset.x, y: y + offset.y };\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\tconst last = segments.at(-1);\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst offset = labelOffset(last);\n\treturn { x: last.end.x + offset.x, y: last.end.y + offset.y };\n}\n\nfunction nonZeroSegments(points: readonly Point[]): Array<{\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}> {\n\tconst segments: Array<{ start: Point; end: Point; length: number }> = [];\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst length = Math.hypot(end.x - start.x, end.y - start.y);\n\t\tif (length > 0) {\n\t\t\tsegments.push({ start, end, length });\n\t\t}\n\t}\n\treturn segments;\n}\n\nfunction labelOffset(segment: {\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}): Point {\n\tconst offset = 10;\n\tconst dx = segment.end.x - segment.start.x;\n\tconst dy = segment.end.y - segment.start.y;\n\treturn {\n\t\tx: (-dy / segment.length) * offset,\n\t\ty: (dx / segment.length) * offset,\n\t};\n}\n\nfunction pathPointsBeforeArrowhead(points: readonly Point[]): Point[] {\n\tconst arrowhead = computeArrowhead(points);\n\tconst base = {\n\t\tx: (arrowhead.left.x + arrowhead.right.x) / 2,\n\t\ty: (arrowhead.left.y + arrowhead.right.y) / 2,\n\t};\n\treturn [...points.slice(0, -1), base];\n}\n\nfunction shapePoints(\n\tshape: Exclude<\n\t\tNodeShape,\n\t\t\"rectangle\" | \"rounded-rectangle\" | \"ellipse\" | \"cylinder\"\n\t>,\n\tbox: Box,\n): Point[] {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst midX = box.x + box.width / 2;\n\tconst midY = box.y + box.height / 2;\n\tconst skew = Math.min(box.width * 0.2, 24);\n\tswitch (shape) {\n\t\tcase \"diamond\":\n\t\t\treturn [\n\t\t\t\t{ x: midX, y: top },\n\t\t\t\t{ x: right, y: midY },\n\t\t\t\t{ x: midX, y: bottom },\n\t\t\t\t{ x: left, y: midY },\n\t\t\t];\n\t\tcase \"parallelogram\":\n\t\t\treturn [\n\t\t\t\t{ x: left + skew, y: top },\n\t\t\t\t{ x: right, y: top },\n\t\t\t\t{ x: right - skew, y: bottom },\n\t\t\t\t{ x: left, y: bottom },\n\t\t\t];\n\t\tcase \"hexagon\":\n\t\t\treturn [\n\t\t\t\t{ x: left + skew, y: top },\n\t\t\t\t{ x: right - skew, y: top },\n\t\t\t\t{ x: right, y: midY },\n\t\t\t\t{ x: right - skew, y: bottom },\n\t\t\t\t{ x: left + skew, y: bottom },\n\t\t\t\t{ x: left, y: midY },\n\t\t\t];\n\t}\n}\n\nfunction formatCylinderPath(box: Box): string {\n\tconst rx = box.width / 2;\n\tconst ry = Math.min(12, box.height / 4);\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst midX = box.x + rx;\n\treturn [\n\t\t`M ${formatNumber(left)} ${formatNumber(top + ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 1 ${formatNumber(right)} ${formatNumber(top + ry)}`,\n\t\t`L ${formatNumber(right)} ${formatNumber(bottom - ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 1 ${formatNumber(left)} ${formatNumber(bottom - ry)}`,\n\t\t\"Z\",\n\t\t`M ${formatNumber(left)} ${formatNumber(top + ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 0 ${formatNumber(right)} ${formatNumber(top + ry)}`,\n\t\t`M ${formatNumber(left)} ${formatNumber(bottom - ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 0 ${formatNumber(right)} ${formatNumber(bottom - ry)}`,\n\t\t`M ${formatNumber(midX)} ${formatNumber(top)}`,\n\t].join(\" \");\n}\n\nfunction formatPath(points: readonly Point[]): string {\n\treturn points\n\t\t.map(\n\t\t\t(point, index) =>\n\t\t\t\t`${index === 0 ? \"M\" : \"L\"} ${formatNumber(point.x)} ${formatNumber(point.y)}`,\n\t\t)\n\t\t.join(\" \");\n}\n\nfunction formatPoints(points: readonly Point[]): string {\n\treturn points\n\t\t.map((point) => `${formatNumber(point.x)},${formatNumber(point.y)}`)\n\t\t.join(\" \");\n}\n\nfunction formatBoxViewBox(box: Box): string {\n\treturn `${formatNumber(box.x)} ${formatNumber(box.y)} ${formatNumber(box.width)} ${formatNumber(box.height)}`;\n}\n\nfunction formatNumber(value: number): string {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(\"SVG export requires finite coordinated numbers\");\n\t}\n\treturn Number.isInteger(value)\n\t\t? String(value)\n\t\t: value.toFixed(3).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\nfunction escapeXml(value: string): string {\n\treturn value\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n\treturn escapeXml(value).replaceAll('\"', \""\");\n}\n\nfunction indent(value: string): string {\n\treturn ` ${value}`;\n}\n\nfunction indentLines(values: readonly string[]): string[] {\n\treturn values.map(indent);\n}\n","import type { Box, Insets, Point } from \"../ir/geometry.js\";\n\nexport function normalizeInsets(input: Insets | number = 0): Insets {\n\tif (typeof input === \"number\") {\n\t\tvalidateMargin(input, \"margin\");\n\t\treturn {\n\t\t\ttop: input,\n\t\t\tright: input,\n\t\t\tbottom: input,\n\t\t\tleft: input,\n\t\t};\n\t}\n\n\tvalidateMargin(input.top, \"insets.top\");\n\tvalidateMargin(input.right, \"insets.right\");\n\tvalidateMargin(input.bottom, \"insets.bottom\");\n\tvalidateMargin(input.left, \"insets.left\");\n\n\treturn {\n\t\ttop: input.top,\n\t\tright: input.right,\n\t\tbottom: input.bottom,\n\t\tleft: input.left,\n\t};\n}\n\nexport function validateBox(box: Box, label = \"box\"): void {\n\tvalidateFinite(box.x, `${label}.x`);\n\tvalidateFinite(box.y, `${label}.y`);\n\tvalidateFinite(box.width, `${label}.width`);\n\tvalidateFinite(box.height, `${label}.height`);\n\n\tif (box.width < 0 || box.height < 0) {\n\t\tthrow new TypeError(`${label} dimensions must be non-negative`);\n\t}\n}\n\nexport function boxCenter(box: Box): Point {\n\tvalidateBox(box);\n\n\treturn {\n\t\tx: box.x + box.width / 2,\n\t\ty: box.y + box.height / 2,\n\t};\n}\n\nexport function expandBox(box: Box, margin: number | Insets): Box {\n\tvalidateBox(box);\n\n\tconst insets = normalizeInsets(margin);\n\n\treturn {\n\t\tx: box.x - insets.left,\n\t\ty: box.y - insets.top,\n\t\twidth: box.width + insets.left + insets.right,\n\t\theight: box.height + insets.top + insets.bottom,\n\t};\n}\n\nexport function unionBoxes(boxes: readonly Box[]): Box {\n\tif (boxes.length === 0) {\n\t\tthrow new TypeError(\"Cannot union empty box collection\");\n\t}\n\n\tfor (const [index, box] of boxes.entries()) {\n\t\tvalidateBox(box, `boxes[${index}]`);\n\t}\n\n\tconst minX = Math.min(...boxes.map((box) => box.x));\n\tconst minY = Math.min(...boxes.map((box) => box.y));\n\tconst maxX = Math.max(...boxes.map((box) => box.x + box.width));\n\tconst maxY = Math.max(...boxes.map((box) => box.y + box.height));\n\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY,\n\t};\n}\n\nexport function intersectsAabb(a: Box, b: Box): boolean {\n\tvalidateBox(a, \"a\");\n\tvalidateBox(b, \"b\");\n\n\treturn (\n\t\ta.x <= b.x + b.width &&\n\t\ta.x + a.width >= b.x &&\n\t\ta.y <= b.y + b.height &&\n\t\ta.y + a.height >= b.y\n\t);\n}\n\n/**\n * Area of overlap between two boxes, in square pixels.\n * Returns 0 when the boxes do not intersect.\n */\nexport function overlapArea(first: Box, second: Box): number {\n\tconst x = Math.max(\n\t\t0,\n\t\tMath.min(first.x + first.width, second.x + second.width) -\n\t\t\tMath.max(first.x, second.x),\n\t);\n\tconst y = Math.max(\n\t\t0,\n\t\tMath.min(first.y + first.height, second.y + second.height) -\n\t\t\tMath.max(first.y, second.y),\n\t);\n\treturn x * y;\n}\n\nfunction validateMargin(value: number, label: string): void {\n\tvalidateFinite(value, label);\n\n\tif (value < 0) {\n\t\tthrow new TypeError(`${label} must be non-negative`);\n\t}\n}\n\nfunction validateFinite(value: number, label: string): void {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(`${label} must be finite`);\n\t}\n}\n","import type { Box, Point } from \"../ir/geometry.js\";\nimport { intersectsAabb } from \"./boxes.js\";\n\nexport interface BoxSpatialIndexEntry {\n\tid: string;\n\tbox: Box;\n}\n\nexport interface BoxSpatialIndex {\n\tcellSize: number;\n\tentries: ReadonlyMap<string, Box>;\n\tcells: ReadonlyMap<string, readonly string[]>;\n}\n\nexport function createBoxSpatialIndex(\n\tentries: Iterable<BoxSpatialIndexEntry>,\n\tcellSize = 128,\n): BoxSpatialIndex {\n\tconst normalizedCellSize =\n\t\tNumber.isFinite(cellSize) && cellSize > 0 ? cellSize : 128;\n\tconst boxes = new Map<string, Box>();\n\tconst mutableCells = new Map<string, string[]>();\n\n\tfor (const entry of entries) {\n\t\tboxes.set(entry.id, { ...entry.box });\n\t\tfor (const key of cellKeysForBox(entry.box, normalizedCellSize)) {\n\t\t\tconst ids = mutableCells.get(key) ?? [];\n\t\t\tids.push(entry.id);\n\t\t\tmutableCells.set(key, ids);\n\t\t}\n\t}\n\n\tconst cells = new Map<string, readonly string[]>();\n\tfor (const [key, ids] of mutableCells) {\n\t\tcells.set(key, [...new Set(ids)].sort());\n\t}\n\n\treturn { cellSize: normalizedCellSize, entries: boxes, cells };\n}\n\nexport function queryBoxSpatialIndex(\n\tindex: BoxSpatialIndex,\n\tbox: Box,\n): BoxSpatialIndexEntry[] {\n\tconst ids = new Set<string>();\n\tfor (const key of cellKeysForBox(box, index.cellSize)) {\n\t\tfor (const id of index.cells.get(key) ?? []) {\n\t\t\tids.add(id);\n\t\t}\n\t}\n\n\treturn [...ids].sort().flatMap((id) => {\n\t\tconst candidate = index.entries.get(id);\n\t\treturn candidate !== undefined && intersectsAabb(candidate, box)\n\t\t\t? [{ id, box: candidate }]\n\t\t\t: [];\n\t});\n}\n\nexport function querySegmentSpatialIndex(\n\tindex: BoxSpatialIndex,\n\tstart: Point,\n\tend: Point,\n): BoxSpatialIndexEntry[] {\n\treturn queryBoxSpatialIndex(index, segmentBox(start, end));\n}\n\nexport function expandBoxForQuery(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x - margin,\n\t\ty: box.y - margin,\n\t\twidth: box.width + margin * 2,\n\t\theight: box.height + margin * 2,\n\t};\n}\n\nfunction cellKeysForBox(box: Box, cellSize: number): string[] {\n\tconst minCol = Math.floor(box.x / cellSize);\n\tconst maxCol = Math.floor((box.x + Math.max(1, box.width)) / cellSize);\n\tconst minRow = Math.floor(box.y / cellSize);\n\tconst maxRow = Math.floor((box.y + Math.max(1, box.height)) / cellSize);\n\tconst keys: string[] = [];\n\tfor (let col = minCol; col <= maxCol; col += 1) {\n\t\tfor (let row = minRow; row <= maxRow; row += 1) {\n\t\t\tkeys.push(`${col}:${row}`);\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction segmentBox(start: Point, end: Point): Box {\n\tconst x = Math.min(start.x, end.x);\n\tconst y = Math.min(start.y, end.y);\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth: Math.max(1, Math.abs(start.x - end.x)),\n\t\theight: Math.max(1, Math.abs(start.y - end.y)),\n\t};\n}\n","import { intersectsAabb, overlapArea, validateBox } from \"../geometry/boxes.js\";\nimport {\n\tcreateBoxSpatialIndex,\n\tqueryBoxSpatialIndex,\n} from \"../geometry/spatial-index.js\";\nimport type {\n\tAlignConstraint,\n\tConstraint,\n\tDistributeConstraint,\n\tRelativePositionConstraint,\n} from \"../ir/constraints.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { NormalizedNode } from \"../ir/elements.js\";\nimport type { Box, Insets, Point } from \"../ir/geometry.js\";\nimport type {\n\tConstraintSolverInput,\n\tConstraintSolverResult,\n\tLayoutLock,\n} from \"./types.js\";\n\nexport function applyLayoutConstraints(\n\tinput: ConstraintSolverInput,\n): ConstraintSolverResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = cloneValidBoxes(input.boxes, diagnostics);\n\tconst locks = new Map<string, LayoutLock>();\n\tconst nodeById = new Map(input.nodes.map((node) => [node.id, node]));\n\n\tapplyFixedPositionLocks(input.nodes, boxes, locks, diagnostics);\n\tapplyExactPositions(input.constraints, boxes, locks, diagnostics, nodeById);\n\n\t// When distribution is enabled, drop fixed-position locks early so\n\t// repairOverlaps and containment treat positioned children as\n\t// movable instead of displacing unrelated nodes (Codex P2).\n\t// Only yields locks for children in containment constraints that\n\t// will actually be distributed (2+ eligible children).\n\tif (input.distributeContainedChildren) {\n\t\tyieldFixedPositionLocks(input, boxes, locks);\n\t}\n\n\t// Drop fixed-position locks for non-contract swimlane children\n\t// before overlap repair so they are treated as movable instead\n\t// of emitting stale locked-conflict diagnostics (Issue #61 codex P2).\n\t// Only drop locks when distribution will actually run for the lane —\n\t// i.e. ≥2 children would participate (no-lock or fixed-position;\n\t// exact-position children are reserved, not distributed). Matches the\n\t// participant count in distributeSwimlaneChildren (Codex review P2).\n\tif (\n\t\tinput.swimlanes !== undefined &&\n\t\tinput.swimlanes.length > 0 &&\n\t\tinput.distributeSwimlaneChildren\n\t) {\n\t\tfor (const swimlane of input.swimlanes) {\n\t\t\tif (swimlane.layout === \"contract\") continue;\n\t\t\tfor (const lane of swimlane.lanes) {\n\t\t\t\tconst fixedChildren: string[] = [];\n\t\t\t\tlet participantCount = 0;\n\t\t\t\tfor (const childId of lane.children) {\n\t\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t\tif (lock === undefined) {\n\t\t\t\t\t\tparticipantCount += 1;\n\t\t\t\t\t} else if (lock.source === \"fixed-position\") {\n\t\t\t\t\t\tparticipantCount += 1;\n\t\t\t\t\t\tfixedChildren.push(childId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (participantCount < 2) continue;\n\t\t\t\tfor (const childId of fixedChildren) {\n\t\t\t\t\tlocks.delete(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tapplyContainment(input.constraints, boxes, locks, diagnostics, false);\n\tapplyRelative(input.constraints, boxes, locks, diagnostics);\n\tapplyAlign(input.constraints, boxes, locks, diagnostics);\n\tapplyDistribute(input.constraints, boxes, locks, diagnostics);\n\trepairOverlaps(\n\t\tinput,\n\t\tboxes,\n\t\tlocks,\n\t\tdiagnostics,\n\t\tsiblingOverlapKeys(input.constraints),\n\t);\n\tapplyContainment(input.constraints, boxes, locks, diagnostics, true);\n\tapplyDistributeContained(input, boxes, locks, diagnostics);\n\n\t// After distribution, re-run containment and distribution for\n\t// nested containers whose own children may have been displaced,\n\t// then clean up any remaining loose ends (Codex P2).\n\tif (input.distributeContainedChildren) {\n\t\tconst diagBefore = diagnostics.length;\n\t\tapplyContainment(input.constraints, boxes, locks, diagnostics, true);\n\t\tapplyDistributeContained(input, boxes, locks, diagnostics);\n\t\t// Remove duplicate diagnostics emitted by the re-run on\n\t\t// containers that were already handled in the first pass\n\t\t// (Codex P3: avoid re-emitting distribution diagnostics).\n\t\tdedupReplayDiagnostics(diagnostics, diagBefore);\n\t}\n\n\t// Swimlane distribution (Issue #60): non-contract swimlanes are\n\t// NOT modeled as containment constraints, so distribute children\n\t// inside each lane content box separately. Moved outside\n\t// applyDistributeContained so it runs independently of the\n\t// distributeContainedChildren flag (Issue #61 codex P2).\n\tif (\n\t\tinput.swimlanes !== undefined &&\n\t\tinput.swimlanes.length > 0 &&\n\t\tinput.distributeSwimlaneChildren\n\t) {\n\t\tdistributeSwimlaneChildren(input, boxes, locks, diagnostics);\n\t}\n\n\t// Clean up diagnostics that distribution may have resolved (Codex P2).\n\tremoveResolvedConstraintDiagnostics(input.constraints, boxes, diagnostics);\n\n\treportOverlaps(\n\t\tboxes,\n\t\tdiagnostics,\n\t\tcontainmentOverlapKeys(input.constraints),\n\t\tlocks,\n\t);\n\treportIntraContainerOverflow(input, boxes, diagnostics);\n\n\treturn { boxes, locks, diagnostics };\n}\n\nfunction cloneValidBoxes(\n\tinput: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tconst boxes = new Map<string, Box>();\n\n\tfor (const [id, box] of input) {\n\t\tif (isFiniteBox(box)) {\n\t\t\tboxes.set(id, { ...box });\n\t\t} else {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Box ${id} contains invalid coordinates.`,\n\t\t\t\tpath: [\"boxes\", id],\n\t\t\t\tdetail: { nodeId: id },\n\t\t\t});\n\t\t}\n\t}\n\n\treturn boxes;\n}\n\nfunction applyFixedPositionLocks(\n\tnodes: readonly NormalizedNode[],\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const node of nodes) {\n\t\tif (node.position === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"node\", node.id);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFinitePoint(node.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Fixed position for ${node.id} is invalid.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"position\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, { ...box, x: node.position.x, y: node.position.y });\n\t\tlocks.set(node.id, { nodeId: node.id, source: \"fixed-position\" });\n\t}\n}\n\n/**\n * Remove duplicate diagnostics that the re-run containment/distribution\n * pass may have emitted for containers already handled in the first pass\n * (Codex P3).\n */\nfunction dedupReplayDiagnostics(\n\tdiagnostics: Diagnostic[],\n\tkeepUpTo: number,\n): void {\n\tconst seen = new Set<string>();\n\t// Mark pre-existing diagnostics as seen.\n\tfor (let i = 0; i < keepUpTo && i < diagnostics.length; i += 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\t\tseen.add(diagnosticFingerprint(d));\n\t}\n\t// Remove new duplicates.\n\tfor (let i = diagnostics.length - 1; i >= keepUpTo; i -= 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\t\tconst fp = diagnosticFingerprint(d);\n\t\tif (seen.has(fp)) {\n\t\t\tdiagnostics.splice(i, 1);\n\t\t} else {\n\t\t\tseen.add(fp);\n\t\t}\n\t}\n}\n\n/**\n * Stable fingerprint of a diagnostic for dedup: code + primary node/container.\n */\nfunction diagnosticFingerprint(d: Diagnostic): string {\n\tconst nodeId = typeof d.detail?.nodeId === \"string\" ? d.detail.nodeId : \"\";\n\tconst containerId =\n\t\ttypeof d.detail?.containerId === \"string\" ? d.detail.containerId : \"\";\n\treturn `${d.code}|${nodeId}|${containerId}`;\n}\n\n/**\n * Drop fixed-position locks for children that will be distributed,\n * so downstream passes (repairOverlaps, containment) treat them as\n * movable instead of displacing unrelated nodes (Codex P2).\n *\n * Only yields locks on children inside containment constraints with\n * 2+ eligible children — a single positioned child outside a\n * container is intentionally left locked.\n */\nfunction yieldFixedPositionLocks(\n\tinput: ConstraintSolverInput,\n\tboxes: ReadonlyMap<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n): void {\n\tfor (const c of input.constraints) {\n\t\tif (c.kind !== \"containment\") continue;\n\t\tconst container = boxes.get(c.containerId);\n\t\tif (container === undefined) continue;\n\t\tconst content = contentBox(container, c.padding);\n\t\tconst mainAxis: \"width\" | \"height\" =\n\t\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"width\" : \"height\";\n\t\tconst crossAxis: \"width\" | \"height\" =\n\t\t\tmainAxis === \"width\" ? \"height\" : \"width\";\n\t\t// Count eligible children: unlocked or fixed-position locked,\n\t\t// not oversized (distribution would skip oversized children).\n\t\t// Exact-position locks are reserved and not counted.\n\t\tlet eligible = 0;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst box = boxes.get(childId);\n\t\t\tif (box === undefined) continue;\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock?.source === \"exact-position\") continue;\n\t\t\tconst fits =\n\t\t\t\tbox[mainAxis] <= content[mainAxis] &&\n\t\t\t\tbox[crossAxis] <= content[crossAxis];\n\t\t\tif (fits) {\n\t\t\t\teligible += 1;\n\t\t\t}\n\t\t}\n\t\tif (eligible < 2) continue;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock?.source === \"fixed-position\") {\n\t\t\t\tconst box = boxes.get(childId);\n\t\t\t\tif (box === undefined) continue;\n\t\t\t\tconst fits =\n\t\t\t\t\tbox[mainAxis] <= content[mainAxis] &&\n\t\t\t\t\tbox[crossAxis] <= content[crossAxis];\n\t\t\t\tif (fits) {\n\t\t\t\t\tlocks.delete(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction applyExactPositions(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tnodeById: ReadonlyMap<string, NormalizedNode>,\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"exact-position\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targetId = constraintTargetId(constraint);\n\t\tif (targetId === undefined || !nodeById.has(targetId)) {\n\t\t\tmissingReference(diagnostics, \"target\", targetId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst box = boxes.get(targetId);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"box\", targetId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFinitePoint(constraint.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Exact position for ${targetId} is invalid.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? targetId, \"position\"],\n\t\t\t\tdetail: { nodeId: targetId },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingLock = locks.get(targetId);\n\t\tif (\n\t\t\texistingLock !== undefined &&\n\t\t\t(box.x !== constraint.position.x || box.y !== constraint.position.y)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.conflict.exact-position\",\n\t\t\t\tmessage: `Exact position conflicts with existing lock for ${targetId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? targetId],\n\t\t\t\tdetail: { nodeId: targetId, source: existingLock.source },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(targetId, {\n\t\t\t...box,\n\t\t\tx: constraint.position.x,\n\t\t\ty: constraint.position.y,\n\t\t});\n\t\tlocks.set(targetId, { nodeId: targetId, source: \"exact-position\" });\n\t}\n}\n\nfunction applyContainment(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\treportOverflow: boolean,\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tmissingReference(diagnostics, \"container\", constraint.containerId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst content = contentBox(container, constraint.padding);\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst child = boxes.get(childId);\n\t\t\tif (child === undefined) {\n\t\t\t\tmissingReference(diagnostics, \"child\", childId);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst next = moveInside(child, content);\n\t\t\tif (samePosition(child, next)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock !== undefined) {\n\t\t\t\tif (!reportOverflow) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\t\tmessage: `Locked child ${childId} was not moved into containment.`,\n\t\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tnodeId: childId,\n\t\t\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\t\t\tlockSource: lock.source,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (!isInside(child, content)) {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\t\t\t\tmessage: `Locked child ${childId} cannot fit inside ${constraint.containerId}.`,\n\t\t\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (next.width > content.width || next.height > content.height) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\t\tmessage: `Child ${childId} cannot fit inside ${constraint.containerId}.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboxes.set(childId, next);\n\t\t\tif (reportOverflow) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"containment_overflow\",\n\t\t\t\t\tmessage: `Child ${childId} was clamped back inside ${constraint.containerId} after constraint solving.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction applyRelative(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"relative-position\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst source = boxes.get(constraint.sourceId);\n\t\tconst reference = boxes.get(constraint.referenceId);\n\t\tif (source === undefined) {\n\t\t\tmissingReference(diagnostics, \"source\", constraint.sourceId);\n\t\t\tcontinue;\n\t\t}\n\t\tif (reference === undefined) {\n\t\t\tmissingReference(diagnostics, \"reference\", constraint.referenceId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst next = relativeBox(source, reference, constraint);\n\t\tsetUnlockedBox(\n\t\t\tconstraint.sourceId,\n\t\t\tnext,\n\t\t\tboxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tconstraint,\n\t\t);\n\t}\n}\n\nfunction applyAlign(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"align\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targets = collectTargets(constraint.targetIds, boxes, diagnostics);\n\t\tconst anchor = targets[0];\n\t\tif (anchor === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = alignmentValue(anchor.box, constraint.axis);\n\t\tfor (const { id, box } of targets.slice(1)) {\n\t\t\tconst next = alignBox(box, constraint.axis, value);\n\t\t\tsetUnlockedBox(id, next, boxes, locks, diagnostics, constraint);\n\t\t}\n\t}\n}\n\nfunction applyDistribute(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"distribute\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targets = collectTargets(\n\t\t\tconstraint.targetIds,\n\t\t\tboxes,\n\t\t\tdiagnostics,\n\t\t).sort((a, b) => {\n\t\t\tconst delta =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? a.box.x - b.box.x\n\t\t\t\t\t: a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.id.localeCompare(b.id) : delta;\n\t\t});\n\t\tif (targets.length < 3) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst first = targets[0];\n\t\tconst last = targets[targets.length - 1];\n\t\tif (first === undefined || last === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst spacing =\n\t\t\tconstraint.spacing ??\n\t\t\t(distributionStart(last.box, constraint.axis) -\n\t\t\t\tdistributionStart(first.box, constraint.axis)) /\n\t\t\t\t(targets.length - 1);\n\n\t\tfor (const [index, target] of targets.slice(1, -1).entries()) {\n\t\t\tconst nextStart =\n\t\t\t\tdistributionStart(first.box, constraint.axis) + spacing * (index + 1);\n\t\t\tconst next =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? { ...target.box, x: nextStart }\n\t\t\t\t\t: { ...target.box, y: nextStart };\n\t\t\tsetUnlockedBox(target.id, next, boxes, locks, diagnostics, constraint);\n\t\t}\n\t}\n}\n\nfunction repairOverlaps(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tsiblingPairs: ReadonlySet<string>,\n): void {\n\tconst spacing = input.overlapSpacing ?? 40;\n\tconst axis = input.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\tconst secondaryAxis = axis === \"x\" ? \"y\" : \"x\";\n\tconst ignoredPairs = containmentOverlapKeys(input.constraints);\n\tconst ids = [...boxes.keys()].sort();\n\n\tconst index = createBoxSpatialIndex(\n\t\tids.flatMap((id) => {\n\t\t\tconst box = boxes.get(id);\n\t\t\treturn box === undefined ? [] : [{ id, box }];\n\t\t}),\n\t\tspacing,\n\t);\n\tfor (let pass = 0; pass < 2; pass += 1) {\n\t\tfor (const firstId of ids) {\n\t\t\tconst first = boxes.get(firstId);\n\t\t\tif (first === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidateIds = queryBoxSpatialIndex(index, first)\n\t\t\t\t.map((candidate) => candidate.id)\n\t\t\t\t.filter((id) => id > firstId)\n\t\t\t\t.sort();\n\t\t\tfor (const secondId of candidateIds) {\n\t\t\t\tif (firstId >= secondId) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (ignoredPairs.has(overlapKey(firstId, secondId))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst second = boxes.get(secondId);\n\t\t\t\tif (second === undefined || !intersectsAabb(first, second)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst firstLocked = locks.has(firstId);\n\t\t\t\tconst secondLocked = locks.has(secondId);\n\t\t\t\tif (firstLocked && secondLocked) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst movingId = firstLocked\n\t\t\t\t\t? secondId\n\t\t\t\t\t: secondLocked\n\t\t\t\t\t\t? firstId\n\t\t\t\t\t\t: secondId;\n\t\t\t\tconst moving = movingId === firstId ? first : second;\n\t\t\t\tconst fixed = movingId === firstId ? second : first;\n\t\t\t\tconst repairAxis =\n\t\t\t\t\tfirstLocked === secondLocked && pass === 0 ? secondaryAxis : axis;\n\t\t\t\tconst pairKey = overlapKey(firstId, secondId);\n\t\t\t\tconst effectiveSpacing = siblingPairs.has(pairKey)\n\t\t\t\t\t? Math.max(spacing, input.minSiblingGap ?? 0)\n\t\t\t\t\t: spacing;\n\t\t\t\tconst moved = movePastOverlap(\n\t\t\t\t\tmoving,\n\t\t\t\t\tfixed,\n\t\t\t\t\trepairAxis,\n\t\t\t\t\teffectiveSpacing,\n\t\t\t\t);\n\t\t\t\tboxes.set(movingId, moved);\n\t\t\t}\n\t\t}\n\t}\n\n\treportOverlaps(boxes, diagnostics, ignoredPairs, locks);\n}\n\nfunction removeResolvedConstraintDiagnostics(\n\tconstraints: readonly Constraint[],\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): void {\n\t// Remove diagnostics for issues that distribution or a later\n\t// containment pass may have resolved (Codex P2).\n\tfor (let i = diagnostics.length - 1; i >= 0; i -= 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\n\t\t// ---- stale overlap warnings ----\n\t\tif (d.code === \"constraints.overlap.unresolved\") {\n\t\t\tconst aId = d.detail?.firstId;\n\t\t\tconst bId = d.detail?.secondId;\n\t\t\tif (typeof aId !== \"string\" || typeof bId !== \"string\") continue;\n\t\t\tconst a = boxes.get(aId);\n\t\t\tconst b = boxes.get(bId);\n\t\t\tif (a !== undefined && b !== undefined && !intersectsAabb(a, b)) {\n\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// ---- stale containment warnings (from applyContainment,\n\t\t// not from applyDistributeContained) ----\n\t\tif (\n\t\t\td.code === \"constraints.containment.impossible\" ||\n\t\t\t(d.code === \"constraints.locked-target-not-moved\" &&\n\t\t\t\ttypeof d.message === \"string\" &&\n\t\t\t\td.message.includes(\"not moved into containment\"))\n\t\t) {\n\t\t\tconst nodeId = d.detail?.nodeId;\n\t\t\tif (typeof nodeId !== \"string\") continue;\n\t\t\tconst child = boxes.get(nodeId);\n\t\t\tif (child === undefined) continue;\n\t\t\t// Extract the specific container that emitted this\n\t\t\t// diagnostic so we only clear it when THAT container\n\t\t\t// is satisfied (Codex P2: multi-container case).\n\t\t\tconst diagContainerId =\n\t\t\t\ttypeof d.detail?.containerId === \"string\"\n\t\t\t\t\t? d.detail.containerId\n\t\t\t\t\t: undefined;\n\t\t\tlet resolved = false;\n\t\t\tfor (const c of constraints) {\n\t\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t\tif (!c.childIds.includes(nodeId)) continue;\n\t\t\t\t// If we know which container emitted the diagnostic,\n\t\t\t\t// only match against that one.\n\t\t\t\tif (\n\t\t\t\t\tdiagContainerId !== undefined &&\n\t\t\t\t\tc.containerId !== diagContainerId\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst container = boxes.get(c.containerId);\n\t\t\t\tif (container === undefined) continue;\n\t\t\t\tconst content = contentBox(container, c.padding);\n\t\t\t\tif (isInside(child, content)) {\n\t\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t\t\tresolved = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// If we matched a specific container and it wasn't\n\t\t\t// satisfied, keep searching for the right one.\n\t\t\tif (!resolved && diagContainerId !== undefined) {\n\t\t\t\tfor (const c of constraints) {\n\t\t\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t\t\tif (c.containerId !== diagContainerId) continue;\n\t\t\t\t\tif (!c.childIds.includes(nodeId)) continue;\n\t\t\t\t\tconst container = boxes.get(c.containerId);\n\t\t\t\t\tif (container === undefined) continue;\n\t\t\t\t\tconst content = contentBox(container, c.padding);\n\t\t\t\t\tif (isInside(child, content)) {\n\t\t\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOverlaps(\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n\tignoredPairs: ReadonlySet<string> = new Set(),\n\tlocks: ReadonlyMap<string, LayoutLock> = new Map(),\n): void {\n\tconst ids = [...boxes.keys()].sort();\n\tconst reported = new Set(\n\t\tdiagnostics\n\t\t\t.filter(\n\t\t\t\t(diagnostic) =>\n\t\t\t\t\tdiagnostic.code === \"constraints.overlap.unresolved\" ||\n\t\t\t\t\tdiagnostic.code === \"constraints.overlap.locked-conflict\",\n\t\t\t)\n\t\t\t.map((diagnostic) => {\n\t\t\t\tconst firstId = diagnostic.detail?.firstId;\n\t\t\t\tconst secondId = diagnostic.detail?.secondId;\n\t\t\t\treturn typeof firstId === \"string\" && typeof secondId === \"string\"\n\t\t\t\t\t? overlapKey(firstId, secondId)\n\t\t\t\t\t: undefined;\n\t\t\t})\n\t\t\t.filter((key): key is string => key !== undefined),\n\t);\n\tconst index = createBoxSpatialIndex(\n\t\tids.flatMap((id) => {\n\t\t\tconst box = boxes.get(id);\n\t\t\treturn box === undefined ? [] : [{ id, box }];\n\t\t}),\n\t\t40,\n\t);\n\n\tfor (const firstId of ids) {\n\t\tconst first = boxes.get(firstId);\n\t\tif (first === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst candidateIds = queryBoxSpatialIndex(index, first)\n\t\t\t.map((candidate) => candidate.id)\n\t\t\t.filter((id) => id > firstId)\n\t\t\t.sort();\n\t\tfor (const secondId of candidateIds) {\n\t\t\tconst key = overlapKey(firstId, secondId);\n\t\t\tif (reported.has(key) || ignoredPairs.has(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst second = boxes.get(secondId);\n\t\t\tif (second !== undefined && intersectsAabb(first, second)) {\n\t\t\t\tconst firstLock = locks.get(firstId);\n\t\t\t\tconst secondLock = locks.get(secondId);\n\t\t\t\tif (firstLock !== undefined && secondLock !== undefined) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tcode: \"constraints.overlap.locked-conflict\",\n\t\t\t\t\t\tmessage: `Locked boxes ${firstId} (${firstLock.source}) and ${secondId} (${secondLock.source}) overlap and cannot be repaired.`,\n\t\t\t\t\t\tpath: [\"boxes\"],\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tfirstId,\n\t\t\t\t\t\t\tsecondId,\n\t\t\t\t\t\t\tfirstLockSource: firstLock.source,\n\t\t\t\t\t\t\tsecondLockSource: secondLock.source,\n\t\t\t\t\t\t\toverlapArea: overlapArea(first, second),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\treported.add(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\t\tmessage: `Boxes ${firstId} and ${secondId} still overlap after stable sorted primary axis repair with configured spacing.`,\n\t\t\t\t\tpath: [\"boxes\"],\n\t\t\t\t\tdetail: { firstId, secondId },\n\t\t\t\t});\n\t\t\t\treported.add(key);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportIntraContainerOverflow(\n\tinput: ConstraintSolverInput,\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (input.minSiblingGap === undefined) {\n\t\treturn;\n\t}\n\tconst minGap = input.minSiblingGap;\n\tconst axis: \"x\" | \"y\" =\n\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\n\tfor (const constraint of input.constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst children: Box[] = [];\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst child = boxes.get(childId);\n\t\t\tif (child !== undefined) {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\t\t}\n\t\tif (children.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Sort by main-axis position so pair-check can break early.\n\t\tconst sorted = [...children].sort((a, b) => a[axis] - b[axis]);\n\t\tconst mainDim = axis === \"x\" ? \"width\" : \"height\";\n\t\tlet overlapPairs = 0;\n\t\tfor (let i = 0; i < sorted.length; i += 1) {\n\t\t\tconst first = sorted[i];\n\t\t\tif (first === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (let j = i + 1; j < sorted.length; j += 1) {\n\t\t\t\tconst second = sorted[j];\n\t\t\t\tif (second === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Children are sorted by main-axis position; if second starts\n\t\t\t\t// beyond first's far edge it cannot overlap first (or any\n\t\t\t\t// earlier child), so we can break the inner loop.\n\t\t\t\tif (second[axis] >= first[axis] + first[mainDim]) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (intersectsAabb(first, second)) {\n\t\t\t\t\toverlapPairs += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (overlapPairs > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"intra_container_overflow\",\n\t\t\t\tmessage: `${overlapPairs} sibling pair(s) overlap inside ${constraint.containerId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\toverlapPairs,\n\t\t\t\t\tminGap,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Compute content size inline to avoid allocating a full Box.\n\t\tconst pad = constraint.padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\t\tconst contentMain =\n\t\t\tmainDim === \"width\"\n\t\t\t\t? Math.max(0, container.width - pad.left - pad.right)\n\t\t\t\t: Math.max(0, container.height - pad.top - pad.bottom);\n\t\t// Use actual spatial extent rather than sequential-stack\n\t\t// estimate. Children may be laid out along the cross-axis,\n\t\t// making the sequential sum too pessimistic.\n\t\tlet childStart = Infinity;\n\t\tlet childEnd = -Infinity;\n\t\tfor (const child of sorted) {\n\t\t\tconst start = child[axis];\n\t\t\tconst end = start + child[mainDim];\n\t\t\tif (start < childStart) childStart = start;\n\t\t\tif (end > childEnd) childEnd = end;\n\t\t}\n\t\tif (sorted.length === 0) {\n\t\t\tchildStart = 0;\n\t\t\tchildEnd = 0;\n\t\t}\n\t\tconst actualExtent = childEnd - childStart;\n\t\tif (actualExtent > contentMain) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"intra_container_overflow_total\",\n\t\t\t\tmessage: `Container ${constraint.containerId} cannot fit ${sorted.length} siblings along ${axis} (extent ${actualExtent}, available ${contentMain}).`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\taxis,\n\t\t\t\t\tneeded: actualExtent,\n\t\t\t\t\tavailable: contentMain,\n\t\t\t\t\tsiblingCount: sorted.length,\n\t\t\t\t\tminGap,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction overlapKey(firstId: string, secondId: string): string {\n\treturn firstId < secondId\n\t\t? `${firstId}\\0${secondId}`\n\t\t: `${secondId}\\0${firstId}`;\n}\n\nfunction containmentOverlapKeys(\n\tconstraints: readonly Constraint[],\n): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tkeys.add(overlapKey(constraint.containerId, childId));\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction siblingOverlapKeys(constraints: readonly Constraint[]): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst { childIds } = constraint;\n\t\tfor (let i = 0; i < childIds.length; i += 1) {\n\t\t\tfor (let j = i + 1; j < childIds.length; j += 1) {\n\t\t\t\tconst a = childIds[i];\n\t\t\t\tconst b = childIds[j];\n\t\t\t\tif (a === undefined || b === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tkeys.add(overlapKey(a, b));\n\t\t\t}\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction setUnlockedBox(\n\tid: string,\n\tnext: Box,\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tconstraint: Constraint,\n): void {\n\tconst current = boxes.get(id);\n\tif (current === undefined) {\n\t\tmissingReference(diagnostics, \"target\", id);\n\t\treturn;\n\t}\n\n\tif (!isFiniteBox(next)) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"constraints.position.invalid\",\n\t\t\tmessage: `Constraint produced an invalid position for ${id}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? id],\n\t\t\tdetail: { nodeId: id },\n\t\t});\n\t\treturn;\n\t}\n\n\tif (locks.has(id) && !samePosition(current, next)) {\n\t\tconst lock = locks.get(id);\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\tmessage: `Locked target ${id} was not moved by ${constraint.kind}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? id],\n\t\t\tdetail: {\n\t\t\t\tnodeId: id,\n\t\t\t\tconstraintKind: constraint.kind,\n\t\t\t\t...(lock === undefined ? {} : { lockSource: lock.source }),\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tboxes.set(id, next);\n}\n\nfunction constraintTargetId(\n\tconstraint: Extract<Constraint, { kind: \"exact-position\" }>,\n): string | undefined {\n\treturn constraint.targetId ?? constraint.target?.id;\n}\n\nfunction collectTargets(\n\tids: readonly string[],\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): { id: string; box: Box }[] {\n\tconst targets: { id: string; box: Box }[] = [];\n\tfor (const id of ids) {\n\t\tconst box = boxes.get(id);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"target\", id);\n\t\t} else {\n\t\t\ttargets.push({ id, box });\n\t\t}\n\t}\n\treturn targets;\n}\n\nfunction relativeBox(\n\tsource: Box,\n\treference: Box,\n\tconstraint: RelativePositionConstraint,\n): Box {\n\tconst offset = constraint.offset ?? { x: 0, y: 0 };\n\tswitch (constraint.relation) {\n\t\tcase \"above\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y - source.height + offset.y,\n\t\t\t};\n\t\tcase \"right-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + reference.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t\tcase \"below\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y + reference.height + offset.y,\n\t\t\t};\n\t\tcase \"left-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x - source.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t}\n}\n\nfunction alignmentValue(box: Box, axis: AlignConstraint[\"axis\"]): number {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn box.x;\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn box.y;\n\t\tcase \"center-x\":\n\t\t\treturn box.x + box.width / 2;\n\t\tcase \"center-y\":\n\t\t\treturn box.y + box.height / 2;\n\t\tcase \"right\":\n\t\t\treturn box.x + box.width;\n\t\tcase \"bottom\":\n\t\t\treturn box.y + box.height;\n\t}\n}\n\nfunction alignBox(box: Box, axis: AlignConstraint[\"axis\"], value: number): Box {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn { ...box, x: value };\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn { ...box, y: value };\n\t\tcase \"center-x\":\n\t\t\treturn { ...box, x: value - box.width / 2 };\n\t\tcase \"center-y\":\n\t\t\treturn { ...box, y: value - box.height / 2 };\n\t\tcase \"right\":\n\t\t\treturn { ...box, x: value - box.width };\n\t\tcase \"bottom\":\n\t\t\treturn { ...box, y: value - box.height };\n\t}\n}\n\nfunction distributionStart(\n\tbox: Box,\n\taxis: DistributeConstraint[\"axis\"],\n): number {\n\treturn axis === \"horizontal\" ? box.x : box.y;\n}\n\nfunction contentBox(container: Box, padding: Insets | undefined): Box {\n\tconst margin = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\tx: container.x + margin.left,\n\t\ty: container.y + margin.top,\n\t\twidth: Math.max(0, container.width - margin.left - margin.right),\n\t\theight: Math.max(0, container.height - margin.top - margin.bottom),\n\t};\n}\n\ntype ReservedInterval = { start: number; end: number };\n\nfunction applyDistributeContained(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (!input.distributeContainedChildren) {\n\t\treturn;\n\t}\n\n\tconst axis: \"x\" | \"y\" =\n\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\tconst crossAxis = axis === \"x\" ? \"y\" : \"x\";\n\tconst mainSize = axis === \"x\" ? \"width\" : \"height\";\n\tconst crossSize = axis === \"x\" ? \"height\" : \"width\";\n\t// Default to a positive gap so distributed children are\n\t// visually separated even when minSiblingGap is not set.\n\tconst minGap = input.minSiblingGap ?? 8;\n\n\tfor (const constraint of input.constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst content = contentBox(container, constraint.padding);\n\t\tconst unlocked: { id: string; box: Box }[] = [];\n\t\tconst reserved: ReservedInterval[] = [];\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst box = boxes.get(childId);\n\t\t\tif (box === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (locks.has(childId)) {\n\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t// When distribution is explicitly requested, a fixed-position\n\t\t\t\t// lock (from the node's `position` field) yields to the\n\t\t\t\t// distributor so the caller's distributeContainedChildren\n\t\t\t\t// option actually takes effect (#37). Explicit exact-position\n\t\t\t\t// constraints still win and are reserved.\n\t\t\t\tif (lock?.source === \"fixed-position\") {\n\t\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\tmessage: `Locked child ${childId} skipped during containment distribution.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId },\n\t\t\t\t});\n\t\t\t\treserved.push(intervalForBox(box, axis, mainSize));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tunlocked.push({ id: childId, box });\n\t\t}\n\t\tif (unlocked.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip children that are already larger than the content area;\n\t\t// applyContainment already diagnoses these and moving them is futile.\n\t\tconst oversized = unlocked.filter(\n\t\t\t(child) =>\n\t\t\t\tchild.box[mainSize] > content[mainSize] ||\n\t\t\t\tchild.box[crossSize] > content[crossSize],\n\t\t);\n\t\tif (oversized.length > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\tmessage: `Skipped ${oversized.length} oversized child(ren) during distribution in ${constraint.containerId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\toversized: oversized.map((c) => c.id),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tfor (const child of oversized) {\n\t\t\treserved.push(intervalForBox(child.box, axis, mainSize));\n\t\t}\n\t\treserved.sort((a, b) => a.start - b.start || a.end - b.end);\n\t\tconst distributable = unlocked.filter(\n\t\t\t(child) =>\n\t\t\t\tchild.box[mainSize] <= content[mainSize] &&\n\t\t\t\tchild.box[crossSize] <= content[crossSize],\n\t\t);\n\t\tif (distributable.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Distribute along the main axis within the content box.\n\t\t// When spread mode is requested, distribute children across\n\t\t// the full content area instead of stacking at one end (#49).\n\t\tconst spread = typeof input.distributeContainedChildren === \"string\";\n\t\tlet effectiveGap = minGap;\n\t\tlet pos = content[axis];\n\t\tif (spread) {\n\t\t\tlet totalChildSpan = 0;\n\t\t\tfor (const child of distributable) {\n\t\t\t\ttotalChildSpan += child.box[mainSize];\n\t\t\t}\n\t\t\t// Subtract reserved intervals and their required gaps so\n\t\t\t// the spread gap is computed from actually usable space\n\t\t\t// (Codex P2: advancePastReserved needs minGap around reserved).\n\t\t\tlet reservedSpan = 0;\n\t\t\tconst contentEnd = content[axis] + content[mainSize];\n\t\t\tfor (const r of reserved) {\n\t\t\t\tconst rStart = Math.max(r.start, content[axis]);\n\t\t\t\tconst rEnd = Math.min(r.end, contentEnd);\n\t\t\t\tif (rEnd > rStart) {\n\t\t\t\t\treservedSpan += rEnd - rStart + minGap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst remaining =\n\t\t\t\tcontent[mainSize] -\n\t\t\t\ttotalChildSpan -\n\t\t\t\treservedSpan -\n\t\t\t\tminGap * (distributable.length - 1);\n\t\t\tif (remaining > 0) {\n\t\t\t\teffectiveGap = minGap + remaining / (distributable.length - 1);\n\t\t\t}\n\t\t}\n\t\tfor (const child of distributable) {\n\t\t\tpos = advancePastReserved(pos, child.box[mainSize], reserved, minGap);\n\t\t\tconst crossPos =\n\t\t\t\tcontent[crossAxis] +\n\t\t\t\tMath.max(0, (content[crossSize] - child.box[crossSize]) / 2);\n\t\t\tconst next: Box = { ...child.box };\n\t\t\tnext[axis] = pos;\n\t\t\tnext[crossAxis] = crossPos;\n\t\t\tconst clamped = moveInside(next, content);\n\t\t\t// Report when clamping squashed the requested spacing.\n\t\t\tif (clamped[axis] !== next[axis]) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"intra_container_distributed_clamped\",\n\t\t\t\t\tmessage: `Distribution gap clamped for ${child.id} in ${constraint.containerId}.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: child.id, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t}\n\t\t\tboxes.set(child.id, clamped);\n\t\t\t// Fixed-position locks only yield once distribution succeeds.\n\t\t\tlocks.delete(child.id);\n\t\t\tpos = clamped[axis] + clamped[mainSize] + effectiveGap;\n\t\t}\n\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"intra_container_distributed\",\n\t\t\tmessage: `Distributed ${distributable.length} children in ${constraint.containerId} along ${axis}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\tdetail: {\n\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\tcount: distributable.length,\n\t\t\t\taxis,\n\t\t\t},\n\t\t});\n\t}\n}\n\n/**\n * Distribute children of non-contract swimlanes inside their lane\n * content box (Issue #60). Similar to applyDistributeContained but\n * operates on swimlane lanes instead of containment constraints.\n */\nfunction distributeSwimlaneChildren(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tconst spread = input.distributeSwimlaneChildren === \"spread\";\n\tconst minGap = input.minSiblingGap ?? 8;\n\n\tfor (const swimlane of input.swimlanes!) {\n\t\tif (swimlane.layout === \"contract\") continue;\n\t\tconst isVertical = swimlane.orientation !== \"horizontal\";\n\t\tconst axis = isVertical ? (\"x\" as const) : (\"y\" as const);\n\t\tconst mainSize = isVertical ? (\"width\" as const) : (\"height\" as const);\n\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (lane.children.length < 2) continue;\n\n\t\t\tconst unlocked: { id: string; box: Box }[] = [];\n\t\t\tconst reserved: ReservedInterval[] = [];\n\n\t\t\tfor (const childId of lane.children) {\n\t\t\t\tconst box = boxes.get(childId);\n\t\t\t\tif (box === undefined) continue;\n\t\t\t\tif (locks.has(childId)) {\n\t\t\t\t\tconst lock = locks.get(childId)!;\n\t\t\t\t\tif (lock.source === \"fixed-position\") {\n\t\t\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treserved.push(intervalForBox(box, axis, mainSize));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t}\n\n\t\t\tif (unlocked.length < 2) continue;\n\n\t\t\tconst contentStart = isVertical\n\t\t\t\t? Math.min(...unlocked.map((c) => c.box.x))\n\t\t\t\t: Math.min(...unlocked.map((c) => c.box.y));\n\t\t\tconst contentEnd = isVertical\n\t\t\t\t? Math.max(...unlocked.map((c) => c.box.x + c.box.width))\n\t\t\t\t: Math.max(...unlocked.map((c) => c.box.y + c.box.height));\n\t\t\tconst contentSpan = contentEnd - contentStart;\n\n\t\t\tconst totalChildSpan = unlocked.reduce((s, c) => s + c.box[mainSize], 0);\n\t\t\tconst reservedSpan = reserved.reduce((s, r) => s + (r.end - r.start), 0);\n\t\t\tlet effectiveGap = minGap;\n\t\t\tconst remaining =\n\t\t\t\tcontentSpan -\n\t\t\t\ttotalChildSpan -\n\t\t\t\treservedSpan -\n\t\t\t\tminGap * (unlocked.length - 1);\n\t\t\tif (spread && remaining > 0) {\n\t\t\t\teffectiveGap = minGap + remaining / (unlocked.length - 1);\n\t\t\t}\n\n\t\t\tunlocked.sort((a, b) => a.box[axis] - b.box[axis]);\n\n\t\t\treserved.sort((a, b) => a.start - b.start);\n\t\t\tlet pos = contentStart;\n\t\t\tfor (const child of unlocked) {\n\t\t\t\tpos = advancePastReserved(pos, child.box[mainSize], reserved, minGap);\n\t\t\t\tconst newBox = { ...child.box };\n\t\t\t\tif (axis === \"x\") {\n\t\t\t\t\tnewBox.x = pos;\n\t\t\t\t} else {\n\t\t\t\t\tnewBox.y = pos;\n\t\t\t\t}\n\t\t\t\tboxes.set(child.id, newBox);\n\t\t\t\tlocks.delete(child.id);\n\t\t\t\tpos += child.box[mainSize] + effectiveGap;\n\t\t\t}\n\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tcode: \"intra_container_distributed\",\n\t\t\t\tmessage: `Distributed ${unlocked.length} children in swimlane ${lane.id} along ${axis}.`,\n\t\t\t\tdetail: { containerId: lane.id, count: unlocked.length, axis },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction intervalForBox(\n\tbox: Box,\n\taxis: \"x\" | \"y\",\n\tmainSize: \"width\" | \"height\",\n): ReservedInterval {\n\treturn { start: box[axis], end: box[axis] + box[mainSize] };\n}\n\nfunction advancePastReserved(\n\tpos: number,\n\tsize: number,\n\treserved: readonly ReservedInterval[],\n\tminGap: number,\n): number {\n\tlet next = pos;\n\tfor (const interval of reserved) {\n\t\tif (next + size + minGap <= interval.start) {\n\t\t\tbreak;\n\t\t}\n\t\tif (next >= interval.end + minGap) {\n\t\t\tcontinue;\n\t\t}\n\t\tnext = interval.end + minGap;\n\t}\n\treturn next;\n}\n\nfunction moveInside(child: Box, container: Box): Box {\n\treturn {\n\t\t...child,\n\t\tx: Math.min(\n\t\t\tMath.max(child.x, container.x),\n\t\t\tcontainer.x + container.width - child.width,\n\t\t),\n\t\ty: Math.min(\n\t\t\tMath.max(child.y, container.y),\n\t\t\tcontainer.y + container.height - child.height,\n\t\t),\n\t};\n}\n\nfunction isInside(child: Box, container: Box): boolean {\n\treturn (\n\t\tchild.x >= container.x &&\n\t\tchild.y >= container.y &&\n\t\tchild.x + child.width <= container.x + container.width &&\n\t\tchild.y + child.height <= container.y + container.height\n\t);\n}\n\nfunction movePastOverlap(\n\tmoving: Box,\n\tfixed: Box,\n\tprimaryAxis: \"x\" | \"y\",\n\tspacing: number,\n): Box {\n\tif (primaryAxis === \"x\") {\n\t\tconst movingCenter = moving.x + moving.width / 2;\n\t\tconst fixedCenter = fixed.x + fixed.width / 2;\n\t\tconst x =\n\t\t\tmovingCenter >= fixedCenter\n\t\t\t\t? fixed.x + fixed.width + spacing\n\t\t\t\t: fixed.x - moving.width - spacing;\n\t\treturn { ...moving, x };\n\t}\n\n\tconst movingCenter = moving.y + moving.height / 2;\n\tconst fixedCenter = fixed.y + fixed.height / 2;\n\tconst y =\n\t\tmovingCenter >= fixedCenter\n\t\t\t? fixed.y + fixed.height + spacing\n\t\t\t: fixed.y - moving.height - spacing;\n\treturn { ...moving, y };\n}\n\nfunction samePosition(a: Box, b: Box): boolean {\n\treturn a.x === b.x && a.y === b.y;\n}\n\nfunction isFiniteBox(box: Box): boolean {\n\ttry {\n\t\tvalidateBox(box);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isFinitePoint(point: Point): boolean {\n\treturn Number.isFinite(point.x) && Number.isFinite(point.y);\n}\n\nfunction missingReference(\n\tdiagnostics: Diagnostic[],\n\treferenceKind: string,\n\tid: string | undefined,\n): void {\n\tdiagnostics.push({\n\t\tseverity: \"error\",\n\t\tcode: \"constraints.reference.missing\",\n\t\tmessage: `Missing ${referenceKind} reference${id === undefined ? \"\" : `: ${id}`}.`,\n\t\tpath: [\"constraints\", referenceKind],\n\t\tdetail: id === undefined ? {} : { id },\n\t});\n}\n","import type { NodeShape } from \"../ir/elements.js\";\nimport type {\n\tAnchorName,\n\tAnchorPoint,\n\tBox,\n\tInsets,\n\tPoint,\n} from \"../ir/geometry.js\";\nimport { boxCenter, expandBox, validateBox } from \"./boxes.js\";\n\nconst SUPPORTED_SHAPES = new Set<NodeShape>([\n\t\"rectangle\",\n\t\"rounded-rectangle\",\n\t\"ellipse\",\n\t\"diamond\",\n\t\"parallelogram\",\n\t\"hexagon\",\n\t\"cylinder\",\n]);\n\nexport interface ShapeGeometryInput {\n\tshape: NodeShape;\n\tbox: Box;\n\tobstacleMargin?: number | Insets;\n}\n\nexport interface ShapeGeometry {\n\tshape: NodeShape;\n\tbox: Box;\n\tcenter: Point;\n\tanchors: AnchorPoint[];\n\tobstacleBox: Box;\n}\n\nexport function computeShapeGeometry(input: ShapeGeometryInput): ShapeGeometry {\n\tvalidateShape(input.shape);\n\tvalidateBox(input.box);\n\n\tconst box = { ...input.box };\n\n\treturn {\n\t\tshape: input.shape,\n\t\tbox,\n\t\tcenter: boxCenter(box),\n\t\tanchors: createAnchors(box),\n\t\tobstacleBox: expandBox(box, input.obstacleMargin ?? 0),\n\t};\n}\n\nexport function getEdgePort(\n\tgeometry: ShapeGeometry,\n\ttoward: Point,\n\tpreferredAnchor?: AnchorName,\n): Point {\n\tvalidateShape(geometry.shape);\n\tvalidateBox(geometry.box);\n\tvalidatePoint(toward, \"toward\");\n\n\tif (preferredAnchor !== undefined) {\n\t\tconst anchor = geometry.anchors.find((candidate) => {\n\t\t\treturn candidate.name === preferredAnchor;\n\t\t});\n\n\t\tif (anchor === undefined) {\n\t\t\tthrow new TypeError(`Unsupported anchor: ${preferredAnchor}`);\n\t\t}\n\n\t\treturn { ...anchor.point };\n\t}\n\n\tif (\n\t\tgeometry.shape === \"rectangle\" ||\n\t\tgeometry.shape === \"rounded-rectangle\"\n\t) {\n\t\treturn rayToBox(geometry.box, toward);\n\t}\n\n\t// Practical deterministic approximation: precise visual boundary intersections\n\t// are deferred; Phase 2 returns stable ports inside the outer shape box.\n\treturn snapToNearestAnchor(geometry, toward);\n}\n\nfunction createAnchors(box: Box): AnchorPoint[] {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst center = boxCenter(box);\n\n\treturn [\n\t\t{ name: \"center\", point: center },\n\t\t{ name: \"top\", point: { x: center.x, y: top } },\n\t\t{ name: \"right\", point: { x: right, y: center.y } },\n\t\t{ name: \"bottom\", point: { x: center.x, y: bottom } },\n\t\t{ name: \"left\", point: { x: left, y: center.y } },\n\t\t{ name: \"top-left\", point: { x: left, y: top } },\n\t\t{ name: \"top-right\", point: { x: right, y: top } },\n\t\t{ name: \"bottom-right\", point: { x: right, y: bottom } },\n\t\t{ name: \"bottom-left\", point: { x: left, y: bottom } },\n\t];\n}\n\nfunction rayToBox(box: Box, toward: Point): Point {\n\tconst center = boxCenter(box);\n\tconst dx = toward.x - center.x;\n\tconst dy = toward.y - center.y;\n\n\tif (dx === 0 && dy === 0) {\n\t\treturn center;\n\t}\n\n\tconst halfWidth = box.width / 2;\n\tconst halfHeight = box.height / 2;\n\tconst scaleX = dx === 0 ? Number.POSITIVE_INFINITY : halfWidth / Math.abs(dx);\n\tconst scaleY =\n\t\tdy === 0 ? Number.POSITIVE_INFINITY : halfHeight / Math.abs(dy);\n\tconst scale = Math.min(scaleX, scaleY);\n\n\treturn clampPointToBox(\n\t\t{\n\t\t\tx: center.x + dx * scale,\n\t\t\ty: center.y + dy * scale,\n\t\t},\n\t\tbox,\n\t);\n}\n\nfunction snapToNearestAnchor(geometry: ShapeGeometry, toward: Point): Point {\n\tlet best = geometry.anchors[0];\n\tlet bestDistance = Number.POSITIVE_INFINITY;\n\n\tfor (const anchor of geometry.anchors) {\n\t\tif (anchor.name === \"center\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst distance = squaredDistance(anchor.point, toward);\n\n\t\tif (distance < bestDistance) {\n\t\t\tbest = anchor;\n\t\t\tbestDistance = distance;\n\t\t}\n\t}\n\n\tif (best === undefined) {\n\t\treturn { ...geometry.center };\n\t}\n\n\treturn clampPointToBox(best.point, geometry.box);\n}\n\nfunction clampPointToBox(point: Point, box: Box): Point {\n\treturn {\n\t\tx: Math.min(Math.max(point.x, box.x), box.x + box.width),\n\t\ty: Math.min(Math.max(point.y, box.y), box.y + box.height),\n\t};\n}\n\nfunction squaredDistance(a: Point, b: Point): number {\n\tconst dx = a.x - b.x;\n\tconst dy = a.y - b.y;\n\n\treturn dx * dx + dy * dy;\n}\n\nfunction validateShape(shape: NodeShape): void {\n\tif (!SUPPORTED_SHAPES.has(shape)) {\n\t\tthrow new TypeError(`Unsupported shape: ${shape}`);\n\t}\n}\n\nfunction validatePoint(point: Point, label: string): void {\n\tif (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n\t\tthrow new TypeError(`${label} point must be finite`);\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { AnchorPoint, Box, Insets, Size } from \"../ir/geometry.js\";\nimport type { LabelLayout } from \"../labels/index.js\";\nimport { expandBox, normalizeInsets, unionBoxes } from \"./boxes.js\";\nimport { computeShapeGeometry } from \"./shapes.js\";\n\nexport interface ContainerGeometryInput {\n\tid: string;\n\tchildBoxes: readonly Box[];\n\tpadding: Insets | number;\n\tlabelLayout?: LabelLayout;\n\tminSize?: Partial<Size>;\n\tobstacleMargin?: number | Insets;\n}\n\nexport interface ContainerGeometry {\n\tid: string;\n\tbox: Box;\n\tcontentBox: Box;\n\tchildBounds: Box;\n\tlabelLayout?: LabelLayout;\n\tanchors: AnchorPoint[];\n\tobstacleBox: Box;\n\tdiagnostics: Diagnostic[];\n}\n\nexport function computeContainerGeometry(\n\tinput: ContainerGeometryInput,\n): ContainerGeometry {\n\tconst childBounds = unionBoxes(input.childBoxes);\n\tconst padding = normalizeInsets(input.padding);\n\tconst minSize = normalizeMinSize(input.minSize);\n\tconst headerHeight =\n\t\tinput.labelLayout?.fittedSize.height ?? input.labelLayout?.box.height ?? 0;\n\tconst intrinsicBox = {\n\t\tx: childBounds.x - padding.left,\n\t\ty: childBounds.y - padding.top - headerHeight,\n\t\twidth: childBounds.width + padding.left + padding.right,\n\t\theight: childBounds.height + padding.top + padding.bottom + headerHeight,\n\t};\n\tconst box = {\n\t\t...intrinsicBox,\n\t\twidth: Math.max(intrinsicBox.width, minSize.width ?? 0),\n\t\theight: Math.max(intrinsicBox.height, minSize.height ?? 0),\n\t};\n\tconst contentBox = {\n\t\tx: childBounds.x,\n\t\ty: childBounds.y,\n\t\twidth: childBounds.width,\n\t\theight: childBounds.height,\n\t};\n\tconst shape = computeShapeGeometry({\n\t\tshape: \"rectangle\",\n\t\tbox,\n\t});\n\tconst obstacleBox = expandBox(box, input.obstacleMargin ?? 0);\n\n\treturn {\n\t\tid: input.id,\n\t\tbox,\n\t\tcontentBox,\n\t\tchildBounds,\n\t\t...(input.labelLayout === undefined\n\t\t\t? {}\n\t\t\t: { labelLayout: input.labelLayout }),\n\t\tanchors: shape.anchors,\n\t\tobstacleBox,\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction normalizeMinSize(minSize: Partial<Size> = {}): Partial<Size> {\n\tif (minSize.width !== undefined) {\n\t\tvalidateSize(minSize.width, \"minSize.width\");\n\t}\n\n\tif (minSize.height !== undefined) {\n\t\tvalidateSize(minSize.height, \"minSize.height\");\n\t}\n\n\treturn { ...minSize };\n}\n\nfunction validateSize(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new TypeError(`${label} must be finite and non-negative`);\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\n\nexport interface TextStyleOptions {\n\tfontFamily: string;\n\tfontSize: number;\n\tfontWeight?: number | string;\n\tfontStyle?: \"normal\" | \"italic\";\n\tlineHeight?: number;\n\tletterSpacing?: number;\n\twhiteSpace?: \"normal\" | \"pre-wrap\";\n\twordBreak?: \"normal\" | \"keep-all\";\n}\n\nexport type TextMeasurementBackend = \"deterministic\" | \"pretext\";\n\nexport interface PreparedText {\n\ttext: string;\n\tfont: string;\n\tstyle: TextStyleOptions;\n\tbackend: TextMeasurementBackend;\n}\n\nexport interface TextCursor {\n\tsegmentIndex: number;\n\tgraphemeIndex: number;\n}\n\nexport interface TextLayoutLine {\n\ttext: string;\n\twidth: number;\n\tstart: TextCursor;\n\tend: TextCursor;\n}\n\nexport interface TextLayout {\n\twidth: number;\n\theight: number;\n\tlineHeight: number;\n\tlineCount: number;\n\tlines: TextLayoutLine[];\n\tdiagnostics: Diagnostic[];\n}\n\nexport interface TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText;\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight?: number,\n\t): TextLayout;\n\tnaturalWidth(prepared: PreparedText): number;\n}\n\nexport function assertFinitePositive(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new TypeError(`${label} must be finite and positive`);\n\t}\n}\n\nexport function assertFiniteNonNegative(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new TypeError(`${label} must be a finite non-negative width`);\n\t}\n}\n\nexport function validateTextStyle(style: TextStyleOptions): void {\n\tassertFinitePositive(style.fontSize, \"fontSize\");\n\n\tif (style.lineHeight !== undefined) {\n\t\tassertFinitePositive(style.lineHeight, \"lineHeight\");\n\t}\n\n\tif (\n\t\tstyle.letterSpacing !== undefined &&\n\t\t!Number.isFinite(style.letterSpacing)\n\t) {\n\t\tthrow new TypeError(\"letterSpacing must be finite\");\n\t}\n}\n\nexport function resolveLineHeight(style: TextStyleOptions): number {\n\tvalidateTextStyle(style);\n\treturn style.lineHeight ?? style.fontSize * 1.2;\n}\n\nexport function toCanvasFont(style: TextStyleOptions): string {\n\tvalidateTextStyle(style);\n\n\tconst fontStyle = style.fontStyle === \"italic\" ? \"italic \" : \"\";\n\tconst fontWeight = style.fontWeight ?? 400;\n\n\treturn `${fontStyle}${fontWeight} ${style.fontSize}px ${style.fontFamily}`;\n}\n","import type {\n\tPreparedText,\n\tTextLayout,\n\tTextLayoutLine,\n\tTextMeasurer,\n\tTextStyleOptions,\n} from \"./types.js\";\nimport {\n\tassertFiniteNonNegative,\n\tresolveLineHeight,\n\ttoCanvasFont,\n\tvalidateTextStyle,\n} from \"./types.js\";\n\nexport class DeterministicTextMeasurer implements TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText {\n\t\tvalidateTextStyle(style);\n\n\t\treturn {\n\t\t\ttext,\n\t\t\tfont: toCanvasFont(style),\n\t\t\tstyle: { ...style },\n\t\t\tbackend: \"deterministic\",\n\t\t};\n\t}\n\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight = resolveLineHeight(prepared.style),\n\t): TextLayout {\n\t\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\t\tassertFinitePositiveLineHeight(lineHeight);\n\n\t\tconst lines = this.wrap(prepared, maxWidth);\n\t\tconst width = lines.reduce(\n\t\t\t(current, line) => Math.max(current, line.width),\n\t\t\t0,\n\t\t);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight: lines.length * lineHeight,\n\t\t\tlineHeight,\n\t\t\tlineCount: lines.length,\n\t\t\tlines,\n\t\t\tdiagnostics: [],\n\t\t};\n\t}\n\n\tnaturalWidth(prepared: PreparedText): number {\n\t\tconst charWidth = getCharacterWidth(prepared.style);\n\n\t\treturn prepared.text.split(\"\\n\").reduce((width, line) => {\n\t\t\treturn Math.max(width, line.length * charWidth);\n\t\t}, 0);\n\t}\n\n\tprivate wrap(prepared: PreparedText, maxWidth: number): TextLayoutLine[] {\n\t\tconst charWidth = getCharacterWidth(prepared.style);\n\t\tconst sourceLines = prepared.text.split(\"\\n\");\n\t\tconst output: TextLayoutLine[] = [];\n\t\tlet segmentIndex = 0;\n\n\t\tfor (const sourceLine of sourceLines) {\n\t\t\tif (sourceLine.length === 0) {\n\t\t\t\toutput.push(createLine(\"\", 0, segmentIndex, 0, 0));\n\t\t\t\tsegmentIndex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst maxChars =\n\t\t\t\tmaxWidth <= 0 ? 1 : Math.max(1, Math.floor(maxWidth / charWidth));\n\n\t\t\tfor (let start = 0; start < sourceLine.length; start += maxChars) {\n\t\t\t\tconst text = sourceLine.slice(start, start + maxChars);\n\t\t\t\toutput.push(\n\t\t\t\t\tcreateLine(\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\ttext.length * charWidth,\n\t\t\t\t\t\tsegmentIndex,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + text.length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsegmentIndex += 1;\n\t\t}\n\n\t\tif (output.length === 0) {\n\t\t\toutput.push(createLine(\"\", 0, 0, 0, 0));\n\t\t}\n\n\t\treturn output;\n\t}\n}\n\nfunction getCharacterWidth(style: TextStyleOptions): number {\n\tconst letterSpacing = style.letterSpacing ?? 0;\n\treturn Math.max(0, style.fontSize * 0.6 + letterSpacing);\n}\n\nfunction createLine(\n\ttext: string,\n\twidth: number,\n\tsegmentIndex: number,\n\tstart: number,\n\tend: number,\n): TextLayoutLine {\n\treturn {\n\t\ttext,\n\t\twidth,\n\t\tstart: {\n\t\t\tsegmentIndex,\n\t\t\tgraphemeIndex: start,\n\t\t},\n\t\tend: {\n\t\t\tsegmentIndex,\n\t\t\tgraphemeIndex: end,\n\t\t},\n\t};\n}\n\nfunction assertFinitePositiveLineHeight(lineHeight: number): void {\n\tif (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n\t\tthrow new TypeError(\"lineHeight must be finite and positive\");\n\t}\n}\n","import { createRequire } from \"node:module\";\n\ntype OffscreenCanvasConstructor = typeof globalThis.OffscreenCanvas;\ntype NodeCanvas = import(\"@napi-rs/canvas\").Canvas;\ntype NodeCanvasModule = {\n\tcreateCanvas(width: number, height: number): NodeCanvas;\n};\ntype LoadNodeCanvasModule = () => NodeCanvasModule;\n\nconst require = createRequire(import.meta.url);\n\nexport function installNodeCanvasRuntime(\n\tloadNodeCanvasModule: LoadNodeCanvasModule = loadDefaultNodeCanvasModule,\n): boolean {\n\tif (typeof globalThis.OffscreenCanvas === \"function\") {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst canvasModule = loadNodeCanvasModule();\n\t\tconst { createCanvas } = canvasModule;\n\t\tconst NodeOffscreenCanvas = class {\n\t\t\tprivate readonly canvas: NodeCanvas;\n\n\t\t\tconstructor(width: number, height: number) {\n\t\t\t\tthis.canvas = createCanvas(width, height);\n\t\t\t}\n\n\t\t\tgetContext(contextId: \"2d\") {\n\t\t\t\treturn contextId === \"2d\" ? this.canvas.getContext(\"2d\") : null;\n\t\t\t}\n\t\t};\n\n\t\tglobalThis.OffscreenCanvas =\n\t\t\tNodeOffscreenCanvas as unknown as OffscreenCanvasConstructor;\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction loadDefaultNodeCanvasModule(): NodeCanvasModule {\n\treturn require(\"@napi-rs/canvas\") as NodeCanvasModule;\n}\n","import type { PreparedTextWithSegments } from \"@chenglou/pretext\";\nimport {\n\tlayoutWithLines,\n\tmeasureNaturalWidth,\n\tprepareWithSegments,\n} from \"@chenglou/pretext\";\nimport type {\n\tPreparedText,\n\tTextLayout,\n\tTextMeasurer,\n\tTextStyleOptions,\n} from \"./types.js\";\nimport {\n\tassertFiniteNonNegative,\n\tresolveLineHeight,\n\ttoCanvasFont,\n\tvalidateTextStyle,\n} from \"./types.js\";\n\ntype InternalPretextPrepared = PreparedText & {\n\treadonly pretextPrepared: PreparedTextWithSegments;\n};\n\nconst RUNTIME_UNAVAILABLE = \"text.pretext.runtime-unavailable\";\n\nexport function isPretextRuntimeAvailable(): boolean {\n\treturn (\n\t\ttypeof Intl.Segmenter === \"function\" &&\n\t\ttypeof globalThis.OffscreenCanvas === \"function\"\n\t);\n}\n\nexport class PretextTextMeasurer implements TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText {\n\t\tif (!isPretextRuntimeAvailable()) {\n\t\t\tthrow new TypeError(RUNTIME_UNAVAILABLE);\n\t\t}\n\n\t\tvalidateTextStyle(style);\n\n\t\tconst font = toCanvasFont(style);\n\t\tconst options = {\n\t\t\t...(style.whiteSpace === undefined\n\t\t\t\t? {}\n\t\t\t\t: { whiteSpace: style.whiteSpace }),\n\t\t\t...(style.wordBreak === undefined ? {} : { wordBreak: style.wordBreak }),\n\t\t\t...(style.letterSpacing === undefined\n\t\t\t\t? {}\n\t\t\t\t: { letterSpacing: style.letterSpacing }),\n\t\t};\n\t\tconst prepared = prepareWithSegments(text, font, options);\n\n\t\treturn {\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tstyle: { ...style },\n\t\t\tbackend: \"pretext\",\n\t\t\tpretextPrepared: prepared,\n\t\t} as InternalPretextPrepared;\n\t}\n\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight = resolveLineHeight(prepared.style),\n\t): TextLayout {\n\t\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\t\tif (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n\t\t\tthrow new TypeError(\"lineHeight must be finite and positive\");\n\t\t}\n\n\t\tconst result = layoutWithLines(\n\t\t\ttoInternalPrepared(prepared),\n\t\t\tmaxWidth,\n\t\t\tlineHeight,\n\t\t);\n\t\tconst width = result.lines.reduce(\n\t\t\t(current, line) => Math.max(current, line.width),\n\t\t\t0,\n\t\t);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight: result.height,\n\t\t\tlineHeight,\n\t\t\tlineCount: result.lineCount,\n\t\t\tlines: result.lines.map((line) => ({\n\t\t\t\ttext: line.text,\n\t\t\t\twidth: line.width,\n\t\t\t\tstart: {\n\t\t\t\t\tsegmentIndex: line.start.segmentIndex,\n\t\t\t\t\tgraphemeIndex: line.start.graphemeIndex,\n\t\t\t\t},\n\t\t\t\tend: {\n\t\t\t\t\tsegmentIndex: line.end.segmentIndex,\n\t\t\t\t\tgraphemeIndex: line.end.graphemeIndex,\n\t\t\t\t},\n\t\t\t})),\n\t\t\tdiagnostics: [],\n\t\t};\n\t}\n\n\tnaturalWidth(prepared: PreparedText): number {\n\t\treturn measureNaturalWidth(toInternalPrepared(prepared));\n\t}\n}\n\nfunction toInternalPrepared(prepared: PreparedText): PreparedTextWithSegments {\n\tif (prepared.backend !== \"pretext\" || !(\"pretextPrepared\" in prepared)) {\n\t\tthrow new TypeError(\"prepared text was not created by PretextTextMeasurer\");\n\t}\n\n\treturn prepared.pretextPrepared as PreparedTextWithSegments;\n}\n","import { DeterministicTextMeasurer } from \"./fallback.js\";\nimport { installNodeCanvasRuntime } from \"./node-canvas.js\";\nimport { isPretextRuntimeAvailable, PretextTextMeasurer } from \"./pretext.js\";\nimport type { TextMeasurer } from \"./types.js\";\n\nexport interface DefaultTextMeasurerOptions {\n\tinstallNodeCanvasRuntime?: () => boolean;\n}\n\nexport function createDefaultTextMeasurer(\n\toptions: DefaultTextMeasurerOptions = {},\n): TextMeasurer {\n\tconst installRuntime =\n\t\toptions.installNodeCanvasRuntime ?? installNodeCanvasRuntime;\n\tinstallRuntime();\n\n\treturn isPretextRuntimeAvailable()\n\t\t? new PretextTextMeasurer()\n\t\t: new DeterministicTextMeasurer();\n}\n","import { normalizeInsets } from \"../geometry/index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Insets, Size } from \"../ir/geometry.js\";\nimport type { TextLayout, TextMeasurer } from \"../text/index.js\";\nimport { assertFiniteNonNegative, resolveLineHeight } from \"../text/index.js\";\nimport type { LabelFitOptions, LabelLayout, LabelLineLayout } from \"./types.js\";\n\nexport function fitLabel(\n\ttext: string,\n\toptions: LabelFitOptions,\n\tmeasurer: TextMeasurer,\n): LabelLayout {\n\treturn computeLabelLayout(text, options, measurer);\n}\n\nexport class LabelFitter {\n\tconstructor(private readonly measurer: TextMeasurer) {}\n\n\tfit(text: string, options: LabelFitOptions): LabelLayout {\n\t\treturn computeLabelLayout(text, options, this.measurer);\n\t}\n}\n\nfunction computeLabelLayout(\n\ttext: string,\n\toptions: LabelFitOptions,\n\tmeasurer: TextMeasurer,\n): LabelLayout {\n\tconst padding = normalizeInsets(options.padding);\n\tconst minSize = normalizeMinSize(options.minSize);\n\tconst lineHeight = resolveLineHeight(options.font);\n\tconst maxWidth = normalizeMaxWidth(options.maxWidth);\n\tconst prepared = measurer.prepare(text, options.font);\n\tconst naturalTextWidth = measurer.naturalWidth(prepared);\n\tconst contentMaxWidth =\n\t\tmaxWidth === undefined\n\t\t\t? naturalTextWidth\n\t\t\t: Math.max(0, maxWidth - padding.left - padding.right);\n\tconst textLayout = measurer.layout(prepared, contentMaxWidth, lineHeight);\n\tconst naturalSize = {\n\t\twidth: naturalTextWidth,\n\t\theight: textLayout.height,\n\t};\n\tconst contentWidth = Math.max(\n\t\ttextLayout.width,\n\t\tminContentWidth(minSize, padding),\n\t);\n\tconst contentHeight = Math.max(\n\t\ttextLayout.height,\n\t\tminContentHeight(minSize, padding),\n\t);\n\tconst idealWidth = contentWidth + padding.left + padding.right;\n\tconst idealHeight = contentHeight + padding.top + padding.bottom;\n\tconst fittedSize = {\n\t\twidth: maxWidth === undefined ? idealWidth : Math.min(maxWidth, idealWidth),\n\t\theight: idealHeight,\n\t};\n\tconst box: Box = {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: fittedSize.width,\n\t\theight: fittedSize.height,\n\t};\n\tconst contentBox: Box = {\n\t\tx: padding.left,\n\t\ty: padding.top,\n\t\twidth: Math.max(0, box.width - padding.left - padding.right),\n\t\theight: Math.max(0, box.height - padding.top - padding.bottom),\n\t};\n\tconst overflow = {\n\t\thorizontal: textLayout.width > contentBox.width,\n\t\tvertical:\n\t\t\ttextLayout.height > contentBox.height ||\n\t\t\tdiagnosedHeightConstraintOverflow(textLayout.height, padding, minSize),\n\t\ttruncated:\n\t\t\toptions.overflow === \"truncate\" && textLayout.width > contentBox.width,\n\t};\n\tconst diagnostics = buildDiagnostics(overflow, options.overflow);\n\n\treturn {\n\t\ttext,\n\t\tbox,\n\t\tcontentBox,\n\t\tnaturalSize,\n\t\tfittedSize,\n\t\tpadding,\n\t\tfont: { ...options.font },\n\t\ttextBackend: prepared.backend,\n\t\tlineHeight,\n\t\tlines: buildLines(textLayout, contentBox, lineHeight),\n\t\toverflow,\n\t\tdiagnostics,\n\t};\n}\n\nfunction buildLines(\n\ttextLayout: TextLayout,\n\tcontentBox: Box,\n\tlineHeight: number,\n): LabelLineLayout[] {\n\treturn textLayout.lines.map((line, lineIndex) => ({\n\t\ttext: line.text,\n\t\tbox: {\n\t\t\tx: contentBox.x,\n\t\t\ty: contentBox.y + lineIndex * lineHeight,\n\t\t\twidth: line.width,\n\t\t\theight: lineHeight,\n\t\t},\n\t\tbaselineY: contentBox.y + lineIndex * lineHeight + lineHeight * 0.8,\n\t\twidth: line.width,\n\t\tlineIndex,\n\t\tsourceStart: { ...line.start },\n\t\tsourceEnd: { ...line.end },\n\t}));\n}\n\nfunction normalizeMinSize(minSize: Partial<Size> = {}): Partial<Size> {\n\tif (minSize.width !== undefined) {\n\t\tassertFiniteNonNegative(minSize.width, \"minSize.width\");\n\t}\n\n\tif (minSize.height !== undefined) {\n\t\tassertFiniteNonNegative(minSize.height, \"minSize.height\");\n\t}\n\n\treturn { ...minSize };\n}\n\nfunction normalizeMaxWidth(maxWidth: number | undefined): number | undefined {\n\tif (maxWidth === undefined) {\n\t\treturn undefined;\n\t}\n\n\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\n\treturn maxWidth;\n}\n\nfunction minContentWidth(minSize: Partial<Size>, padding: Insets): number {\n\treturn Math.max(0, (minSize.width ?? 0) - padding.left - padding.right);\n}\n\nfunction minContentHeight(minSize: Partial<Size>, padding: Insets): number {\n\treturn Math.max(0, (minSize.height ?? 0) - padding.top - padding.bottom);\n}\n\nfunction diagnosedHeightConstraintOverflow(\n\ttextHeight: number,\n\tpadding: Insets,\n\tminSize: Partial<Size>,\n): boolean {\n\treturn (\n\t\tminSize.height !== undefined &&\n\t\ttextHeight + padding.top + padding.bottom > minSize.height\n\t);\n}\n\nfunction buildDiagnostics(\n\toverflow: LabelLayout[\"overflow\"],\n\tmode: LabelFitOptions[\"overflow\"] = \"allow\",\n): Diagnostic[] {\n\tif (mode !== \"diagnose\") {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: Diagnostic[] = [];\n\n\tif (overflow.horizontal) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"label.overflow.horizontal\",\n\t\t\tmessage: \"Label text exceeds the fitted content width.\",\n\t\t});\n\t}\n\n\tif (overflow.vertical) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"label.overflow.vertical\",\n\t\t\tmessage: \"Label text exceeds the fitted content height.\",\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n","import type { Constraint } from \"../ir/constraints.js\";\nimport type { NormalizedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tEvidenceCell,\n\tEvidencePanel,\n\tEvidencePanelItem,\n\tLabel,\n\tMatrixBlock,\n\tNodeCompartments,\n\tNodePort,\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n\tSwimlane,\n\tTableBlock,\n\tTableColumn,\n\tTableRow,\n\tVisualStyle,\n} from \"../ir/elements.js\";\nimport type { Insets, Point, Size } from \"../ir/geometry.js\";\nimport { fitLabel } from \"../labels/index.js\";\nimport { createDefaultTextMeasurer, type TextMeasurer } from \"../text/index.js\";\nimport { sortDslDiagnostics } from \"./diagnostics.js\";\nimport type { DiagramDsl } from \"./schema.js\";\nimport type { DslDiagnostic, NormalizeDiagramDslResult } from \"./types.js\";\n\nexport const DEFAULT_NODE_PADDING: Insets = {\n\ttop: 12,\n\tright: 16,\n\tbottom: 12,\n\tleft: 16,\n};\nexport const DEFAULT_NODE_MIN_SIZE: Size = { width: 80, height: 40 };\nconst DEFAULT_GROUP_PADDING: Insets = {\n\ttop: 16,\n\tright: 16,\n\tbottom: 16,\n\tleft: 16,\n};\nexport const DEFAULT_LABEL_MAX_WIDTH = 160;\nexport const DEFAULT_FONT = {\n\tfontFamily: \"Arial\",\n\tfontSize: 14,\n\tlineHeight: 18,\n};\nconst DEFAULT_MATRIX_CELL_SIZE: Size = { width: 120, height: 36 };\nconst DEFAULT_TABLE_CELL_SIZE: Size = { width: 128, height: 34 };\nconst DEFAULT_PANEL_ITEM_HEIGHT = 28;\n\nexport interface NormalizeDiagramDslOptions {\n\tid?: string;\n\ttextMeasurer?: TextMeasurer;\n}\n\nexport function normalizeDiagramDsl(\n\tdslValue: unknown,\n\toptions: NormalizeDiagramDslOptions = {},\n): NormalizeDiagramDslResult {\n\tconst dsl = dslValue as DiagramDsl;\n\tconst diagnostics = validateReferences(dsl);\n\tif (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) {\n\t\treturn {\n\t\t\tdiagnostics: sortDslDiagnostics(diagnostics),\n\t\t\t...outputResult(dsl),\n\t\t};\n\t}\n\n\tconst measurer = options.textMeasurer ?? createDefaultTextMeasurer();\n\tconst routeKind = dsl.routing?.kind ?? \"orthogonal\";\n\tconst portShifting = normalizePortShifting(dsl.routing?.portShifting);\n\tconst initialLayout = dsl.layout?.mode;\n\tconst primaryReadingDirection = dsl.layout?.primaryReadingDirection;\n\tconst matrices = normalizeMatrices(dsl);\n\tconst tables = normalizeTables(dsl);\n\tconst evidencePanels = normalizeEvidencePanels(dsl);\n\tconst diagram: NormalizedDiagram = {\n\t\tid: options.id ?? dsl.id ?? \"diagram\",\n\t\t...(dsl.title === undefined ? {} : { title: dsl.title }),\n\t\tdirection: dsl.layout?.direction ?? dsl.direction ?? \"TB\",\n\t\tnodes: normalizeNodes(dsl, measurer),\n\t\tedges: normalizeEdges(dsl),\n\t\tgroups: normalizeGroups(dsl, measurer),\n\t\tswimlanes: normalizeSwimlanes(dsl),\n\t\t...(matrices === undefined ? {} : { matrices }),\n\t\t...(tables === undefined ? {} : { tables }),\n\t\t...(evidencePanels === undefined ? {} : { evidencePanels }),\n\t\tconstraints: normalizeConstraints(dsl),\n\t\tdiagnostics: [],\n\t\t...(dsl.frame === undefined ? {} : { frame: normalizeFrame(dsl.frame) }),\n\t\tmetadata: {\n\t\t\trouteKind,\n\t\t\t...(initialLayout === undefined ? {} : { initialLayout }),\n\t\t\t...(primaryReadingDirection === undefined\n\t\t\t\t? {}\n\t\t\t\t: { primaryReadingDirection }),\n\t\t\t...(portShifting === undefined ? {} : { portShifting }),\n\t\t},\n\t};\n\n\treturn {\n\t\tdiagram,\n\t\tdiagnostics: [],\n\t\t...outputResult(dsl),\n\t};\n}\n\nfunction normalizePortShifting(\n\tportShifting: NonNullable<DiagramDsl[\"routing\"]>[\"portShifting\"] | undefined,\n):\n\t| {\n\t\t\tenabled?: boolean;\n\t\t\tspacing?: number;\n\t }\n\t| undefined {\n\tif (portShifting === undefined) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(portShifting.enabled === undefined\n\t\t\t? {}\n\t\t\t: { enabled: portShifting.enabled }),\n\t\t...(portShifting.spacing === undefined\n\t\t\t? {}\n\t\t\t: { spacing: portShifting.spacing }),\n\t};\n}\n\nfunction outputResult(\n\tdsl: DiagramDsl,\n): Pick<NormalizeDiagramDslResult, \"output\"> {\n\treturn dsl.output?.format === undefined\n\t\t? {}\n\t\t: { output: { format: dsl.output.format } };\n}\n\nfunction normalizeNodes(\n\tdsl: DiagramDsl,\n\tmeasurer: TextMeasurer,\n): NormalizedNode[] {\n\treturn Object.keys(dsl.nodes)\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst node = dsl.nodes[id];\n\t\t\tconst label = toLabel(node?.label);\n\t\t\tconst labelLayout =\n\t\t\t\tlabel === undefined ? undefined : fitDslLabel(label, measurer);\n\t\t\tconst fittedSize = labelLayout?.fittedSize;\n\t\t\tconst nodeCompartments =\n\t\t\t\tnode?.compartments === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: compartments(node.compartments);\n\t\t\tconst compartmentWidth =\n\t\t\t\tnodeCompartments === undefined\n\t\t\t\t\t? 0\n\t\t\t\t\t: compartmentNaturalWidth(id, label, nodeCompartments, measurer);\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tshape: node?.shape ?? \"rectangle\",\n\t\t\t\t...(node?.position === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { position: point(node.position) }),\n\t\t\t\t...(node?.style === undefined ? {} : { style: style(node.style) }),\n\t\t\t\t...(node?.ports === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { ports: normalizePorts(node.ports) }),\n\t\t\t\t...(nodeCompartments === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { compartments: nodeCompartments }),\n\t\t\t\tsize: {\n\t\t\t\t\twidth: Math.max(\n\t\t\t\t\t\tDEFAULT_NODE_MIN_SIZE.width,\n\t\t\t\t\t\tfittedSize?.width ?? 0,\n\t\t\t\t\t\tcompartmentWidth,\n\t\t\t\t\t),\n\t\t\t\t\theight: Math.max(\n\t\t\t\t\t\tnodeCompartments === undefined\n\t\t\t\t\t\t\t? DEFAULT_NODE_MIN_SIZE.height\n\t\t\t\t\t\t\t: compartmentHeight(nodeCompartments),\n\t\t\t\t\t\tfittedSize?.height ?? 0,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tpadding: { ...DEFAULT_NODE_PADDING },\n\t\t\t\t...(labelLayout === undefined ? {} : { labelLayout }),\n\t\t\t};\n\t\t});\n}\n\nfunction compartmentHeight(value: NodeCompartments): number {\n\tconst rowCount =\n\t\t(value.stereotype === undefined ? 0 : 1) +\n\t\t1 +\n\t\t(value.properties?.length ?? 0) +\n\t\t(value.constraints?.length ?? 0);\n\tconst rowHeight = 16;\n\tconst verticalPadding = 20;\n\treturn Math.max(\n\t\tDEFAULT_NODE_MIN_SIZE.height,\n\t\trowCount * rowHeight + verticalPadding,\n\t);\n}\n\nfunction compartmentNaturalWidth(\n\tid: string,\n\tlabel: Label | undefined,\n\tvalue: NodeCompartments,\n\tmeasurer: TextMeasurer,\n): number {\n\tconst rows = compartmentRows(id, label, value);\n\tconst maxRowWidth = rows.reduce((width, row) => {\n\t\tconst prepared = measurer.prepare(row, DEFAULT_FONT);\n\t\treturn Math.max(width, measurer.naturalWidth(prepared));\n\t}, 0);\n\treturn Math.ceil(\n\t\tmaxRowWidth + DEFAULT_NODE_PADDING.left + DEFAULT_NODE_PADDING.right,\n\t);\n}\n\nfunction compartmentRows(\n\tid: string,\n\tlabel: Label | undefined,\n\tvalue: NodeCompartments,\n): string[] {\n\treturn [\n\t\t...(value.stereotype === undefined ? [] : [value.stereotype]),\n\t\tvalue.name ?? label?.text ?? id,\n\t\t...(value.properties ?? []),\n\t\t...(value.constraints ?? []),\n\t];\n}\n\nfunction normalizeEdges(dsl: DiagramDsl): NormalizedEdge[] {\n\tconst counts = new Map<string, number>();\n\n\treturn (dsl.edges ?? []).map((edge) => {\n\t\tconst source = typeof edge === \"string\" ? undefined : edge.source;\n\t\tconst target = typeof edge === \"string\" ? undefined : edge.target;\n\t\tconst sourceId =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? \"\"\n\t\t\t\t: (edge.sourceId ?? endpointNodeId(source) ?? \"\");\n\t\tconst targetId =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? \"\"\n\t\t\t\t: (edge.targetId ?? endpointNodeId(target) ?? \"\");\n\t\tconst sourceEndpoint =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? { nodeId: sourceId }\n\t\t\t\t: endpoint(source, edge.sourceId);\n\t\tconst targetEndpoint =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? { nodeId: targetId }\n\t\t\t\t: endpoint(target, edge.targetId);\n\t\tconst baseId = `${sourceId}-${targetId}`;\n\t\tconst count = counts.get(baseId) ?? 0;\n\t\tcounts.set(baseId, count + 1);\n\t\tconst id =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? baseId\n\t\t\t\t: (edge.id ?? (count === 0 ? baseId : `${baseId}-${count + 1}`));\n\t\tconst label = typeof edge === \"string\" ? undefined : toLabel(edge.label);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tsource: sourceEndpoint,\n\t\t\ttarget: targetEndpoint,\n\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t...(typeof edge === \"string\" || edge.style === undefined\n\t\t\t\t? {}\n\t\t\t\t: { style: edge.style }),\n\t\t\t...(typeof edge === \"string\" || edge.arrowhead === undefined\n\t\t\t\t? {}\n\t\t\t\t: { arrowhead: edge.arrowhead }),\n\t\t};\n\t});\n}\n\nfunction normalizePorts(\n\tports: NonNullable<DiagramDsl[\"nodes\"][string]>[\"ports\"],\n): NodePort[] {\n\treturn Object.keys(ports ?? {})\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst port = ports?.[id];\n\t\t\tconst label = toLabel(port?.label);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tside: port?.side ?? \"right\",\n\t\t\t\tkind: port?.kind ?? \"proxy\",\n\t\t\t\t...(port?.order === undefined ? {} : { order: port.order }),\n\t\t\t\t...(port?.style === undefined ? {} : { style: style(port.style) }),\n\t\t\t};\n\t\t});\n}\n\nfunction endpoint(\n\tvalue: string | { node: string; port?: string | undefined } | undefined,\n\tnodeIdOverride?: string | undefined,\n): NormalizedEdge[\"source\"] {\n\tif (nodeIdOverride !== undefined) {\n\t\treturn {\n\t\t\tnodeId: nodeIdOverride,\n\t\t\t...(typeof value === \"object\" &&\n\t\t\tvalue.node === nodeIdOverride &&\n\t\t\tvalue.port !== undefined\n\t\t\t\t? { portId: value.port }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\tif (value === undefined) {\n\t\treturn { nodeId: \"\" };\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn { nodeId: value };\n\t}\n\treturn {\n\t\tnodeId: value.node,\n\t\t...(value.port === undefined ? {} : { portId: value.port }),\n\t};\n}\n\nfunction style(value: {\n\tfill?: string | undefined;\n\tstroke?: string | undefined;\n\tfontFamily?: string | undefined;\n\tfontSize?: number | undefined;\n}): VisualStyle {\n\treturn {\n\t\t...(value.fill === undefined ? {} : { fill: value.fill }),\n\t\t...(value.stroke === undefined ? {} : { stroke: value.stroke }),\n\t\t...(value.fontFamily === undefined ? {} : { fontFamily: value.fontFamily }),\n\t\t...(value.fontSize === undefined ? {} : { fontSize: value.fontSize }),\n\t};\n}\n\nfunction compartments(value: {\n\tstereotype?: string | undefined;\n\tname?: string | undefined;\n\tproperties?: Array<Record<string, string> | string> | undefined;\n\tconstraints?: string[] | undefined;\n}): NodeCompartments {\n\treturn {\n\t\t...(value.stereotype === undefined ? {} : { stereotype: value.stereotype }),\n\t\t...(value.name === undefined ? {} : { name: value.name }),\n\t\t...(value.properties === undefined\n\t\t\t? {}\n\t\t\t: { properties: value.properties.map(formatCompartmentEntry) }),\n\t\t...(value.constraints === undefined\n\t\t\t? {}\n\t\t\t: { constraints: [...value.constraints] }),\n\t};\n}\n\nfunction normalizeFrame(frame: NonNullable<DiagramDsl[\"frame\"]>) {\n\treturn {\n\t\tkind: frame.kind,\n\t\t...(frame.context === undefined ? {} : { context: frame.context }),\n\t\t...(frame.name === undefined ? {} : { name: frame.name }),\n\t\ttitleTab: frame.titleTab,\n\t\t...(frame.headerHeight === undefined\n\t\t\t? {}\n\t\t\t: { headerHeight: frame.headerHeight }),\n\t\t...(frame.padding === undefined ? {} : { padding: frame.padding }),\n\t\t...(frame.labelPosition === undefined\n\t\t\t? {}\n\t\t\t: { labelPosition: frame.labelPosition }),\n\t\t...(frame.direction === undefined ? {} : { direction: frame.direction }),\n\t\t...(frame.style === undefined ? {} : { style: style(frame.style) }),\n\t};\n}\n\nfunction formatCompartmentEntry(\n\tvalue: Record<string, string> | string,\n): string {\n\tif (typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tconst [entry] = Object.entries(value);\n\tif (entry === undefined) {\n\t\treturn \"\";\n\t}\n\treturn `${entry[0]}: ${entry[1]}`;\n}\n\nfunction normalizeSwimlanes(dsl: DiagramDsl): Swimlane[] {\n\treturn Object.keys(dsl.swimlanes ?? {}).map((id) => {\n\t\tconst swimlane = dsl.swimlanes?.[id];\n\t\tconst label = toLabel(swimlane?.label);\n\t\treturn {\n\t\t\tid,\n\t\t\t...(label === undefined ? {} : { label }),\n\t\t\torientation: swimlane?.orientation ?? \"vertical\",\n\t\t\tlayout: swimlane?.layout ?? \"overlay\",\n\t\t\t...(swimlane?.headerHeight === undefined\n\t\t\t\t? {}\n\t\t\t\t: { headerHeight: swimlane.headerHeight }),\n\t\t\t...(swimlane?.padding === undefined ? {} : { padding: swimlane.padding }),\n\t\t\tlanes: Object.keys(swimlane?.lanes ?? {}).map((laneId) => {\n\t\t\t\tconst lane = swimlane?.lanes[laneId];\n\t\t\t\tconst laneLabel = toLabel(lane?.label);\n\t\t\t\treturn {\n\t\t\t\t\tid: laneId,\n\t\t\t\t\t...(laneLabel === undefined ? {} : { label: laneLabel }),\n\t\t\t\t\tchildren: [...(lane?.children ?? [])],\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\nfunction normalizeMatrices(dsl: DiagramDsl): MatrixBlock[] | undefined {\n\tif (dsl.matrices === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.matrices.map((matrix) => ({\n\t\tid: matrix.id,\n\t\trows: [...matrix.rows],\n\t\tcols: [...matrix.cols],\n\t\tcells: matrix.cells.map((row) => row.map(cell)),\n\t\t...(matrix.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(matrix.position) }),\n\t\tsize: matrix.size ?? {\n\t\t\twidth:\n\t\t\t\tdefaultMatrixRowHeaderWidth(matrix) +\n\t\t\t\tMath.max(1, matrix.cols.length) * DEFAULT_MATRIX_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, matrix.rows.length + 1) * DEFAULT_MATRIX_CELL_SIZE.height,\n\t\t},\n\t\t...(matrix.style === undefined ? {} : { style: style(matrix.style) }),\n\t}));\n}\n\nfunction defaultMatrixRowHeaderWidth(matrix: {\n\trows: readonly string[];\n}): number {\n\treturn matrix.rows.length === 0\n\t\t? 0\n\t\t: Math.min(96, DEFAULT_MATRIX_CELL_SIZE.width);\n}\n\nfunction normalizeTables(dsl: DiagramDsl): TableBlock[] | undefined {\n\tif (dsl.tables === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.tables.map((table) => ({\n\t\tid: table.id,\n\t\tcolumns: table.columns.map(tableColumn),\n\t\trows: table.rows.map(tableRow),\n\t\t...(table.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(table.position) }),\n\t\tsize: table.size ?? {\n\t\t\twidth: Math.max(1, table.columns.length) * DEFAULT_TABLE_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, table.rows.length + 1) * DEFAULT_TABLE_CELL_SIZE.height,\n\t\t},\n\t\t...(table.style === undefined ? {} : { style: style(table.style) }),\n\t}));\n}\n\nfunction normalizeEvidencePanels(dsl: DiagramDsl): EvidencePanel[] | undefined {\n\tif (dsl.evidencePanels === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.evidencePanels.map((panel) => ({\n\t\tid: panel.id,\n\t\tkind: panel.kind,\n\t\titems: panel.items.map(panelItem),\n\t\t...(panel.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(panel.position) }),\n\t\tsize: panel.size ?? {\n\t\t\twidth: 320,\n\t\t\theight: Math.max(1, panel.items.length) * DEFAULT_PANEL_ITEM_HEIGHT,\n\t\t},\n\t\t...(panel.style === undefined ? {} : { style: style(panel.style) }),\n\t}));\n}\n\nfunction cell(value: string | CellObject): EvidenceCell {\n\tif (typeof value === \"string\") {\n\t\treturn { text: value };\n\t}\n\n\treturn {\n\t\ttext: value.text,\n\t\t...(value.style === undefined &&\n\t\tvalue.fill === undefined &&\n\t\tvalue.stroke === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tstyle: style({\n\t\t\t\t\t\t...value.style,\n\t\t\t\t\t\t...(value.fill === undefined ? {} : { fill: value.fill }),\n\t\t\t\t\t\t...(value.stroke === undefined ? {} : { stroke: value.stroke }),\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t};\n}\n\nfunction tableColumn(value: {\n\tid: string;\n\tlabel: string | { text: string; maxWidth?: number | undefined };\n}): TableColumn {\n\treturn {\n\t\tid: value.id,\n\t\tlabel: toLabel(value.label) ?? { text: value.id },\n\t};\n}\n\nfunction tableRow(value: {\n\tid: string;\n\tcells: Record<string, string | CellObject>;\n}): TableRow {\n\treturn {\n\t\tid: value.id,\n\t\tcells: Object.fromEntries(\n\t\t\tObject.keys(value.cells).map((columnId) => [\n\t\t\t\tcolumnId,\n\t\t\t\tcell(value.cells[columnId] ?? \"\"),\n\t\t\t]),\n\t\t),\n\t};\n}\n\nfunction panelItem(\n\tvalue:\n\t\t| string\n\t\t| {\n\t\t\t\tid?: string | undefined;\n\t\t\t\tlabel: string | { text: string; maxWidth?: number | undefined };\n\t\t\t\tdetail?:\n\t\t\t\t\t| string\n\t\t\t\t\t| { text: string; maxWidth?: number | undefined }\n\t\t\t\t\t| undefined;\n\t\t\t\tstyle?:\n\t\t\t\t\t| { fill?: string | undefined; stroke?: string | undefined }\n\t\t\t\t\t| undefined;\n\t\t },\n): EvidencePanelItem {\n\tif (typeof value === \"string\") {\n\t\treturn { label: { text: value } };\n\t}\n\n\tconst detail = toLabel(value.detail);\n\treturn {\n\t\t...(value.id === undefined ? {} : { id: value.id }),\n\t\tlabel: toLabel(value.label) ?? { text: \"\" },\n\t\t...(detail === undefined ? {} : { detail }),\n\t\t...(value.style === undefined ? {} : { style: style(value.style) }),\n\t};\n}\n\ntype CellObject = {\n\ttext: string;\n\tfill?: string | undefined;\n\tstroke?: string | undefined;\n\tstyle?:\n\t\t| { fill?: string | undefined; stroke?: string | undefined }\n\t\t| undefined;\n};\n\nfunction normalizeGroups(\n\tdsl: DiagramDsl,\n\tmeasurer: TextMeasurer,\n): NormalizedGroup[] {\n\treturn Object.keys(dsl.groups ?? {})\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst group = dsl.groups?.[id];\n\t\t\tconst label = toLabel(group?.label);\n\t\t\tconst labelLayout =\n\t\t\t\tlabel === undefined ? undefined : fitDslLabel(label, measurer);\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tnodeIds: [...(group?.nodes ?? [])],\n\t\t\t\tgroupIds: [...(group?.groups ?? [])],\n\t\t\t\tpadding: group?.padding ?? { ...DEFAULT_GROUP_PADDING },\n\t\t\t\t...(group?.headerHeight === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { headerHeight: group.headerHeight }),\n\t\t\t\t...(group?.labelPosition === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { labelPosition: group.labelPosition }),\n\t\t\t\t...(group?.direction === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { direction: group.direction }),\n\t\t\t\t...(labelLayout === undefined ? {} : { labelLayout }),\n\t\t\t};\n\t\t});\n}\n\nfunction normalizeConstraints(dsl: DiagramDsl): Constraint[] {\n\tconst constraints: Constraint[] = [];\n\n\tfor (const constraint of dsl.constraints ?? []) {\n\t\tswitch (constraint.kind) {\n\t\t\tcase \"exact-position\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"exact-position\",\n\t\t\t\t\ttargetId: constraint.targetId ?? constraint.target ?? \"\",\n\t\t\t\t\tposition: point(constraint.position),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"relative-position\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"relative-position\",\n\t\t\t\t\tsourceId: constraint.sourceId ?? constraint.source ?? \"\",\n\t\t\t\t\treferenceId: constraint.referenceId ?? constraint.reference ?? \"\",\n\t\t\t\t\trelation: constraint.relation,\n\t\t\t\t\t...(constraint.offset === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { offset: point(constraint.offset) }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"align\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"align\",\n\t\t\t\t\taxis: constraint.axis,\n\t\t\t\t\ttargetIds: [...(constraint.targetIds ?? constraint.targets ?? [])],\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"distribute\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"distribute\",\n\t\t\t\t\taxis: constraint.axis,\n\t\t\t\t\ttargetIds: [...(constraint.targetIds ?? constraint.targets ?? [])],\n\t\t\t\t\t...(constraint.spacing === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { spacing: constraint.spacing }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"containment\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"containment\",\n\t\t\t\t\tcontainerId: constraint.containerId ?? constraint.container ?? \"\",\n\t\t\t\t\tchildIds: [...(constraint.childIds ?? constraint.children ?? [])],\n\t\t\t\t\t...(constraint.padding === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { padding: constraint.padding }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn constraints;\n}\n\nfunction validateReferences(dsl: DiagramDsl): DslDiagnostic[] {\n\tconst diagnostics: DslDiagnostic[] = [];\n\tconst nodeIds = new Set(Object.keys(dsl.nodes));\n\tconst groupIds = new Set(Object.keys(dsl.groups ?? {}));\n\n\t(dsl.edges ?? []).forEach((edge, index) => {\n\t\tif (typeof edge === \"string\") {\n\t\t\treturn;\n\t\t}\n\t\tconst sourceId = edge.sourceId ?? endpointNodeId(edge.source);\n\t\tconst targetId = edge.targetId ?? endpointNodeId(edge.target);\n\t\tconst sourceEndpoint = endpoint(edge.source, edge.sourceId);\n\t\tconst targetEndpoint = endpoint(edge.target, edge.targetId);\n\t\tif (sourceId !== undefined && !nodeIds.has(sourceId)) {\n\t\t\tdiagnostics.push(referenceMissing([\"edges\", index, \"source\"], sourceId));\n\t\t}\n\t\tif (targetId !== undefined && !nodeIds.has(targetId)) {\n\t\t\tdiagnostics.push(referenceMissing([\"edges\", index, \"target\"], targetId));\n\t\t}\n\t\tvalidateEndpointPort(\n\t\t\tdsl,\n\t\t\tsourceEndpoint,\n\t\t\t[\"edges\", index, \"source\"],\n\t\t\tdiagnostics,\n\t\t);\n\t\tvalidateEndpointPort(\n\t\t\tdsl,\n\t\t\ttargetEndpoint,\n\t\t\t[\"edges\", index, \"target\"],\n\t\t\tdiagnostics,\n\t\t);\n\t});\n\n\tfor (const [groupId, group] of Object.entries(dsl.groups ?? {})) {\n\t\t(group.nodes ?? []).forEach((nodeId, index) => {\n\t\t\tif (!nodeIds.has(nodeId)) {\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\treferenceMissing([\"groups\", groupId, \"nodes\", index], nodeId),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\t(group.groups ?? []).forEach((childGroupId, index) => {\n\t\t\tif (!groupIds.has(childGroupId)) {\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\treferenceMissing([\"groups\", groupId, \"groups\", index], childGroupId),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tfor (const [swimlaneId, swimlane] of Object.entries(dsl.swimlanes ?? {})) {\n\t\tfor (const [laneId, lane] of Object.entries(swimlane.lanes)) {\n\t\t\t(lane.children ?? []).forEach((child, childIndex) => {\n\t\t\t\tif (!nodeIds.has(child)) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\"swimlanes\",\n\t\t\t\t\t\t\t\tswimlaneId,\n\t\t\t\t\t\t\t\t\"lanes\",\n\t\t\t\t\t\t\t\tlaneId,\n\t\t\t\t\t\t\t\t\"children\",\n\t\t\t\t\t\t\t\tchildIndex,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t(dsl.constraints ?? []).forEach((constraint, index) => {\n\t\tswitch (constraint.kind) {\n\t\t\tcase \"exact-position\": {\n\t\t\t\tconst target = constraint.targetId ?? constraint.target;\n\t\t\t\tif (\n\t\t\t\t\ttarget !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(target, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"target\"], target),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"relative-position\": {\n\t\t\t\tconst source = constraint.sourceId ?? constraint.source;\n\t\t\t\tconst reference = constraint.referenceId ?? constraint.reference;\n\t\t\t\tif (\n\t\t\t\t\tsource !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(source, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"source\"], source),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\treference !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(reference, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"reference\"], reference),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"align\":\n\t\t\tcase \"distribute\":\n\t\t\t\t(constraint.targetIds ?? constraint.targets ?? []).forEach(\n\t\t\t\t\t(target, targetIndex) => {\n\t\t\t\t\t\tif (!hasNodeOrGroup(target, nodeIds, groupIds)) {\n\t\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t\t\t[\"constraints\", index, \"targets\", targetIndex],\n\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"containment\": {\n\t\t\t\tconst container = constraint.containerId ?? constraint.container;\n\t\t\t\tif (container !== undefined) {\n\t\t\t\t\tif (!nodeIds.has(container)) {\n\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"container\"], container),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t(constraint.childIds ?? constraint.children ?? []).forEach(\n\t\t\t\t\t(child, childIndex) => {\n\t\t\t\t\t\tif (!hasNodeOrGroup(child, nodeIds, groupIds)) {\n\t\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t\t\t[\"constraints\", index, \"children\", childIndex],\n\t\t\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn sortDslDiagnostics(diagnostics);\n}\n\nfunction referenceMissing(\n\tpath: Array<string | number>,\n\tid: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"validate\",\n\t\tcode: \"validate.reference.missing\",\n\t\tmessage: `Reference \"${id}\" does not exist.`,\n\t\tpath,\n\t\thint: \"Define the referenced node or group id, or update this reference.\",\n\t};\n}\n\nfunction hasNodeOrGroup(\n\tid: string,\n\tnodeIds: ReadonlySet<string>,\n\tgroupIds: ReadonlySet<string>,\n\tswimlaneLaneIds: ReadonlySet<string> = new Set(),\n): boolean {\n\treturn nodeIds.has(id) || groupIds.has(id) || swimlaneLaneIds.has(id);\n}\n\nfunction endpointNodeId(\n\tendpointValue:\n\t\t| string\n\t\t| { node: string; port?: string | undefined }\n\t\t| undefined,\n): string | undefined {\n\tif (typeof endpointValue === \"string\" || endpointValue === undefined) {\n\t\treturn endpointValue;\n\t}\n\treturn endpointValue.node;\n}\n\nfunction validateEndpointPort(\n\tdsl: DiagramDsl,\n\tendpointValue: NormalizedEdge[\"source\"],\n\tpath: Array<string | number>,\n\tdiagnostics: DslDiagnostic[],\n): void {\n\tif (endpointValue.portId === undefined) {\n\t\treturn;\n\t}\n\n\tconst node = dsl.nodes[endpointValue.nodeId];\n\tif (node !== undefined && node.ports?.[endpointValue.portId] === undefined) {\n\t\tdiagnostics.push(referenceMissing([...path, \"port\"], endpointValue.portId));\n\t}\n}\n\nfunction toLabel(\n\tvalue: DiagramDsl[\"nodes\"][string][\"label\"],\n): Label | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof value === \"string\") {\n\t\treturn { text: value };\n\t}\n\n\treturn value.maxWidth === undefined\n\t\t? { text: value.text }\n\t\t: { text: value.text, maxWidth: value.maxWidth };\n}\n\nfunction fitDslLabel(label: Label, measurer: TextMeasurer) {\n\treturn fitLabel(\n\t\tlabel.text,\n\t\t{\n\t\t\tfont: DEFAULT_FONT,\n\t\t\tpadding: DEFAULT_NODE_PADDING,\n\t\t\tminSize: DEFAULT_NODE_MIN_SIZE,\n\t\t\tmaxWidth: label.maxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n\t\t},\n\t\tmeasurer,\n\t);\n}\n\nfunction point(value: Point): Point {\n\treturn { x: value.x, y: value.y };\n}\n","import type { JsonObject } from \"./geometry.js\";\n\nexport type DiagnosticSeverity = \"info\" | \"warning\" | \"error\";\n\nexport type DiagnosticPathSegment = string | number;\n\nexport interface Diagnostic {\n\tseverity: DiagnosticSeverity;\n\tcode: string;\n\tmessage: string;\n\tpath?: DiagnosticPathSegment[];\n\tdetail?: JsonObject;\n}\n\n/**\n * Diagnostic codes that indicate the solver produced a degraded\n * (non-deliverable) layout. Downstream consumers can gate on the\n * {@link CoordinatedDiagram.degraded} flag or use the\n * {@link SolveDiagramOptions.strict} option to promote these to\n * errors.\n */\nexport const DELIVERABILITY_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set([\n\t\"constraints.locked-target-not-moved\",\n\t\"constraints.overlap.locked-conflict\",\n\t\"routing.evidence.crossing_forbidden\",\n\t\"routing.obstacle.unavoidable\",\n\t\"route_obstacle_fallback\",\n\t\"routing.text-clearance.unresolved\",\n]);\n","import type { EdgeLabel, GraphLabel, NodeLabel } from \"@dagrejs/dagre\";\nimport { Graph, layout } from \"@dagrejs/dagre\";\nimport { unionBoxes } from \"../geometry/index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box } from \"../ir/geometry.js\";\nimport type {\n\tDagreLayoutEdge,\n\tDagreLayoutInput,\n\tDagreLayoutNode,\n\tDagreLayoutOptions,\n\tInitialLayoutResult,\n} from \"./types.js\";\n\nconst DEFAULT_OPTIONS: DagreLayoutOptions = {\n\tnodesep: 80,\n\tranksep: 100,\n\tedgesep: 40,\n\tmarginx: 0,\n\tmarginy: 0,\n\tcomponentGap: 160,\n\tranker: \"network-simplex\",\n};\n\nexport function runDagreInitialLayout(\n\tinput: DagreLayoutInput,\n): InitialLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst validNodeIds = new Set<string>();\n\tconst graph = new Graph<GraphLabel, NodeLabel, EdgeLabel>({\n\t\tdirected: true,\n\t\tmultigraph: true,\n\t\tcompound: false,\n\t});\n\tconst options = { ...DEFAULT_OPTIONS, ...input.options };\n\n\tgraph.setGraph({\n\t\trankdir: input.direction,\n\t\tnodesep: options.nodesep,\n\t\tranksep: options.ranksep,\n\t\tedgesep: options.edgesep,\n\t\tmarginx: options.marginx,\n\t\tmarginy: options.marginy,\n\t\tranker: options.ranker,\n\t});\n\tgraph.setDefaultEdgeLabel(() => ({}));\n\n\tfor (const node of input.nodes) {\n\t\tif (\n\t\t\t!isValidDimension(node.size.width) ||\n\t\t\t!isValidDimension(node.size.height)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-size.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has invalid layout dimensions.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"size\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalidNodeIds.add(node.id);\n\t\tgraph.setNode(node.id, {\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\tfor (const edge of input.edges) {\n\t\tif (!validNodeIds.has(edge.sourceId) || !validNodeIds.has(edge.targetId)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing layout node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.sourceId,\n\t\t\t\t\ttargetId: edge.targetId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tgraph.setEdge(\n\t\t\tedge.sourceId,\n\t\t\tedge.targetId,\n\t\t\t{ minlen: 1, weight: 1 },\n\t\t\tedge.id,\n\t\t);\n\t}\n\n\tlayout(graph);\n\n\tfor (const node of input.nodes) {\n\t\tif (!validNodeIds.has(node.id)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst label = graph.node(node.id);\n\t\tconst centerX = label?.x;\n\t\tconst centerY = label?.y;\n\t\tif (\n\t\t\ttypeof centerX !== \"number\" ||\n\t\t\ttypeof centerY !== \"number\" ||\n\t\t\t!Number.isFinite(centerX) ||\n\t\t\t!Number.isFinite(centerY)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-position.invalid\",\n\t\t\t\tmessage: `Dagre returned an invalid position for node ${node.id}.`,\n\t\t\t\tpath: [\"nodes\", node.id],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, {\n\t\t\tx: centerX - node.size.width / 2,\n\t\t\ty: centerY - node.size.height / 2,\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nexport function runComponentAwareDagreInitialLayout(\n\tinput: DagreLayoutInput,\n): InitialLayoutResult {\n\tconst options = { ...DEFAULT_OPTIONS, ...input.options };\n\tconst diagnostics = reportMissingEdgeReferences(input);\n\tconst validNodeIds = new Set(input.nodes.map((node) => node.id));\n\tconst validEdges = input.edges.filter(\n\t\t(edge) =>\n\t\t\tvalidNodeIds.has(edge.sourceId) && validNodeIds.has(edge.targetId),\n\t);\n\tconst components = connectedComponents(input.nodes, validEdges);\n\tif (components.length <= 1) {\n\t\tconst layout = runDagreInitialLayout({ ...input, edges: validEdges });\n\t\treturn {\n\t\t\tboxes: layout.boxes,\n\t\t\tdiagnostics: [...diagnostics, ...layout.diagnostics],\n\t\t};\n\t}\n\n\tconst boxes = new Map<string, Box>();\n\tlet cursor = 0;\n\tfor (const component of components) {\n\t\tconst componentNodeIds = new Set(component.map((node) => node.id));\n\t\tconst componentLayout = runDagreInitialLayout({\n\t\t\t...input,\n\t\t\tnodes: component,\n\t\t\tedges: validEdges.filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\tcomponentNodeIds.has(edge.sourceId) &&\n\t\t\t\t\tcomponentNodeIds.has(edge.targetId),\n\t\t\t),\n\t\t});\n\t\tdiagnostics.push(...componentLayout.diagnostics);\n\t\tif (componentLayout.boxes.size === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst bounds = unionBoxes([...componentLayout.boxes.values()]);\n\t\tconst axis =\n\t\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\t\tconst dx = axis === \"x\" ? cursor - bounds.x : -bounds.x;\n\t\tconst dy = axis === \"y\" ? cursor - bounds.y : -bounds.y;\n\t\tfor (const [id, box] of componentLayout.boxes) {\n\t\t\tboxes.set(id, { ...box, x: box.x + dx, y: box.y + dy });\n\t\t}\n\t\tcursor +=\n\t\t\t(axis === \"x\" ? bounds.width : bounds.height) + options.componentGap;\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nfunction reportMissingEdgeReferences(input: DagreLayoutInput): Diagnostic[] {\n\tconst validNodeIds = new Set(input.nodes.map((node) => node.id));\n\treturn input.edges.flatMap((edge) => {\n\t\tif (validNodeIds.has(edge.sourceId) && validNodeIds.has(edge.targetId)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tseverity: \"error\" as const,\n\t\t\t\tcode: \"layout.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing layout node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.sourceId,\n\t\t\t\t\ttargetId: edge.targetId,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction isValidDimension(value: number): boolean {\n\treturn Number.isFinite(value) && value >= 0;\n}\n\nfunction connectedComponents(\n\tnodes: readonly DagreLayoutNode[],\n\tedges: readonly DagreLayoutEdge[],\n): DagreLayoutNode[][] {\n\tconst nodeById = new Map(nodes.map((node) => [node.id, node]));\n\tconst adjacency = new Map(nodes.map((node) => [node.id, new Set<string>()]));\n\tfor (const edge of edges) {\n\t\tif (!nodeById.has(edge.sourceId) || !nodeById.has(edge.targetId)) {\n\t\t\tcontinue;\n\t\t}\n\t\tadjacency.get(edge.sourceId)?.add(edge.targetId);\n\t\tadjacency.get(edge.targetId)?.add(edge.sourceId);\n\t}\n\n\tconst visited = new Set<string>();\n\tconst components: DagreLayoutNode[][] = [];\n\tfor (const node of [...nodes].sort((a, b) => a.id.localeCompare(b.id))) {\n\t\tif (visited.has(node.id)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst ids: string[] = [];\n\t\tconst stack = [node.id];\n\t\tvisited.add(node.id);\n\t\twhile (stack.length > 0) {\n\t\t\tconst id = stack.pop();\n\t\t\tif (id === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tids.push(id);\n\t\t\tfor (const neighbor of [...(adjacency.get(id) ?? [])].sort().reverse()) {\n\t\t\t\tif (!visited.has(neighbor)) {\n\t\t\t\t\tvisited.add(neighbor);\n\t\t\t\t\tstack.push(neighbor);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcomponents.push(\n\t\t\tids.sort().flatMap((id) => {\n\t\t\t\tconst componentNode = nodeById.get(id);\n\t\t\t\treturn componentNode === undefined ? [] : [componentNode];\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn components.sort((a, b) => {\n\t\tconst left = a[0]?.id ?? \"\";\n\t\tconst right = b[0]?.id ?? \"\";\n\t\treturn left.localeCompare(right);\n\t});\n}\n","import { unionBoxes } from \"../geometry/boxes.js\";\nimport type { Constraint } from \"../ir/constraints.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type {\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n} from \"../ir/elements.js\";\nimport type { Box } from \"../ir/geometry.js\";\nimport {\n\trunComponentAwareDagreInitialLayout,\n\trunDagreInitialLayout,\n} from \"./dagre.js\";\nimport type { DagreLayoutOptions, InitialLayoutResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Recursive container layout (Issue #54, 方案 A)\n// ---------------------------------------------------------------------------\n\nexport interface RecursiveLayoutInput {\n\tdirection: \"TB\" | \"LR\" | \"BT\" | \"RL\";\n\tnodes: readonly NormalizedNode[];\n\tgroups: readonly NormalizedGroup[];\n\tedges: readonly NormalizedEdge[];\n\tconstraints: readonly Constraint[];\n\toptions?: Partial<DagreLayoutOptions>;\n}\n\nexport interface RecursiveLayoutResult {\n\tboxes: Map<string, Box>;\n\tgroupBoxes: Map<string, Box>;\n\tdiagnostics: Diagnostic[];\n}\n\n/**\n * Build parent→children maps from groups and containment constraints.\n *\n * A node is a child of group G if G.nodeIds includes the node's id.\n * A group C is a child of group G if G.groupIds includes C's id.\n * Containment constraints supplement (or override) group membership.\n */\nexport function buildContainerTree(\n\tgroups: readonly NormalizedGroup[],\n\tconstraints: readonly Constraint[],\n\tedges: readonly NormalizedEdge[],\n): {\n\tchildrenOf: Map<string, string[]>; // groupId → child node/group ids (leaf nodes + nested groups)\n\trootIds: Set<string>; // groups with no parent\n\tedgesInGroup: Map<string, NormalizedEdge[]>; // groupId → edges internal to that group\n\tdiagnostics: Diagnostic[];\n} {\n\tconst childrenOf = new Map<string, string[]>();\n\tconst parentOf = new Map<string, string>(); // childId → parent groupId\n\n\t// Populate from group.nodeIds / group.groupIds\n\tfor (const group of groups) {\n\t\tconst children: string[] = [];\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\tchildren.push(nodeId);\n\t\t\tparentOf.set(nodeId, group.id);\n\t\t}\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\tchildren.push(childGroupId);\n\t\t\tparentOf.set(childGroupId, group.id);\n\t\t}\n\t\tchildrenOf.set(group.id, children);\n\t}\n\n\t// Supplement from containment constraints\n\tfor (const c of constraints) {\n\t\tif (c.kind !== \"containment\") continue;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst existing = parentOf.get(childId);\n\t\t\tif (existing !== undefined) {\n\t\t\t\t// Already parented — containment constraint takes precedence.\n\t\t\t\t// Migrate child from old parent to new container.\n\t\t\t\tif (existing === c.containerId) continue;\n\t\t\t\tconst oldSiblings = childrenOf.get(existing) ?? [];\n\t\t\t\tconst pruned = oldSiblings.filter((id) => id !== childId);\n\t\t\t\tif (pruned.length === 0) {\n\t\t\t\t\tchildrenOf.delete(existing);\n\t\t\t\t} else {\n\t\t\t\t\tchildrenOf.set(existing, pruned);\n\t\t\t\t}\n\t\t\t\tconst newSiblings = childrenOf.get(c.containerId) ?? [];\n\t\t\t\tnewSiblings.push(childId);\n\t\t\t\tchildrenOf.set(c.containerId, newSiblings);\n\t\t\t\tparentOf.set(childId, c.containerId);\n\t\t\t} else {\n\t\t\t\tconst list = childrenOf.get(c.containerId) ?? [];\n\t\t\t\tlist.push(childId);\n\t\t\t\tchildrenOf.set(c.containerId, list);\n\t\t\t\tparentOf.set(childId, c.containerId);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Identify root groups (groups not contained by any other group)\n\tconst rootIds = new Set<string>();\n\tfor (const group of groups) {\n\t\tif (!parentOf.has(group.id)) {\n\t\t\trootIds.add(group.id);\n\t\t}\n\t}\n\n\t// Map edges to their innermost containing group\n\tconst edgesInGroup = new Map<string, NormalizedEdge[]>();\n\tfor (const edge of edges) {\n\t\tconst srcParent = parentOf.get(edge.source.nodeId);\n\t\tconst tgtParent = parentOf.get(edge.target.nodeId);\n\t\tif (srcParent !== undefined && srcParent === tgtParent) {\n\t\t\tconst list = edgesInGroup.get(srcParent) ?? [];\n\t\t\tlist.push(edge);\n\t\t\tedgesInGroup.set(srcParent, list);\n\t\t}\n\t}\n\n\tconst treeDiagnostics: Diagnostic[] = [];\n\treturn { childrenOf, rootIds, edgesInGroup, diagnostics: treeDiagnostics };\n}\n\n/**\n * Run recursive bottom-up container layout.\n *\n * Leaf containers are laid out first (DFS post-order). Container\n * size = union of child boxes + padding. The global pass treats\n * containers as atomic nodes.\n */\nexport function runRecursiveContainerLayout(\n\tinput: RecursiveLayoutInput,\n): RecursiveLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst groupBoxes = new Map<string, Box>();\n\n\t// Build O(1) lookup maps\n\tconst nodeById = new Map(input.nodes.map((n) => [n.id, n]));\n\tconst groupById = new Map(input.groups.map((g) => [g.id, g]));\n\tconst groupIdSet = new Set(input.groups.map((g) => g.id));\n\n\tconst {\n\t\tchildrenOf,\n\t\trootIds,\n\t\tedgesInGroup,\n\t\tdiagnostics: treeDiagnostics,\n\t} = buildContainerTree(input.groups, input.constraints, input.edges);\n\tdiagnostics.push(...treeDiagnostics);\n\n\t// If no groups, fall through to flat layout\n\tif (input.groups.length === 0) {\n\t\tconst flat = runComponentAwareDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: input.nodes.map((n) => ({ id: n.id, size: n.size })),\n\t\t\tedges: input.edges.map((e) => ({\n\t\t\t\tid: e.id,\n\t\t\t\tsourceId: e.source.nodeId,\n\t\t\t\ttargetId: e.target.nodeId,\n\t\t\t})),\n\t\t\t...(input.options === undefined ? {} : { options: input.options }),\n\t\t});\n\t\tdiagnostics.push(...flat.diagnostics);\n\t\tfor (const [id, box] of flat.boxes) {\n\t\t\tboxes.set(id, box);\n\t\t}\n\t\treturn { boxes, groupBoxes, diagnostics };\n\t}\n\n\t// Collect all descendant node/group IDs for a given group\n\tconst descendants = new Map<string, Set<string>>();\n\tfunction collectDescendants(groupId: string): Set<string> {\n\t\tconst cached = descendants.get(groupId);\n\t\tif (cached !== undefined) return cached;\n\t\tconst result = new Set<string>();\n\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\tfor (const childId of children) {\n\t\t\tresult.add(childId);\n\t\t\tconst childDesc = collectDescendants(childId);\n\t\t\tfor (const d of childDesc) result.add(d);\n\t\t}\n\t\tdescendants.set(groupId, result);\n\t\treturn result;\n\t}\n\n\t// DFS post-order: lay out each group from leaves to root\n\tconst groupOrder = topologicalSort(input.groups, childrenOf, groupIdSet);\n\n\tfor (const groupId of groupOrder) {\n\t\tconst group = groupById.get(groupId);\n\t\tif (group === undefined) continue;\n\n\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\tif (children.length === 0) {\n\t\t\t// Empty group — min size with padding\n\t\t\tconst box: Box = {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: (group.padding?.left ?? 8) + (group.padding?.right ?? 8) + 40,\n\t\t\t\theight: (group.padding?.top ?? 8) + (group.padding?.bottom ?? 8) + 20,\n\t\t\t};\n\t\t\tgroupBoxes.set(groupId, box);\n\t\t\tboxes.set(groupId, box);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Separate leaf nodes from nested groups\n\t\tconst leafNodeIds: string[] = [];\n\t\tconst nestedGroupIds: string[] = [];\n\t\tfor (const childId of children) {\n\t\t\tif (groupIdSet.has(childId)) {\n\t\t\t\tnestedGroupIds.push(childId);\n\t\t\t} else {\n\t\t\t\tleafNodeIds.push(childId);\n\t\t\t}\n\t\t}\n\n\t\t// Collect child sizes: leaf nodes use their declared size,\n\t\t// nested groups use their already-computed box\n\t\tconst childSizes = new Map<string, { width: number; height: number }>();\n\t\tfor (const nodeId of leafNodeIds) {\n\t\t\tconst node = nodeById.get(nodeId);\n\t\t\tif (node !== undefined) {\n\t\t\t\tchildSizes.set(nodeId, {\n\t\t\t\t\twidth: node.size.width,\n\t\t\t\t\theight: node.size.height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tfor (const nestedId of nestedGroupIds) {\n\t\t\tconst nestedBox = groupBoxes.get(nestedId);\n\t\t\tif (nestedBox !== undefined) {\n\t\t\t\tchildSizes.set(nestedId, {\n\t\t\t\t\twidth: nestedBox.width,\n\t\t\t\t\theight: nestedBox.height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Build mini-Dagre input for this group's children + internal edges\n\t\tconst groupEdges = edgesInGroup.get(groupId) ?? [];\n\t\tconst childLayout = runDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: children.flatMap((childId) => {\n\t\t\t\tconst size = childSizes.get(childId);\n\t\t\t\treturn size === undefined ? [] : [{ id: childId, size }];\n\t\t\t}),\n\t\t\tedges: groupEdges.map((e) => ({\n\t\t\t\tid: e.id,\n\t\t\t\tsourceId: e.source.nodeId,\n\t\t\t\ttargetId: e.target.nodeId,\n\t\t\t})),\n\t\t\toptions: {\n\t\t\t\t...(input.options ?? {}),\n\t\t\t\tranksep: (input.options?.ranksep ?? 100) * 0.6, // tighter inside containers\n\t\t\t\tnodesep: (input.options?.nodesep ?? 80) * 0.6,\n\t\t\t},\n\t\t});\n\t\tdiagnostics.push(...childLayout.diagnostics);\n\n\t\tif (childLayout.boxes.size === 0) continue;\n\n\t\t// Compute container box from child bounds + padding\n\t\tconst childBoxes = [...childLayout.boxes.values()];\n\t\tconst contentBounds = unionBoxes(childBoxes);\n\t\tconst padding = group.padding ?? {\n\t\t\ttop: 8,\n\t\t\tright: 8,\n\t\t\tbottom: 8,\n\t\t\tleft: 8,\n\t\t};\n\t\tconst containerBox: Box = {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: contentBounds.width + (padding.left ?? 8) + (padding.right ?? 8),\n\t\t\theight: contentBounds.height + (padding.top ?? 8) + (padding.bottom ?? 8),\n\t\t};\n\n\t\t// Offset children inside the container\n\t\tconst offsetX = padding.left ?? 8;\n\t\tconst offsetY = padding.top ?? 8;\n\t\tfor (const [childId, childBox] of childLayout.boxes) {\n\t\t\tboxes.set(childId, {\n\t\t\t\t...childBox,\n\t\t\t\tx: childBox.x + offsetX,\n\t\t\t\ty: childBox.y + offsetY,\n\t\t\t});\n\t\t}\n\n\t\tgroupBoxes.set(groupId, containerBox);\n\t\tboxes.set(groupId, containerBox);\n\t}\n\n\t// Global layout for top-level entities:\n\t// root groups (as atomic nodes) + uncontained leaf nodes + cross-group edges.\n\t// Use childrenOf to determine containment (covers group.nodeIds,\n\t// group.groupIds, and containment constraints).\n\tconst allContainedIds = new Set<string>();\n\tfor (const [, childIds] of childrenOf) {\n\t\tfor (const cid of childIds) allContainedIds.add(cid);\n\t}\n\tconst topLevelNodeIds = new Set<string>();\n\tfor (const node of input.nodes) {\n\t\tif (!allContainedIds.has(node.id)) {\n\t\t\ttopLevelNodeIds.add(node.id);\n\t\t}\n\t}\n\n\t// Build global Dagre input\n\tconst globalNodes: Array<{\n\t\tid: string;\n\t\tsize: { width: number; height: number };\n\t}> = [];\n\tfor (const nodeId of topLevelNodeIds) {\n\t\tconst node = nodeById.get(nodeId);\n\t\tif (node !== undefined) {\n\t\t\tglobalNodes.push({ id: nodeId, size: node.size });\n\t\t}\n\t}\n\tfor (const rootId of rootIds) {\n\t\tconst gb = groupBoxes.get(rootId);\n\t\tif (gb !== undefined) {\n\t\t\tglobalNodes.push({\n\t\t\t\tid: rootId,\n\t\t\t\tsize: { width: gb.width, height: gb.height },\n\t\t\t});\n\t\t}\n\t}\n\n\t// Map a node/group id to its outermost container root (if any).\n\tfunction rootContainerOf(id: string): string | undefined {\n\t\tfor (const rootId of rootIds) {\n\t\t\tconst desc = collectDescendants(rootId);\n\t\t\tif (desc.has(id)) return rootId;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Cross-group edges (not internal to any group).\n\t// Map internal endpoints to their containing root group so\n\t// Dagre always references nodes that exist in globalNodes.\n\tconst globalEdges = input.edges\n\t\t.filter((e) => {\n\t\t\tfor (const group of input.groups) {\n\t\t\t\tconst desc = collectDescendants(group.id);\n\t\t\t\tif (desc.has(e.source.nodeId) && desc.has(e.target.nodeId)) {\n\t\t\t\t\treturn false; // internal to a group\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.map((e) => ({\n\t\t\tid: e.id,\n\t\t\tsourceId: rootContainerOf(e.source.nodeId) ?? e.source.nodeId,\n\t\t\ttargetId: rootContainerOf(e.target.nodeId) ?? e.target.nodeId,\n\t\t}));\n\n\tif (globalNodes.length > 0) {\n\t\tconst globalLayout = runDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: globalNodes,\n\t\t\tedges: globalEdges,\n\t\t\t...(input.options === undefined ? {} : { options: input.options }),\n\t\t});\n\t\tdiagnostics.push(...globalLayout.diagnostics);\n\n\t\t// Apply global positions to root groups\n\t\tfor (const [id, box] of globalLayout.boxes) {\n\t\t\tif (groupBoxes.has(id)) {\n\t\t\t\tgroupBoxes.set(id, box);\n\t\t\t\tboxes.set(id, box);\n\t\t\t} else if (topLevelNodeIds.has(id)) {\n\t\t\t\tboxes.set(id, box);\n\t\t\t}\n\t\t}\n\n\t\t// Translate contained children by their container's global position\n\t\tfor (const groupId of groupOrder) {\n\t\t\tconst containerBox = groupBoxes.get(groupId);\n\t\t\tif (containerBox === undefined) continue;\n\t\t\tconst offsetX = containerBox.x;\n\t\t\tconst offsetY = containerBox.y;\n\t\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\t\tfor (const childId of children) {\n\t\t\t\tconst childBox = boxes.get(childId);\n\t\t\t\tif (childBox !== undefined) {\n\t\t\t\t\tboxes.set(childId, {\n\t\t\t\t\t\t...childBox,\n\t\t\t\t\t\tx: childBox.x + offsetX,\n\t\t\t\t\t\ty: childBox.y + offsetY,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Recurse into nested groups\n\t\t\t\ttranslateDescendants(childId, offsetX, offsetY, boxes, childrenOf);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { boxes, groupBoxes, diagnostics };\n}\n\nfunction translateDescendants(\n\tgroupId: string,\n\tdx: number,\n\tdy: number,\n\tboxes: Map<string, Box>,\n\tchildrenOf: Map<string, string[]>,\n): void {\n\tconst children = childrenOf.get(groupId) ?? [];\n\tfor (const childId of children) {\n\t\tconst box = boxes.get(childId);\n\t\tif (box !== undefined) {\n\t\t\tboxes.set(childId, { ...box, x: box.x + dx, y: box.y + dy });\n\t\t}\n\t\ttranslateDescendants(childId, dx, dy, boxes, childrenOf);\n\t}\n}\n\n/**\n * Topological sort of groups: leaves first (DFS post-order).\n */\nfunction topologicalSort(\n\tgroups: readonly NormalizedGroup[],\n\tchildrenOf: Map<string, string[]>,\n\tgroupIdSet: Set<string>,\n): string[] {\n\tconst visited = new Set<string>();\n\tconst result: string[] = [];\n\n\tfunction visit(id: string): void {\n\t\tif (visited.has(id)) return;\n\t\tvisited.add(id);\n\t\tconst children = childrenOf.get(id) ?? [];\n\t\tfor (const childId of children) {\n\t\t\tif (groupIdSet.has(childId)) {\n\t\t\t\tvisit(childId);\n\t\t\t}\n\t\t}\n\t\tresult.push(id);\n\t}\n\n\tfor (const group of groups) {\n\t\tvisit(group.id);\n\t}\n\n\treturn result;\n}\n","// ---------------------------------------------------------------------------\n// Deterministic binary min-heap for A* search (Issue #60)\n//\n// The tie-breaking on insertion order guarantees deterministic output\n// when multiple entries share the same priority — critical for auto-graph's\n// deterministic contract (tested in determinism.test.ts).\n// ---------------------------------------------------------------------------\n\ninterface HeapEntry<T> {\n\treadonly value: T;\n\treadonly priority: number;\n\treadonly order: number;\n}\n\nexport class BinaryHeap<T> {\n\tprivate _data: HeapEntry<T>[] = [];\n\tprivate _nextOrder = 0;\n\n\tget size(): number {\n\t\treturn this._data.length;\n\t}\n\n\tpush(value: T, priority: number): void {\n\t\tconst entry: HeapEntry<T> = { value, priority, order: this._nextOrder++ };\n\t\tthis._data.push(entry);\n\t\tthis._siftUp(this._data.length - 1);\n\t}\n\n\tpop(): T | undefined {\n\t\tif (this._data.length === 0) return undefined;\n\t\tconst top = this._data[0] as HeapEntry<T>;\n\t\tconst last = this._data.pop()!;\n\t\tif (this._data.length > 0) {\n\t\t\tthis._data[0] = last;\n\t\t\tthis._siftDown(0);\n\t\t}\n\t\treturn top.value;\n\t}\n\n\tpeek(): T | undefined {\n\t\treturn this._data.length > 0 ? this._data[0]!.value : undefined;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internals\n\t// -----------------------------------------------------------------------\n\n\tprivate _siftUp(idx: number): void {\n\t\tconst entry = this._data[idx] as HeapEntry<T>;\n\t\twhile (idx > 0) {\n\t\t\tconst parentIdx = (idx - 1) >> 1;\n\t\t\tconst parent = this._data[parentIdx] as HeapEntry<T>;\n\t\t\tif (this._less(entry, parent)) {\n\t\t\t\tthis._data[idx] = parent;\n\t\t\t\tidx = parentIdx;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis._data[idx] = entry;\n\t}\n\n\tprivate _siftDown(idx: number): void {\n\t\tconst entry = this._data[idx] as HeapEntry<T>;\n\t\tconst size = this._data.length;\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tlet smallestIdx = idx;\n\t\t\tconst leftIdx = (idx << 1) + 1;\n\t\t\tconst rightIdx = leftIdx + 1;\n\t\t\t// Compare children against entry (the held element being\n\t\t\t// sifted down), not this._data[smallestIdx], because after\n\t\t\t// an earlier swap this._data[idx] holds a child that was\n\t\t\t// moved up, not entry.\n\t\t\tif (\n\t\t\t\tleftIdx < size &&\n\t\t\t\tthis._less(this._data[leftIdx] as HeapEntry<T>, entry)\n\t\t\t) {\n\t\t\t\tsmallestIdx = leftIdx;\n\t\t\t}\n\t\t\tif (\n\t\t\t\trightIdx < size &&\n\t\t\t\tthis._less(\n\t\t\t\t\tthis._data[rightIdx] as HeapEntry<T>,\n\t\t\t\t\tsmallestIdx === leftIdx\n\t\t\t\t\t\t? (this._data[leftIdx] as HeapEntry<T>)\n\t\t\t\t\t\t: entry,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsmallestIdx = rightIdx;\n\t\t\t}\n\t\t\tif (smallestIdx !== idx) {\n\t\t\t\tthis._data[idx] = this._data[smallestIdx] as HeapEntry<T>;\n\t\t\t\tidx = smallestIdx;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis._data[idx] = entry;\n\t}\n\n\t/**\n\t * Two entries are compared first by priority, then by insertion order\n\t * when priorities are equal. The insertion-order tie-break makes the\n\t * heap deterministic: for a given sequence of {value, priority} pushes,\n\t * the extraction order is always the same.\n\t */\n\tprivate _less(a: HeapEntry<T>, b: HeapEntry<T>): boolean {\n\t\tif (a.priority !== b.priority) return a.priority < b.priority;\n\t\treturn a.order < b.order;\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport { BinaryHeap } from \"./binary-heap.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface AstarOptions {\n\t/** Per-unit cost for each segment length unit (default 1.0). */\n\treadonly segmentPenalty?: number;\n\t/** Cost added for each direction change / turn (default 50). */\n\treadonly turnPenalty?: number;\n\t/** Obstacle expansion margin (default 0). */\n\treadonly margin?: number;\n\t/** Boxes that block edges unless the segment is the first or last. */\n\treadonly endpointObstacles?: readonly Box[];\n\t/** Maximum number of graph nodes before giving up (default 4000). */\n\treadonly maxNodes?: number;\n\t/**\n\t * Pre-filter obstacles to those whose AABB intersects the\n\t * source→target corridor (libavoid-style local routing).\n\t * Reduces grid size 50–80% on typical topologies (default true).\n\t *\n\t * The corridor is conservative: obstacles within `corridorMargin`\n\t * pixels of the source→target AABB are retained. For unusually\n\t * wide detours (U-shaped paths around a single obstacle), increase\n\t * `corridorMargin` or set `corridorPrefilter: false` to search\n\t * against the full obstacle set.\n\t */\n\treadonly corridorPrefilter?: boolean;\n\t/** Corridor expansion margin in px (default 32). */\n\treadonly corridorMargin?: number;\n}\n\ninterface GraphNode {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly id: number;\n\tneighbors: Map<number, number>; // neighbor id → edge cost\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Find an orthogonal, obstacle-free path from `source` to `target`\n * using a coordinate-aligned visibility graph + A* search.\n *\n * Returns the path as an array of Points (source first, target last), or\n * `null` if no path exists or the graph exceeds `maxNodes`.\n */\nexport function findObstacleFreePath(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\toptions: AstarOptions = {},\n\tdiagnostics?: Diagnostic[],\n): Point[] | null {\n\tconst margin = options.margin ?? 0;\n\tconst turnPenalty = options.turnPenalty ?? 50;\n\tconst segmentPenalty = options.segmentPenalty ?? 1;\n\tconst endpointObstacles = options.endpointObstacles ?? [];\n\tconst maxNodes = options.maxNodes ?? (obstacles.length > 30 ? 16000 : 4000);\n\tconst useCorridor = options.corridorPrefilter ?? true;\n\tconst corridorMargin = options.corridorMargin ?? 32;\n\n\t// Corridor prefilter (libavoid-style local routing, Issue #60).\n\t// Only obstacles whose AABB intersects the source→target corridor\n\t// can possibly block a path, so filter before grid construction.\n\tconst filtered = useCorridor\n\t\t? filterObstaclesByCorridor(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tobstacles,\n\t\t\t\tendpointObstacles,\n\t\t\t\tcorridorMargin,\n\t\t\t)\n\t\t: obstacles;\n\n\t// 1. Collect interesting coordinates.\n\tconst xs = collectXs(source, target, filtered, margin);\n\tconst ys = collectYs(source, target, filtered, margin);\n\n\tif (xs.length * ys.length > maxNodes) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.astar.grid_overflow\",\n\t\t\tmessage: `A* grid overflow: ${xs.length * ys.length} nodes > ${maxNodes} limit. Falling back to heuristic routing.`,\n\t\t\tdetail: {\n\t\t\t\txsCount: xs.length,\n\t\t\t\tysCount: ys.length,\n\t\t\t\tmaxNodes,\n\t\t\t},\n\t\t});\n\t\treturn null;\n\t}\n\n\t// 2. Build graph.\n\tconst { nodes, nodeIndex } = buildGraph(xs, ys);\n\n\t// 3. Connect edges.\n\tconnectHorizontalEdges(nodes, ys, filtered, endpointObstacles, margin);\n\tconnectVerticalEdges(nodes, xs, filtered, endpointObstacles, margin);\n\n\t// 4. A* search.\n\tconst path = aStarSearch(\n\t\tnodes,\n\t\tnodeIndex,\n\t\tsource,\n\t\ttarget,\n\t\tturnPenalty,\n\t\tsegmentPenalty,\n\t);\n\n\tif (path !== null) {\n\t\t// 5. Simplify.\n\t\tconst simplified = simplifyRoute(path);\n\n\t\t// Validate the simplified path against obstacles that were\n\t\t// filtered out by the corridor prefilter (Issue #61 codex P2).\n\t\t// If the path crosses any excluded obstacle, retry with the\n\t\t// full obstacle set to avoid routes that pass through obstacles.\n\t\tconst filteredSet = new Set<Box>(filtered);\n\t\tif (useCorridor && obstacles.some((o) => !filteredSet.has(o))) {\n\t\t\tlet crossesExcluded = false;\n\t\t\tfor (let i = 0; i < simplified.length - 1; i++) {\n\t\t\t\tconst a = simplified[i] as Point;\n\t\t\t\tconst b = simplified[i + 1] as Point;\n\t\t\t\tfor (const obs of obstacles) {\n\t\t\t\t\tif (filteredSet.has(obs)) continue;\n\t\t\t\t\tif (segmentCrossesBoxStrict(a, b, obs, margin)) {\n\t\t\t\t\t\tcrossesExcluded = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (crossesExcluded) break;\n\t\t\t}\n\t\t\tif (!crossesExcluded) return simplified;\n\t\t\t// Fall through to full-obstacle retry below.\n\t\t} else {\n\t\t\treturn simplified;\n\t\t}\n\t}\n\n\t// If the corridor-prefiltered search failed, retry with the full\n\t// obstacle set (Issue #60 review): an obstacle inside the corridor\n\t// may have forced a detour outside it, where obstacles were omitted.\n\tif (!useCorridor) return null;\n\n\tconst xsFull = collectXs(source, target, obstacles, margin);\n\tconst ysFull = collectYs(source, target, obstacles, margin);\n\n\tif (xsFull.length * ysFull.length > maxNodes) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.astar.grid_overflow\",\n\t\t\tmessage: `A* full-retry grid overflow: ${xsFull.length * ysFull.length} nodes > ${maxNodes} limit. Falling back to heuristic routing.`,\n\t\t\tdetail: { xsCount: xsFull.length, ysCount: ysFull.length, maxNodes },\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst { nodes: nodesFull, nodeIndex: idxFull } = buildGraph(xsFull, ysFull);\n\tconnectHorizontalEdges(\n\t\tnodesFull,\n\t\tysFull,\n\t\tobstacles,\n\t\tendpointObstacles,\n\t\tmargin,\n\t);\n\tconnectVerticalEdges(nodesFull, xsFull, obstacles, endpointObstacles, margin);\n\n\tconst pathFull = aStarSearch(\n\t\tnodesFull,\n\t\tidxFull,\n\t\tsource,\n\t\ttarget,\n\t\tturnPenalty,\n\t\tsegmentPenalty,\n\t);\n\n\tif (pathFull === null) return null;\n\treturn simplifyRoute(pathFull);\n}\n\n// ---------------------------------------------------------------------------\n// Coordinate collection\n// ---------------------------------------------------------------------------\n\n/**\n * Filter obstacles to those whose AABB (optionally expanded by margin)\n * intersects the source→target corridor. Obstacles entirely outside\n * this bounding box cannot possibly block a path between source and\n * target, so excluding them reduces grid size 50–80% on typical\n * topologies (libavoid local-corridor approach, Issue #60).\n *\n * The corridor is conservative: obstacles within `margin` pixels of\n * the source→target AABB are always retained. For very wide detours,\n * callers should pass `corridorPrefilter: false` to search against the\n * full obstacle set.\n */\nexport function filterObstaclesByCorridor(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): Box[] {\n\tconst cx1 = Math.min(source.x, target.x) - margin;\n\tconst cx2 = Math.max(source.x, target.x) + margin;\n\tconst cy1 = Math.min(source.y, target.y) - margin;\n\tconst cy2 = Math.max(source.y, target.y) + margin;\n\n\tconst result: Box[] = [];\n\tfor (const obs of obstacles) {\n\t\tif (\n\t\t\tobs.x + obs.width >= cx1 &&\n\t\t\tobs.x <= cx2 &&\n\t\t\tobs.y + obs.height >= cy1 &&\n\t\t\tobs.y <= cy2\n\t\t) {\n\t\t\tresult.push(obs);\n\t\t}\n\t}\n\t// endpointObstacles are always kept (they only block the last\n\t// segment, but the corridor filter is conservative — obstacles\n\t// outside the corridor can't intersect the source→target corridor).\n\tfor (const ep of endpointObstacles) {\n\t\tresult.push(ep);\n\t}\n\treturn result;\n}\n\nfunction collectXs(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number,\n): number[] {\n\tconst raw: number[] = [];\n\t// Offset obstacle edges by 2 px so grid lines sit just outside,\n\t// avoiding tangent-touch AABB intersections (Issue #39).\n\tfor (const obs of obstacles) {\n\t\traw.push(obs.x - margin - 2, obs.x + obs.width + margin + 2);\n\t}\n\t// Deduplicate obstacle grid lines, then always include source\n\t// and target exactly so A* can find its start/goal nodes even\n\t// when they happen to be near a grid line (Codex P2).\n\tconst deduped = insertChannelMidpoints(dedupSorted(raw));\n\tfor (const v of [source.x, target.x]) {\n\t\tif (!deduped.includes(v)) {\n\t\t\tdeduped.push(v);\n\t\t}\n\t}\n\treturn deduped.sort((a, b) => a - b);\n}\n\nfunction collectYs(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number,\n): number[] {\n\tconst raw: number[] = [];\n\t// Offset obstacle edges by 2 px so grid lines sit just outside,\n\t// avoiding tangent-touch AABB intersections (Issue #39).\n\tfor (const obs of obstacles) {\n\t\traw.push(obs.y - margin - 2, obs.y + obs.height + margin + 2);\n\t}\n\t// Deduplicate obstacle grid lines, then always include source\n\t// and target exactly so A* can find its start/goal nodes even\n\t// when they happen to be near a grid line (Codex P2).\n\tconst deduped = insertChannelMidpoints(dedupSorted(raw));\n\tfor (const v of [source.y, target.y]) {\n\t\tif (!deduped.includes(v)) {\n\t\t\tdeduped.push(v);\n\t\t}\n\t}\n\treturn deduped.sort((a, b) => a - b);\n}\n\n/**\n * Sort and merge coordinates within 2 px tolerance so aligned\n * obstacles (e.g. same container) produce fewer redundant grid\n * lines (Issue #47).\n */\nfunction dedupSorted(values: number[]): number[] {\n\tconst sorted = [...values].sort((a, b) => a - b);\n\tconst result: number[] = [];\n\tfor (const v of sorted) {\n\t\tconst last = result[result.length - 1];\n\t\tif (last === undefined || v - last > 2) {\n\t\t\tresult.push(v);\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Insert midpoints between adjacent coordinate pairs that are more\n * than `minGap` apart, so the visibility graph has grid lines\n * inside narrow channels between close obstacles (libavoid approach:\n * \"non-uniform grid whose mesh size is tailored to the geometry\").\n * Issue #49, P0-2.\n */\nfunction insertChannelMidpoints(sorted: number[], minGap = 8): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < sorted.length - 1; i++) {\n\t\tconst a = sorted[i] as number;\n\t\tconst b = sorted[i + 1] as number;\n\t\tresult.push(a);\n\t\tif (b - a > minGap) {\n\t\t\tresult.push((a + b) / 2);\n\t\t}\n\t}\n\tresult.push(sorted[sorted.length - 1] as number);\n\treturn result.sort((a, b) => a - b);\n}\n\n// ---------------------------------------------------------------------------\n// Graph construction\n// ---------------------------------------------------------------------------\n\nfunction buildGraph(\n\txs: number[],\n\tys: number[],\n): { nodes: GraphNode[]; nodeIndex: Map<string, number> } {\n\tconst nodes: GraphNode[] = [];\n\tconst nodeIndex = new Map<string, number>();\n\n\tfor (let xi = 0; xi < xs.length; xi++) {\n\t\tfor (let yi = 0; yi < ys.length; yi++) {\n\t\t\tconst x = xs[xi] as number;\n\t\t\tconst y = ys[yi] as number;\n\t\t\tconst id = nodes.length;\n\t\t\tnodes.push({ x, y, id, neighbors: new Map() });\n\t\t\tnodeIndex.set(`${x},${y}`, id);\n\t\t}\n\t}\n\n\treturn { nodes, nodeIndex };\n}\n\n// ---------------------------------------------------------------------------\n// Edge connection\n// ---------------------------------------------------------------------------\n\nfunction connectHorizontalEdges(\n\tnodes: GraphNode[],\n\tys: number[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): void {\n\tfor (const y of ys) {\n\t\tconst row = nodes.filter((n) => n.y === y).sort((a, b) => a.x - b.x);\n\t\tfor (let i = 0; i < row.length - 1; i++) {\n\t\t\tconst a = row[i] as GraphNode;\n\t\t\tconst b = row[i + 1] as GraphNode;\n\t\t\tconst dx = b.x - a.x;\n\t\t\tif (dx <= 0) continue;\n\t\t\tif (segmentCrossesAny(a, b, obstacles, endpointObstacles, margin)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta.neighbors.set(b.id, dx);\n\t\t\tb.neighbors.set(a.id, dx);\n\t\t}\n\t}\n}\n\nfunction connectVerticalEdges(\n\tnodes: GraphNode[],\n\txs: number[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): void {\n\tfor (const x of xs) {\n\t\tconst col = nodes.filter((n) => n.x === x).sort((a, b) => a.y - b.y);\n\t\tfor (let i = 0; i < col.length - 1; i++) {\n\t\t\tconst a = col[i] as GraphNode;\n\t\t\tconst b = col[i + 1] as GraphNode;\n\t\t\tconst dy = b.y - a.y;\n\t\t\tif (dy <= 0) continue;\n\t\t\tif (segmentCrossesAny(a, b, obstacles, endpointObstacles, margin)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta.neighbors.set(b.id, dy);\n\t\t\tb.neighbors.set(a.id, dy);\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Edge validity\n// ---------------------------------------------------------------------------\n\nfunction segmentCrossesAny(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): boolean {\n\tfor (const obs of obstacles) {\n\t\tif (segmentCrossesBoxStrict(a, b, obs, margin)) return true;\n\t}\n\tfor (const ep of endpointObstacles) {\n\t\tif (segmentCrossesBoxStrict(a, b, ep, margin)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Like `segmentIntersectsBox` but excludes tangent touches — only\n * returns true when the segment truly enters the box interior.\n * Endpoints ON the box boundary are not counted as interior.\n */\nfunction segmentCrossesBoxStrict(\n\tstart: Point,\n\tend: Point,\n\tbox: Box,\n\tmargin: number,\n): boolean {\n\tconst left = box.x - margin;\n\tconst right = box.x + box.width + margin;\n\tconst top = box.y - margin;\n\tconst bottom = box.y + box.height + margin;\n\n\t// Strict interior check for endpoints\n\tif (pointInsideStrict(start, left, right, top, bottom)) return true;\n\tif (pointInsideStrict(end, left, right, top, bottom)) return true;\n\n\t// Axis-aligned segments — use non-strict comparisons so\n\t// tangent-touching edges are caught, matching intersectsAabb.\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x >= left &&\n\t\t\tstart.x <= right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y >= top &&\n\t\t\tstart.y <= bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\n\t// Diagonal: check all four edges\n\treturn (\n\t\tsegmentEdgeIntersect(start, end, left, top, right, top) ||\n\t\tsegmentEdgeIntersect(start, end, right, top, right, bottom) ||\n\t\tsegmentEdgeIntersect(start, end, right, bottom, left, bottom) ||\n\t\tsegmentEdgeIntersect(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideStrict(\n\tp: Point,\n\tleft: number,\n\tright: number,\n\ttop: number,\n\tbottom: number,\n): boolean {\n\treturn p.x > left && p.x < right && p.y > top && p.y < bottom;\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentEdgeIntersect(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) return false;\n\n\tconst t =\n\t\t((start.x - x1) * (y2 - y1) - (start.y - y1) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((start.x - x1) * (end.y - start.y) - (start.y - y1) * (end.x - start.x)) /\n\t\tdenominator;\n\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\n// ---------------------------------------------------------------------------\n// A* search (open set uses BinaryHeap from ./binary-heap.js, Issue #60)\n// ---------------------------------------------------------------------------\n\nfunction aStarSearch(\n\tnodes: GraphNode[],\n\tnodeIndex: Map<string, number>,\n\tsource: Point,\n\ttarget: Point,\n\tturnPenalty: number,\n\tsegmentPenalty: number,\n): Point[] | null {\n\tconst startId = nodeIndex.get(`${source.x},${source.y}`);\n\tconst goalId = nodeIndex.get(`${target.x},${target.y}`);\n\tif (startId === undefined || goalId === undefined) return null;\n\n\tconst gScore = new Map<number, number>();\n\tgScore.set(startId, 0);\n\n\tconst cameFrom = new Map<number, number>();\n\tconst cameFromDir = new Map<number, \"h\" | \"v\">();\n\n\t// Binary min-heap open set (Issue #60).\n\t// Stores {id, f} where f = g + h. Lazy deletion: stale entries\n\t// (whose gScore has been improved since insertion) are skipped\n\t// on extraction. Deterministic via insertion-order tie-break.\n\tconst openSet = new BinaryHeap<number>();\n\topenSet.push(startId, manhattan(source, target));\n\n\twhile (openSet.size > 0) {\n\t\tconst currentId = openSet.pop()!;\n\t\tconst currentG = gScore.get(currentId);\n\t\t// Lazy deletion: skip if this entry's gScore is stale.\n\t\tif (currentG === undefined) continue;\n\n\t\tif (currentId === goalId) {\n\t\t\treturn reconstructPath(nodes, cameFrom, goalId);\n\t\t}\n\n\t\tconst node = nodes[currentId] as GraphNode;\n\t\tconst prevDir = cameFromDir.get(currentId);\n\n\t\tfor (const [neighborId, edgeCost] of node.neighbors) {\n\t\t\tconst neighbor = nodes[neighborId] as GraphNode;\n\t\t\tconst tentativeG = currentG + edgeCost * segmentPenalty;\n\n\t\t\tconst newDir: \"h\" | \"v\" = neighbor.y === node.y ? \"h\" : \"v\";\n\t\t\tconst turnCost =\n\t\t\t\tprevDir !== undefined && prevDir !== newDir ? turnPenalty : 0;\n\t\t\tconst totalG = tentativeG + turnCost;\n\n\t\t\tconst existingG = gScore.get(neighborId);\n\t\t\tif (existingG === undefined || totalG < existingG) {\n\t\t\t\tgScore.set(neighborId, totalG);\n\t\t\t\tcameFrom.set(neighborId, currentId);\n\t\t\t\tcameFromDir.set(neighborId, newDir);\n\t\t\t\tconst f = totalG + manhattan(neighbor, target);\n\t\t\t\topenSet.push(neighborId, f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction manhattan(a: Point, b: Point): number {\n\treturn Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction reconstructPath(\n\tnodes: GraphNode[],\n\tcameFrom: Map<number, number>,\n\tgoalId: number,\n): Point[] {\n\tconst path: Point[] = [];\n\tlet current: number | undefined = goalId;\n\twhile (current !== undefined) {\n\t\tconst node = nodes[current] as GraphNode;\n\t\tpath.unshift({ x: node.x, y: node.y });\n\t\tcurrent = cameFrom.get(current);\n\t}\n\treturn path;\n}\n\n// ---------------------------------------------------------------------------\n// Route simplification\n// ---------------------------------------------------------------------------\n\n/**\n * Remove intermediate collinear points from the route.\n */\nfunction simplifyRoute(points: readonly Point[]): Point[] {\n\tif (points.length <= 2) return [...points];\n\n\tconst result: Point[] = [points[0] as Point];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst prev = result[result.length - 1] as Point;\n\t\tconst curr = points[i] as Point;\n\t\tconst next = points[i + 1] as Point;\n\t\tif (!areCollinear(prev, curr, next)) {\n\t\t\tresult.push(curr);\n\t\t}\n\t}\n\tresult.push(points[points.length - 1] as Point);\n\treturn result;\n}\n\nfunction areCollinear(a: Point, b: Point, c: Point): boolean {\n\treturn (a.x === b.x && b.x === c.x) || (a.y === b.y && b.y === c.y);\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport { BinaryHeap } from \"./binary-heap.js\";\n\n// ---------------------------------------------------------------------------\n// Corner visibility-graph A* (Issue #54, 方案 B — libavoid approach)\n// ---------------------------------------------------------------------------\n\nexport interface VisibilityRouterOptions {\n\treadonly segmentPenalty?: number;\n\treadonly turnPenalty?: number;\n\treadonly margin?: number;\n\treadonly endpointObstacles?: readonly Box[];\n\treadonly maxCorners?: number;\n}\n\ninterface CornerVertex {\n\treadonly point: Point;\n\treadonly obstacleIndex: number; // -1 for source/target\n}\n\ninterface VisEdge {\n\treadonly from: number;\n\treadonly to: number;\n\treadonly cost: number; // euclidean distance\n}\n\n/**\n * Find an obstacle-free path using corner-based visibility graph + A*.\n * Returns the path or null if no path exists or corner count exceeds maxCorners.\n */\nexport function findCornerGraphPath(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\toptions: VisibilityRouterOptions = {},\n\tdiagnostics?: Diagnostic[],\n): Point[] | null {\n\tconst margin = options.margin ?? 0;\n\tconst turnPenalty = options.turnPenalty ?? 50;\n\tconst segmentPenalty = options.segmentPenalty ?? 1;\n\tconst endpointObstacles = options.endpointObstacles ?? [];\n\tconst maxCorners = options.maxCorners ?? 600;\n\n\t// Collect vertices\n\tconst vertices = collectCornerVertices(source, target, obstacles, margin);\n\tif (vertices.length > maxCorners) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.visibility.corner_overflow\",\n\t\t\tmessage: `Corner graph overflow: ${vertices.length} vertices > ${maxCorners}. Falling back to grid A*.`,\n\t\t\tdetail: { vertexCount: vertices.length, maxCorners },\n\t\t});\n\t\treturn null;\n\t}\n\n\tif (obstacles.length === 0) {\n\t\treturn simplifyRoute([source, target]);\n\t}\n\n\t// Build visibility edges\n\tconst expandedObstacles =\n\t\tmargin === 0 ? obstacles : obstacles.map((o) => expandBox(o, margin));\n\tconst edges = buildVisibilityEdges(\n\t\tvertices,\n\t\texpandedObstacles,\n\t\tendpointObstacles,\n\t);\n\n\t// A*\n\tconst path = aStarSearch(\n\t\tvertices,\n\t\tedges,\n\t\tsource,\n\t\ttarget,\n\t\tsegmentPenalty,\n\t\tturnPenalty,\n\t);\n\tif (path === null) return null;\n\n\treturn simplifyRoute(path, expandedObstacles);\n}\n\n// ---------------------------------------------------------------------------\n// Vertex collection\n// ---------------------------------------------------------------------------\n\nfunction collectCornerVertices(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number = 0,\n): CornerVertex[] {\n\tconst vertices: CornerVertex[] = [\n\t\t{ point: { x: source.x, y: source.y }, obstacleIndex: -1 },\n\t\t{ point: { x: target.x, y: target.y }, obstacleIndex: -1 },\n\t];\n\n\tconst seen = new Set<string>();\n\tseen.add(`${source.x},${source.y}`);\n\tseen.add(`${target.x},${target.y}`);\n\n\tconst addVertex = (p: Point, obstacleIndex: number): void => {\n\t\tconst key = `${p.x},${p.y}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tvertices.push({ point: p, obstacleIndex });\n\t};\n\n\tfor (let i = 0; i < obstacles.length; i++) {\n\t\tconst obs = obstacles[i] as Box;\n\t\t// When margin > 0, corners are also offset outward so the\n\t\t// resulting path doesn't tangent-touch the obstacle edge\n\t\t// (which the loose AABB intersection check would reject).\n\t\tconst c0: Point = { x: obs.x - margin, y: obs.y - margin };\n\t\tconst c1: Point = { x: obs.x + obs.width + margin, y: obs.y - margin };\n\t\tconst c2: Point = {\n\t\t\tx: obs.x + obs.width + margin,\n\t\t\ty: obs.y + obs.height + margin,\n\t\t};\n\t\tconst c3: Point = { x: obs.x - margin, y: obs.y + obs.height + margin };\n\t\tfor (const c of [c0, c1, c2, c3]) {\n\t\t\taddVertex(c, i);\n\t\t}\n\t}\n\n\t// Steiner points: axis-aligned projections where source/target\n\t// coordinates project onto obstacle edges. These create waypoints\n\t// so the router can leave source/target perpendicular to an\n\t// obstacle edge before routing along it (corner-astar review fix).\n\t// With margin > 0, projections are offset outward so the path\n\t// stays outside the expanded obstacle and avoids tangent touches.\n\tfor (const p of [source, target]) {\n\t\tfor (let i = 0; i < obstacles.length; i++) {\n\t\t\tconst obs = obstacles[i] as Box;\n\t\t\t// Project p.x onto left/right edges (offset outward by margin).\n\t\t\taddVertex({ x: obs.x - margin, y: p.y }, i);\n\t\t\taddVertex({ x: obs.x + obs.width + margin, y: p.y }, i);\n\t\t\t// Project p.y onto top/bottom edges (offset outward by margin).\n\t\t\taddVertex({ x: p.x, y: obs.y - margin }, i);\n\t\t\taddVertex({ x: p.x, y: obs.y + obs.height + margin }, i);\n\t\t\t// Also project the source/target coordinate lines onto the\n\t\t\t// edges they intersect (interior projections).\n\t\t\tif (p.x > obs.x && p.x < obs.x + obs.width) {\n\t\t\t\taddVertex({ x: p.x, y: obs.y - margin }, i);\n\t\t\t\taddVertex({ x: p.x, y: obs.y + obs.height + margin }, i);\n\t\t\t}\n\t\t\tif (p.y > obs.y && p.y < obs.y + obs.height) {\n\t\t\t\taddVertex({ x: obs.x - margin, y: p.y }, i);\n\t\t\t\taddVertex({ x: obs.x + obs.width + margin, y: p.y }, i);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn vertices;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility graph construction\n// ---------------------------------------------------------------------------\n\nfunction buildVisibilityEdges(\n\tvertices: CornerVertex[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n): VisEdge[] {\n\tconst edges: VisEdge[] = [];\n\n\t// For each vertex, find nearest visible neighbor in 4 directions\n\tfor (let i = 0; i < vertices.length; i++) {\n\t\tconst v = vertices[i] as CornerVertex;\n\t\tconst right = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"right\",\n\t\t);\n\t\tconst left = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"left\",\n\t\t);\n\t\tconst down = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"down\",\n\t\t);\n\t\tconst up = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"up\",\n\t\t);\n\n\t\tfor (const neighbor of [right, left, down, up]) {\n\t\t\tif (neighbor !== null && neighbor.index > i) {\n\t\t\t\tedges.push({\n\t\t\t\t\tfrom: i,\n\t\t\t\t\tto: neighbor.index,\n\t\t\t\t\tcost: neighbor.distance,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn edges;\n}\n\ninterface VisibleNeighbor {\n\tindex: number;\n\tdistance: number;\n}\n\nfunction visibleInDirection(\n\torigin: CornerVertex,\n\tvertices: CornerVertex[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tdir: \"left\" | \"right\" | \"up\" | \"down\",\n): VisibleNeighbor | null {\n\tconst candidates: Array<{ index: number; dist: number }> = [];\n\n\tfor (let i = 0; i < vertices.length; i++) {\n\t\tconst v = vertices[i] as CornerVertex;\n\t\tconst dx = v.point.x - origin.point.x;\n\t\tconst dy = v.point.y - origin.point.y;\n\n\t\tswitch (dir) {\n\t\t\tcase \"right\":\n\t\t\t\tif (dx > 0 && dy === 0) candidates.push({ index: i, dist: dx });\n\t\t\t\tbreak;\n\t\t\tcase \"left\":\n\t\t\t\tif (dx < 0 && dy === 0) candidates.push({ index: i, dist: -dx });\n\t\t\t\tbreak;\n\t\t\tcase \"down\":\n\t\t\t\tif (dy > 0 && dx === 0) candidates.push({ index: i, dist: dy });\n\t\t\t\tbreak;\n\t\t\tcase \"up\":\n\t\t\t\tif (dy < 0 && dx === 0) candidates.push({ index: i, dist: -dy });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tcandidates.sort((a, b) => a.dist - b.dist);\n\n\tfor (const c of candidates) {\n\t\tif (\n\t\t\tisSegmentVisible(\n\t\t\t\torigin.point,\n\t\t\t\t(vertices[c.index] as CornerVertex).point,\n\t\t\t\tobstacles,\n\t\t\t\tendpointObstacles,\n\t\t\t\torigin.obstacleIndex,\n\t\t\t\t(vertices[c.index] as CornerVertex).obstacleIndex,\n\t\t\t)\n\t\t) {\n\t\t\treturn { index: c.index, distance: c.dist };\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility test\n// ---------------------------------------------------------------------------\n\nfunction isSegmentVisible(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\t_aObsIdx: number,\n\t_bObsIdx: number,\n): boolean {\n\t// Use strict interior check for ALL obstacles. The strict check\n\t// treats endpoints on the boundary as not \"inside\", so Steiner\n\t// points on obstacle edges can still leave the edge without\n\t// being falsely rejected. This also correctly rejects segments\n\t// that re-enter an obstacle after leaving from an edge.\n\tfor (let i = 0; i < obstacles.length; i++) {\n\t\tif (segmentEntersBox(a, b, obstacles[i] as Box)) return false;\n\t}\n\tfor (const ep of endpointObstacles) {\n\t\tif (segmentEntersBox(a, b, ep)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * Returns true if the segment enters the INTERIOR of the box\n * (strict). Endpoints on the boundary and segments tangent to the\n * boundary are NOT considered entering.\n */\nfunction segmentEntersBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst inside = (p: Point): boolean =>\n\t\tp.x > left && p.x < right && p.y > top && p.y < bottom;\n\tif (inside(start) || inside(end)) return true;\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\tMath.max(start.y, end.y) > top &&\n\t\t\tMath.min(start.y, end.y) < bottom\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\tMath.max(start.x, end.x) > left &&\n\t\t\tMath.min(start.x, end.x) < right\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction expandBox(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x - margin,\n\t\ty: box.y - margin,\n\t\twidth: box.width + margin * 2,\n\t\theight: box.height + margin * 2,\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// A* on visibility graph (open set uses BinaryHeap, Issue #60)\n// ---------------------------------------------------------------------------\n\nfunction aStarSearch(\n\tvertices: CornerVertex[],\n\tedges: VisEdge[],\n\tsource: Point,\n\ttarget: Point,\n\tsegmentPenalty: number,\n\tturnPenalty: number,\n): Point[] | null {\n\tconst startId = 0; // source is always first vertex\n\tconst goalId = 1; // target is always second vertex\n\n\tconst gScore = new Map<number, number>();\n\tgScore.set(startId, 0);\n\n\tconst cameFrom = new Map<number, number>();\n\tconst cameFromDir = new Map<number, \"h\" | \"v\">();\n\n\tconst openSet = new BinaryHeap<number>();\n\topenSet.push(startId, manhattan(source, target));\n\n\tconst neighborMap = new Map<number, Array<{ to: number; cost: number }>>();\n\tfor (const e of edges) {\n\t\tlet list = neighborMap.get(e.from);\n\t\tif (list === undefined) {\n\t\t\tlist = [];\n\t\t\tneighborMap.set(e.from, list);\n\t\t}\n\t\tlist.push({ to: e.to, cost: e.cost });\n\t\tlist = neighborMap.get(e.to);\n\t\tif (list === undefined) {\n\t\t\tlist = [];\n\t\t\tneighborMap.set(e.to, list);\n\t\t}\n\t\tlist.push({ to: e.from, cost: e.cost });\n\t}\n\n\twhile (openSet.size > 0) {\n\t\tconst currentId = openSet.pop()!;\n\t\tconst currentG = gScore.get(currentId);\n\t\t// Lazy deletion: skip stale entries.\n\t\tif (currentG === undefined) continue;\n\n\t\tif (currentId === goalId) {\n\t\t\treturn reconstructPath(vertices, cameFrom, goalId);\n\t\t}\n\n\t\tconst prevDir = cameFromDir.get(currentId);\n\t\tconst neighbors = neighborMap.get(currentId) ?? [];\n\n\t\tfor (const { to, cost } of neighbors) {\n\t\t\tconst tentativeG = currentG + cost * segmentPenalty;\n\t\t\tconst toV = vertices[to] as CornerVertex;\n\t\t\tconst curV = vertices[currentId] as CornerVertex;\n\t\t\tconst newDir: \"h\" | \"v\" = toV.point.y === curV.point.y ? \"h\" : \"v\";\n\t\t\tconst turnCost =\n\t\t\t\tprevDir !== undefined && prevDir !== newDir ? turnPenalty : 0;\n\t\t\tconst totalG = tentativeG + turnCost;\n\n\t\t\tconst existingG = gScore.get(to);\n\t\t\tif (existingG === undefined || totalG < existingG) {\n\t\t\t\tgScore.set(to, totalG);\n\t\t\t\tcameFrom.set(to, currentId);\n\t\t\t\tcameFromDir.set(to, newDir);\n\t\t\t\tconst f = totalG + manhattan(toV.point, target);\n\t\t\t\topenSet.push(to, f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction manhattan(a: Point, b: Point): number {\n\treturn Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction reconstructPath(\n\tvertices: CornerVertex[],\n\tcameFrom: Map<number, number>,\n\tgoalId: number,\n): Point[] {\n\tconst path: Point[] = [];\n\tlet current: number | undefined = goalId;\n\twhile (current !== undefined) {\n\t\tconst v = vertices[current] as CornerVertex;\n\t\tpath.unshift({ x: v.point.x, y: v.point.y });\n\t\tcurrent = cameFrom.get(current);\n\t}\n\treturn path;\n}\n\n// ---------------------------------------------------------------------------\n// Route simplification\n// ---------------------------------------------------------------------------\n\nfunction simplifyRoute(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[] = [],\n): Point[] {\n\tif (points.length <= 2) return [...points];\n\tconst result: Point[] = [points[0] as Point];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst prev = result[result.length - 1] as Point;\n\t\tconst curr = points[i] as Point;\n\t\tconst next = points[i + 1] as Point;\n\t\tconst collinear =\n\t\t\t(prev.x === curr.x && curr.x === next.x) ||\n\t\t\t(prev.y === curr.y && curr.y === next.y);\n\t\tif (!collinear) {\n\t\t\tresult.push(curr);\n\t\t\tcontinue;\n\t\t}\n\t\t// Only collapse if the resulting direct segment is still\n\t\t// obstacle-free. Otherwise keep the intermediate waypoint\n\t\t// so the route hugs the obstacle boundary instead of cutting\n\t\t// through it (corner-astar review fix).\n\t\tif (segmentCrossesAnyObstacle(prev, next, obstacles)) {\n\t\t\tresult.push(curr);\n\t\t}\n\t}\n\tresult.push(points[points.length - 1] as Point);\n\treturn result;\n}\n\nfunction segmentCrossesAnyObstacle(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n): boolean {\n\tfor (const obs of obstacles) {\n\t\tif (segmentEntersBox(a, b, obs)) return true;\n\t}\n\treturn false;\n}\n","import { intersectsAabb, validateBox } from \"../geometry/boxes.js\";\nimport { getEdgePort } from \"../geometry/shapes.js\";\nimport {\n\ttype BoxSpatialIndex,\n\tcreateBoxSpatialIndex,\n\tquerySegmentSpatialIndex,\n} from \"../geometry/spatial-index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type {\n\tAnchorName,\n\tBox,\n\tDiagramDirection,\n\tPoint,\n} from \"../ir/geometry.js\";\nimport { filterObstaclesByCorridor, findObstacleFreePath } from \"./astar.js\";\nimport type { RouteEdgeInput, RouteEdgeResult } from \"./types.js\";\nimport { findCornerGraphPath } from \"./visibility-router.js\";\n\n/**\n * Emit a diagnostic when the route length exceeds `threshold` × the\n * straight-line distance between source and target (Issue #49, P0-4).\n */\nfunction checkBacktracking(\n\tpoints: readonly Point[],\n\tsource: Point,\n\ttarget: Point,\n\tdiagnostics: Diagnostic[],\n\tmaxRatio?: number,\n): void {\n\tif (points.length < 2) return;\n\tconst direct = Math.hypot(target.x - source.x, target.y - source.y);\n\tif (direct <= 0) return;\n\tlet routeLen = 0;\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst a = points[i] as Point;\n\t\tconst b = points[i + 1] as Point;\n\t\trouteLen += Math.hypot(b.x - a.x, b.y - a.y);\n\t}\n\tconst threshold = maxRatio ?? 20;\n\tif (routeLen > direct * threshold) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.backtracking_excessive\",\n\t\t\tmessage: `Route length ${Math.round(routeLen)} px exceeds ${threshold}× direct distance ${Math.round(direct)} px.`,\n\t\t\tdetail: {\n\t\t\t\trouteLength: Math.round(routeLen),\n\t\t\t\tdirectDistance: Math.round(direct),\n\t\t\t\tthreshold,\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport function routeEdge(input: RouteEdgeInput): RouteEdgeResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst softObstacles = input.obstacles ?? [];\n\tconst hardObstacles = input.hardObstacles ?? [];\n\t// Best rejected path from A* routing — used as fallback when all\n\t// heuristic candidates also fail, to avoid returning a 2-point\n\t// direct connection that is always worse than a path with minor\n\t// crossings (Issue #66, root cause 3). Only hard-clear paths are stored,\n\t// and among those the one with the fewest soft-obstacle crossings wins\n\t// (Codex P2: compare across corridor/full/grid attempts, not fill-once).\n\tlet bestRejectedPath: Point[] | undefined;\n\tlet bestRejectedCrossings = Number.POSITIVE_INFINITY;\n\tconst softObstacleIndex =\n\t\tinput.obstacleIndex ?? createBoxSpatialIndex(indexedBoxes(softObstacles));\n\tconst hardObstacleIndex =\n\t\tinput.hardObstacleIndex ??\n\t\tcreateBoxSpatialIndex(indexedBoxes(hardObstacles));\n\t// Record a rejected but hard-clear finalized path, keeping the one with\n\t// the fewest soft-obstacle crossings (Issue #66, Codex P2).\n\tconst recordRejected = (candidate: Point[]): void => {\n\t\tif (routeIntersectsObstacles(candidate, hardObstacles, hardObstacleIndex)) {\n\t\t\treturn;\n\t\t}\n\t\tconst crossings = countObstacleCrossings(candidate, softObstacles);\n\t\tif (crossings < bestRejectedCrossings) {\n\t\t\tbestRejectedCrossings = crossings;\n\t\t\tbestRejectedPath = candidate;\n\t\t}\n\t};\n\tconst maxAttempts = input.maxRoutingAttempts ?? 5;\n\tconst defaultAnchors = defaultAnchorsForGeometry(\n\t\tinput.source.box,\n\t\tinput.target.box,\n\t\tinput.direction,\n\t);\n\n\tif ((input.kind ?? \"orthogonal\") === \"straight\") {\n\t\tconst source = getEdgePort(\n\t\t\tinput.source,\n\t\t\tinput.target.center,\n\t\t\tinput.sourceAnchor ?? defaultAnchors.sourceAnchor,\n\t\t);\n\t\tconst target = getEdgePort(\n\t\t\tinput.target,\n\t\t\tinput.source.center,\n\t\t\tinput.targetAnchor ?? defaultAnchors.targetAnchor,\n\t\t);\n\t\tconst points = finalizeRoute(\n\t\t\t[source, target],\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t\tsoftObstacleIndex,\n\t\t\thardObstacleIndex,\n\t\t);\n\t\tif (routeCrossesBoxes(points, hardObstacles, hardObstacleIndex)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"routing.evidence.crossing_forbidden\",\n\t\t\t\tmessage: \"Straight route crosses hard evidence block obstacles.\",\n\t\t\t});\n\t\t\treturn { points, diagnostics };\n\t\t}\n\t\tif (routeCrossesBoxes(points, softObstacles, softObstacleIndex)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\t\tmessage: \"Straight route crosses soft obstacles.\",\n\t\t\t});\n\t\t}\n\t\treturn { points, diagnostics };\n\t}\n\n\t// For obstacle-avoiding edges, try A* visibility-graph routing\n\t// first. Fall through to heuristic candidates if it fails (#39).\n\tif ((input.kind ?? \"orthogonal\") === \"obstacle-avoiding\") {\n\t\tconst endpointObstacles = endpointObstaclesForAutoAnchors(input);\n\t\tfor (const { sourceAnchor, targetAnchor } of routeAnchorPairs(\n\t\t\tinput,\n\t\t\tdefaultAnchors,\n\t\t)) {\n\t\t\tconst source = getEdgePort(\n\t\t\t\tinput.source,\n\t\t\t\tinput.target.center,\n\t\t\t\tsourceAnchor,\n\t\t\t);\n\t\t\tconst target = getEdgePort(\n\t\t\t\tinput.target,\n\t\t\t\tinput.source.center,\n\t\t\t\ttargetAnchor,\n\t\t\t);\n\t\t\t// Try corner visibility graph first (Issue #54, 方案 B).\n\t\t\t// Use margin 2 so the resulting path stays outside the\n\t\t\t// obstacle boundary and avoids tangent-touch rejections\n\t\t\t// by the loose AABB intersection check.\n\t\t\t// Corridor prefilter reduces obstacle count for the corner\n\t\t\t// graph, preventing maxCorners overflow (Issue #62).\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\tconst corridorMargin = input.corridorMargin ?? 32;\n\t\t\tconst corridorObstacles = filterObstaclesByCorridor(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tallObstacles,\n\t\t\t\t[], // endpointObstacles passed separately via options\n\t\t\t\tcorridorMargin,\n\t\t\t);\n\t\t\t// When the corridor filter removes every obstacle but the\n\t\t\t// diagram still has obstacles, an empty set makes the corner\n\t\t\t// router take its no-obstacle fast path (a diagonal source→\n\t\t\t// target segment), regressing orthogonality. Use the full set\n\t\t\t// in that case so projection vertices still yield an orthogonal\n\t\t\t// path (Codex P2).\n\t\t\tconst cornerObstacles =\n\t\t\t\tcorridorObstacles.length === 0 && allObstacles.length > 0\n\t\t\t\t\t? allObstacles\n\t\t\t\t\t: corridorObstacles;\n\t\t\tlet cornerPath = findCornerGraphPath(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tcornerObstacles,\n\t\t\t\t{ endpointObstacles, margin: 2 },\n\t\t\t\tdiagnostics,\n\t\t\t);\n\t\t\t// If corridor-filtered call failed and excluded some obstacles,\n\t\t\t// retry with the full set (mirrors grid A* full-retry pattern).\n\t\t\tif (cornerPath === null && cornerObstacles.length < allObstacles.length) {\n\t\t\t\tcornerPath = findCornerGraphPath(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\t{ endpointObstacles, margin: 2 },\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Fall back to grid A* if corner graph fails or is rejected.\n\t\t\tconst path =\n\t\t\t\tcornerPath ??\n\t\t\t\tfindObstacleFreePath(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\t{ endpointObstacles, margin: 0, corridorMargin },\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\tif (path !== null && path.length >= 2) {\n\t\t\t\tconst finalized = finalizeRoute(\n\t\t\t\t\tpath,\n\t\t\t\t\tsoftObstacles,\n\t\t\t\t\thardObstacles,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\thardObstacleIndex,\n\t\t\t\t);\n\t\t\t\t// Verify the A* path against the router.s AABB\n\t\t\t\t// collision contract (segmentBox with 1 px floor)\n\t\t\t\t// so we do not accept routes that the existing\n\t\t\t\t// non-A* path would reject (Codex P2).\n\t\t\t\tif (\n\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\tfinalized,\n\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t) &&\n\t\t\t\t\t!routeIntersectsObstacles(finalized, hardObstacles, hardObstacleIndex)\n\t\t\t\t) {\n\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\tfinalized,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t);\n\t\t\t\t\treturn { points: finalized, diagnostics };\n\t\t\t\t}\n\t\t\t\t// Save rejected finalized path as best-effort fallback —\n\t\t\t\t// it has minor crossings but is far better than a 2-point\n\t\t\t\t// direct connection (Issue #66). Only hard-clear paths are\n\t\t\t\t// kept, and the fewest-crossings one wins (Codex P1/P2).\n\t\t\t\trecordRejected(finalized);\n\t\t\t\t// Corner path was rejected — retry full-obstacle corner graph\n\t\t\t\t// first (it may still be under maxCorners and can route around\n\t\t\t\t// the excluded obstacle), then fall back to grid A* (Codex P2).\n\t\t\t\tif (cornerPath !== null) {\n\t\t\t\t\tconst fullCornerPath =\n\t\t\t\t\t\tcornerObstacles.length < allObstacles.length\n\t\t\t\t\t\t\t? findCornerGraphPath(\n\t\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t\tallObstacles,\n\t\t\t\t\t\t\t\t\t{ endpointObstacles, margin: 2 },\n\t\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tif (fullCornerPath !== null && fullCornerPath.length >= 2) {\n\t\t\t\t\t\tconst fullFinalized = finalizeRoute(\n\t\t\t\t\t\t\tfullCornerPath,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { points: fullFinalized, diagnostics };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Record hard-clear full-retry path as fallback (Codex P2).\n\t\t\t\t\t\trecordRejected(fullFinalized);\n\t\t\t\t\t}\n\t\t\t\t\tconst gridPath = findObstacleFreePath(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tallObstacles,\n\t\t\t\t\t\t{ endpointObstacles, margin: 0, corridorMargin },\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t);\n\t\t\t\t\tif (gridPath !== null && gridPath.length >= 2) {\n\t\t\t\t\t\tconst gridFinalized = finalizeRoute(\n\t\t\t\t\t\t\tgridPath,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { points: gridFinalized, diagnostics };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Record hard-clear grid-retry path as fallback (Codex P2).\n\t\t\t\t\t\trecordRejected(gridFinalized);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst routeLaneObstacles = [...softObstacles, ...hardObstacles];\n\tconst anchorPairs = routeAnchorPairs(input, defaultAnchors);\n\tconst candidateRoutes = anchorPairs.flatMap(\n\t\t({ sourceAnchor, targetAnchor }) => {\n\t\t\tconst source = getEdgePort(\n\t\t\t\tinput.source,\n\t\t\t\tinput.target.center,\n\t\t\t\tsourceAnchor,\n\t\t\t);\n\t\t\tconst target = getEdgePort(\n\t\t\t\tinput.target,\n\t\t\t\tinput.source.center,\n\t\t\t\ttargetAnchor,\n\t\t\t);\n\t\t\tconst routes = [\n\t\t\t\t...orthogonalCandidates(source, target, input.direction),\n\t\t\t\t...expandedObstacleCandidates(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tinput.direction,\n\t\t\t\t\trouteLaneObstacles,\n\t\t\t\t),\n\t\t\t\t...outerDoglegCandidates(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tinput.direction,\n\t\t\t\t\trouteLaneObstacles,\n\t\t\t\t),\n\t\t\t];\n\t\t\tconst endpointObstacles = endpointObstaclesForAutoAnchors(input);\n\t\t\treturn routes.map((points) => ({ points, endpointObstacles }));\n\t\t},\n\t);\n\tfor (const candidate of candidateRoutes) {\n\t\tif (\n\t\t\t!routeIntersectsObstacles(candidate.points, softObstacles) &&\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\tsoftObstacles,\n\t\t\t\tsoftObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\thardObstacles,\n\t\t\t\thardObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\tcandidate.points,\n\t\t\t\tcandidate.endpointObstacles,\n\t\t\t)\n\t\t) {\n\t\t\tconst finalizedClean = finalizeRoute(\n\t\t\t\tcandidate.points,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t\tsoftObstacleIndex,\n\t\t\t\thardObstacleIndex,\n\t\t\t);\n\t\t\tcheckBacktracking(\n\t\t\t\tfinalizedClean,\n\t\t\t\tcandidate.points[0] as Point,\n\t\t\t\tcandidate.points[candidate.points.length - 1] as Point,\n\t\t\t\tdiagnostics,\n\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t);\n\t\t\treturn { points: finalizedClean, diagnostics };\n\t\t}\n\t}\n\n\tconst hardClearCandidate = candidateRoutes.find(\n\t\t(candidate) =>\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\thardObstacles,\n\t\t\t\thardObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\tcandidate.points,\n\t\t\t\tcandidate.endpointObstacles,\n\t\t\t),\n\t);\n\tif (hardClearCandidate !== undefined) {\n\t\tlet bestPoints = hardClearCandidate.points;\n\t\tif (input.kind === \"obstacle-avoiding\") {\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\t// Try greedy rerouting on all hard-clear candidates, not just the first.\n\t\t\tfor (const candidate of candidateRoutes) {\n\t\t\t\tif (\n\t\t\t\t\trouteCrossesBoxes(candidate.points, hardObstacles) ||\n\t\t\t\t\trouteIntersectsEndpointInteriors(\n\t\t\t\t\t\tcandidate.points,\n\t\t\t\t\t\tcandidate.endpointObstacles,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\t\tcandidate.points,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\t!routeCrossesBoxes(rerouted, allObstacles) &&\n\t\t\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\t\t\trerouted,\n\t\t\t\t\t\tcandidate.endpointObstacles,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\t\trerouted,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Fall back to improving the first hard-clear candidate\n\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\tbestPoints,\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t\tconst reroutedAvoidsEndpointInteriors = !routeIntersectsEndpointInteriors(\n\t\t\t\trerouted,\n\t\t\t\thardClearCandidate.endpointObstacles,\n\t\t\t);\n\t\t\tif (reroutedAvoidsEndpointInteriors) {\n\t\t\t\tif (\n\t\t\t\t\trouteCrossesBoxes(rerouted, hardObstacles) &&\n\t\t\t\t\t!routeCrossesBoxes(bestPoints, hardObstacles)\n\t\t\t\t) {\n\t\t\t\t\t// keep original hard-clear candidate\n\t\t\t\t} else {\n\t\t\t\t\tbestPoints = rerouted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\tmessage:\n\t\t\t\t\"No bounded orthogonal route candidate avoided all soft obstacles.\",\n\t\t});\n\n\t\t// Prefer the path with fewer soft-obstacle crossings between the A*\n\t\t// rejected path and the heuristic candidate (Codex P2). Compare AFTER\n\t\t// finalization — only prefer rejected when strictly better.\n\t\tconst finalizedSoftBest = finalizeRoute(\n\t\t\tbestPoints,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t);\n\t\tlet softFallback = finalizedSoftBest;\n\t\tif (bestRejectedPath !== undefined) {\n\t\t\tconst finalizedRejected = finalizeRoute(\n\t\t\t\tbestRejectedPath,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t);\n\t\t\tconst rejectedCrossings = countObstacleCrossings(\n\t\t\t\tfinalizedRejected,\n\t\t\t\tsoftObstacles,\n\t\t\t);\n\t\t\tconst heuristicCrossings = countObstacleCrossings(\n\t\t\t\tfinalizedSoftBest,\n\t\t\t\tsoftObstacles,\n\t\t\t);\n\t\t\tif (rejectedCrossings < heuristicCrossings) {\n\t\t\t\tsoftFallback = finalizedRejected;\n\t\t\t}\n\t\t}\n\n\t\t// Run backtracking check on the chosen fallback too (Codex P2).\n\t\tcheckBacktracking(\n\t\t\tsoftFallback,\n\t\t\tsoftFallback[0] as Point,\n\t\t\tsoftFallback[softFallback.length - 1] as Point,\n\t\t\tdiagnostics,\n\t\t\tinput.maxBacktrackingRatio,\n\t\t);\n\t\treturn {\n\t\t\tpoints: softFallback,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tif (hardObstacles.length > 0) {\n\t\tlet bestPoints =\n\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors);\n\t\tif (input.kind === \"obstacle-avoiding\") {\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\t// Try greedy rerouting on all candidates, return first clean one.\n\t\t\tfor (const candidate of candidateRoutes) {\n\t\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\t\tcandidate.points,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t);\n\t\t\t\tif (!routeCrossesBoxes(rerouted, allObstacles)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\t\trerouted,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tbestPoints = greedyRerouteAroundObstacles(\n\t\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors),\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t}\n\t\t// If A* found a hard-clear path (bestRejectedPath is only ever set\n\t\t// to hard-clear routes), prefer it over a heuristic candidate that\n\t\t// crosses hard evidence obstacles (Issue #66, Codex P1).\n\t\tif (bestRejectedPath !== undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Using A* route with minor soft-obstacle crossings to avoid hard evidence obstacles.\",\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\tbestRejectedPath,\n\t\t\t\t\tsoftObstacles,\n\t\t\t\t\thardObstacles,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t),\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"routing.evidence.crossing_forbidden\",\n\t\t\tmessage:\n\t\t\t\t\"No bounded orthogonal route candidate avoided hard evidence block obstacles.\",\n\t\t});\n\n\t\treturn {\n\t\t\tpoints: finalizeRoute(\n\t\t\t\tbestPoints,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t),\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tlet bestPoints =\n\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors);\n\tif (input.kind === \"obstacle-avoiding\") {\n\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t// Try greedy rerouting on multiple candidates, not just the first.\n\t\tfor (const candidate of candidateRoutes) {\n\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t\tif (!routeCrossesBoxes(rerouted, allObstacles)) {\n\t\t\t\treturn {\n\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\trerouted,\n\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t),\n\t\t\t\t\tdiagnostics,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// Keep the best attempt from the first candidate\n\t\tbestPoints = greedyRerouteAroundObstacles(\n\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors),\n\t\t\tallObstacles,\n\t\t\tmaxAttempts,\n\t\t);\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"routing.obstacle.unavoidable\",\n\t\tmessage: \"No bounded orthogonal route candidate avoided all obstacles.\",\n\t});\n\n\t// Prefer the path with fewer soft-obstacle crossings between the A*\n\t// rejected path and the heuristic fallback (Codex P2). Compare AFTER\n\t// finalization — finalizeRoute can expand/simplify routes to avoid\n\t// obstacles, so raw crossing counts on unfinalized paths are misleading.\n\t// Only prefer the A* path when it is strictly better after finalization.\n\tconst finalizedBestPoints = finalizeRoute(\n\t\tbestPoints,\n\t\tsoftObstacles,\n\t\thardObstacles,\n\t\tdiagnostics,\n\t);\n\tlet fallbackPoints = finalizedBestPoints;\n\tif (bestRejectedPath !== undefined) {\n\t\tconst finalizedRejected = finalizeRoute(\n\t\t\tbestRejectedPath,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t);\n\t\tconst rejectedCrossings = countObstacleCrossings(\n\t\t\tfinalizedRejected,\n\t\t\tsoftObstacles,\n\t\t);\n\t\tconst heuristicCrossings = countObstacleCrossings(\n\t\t\tfinalizedBestPoints,\n\t\t\tsoftObstacles,\n\t\t);\n\t\tif (rejectedCrossings < heuristicCrossings) {\n\t\t\tfallbackPoints = finalizedRejected;\n\t\t}\n\t}\n\n\t// Run backtracking check on the chosen fallback too (Codex P2).\n\tcheckBacktracking(\n\t\tfallbackPoints,\n\t\tfallbackPoints[0] as Point,\n\t\tfallbackPoints[fallbackPoints.length - 1] as Point,\n\t\tdiagnostics,\n\t\tinput.maxBacktrackingRatio,\n\t);\n\treturn {\n\t\tpoints: fallbackPoints,\n\t\tdiagnostics,\n\t};\n}\n\nfunction finalizeRoute(\n\tpoints: readonly Point[],\n\tsoftObstacles: readonly Box[],\n\thardObstacles: readonly Box[],\n\tdiagnostics: Diagnostic[],\n\tsoftObstacleIndex?: BoxSpatialIndex,\n\thardObstacleIndex?: BoxSpatialIndex,\n): Point[] {\n\tconst simplified = simplifyRoute(points);\n\tif (simplified.length >= 3) {\n\t\treturn simplified;\n\t}\n\tconst crossesHardObstacles = routeCrossesBoxes(\n\t\tsimplified,\n\t\thardObstacles,\n\t\thardObstacleIndex,\n\t);\n\tconst crossesSoftObstacles = routeCrossesBoxes(\n\t\tsimplified,\n\t\tsoftObstacles,\n\t\tsoftObstacleIndex,\n\t);\n\tif (!crossesHardObstacles && !crossesSoftObstacles) {\n\t\treturn simplified;\n\t}\n\tconst expanded = expandFallbackRoute(simplified, [\n\t\t...softObstacles,\n\t\t...hardObstacles,\n\t]);\n\tconst expandedCrossesHard = routeCrossesBoxes(\n\t\texpanded,\n\t\thardObstacles,\n\t\thardObstacleIndex,\n\t);\n\tconst expandedCrossesSoft = routeCrossesBoxes(\n\t\texpanded,\n\t\tsoftObstacles,\n\t\tsoftObstacleIndex,\n\t);\n\tif (expandedCrossesHard || expandedCrossesSoft) {\n\t\tdiagnostics.push({\n\t\t\tseverity: expandedCrossesHard ? \"error\" : \"warning\",\n\t\t\tcode: \"route_obstacle_fallback\",\n\t\t\tmessage:\n\t\t\t\t\"Obstacle-aware routing fell back to fewer than three route points.\",\n\t\t\tdetail: { pointCount: simplified.length },\n\t\t});\n\t}\n\treturn expanded;\n}\n\nfunction expandFallbackRoute(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): Point[] {\n\tif (points.length !== 2) {\n\t\treturn points.map((point) => ({ ...point }));\n\t}\n\tconst [source, target] = points;\n\tif (source === undefined || target === undefined) {\n\t\treturn points.map((point) => ({ ...point }));\n\t}\n\tif (source.y === target.y) {\n\t\tconst detourY = horizontalDetourLane(source, target, obstacles);\n\t\treturn [\n\t\t\t{ ...source },\n\t\t\t{ x: source.x, y: detourY },\n\t\t\t{ x: target.x, y: detourY },\n\t\t\t{ ...target },\n\t\t];\n\t}\n\tif (source.x === target.x) {\n\t\tconst detourX = verticalDetourLane(source, target, obstacles);\n\t\treturn [\n\t\t\t{ ...source },\n\t\t\t{ x: detourX, y: source.y },\n\t\t\t{ x: detourX, y: target.y },\n\t\t\t{ ...target },\n\t\t];\n\t}\n\t// Generate two L-shaped detour candidates for diagonal edges,\n\t// picking the one that avoids all obstacles with the smallest\n\t// path-length increase (issue #21 approach A).\n\tconst hv = diagonalDetourHV(source, target, obstacles);\n\tconst vh = diagonalDetourVH(source, target, obstacles);\n\t// Filter to obstacle-free candidates, preferring shorter paths.\n\tconst viable = [hv, vh].filter((c) => !routeCrossesBoxes(c, obstacles));\n\tconst [firstViable, ...remainingViable] = viable;\n\tif (firstViable !== undefined) {\n\t\tconst directLen = Math.hypot(target.x - source.x, target.y - source.y);\n\t\tlet best = firstViable;\n\t\tfor (const cand of remainingViable) {\n\t\t\tif (pathLength(cand) - directLen < pathLength(best) - directLen) {\n\t\t\t\tbest = cand;\n\t\t\t}\n\t\t}\n\t\treturn best;\n\t}\n\t// Fallback: midpoint L-shape (same as before).\n\treturn [\n\t\t{ ...source },\n\t\t{ x: (source.x + target.x) / 2, y: source.y },\n\t\t{ x: (source.x + target.x) / 2, y: target.y },\n\t\t{ ...target },\n\t];\n}\n\nfunction horizontalDetourLane(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): number {\n\tconst crossing = obstacles.filter((obstacle) =>\n\t\tsegmentIntersectsBox(source, target, obstacle),\n\t);\n\tif (crossing.length === 0) {\n\t\treturn source.y + (source.x <= target.x ? 1 : -1) * 24;\n\t}\n\tconst margin = 24;\n\tconst above = Math.min(...crossing.map((obstacle) => obstacle.y)) - margin;\n\tconst below =\n\t\tMath.max(...crossing.map((obstacle) => obstacle.y + obstacle.height)) +\n\t\tmargin;\n\treturn Math.abs(above - source.y) <= Math.abs(below - source.y)\n\t\t? above\n\t\t: below;\n}\n\nfunction verticalDetourLane(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): number {\n\tconst crossing = obstacles.filter((obstacle) =>\n\t\tsegmentIntersectsBox(source, target, obstacle),\n\t);\n\tif (crossing.length === 0) {\n\t\treturn source.x + (source.y <= target.y ? 1 : -1) * 24;\n\t}\n\tconst margin = 24;\n\tconst left = Math.min(...crossing.map((obstacle) => obstacle.x)) - margin;\n\tconst right =\n\t\tMath.max(...crossing.map((obstacle) => obstacle.x + obstacle.width)) +\n\t\tmargin;\n\treturn Math.abs(left - source.x) <= Math.abs(right - source.x) ? left : right;\n}\n\nfunction diagonalDetourHV(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): Point[] {\n\tconst detourY = horizontalDetourLane(source, target, obstacles);\n\treturn [\n\t\t{ ...source },\n\t\t{ x: source.x, y: detourY },\n\t\t{ x: target.x, y: detourY },\n\t\t{ ...target },\n\t];\n}\n\nfunction diagonalDetourVH(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): Point[] {\n\tconst detourX = verticalDetourLane(source, target, obstacles);\n\treturn [\n\t\t{ ...source },\n\t\t{ x: detourX, y: source.y },\n\t\t{ x: detourX, y: target.y },\n\t\t{ ...target },\n\t];\n}\n\nfunction pathLength(points: readonly Point[]): number {\n\tlet len = 0;\n\tfor (let i = 1; i < points.length; i += 1) {\n\t\tconst a = points[i - 1];\n\t\tconst b = points[i];\n\t\tif (a !== undefined && b !== undefined) {\n\t\t\tlen += Math.hypot(b.x - a.x, b.y - a.y);\n\t\t}\n\t}\n\treturn len;\n}\n\nfunction endpointObstaclesForAutoAnchors(input: RouteEdgeInput): Box[] {\n\tconst boxes: Box[] = [];\n\tif (input.sourceAnchor === undefined && hasDistinctAnchors(input.source)) {\n\t\tboxes.push(insetBox(input.source.box, 1));\n\t}\n\tif (input.targetAnchor === undefined && hasDistinctAnchors(input.target)) {\n\t\tboxes.push(insetBox(input.target.box, 1));\n\t}\n\treturn boxes.filter((box) => box.width > 0 && box.height > 0);\n}\n\nfunction hasDistinctAnchors(geometry: RouteEdgeInput[\"source\"]): boolean {\n\tconst points = new Set(\n\t\tgeometry.anchors.map((anchor) => `${anchor.point.x},${anchor.point.y}`),\n\t);\n\treturn points.size > 1;\n}\n\nfunction insetBox(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x + margin,\n\t\ty: box.y + margin,\n\t\twidth: box.width - margin * 2,\n\t\theight: box.height - margin * 2,\n\t};\n}\n\n/**\n * Iteratively pushes route segments away from intersecting obstacles,\n * up to maxIterations times. Returns the improved route (may still\n * cross obstacles if avoidance was not possible).\n */\nfunction greedyRerouteAroundObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tmaxIterations: number,\n): Point[] {\n\tlet current = [...points];\n\tfor (let iter = 0; iter < maxIterations; iter++) {\n\t\tconst improved = pushRouteAwayFromObstacles(current, obstacles);\n\t\tif (improved === null) {\n\t\t\tbreak; // no improvements possible\n\t\t}\n\t\tcurrent = improved;\n\t\tif (!routeCrossesBoxes(current, obstacles)) {\n\t\t\tbreak; // route is clean\n\t\t}\n\t}\n\treturn current;\n}\n\n/**\n * Tries to push each segment of the route away from intersecting obstacles.\n * Returns a new route with waypoints inserted, or null if no push was possible.\n */\nfunction pushRouteAwayFromObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): Point[] | null {\n\tconst result: Point[] = [];\n\tlet improved = false;\n\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tresult.push(a ?? b ?? { x: 0, y: 0 });\n\t\t\tcontinue;\n\t\t}\n\t\tresult.push(a);\n\n\t\tconst intersectors = obstacles.filter((obs) =>\n\t\t\tsegmentIntersectsBox(a, b, obs),\n\t\t);\n\t\tif (intersectors.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Find the obstacle whose edge is closest to the segment midpoint.\n\t\tconst mx = (a.x + b.x) / 2;\n\t\tconst my = (a.y + b.y) / 2;\n\t\tconst isHorizontal = a.y === b.y;\n\t\tconst margin = 12;\n\n\t\tlet bestWaypoint: Point | null = null;\n\t\tlet bestDist = Infinity;\n\n\t\tfor (const obs of intersectors) {\n\t\t\t// Try escaping above/below (for horizontal segments) or left/right (for vertical)\n\t\t\tconst candidates: Point[] = isHorizontal\n\t\t\t\t? [\n\t\t\t\t\t\t{ x: mx, y: obs.y - margin },\n\t\t\t\t\t\t{ x: mx, y: obs.y + obs.height + margin },\n\t\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\t\t{ x: obs.x - margin, y: my },\n\t\t\t\t\t\t{ x: obs.x + obs.width + margin, y: my },\n\t\t\t\t\t];\n\n\t\t\tfor (const wp of candidates) {\n\t\t\t\tconst dist = Math.hypot(wp.x - mx, wp.y - my);\n\t\t\t\tif (dist < bestDist) {\n\t\t\t\t\tbestDist = dist;\n\t\t\t\t\tbestWaypoint = wp;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (bestWaypoint !== null) {\n\t\t\tresult.push(bestWaypoint);\n\t\t\timproved = true;\n\t\t}\n\t}\n\n\tconst last = points[points.length - 1];\n\tif (last !== undefined) {\n\t\tresult.push(last);\n\t}\n\n\treturn improved ? result : null;\n}\n\nfunction fallbackRoute(\n\tinput: RouteEdgeInput,\n\tdefaultAnchors: { sourceAnchor: AnchorName; targetAnchor: AnchorName },\n): Point[] {\n\treturn [\n\t\tgetEdgePort(\n\t\t\tinput.source,\n\t\t\tinput.target.center,\n\t\t\tinput.sourceAnchor ?? defaultAnchors.sourceAnchor,\n\t\t),\n\t\tgetEdgePort(\n\t\t\tinput.target,\n\t\t\tinput.source.center,\n\t\t\tinput.targetAnchor ?? defaultAnchors.targetAnchor,\n\t\t),\n\t];\n}\n\nfunction routeAnchorPairs(\n\tinput: RouteEdgeInput,\n\tdefaultAnchors: { sourceAnchor: AnchorName; targetAnchor: AnchorName },\n): Array<{ sourceAnchor: AnchorName; targetAnchor: AnchorName }> {\n\tconst sourceAnchors = routeAnchorCandidates(\n\t\tinput.sourceAnchor,\n\t\tdefaultAnchors.sourceAnchor,\n\t\tinput.source,\n\t\tinput.target.center,\n\t);\n\tconst targetAnchors = routeAnchorCandidates(\n\t\tinput.targetAnchor,\n\t\tdefaultAnchors.targetAnchor,\n\t\tinput.target,\n\t\tinput.source.center,\n\t);\n\tconst pairs = sourceAnchors.flatMap((sourceAnchor) =>\n\t\ttargetAnchors.map((targetAnchor) => ({ sourceAnchor, targetAnchor })),\n\t);\n\tconst seen = new Set<string>();\n\treturn pairs.filter((pair) => {\n\t\tconst key = `${pair.sourceAnchor}->${pair.targetAnchor}`;\n\t\tif (seen.has(key)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(key);\n\t\treturn true;\n\t});\n}\n\nfunction routeAnchorCandidates(\n\texplicitAnchor: AnchorName | undefined,\n\tdefaultAnchor: AnchorName,\n\tgeometry: RouteEdgeInput[\"source\"],\n\ttoward: Point,\n): AnchorName[] {\n\tif (explicitAnchor !== undefined) {\n\t\treturn [explicitAnchor];\n\t}\n\tconst ranked = rankedSideAnchors(geometry, toward);\n\treturn [defaultAnchor, ...ranked].filter(\n\t\t(anchor, index, anchors) => anchors.indexOf(anchor) === index,\n\t);\n}\n\nfunction rankedSideAnchors(\n\tgeometry: RouteEdgeInput[\"source\"],\n\ttoward: Point,\n): AnchorName[] {\n\tconst anchors = outwardSideAnchors(geometry.box, toward);\n\treturn anchors.sort((left, right) => {\n\t\tconst leftPoint = getEdgePort(geometry, toward, left);\n\t\tconst rightPoint = getEdgePort(geometry, toward, right);\n\t\tconst distance =\n\t\t\tsquaredDistance(leftPoint, toward) - squaredDistance(rightPoint, toward);\n\t\treturn distance === 0 ? left.localeCompare(right) : distance;\n\t});\n}\n\nfunction outwardSideAnchors(box: Box, toward: Point): AnchorName[] {\n\tconst center = {\n\t\tx: box.x + box.width / 2,\n\t\ty: box.y + box.height / 2,\n\t};\n\tconst dx = toward.x - center.x;\n\tconst dy = toward.y - center.y;\n\tif (Math.abs(dx) >= Math.abs(dy)) {\n\t\treturn dx >= 0 ? [\"right\", \"top\", \"bottom\"] : [\"left\", \"top\", \"bottom\"];\n\t}\n\treturn dy >= 0 ? [\"bottom\", \"left\", \"right\"] : [\"top\", \"left\", \"right\"];\n}\n\nfunction squaredDistance(a: Point, b: Point): number {\n\tconst dx = a.x - b.x;\n\tconst dy = a.y - b.y;\n\treturn dx * dx + dy * dy;\n}\n\nexport function simplifyRoute(points: readonly Point[]): Point[] {\n\tconst withoutDuplicates: Point[] = [];\n\tfor (const point of points) {\n\t\tconst previous = withoutDuplicates.at(-1);\n\t\tif (\n\t\t\tprevious === undefined ||\n\t\t\tprevious.x !== point.x ||\n\t\t\tprevious.y !== point.y\n\t\t) {\n\t\t\twithoutDuplicates.push({ ...point });\n\t\t}\n\t}\n\n\tconst simplified: Point[] = [];\n\tfor (const point of withoutDuplicates) {\n\t\tconst previous = simplified.at(-1);\n\t\tconst beforePrevious = simplified.at(-2);\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tbeforePrevious !== undefined &&\n\t\t\tareCollinear(beforePrevious, previous, point)\n\t\t) {\n\t\t\tsimplified[simplified.length - 1] = { ...point };\n\t\t} else {\n\t\t\tsimplified.push({ ...point });\n\t\t}\n\t}\n\n\treturn simplified;\n}\n\nfunction orthogonalCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n): Point[][] {\n\tconst midpointX = (source.x + target.x) / 2;\n\tconst midpointY = (source.y + target.y) / 2;\n\tconst candidates: Point[][] = [];\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tcandidates.push([\n\t\t\tsource,\n\t\t\t{ x: source.x, y: midpointY },\n\t\t\t{ x: target.x, y: midpointY },\n\t\t\ttarget,\n\t\t]);\n\t} else {\n\t\tcandidates.push([\n\t\t\tsource,\n\t\t\t{ x: midpointX, y: source.y },\n\t\t\t{ x: midpointX, y: target.y },\n\t\t\ttarget,\n\t\t]);\n\t}\n\n\tcandidates.push(\n\t\t[source, { x: target.x, y: source.y }, target],\n\t\t[source, { x: source.x, y: target.y }, target],\n\t);\n\n\treturn candidates;\n}\n\nfunction defaultSourceAnchor(direction: DiagramDirection): AnchorName {\n\tswitch (direction) {\n\t\tcase \"LR\":\n\t\t\treturn \"right\";\n\t\tcase \"RL\":\n\t\t\treturn \"left\";\n\t\tcase \"TB\":\n\t\t\treturn \"bottom\";\n\t\tcase \"BT\":\n\t\t\treturn \"top\";\n\t}\n}\n\nfunction defaultAnchorsForGeometry(\n\tsource: Box,\n\ttarget: Box,\n\tdirection: DiagramDirection,\n): { sourceAnchor: AnchorName; targetAnchor: AnchorName } {\n\tconst dx = target.x + target.width / 2 - (source.x + source.width / 2);\n\tconst dy = target.y + target.height / 2 - (source.y + source.height / 2);\n\n\tif (Math.abs(dy) > Math.abs(dx)) {\n\t\treturn dy >= 0\n\t\t\t? { sourceAnchor: \"bottom\", targetAnchor: \"top\" }\n\t\t\t: { sourceAnchor: \"top\", targetAnchor: \"bottom\" };\n\t}\n\n\tif (Math.abs(dx) > 0) {\n\t\treturn dx >= 0\n\t\t\t? { sourceAnchor: \"right\", targetAnchor: \"left\" }\n\t\t\t: { sourceAnchor: \"left\", targetAnchor: \"right\" };\n\t}\n\n\treturn {\n\t\tsourceAnchor: defaultSourceAnchor(direction),\n\t\ttargetAnchor: defaultTargetAnchor(direction),\n\t};\n}\n\nfunction defaultTargetAnchor(direction: DiagramDirection): AnchorName {\n\tswitch (direction) {\n\t\tcase \"LR\":\n\t\t\treturn \"left\";\n\t\tcase \"RL\":\n\t\t\treturn \"right\";\n\t\tcase \"TB\":\n\t\t\treturn \"top\";\n\t\tcase \"BT\":\n\t\t\treturn \"bottom\";\n\t}\n}\n\nfunction expandedObstacleCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n\tobstacles: readonly Box[],\n): Point[][] {\n\tif (obstacles.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst margin = 16;\n\tconst candidates: Point[][] = [];\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tconst lanes = sortedUniqueLanes(\n\t\t\tobstacles.flatMap((obstacle) => [\n\t\t\t\tobstacle.x - margin,\n\t\t\t\tobstacle.x + obstacle.width + margin,\n\t\t\t]),\n\t\t\t(source.x + target.x) / 2,\n\t\t);\n\n\t\tfor (const laneX of lanes) {\n\t\t\tcandidates.push([\n\t\t\t\tsource,\n\t\t\t\t{ x: laneX, y: source.y },\n\t\t\t\t{ x: laneX, y: target.y },\n\t\t\t\ttarget,\n\t\t\t]);\n\t\t}\n\t} else {\n\t\tconst lanes = sortedUniqueLanes(\n\t\t\tobstacles.flatMap((obstacle) => [\n\t\t\t\tobstacle.y - margin,\n\t\t\t\tobstacle.y + obstacle.height + margin,\n\t\t\t]),\n\t\t\t(source.y + target.y) / 2,\n\t\t);\n\n\t\tfor (const laneY of lanes) {\n\t\t\tcandidates.push([\n\t\t\t\tsource,\n\t\t\t\t{ x: source.x, y: laneY },\n\t\t\t\t{ x: target.x, y: laneY },\n\t\t\t\ttarget,\n\t\t\t]);\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction outerDoglegCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n\tobstacles: readonly Box[],\n): Point[][] {\n\tif (obstacles.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst margin = 24;\n\tconst minX = Math.min(...obstacles.map((obstacle) => obstacle.x)) - margin;\n\tconst maxX =\n\t\tMath.max(...obstacles.map((obstacle) => obstacle.x + obstacle.width)) +\n\t\tmargin;\n\tconst minY = Math.min(...obstacles.map((obstacle) => obstacle.y)) - margin;\n\tconst maxY =\n\t\tMath.max(...obstacles.map((obstacle) => obstacle.y + obstacle.height)) +\n\t\tmargin;\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tconst exit = exitDelta(source, target, \"y\");\n\t\treturn sortedUniqueLanes([minX, maxX], (source.x + target.x) / 2).map(\n\t\t\t(laneX) => [\n\t\t\t\tsource,\n\t\t\t\t{ x: source.x, y: source.y + exit },\n\t\t\t\t{ x: laneX, y: source.y + exit },\n\t\t\t\t{ x: laneX, y: target.y - exit },\n\t\t\t\t{ x: target.x, y: target.y - exit },\n\t\t\t\ttarget,\n\t\t\t],\n\t\t);\n\t}\n\n\tconst exit = exitDelta(source, target, \"x\");\n\treturn sortedUniqueLanes([minY, maxY], (source.y + target.y) / 2).map(\n\t\t(laneY) => [\n\t\t\tsource,\n\t\t\t{ x: source.x + exit, y: source.y },\n\t\t\t{ x: source.x + exit, y: laneY },\n\t\t\t{ x: target.x - exit, y: laneY },\n\t\t\t{ x: target.x - exit, y: target.y },\n\t\t\ttarget,\n\t\t],\n\t);\n}\n\nfunction exitDelta(source: Point, target: Point, axis: \"x\" | \"y\"): number {\n\tconst delta = axis === \"x\" ? target.x - source.x : target.y - source.y;\n\treturn (delta >= 0 ? 1 : -1) * 24;\n}\n\nfunction sortedUniqueLanes(\n\tlanes: readonly number[],\n\tmidpoint: number,\n): number[] {\n\treturn [...new Set(lanes)]\n\t\t.filter((lane) => Number.isFinite(lane))\n\t\t.sort((left, right) => {\n\t\t\tconst distance = Math.abs(left - midpoint) - Math.abs(right - midpoint);\n\t\t\treturn distance === 0 ? left - right : distance;\n\t\t});\n}\n\nfunction routeIntersectsObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tspatialIndex?: BoxSpatialIndex,\n): boolean {\n\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\tconst a = points[pointIndex];\n\t\tconst b = points[pointIndex + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = segmentBox(a, b);\n\t\tfor (const obstacle of candidateBoxesForSegment(\n\t\t\tobstacles,\n\t\t\ta,\n\t\t\tb,\n\t\t\tspatialIndex,\n\t\t)) {\n\t\t\tvalidateBox(obstacle);\n\t\t\tif (intersectsAabb(segment, obstacle)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n// Count how many distinct obstacles a route crosses — used to compare\n// rejected A* fallback paths and keep the one with the fewest crossings\n// (Issue #66, Codex P2).\nfunction countObstacleCrossings(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): number {\n\tlet count = 0;\n\tfor (const obstacle of obstacles) {\n\t\tvalidateBox(obstacle);\n\t\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\t\tconst a = points[pointIndex];\n\t\t\tconst b = points[pointIndex + 1];\n\t\t\tif (a === undefined || b === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (intersectsAabb(segmentBox(a, b), obstacle)) {\n\t\t\t\tcount += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\n\nfunction routeIntersectsEndpointInteriors(\n\tpoints: readonly Point[],\n\tendpointInteriors: readonly Box[],\n): boolean {\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst a = points[index];\n\t\tconst b = points[index + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = segmentBox(a, b);\n\t\tfor (const endpointInterior of endpointInteriors) {\n\t\t\tvalidateBox(endpointInterior);\n\t\t\tif (intersectsAabb(segment, endpointInterior)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction routeCrossesBoxes(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tspatialIndex?: BoxSpatialIndex,\n): boolean {\n\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\tconst a = points[pointIndex];\n\t\tconst b = points[pointIndex + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const obstacle of candidateBoxesForSegment(\n\t\t\tobstacles,\n\t\t\ta,\n\t\t\tb,\n\t\t\tspatialIndex,\n\t\t)) {\n\t\t\tvalidateBox(obstacle);\n\t\t\tif (segmentIntersectsBox(a, b, obstacle)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction candidateBoxesForSegment(\n\tobstacles: readonly Box[],\n\tstart: Point,\n\tend: Point,\n\tindex: BoxSpatialIndex | undefined,\n): readonly Box[] {\n\treturn index === undefined\n\t\t? obstacles\n\t\t: querySegmentSpatialIndex(index, start, end).map((entry) => entry.box);\n}\n\nfunction indexedBoxes(\n\tobstacles: readonly Box[],\n): Array<{ id: string; box: Box }> {\n\treturn obstacles.map((box, index) => ({ id: `obstacle:${index}`, box }));\n}\n\nfunction segmentIntersectsBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tif (pointInsideBox(start, box) || pointInsideBox(end, box)) {\n\t\treturn true;\n\t}\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\treturn (\n\t\tsegmentIntersectsBoxEdge(start, end, left, top, right, top) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, top, right, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, bottom, left, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideBox(point: Point, box: Box): boolean {\n\treturn (\n\t\tpoint.x > box.x &&\n\t\tpoint.x < box.x + box.width &&\n\t\tpoint.y > box.y &&\n\t\tpoint.y < box.y + box.height\n\t);\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentIntersectsBoxEdge(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) {\n\t\treturn false;\n\t}\n\tconst t =\n\t\t((x1 - start.x) * (y2 - y1) - (y1 - start.y) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((x1 - start.x) * (end.y - start.y) - (y1 - start.y) * (end.x - start.x)) /\n\t\tdenominator;\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\nfunction segmentBox(a: Point, b: Point): Box {\n\tconst minX = Math.min(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: Math.max(1, Math.abs(a.x - b.x)),\n\t\theight: Math.max(1, Math.abs(a.y - b.y)),\n\t};\n}\n\nfunction areCollinear(a: Point, b: Point, c: Point): boolean {\n\treturn (a.x === b.x && b.x === c.x) || (a.y === b.y && b.y === c.y);\n}\n","import { applyLayoutConstraints } from \"../constraints/index.js\";\nimport {\n\tDEFAULT_FONT,\n\tDEFAULT_LABEL_MAX_WIDTH,\n\tDEFAULT_NODE_MIN_SIZE,\n\tDEFAULT_NODE_PADDING,\n} from \"../dsl/normalize.js\";\nimport { computeArrowhead } from \"../exporters/arrow.js\";\nimport {\n\tcomputeContainerGeometry,\n\tcomputeShapeGeometry,\n\tcreateBoxSpatialIndex,\n\texpandBox,\n\texpandBoxForQuery,\n\tintersectsAabb,\n\tnormalizeInsets,\n\tqueryBoxSpatialIndex,\n\tunionBoxes,\n} from \"../geometry/index.js\";\nimport type { Constraint } from \"../ir/constraints.js\";\nimport {\n\tDELIVERABILITY_DIAGNOSTIC_CODES,\n\ttype Diagnostic,\n} from \"../ir/diagnostics.js\";\nimport type { CoordinatedDiagram, NormalizedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedFrame,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedPort,\n\tCoordinatedTableBlock,\n\tEvidencePanel,\n\tEvidenceTextLayout,\n\tMatrixBlock,\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n\tSwimlane,\n\tSwimlaneLane,\n\tTableBlock,\n\tVisualStyle,\n} from \"../ir/elements.js\";\nimport type { Box, Insets, Point, Size } from \"../ir/geometry.js\";\nimport type {\n\tLabelLayout,\n\tSolvedTextAnnotation,\n\tTextSurfaceKind,\n} from \"../ir/label-layout.js\";\nimport { fitLabel } from \"../labels/index.js\";\nimport {\n\ttype InitialLayoutResult,\n\trunComponentAwareDagreInitialLayout,\n\trunDagreInitialLayout,\n} from \"../layout/index.js\";\nimport { runRecursiveContainerLayout } from \"../layout/recursive.js\";\nimport { type RouteKind, routeEdge } from \"../routing/index.js\";\nimport { createDefaultTextMeasurer } from \"../text/index.js\";\nimport type { TextMeasurer, TextStyleOptions } from \"../text/types.js\";\nimport { LayoutPipeline } from \"./pipeline/pipeline.js\";\nimport { scoreLayoutQuality } from \"./pipeline/quality.js\";\nimport type { LayoutState } from \"./pipeline/types.js\";\n\nexport type InitialLayoutMode = \"dagre\" | \"positions\";\n\nexport interface SolveDiagramOptions {\n\t/** Selects the seed coordinates before constraints, routing, and export. */\n\tinitialLayout?: InitialLayoutMode;\n\t/** When true, use recursive bottom-up layout for container groups (Issue #54, 方案 A). */\n\trecursiveLayout?: boolean;\n\trouteKind?: RouteKind;\n\tobstacleMargin?: number | Insets;\n\t/** When true, compute quality score after solving (Issue #54, 方案 E). */\n\tqualityScore?: boolean;\n\t/** Extra horizontal/vertical clearance reserved around nodes for edge corridors. */\n\troutingGutter?: number;\n\toverlapSpacing?: number;\n\tminLaneGutter?: number;\n\tprefitLabelSize?: boolean;\n\tminSiblingGap?: number;\n\tdistributeContainedChildren?: boolean | \"spread\";\n\t/** When \"spread\", distribute children within non-contract swimlane\n\t * lanes (Issue #60). Opt-in: no redistribution occurs unless explicitly set. */\n\tdistributeSwimlaneChildren?: boolean | \"spread\";\n\tpageBounds?: { width: number; height: number };\n\tmaxStackDepth?: number;\n\tpreferredAspectRatio?: number;\n\t/** Target aspect ratio (width/height). When bounds exceed\n\t * target*3, nodes are rewrapped (Issue #60). */\n\ttargetAspectRatio?: number;\n\t/** Max nodes per row for TB/BT horizontal-rewrap (Issue #60). */\n\tmaxRowDepth?: number;\n\tportShifting?: PortShiftingOptions;\n\tcjkFontFamily?: string | false;\n\tminCjkFontSize?: number | false;\n\ttextMeasurer?: TextMeasurer;\n\t/** When true, promote deliverability-breaking diagnostics to errors. */\n\tstrict?: boolean;\n\t/** Maximum greedy rerouting iterations per edge (default 5). */\n\tmaxRoutingAttempts?: number;\n\t/** Edge label placement mode: \"beside\" offsets away from the edge, \"on-path\" (default) places at the midpoint. */\n\tlabelPlacement?: \"beside\" | \"on-path\";\n\t/** Pixels to offset edge labels from the edge path when labelPlacement is \"beside\". */\n\tlabelOffset?: number;\n\t/** Corridor expansion margin for corner-graph prefilter.\n\t * - number: fixed px margin\n\t * - \"auto\" (default): max(200, contentDiagonal * 0.3)\n\t * Larger margins include more obstacles in the local routing window,\n\t * improving path quality on dense diagrams at the cost of more vertices. */\n\tcorridorMargin?: number | \"auto\";\n\t/** Route-length / direct-distance ratio above which a backtracking\n\t * warning is emitted (default 20). */\n\tmaxBacktrackingRatio?: number;\n}\n\nexport interface PortShiftingOptions {\n\tenabled?: boolean;\n\tspacing?: number;\n}\n\nconst DEFAULT_MATRIX_CELL_SIZE: Size = { width: 120, height: 36 };\nconst DEFAULT_TABLE_CELL_SIZE: Size = { width: 128, height: 34 };\nconst DEFAULT_PANEL_WIDTH = 320;\nconst DEFAULT_PANEL_ITEM_HEIGHT = 28;\nconst DEFAULT_EVIDENCE_BLOCK_GAP = 24;\nconst EDGE_LABEL_CLEARANCE = 8;\nconst DEFAULT_CJK_FONT_FAMILY = \"YaHei,SimSun,sans-serif\";\nconst DEFAULT_MIN_CJK_FONT_SIZE = 14;\n// Reuse DSL defaults — these are the same values as DEFAULT_FONT,\n// DEFAULT_NODE_PADDING, DEFAULT_NODE_MIN_SIZE, DEFAULT_LABEL_MAX_WIDTH\n// imported from normalize.ts above.\nfunction prefitLabelFont(\n\tnode: NormalizedNode,\n\t_options: SolveDiagramOptions,\n): TextStyleOptions {\n\tconst cjk = labelCjkTypography(node.label?.metadata);\n\tconst fontFamily = cjk.fontFamily ?? DEFAULT_FONT.fontFamily;\n\tconst fontSize = cjk.fontSize ?? DEFAULT_FONT.fontSize;\n\tconst lineHeight =\n\t\tfontSize !== DEFAULT_FONT.fontSize\n\t\t\t? Math.max(DEFAULT_FONT.lineHeight ?? 18, fontSize * 1.2)\n\t\t\t: (DEFAULT_FONT.lineHeight ?? 18);\n\treturn { fontFamily, fontSize, lineHeight };\n}\n\nconst EVIDENCE_TEXT_FONT = {\n\tfontFamily: \"Arial, sans-serif\",\n\tfontSize: 10,\n\tlineHeight: 12,\n} as const;\n\ninterface SwimlaneContractLayout {\n\tbox: Box;\n\tslotWidth: number;\n\tslotHeight: number;\n\tlaneStep: number;\n}\n\ninterface SwimlaneContractResult {\n\tlayouts: Map<string, SwimlaneContractLayout>;\n\tdiagnostics: Diagnostic[];\n\tmovedChildIds: Set<string>;\n}\n\ninterface LayoutLockLike {\n\tnodeId: string;\n\tsource: string;\n}\n\ninterface CjkTypographyOptions {\n\tfontFamily?: string;\n\tminFontSize?: number;\n}\n\ninterface CjkTypography {\n\tfontFamily?: string;\n\tfontSize?: number;\n}\n\nexport function solveDiagram(\n\tdiagram: NormalizedDiagram,\n\toptions: SolveDiagramOptions = {},\n): CoordinatedDiagram {\n\tconst diagnostics: Diagnostic[] = [...diagram.diagnostics];\n\tconst nodes = stableUniqueById(\n\t\tdiagram.nodes,\n\t\tdiagnostics,\n\t\t\"nodes\",\n\t\t\"duplicate_node_id\",\n\t);\n\tconst edges = stableUniqueById(\n\t\tdiagram.edges,\n\t\tdiagnostics,\n\t\t\"edges\",\n\t\t\"duplicate_edge_id\",\n\t);\n\tconst groups = stableUniqueById(\n\t\tdiagram.groups,\n\t\tdiagnostics,\n\t\t\"groups\",\n\t\t\"duplicate_group_id\",\n\t);\n\tconst cjkTypography = createCjkTypographyOptions(options);\n\tconst cjkStyledNodes = nodes.map((node) =>\n\t\tenhanceNodeCjkTypography(node, cjkTypography, diagnostics),\n\t);\n\tconst styledNodes =\n\t\toptions.prefitLabelSize === true\n\t\t\t? cjkStyledNodes.map((node) =>\n\t\t\t\t\tprefitNodeLabelSize(node, options, diagnostics),\n\t\t\t\t)\n\t\t\t: cjkStyledNodes;\n\tconst styledEdges = edges.map((edge) =>\n\t\tenhanceEdgeCjkTypography(edge, cjkTypography, diagnostics),\n\t);\n\tconst styledGroups = groups.map((group) =>\n\t\tenhanceGroupCjkTypography(group, cjkTypography, diagnostics),\n\t);\n\tconst styledSwimlanes = (diagram.swimlanes ?? []).map((swimlane) =>\n\t\tenhanceSwimlaneCjkTypography(swimlane, cjkTypography, diagnostics),\n\t);\n\tconst constraints = stableByConstraintId(diagram.constraints);\n\tconst initialLayoutMode = options.initialLayout ?? \"dagre\";\n\tconst useRecursive = options.recursiveLayout === true;\n\tif (useRecursive && initialLayoutMode === \"positions\") {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"layout.recursive-ignores-positions\",\n\t\t\tmessage:\n\t\t\t\t'recursiveLayout overrides initialLayout \"positions\" — seed positions are ignored for bottom-up container layout.',\n\t\t});\n\t}\n\tconst layout = useRecursive\n\t\t? runRecursiveContainerLayout({\n\t\t\t\tdirection: diagram.direction,\n\t\t\t\tnodes: styledNodes,\n\t\t\t\tgroups: styledGroups,\n\t\t\t\tedges: styledEdges,\n\t\t\t\tconstraints,\n\t\t\t})\n\t\t: runInitialLayout({\n\t\t\t\tmode: initialLayoutMode,\n\t\t\t\tcomponentAware: options.maxStackDepth === undefined,\n\t\t\t\tdirection: diagram.direction,\n\t\t\t\tnodes: styledNodes,\n\t\t\t\tedges: styledEdges,\n\t\t\t});\n\n\tdiagnostics.push(...layout.diagnostics);\n\tconst initialNodeBoxes =\n\t\tinitialLayoutMode === \"positions\" ||\n\t\t(diagram.direction !== \"LR\" && diagram.direction !== \"RL\")\n\t\t\t? layout.boxes\n\t\t\t: wrapVerticalStackIfNeeded(\n\t\t\t\t\tlayout.boxes,\n\t\t\t\t\tstyledNodes,\n\t\t\t\t\tstyledEdges,\n\t\t\t\t\tdiagram.direction,\n\t\t\t\t\toptions,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\n\t// Horizontal rewrap for TB/BT layouts (Issue #60).\n\tif (\n\t\t(diagram.direction === \"TB\" || diagram.direction === \"BT\") &&\n\t\t(options.maxRowDepth !== undefined ||\n\t\t\toptions.targetAspectRatio !== undefined)\n\t) {\n\t\tconst diagCountBefore = diagnostics.length;\n\t\tconst rewrapped = wrapHorizontalStackIfNeeded(\n\t\t\tinitialNodeBoxes,\n\t\t\tstyledNodes,\n\t\t\tdiagram.direction,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\tfor (const [id, box] of rewrapped) {\n\t\t\tinitialNodeBoxes.set(id, box);\n\t\t}\n\t\t// Only clear position fields when the rewrap actually executed\n\t\t// (horizontal_runaway diagnostic was emitted).\n\t\tif (diagnostics.length > diagCountBefore) {\n\t\t\tfor (const node of styledNodes) {\n\t\t\t\tif (node.position !== undefined && rewrapped.has(node.id)) {\n\t\t\t\t\tconst rwBox = rewrapped.get(node.id)!;\n\t\t\t\t\t// Clone node before setting position to avoid mutating\n\t\t\t\t\t// caller diagram.nodes (Issue #61 codex P2).\n\t\t\t\t\tconst idx = styledNodes.indexOf(node);\n\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\tstyledNodes[idx] = {\n\t\t\t\t\t\t\t...node,\n\t\t\t\t\t\t\tposition: { x: rwBox.x, y: rwBox.y },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// When using recursive layout, pre-populate group boxes from\n\t// bottom-up layout so downstream coordinateGroups does not\n\t// recompute them from scratch.\n\tif (useRecursive && \"groupBoxes\" in layout) {\n\t\tconst recursiveLayout =\n\t\t\tlayout as import(\"../layout/recursive.js\").RecursiveLayoutResult;\n\t\tfor (const [groupId, groupBox] of recursiveLayout.groupBoxes) {\n\t\t\tinitialNodeBoxes.set(groupId, groupBox);\n\t\t}\n\t}\n\n\t// Expand node boxes for port capacity before constraint solving\n\t// so containment, overlap repair, and swimlane contracts see the\n\t// final sizes (Codex P2: avoid post-hoc expansion issues).\n\texpandNodeBoxesForPorts(styledNodes, initialNodeBoxes, options, diagnostics);\n\n\tconst constrained = applyLayoutConstraints({\n\t\tdirection: diagram.direction,\n\t\toverlapSpacing: options?.overlapSpacing ?? 40,\n\t\t...(options.minSiblingGap === undefined\n\t\t\t? {}\n\t\t\t: { minSiblingGap: options.minSiblingGap }),\n\t\tdistributeContainedChildren: options.distributeContainedChildren ?? true,\n\t\t...(options.distributeSwimlaneChildren !== undefined\n\t\t\t? { distributeSwimlaneChildren: options.distributeSwimlaneChildren }\n\t\t\t: {}),\n\t\tswimlanes: styledSwimlanes,\n\t\tboxes: initialNodeBoxes,\n\t\tnodes: styledNodes,\n\t\tgroups: styledGroups,\n\t\tconstraints,\n\t});\n\n\tdiagnostics.push(...constrained.diagnostics);\n\tconst swimlaneContracts = applySwimlaneLayoutContracts(\n\t\tstyledSwimlanes,\n\t\tconstraints,\n\t\tstyledEdges,\n\t\tisTopToBottomReadingDirection(diagram.metadata?.primaryReadingDirection),\n\t\tconstrained.boxes,\n\t\tconstrained.locks,\n\t\toptions?.overlapSpacing ?? 40,\n\t\tMath.max(0, options?.minLaneGutter ?? 0),\n\t\toptions.distributeContainedChildren ?? true,\n\t);\n\t// Distribution may resolve overlaps that were reported earlier\n\t// by repairOverlaps — clean those up before continuing.\n\tremoveResolvedOverlapDiagnostics(diagnostics, constrained.boxes);\n\tdiagnostics.push(...swimlaneContracts.diagnostics);\n\n\tconst coordinatedNodes = coordinateNodes(\n\t\tstyledNodes,\n\t\tconstrained.boxes,\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst nodeGeometryById = new Map(\n\t\tcoordinatedNodes.map((node) => [\n\t\t\tnode.id,\n\t\t\tcomputeShapeGeometry({\n\t\t\t\tshape: node.shape,\n\t\t\t\tbox: node.box,\n\t\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t\t}),\n\t\t]),\n\t);\n\tconst coordinatedGroups = coordinateGroups(\n\t\tstyledGroups,\n\t\tconstrained.boxes,\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst coordinatedSwimlanes = coordinateSwimlanes(\n\t\tstyledSwimlanes,\n\t\tconstrained.boxes,\n\t\tswimlaneContracts.layouts,\n\t);\n\tconst coordinatedMatrices = coordinateMatrices(diagram.matrices ?? []);\n\tconst coordinatedTables = coordinateTables(diagram.tables ?? []);\n\tconst coordinatedEvidencePanels = coordinateEvidencePanels(\n\t\tdiagram.evidencePanels ?? [],\n\t);\n\tconst groupBoxes = new Map(\n\t\tcoordinatedGroups.map((group) => [group.id, group.box]),\n\t);\n\tconst baseTextAnnotations = coordinateBaseTextAnnotations({\n\t\tnodes: coordinatedNodes,\n\t\tgroups: coordinatedGroups,\n\t\tswimlanes: coordinatedSwimlanes,\n\t\t...(options.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer }),\n\t});\n\tconst edgeLabelEstimates = estimateEdgeLabelAnnotations(\n\t\tstyledEdges,\n\t\tnodeGeometryById,\n\t\toptions.textMeasurer,\n\t);\n\tconst layoutBoxes = [\n\t\t...coordinatedNodes.map((node) => node.box),\n\t\t...coordinatedNodes.flatMap((node) =>\n\t\t\t(node.ports ?? []).flatMap((port) =>\n\t\t\t\tport.label === undefined ? [port.box] : [port.box, portLabelBox(port)],\n\t\t\t),\n\t\t),\n\t\t...groupBoxes.values(),\n\t\t...coordinatedSwimlanes.flatMap((swimlane) =>\n\t\t\tswimlane.box === undefined ? [] : [swimlane.box],\n\t\t),\n\t\t...baseTextAnnotations.map((annotation) => annotation.box),\n\t];\n\tconst initialContentBounds =\n\t\tlayoutBoxes.length === 0\n\t\t\t? { x: 0, y: 0, width: 0, height: 0 }\n\t\t\t: unionBoxes(layoutBoxes);\n\tplaceEvidenceBlocks(\n\t\toptions.obstacleMargin ?? 0,\n\t\t[\n\t\t\t...coordinatedMatrices,\n\t\t\t...coordinatedTables,\n\t\t\t...coordinatedEvidencePanels,\n\t\t],\n\t\tinitialContentBounds,\n\t);\n\trefreshTableColumnXOffsets(coordinatedTables);\n\tmeasureEvidenceTextBlocks(\n\t\tcoordinatedMatrices,\n\t\tcoordinatedTables,\n\t\tcoordinatedEvidencePanels,\n\t\toptions.textMeasurer,\n\t);\n\tconst evidenceBoxes = [\n\t\t...coordinatedMatrices.map((matrix) => matrix.box),\n\t\t...coordinatedTables.map((table) => table.box),\n\t\t...coordinatedEvidencePanels.map((panel) => panel.box),\n\t];\n\tdiagnostics.push(\n\t\t...reportEvidenceBlockOverlaps(\n\t\t\t[\n\t\t\t\t...coordinatedMatrices.map((matrix) => ({\n\t\t\t\t\tid: matrix.id,\n\t\t\t\t\tkind: \"matrix\",\n\t\t\t\t\t...(matrix.position === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { position: matrix.position }),\n\t\t\t\t\tbox: matrix.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedTables.map((table) => ({\n\t\t\t\t\tid: table.id,\n\t\t\t\t\tkind: \"table\",\n\t\t\t\t\t...(table.position === undefined ? {} : { position: table.position }),\n\t\t\t\t\tbox: table.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedEvidencePanels.map((panel) => ({\n\t\t\t\t\tid: panel.id,\n\t\t\t\t\tkind: \"evidence-panel\",\n\t\t\t\t\t...(panel.position === undefined ? {} : { position: panel.position }),\n\t\t\t\t\tbox: panel.box,\n\t\t\t\t})),\n\t\t\t],\n\t\t\t[\n\t\t\t\t...coordinatedNodes.map((node) => ({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\tkind: \"node\",\n\t\t\t\t\tbox: node.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedGroups.map((group) => ({\n\t\t\t\t\tid: group.id,\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\tbox: group.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedSwimlanes.flatMap((swimlane) =>\n\t\t\t\t\tswimlane.box === undefined\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [{ id: swimlane.id, kind: \"swimlane\", box: swimlane.box }],\n\t\t\t\t),\n\t\t\t],\n\t\t),\n\t);\n\tconst allBoxes = [...layoutBoxes, ...evidenceBoxes];\n\tconst contentBounds =\n\t\tallBoxes.length === 0\n\t\t\t? { x: 0, y: 0, width: 0, height: 0 }\n\t\t\t: unionBoxes(allBoxes);\n\tconst frame =\n\t\tdiagram.frame === undefined\n\t\t\t? undefined\n\t\t\t: coordinateFrame(diagram.frame, contentBounds);\n\tconst frameTextAnnotation =\n\t\tframe === undefined\n\t\t\t? []\n\t\t\t: [coordinateFrameTextAnnotation(frame, options.textMeasurer)];\n\tconst routingTextObstacles = [\n\t\t...baseTextAnnotations.filter(isPreRouteTextObstacle),\n\t\t...frameTextAnnotation.filter(isPreRouteTextObstacle),\n\t\t// Dry-run edge-label estimates so edges route around\n\t\t// each other's label areas (Issue #41).\n\t\t...edgeLabelEstimates,\n\t];\n\t// Expand evidence-block boxes by obstacleMargin so edges route\n\t// around them with the same clearance as node/group boxes.\n\tconst margin = options.obstacleMargin ?? 0;\n\tconst softObstacles = [\n\t\t...coordinatedTables.map((table) => expandBox(table.box, margin)),\n\t\t...coordinatedEvidencePanels.map((panel) => expandBox(panel.box, margin)),\n\t];\n\tconst hardObstacles = coordinatedMatrices.map((matrix) =>\n\t\texpandBox(matrix.box, margin),\n\t);\n\n\t// Include frame title box and swimlane lane header boxes so edges\n\t// do not route through title bars (issue #29).\n\tconst titleBarObstacles: Box[] = [];\n\tif (frame !== undefined) {\n\t\ttitleBarObstacles.push(expandBox(frame.titleBox, margin));\n\t}\n\tfor (const swimlane of coordinatedSwimlanes) {\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (\n\t\t\t\tlane.headerBox !== undefined &&\n\t\t\t\tlane.headerBox.width > 0 &&\n\t\t\t\tlane.headerBox.height > 0\n\t\t\t) {\n\t\t\t\ttitleBarObstacles.push(expandBox(lane.headerBox, margin));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst coordinatedEdges = coordinateEdges(\n\t\tstyledEdges,\n\t\tnodeGeometryById,\n\t\tcoordinatedNodes,\n\t\t[...nodeGeometryById.values()].map((geometry) =>\n\t\t\toptions.routingGutter === undefined\n\t\t\t\t? geometry.obstacleBox\n\t\t\t\t: expandBox(geometry.obstacleBox, options.routingGutter),\n\t\t),\n\t\t[...softObstacles, ...titleBarObstacles],\n\t\troutingTextObstacles,\n\t\thardObstacles,\n\t\tdiagram.direction,\n\t\toptions,\n\t\tdiagnostics,\n\t\tcoordinatedGroups,\n\t\tcontentBounds,\n\t);\n\tconst edgeTextAnnotations = coordinateEdgeTextAnnotations(\n\t\tcoordinatedEdges,\n\t\t[\n\t\t\t...coordinatedNodes.map((node) => node.box),\n\t\t\t...baseTextAnnotations.map((annotation) => annotation.box),\n\t\t\t...frameTextAnnotation.map((annotation) => annotation.box),\n\t\t],\n\t\toptions.textMeasurer,\n\t\toptions.labelPlacement,\n\t\toptions.labelOffset,\n\t);\n\tconst textAnnotations = [\n\t\t...baseTextAnnotations,\n\t\t...frameTextAnnotation,\n\t\t...edgeTextAnnotations,\n\t];\n\tdiagnostics.push(...reportTextAnnotationCollisions(textAnnotations));\n\tdiagnostics.push(\n\t\t...reportRouteTextClearance(coordinatedEdges, textAnnotations),\n\t);\n\tconst edgePointBounds = edgeBounds(coordinatedEdges);\n\tconst boundsBase = [\n\t\tcontentBounds,\n\t\t...edgePointBounds,\n\t\t...edgeTextAnnotations.map((annotation) => annotation.box),\n\t];\n\tdiagnostics.push(\n\t\t...reportPageOverflow(\n\t\t\tframe === undefined\n\t\t\t\t? unionBoxes(boundsBase)\n\t\t\t\t: unionBoxes([...boundsBase, frame.box, frame.titleBox]),\n\t\t\toptions.pageBounds,\n\t\t),\n\t);\n\n\tlet degraded = false;\n\tconst resultDiagnostics = diagnostics.map((diagnostic) => {\n\t\tif (DELIVERABILITY_DIAGNOSTIC_CODES.has(diagnostic.code)) {\n\t\t\tdegraded = true;\n\t\t\tif (options.strict) {\n\t\t\t\treturn { ...diagnostic, severity: \"error\" as const };\n\t\t\t}\n\t\t}\n\t\treturn diagnostic;\n\t});\n\n\treturn {\n\t\tid: diagram.id,\n\t\t...(diagram.title === undefined ? {} : { title: diagram.title }),\n\t\tdirection: diagram.direction,\n\t\tnodes: coordinatedNodes,\n\t\tedges: coordinatedEdges,\n\t\tgroups: coordinatedGroups,\n\t\t...(coordinatedSwimlanes.length === 0\n\t\t\t? {}\n\t\t\t: { swimlanes: coordinatedSwimlanes }),\n\t\t...(coordinatedMatrices.length === 0\n\t\t\t? {}\n\t\t\t: { matrices: coordinatedMatrices }),\n\t\t...(coordinatedTables.length === 0 ? {} : { tables: coordinatedTables }),\n\t\t...(coordinatedEvidencePanels.length === 0\n\t\t\t? {}\n\t\t\t: { evidencePanels: coordinatedEvidencePanels }),\n\t\tdiagnostics: resultDiagnostics,\n\t\tdegraded,\n\t\tbounds:\n\t\t\tframe === undefined\n\t\t\t\t? unionBoxes(boundsBase)\n\t\t\t\t: unionBoxes([...boundsBase, frame.box, frame.titleBox]),\n\t\t...(frame === undefined ? {} : { frame }),\n\t\t...(textAnnotations.length === 0 ? {} : { textAnnotations }),\n\t\t...(diagram.metadata === undefined ? {} : { metadata: diagram.metadata }),\n\t};\n}\n\n/**\n * Convenience wrapper around {@link solveDiagram} that enables\n * {@link SolveDiagramOptions.prefitLabelSize} by default so node sizes are\n * expanded to fit their label text. Direct callers of `solveDiagram` who\n * pass hard-coded `NormalizedNode.size` values without a `labelLayout`\n * often see truncated labels; this wrapper avoids that trap.\n *\n * @see SolveDiagramOptions.prefitLabelSize\n */\nexport function solveDiagramSafe(\n\tdiagram: NormalizedDiagram,\n\toptions: SolveDiagramOptions = {},\n): CoordinatedDiagram {\n\treturn solveDiagram(diagram, { ...options, prefitLabelSize: true });\n}\n\nfunction runInitialLayout(input: {\n\tmode: InitialLayoutMode;\n\tcomponentAware: boolean;\n\tdirection: NormalizedDiagram[\"direction\"];\n\tnodes: readonly NormalizedNode[];\n\tedges: readonly NormalizedEdge[];\n}): InitialLayoutResult {\n\tif (input.mode === \"positions\") {\n\t\treturn runPositionSeededInitialLayout(input);\n\t}\n\n\tconst runAutoLayout = input.componentAware\n\t\t? runComponentAwareDagreInitialLayout\n\t\t: runDagreInitialLayout;\n\treturn runAutoLayout({\n\t\tdirection: input.direction,\n\t\tnodes: input.nodes.map((node) => ({ id: node.id, size: node.size })),\n\t\tedges: input.edges.map((edge) => ({\n\t\t\tid: edge.id,\n\t\t\tsourceId: edge.source.nodeId,\n\t\t\ttargetId: edge.target.nodeId,\n\t\t})),\n\t});\n}\n\nfunction runPositionSeededInitialLayout(input: {\n\tdirection: NormalizedDiagram[\"direction\"];\n\tnodes: readonly NormalizedNode[];\n\tedges: readonly NormalizedEdge[];\n}): InitialLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst autoNodes: NormalizedNode[] = [];\n\n\tfor (const node of input.nodes) {\n\t\tif (\n\t\t\t!isValidInitialDimension(node.size.width) ||\n\t\t\t!isValidInitialDimension(node.size.height)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-size.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has invalid layout dimensions.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"size\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.position === undefined) {\n\t\t\tautoNodes.push(node);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFiniteInitialPoint(node.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-position.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has an invalid seeded position.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"position\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, {\n\t\t\tx: node.position.x,\n\t\t\ty: node.position.y,\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\tif (autoNodes.length === 0) {\n\t\treturn { boxes, diagnostics };\n\t}\n\n\tconst autoNodeIds = new Set(autoNodes.map((node) => node.id));\n\tconst autoLayout = runComponentAwareDagreInitialLayout({\n\t\tdirection: input.direction,\n\t\tnodes: autoNodes.map((node) => ({ id: node.id, size: node.size })),\n\t\tedges: input.edges\n\t\t\t.filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\tautoNodeIds.has(edge.source.nodeId) &&\n\t\t\t\t\tautoNodeIds.has(edge.target.nodeId),\n\t\t\t)\n\t\t\t.map((edge) => ({\n\t\t\t\tid: edge.id,\n\t\t\t\tsourceId: edge.source.nodeId,\n\t\t\t\ttargetId: edge.target.nodeId,\n\t\t\t})),\n\t});\n\tdiagnostics.push(...autoLayout.diagnostics);\n\tfor (const [id, box] of autoLayout.boxes) {\n\t\tboxes.set(id, box);\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nfunction isValidInitialDimension(value: number): boolean {\n\treturn Number.isFinite(value) && value >= 0;\n}\n\nfunction isFiniteInitialPoint(point: Point): boolean {\n\treturn Number.isFinite(point.x) && Number.isFinite(point.y);\n}\n\nfunction prefitNodeLabelSize(\n\tnode: NormalizedNode,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedNode {\n\tif (node.label === undefined) {\n\t\treturn node;\n\t}\n\tconst measurer = options.textMeasurer ?? createDefaultTextMeasurer();\n\tconst layout = fitLabel(\n\t\tnode.label.text,\n\t\t{\n\t\t\tfont: prefitLabelFont(node, options),\n\t\t\tpadding: DEFAULT_NODE_PADDING,\n\t\t\tminSize: DEFAULT_NODE_MIN_SIZE,\n\t\t\tmaxWidth:\n\t\t\t\tnode.label.maxWidth ??\n\t\t\t\tMath.max(node.size.width, DEFAULT_LABEL_MAX_WIDTH),\n\t\t},\n\t\tmeasurer,\n\t);\n\tconst width = Math.max(node.size.width, layout.fittedSize.width);\n\tconst height = Math.max(node.size.height, layout.fittedSize.height);\n\tconst resized = width !== node.size.width || height !== node.size.height;\n\tif (resized) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"prefit_label_resized\",\n\t\t\tmessage: `Node ${node.id} size expanded to fit its label.`,\n\t\t\tpath: [\"nodes\", node.id],\n\t\t\tdetail: {\n\t\t\t\tnodeId: node.id,\n\t\t\t\tfrom: { width: node.size.width, height: node.size.height },\n\t\t\t\tto: { width, height },\n\t\t\t},\n\t\t});\n\t}\n\t// Center the label layout within the node dimensions so the\n\t// annotation is visually centered even when the node is larger\n\t// than what the label text requires (codex P2).\n\tconst centeredLayout = expandLabelLayoutToNode(layout, { width, height });\n\treturn { ...node, size: { width, height }, labelLayout: centeredLayout };\n}\nfunction expandLabelLayoutToNode(\n\tlayout: LabelLayout,\n\tnodeSize: Size,\n): LabelLayout {\n\tif (\n\t\tlayout.box.width >= nodeSize.width &&\n\t\tlayout.box.height >= nodeSize.height\n\t) {\n\t\treturn layout;\n\t}\n\tconst offsetX = Math.max(0, (nodeSize.width - layout.box.width) / 2);\n\tconst offsetY = Math.max(0, (nodeSize.height - layout.box.height) / 2);\n\tif (offsetX === 0 && offsetY === 0) {\n\t\treturn layout;\n\t}\n\treturn {\n\t\t...layout,\n\t\tbox: {\n\t\t\tx: layout.box.x + offsetX,\n\t\t\ty: layout.box.y + offsetY,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t},\n\t};\n}\n\nfunction reportPageOverflow(\n\tcontentBounds: Box,\n\tpageBounds: { width: number; height: number } | undefined,\n): Diagnostic[] {\n\tif (pageBounds === undefined) {\n\t\treturn [];\n\t}\n\tconst overflowRight = Math.max(\n\t\t0,\n\t\tcontentBounds.x + contentBounds.width - pageBounds.width,\n\t);\n\tconst overflowBottom = Math.max(\n\t\t0,\n\t\tcontentBounds.y + contentBounds.height - pageBounds.height,\n\t);\n\tconst overflowLeft = Math.max(0, -contentBounds.x);\n\tconst overflowTop = Math.max(0, -contentBounds.y);\n\tif (\n\t\toverflowRight === 0 &&\n\t\toverflowBottom === 0 &&\n\t\toverflowLeft === 0 &&\n\t\toverflowTop === 0\n\t) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t{\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"page_overflow\",\n\t\t\tmessage: `Content ${contentBounds.width}x${contentBounds.height} exceeds page ${pageBounds.width}x${pageBounds.height}.`,\n\t\t\tpath: [\"bounds\"],\n\t\t\tdetail: {\n\t\t\t\tpage: { width: pageBounds.width, height: pageBounds.height },\n\t\t\t\tcontent: {\n\t\t\t\t\twidth: contentBounds.width,\n\t\t\t\t\theight: contentBounds.height,\n\t\t\t\t},\n\t\t\t\toverflow: {\n\t\t\t\t\tright: overflowRight,\n\t\t\t\t\tbottom: overflowBottom,\n\t\t\t\t\tleft: overflowLeft,\n\t\t\t\t\ttop: overflowTop,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t];\n}\n\nfunction createCjkTypographyOptions(\n\toptions: SolveDiagramOptions,\n): CjkTypographyOptions {\n\tconst fontFamily =\n\t\toptions.cjkFontFamily === false\n\t\t\t? undefined\n\t\t\t: (options.cjkFontFamily ?? DEFAULT_CJK_FONT_FAMILY);\n\tconst minFontSize =\n\t\toptions.minCjkFontSize === false\n\t\t\t? undefined\n\t\t\t: (options.minCjkFontSize ?? DEFAULT_MIN_CJK_FONT_SIZE);\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(minFontSize === undefined ? {} : { minFontSize }),\n\t};\n}\n\nfunction enhanceNodeCjkTypography(\n\tnode: NormalizedNode,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedNode {\n\tconst nodeWithStyle = enhanceStyledLabelOwner(\n\t\tnode,\n\t\t[\"nodes\", node.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst ports =\n\t\tnodeWithStyle.ports === undefined\n\t\t\t? undefined\n\t\t\t: nodeWithStyle.ports.map((port) =>\n\t\t\t\t\tenhanceStyledLabelOwner(\n\t\t\t\t\t\tport,\n\t\t\t\t\t\t[\"nodes\", node.id, \"ports\", port.id],\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t),\n\t\t\t\t);\n\treturn ports === undefined ? nodeWithStyle : { ...nodeWithStyle, ports };\n}\n\nfunction enhanceEdgeCjkTypography(\n\tedge: NormalizedEdge,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedEdge {\n\treturn enhanceStyledLabelOwner(\n\t\tedge,\n\t\t[\"edges\", edge.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceGroupCjkTypography(\n\tgroup: NormalizedGroup,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedGroup {\n\treturn enhanceStyledLabelOwner(\n\t\tgroup,\n\t\t[\"groups\", group.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceSwimlaneCjkTypography(\n\tswimlane: Swimlane,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): Swimlane {\n\tconst root = enhanceStyledLabelOwner(\n\t\tswimlane,\n\t\t[\"swimlanes\", swimlane.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst lanes = root.lanes.map((lane) =>\n\t\tenhanceSwimlaneLaneCjkTypography(swimlane.id, lane, options, diagnostics),\n\t);\n\treturn { ...root, lanes };\n}\n\nfunction enhanceSwimlaneLaneCjkTypography(\n\tswimlaneId: string,\n\tlane: SwimlaneLane,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): SwimlaneLane {\n\treturn enhanceStyledLabelOwner(\n\t\tlane,\n\t\t[\"swimlanes\", swimlaneId, \"lanes\", lane.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceStyledLabelOwner<\n\tT extends { id: string; label?: { text: string; metadata?: unknown } },\n>(\n\towner: T,\n\tpath: readonly (string | number)[],\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): T {\n\tconst text = owner.label?.text;\n\tif (text === undefined || !containsCjk(text)) {\n\t\treturn owner;\n\t}\n\tconst typography = cjkTypographyForOwner(owner, options);\n\tif (\n\t\ttypography.fontFamily === undefined &&\n\t\ttypography.fontSize === undefined\n\t) {\n\t\treturn owner;\n\t}\n\tconst label = owner.label;\n\tif (label === undefined) {\n\t\treturn owner;\n\t}\n\tconst nextLabel = {\n\t\t...label,\n\t\tmetadata: {\n\t\t\t...metadataObject(label.metadata),\n\t\t\tcjkTypography: typography,\n\t\t},\n\t};\n\tconst nextOwner = { ...owner, label: nextLabel };\n\tconst maybeStyled = nextOwner as T & { style?: VisualStyle };\n\tconst nextStyle = enhanceCjkStyle(maybeStyled.style, typography);\n\treportCjkTypographyDiagnostics(\n\t\tpath,\n\t\ttypography,\n\t\tmaybeStyled.style,\n\t\tdiagnostics,\n\t);\n\treturn nextStyle === maybeStyled.style\n\t\t? nextOwner\n\t\t: { ...nextOwner, style: nextStyle };\n}\n\nfunction cjkTypographyForOwner(\n\towner: {\n\t\tlabel?: { metadata?: unknown } | undefined;\n\t\tstyle?: VisualStyle | undefined;\n\t},\n\toptions: CjkTypographyOptions,\n): CjkTypography {\n\tconst metadataTypography = labelCjkTypography(owner.label?.metadata);\n\tconst fontFamily =\n\t\tmetadataTypography.fontFamily ??\n\t\towner.style?.fontFamily ??\n\t\toptions.fontFamily;\n\tconst fontSize = boostedCjkFontSize(\n\t\tmetadataTypography.fontSize ?? owner.style?.fontSize,\n\t\toptions.minFontSize,\n\t);\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(fontSize === undefined ? {} : { fontSize }),\n\t};\n}\n\nfunction labelCjkTypography(metadata: unknown): CjkTypography {\n\tconst metadataRecord = metadataObject(metadata);\n\tif (metadataRecord === undefined) {\n\t\treturn {};\n\t}\n\tconst value = metadataRecord.cjkTypography;\n\tif (value === undefined || value === null || typeof value !== \"object\") {\n\t\treturn {};\n\t}\n\tconst typography = value as Record<string, unknown>;\n\tconst fontFamily =\n\t\ttypeof typography.fontFamily === \"string\"\n\t\t\t? typography.fontFamily\n\t\t\t: undefined;\n\tconst fontSize =\n\t\ttypeof typography.fontSize === \"number\" &&\n\t\tNumber.isFinite(typography.fontSize) &&\n\t\ttypography.fontSize > 0\n\t\t\t? typography.fontSize\n\t\t\t: undefined;\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(fontSize === undefined ? {} : { fontSize }),\n\t};\n}\n\nfunction metadataObject(\n\tmetadata: unknown,\n): Record<string, unknown> | undefined {\n\tif (\n\t\tmetadata === undefined ||\n\t\tmetadata === null ||\n\t\ttypeof metadata !== \"object\" ||\n\t\tArray.isArray(metadata)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn metadata as Record<string, unknown>;\n}\n\nfunction typographyForLabel(\n\tlabel: { metadata?: unknown } | undefined,\n): CjkTypography {\n\treturn labelCjkTypography(label?.metadata);\n}\n\nfunction typographyTextStyle(\n\tlabel: { metadata?: unknown } | undefined,\n\tbase: TextStyleOptions,\n): TextStyleOptions {\n\tconst typography = typographyForLabel(label);\n\treturn {\n\t\t...base,\n\t\t...(typography.fontFamily === undefined\n\t\t\t? {}\n\t\t\t: { fontFamily: typography.fontFamily }),\n\t\t...(typography.fontSize === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tfontSize: typography.fontSize,\n\t\t\t\t\tlineHeight: Math.max(base.lineHeight ?? 0, typography.fontSize * 1.2),\n\t\t\t\t}),\n\t};\n}\n\nfunction boostedCjkFontSize(\n\tcurrent: number | undefined,\n\tminFontSize: number | undefined,\n): number | undefined {\n\tif (minFontSize === undefined) {\n\t\treturn current;\n\t}\n\tif (current === undefined || current < minFontSize) {\n\t\treturn minFontSize;\n\t}\n\treturn current;\n}\n\nfunction enhanceCjkStyle(\n\tstyle: VisualStyle | undefined,\n\ttypography: CjkTypography,\n): VisualStyle | undefined {\n\tlet next = style;\n\tif (typography.fontFamily !== undefined && next?.fontFamily === undefined) {\n\t\tnext = { ...next, fontFamily: typography.fontFamily };\n\t}\n\tif (\n\t\ttypography.fontSize !== undefined &&\n\t\t(next?.fontSize === undefined || next.fontSize < typography.fontSize)\n\t) {\n\t\tnext = { ...next, fontSize: typography.fontSize };\n\t}\n\treturn next;\n}\n\nfunction reportCjkTypographyDiagnostics(\n\tpath: readonly (string | number)[],\n\ttypography: CjkTypography,\n\tpreviousStyle: VisualStyle | undefined,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (\n\t\ttypography.fontFamily !== undefined &&\n\t\tpreviousStyle?.fontFamily === undefined\n\t) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"cjk_font_family_applied\",\n\t\t\tmessage: `Applied CJK font family ${typography.fontFamily}.`,\n\t\t\tpath: [...path, \"label\", \"metadata\", \"cjkTypography\", \"fontFamily\"],\n\t\t\tdetail: { fontFamily: typography.fontFamily },\n\t\t});\n\t}\n\tif (\n\t\ttypography.fontSize !== undefined &&\n\t\t(previousStyle?.fontSize === undefined ||\n\t\t\tpreviousStyle.fontSize < typography.fontSize)\n\t) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"cjk_font_size_boosted\",\n\t\t\tmessage: `Raised CJK font size to ${typography.fontSize}.`,\n\t\t\tpath: [...path, \"label\", \"metadata\", \"cjkTypography\", \"fontSize\"],\n\t\t\tdetail: {\n\t\t\t\tminFontSize: typography.fontSize,\n\t\t\t\t...(previousStyle?.fontSize === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { previousFontSize: previousStyle.fontSize }),\n\t\t\t},\n\t\t});\n\t}\n}\n\nfunction containsCjk(value: string): boolean {\n\treturn /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\uf900-\\ufaff]/u.test(value);\n}\n\nfunction applySwimlaneLayoutContracts(\n\tswimlanes: readonly Swimlane[],\n\tconstraints: readonly Constraint[],\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\toverlapSpacing: number,\n\tlaneGutter: number,\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractResult {\n\tconst layouts = new Map<string, SwimlaneContractLayout>();\n\tconst diagnostics: Diagnostic[] = [];\n\tconst movedChildIds = new Set<string>();\n\tfor (const swimlane of swimlanes) {\n\t\tif ((swimlane.layout ?? \"overlay\") !== \"contract\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (swimlane.lanes.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = applySingleSwimlaneContract(\n\t\t\tswimlane,\n\t\t\tedges,\n\t\t\ttopToBottomFlow,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tlaneGutter,\n\t\t\tconstraints,\n\t\t\tdistributeContainedChildren,\n\t\t);\n\t\tif (layout !== undefined) {\n\t\t\tlayouts.set(swimlane.id, layout);\n\t\t}\n\t}\n\tif (layouts.size > 0) {\n\t\tdiagnostics.push(\n\t\t\t...reportSwimlaneOverlaps(nodeBoxes, locks, overlapSpacing),\n\t\t\t...reportSwimlaneConstraintInvalidations(\n\t\t\t\tconstraints,\n\t\t\t\tnodeBoxes,\n\t\t\t\tmovedChildIds,\n\t\t\t),\n\t\t);\n\t\tif (laneGutter > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tcode: \"lane_gutter_applied\",\n\t\t\t\tmessage: `Applied ${laneGutter}px gutter between ${layouts.size} contract swimlane lane(s).`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: { laneGutter, swimlaneCount: layouts.size },\n\t\t\t});\n\t\t}\n\t}\n\treturn { layouts, diagnostics, movedChildIds };\n}\n\nfunction wrapVerticalStackIfNeeded(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tedges: readonly NormalizedEdge[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tconst wrapped = new Map([...boxes].map(([id, box]) => [id, { ...box }]));\n\tconst maxStackDepth = options.maxStackDepth;\n\tif (\n\t\tmaxStackDepth === undefined ||\n\t\tmaxStackDepth <= 0 ||\n\t\tnodes.length <= maxStackDepth\n\t) {\n\t\treportVerticalRunaway(\n\t\t\twrapped,\n\t\t\tnodes,\n\t\t\tedges,\n\t\t\tdirection,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\treturn wrapped;\n\t}\n\tif (edges.length > 0 || !isStackRunaway(wrapped, nodes, direction, options)) {\n\t\treportVerticalRunaway(\n\t\t\twrapped,\n\t\t\tnodes,\n\t\t\tedges,\n\t\t\tdirection,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\treturn wrapped;\n\t}\n\n\tconst ordered = nodes\n\t\t.map((node) => ({ node, box: wrapped.get(node.id) }))\n\t\t.filter(\n\t\t\t(item): item is { node: NormalizedNode; box: Box } =>\n\t\t\t\titem.box !== undefined,\n\t\t)\n\t\t.sort((a, b) => {\n\t\t\tconst delta = a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.node.id.localeCompare(b.node.id) : delta;\n\t\t});\n\tconst columns = Math.ceil(ordered.length / maxStackDepth);\n\tconst horizontalGap = options.overlapSpacing ?? 40;\n\tconst verticalGap = Math.max(24, horizontalGap / 2);\n\tconst columnWidths = Array.from({ length: columns }, (_, column) =>\n\t\tMath.max(\n\t\t\t0,\n\t\t\t...ordered\n\t\t\t\t.slice(column * maxStackDepth, (column + 1) * maxStackDepth)\n\t\t\t\t.map((item) => item.box.width),\n\t\t),\n\t);\n\tconst startX = Math.min(...ordered.map((item) => item.box.x));\n\tconst startY = Math.min(...ordered.map((item) => item.box.y));\n\tlet columnX = startX;\n\tfor (let column = 0; column < columns; column += 1) {\n\t\tlet y = startY;\n\t\tconst items = ordered.slice(\n\t\t\tcolumn * maxStackDepth,\n\t\t\t(column + 1) * maxStackDepth,\n\t\t);\n\t\tfor (const item of items) {\n\t\t\twrapped.set(item.node.id, { ...item.box, x: columnX, y });\n\t\t\ty += item.box.height + verticalGap;\n\t\t}\n\t\tcolumnX += (columnWidths[column] ?? 0) + horizontalGap;\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"vertical_runaway\",\n\t\tmessage: `Single-column layout exceeded maxStackDepth ${maxStackDepth}; wrapped into ${columns} columns.`,\n\t\tpath: [\"nodes\"],\n\t\tdetail: { nodeCount: ordered.length, maxStackDepth, columns },\n\t});\n\treturn wrapped;\n}\n\n/**\n * Wrap a TB/BT single horizontal row into multiple rows when\n * the layout exceeds maxRowDepth or targetAspectRatio (Issue #60).\n * Mirror of wrapVerticalStackIfNeeded for vertical layouts.\n */\nfunction wrapHorizontalStackIfNeeded(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tif (!isStackRunaway(boxes, nodes, direction, options)) {\n\t\treturn new Map(boxes);\n\t}\n\tlet maxRowDepth = options.maxRowDepth;\n\tif (\n\t\tmaxRowDepth === undefined ||\n\t\tmaxRowDepth <= 0 ||\n\t\tnodes.length <= maxRowDepth\n\t) {\n\t\t// When called with only targetAspectRatio (no maxRowDepth),\n\t\t// derive a row depth so the rewrap is not silently skipped\n\t\t// (Issue #61 codex P2).\n\t\tif (maxRowDepth === undefined && options.targetAspectRatio !== undefined) {\n\t\t\tmaxRowDepth = Math.ceil(Math.sqrt(nodes.length));\n\t\t\tif (nodes.length <= maxRowDepth) return new Map(boxes);\n\t\t} else {\n\t\t\treturn new Map(boxes);\n\t\t}\n\t}\n\tconst ordered = [...nodes].sort((a, b) => {\n\t\tconst ba = boxes.get(a.id);\n\t\tconst bb = boxes.get(b.id);\n\t\tif (ba === undefined || bb === undefined) return 0;\n\t\tconst dx = ba.x - bb.x;\n\t\treturn dx !== 0 ? dx : ba.y - bb.y;\n\t});\n\tconst rows = Math.ceil(ordered.length / maxRowDepth);\n\tconst wrapped = new Map(boxes);\n\tconst rowSpacing = options.overlapSpacing ?? 40;\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxH = 0;\n\tfor (const n of ordered) {\n\t\tconst b = boxes.get(n.id);\n\t\tif (b !== undefined) {\n\t\t\tminX = Math.min(minX, b.x);\n\t\t\tminY = Math.min(minY, b.y);\n\t\t\tmaxH = Math.max(maxH, b.height);\n\t\t}\n\t}\n\tfor (let ri = 0; ri < rows; ri++) {\n\t\tconst rowNodes = ordered.slice(ri * maxRowDepth, (ri + 1) * maxRowDepth);\n\t\tlet x = minX;\n\t\tconst y = minY + ri * (maxH + rowSpacing);\n\t\tfor (const node of rowNodes) {\n\t\t\tconst box = boxes.get(node.id);\n\t\t\tif (box === undefined) continue;\n\t\t\twrapped.set(node.id, { ...box, x, y });\n\t\t\tx += box.width + rowSpacing;\n\t\t}\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"horizontal_runaway\",\n\t\tmessage: `Single-row layout exceeded maxRowDepth ${maxRowDepth}; wrapped into ${rows} rows.`,\n\t\tpath: [\"nodes\"],\n\t\tdetail: { nodeCount: ordered.length, maxRowDepth, rows },\n\t});\n\treturn wrapped;\n}\n\nfunction reportVerticalRunaway(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tedges: readonly NormalizedEdge[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (!isStackRunaway(boxes, nodes, direction, options)) {\n\t\treturn;\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"vertical_runaway\",\n\t\tmessage:\n\t\t\t\"Layout produced a tall vertical stack beyond the preferred aspect ratio.\",\n\t\tpath: [\"nodes\"],\n\t\tdetail: {\n\t\t\tnodeCount: nodes.length,\n\t\t\tedgeCount: edges.length,\n\t\t\t...(options.preferredAspectRatio === undefined\n\t\t\t\t? {}\n\t\t\t\t: { preferredAspectRatio: options.preferredAspectRatio }),\n\t\t\t...(options.maxStackDepth === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxStackDepth: options.maxStackDepth }),\n\t\t},\n\t});\n}\n\n/**\n * Detect stack runaway in either direction.\n * For LR/RL: height/width > preferred (vertical runaway).\n * For TB/BT: width/height > preferred (horizontal runaway, Issue #60).\n */\nfunction isStackRunaway(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n): boolean {\n\tif (\n\t\toptions.maxStackDepth === undefined &&\n\t\toptions.preferredAspectRatio === undefined &&\n\t\toptions.targetAspectRatio === undefined &&\n\t\toptions.maxRowDepth === undefined\n\t) {\n\t\treturn false;\n\t}\n\tif (nodes.length < 2) {\n\t\treturn false;\n\t}\n\tconst nodeBoxes = nodes\n\t\t.map((node) => boxes.get(node.id))\n\t\t.filter((box): box is Box => box !== undefined);\n\tif (nodeBoxes.length < 2) {\n\t\treturn false;\n\t}\n\tconst bounds = unionBoxes(nodeBoxes);\n\n\tconst isHorizontal = direction === \"TB\" || direction === \"BT\";\n\tconst aspectRatio = isHorizontal\n\t\t? bounds.height <= 0\n\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t: bounds.width / bounds.height\n\t\t: bounds.width <= 0\n\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t: bounds.height / bounds.width;\n\tconst preferred = isHorizontal\n\t\t? (options.targetAspectRatio ?? options.preferredAspectRatio ?? 3)\n\t\t: (options.preferredAspectRatio ?? 3);\n\tif (\n\t\t(options.preferredAspectRatio !== undefined ||\n\t\t\toptions.targetAspectRatio !== undefined) &&\n\t\taspectRatio < preferred\n\t) {\n\t\treturn false;\n\t}\n\n\tif (isHorizontal) {\n\t\t// TB/BT: check y-spread vs maxHeight (single row runaway).\n\t\tconst yCenters = nodeBoxes.map((box) => box.y + box.height / 2);\n\t\tconst ySpread = Math.max(...yCenters) - Math.min(...yCenters);\n\t\tconst maxHeight = Math.max(...nodeBoxes.map((box) => box.height));\n\t\treturn ySpread <= Math.max(maxHeight, options.overlapSpacing ?? 40);\n\t}\n\n\t// LR/RL: check x-spread vs maxWidth (single column runaway).\n\tconst xCenters = nodeBoxes.map((box) => box.x + box.width / 2);\n\tconst xSpread = Math.max(...xCenters) - Math.min(...xCenters);\n\tconst maxWidth = Math.max(...nodeBoxes.map((box) => box.width));\n\treturn xSpread <= Math.max(maxWidth, options.overlapSpacing ?? 40);\n}\n\nfunction applySingleSwimlaneContract(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n\tconstraints: readonly Constraint[],\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractLayout | undefined {\n\tconst headerHeight = swimlane.headerHeight ?? 28;\n\tconst padding = swimlane.padding ?? 16;\n\tconst laneBounds = swimlane.lanes.map((lane) => {\n\t\tconst childBoxes = lane.children\n\t\t\t.map((child) => nodeBoxes.get(child))\n\t\t\t.filter((box): box is Box => box !== undefined);\n\t\treturn childBoxes.length === 0 ? undefined : unionBoxes(childBoxes);\n\t});\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tif (populatedBounds.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (swimlane.orientation === \"vertical\") {\n\t\treturn applyVerticalSwimlaneContract(\n\t\t\tswimlane,\n\t\t\tedges,\n\t\t\ttopToBottomFlow,\n\t\t\tnodeBoxes,\n\t\t\tlaneBounds,\n\t\t\theaderHeight,\n\t\t\tpadding,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tlaneGutter,\n\t\t\tconstraints,\n\t\t\tdistributeContainedChildren,\n\t\t);\n\t}\n\treturn applyHorizontalSwimlaneContract(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tlaneBounds,\n\t\theaderHeight,\n\t\tpadding,\n\t\tlocks,\n\t\tdiagnostics,\n\t\tmovedChildIds,\n\t\tlaneGutter,\n\t);\n}\n\nfunction applyVerticalSwimlaneContract(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlaneBounds: ReadonlyArray<Box | undefined>,\n\theaderHeight: number,\n\tpadding: number,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n\tconstraints: readonly Constraint[],\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractLayout {\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tconst top = Math.min(...populatedBounds.map((box) => box.y));\n\tconst left = Math.min(...populatedBounds.map((box) => box.x));\n\tconst maxChildHeight = Math.max(...populatedBounds.map((box) => box.height));\n\n\t// Build a set of child IDs that were placed as a UNIT by containment\n\t// distribution — cross-axis spread must be skipped for them to avoid\n\t// conflicting with that distribution (Issue #66, root cause 2). Only\n\t// suppress spread for constraints the distributor actually ran:\n\t// distributeContainedChildren enabled AND ≥2 children that would be\n\t// distributed. A child is distributable only if it has a box and is not\n\t// exact-position locked (fixed-position yields to the distributor). This\n\t// mirrors applyDistributeContained's `distributable.length < 2` guard so\n\t// single-child, all-locked, or missing-box containments do NOT suppress\n\t// spread (Codex P2).\n\tconst containedChildIds = new Set<string>();\n\tif (distributeContainedChildren) {\n\t\tfor (const c of constraints) {\n\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t// Skip if the container itself has no box — applyDistributeContained\n\t\t\t// skips missing containers (Codex P2).\n\t\t\tif (nodeBoxes.get(c.containerId) === undefined) continue;\n\t\t\tconst distributable = c.childIds.filter((childId) => {\n\t\t\t\tif (nodeBoxes.get(childId) === undefined) return false;\n\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t// exact-position (and other non-fixed) locks are reserved, not\n\t\t\t\t// distributed; fixed-position yields to the distributor.\n\t\t\t\treturn lock === undefined || lock.source === \"fixed-position\";\n\t\t\t});\n\t\t\tif (distributable.length < 2) continue;\n\t\t\t// Only mark actually distributable children — locked/oversized\n\t\t\t// children that the distributor skips should NOT suppress spread\n\t\t\t// for lanes they happen to be in (Codex P2).\n\t\t\tfor (const childId of distributable) {\n\t\t\t\tcontainedChildIds.add(childId);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst flowRanks = topToBottomFlow\n\t\t? rankVerticalSwimlaneChildren(swimlane, edges)\n\t\t: new Map<string, number>();\n\tconst maxRank =\n\t\tflowRanks.size === 0 ? 0 : Math.max(...Array.from(flowRanks.values()));\n\tconst rankStackGap = Math.max(8, padding / 2);\n\tconst maxRankStackHeight = maxVerticalRankStackHeight(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tflowRanks,\n\t\trankStackGap,\n\t);\n\tconst rankSpacing = Math.max(96, maxRankStackHeight + padding);\n\tconst contentHeight =\n\t\tmaxRank === 0 ? maxChildHeight : maxRankStackHeight + maxRank * rankSpacing;\n\t// Base slot width fits the widest single child plus padding. When a rank\n\t// will be spread horizontally, the slot must also fit the full spread\n\t// width so children stay inside lane bounds and laneStep/swimlane box\n\t// (returned below and consumed by coordinateSwimlanes) stay consistent\n\t// (Codex P2).\n\tconst spreadWidth = maxCrossAxisSpreadWidth(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tflowRanks,\n\t\tlocks,\n\t\trankStackGap,\n\t\tcontainedChildIds,\n\t);\n\tconst slotWidth =\n\t\tMath.max(\n\t\t\tMath.max(...populatedBounds.map((box) => box.width)),\n\t\t\tspreadWidth,\n\t\t) +\n\t\tpadding * 2;\n\tconst laneStep = slotWidth + laneGutter;\n\tconst laneContentTop = top + headerHeight + padding;\n\n\tfor (let index = 0; index < swimlane.lanes.length; index += 1) {\n\t\tconst lane = swimlane.lanes[index];\n\t\tconst bounds = laneBounds[index];\n\t\tif (lane === undefined || bounds === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst target = {\n\t\t\tx: left + laneStep * index + padding,\n\t\t\ty: laneContentTop,\n\t\t};\n\t\tif (maxRank === 0) {\n\t\t\t// When ≥3 unlocked children could participate in distribution\n\t\t\t// but there are no flow edges (maxRank=0), route through the\n\t\t\t// ranked function which applies cross-axis spread (Issue #62,\n\t\t\t// Codex P2). Locked children never participate.\n\t\t\t// Skip cross-axis spread if ANY lane child is already covered by\n\t\t\t// a containment constraint — the containment distribution already\n\t\t\t// placed them and cross-axis would conflict (Issue #66).\n\t\t\tconst distributable = lane.children.filter(\n\t\t\t\t(childId) => !locks.has(childId),\n\t\t\t);\n\t\t\tconst coveredByContainment = lane.children.some((childId) =>\n\t\t\t\tcontainedChildIds.has(childId),\n\t\t\t);\n\t\t\tif (\n\t\t\t\t!coveredByContainment &&\n\t\t\t\tdistributable.length >= CROSS_AXIS_SPREAD_THRESHOLD\n\t\t\t) {\n\t\t\t\tmoveRankedVerticalLaneChildren(\n\t\t\t\t\tlane.children,\n\t\t\t\t\tnodeBoxes,\n\t\t\t\t\tlocks,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t\tmovedChildIds,\n\t\t\t\t\tflowRanks,\n\t\t\t\t\trankSpacing,\n\t\t\t\t\trankStackGap,\n\t\t\t\t\t{ x: target.x, y: laneContentTop },\n\t\t\t\t\tslotWidth - padding * 2,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmoveLaneChildren(\n\t\t\t\tlane.children,\n\t\t\t\tnodeBoxes,\n\t\t\t\tlocks,\n\t\t\t\tdiagnostics,\n\t\t\t\tmovedChildIds,\n\t\t\t\t{\n\t\t\t\t\tx: target.x - bounds.x,\n\t\t\t\t\ty: target.y - bounds.y,\n\t\t\t\t},\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\t// Skip cross-axis spread for ranked lanes when children are already\n\t\t// covered by a containment constraint (Issue #66). Keep ranked\n\t\t// placement (rank spacing / flow order) but suppress horizontal\n\t\t// spread so it doesn't conflict with containment distribution (Codex P2).\n\t\tconst rankedCoveredByContainment = lane.children.some((childId) =>\n\t\t\tcontainedChildIds.has(childId),\n\t\t);\n\t\tmoveRankedVerticalLaneChildren(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tflowRanks,\n\t\t\trankSpacing,\n\t\t\trankStackGap,\n\t\t\t{ x: target.x, y: laneContentTop },\n\t\t\tslotWidth - padding * 2,\n\t\t\trankedCoveredByContainment,\n\t\t);\n\t}\n\n\treturn {\n\t\tbox: {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth: laneStep * (swimlane.lanes.length - 1) + slotWidth,\n\t\t\theight: contentHeight + padding * 2 + headerHeight,\n\t\t},\n\t\tslotWidth,\n\t\tslotHeight: contentHeight + padding * 2 + headerHeight,\n\t\tlaneStep,\n\t};\n}\n\nfunction isTopToBottomReadingDirection(value: unknown): boolean {\n\treturn value === \"top_to_bottom\" || value === \"top-to-bottom\";\n}\n\nfunction rankVerticalSwimlaneChildren(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n): Map<string, number> {\n\tconst childOrder = new Map<string, number>();\n\tfor (const lane of swimlane.lanes) {\n\t\tfor (const childId of lane.children) {\n\t\t\tif (!childOrder.has(childId)) {\n\t\t\t\tchildOrder.set(childId, childOrder.size);\n\t\t\t}\n\t\t}\n\t}\n\tif (childOrder.size === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst childIds = new Set(childOrder.keys());\n\tconst relevantEdges = edges.filter(\n\t\t(edge) =>\n\t\t\tchildIds.has(edge.source.nodeId) &&\n\t\t\tchildIds.has(edge.target.nodeId) &&\n\t\t\tedge.source.nodeId !== edge.target.nodeId,\n\t);\n\tif (relevantEdges.length === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst ranks = new Map([...childIds].map((id) => [id, 0]));\n\tconst outgoing = new Map<string, string[]>();\n\tconst inDegree = new Map([...childIds].map((id) => [id, 0]));\n\tfor (const edge of relevantEdges) {\n\t\tconst targets = outgoing.get(edge.source.nodeId) ?? [];\n\t\ttargets.push(edge.target.nodeId);\n\t\toutgoing.set(edge.source.nodeId, targets);\n\t\tinDegree.set(\n\t\t\tedge.target.nodeId,\n\t\t\t(inDegree.get(edge.target.nodeId) ?? 0) + 1,\n\t\t);\n\t}\n\n\tconst queue = [...childIds]\n\t\t.filter((id) => (inDegree.get(id) ?? 0) === 0)\n\t\t.sort((a, b) => (childOrder.get(a) ?? 0) - (childOrder.get(b) ?? 0));\n\tlet visited = 0;\n\tfor (let cursor = 0; cursor < queue.length; cursor += 1) {\n\t\tconst sourceId = queue[cursor];\n\t\tif (sourceId === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tvisited += 1;\n\t\tfor (const targetId of outgoing.get(sourceId) ?? []) {\n\t\t\tranks.set(\n\t\t\t\ttargetId,\n\t\t\t\tMath.max(ranks.get(targetId) ?? 0, (ranks.get(sourceId) ?? 0) + 1),\n\t\t\t);\n\t\t\tconst nextInDegree = (inDegree.get(targetId) ?? 0) - 1;\n\t\t\tinDegree.set(targetId, nextInDegree);\n\t\t\tif (nextInDegree === 0) {\n\t\t\t\tqueue.push(targetId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn visited === childIds.size\n\t\t? ranks\n\t\t: rankCyclicSwimlaneChildren(childIds, relevantEdges);\n}\n\nfunction rankCyclicSwimlaneChildren(\n\tchildIds: ReadonlySet<string>,\n\tedges: readonly NormalizedEdge[],\n): Map<string, number> {\n\tconst maxRank = Math.max(0, childIds.size - 1);\n\tconst ranks = new Map([...childIds].map((id) => [id, 0]));\n\tfor (let iteration = 0; iteration < childIds.size; iteration += 1) {\n\t\tlet changed = false;\n\t\tfor (const edge of edges) {\n\t\t\tconst nextRank = Math.min(\n\t\t\t\tmaxRank,\n\t\t\t\t(ranks.get(edge.source.nodeId) ?? 0) + 1,\n\t\t\t);\n\t\t\tif (nextRank > (ranks.get(edge.target.nodeId) ?? 0)) {\n\t\t\t\tranks.set(edge.target.nodeId, nextRank);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif (!changed) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn ranks;\n}\n\nfunction maxVerticalRankStackHeight(\n\tswimlane: Swimlane,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n\tgap: number,\n): number {\n\tlet maxHeight = 0;\n\tfor (const lane of swimlane.lanes) {\n\t\tfor (const stack of rankStacks(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tflowRanks,\n\t\t).values()) {\n\t\t\tconst height = stack.reduce(\n\t\t\t\t(total, item, index) =>\n\t\t\t\t\ttotal + item.box.height + (index === 0 ? 0 : gap),\n\t\t\t\t0,\n\t\t\t);\n\t\t\tmaxHeight = Math.max(maxHeight, height);\n\t\t}\n\t}\n\treturn maxHeight;\n}\n\n// Minimum unlocked same-rank children that trigger cross-axis spread\n// instead of vertical stacking (Issue #62).\nconst CROSS_AXIS_SPREAD_THRESHOLD = 3;\n\n// Width a single rank's children occupy when spread horizontally: sum of\n// widths plus inter-child gaps. Used both to pre-size the lane slot and to\n// lay the children out, so geometry stays consistent (Codex P2).\nfunction crossAxisSpreadWidth(\n\titems: ReadonlyArray<{ box: Box }>,\n\tgap: number,\n): number {\n\treturn items.reduce(\n\t\t(sum, item, index) => sum + item.box.width + (index === 0 ? 0 : gap),\n\t\t0,\n\t);\n}\n\n// Largest cross-axis spread width across all lanes/ranks of a swimlane.\n// Returns 0 when no rank meets the spread threshold. Locked children are\n// excluded (they never participate in distribution). Lanes whose children\n// are covered by a containment constraint are also excluded — they will use\n// moveLaneChildren (pure offset) instead of cross-axis spread (Issue #66).\nfunction maxCrossAxisSpreadWidth(\n\tswimlane: Swimlane,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tgap: number,\n\tcontainedChildIds?: ReadonlySet<string>,\n): number {\n\tlet maxWidth = 0;\n\tfor (const lane of swimlane.lanes) {\n\t\t// Skip lanes covered by containment constraints — they won't spread.\n\t\tif (\n\t\t\tcontainedChildIds !== undefined &&\n\t\t\tlane.children.some((childId) => containedChildIds.has(childId))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const stack of rankStacks(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tflowRanks,\n\t\t).values()) {\n\t\t\tconst unlocked = stack.filter((item) => !locks.has(item.childId));\n\t\t\tif (unlocked.length < CROSS_AXIS_SPREAD_THRESHOLD) continue;\n\t\t\tmaxWidth = Math.max(maxWidth, crossAxisSpreadWidth(unlocked, gap));\n\t\t}\n\t}\n\treturn maxWidth;\n}\n\nfunction moveRankedVerticalLaneChildren(\n\tchildIds: readonly string[],\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tflowRanks: ReadonlyMap<string, number>,\n\trankSpacing: number,\n\trankStackGap: number,\n\ttarget: Point,\n\tcontentWidth: number,\n\tsuppressSpread?: boolean,\n): void {\n\tfor (const [rank, stack] of rankStacks(childIds, nodeBoxes, flowRanks)) {\n\t\t// Filter out locked children for layout purposes. All locks are\n\t\t// respected (fixed-position and exact-position alike) so lock\n\t\t// behavior is consistent across ranked/unranked/horizontal contract\n\t\t// paths and does not depend on unrelated flow edges (Codex P2).\n\t\tconst unlocked: Array<{ childId: string; box: Box }> = [];\n\t\tfor (const item of stack) {\n\t\t\tif (locks.has(item.childId)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\tmessage: `Locked child ${item.childId} was not moved into contract swimlane slot.`,\n\t\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\t\tdetail: { nodeId: item.childId },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tunlocked.push(item);\n\t\t\t}\n\t\t}\n\t\tif (unlocked.length === 0) continue;\n\n\t\tif (unlocked.length === 1) {\n\t\t\t// Single child: center within the lane content width (target.x is\n\t\t\t// already the content-left edge, i.e. lane-left + padding).\n\t\t\tconst { childId, box } = unlocked[0]!;\n\t\t\tconst next = {\n\t\t\t\t...box,\n\t\t\t\tx: target.x + (contentWidth - box.width) / 2,\n\t\t\t\ty: target.y + rank * rankSpacing,\n\t\t\t};\n\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\tmovedChildIds.add(childId);\n\t\t\t}\n\t\t\tnodeBoxes.set(childId, next);\n\t\t} else {\n\t\t\t// Determine whether to spread horizontally or stack vertically.\n\t\t\t// When 3+ children share a rank, horizontal distribution avoids\n\t\t\t// vertical overflow that causes sibling_overlap_collapse (Issue #62).\n\t\t\t// For 2 children, vertical stacking is acceptable.\n\t\t\tconst shouldSpread =\n\t\t\t\t!suppressSpread && unlocked.length >= CROSS_AXIS_SPREAD_THRESHOLD;\n\n\t\t\tif (!shouldSpread) {\n\t\t\t\t// Normal vertical stacking (2 children fit within rank).\n\t\t\t\tlet yOffset = 0;\n\t\t\t\tfor (const { childId, box } of unlocked) {\n\t\t\t\t\tconst next = {\n\t\t\t\t\t\t...box,\n\t\t\t\t\t\tx: target.x + (contentWidth - box.width) / 2,\n\t\t\t\t\t\ty: target.y + rank * rankSpacing + yOffset,\n\t\t\t\t\t};\n\t\t\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\t\t\tmovedChildIds.add(childId);\n\t\t\t\t\t}\n\t\t\t\t\tnodeBoxes.set(childId, next);\n\t\t\t\t\tyOffset += box.height + rankStackGap;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Cross-axis (horizontal) distribution: pack children left to\n\t\t\t\t// right by their own widths plus gaps (NOT equal subslots — a\n\t\t\t\t// child wider than the average subslot would overlap neighbors),\n\t\t\t\t// then center the whole packed row within the lane content width.\n\t\t\t\t// contentWidth was pre-sized to fit this row (see\n\t\t\t\t// maxCrossAxisSpreadWidth), so the row stays within lane bounds,\n\t\t\t\t// and target.x is already the content-left edge (Codex P2). All\n\t\t\t\t// children share the same y (same rank → no vertical stagger).\n\t\t\t\tconst packedWidth = crossAxisSpreadWidth(unlocked, rankStackGap);\n\t\t\t\tlet xCursor = target.x + Math.max(0, (contentWidth - packedWidth) / 2);\n\t\t\t\tfor (const { childId, box } of unlocked) {\n\t\t\t\t\tconst next = {\n\t\t\t\t\t\t...box,\n\t\t\t\t\t\tx: xCursor,\n\t\t\t\t\t\ty: target.y + rank * rankSpacing,\n\t\t\t\t\t};\n\t\t\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\t\t\tmovedChildIds.add(childId);\n\t\t\t\t\t}\n\t\t\t\t\tnodeBoxes.set(childId, next);\n\t\t\t\t\txCursor += box.width + rankStackGap;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\tcode: \"swimlane_contract.cross_axis_distributed\",\n\t\t\t\t\tmessage: `Spread ${unlocked.length} same-rank children horizontally in contract lane (rank ${rank}).`,\n\t\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\trank,\n\t\t\t\t\t\tchildCount: unlocked.length,\n\t\t\t\t\t\tcontentWidth,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction rankStacks(\n\tchildIds: readonly string[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n): Map<number, Array<{ childId: string; box: Box }>> {\n\tconst stacks = new Map<number, Array<{ childId: string; box: Box }>>();\n\tfor (const childId of childIds) {\n\t\tconst box = nodeBoxes.get(childId);\n\t\tif (box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rank = flowRanks.get(childId) ?? 0;\n\t\tconst stack = stacks.get(rank) ?? [];\n\t\tstack.push({ childId, box });\n\t\tstacks.set(rank, stack);\n\t}\n\tfor (const stack of stacks.values()) {\n\t\tstack.sort((a, b) => {\n\t\t\tconst deltaY = a.box.y - b.box.y;\n\t\t\treturn deltaY === 0 ? a.childId.localeCompare(b.childId) : deltaY;\n\t\t});\n\t}\n\treturn stacks;\n}\n\nfunction applyHorizontalSwimlaneContract(\n\tswimlane: Swimlane,\n\tnodeBoxes: Map<string, Box>,\n\tlaneBounds: ReadonlyArray<Box | undefined>,\n\theaderHeight: number,\n\tpadding: number,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n): SwimlaneContractLayout {\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tconst top = Math.min(...populatedBounds.map((box) => box.y));\n\tconst left = Math.min(...populatedBounds.map((box) => box.x));\n\tconst slotWidth =\n\t\tMath.max(...populatedBounds.map((box) => box.width)) +\n\t\theaderHeight +\n\t\tpadding * 2;\n\tconst slotHeight =\n\t\tMath.max(...populatedBounds.map((box) => box.height)) + padding * 2;\n\tconst laneStep = slotHeight + laneGutter;\n\n\tfor (let index = 0; index < swimlane.lanes.length; index += 1) {\n\t\tconst lane = swimlane.lanes[index];\n\t\tconst bounds = laneBounds[index];\n\t\tif (lane === undefined || bounds === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst target = {\n\t\t\tx: left + headerHeight + padding,\n\t\t\ty: top + laneStep * index + padding,\n\t\t};\n\t\tmoveLaneChildren(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\t{\n\t\t\t\tx: target.x - bounds.x,\n\t\t\t\ty: target.y - bounds.y,\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\tbox: {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth: slotWidth,\n\t\t\theight: laneStep * (swimlane.lanes.length - 1) + slotHeight,\n\t\t},\n\t\tslotWidth,\n\t\tslotHeight,\n\t\tlaneStep,\n\t};\n}\n\nfunction moveLaneChildren(\n\tchildIds: readonly string[],\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\toffset: Point,\n): void {\n\tfor (const childId of childIds) {\n\t\tconst box = nodeBoxes.get(childId);\n\t\tif (box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (locks.has(childId)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\tmessage: `Locked child ${childId} was not moved into contract swimlane slot.`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: { nodeId: childId },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (offset.x !== 0 || offset.y !== 0) {\n\t\t\tmovedChildIds.add(childId);\n\t\t}\n\t\tnodeBoxes.set(childId, {\n\t\t\t...box,\n\t\t\tx: box.x + offset.x,\n\t\t\ty: box.y + offset.y,\n\t\t});\n\t}\n}\n\nfunction removeResolvedOverlapDiagnostics(\n\tdiagnostics: Diagnostic[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n): void {\n\tfor (let index = diagnostics.length - 1; index >= 0; index -= 1) {\n\t\tconst diagnostic = diagnostics[index];\n\t\tif (diagnostic?.code !== \"constraints.overlap.unresolved\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst firstId = detailString(diagnostic, \"firstId\");\n\t\tconst secondId = detailString(diagnostic, \"secondId\");\n\t\tconst first = firstId === undefined ? undefined : nodeBoxes.get(firstId);\n\t\tconst second = secondId === undefined ? undefined : nodeBoxes.get(secondId);\n\t\tif (\n\t\t\tfirst !== undefined &&\n\t\t\tsecond !== undefined &&\n\t\t\t!intersectsAabb(first, second)\n\t\t) {\n\t\t\tdiagnostics.splice(index, 1);\n\t\t}\n\t}\n}\n\nfunction reportSwimlaneConstraintInvalidations(\n\tconstraints: readonly Constraint[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tfor (const constraint of constraints) {\n\t\tconst invalidatedNodeIds = movedConstraintNodeIds(\n\t\t\tconstraint,\n\t\t\tnodeBoxes,\n\t\t\tmovedChildIds,\n\t\t);\n\t\tif (invalidatedNodeIds.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"constraints.swimlane-contract.invalidated\",\n\t\t\tmessage: `Contract swimlane placement moved node(s) after ${constraint.kind} constraint solving; final geometry no longer satisfies that constraint.`,\n\t\t\tpath: [\"swimlanes\"],\n\t\t\tdetail: {\n\t\t\t\tconstraintKind: constraint.kind,\n\t\t\t\t...(constraint.id === undefined ? {} : { constraintId: constraint.id }),\n\t\t\t\tnodeIds: invalidatedNodeIds,\n\t\t\t},\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction movedConstraintNodeIds(\n\tconstraint: Constraint,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tswitch (constraint.kind) {\n\t\tcase \"exact-position\":\n\t\t\treturn [];\n\t\tcase \"containment\":\n\t\t\treturn movedContainmentViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"relative-position\":\n\t\t\treturn movedRelativeViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"align\":\n\t\t\treturn movedAlignViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"distribute\":\n\t\t\treturn movedDistributeViolations(constraint, nodeBoxes, movedChildIds);\n\t}\n}\n\nfunction movedContainmentViolations(\n\tconstraint: Extract<Constraint, { kind: \"containment\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tconst container = nodeBoxes.get(constraint.containerId);\n\tif (container === undefined) {\n\t\treturn [];\n\t}\n\tconst content = paddedContentBox(container, constraint.padding);\n\treturn constraint.childIds.filter((childId) => {\n\t\tif (!movedChildIds.has(childId)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst child = nodeBoxes.get(childId);\n\t\treturn child !== undefined && !boxInside(child, content);\n\t});\n}\n\nfunction movedRelativeViolations(\n\tconstraint: Extract<Constraint, { kind: \"relative-position\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (\n\t\t!movedChildIds.has(constraint.sourceId) &&\n\t\t!movedChildIds.has(constraint.referenceId)\n\t) {\n\t\treturn [];\n\t}\n\tconst source = nodeBoxes.get(constraint.sourceId);\n\tconst reference = nodeBoxes.get(constraint.referenceId);\n\tif (source === undefined || reference === undefined) {\n\t\treturn [];\n\t}\n\treturn sameBoxPosition(\n\t\tsource,\n\t\texpectedRelativeBox(source, reference, constraint),\n\t)\n\t\t? []\n\t\t: [constraint.sourceId];\n}\n\nfunction movedAlignViolations(\n\tconstraint: Extract<Constraint, { kind: \"align\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (!constraint.targetIds.some((id) => movedChildIds.has(id))) {\n\t\treturn [];\n\t}\n\tconst targets = constraint.targetIds\n\t\t.map((id) => ({ id, box: nodeBoxes.get(id) }))\n\t\t.filter(\n\t\t\t(target): target is { id: string; box: Box } => target.box !== undefined,\n\t\t);\n\tconst anchor = targets[0];\n\tif (anchor === undefined) {\n\t\treturn [];\n\t}\n\tconst expected = alignmentValue(anchor.box, constraint.axis);\n\treturn targets\n\t\t.filter(\n\t\t\t(target) =>\n\t\t\t\tmovedChildIds.has(target.id) &&\n\t\t\t\t!sameNumber(alignmentValue(target.box, constraint.axis), expected),\n\t\t)\n\t\t.map((target) => target.id);\n}\n\nfunction movedDistributeViolations(\n\tconstraint: Extract<Constraint, { kind: \"distribute\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (!constraint.targetIds.some((id) => movedChildIds.has(id))) {\n\t\treturn [];\n\t}\n\tconst targets = constraint.targetIds\n\t\t.map((id) => ({ id, box: nodeBoxes.get(id) }))\n\t\t.filter(\n\t\t\t(target): target is { id: string; box: Box } => target.box !== undefined,\n\t\t)\n\t\t.sort((a, b) => {\n\t\t\tconst delta =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? a.box.x - b.box.x\n\t\t\t\t\t: a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.id.localeCompare(b.id) : delta;\n\t\t});\n\tif (targets.length < 3) {\n\t\treturn [];\n\t}\n\tconst first = targets[0];\n\tconst last = targets.at(-1);\n\tif (first === undefined || last === undefined) {\n\t\treturn [];\n\t}\n\tconst expectedSpacing =\n\t\tconstraint.spacing ??\n\t\t(distributionStart(last.box, constraint.axis) -\n\t\t\tdistributionStart(first.box, constraint.axis)) /\n\t\t\t(targets.length - 1);\n\treturn targets\n\t\t.slice(1)\n\t\t.filter((target, index) => {\n\t\t\tconst previous = targets[index];\n\t\t\tif (previous === undefined || !movedChildIds.has(target.id)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn !sameNumber(\n\t\t\t\tdistributionStart(target.box, constraint.axis) -\n\t\t\t\t\tdistributionStart(previous.box, constraint.axis),\n\t\t\t\texpectedSpacing,\n\t\t\t);\n\t\t})\n\t\t.map((target) => target.id);\n}\n\nfunction expectedRelativeBox(\n\tsource: Box,\n\treference: Box,\n\tconstraint: Extract<Constraint, { kind: \"relative-position\" }>,\n): Box {\n\tconst offset = constraint.offset ?? { x: 0, y: 0 };\n\tswitch (constraint.relation) {\n\t\tcase \"above\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y - source.height + offset.y,\n\t\t\t};\n\t\tcase \"right-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + reference.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t\tcase \"below\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y + reference.height + offset.y,\n\t\t\t};\n\t\tcase \"left-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x - source.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t}\n}\n\nfunction paddedContentBox(container: Box, padding: Insets | undefined): Box {\n\tconst margin = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\tx: container.x + margin.left,\n\t\ty: container.y + margin.top,\n\t\twidth: container.width - margin.left - margin.right,\n\t\theight: container.height - margin.top - margin.bottom,\n\t};\n}\n\nfunction boxInside(child: Box, container: Box): boolean {\n\treturn (\n\t\tchild.x >= container.x &&\n\t\tchild.y >= container.y &&\n\t\tchild.x + child.width <= container.x + container.width &&\n\t\tchild.y + child.height <= container.y + container.height\n\t);\n}\n\nfunction sameBoxPosition(first: Box, second: Box): boolean {\n\treturn sameNumber(first.x, second.x) && sameNumber(first.y, second.y);\n}\n\nfunction sameNumber(first: number, second: number): boolean {\n\treturn Math.abs(first - second) < 0.001;\n}\n\nfunction alignmentValue(\n\tbox: Box,\n\taxis: Extract<Constraint, { kind: \"align\" }>[\"axis\"],\n): number {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn box.x;\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn box.y;\n\t\tcase \"center-x\":\n\t\t\treturn box.x + box.width / 2;\n\t\tcase \"center-y\":\n\t\t\treturn box.y + box.height / 2;\n\t\tcase \"right\":\n\t\t\treturn box.x + box.width;\n\t\tcase \"bottom\":\n\t\t\treturn box.y + box.height;\n\t}\n}\n\nfunction distributionStart(\n\tbox: Box,\n\taxis: Extract<Constraint, { kind: \"distribute\" }>[\"axis\"],\n): number {\n\treturn axis === \"horizontal\" ? box.x : box.y;\n}\n\nfunction detailString(\n\tdiagnostic: Diagnostic,\n\tkey: \"firstId\" | \"secondId\",\n): string | undefined {\n\tconst value = diagnostic.detail?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction reportSwimlaneOverlaps(\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\toverlapSpacing: number,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst ids = [...nodeBoxes.keys()].sort();\n\tfor (const firstId of ids) {\n\t\tfor (const secondId of ids) {\n\t\t\tif (firstId >= secondId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst first = nodeBoxes.get(firstId);\n\t\t\tconst second = nodeBoxes.get(secondId);\n\t\t\tif (first === undefined || second === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!intersectsAabb(first, second)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\tmessage: `Boxes ${firstId} and ${secondId} still overlap after contract swimlane placement with configured spacing ${overlapSpacing}.`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: {\n\t\t\t\t\tfirstId,\n\t\t\t\t\tsecondId,\n\t\t\t\t\tfirstLocked: locks.has(firstId),\n\t\t\t\t\tsecondLocked: locks.has(secondId),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction coordinateNodes(\n\tnodes: readonly NormalizedNode[],\n\tboxes: ReadonlyMap<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): CoordinatedNode[] {\n\tconst coordinated: CoordinatedNode[] = [];\n\n\tfor (const node of nodes) {\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"solver.node-box.missing\",\n\t\t\t\tmessage: `Node ${node.id} has no solved box.`,\n\t\t\t\tpath: [\"nodes\", node.id],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Place ports first — they may expand the node box to\n\t\t// accommodate minimum port spacing (#42).\n\t\tconst ports =\n\t\t\tnode.ports === undefined\n\t\t\t\t? undefined\n\t\t\t\t: coordinatePorts(node, box, options.portShifting);\n\n\t\tconst geometry = computeShapeGeometry({\n\t\t\tshape: node.shape,\n\t\t\tbox,\n\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t});\n\n\t\tcoordinated.push({\n\t\t\tid: node.id,\n\t\t\t...(node.label === undefined ? {} : { label: node.label }),\n\t\t\t...(node.style === undefined ? {} : { style: node.style }),\n\t\t\t...(ports === undefined ? {} : { ports }),\n\t\t\t...(node.compartments === undefined\n\t\t\t\t? {}\n\t\t\t\t: { compartments: node.compartments }),\n\t\t\t...(node.labelLayout === undefined\n\t\t\t\t? {}\n\t\t\t\t: { labelLayout: node.labelLayout }),\n\t\t\tshape: node.shape,\n\t\t\t...(node.metadata === undefined ? {} : { metadata: node.metadata }),\n\t\t\tbox: geometry.box,\n\t\t\tanchors: geometry.anchors,\n\t\t\t...(node.parentId === undefined ? {} : { parentId: node.parentId }),\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nconst PORT_BOX_SIZE = 10;\nconst MIN_PORT_EDGE_GAP = 12;\n\n/**\n * Pre-expand node boxes whose sides cannot accommodate all ports\n * at the minimum spacing. Runs before constraint solving so\n * containment, overlap repair, and swimlane contracts see the\n * expanded sizes (Codex P2: #42).\n */\nfunction expandNodeBoxesForPorts(\n\tnodes: readonly NormalizedNode[],\n\tboxes: Map<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): void {\n\tconst shiftingEnabled = options.portShifting?.enabled ?? true;\n\tif (!shiftingEnabled) return;\n\tconst requestedSpacing = options.portShifting?.spacing ?? 24;\n\tconst minSpacing = Math.max(\n\t\trequestedSpacing,\n\t\tPORT_BOX_SIZE + MIN_PORT_EDGE_GAP,\n\t);\n\n\tfor (const node of nodes) {\n\t\tif (node.ports === undefined || node.ports.length === 0) continue;\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) continue;\n\n\t\t// Aggregate required expansion per axis so all sides\n\t\t// are handled atomically (Codex P2: avoid stale anchors).\n\t\tlet heightExpansion = 0;\n\t\tlet widthExpansion = 0;\n\n\t\tconst portsBySide = new Map<string, NormalizedNode[\"ports\"]>();\n\t\tfor (const port of node.ports) {\n\t\t\tconst list = portsBySide.get(port.side) ?? [];\n\t\t\tlist.push(port);\n\t\t\tportsBySide.set(port.side, list);\n\t\t}\n\n\t\tfor (const [side, ports] of portsBySide) {\n\t\t\tconst count = (ports ?? []).length;\n\t\t\tif (count <= 1) continue;\n\t\t\tconst isVertical = side === \"left\" || side === \"right\";\n\t\t\tconst availableSpan = isVertical ? box.height : box.width;\n\t\t\tconst requiredSpan = (count - 1) * minSpacing + PORT_BOX_SIZE;\n\t\t\tif (requiredSpan > availableSpan) {\n\t\t\t\tconst expansion = requiredSpan - availableSpan;\n\t\t\t\tif (isVertical) {\n\t\t\t\t\theightExpansion = Math.max(heightExpansion, expansion);\n\t\t\t\t} else {\n\t\t\t\t\twidthExpansion = Math.max(widthExpansion, expansion);\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\tcode: \"port_capacity_overflow\",\n\t\t\t\t\tmessage: `Expanded node ${node.id} ${isVertical ? \"height\" : \"width\"} by ${Math.ceil(expansion)} px to fit ${count} port(s) on ${side} side.`,\n\t\t\t\t\tpath: [\"nodes\", node.id, \"ports\"],\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tnodeId: node.id,\n\t\t\t\t\t\tside,\n\t\t\t\t\t\tportCount: count,\n\t\t\t\t\t\texpansion: Math.ceil(expansion),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (heightExpansion > 0) {\n\t\t\tbox.y -= heightExpansion / 2;\n\t\t\tbox.height += heightExpansion;\n\t\t}\n\t\tif (widthExpansion > 0) {\n\t\t\tbox.x -= widthExpansion / 2;\n\t\t\tbox.width += widthExpansion;\n\t\t}\n\t\t// Recenter the label layout to match the expanded box.\n\t\t// Only shift layout.box — lines and contentBox stay\n\t\t// relative to the label area so the SVG renderer's\n\t\t// annotation.box + line.box addition is not doubled\n\t\t// (Codex P2: multiline labels on port-expanded nodes).\n\t\tif (\n\t\t\t(heightExpansion > 0 || widthExpansion > 0) &&\n\t\t\tnode.labelLayout !== undefined\n\t\t) {\n\t\t\tconst layout = node.labelLayout;\n\t\t\tconst newOffsetX = Math.max(0, (box.width - layout.box.width) / 2);\n\t\t\tconst newOffsetY = Math.max(0, (box.height - layout.box.height) / 2);\n\t\t\t(node as NormalizedNode).labelLayout = {\n\t\t\t\t...layout,\n\t\t\t\tbox: {\n\t\t\t\t\t...layout.box,\n\t\t\t\t\tx: newOffsetX,\n\t\t\t\t\ty: newOffsetY,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction coordinatePorts(\n\tnode: NormalizedNode,\n\tnodeBox: Box,\n\tportShifting: PortShiftingOptions | undefined,\n): CoordinatedPort[] {\n\tconst portsBySide = new Map<string, NormalizedNode[\"ports\"]>();\n\tfor (const port of node.ports ?? []) {\n\t\tconst ports = portsBySide.get(port.side) ?? [];\n\t\tports.push(port);\n\t\tportsBySide.set(port.side, ports);\n\t}\n\n\tconst coordinated: CoordinatedPort[] = [];\n\tfor (const [side, ports] of portsBySide) {\n\t\tconst sorted = [...(ports ?? [])].sort((a, b) => {\n\t\t\tconst order = (a.order ?? 0) - (b.order ?? 0);\n\t\t\treturn order === 0 ? a.id.localeCompare(b.id) : order;\n\t\t});\n\t\tfor (let index = 0; index < sorted.length; index += 1) {\n\t\t\tconst port = sorted[index];\n\t\t\tif (port === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst anchor = portAnchor(\n\t\t\t\tnodeBox,\n\t\t\t\tside as CoordinatedPort[\"side\"],\n\t\t\t\tindex,\n\t\t\t\tsorted.length,\n\t\t\t\tportShifting,\n\t\t\t);\n\t\t\tconst box = portBox(anchor);\n\t\t\tcoordinated.push({ ...port, box, anchor });\n\t\t}\n\t}\n\n\treturn coordinated.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction portAnchor(\n\tnodeBox: Box,\n\tside: CoordinatedPort[\"side\"],\n\tindex: number,\n\tcount: number,\n\tportShifting: PortShiftingOptions | undefined,\n): Point {\n\tconst shiftingEnabled = portShifting?.enabled ?? true;\n\tconst requestedSpacing = portShifting?.spacing ?? 24;\n\tconst maxOffset =\n\t\tside === \"left\" || side === \"right\"\n\t\t\t? nodeBox.height / 2\n\t\t\t: nodeBox.width / 2;\n\t// When (count - 1) * spacing would overflow the node edge, compress the\n\t// spacing so every port still gets a distinct anchor evenly distributed\n\t// within the available extent, instead of clamping several ports onto the\n\t// same endpoint.\n\tconst availableSpan = 2 * maxOffset;\n\tconst minSpacing = PORT_BOX_SIZE + MIN_PORT_EDGE_GAP;\n\tconst spacing =\n\t\tshiftingEnabled && count > 1\n\t\t\t? Math.max(\n\t\t\t\t\tMath.min(requestedSpacing, availableSpan / (count - 1)),\n\t\t\t\t\tminSpacing,\n\t\t\t\t)\n\t\t\t: requestedSpacing;\n\tconst centeredOffset = shiftingEnabled\n\t\t? (index - (count - 1) / 2) * spacing\n\t\t: 0;\n\tswitch (side) {\n\t\tcase \"left\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x,\n\t\t\t\ty: nodeBox.y + nodeBox.height / 2 + centeredOffset,\n\t\t\t};\n\t\tcase \"right\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width,\n\t\t\t\ty: nodeBox.y + nodeBox.height / 2 + centeredOffset,\n\t\t\t};\n\t\tcase \"top\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width / 2 + centeredOffset,\n\t\t\t\ty: nodeBox.y,\n\t\t\t};\n\t\tcase \"bottom\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width / 2 + centeredOffset,\n\t\t\t\ty: nodeBox.y + nodeBox.height,\n\t\t\t};\n\t}\n}\n\nfunction portBox(anchor: Point): Box {\n\tconst size = PORT_BOX_SIZE;\n\treturn {\n\t\tx: anchor.x - size / 2,\n\t\ty: anchor.y - size / 2,\n\t\twidth: size,\n\t\theight: size,\n\t};\n}\n\nfunction portLabelBox(port: CoordinatedPort): Box {\n\tconst textWidth = Math.max(0, (port.label?.text.length ?? 0) * 6);\n\tconst height = 12;\n\tconst gap = 8;\n\tconst x =\n\t\tport.side === \"left\"\n\t\t\t? port.anchor.x - gap - textWidth\n\t\t\t: port.anchor.x + gap;\n\treturn {\n\t\tx,\n\t\ty: port.anchor.y - 8 - height,\n\t\twidth: textWidth,\n\t\theight,\n\t};\n}\n\nfunction coordinateSwimlanes(\n\tswimlanes: readonly Swimlane[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tlayouts: ReadonlyMap<string, SwimlaneContractLayout>,\n): Swimlane[] {\n\treturn swimlanes.map((swimlane) => {\n\t\tconst layout = swimlane.layout ?? \"overlay\";\n\t\tconst headerHeight = swimlane.headerHeight ?? 28;\n\t\tconst padding = swimlane.padding ?? 16;\n\t\tconst contractLayout = layouts.get(swimlane.id);\n\t\tif (layout === \"contract\" && contractLayout !== undefined) {\n\t\t\tconst lanes = swimlane.lanes.map((lane, index) => {\n\t\t\t\tconst box =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: contractLayout.box.x + contractLayout.laneStep * index,\n\t\t\t\t\t\t\t\ty: contractLayout.box.y,\n\t\t\t\t\t\t\t\twidth: contractLayout.slotWidth,\n\t\t\t\t\t\t\t\theight: contractLayout.box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: contractLayout.box.x,\n\t\t\t\t\t\t\t\ty: contractLayout.box.y + contractLayout.laneStep * index,\n\t\t\t\t\t\t\t\twidth: contractLayout.box.width,\n\t\t\t\t\t\t\t\theight: contractLayout.slotHeight,\n\t\t\t\t\t\t\t};\n\t\t\t\tconst headerBox =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: headerHeight,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: headerHeight,\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t};\n\t\t\t\tconst contentBox =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y + headerHeight,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: Math.max(0, box.height - headerHeight),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x + headerHeight,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: Math.max(0, box.width - headerHeight),\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\t...lane,\n\t\t\t\t\tbox,\n\t\t\t\t\theaderBox,\n\t\t\t\t\tcontentBox,\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...swimlane,\n\t\t\t\tlanes,\n\t\t\t\tbox: contractLayout.box,\n\t\t\t\t...(headerHeight === undefined ? {} : { headerHeight }),\n\t\t\t\t...(padding === undefined ? {} : { padding }),\n\t\t\t};\n\t\t}\n\t\tconst laneContentBoxes = swimlane.lanes.map((lane) => {\n\t\t\tconst childBoxes = lane.children\n\t\t\t\t.map((child) => nodeBoxes.get(child))\n\t\t\t\t.filter((box): box is Box => box !== undefined);\n\t\t\treturn childBoxes.length === 0 ? undefined : unionBoxes(childBoxes);\n\t\t});\n\t\tconst laneUnion =\n\t\t\tlaneContentBoxes.filter((box): box is Box => box !== undefined).length ===\n\t\t\t0\n\t\t\t\t? { x: 0, y: 0, width: 120, height: 80 }\n\t\t\t\t: unionBoxes(\n\t\t\t\t\t\tlaneContentBoxes.filter((box): box is Box => box !== undefined),\n\t\t\t\t\t);\n\t\tconst outer = expand(laneUnion, padding, headerHeight);\n\t\tconst laneCount = Math.max(1, swimlane.lanes.length);\n\t\tconst lanes = swimlane.lanes.map((lane, index) => {\n\t\t\tconst box =\n\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tx: outer.x + (outer.width / laneCount) * index,\n\t\t\t\t\t\t\ty: outer.y,\n\t\t\t\t\t\t\twidth: outer.width / laneCount,\n\t\t\t\t\t\t\theight: outer.height,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tx: outer.x,\n\t\t\t\t\t\t\ty: outer.y + (outer.height / laneCount) * index,\n\t\t\t\t\t\t\twidth: outer.width,\n\t\t\t\t\t\t\theight: outer.height / laneCount,\n\t\t\t\t\t\t};\n\t\t\tconst headerBox =\n\t\t\t\tlayout === \"contract\"\n\t\t\t\t\t? swimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: headerHeight,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: headerHeight,\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\tconst contentBox =\n\t\t\t\tlayout === \"contract\"\n\t\t\t\t\t? swimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y + headerHeight,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: Math.max(0, box.height - headerHeight),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x + headerHeight,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: Math.max(0, box.width - headerHeight),\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\t...lane,\n\t\t\t\tbox,\n\t\t\t\t...(headerBox === undefined ? {} : { headerBox }),\n\t\t\t\t...(contentBox === undefined ? {} : { contentBox }),\n\t\t\t};\n\t\t});\n\t\treturn {\n\t\t\t...swimlane,\n\t\t\tlanes,\n\t\t\tbox: outer,\n\t\t\t...(headerHeight === undefined ? {} : { headerHeight }),\n\t\t\t...(padding === undefined ? {} : { padding }),\n\t\t};\n\t});\n}\n\nfunction coordinateFrame(\n\tframe: NonNullable<NormalizedDiagram[\"frame\"]>,\n\tcontentBounds: Box,\n): CoordinatedFrame {\n\tconst padding = framePadding(frame.padding);\n\tconst titleHeight = frame.headerHeight ?? 28;\n\tconst titleWidth = Math.max(180, frame.titleTab.length * 7);\n\tconst box = {\n\t\tx: contentBounds.x - padding.left,\n\t\ty: contentBounds.y - padding.top - titleHeight,\n\t\twidth: contentBounds.width + padding.left + padding.right,\n\t\theight: contentBounds.height + padding.top + padding.bottom + titleHeight,\n\t};\n\treturn {\n\t\t...frame,\n\t\theaderHeight: titleHeight,\n\t\tpadding: frame.padding ?? 32,\n\t\tbox,\n\t\ttitleBox: {\n\t\t\tx: box.x,\n\t\t\ty: box.y,\n\t\t\twidth: Math.min(titleWidth, box.width * 0.8),\n\t\t\theight: titleHeight,\n\t\t},\n\t};\n}\n\nfunction framePadding(\n\tvalue: NonNullable<NormalizedDiagram[\"frame\"]>[\"padding\"],\n): Insets {\n\treturn normalizeInsets(value ?? 32);\n}\n\nfunction expand(box: Box, padding: number, titleSize: number): Box {\n\treturn {\n\t\tx: box.x - padding,\n\t\ty: box.y - padding - titleSize,\n\t\twidth: box.width + padding * 2,\n\t\theight: box.height + padding * 2 + titleSize,\n\t};\n}\n\nfunction coordinateGroups(\n\tgroups: readonly NormalizedGroup[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): CoordinatedGroup[] {\n\tconst coordinated: CoordinatedGroup[] = [];\n\tconst groupBoxes = new Map<string, Box>();\n\n\tfor (const group of groups) {\n\t\tconst childBoxes: Box[] = [];\n\t\tlet missing = false;\n\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\tconst box = nodeBoxes.get(nodeId);\n\t\t\tif (box === undefined) {\n\t\t\t\tmissing = true;\n\t\t\t\tdiagnostics.push(groupReferenceMissing(group.id, \"node\", nodeId));\n\t\t\t} else {\n\t\t\t\tchildBoxes.push(box);\n\t\t\t}\n\t\t}\n\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\tconst box = groupBoxes.get(childGroupId);\n\t\t\tif (box === undefined) {\n\t\t\t\tmissing = true;\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\tgroupReferenceMissing(group.id, \"group\", childGroupId),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchildBoxes.push(box);\n\t\t\t}\n\t\t}\n\n\t\tif (missing || childBoxes.length === 0) {\n\t\t\tif (childBoxes.length === 0) {\n\t\t\t\tdiagnostics.push(groupReferenceMissing(group.id, \"child\", undefined));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst geometry = computeContainerGeometry({\n\t\t\tid: group.id,\n\t\t\tchildBoxes,\n\t\t\tpadding: group.padding,\n\t\t\t...(group.labelLayout === undefined\n\t\t\t\t? {}\n\t\t\t\t: { labelLayout: group.labelLayout }),\n\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t});\n\t\tgroupBoxes.set(group.id, geometry.box);\n\t\tdiagnostics.push(...geometry.diagnostics);\n\t\tcoordinated.push({\n\t\t\t...group,\n\t\t\tbox: geometry.box,\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nfunction coordinateMatrices(\n\tmatrices: readonly MatrixBlock[],\n): CoordinatedMatrixBlock[] {\n\treturn matrices.map((block) => ({\n\t\t...block,\n\t\tbox: blockBox(block, {\n\t\t\twidth:\n\t\t\t\tdefaultMatrixRowHeaderWidth(block) +\n\t\t\t\tMath.max(1, block.cols.length) * DEFAULT_MATRIX_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, block.rows.length + 1) * DEFAULT_MATRIX_CELL_SIZE.height,\n\t\t}),\n\t}));\n}\n\nfunction defaultMatrixRowHeaderWidth(block: MatrixBlock): number {\n\treturn block.rows.length === 0\n\t\t? 0\n\t\t: Math.min(96, DEFAULT_MATRIX_CELL_SIZE.width);\n}\n\nfunction coordinateTables(\n\ttables: readonly TableBlock[],\n): CoordinatedTableBlock[] {\n\treturn tables.map((table) => {\n\t\tconst box = blockBox(table, {\n\t\t\twidth: Math.max(1, table.columns.length) * DEFAULT_TABLE_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, table.rows.length + 1) * DEFAULT_TABLE_CELL_SIZE.height,\n\t\t});\n\t\treturn {\n\t\t\t...table,\n\t\t\tbox,\n\t\t\tcolumnXOffsets: columnXOffsets(table, box),\n\t\t};\n\t});\n}\n\nfunction coordinateEvidencePanels(\n\tpanels: readonly EvidencePanel[],\n): CoordinatedEvidencePanel[] {\n\treturn panels.map((block) => ({\n\t\t...block,\n\t\tbox: blockBox(block, {\n\t\t\twidth: DEFAULT_PANEL_WIDTH,\n\t\t\theight: Math.max(1, block.items.length) * DEFAULT_PANEL_ITEM_HEIGHT,\n\t\t}),\n\t}));\n}\n\nfunction edgeBounds(edges: readonly CoordinatedEdge[]): Box[] {\n\treturn edges.flatMap((edge) => {\n\t\tif (edge.points.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\t// Include the rendered arrowhead polygon (tip/left/right) so page\n\t\t// overflow accounts for geometry that extends past the route points.\n\t\tconst extraPoints: Point[] = [];\n\t\tif (edge.points.length >= 2) {\n\t\t\tconst arrowhead = computeArrowhead(edge.points);\n\t\t\textraPoints.push(arrowhead.tip, arrowhead.left, arrowhead.right);\n\t\t}\n\t\tconst allPoints = [...edge.points, ...extraPoints];\n\t\tconst minX = Math.min(...allPoints.map((point) => point.x));\n\t\tconst minY = Math.min(...allPoints.map((point) => point.y));\n\t\tconst maxX = Math.max(...allPoints.map((point) => point.x));\n\t\tconst maxY = Math.max(...allPoints.map((point) => point.y));\n\t\treturn [\n\t\t\t{\n\t\t\t\tx: minX,\n\t\t\t\ty: minY,\n\t\t\t\twidth: maxX - minX,\n\t\t\t\theight: maxY - minY,\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction blockBox(\n\tblock: { position?: Point; size?: Size },\n\tdefaultSize: Size,\n): Box {\n\treturn {\n\t\tx: block.position?.x ?? 0,\n\t\ty: block.position?.y ?? 0,\n\t\twidth: block.size?.width ?? defaultSize.width,\n\t\theight: block.size?.height ?? defaultSize.height,\n\t};\n}\n\nfunction placeEvidenceBlocks(\n\tobstacleMargin: number | Insets,\n\tblocks: Array<{ position?: Point; box: Box }>,\n\tcontentBounds: Box,\n): void {\n\tconst margin = normalizeInsets(obstacleMargin);\n\tconst horizontalGap = Math.max(\n\t\tDEFAULT_EVIDENCE_BLOCK_GAP,\n\t\tmargin.right + margin.left,\n\t);\n\tconst verticalGap = Math.max(\n\t\tDEFAULT_EVIDENCE_BLOCK_GAP,\n\t\tmargin.bottom + margin.top,\n\t);\n\tlet nextY = contentBounds.y;\n\tconst x = contentBounds.x + contentBounds.width + horizontalGap;\n\tfor (const block of blocks) {\n\t\tif (block.position !== undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tblock.box.x = x;\n\t\tblock.box.y = nextY;\n\t\tnextY += block.box.height + verticalGap;\n\t}\n}\n\nfunction columnXOffsets(table: TableBlock, box: Box): number[] {\n\tif (table.columns.length === 0) {\n\t\treturn [];\n\t}\n\tconst columnWidth = box.width / table.columns.length;\n\treturn table.columns.map((_, index) => box.x + index * columnWidth);\n}\n\nfunction tableCellBox(\n\ttable: CoordinatedTableBlock,\n\tcolumnIndex: number,\n\trowIndex: number,\n\trowHeight: number,\n\tcolumnCount: number,\n): Box {\n\tconst x =\n\t\ttable.columnXOffsets[columnIndex] ??\n\t\ttable.box.x + (table.box.width / columnCount) * columnIndex;\n\tconst nextX =\n\t\ttable.columnXOffsets[columnIndex + 1] ?? table.box.x + table.box.width;\n\treturn {\n\t\tx,\n\t\ty: table.box.y + rowIndex * rowHeight,\n\t\twidth: nextX - x,\n\t\theight: rowHeight,\n\t};\n}\n\nfunction refreshTableColumnXOffsets(tables: CoordinatedTableBlock[]): void {\n\tfor (const table of tables) {\n\t\ttable.columnXOffsets = columnXOffsets(table, table.box);\n\t}\n}\n\nfunction measureEvidenceTextBlocks(\n\tmatrices: CoordinatedMatrixBlock[],\n\ttables: CoordinatedTableBlock[],\n\tpanels: CoordinatedEvidencePanel[],\n\ttextMeasurer?: TextMeasurer,\n): void {\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tfor (const matrix of matrices) {\n\t\tconst geometry = matrixGeometry(matrix);\n\t\tmatrix.columnLabelLayouts = matrix.cols.map((column) =>\n\t\t\tmeasureEvidenceTextLayout(column, geometry.columnHeaderBox, measurer),\n\t\t);\n\t\tmatrix.rowLabelLayouts = matrix.rows.map((row, index) =>\n\t\t\tmeasureEvidenceTextLayout(row, geometry.rowHeaderBox(index), measurer),\n\t\t);\n\t\tmatrix.cellLabelLayouts = matrix.rows.map((_, rowIndex) =>\n\t\t\tmatrix.cols.map((_, columnIndex) => {\n\t\t\t\tconst cell = matrix.cells[rowIndex]?.[columnIndex] ?? { text: \"\" };\n\t\t\t\treturn measureEvidenceTextLayout(\n\t\t\t\t\tcell.text,\n\t\t\t\t\tgeometry.cellBox(rowIndex, columnIndex),\n\t\t\t\t\tmeasurer,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const table of tables) {\n\t\tconst rowHeight = table.box.height / Math.max(1, table.rows.length + 1);\n\t\tconst columnCount = Math.max(1, table.columns.length);\n\t\ttable.columnLabelLayouts = table.columns.map((column, columnIndex) =>\n\t\t\tmeasureEvidenceTextLayout(\n\t\t\t\tcolumn.label.text,\n\t\t\t\ttableCellBox(table, columnIndex, 0, rowHeight, columnCount),\n\t\t\t\tmeasurer,\n\t\t\t),\n\t\t);\n\t\ttable.cellLabelLayouts = table.rows.map((row, rowIndex) =>\n\t\t\ttable.columns.map((column, columnIndex) => {\n\t\t\t\tconst cell = row.cells[column.id] ?? { text: \"\" };\n\t\t\t\treturn measureEvidenceTextLayout(\n\t\t\t\t\tcell.text,\n\t\t\t\t\ttableCellBox(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tcolumnIndex,\n\t\t\t\t\t\trowIndex + 1,\n\t\t\t\t\t\trowHeight,\n\t\t\t\t\t\tcolumnCount,\n\t\t\t\t\t),\n\t\t\t\t\tmeasurer,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const panel of panels) {\n\t\tconst geometry = panelGeometry(panel);\n\t\tpanel.titleLayout = measureEvidenceTextLayout(\n\t\t\t`${panel.kind}: ${panel.id}`,\n\t\t\tgeometry.titleBox,\n\t\t\tmeasurer,\n\t\t);\n\t\tpanel.itemLayouts = panel.items.map((item, index) =>\n\t\t\tmeasureEvidenceTextLayout(\n\t\t\t\tpanelItemText(item.label.text, item.detail?.text),\n\t\t\t\tgeometry.itemRowBox(index),\n\t\t\t\tmeasurer,\n\t\t\t),\n\t\t);\n\t}\n}\n\nfunction measureEvidenceTextLayout(\n\ttext: string,\n\tbox: Box,\n\ttextMeasurer: TextMeasurer,\n): EvidenceTextLayout {\n\tconst lineHeight = EVIDENCE_TEXT_FONT.lineHeight;\n\treturn {\n\t\tlines: wrapEvidenceText(text, {\n\t\t\tmaxWidth: Math.max(0, box.width - 8),\n\t\t\tmaxLines: Math.max(1, Math.floor((box.height - 4) / lineHeight)),\n\t\t\ttextMeasurer,\n\t\t}),\n\t};\n}\n\nfunction wrapEvidenceText(\n\ttext: string,\n\toptions: { maxWidth: number; maxLines: number; textMeasurer: TextMeasurer },\n): string[] {\n\tconst normalized = text.trim().replace(/\\s+/g, \" \");\n\tif (normalized.length === 0) {\n\t\treturn [\"\"];\n\t}\n\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tlet overflow = false;\n\tfor (const word of normalized.split(\" \")) {\n\t\tconst chunks = chunkEvidenceWord(\n\t\t\tword,\n\t\t\toptions.maxWidth,\n\t\t\toptions.textMeasurer,\n\t\t);\n\t\tfor (const chunk of chunks) {\n\t\t\tconst candidate = current.length === 0 ? chunk : `${current} ${chunk}`;\n\t\t\tif (\n\t\t\t\tmeasureEvidenceText(candidate, options.textMeasurer) <= options.maxWidth\n\t\t\t) {\n\t\t\t\tcurrent = candidate;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (current.length > 0) {\n\t\t\t\tlines.push(current);\n\t\t\t\tcurrent = chunk;\n\t\t\t} else {\n\t\t\t\tlines.push(chunk);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (lines.length >= options.maxLines) {\n\t\t\t\toverflow = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (overflow) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!overflow && current.length > 0) {\n\t\tlines.push(current);\n\t}\n\tif (lines.length > options.maxLines) {\n\t\toverflow = true;\n\t\tlines.length = options.maxLines;\n\t}\n\tif (overflow || lines.length === options.maxLines) {\n\t\tconst rendered = lines.join(\" \");\n\t\tif (rendered.length < normalized.length) {\n\t\t\tlines[lines.length - 1] = ellipsizeMeasuredEvidenceLine(\n\t\t\t\tlines[lines.length - 1] ?? \"\",\n\t\t\t\toptions.maxWidth,\n\t\t\t\toptions.textMeasurer,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn lines.length === 0 ? [\"\"] : lines;\n}\n\nfunction chunkEvidenceWord(\n\tword: string,\n\tmaxWidth: number,\n\ttextMeasurer: TextMeasurer,\n): string[] {\n\tif (measureEvidenceText(word, textMeasurer) <= maxWidth) {\n\t\treturn [word];\n\t}\n\tconst chunks: string[] = [];\n\tlet current = \"\";\n\tfor (const char of Array.from(word)) {\n\t\tconst candidate = `${current}${char}`;\n\t\tif (\n\t\t\tcurrent.length > 0 &&\n\t\t\tmeasureEvidenceText(candidate, textMeasurer) > maxWidth\n\t\t) {\n\t\t\tchunks.push(current);\n\t\t\tcurrent = char;\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent = candidate;\n\t}\n\tif (current.length > 0) {\n\t\tchunks.push(current);\n\t}\n\treturn chunks.length === 0 ? [word] : chunks;\n}\n\nfunction ellipsizeMeasuredEvidenceLine(\n\tline: string,\n\tmaxWidth: number,\n\ttextMeasurer: TextMeasurer,\n): string {\n\tconst ellipsis = \"...\";\n\tif (measureEvidenceText(ellipsis, textMeasurer) > maxWidth) {\n\t\treturn \"\";\n\t}\n\tlet candidate = line.trimEnd();\n\twhile (\n\t\tcandidate.length > 0 &&\n\t\tmeasureEvidenceText(`${candidate}${ellipsis}`, textMeasurer) > maxWidth\n\t) {\n\t\tcandidate = Array.from(candidate).slice(0, -1).join(\"\").trimEnd();\n\t}\n\treturn `${candidate}${ellipsis}`;\n}\n\nfunction measureEvidenceText(text: string, textMeasurer: TextMeasurer): number {\n\treturn textMeasurer.naturalWidth(\n\t\ttextMeasurer.prepare(text, EVIDENCE_TEXT_FONT),\n\t);\n}\n\nfunction matrixGeometry(matrix: CoordinatedMatrixBlock): {\n\trowHeaderWidth: number;\n\tcellWidth: number;\n\trowHeight: number;\n\tcolumnHeaderBox: Box;\n\trowHeaderBox: (rowIndex: number) => Box;\n\tcellBox: (rowIndex: number, columnIndex: number) => Box;\n} {\n\tconst columnCount = Math.max(1, matrix.cols.length);\n\tconst rowCount = matrix.rows.length;\n\tconst rowHeaderWidth =\n\t\trowCount > 0 ? Math.min(96, matrix.box.width * 0.28) : 0;\n\tconst dataWidth = Math.max(0, matrix.box.width - rowHeaderWidth);\n\tconst cellWidth = dataWidth / columnCount;\n\tconst rowHeight = matrix.box.height / Math.max(1, rowCount + 1);\n\treturn {\n\t\trowHeaderWidth,\n\t\tcellWidth,\n\t\trowHeight,\n\t\tcolumnHeaderBox: {\n\t\t\tx: matrix.box.x + rowHeaderWidth,\n\t\t\ty: matrix.box.y,\n\t\t\twidth: cellWidth,\n\t\t\theight: rowHeight,\n\t\t},\n\t\trowHeaderBox: (rowIndex) => ({\n\t\t\tx: matrix.box.x,\n\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: rowHeaderWidth,\n\t\t\theight: rowHeight,\n\t\t}),\n\t\tcellBox: (rowIndex, columnIndex) => ({\n\t\t\tx: matrix.box.x + rowHeaderWidth + columnIndex * cellWidth,\n\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: cellWidth,\n\t\t\theight: rowHeight,\n\t\t}),\n\t};\n}\n\nfunction panelGeometry(panel: CoordinatedEvidencePanel): {\n\ttitleBox: Box;\n\titemRowBox: (index: number) => Box;\n} {\n\tconst titleWidth = Math.min(panel.box.width * 0.36, 140);\n\tconst itemBox = {\n\t\tx: panel.box.x + titleWidth,\n\t\ty: panel.box.y,\n\t\twidth: panel.box.width - titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst itemHeight = panel.box.height / Math.max(1, panel.items.length);\n\treturn {\n\t\ttitleBox: {\n\t\t\tx: panel.box.x,\n\t\t\ty: panel.box.y,\n\t\t\twidth: titleWidth,\n\t\t\theight: panel.box.height,\n\t\t},\n\t\titemRowBox: (index) => ({\n\t\t\tx: itemBox.x,\n\t\t\ty: itemBox.y + index * itemHeight,\n\t\t\twidth: itemBox.width,\n\t\t\theight: itemHeight,\n\t\t}),\n\t};\n}\n\nfunction panelItemText(label: string, detail: string | undefined): string {\n\treturn detail === undefined ? label : `${label}: ${detail}`;\n}\n\nfunction reportEvidenceBlockOverlaps(\n\tevidenceBlocks: Array<{\n\t\tid: string;\n\t\tkind: string;\n\t\tposition?: Point;\n\t\tbox: Box;\n\t}>,\n\tcontentBlocks: Array<{ id: string; kind: string; box: Box }>,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tfor (let index = 0; index < evidenceBlocks.length; index += 1) {\n\t\tconst block = evidenceBlocks[index];\n\t\tif (block === undefined || block.position === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const content of contentBlocks) {\n\t\t\tif (intersectsAabb(block.box, content.box)) {\n\t\t\t\tdiagnostics.push(evidenceOverlapDiagnostic(block, content));\n\t\t\t}\n\t\t}\n\t\tfor (\n\t\t\tlet otherIndex = 0;\n\t\t\totherIndex < evidenceBlocks.length;\n\t\t\totherIndex += 1\n\t\t) {\n\t\t\tif (otherIndex === index) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst other = evidenceBlocks[otherIndex];\n\t\t\tif (\n\t\t\t\tother === undefined ||\n\t\t\t\t(other.position !== undefined && otherIndex < index) ||\n\t\t\t\t!intersectsAabb(block.box, other.box)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push(evidenceOverlapDiagnostic(block, other));\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction evidenceOverlapDiagnostic(\n\tblock: { id: string; kind: string },\n\tconflict: { id: string; kind: string },\n): Diagnostic {\n\treturn {\n\t\tseverity: \"warning\",\n\t\tcode: \"constraints.overlap.unresolved\",\n\t\tmessage: `Evidence block ${block.id} overlaps ${conflict.kind} ${conflict.id}.`,\n\t\tpath: [\"evidence\", block.id],\n\t\tdetail: {\n\t\t\tevidenceBlockId: block.id,\n\t\t\tevidenceBlockKind: block.kind,\n\t\t\tconflictingObjectId: conflict.id,\n\t\t\tconflictingObjectKind: conflict.kind,\n\t\t},\n\t};\n}\n\nfunction coordinateEdges(\n\tedges: readonly NormalizedEdge[],\n\tnodes: ReadonlyMap<string, ReturnType<typeof computeShapeGeometry>>,\n\tcoordinatedNodes: readonly CoordinatedNode[],\n\tobstacles: readonly Box[],\n\tsoftObstacles: readonly Box[],\n\ttextObstacles: readonly SolvedTextAnnotation[],\n\thardObstacles: readonly Box[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n\tgroups: readonly CoordinatedGroup[],\n\tcontentBounds: Box,\n): CoordinatedEdge[] {\n\tconst coordinated: CoordinatedEdge[] = [];\n\tconst coordinatedNodeById = new Map(\n\t\tcoordinatedNodes.map((node) => [node.id, node]),\n\t);\n\t// Compute adaptive corridor margin for corner-graph prefilter (Issue #66).\n\t// \"auto\" uses 30% of the content diagonal (min 200 px) so the corridor\n\t// covers ~60% of the page on dense diagrams instead of the old fixed 32 px.\n\tconst corridorMarginOption = options.corridorMargin ?? \"auto\";\n\tconst corridorMargin: number =\n\t\ttypeof corridorMarginOption === \"number\"\n\t\t\t? corridorMarginOption\n\t\t\t: Math.max(\n\t\t\t\t\t200,\n\t\t\t\t\tMath.hypot(contentBounds.width, contentBounds.height) * 0.3,\n\t\t\t\t);\n\n\t// Effective query gutter for node-obstacle prefilter. Only widen for\n\t// obstacle-avoiding routes that actually use the adaptive corridor —\n\t// other route kinds should respect the caller's routingGutter as-is to\n\t// avoid unnecessary detours from over-including nodes (Codex P2).\n\tconst routingGutter = options.routingGutter ?? 160;\n\tconst queryGutter =\n\t\t(options.routeKind ?? \"orthogonal\") === \"obstacle-avoiding\"\n\t\t\t? Math.max(routingGutter, corridorMargin)\n\t\t\t: routingGutter;\n\tconst nodeObstacleIndex = createBoxSpatialIndex(\n\t\tobstacles.map((box, index) => ({ id: `node-obstacle:${index}`, box })),\n\t\tqueryGutter,\n\t);\n\n\tfor (const edge of edges) {\n\t\tconst source = nodes.get(edge.source.nodeId);\n\t\tconst target = nodes.get(edge.target.nodeId);\n\t\tif (source === undefined || target === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"solver.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing coordinated node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.source.nodeId,\n\t\t\t\t\ttargetId: edge.target.nodeId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst sourcePort = coordinatedNodeById\n\t\t\t.get(edge.source.nodeId)\n\t\t\t?.ports?.find((port) => port.id === edge.source.portId);\n\t\tconst targetPort = coordinatedNodeById\n\t\t\t.get(edge.target.nodeId)\n\t\t\t?.ports?.find((port) => port.id === edge.target.portId);\n\t\tconst routeTextObstacles = textObstacles\n\t\t\t.filter((annotation) => !isEdgeConnectedTextAnnotation(edge, annotation))\n\t\t\t.map((annotation) => annotation.box);\n\t\tconst corridor = edgeCorridorBox(source.box, target.box, queryGutter);\n\t\tconst routeNodeObstacles = queryBoxSpatialIndex(nodeObstacleIndex, corridor)\n\t\t\t.map((entry) => entry.box)\n\t\t\t.filter(\n\t\t\t\t(obstacle) =>\n\t\t\t\t\t!sameBox(obstacle, source.obstacleBox) &&\n\t\t\t\t\t!sameBox(obstacle, target.obstacleBox),\n\t\t\t);\n\n\t\tconst route = routeEdge({\n\t\t\tkind: options.routeKind ?? \"orthogonal\",\n\t\t\tdirection,\n\t\t\tsource: portGeometry(source, sourcePort),\n\t\t\ttarget: portGeometry(target, targetPort),\n\t\t\t...(edge.source.anchor === undefined\n\t\t\t\t? {}\n\t\t\t\t: { sourceAnchor: edge.source.anchor }),\n\t\t\t...(edge.target.anchor === undefined\n\t\t\t\t? {}\n\t\t\t\t: { targetAnchor: edge.target.anchor }),\n\t\t\tobstacles: [\n\t\t\t\t...routeNodeObstacles,\n\t\t\t\t...softObstacles,\n\t\t\t\t...groupObstaclesForEdge(edge, groups, options.obstacleMargin ?? 0),\n\t\t\t\t...routeTextObstacles,\n\t\t\t],\n\t\t\thardObstacles,\n\t\t\tcorridorMargin,\n\t\t\t...(options.maxRoutingAttempts === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxRoutingAttempts: options.maxRoutingAttempts }),\n\t\t\t...(options.maxBacktrackingRatio === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxBacktrackingRatio: options.maxBacktrackingRatio }),\n\t\t});\n\t\tdiagnostics.push(\n\t\t\t...route.diagnostics.map((diagnostic) => ({\n\t\t\t\t...diagnostic,\n\t\t\t\tdetail: { ...diagnostic.detail, edgeId: edge.id },\n\t\t\t})),\n\t\t);\n\t\tcoordinated.push({\n\t\t\t...edge,\n\t\t\tpoints: route.points,\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nfunction edgeCorridorBox(source: Box, target: Box, margin: number): Box {\n\tconst minX = Math.min(source.x, target.x);\n\tconst minY = Math.min(source.y, target.y);\n\tconst maxX = Math.max(source.x + source.width, target.x + target.width);\n\tconst maxY = Math.max(source.y + source.height, target.y + target.height);\n\treturn expandBoxForQuery(\n\t\t{ x: minX, y: minY, width: maxX - minX, height: maxY - minY },\n\t\tmargin,\n\t);\n}\n\nfunction sameBox(first: Box, second: Box): boolean {\n\treturn (\n\t\tfirst.x === second.x &&\n\t\tfirst.y === second.y &&\n\t\tfirst.width === second.width &&\n\t\tfirst.height === second.height\n\t);\n}\n\nfunction isEdgeConnectedTextAnnotation(\n\tedge: NormalizedEdge | CoordinatedEdge,\n\tannotation: SolvedTextAnnotation,\n): boolean {\n\tswitch (annotation.surfaceKind) {\n\t\tcase \"edge-label\":\n\t\t\treturn annotation.ownerId === edge.id;\n\t\tcase \"node-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn (\n\t\t\t\tannotation.ownerId === edge.source.nodeId ||\n\t\t\t\tannotation.ownerId === edge.target.nodeId\n\t\t\t);\n\t\tcase \"port-label\":\n\t\t\treturn (\n\t\t\t\t(edge.source.portId !== undefined &&\n\t\t\t\t\tannotation.ownerId ===\n\t\t\t\t\t\t`${edge.source.nodeId}.${edge.source.portId}`) ||\n\t\t\t\t(edge.target.portId !== undefined &&\n\t\t\t\t\tannotation.ownerId === `${edge.target.nodeId}.${edge.target.portId}`)\n\t\t\t);\n\t\tcase \"group-label\":\n\t\tcase \"swimlane-label\":\n\t\tcase \"frame-title\":\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Collect every group (including nested ancestors) that contains\n * the given node, by walking `group.nodeIds` and `group.groupIds`.\n */\nfunction ancestorGroupIds(\n\tgroups: readonly CoordinatedGroup[],\n\tnodeId: string,\n): Set<string> {\n\tconst direct = new Set<string>();\n\tfor (const group of groups) {\n\t\tif (group.nodeIds.includes(nodeId)) {\n\t\t\tdirect.add(group.id);\n\t\t}\n\t}\n\t// Walk upward: if a group contains any of the direct parent groups,\n\t// it is an ancestor container that should also be skipped.\n\tlet previousSize = -1;\n\tconst ancestors = new Set(direct);\n\twhile (ancestors.size !== previousSize) {\n\t\tpreviousSize = ancestors.size;\n\t\tfor (const group of groups) {\n\t\t\tfor (const candidate of ancestors) {\n\t\t\t\tif (group.groupIds.includes(candidate)) {\n\t\t\t\t\tancestors.add(group.id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn ancestors;\n}\n\n/**\n * Return group boxes that should act as soft routing obstacles for a\n * given edge. Groups that contain both endpoints (or are ancestors\n * of such groups) are skipped — an edge entirely inside a container\n * is free to route within that container (Issue #41).\n */\nfunction groupObstaclesForEdge(\n\tedge: NormalizedEdge,\n\tgroups: readonly CoordinatedGroup[],\n\tmargin: number | Insets,\n): Box[] {\n\tconst sourceAncestors = ancestorGroupIds(groups, edge.source.nodeId);\n\tconst targetAncestors = ancestorGroupIds(groups, edge.target.nodeId);\n\t// Edges that touch a group (at least one endpoint inside)\n\t// are allowed to cross its boundary; only fully external\n\t// edges must detour around the group box.\n\treturn groups\n\t\t.filter((group) => {\n\t\t\tif (sourceAncestors.has(group.id) || targetAncestors.has(group.id)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.map((group) => (margin === 0 ? group.box : expandBox(group.box, margin)));\n}\n\nfunction coordinateBaseTextAnnotations(input: {\n\tnodes: readonly CoordinatedNode[];\n\tgroups: readonly CoordinatedGroup[];\n\tswimlanes: readonly Swimlane[];\n\ttextMeasurer?: TextMeasurer;\n\t/** When true, promote deliverability-breaking diagnostics to errors. */\n\tstrict?: boolean;\n}): SolvedTextAnnotation[] {\n\tconst measurer = input.textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\n\tfor (const node of input.nodes) {\n\t\tif (node.compartments !== undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (node.labelLayout === undefined && node.label === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout =\n\t\t\tnode.labelLayout ?? fallbackLabelLayout(node.label?.text ?? \"\");\n\t\tconst buildAnnotation =\n\t\t\tnode.labelLayout === undefined\n\t\t\t\t? buildAnchorCenteredTextAnnotation\n\t\t\t\t: buildTextAnnotation;\n\t\tannotations.push(\n\t\t\tbuildAnnotation({\n\t\t\t\townerId: node.id,\n\t\t\t\tsurfaceKind: \"node-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(node.label),\n\t\t\t\tanchor: node.box,\n\t\t\t}),\n\t\t);\n\t}\n\n\tfor (const group of input.groups) {\n\t\tif (group.labelLayout === undefined && group.label === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout =\n\t\t\tgroup.labelLayout ?? fallbackLabelLayout(group.label?.text ?? \"\");\n\t\tconst buildAnnotation =\n\t\t\tgroup.labelLayout === undefined\n\t\t\t\t? buildAnchorCenteredTextAnnotation\n\t\t\t\t: buildTextAnnotation;\n\t\tannotations.push(\n\t\t\tbuildAnnotation({\n\t\t\t\townerId: group.id,\n\t\t\t\tsurfaceKind: \"group-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(group.label),\n\t\t\t\tanchor: group.box,\n\t\t\t}),\n\t\t);\n\t}\n\n\tfor (const node of input.nodes) {\n\t\tfor (const port of node.ports ?? []) {\n\t\t\tif (port.label?.text === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst layout = fitLabel(\n\t\t\t\tport.label.text,\n\t\t\t\t{\n\t\t\t\t\tfont: typographyTextStyle(port.label, {\n\t\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\t\tfontSize: 10,\n\t\t\t\t\t\tlineHeight: 12,\n\t\t\t\t\t}),\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth: 160,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildTextAnnotation({\n\t\t\t\t\townerId: `${node.id}.${port.id}`,\n\t\t\t\t\tsurfaceKind: \"port-label\",\n\t\t\t\t\tlayout,\n\t\t\t\t\ttypography: typographyForLabel(port.label),\n\t\t\t\t\tanchor: portLabelBox(port),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const node of input.nodes) {\n\t\tif (node.compartments === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rows = compartmentRows(node);\n\t\tfor (let index = 0; index < rows.length; index += 1) {\n\t\t\tconst row = rows[index];\n\t\t\tif (row === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst layout = fitLabel(\n\t\t\t\trow,\n\t\t\t\t{\n\t\t\t\t\tfont: { fontFamily: \"Arial\", fontSize: 11, lineHeight: 13 },\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth: node.box.width,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildAnchorCenteredTextAnnotation({\n\t\t\t\t\townerId: node.id,\n\t\t\t\t\tsurfaceKind: \"compartment-row\",\n\t\t\t\t\tsurfaceIndex: index,\n\t\t\t\t\tlayout,\n\t\t\t\t\tanchor: {\n\t\t\t\t\t\tx: node.box.x,\n\t\t\t\t\t\ty: node.box.y + 18 + index * 16,\n\t\t\t\t\t\twidth: node.box.width,\n\t\t\t\t\t\theight: 16,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const swimlane of input.swimlanes) {\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (lane.label?.text === undefined || lane.box === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst labelBox = lane.headerBox ?? lane.box;\n\t\t\tconst layout = fitLabel(\n\t\t\t\tlane.label.text,\n\t\t\t\t{\n\t\t\t\t\tfont: typographyTextStyle(lane.label, {\n\t\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tlineHeight: 14,\n\t\t\t\t\t}),\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth:\n\t\t\t\t\t\tswimlane.orientation === \"horizontal\"\n\t\t\t\t\t\t\t? labelBox.height\n\t\t\t\t\t\t\t: labelBox.width,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildAnchorCenteredTextAnnotation({\n\t\t\t\t\townerId: `${swimlane.id}.${lane.id}`,\n\t\t\t\t\tsurfaceKind: \"swimlane-label\",\n\t\t\t\t\tlayout,\n\t\t\t\t\ttypography: typographyForLabel(lane.label),\n\t\t\t\t\tanchor: labelBox,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn annotations;\n}\n\nfunction coordinateEdgeTextAnnotations(\n\tedges: readonly CoordinatedEdge[],\n\tobstacleBoxes: readonly Box[],\n\ttextMeasurer?: TextMeasurer,\n\tlabelPlacement?: \"beside\" | \"on-path\",\n\tlabelOffset?: number,\n): SolvedTextAnnotation[] {\n\tconst labelBaseOffset =\n\t\tlabelPlacement === \"beside\" ? (labelOffset ?? 16) : 10;\n\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\tconst placedLabelBoxes: Box[] = [];\n\n\tfor (const edge of edges) {\n\t\tif (edge.label?.text === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = fitLabel(\n\t\t\tedge.label.text,\n\t\t\t{\n\t\t\t\tfont: typographyTextStyle(edge.label, {\n\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tlineHeight: 14,\n\t\t\t\t}),\n\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\tmaxWidth: 200,\n\t\t\t},\n\t\t\tmeasurer,\n\t\t);\n\t\tconst center = edgeLabelAnchor(\n\t\t\tedge,\n\t\t\tlayout,\n\t\t\tedges,\n\t\t\tobstacleBoxes,\n\t\t\tplacedLabelBoxes,\n\t\t\tlabelBaseOffset,\n\t\t);\n\t\tplacedLabelBoxes.push({\n\t\t\tx: center.x - layout.box.width / 2,\n\t\t\ty: center.y - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t});\n\t\tannotations.push(\n\t\t\tbuildCenteredTextAnnotation({\n\t\t\t\townerId: edge.id,\n\t\t\t\tsurfaceKind: \"edge-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(edge.label),\n\t\t\t\tcenter,\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn annotations;\n}\n\n/**\n * Produce a rough edge-label box estimate using the straight-line\n * midpoint between source and target node centers. The estimate is\n * used as a pre-route text obstacle so edges can avoid each other's\n * label areas before the real label placement runs (Issue #41).\n */\nfunction estimateEdgeLabelAnnotations(\n\tedges: readonly NormalizedEdge[],\n\tnodes: ReadonlyMap<string, ReturnType<typeof computeShapeGeometry>>,\n\ttextMeasurer: TextMeasurer | undefined,\n): SolvedTextAnnotation[] {\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\n\tfor (const edge of edges) {\n\t\tif (edge.label?.text === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst sourceGeom = nodes.get(edge.source.nodeId);\n\t\tconst targetGeom = nodes.get(edge.target.nodeId);\n\t\tif (sourceGeom === undefined || targetGeom === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = fitLabel(\n\t\t\tedge.label.text,\n\t\t\t{\n\t\t\t\tfont: typographyTextStyle(edge.label, {\n\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tlineHeight: 14,\n\t\t\t\t}),\n\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\tmaxWidth: 200,\n\t\t\t},\n\t\t\tmeasurer,\n\t\t);\n\t\t// Straight-line midpoint between node centers.\n\t\tconst cx = (sourceGeom.center.x + targetGeom.center.x) / 2;\n\t\tconst cy = (sourceGeom.center.y + targetGeom.center.y) / 2;\n\t\tconst box: Box = {\n\t\t\tx: cx - layout.box.width / 2,\n\t\t\ty: cy - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t};\n\t\tannotations.push({\n\t\t\ttext: layout.text,\n\t\t\townerId: edge.id,\n\t\t\tsurfaceKind: \"edge-label\",\n\t\t\tbox,\n\t\t\tanchor: { x: cx, y: cy },\n\t\t\tpaddings: layout.padding,\n\t\t\tlines: layout.lines,\n\t\t\tfontFamily: normalizeOutputFontFamily(layout.font),\n\t\t\tfontSize: layout.font.fontSize,\n\t\t\ttextBackend: layout.textBackend,\n\t\t});\n\t}\n\treturn annotations;\n}\n\nfunction coordinateFrameTextAnnotation(\n\tframe: CoordinatedFrame,\n\ttextMeasurer?: TextMeasurer,\n): SolvedTextAnnotation {\n\tconst layout = fitLabel(\n\t\tframe.titleTab,\n\t\t{\n\t\t\tfont: { fontFamily: \"Arial\", fontSize: 12, lineHeight: 14 },\n\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\tminSize: { width: 0, height: 0 },\n\t\t\tmaxWidth: frame.titleBox.width,\n\t\t},\n\t\ttextMeasurer ?? createDefaultTextMeasurer(),\n\t);\n\treturn buildAnchorCenteredTextAnnotation({\n\t\townerId: frame.kind,\n\t\tsurfaceKind: \"frame-title\",\n\t\tlayout,\n\t\tanchor: frame.titleBox,\n\t});\n}\n\nfunction buildTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tanchor: Box;\n}): SolvedTextAnnotation {\n\treturn {\n\t\ttext: input.layout.text,\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tbox: {\n\t\t\tx: input.anchor.x + input.layout.box.x,\n\t\t\ty: input.anchor.y + input.layout.box.y,\n\t\t\twidth: input.layout.box.width,\n\t\t\theight: input.layout.box.height,\n\t\t},\n\t\tanchor: input.anchor,\n\t\tpaddings: input.layout.padding,\n\t\tlines: input.layout.lines,\n\t\tfontFamily:\n\t\t\tinput.typography?.fontFamily ??\n\t\t\tnormalizeOutputFontFamily(input.layout.font),\n\t\tfontSize: input.typography?.fontSize ?? input.layout.font.fontSize,\n\t\ttextBackend: input.layout.textBackend,\n\t};\n}\n\nfunction buildAnchorCenteredTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tanchor: Box;\n}): SolvedTextAnnotation {\n\treturn buildCenteredTextAnnotation({\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tlayout: input.layout,\n\t\t...(input.typography === undefined ? {} : { typography: input.typography }),\n\t\tcenter: {\n\t\t\tx: input.anchor.x + input.anchor.width / 2,\n\t\t\ty: input.anchor.y + input.anchor.height / 2,\n\t\t},\n\t\tanchor: input.anchor,\n\t});\n}\n\nfunction buildCenteredTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tcenter: Point;\n\tanchor?: Box | Point;\n}): SolvedTextAnnotation {\n\treturn {\n\t\ttext: input.layout.text,\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tbox: {\n\t\t\tx: input.center.x - input.layout.box.width / 2,\n\t\t\ty: input.center.y - input.layout.box.height / 2,\n\t\t\twidth: input.layout.box.width,\n\t\t\theight: input.layout.box.height,\n\t\t},\n\t\tanchor: input.anchor ?? input.center,\n\t\tpaddings: input.layout.padding,\n\t\tlines: input.layout.lines,\n\t\tfontFamily:\n\t\t\tinput.typography?.fontFamily ??\n\t\t\tnormalizeOutputFontFamily(input.layout.font),\n\t\tfontSize: input.typography?.fontSize ?? input.layout.font.fontSize,\n\t\ttextBackend: input.layout.textBackend,\n\t};\n}\n\nfunction normalizeOutputFontFamily(font: TextStyleOptions): string {\n\treturn font.fontFamily === \"Arial\" ? \"Arial, sans-serif\" : font.fontFamily;\n}\n\nfunction reportTextAnnotationCollisions(\n\tannotations: readonly SolvedTextAnnotation[],\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\n\tconst relevantAnnotations = annotations.filter((annotation) =>\n\t\tisExternallyPlacedText(annotation.surfaceKind),\n\t);\n\n\tfor (\n\t\tlet annotationIndex = 0;\n\t\tannotationIndex < relevantAnnotations.length;\n\t\tannotationIndex += 1\n\t) {\n\t\tconst annotation = relevantAnnotations[annotationIndex];\n\t\tif (annotation === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (\n\t\t\tlet otherIndex = annotationIndex + 1;\n\t\t\totherIndex < relevantAnnotations.length;\n\t\t\totherIndex += 1\n\t\t) {\n\t\t\tconst other = relevantAnnotations[otherIndex];\n\t\t\tif (other === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!intersectsAabb(annotation.box, other.box)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tannotation.ownerId === other.ownerId &&\n\t\t\t\tannotation.surfaceKind === other.surfaceKind\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\tmessage: `Text surface ${annotation.surfaceKind} for ${annotation.ownerId} overlaps text surface ${other.surfaceKind} for ${other.ownerId}.`,\n\t\t\t\tpath: [\"textAnnotations\", annotation.surfaceKind, annotation.ownerId],\n\t\t\t\tdetail: compactDetail({\n\t\t\t\t\ttextSurfaceKind: annotation.surfaceKind,\n\t\t\t\t\townerId: annotation.ownerId,\n\t\t\t\t\tconflictingObjectId: other.ownerId,\n\t\t\t\t\tconflictingObjectKind: other.surfaceKind,\n\t\t\t\t\tsurfaceIndex: annotation.surfaceIndex,\n\t\t\t\t\totherSurfaceKind: other.surfaceKind,\n\t\t\t\t\totherSurfaceIndex: other.surfaceIndex,\n\t\t\t\t\ttextBackend: annotation.textBackend,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction reportRouteTextClearance(\n\tedges: readonly CoordinatedEdge[],\n\tannotations: readonly SolvedTextAnnotation[],\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst relevantAnnotations = annotations.filter(isRouteClearanceText);\n\n\tfor (const edge of edges) {\n\t\tfor (const annotation of relevantAnnotations) {\n\t\t\tif (isEdgeConnectedTextAnnotation(edge, annotation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!routeIntersectsTextBox(edge.points, annotation.box)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.text-clearance.unresolved\",\n\t\t\t\tmessage: `Edge ${edge.id} intersects solved text surface ${annotation.surfaceKind} for ${annotation.ownerId}.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: compactDetail({\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\ttextSurfaceKind: annotation.surfaceKind,\n\t\t\t\t\tconflictingObjectId: annotation.ownerId,\n\t\t\t\t\tsurfaceIndex: annotation.surfaceIndex,\n\t\t\t\t\ttextBackend: annotation.textBackend,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction isPreRouteTextObstacle(annotation: SolvedTextAnnotation): boolean {\n\treturn isRouteClearanceText(annotation);\n}\n\nfunction isRouteClearanceText(annotation: SolvedTextAnnotation): boolean {\n\tswitch (annotation.surfaceKind) {\n\t\tcase \"port-label\":\n\t\tcase \"edge-label\":\n\t\tcase \"swimlane-label\":\n\t\tcase \"frame-title\":\n\t\t\treturn true;\n\t\tcase \"node-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn true;\n\t\tcase \"group-label\":\n\t\t\treturn textExtendsOutsideAnchor(annotation);\n\t}\n}\n\nfunction textExtendsOutsideAnchor(annotation: SolvedTextAnnotation): boolean {\n\tif (!(\"width\" in annotation.anchor)) {\n\t\treturn true;\n\t}\n\tconst epsilon = 0.001;\n\treturn (\n\t\tannotation.box.x < annotation.anchor.x - epsilon ||\n\t\tannotation.box.y < annotation.anchor.y - epsilon ||\n\t\tannotation.box.x + annotation.box.width >\n\t\t\tannotation.anchor.x + annotation.anchor.width + epsilon ||\n\t\tannotation.box.y + annotation.box.height >\n\t\t\tannotation.anchor.y + annotation.anchor.height + epsilon\n\t);\n}\n\nfunction routeIntersectsTextBox(points: readonly Point[], box: Box): boolean {\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (segmentIntersectsBox(start, end, box)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction segmentIntersectsBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tif (pointInsideBox(start, box) || pointInsideBox(end, box)) {\n\t\treturn true;\n\t}\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\treturn (\n\t\tsegmentIntersectsBoxEdge(start, end, left, top, right, top) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, top, right, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, bottom, left, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideBox(point: Point, box: Box): boolean {\n\treturn (\n\t\tpoint.x > box.x &&\n\t\tpoint.x < box.x + box.width &&\n\t\tpoint.y > box.y &&\n\t\tpoint.y < box.y + box.height\n\t);\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentIntersectsBoxEdge(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) {\n\t\treturn false;\n\t}\n\tconst t =\n\t\t((x1 - start.x) * (y2 - y1) - (y1 - start.y) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((x1 - start.x) * (end.y - start.y) - (y1 - start.y) * (end.x - start.x)) /\n\t\tdenominator;\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\nfunction compactDetail(\n\tdetail: Record<string, string | number | boolean | undefined>,\n): Record<string, string | number | boolean> {\n\treturn Object.fromEntries(\n\t\tObject.entries(detail).filter(\n\t\t\t(entry): entry is [string, string | number | boolean] =>\n\t\t\t\tentry[1] !== undefined,\n\t\t),\n\t);\n}\n\nfunction isExternallyPlacedText(surfaceKind: TextSurfaceKind): boolean {\n\tswitch (surfaceKind) {\n\t\tcase \"port-label\":\n\t\t\treturn true;\n\t\tcase \"edge-label\":\n\t\t\treturn false;\n\t\tcase \"swimlane-label\":\n\t\t\treturn true;\n\t\tcase \"frame-title\":\n\t\t\treturn true;\n\t\tcase \"node-label\":\n\t\tcase \"group-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn false;\n\t}\n}\n\nfunction fallbackLabelLayout(text: string): LabelLayout {\n\tconst width = Math.max(0, text.length * 7);\n\treturn {\n\t\ttext,\n\t\tbox: { x: 0, y: 0, width, height: 14 },\n\t\tcontentBox: { x: 0, y: 0, width, height: 14 },\n\t\tnaturalSize: { width, height: 14 },\n\t\tfittedSize: { width, height: 14 },\n\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\tfont: { fontFamily: \"Arial\", fontSize: 12, lineHeight: 14 },\n\t\tlineHeight: 14,\n\t\tlines: [\n\t\t\t{\n\t\t\t\ttext,\n\t\t\t\tbox: { x: 0, y: 0, width, height: 14 },\n\t\t\t\tbaselineY: 11.2,\n\t\t\t\twidth,\n\t\t\t\tlineIndex: 0,\n\t\t\t},\n\t\t],\n\t\toverflow: { horizontal: false, vertical: false, truncated: false },\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction edgeLabelAnchor(\n\tedge: CoordinatedEdge,\n\tlayout: LabelLayout,\n\tedges: readonly CoordinatedEdge[],\n\tobstacleBoxes: readonly Box[],\n\tplacedLabelBoxes: readonly Box[],\n\tbaseOffset = 10,\n): Point {\n\tconst placement = labelPlacementOnPolyline(edge.points, baseOffset);\n\tif (placement === undefined) {\n\t\treturn { x: 0, y: 0 };\n\t}\n\n\tfor (const candidate of edgeLabelAnchorCandidates(\n\t\tedge.points,\n\t\tplacement,\n\t\tlayout,\n\t\tbaseOffset,\n\t)) {\n\t\tconst labelBox = {\n\t\t\tx: candidate.x - layout.box.width / 2,\n\t\t\ty: candidate.y - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t};\n\t\tif (routeIntersectsTextBox(edge.points, labelBox)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst crossesOtherRoute = edges.some(\n\t\t\t(other) =>\n\t\t\t\tother.id !== edge.id && routeIntersectsTextBox(other.points, labelBox),\n\t\t);\n\t\tif (crossesOtherRoute) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst overlapsNode = obstacleBoxes.some((box) =>\n\t\t\tintersectsAabb(labelBox, box),\n\t\t);\n\t\tif (overlapsNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst overlapsPlacedLabel = placedLabelBoxes.some((box) =>\n\t\t\tintersectsAabb(labelBox, box),\n\t\t);\n\t\tif (!overlapsPlacedLabel) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn placement;\n}\n\nfunction edgeLabelAnchorCandidates(\n\tpoints: readonly Point[],\n\tplacement: Point,\n\tlayout: LabelLayout,\n\tbaseOffset = 10,\n): Point[] {\n\tconst segment = labelSegmentOnPolyline(points, baseOffset);\n\tif (segment === undefined) {\n\t\treturn [placement];\n\t}\n\n\tconst candidates: Point[] = [placement];\n\t// Expand the offset progressively. The number of steps is derived from the\n\t// label's own size so wide/tall labels can move far enough to clear their\n\t// own route segment (a fixed step count fails for labels wider than the\n\t// search range).\n\tif (segment.start.y === segment.end.y) {\n\t\t// Horizontal segment: label moves vertically; must clear half its height.\n\t\tconst needed = layout.box.height / 2 + EDGE_LABEL_CLEARANCE;\n\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\tcandidates.push(\n\t\t\t\t{ x: placement.x, y: placement.y - offset },\n\t\t\t\t{ x: placement.x, y: placement.y + offset },\n\t\t\t);\n\t\t}\n\t} else if (segment.start.x === segment.end.x) {\n\t\t// Vertical segment: label moves horizontally; must clear half its width.\n\t\tconst needed = layout.box.width / 2 + EDGE_LABEL_CLEARANCE;\n\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\tcandidates.push(\n\t\t\t\t{ x: placement.x + offset, y: placement.y },\n\t\t\t\t{ x: placement.x - offset, y: placement.y },\n\t\t\t);\n\t\t}\n\t} else {\n\t\t// Diagonal segment: expand in both perpendicular directions.\n\t\tconst dx = segment.end.x - segment.start.x;\n\t\tconst dy = segment.end.y - segment.start.y;\n\t\tconst segLen = Math.hypot(dx, dy);\n\t\tif (segLen > 0) {\n\t\t\tconst nx = -dy / segLen;\n\t\t\tconst ny = dx / segLen;\n\t\t\tconst needed =\n\t\t\t\t(Math.abs(nx) * layout.box.width + Math.abs(ny) * layout.box.height) /\n\t\t\t\t\t2 +\n\t\t\t\tEDGE_LABEL_CLEARANCE;\n\t\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\t\tcandidates.push(\n\t\t\t\t\t{ x: placement.x + nx * offset, y: placement.y + ny * offset },\n\t\t\t\t\t{ x: placement.x - nx * offset, y: placement.y - ny * offset },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// For long edges, also try quartile positions along the polyline.\n\tconst totalLen = points.reduce((sum, p, idx) => {\n\t\tif (idx === 0) return 0;\n\t\tconst prev = points[idx - 1];\n\t\treturn (\n\t\t\tsum +\n\t\t\tMath.hypot((p?.x ?? 0) - (prev?.x ?? 0), (p?.y ?? 0) - (prev?.y ?? 0))\n\t\t);\n\t}, 0);\n\tif (totalLen > 200) {\n\t\tfor (const ratio of [0.25, 0.75]) {\n\t\t\tconst qp = labelPlacementAtRatio(points, ratio, totalLen, baseOffset);\n\t\t\tif (qp !== undefined) {\n\t\t\t\tcandidates.push(qp);\n\t\t\t\t// Find the segment that contains the quartile point\n\t\t\t\t// (labelSegmentOnPolyline gives the midpoint segment, not the quartile one)\n\t\t\t\tconst qTargetDist = totalLen * ratio;\n\t\t\t\tlet qTravelled = 0;\n\t\t\t\tlet seg: { start: Point; end: Point; length: number } | undefined;\n\t\t\t\tfor (let si = 1; si < points.length; si++) {\n\t\t\t\t\tconst sp = points[si - 1];\n\t\t\t\t\tconst sc = points[si];\n\t\t\t\t\tif (sp === undefined || sc === undefined) continue;\n\t\t\t\t\tconst sl = Math.hypot(sc.x - sp.x, sc.y - sp.y);\n\t\t\t\t\tif (sl <= 0) continue;\n\t\t\t\t\tif (qTravelled + sl >= qTargetDist) {\n\t\t\t\t\t\tseg = { start: sp, end: sc, length: sl };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tqTravelled += sl;\n\t\t\t\t}\n\t\t\t\tif (seg !== undefined) {\n\t\t\t\t\tconst segLen = Math.hypot(\n\t\t\t\t\t\tseg.end.x - seg.start.x,\n\t\t\t\t\t\tseg.end.y - seg.start.y,\n\t\t\t\t\t);\n\t\t\t\t\tconst qpNeeded =\n\t\t\t\t\t\tseg.start.y === seg.end.y\n\t\t\t\t\t\t\t? layout.box.height / 2 + EDGE_LABEL_CLEARANCE\n\t\t\t\t\t\t\t: seg.start.x === seg.end.x\n\t\t\t\t\t\t\t\t? layout.box.width / 2 + EDGE_LABEL_CLEARANCE\n\t\t\t\t\t\t\t\t: (Math.abs(seg.start.y - seg.end.y) * layout.box.width +\n\t\t\t\t\t\t\t\t\t\tMath.abs(seg.end.x - seg.start.x) * layout.box.height) /\n\t\t\t\t\t\t\t\t\t\t(2 * segLen) +\n\t\t\t\t\t\t\t\t\tEDGE_LABEL_CLEARANCE;\n\t\t\t\t\tconst qpMaxSteps = Math.max(\n\t\t\t\t\t\t12,\n\t\t\t\t\t\tMath.ceil(qpNeeded / EDGE_LABEL_CLEARANCE),\n\t\t\t\t\t);\n\t\t\t\t\tfor (let step = 1; step <= qpMaxSteps; step += 1) {\n\t\t\t\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\t\t\t\tif (seg.start.y === seg.end.y) {\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x, y: qp.y - offset },\n\t\t\t\t\t\t\t\t{ x: qp.x, y: qp.y + offset },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (seg.start.x === seg.end.x) {\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x - offset, y: qp.y },\n\t\t\t\t\t\t\t\t{ x: qp.x + offset, y: qp.y },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst nx = -(seg.end.y - seg.start.y) / segLen;\n\t\t\t\t\t\t\tconst ny = (seg.end.x - seg.start.x) / segLen;\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x + nx * offset, y: qp.y + ny * offset },\n\t\t\t\t\t\t\t\t{ x: qp.x - nx * offset, y: qp.y - ny * offset },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction labelPlacementOnPolyline(\n\tpoints: readonly Point[],\n\tbaseOffset = 10,\n): Point | undefined {\n\treturn labelSegmentOnPolyline(points, baseOffset)?.placement;\n}\n\nfunction labelSegmentOnPolyline(\n\tpoints: readonly Point[],\n\tbaseOffset = 10,\n): { start: Point; end: Point; placement: Point } | undefined {\n\tconst segments = nonZeroSegments(points);\n\tconst totalLength = segments.reduce(\n\t\t(sum, segment) => sum + segment.length,\n\t\t0,\n\t);\n\tif (totalLength <= 0) {\n\t\treturn undefined;\n\t}\n\n\tlet remaining = totalLength / 2;\n\tfor (const segment of segments) {\n\t\tif (remaining <= segment.length) {\n\t\t\tconst ratio = remaining / segment.length;\n\t\t\tconst x = segment.start.x + (segment.end.x - segment.start.x) * ratio;\n\t\t\tconst y = segment.start.y + (segment.end.y - segment.start.y) * ratio;\n\t\t\tconst offset = labelOffset(segment, baseOffset);\n\t\t\treturn {\n\t\t\t\tstart: segment.start,\n\t\t\t\tend: segment.end,\n\t\t\t\tplacement: { x: x + offset.x, y: y + offset.y },\n\t\t\t};\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst last = segments.at(-1);\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst offset = labelOffset(last, baseOffset);\n\treturn {\n\t\tstart: last.start,\n\t\tend: last.end,\n\t\tplacement: { x: last.end.x + offset.x, y: last.end.y + offset.y },\n\t};\n}\n\nfunction nonZeroSegments(points: readonly Point[]): Array<{\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}> {\n\tconst segments: Array<{ start: Point; end: Point; length: number }> = [];\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst length = Math.hypot(end.x - start.x, end.y - start.y);\n\t\tif (length > 0) {\n\t\t\tsegments.push({ start, end, length });\n\t\t}\n\t}\n\treturn segments;\n}\n\nfunction labelPlacementAtRatio(\n\tpoints: readonly Point[],\n\tratio: number,\n\ttotalLength: number,\n\tbaseOffset = 10,\n): Point | undefined {\n\tif (points.length < 2 || ratio < 0 || ratio > 1) {\n\t\treturn undefined;\n\t}\n\tconst targetDist = totalLength * ratio;\n\tlet travelled = 0;\n\tfor (let idx = 1; idx < points.length; idx++) {\n\t\tconst prev = points[idx - 1];\n\t\tconst curr = points[idx];\n\t\tif (prev === undefined || curr === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst segLen = Math.hypot(curr.x - prev.x, curr.y - prev.y);\n\t\tif (segLen <= 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (travelled + segLen >= targetDist) {\n\t\t\tconst t = (targetDist - travelled) / segLen;\n\t\t\tconst offset = labelOffset(\n\t\t\t\t{ start: prev, end: curr, length: segLen },\n\t\t\t\tbaseOffset,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tx: prev.x + (curr.x - prev.x) * t + offset.x,\n\t\t\t\ty: prev.y + (curr.y - prev.y) * t + offset.y,\n\t\t\t};\n\t\t}\n\t\ttravelled += segLen;\n\t}\n\treturn undefined;\n}\n\nfunction labelOffset(\n\tsegment: { start: Point; end: Point; length: number },\n\tbaseOffset = 10,\n): Point {\n\tconst offset = baseOffset;\n\tconst dx = segment.end.x - segment.start.x;\n\tconst dy = segment.end.y - segment.start.y;\n\treturn {\n\t\tx: (-dy / segment.length) * offset,\n\t\ty: (dx / segment.length) * offset,\n\t};\n}\n\nfunction compartmentRows(node: CoordinatedNode): string[] {\n\tconst compartments = node.compartments;\n\tif (compartments === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t...(compartments.stereotype === undefined ? [] : [compartments.stereotype]),\n\t\t...(compartments.name === undefined\n\t\t\t? [node.label?.text ?? node.id]\n\t\t\t: [compartments.name]),\n\t\t...(compartments.properties ?? []),\n\t\t...(compartments.constraints ?? []),\n\t];\n}\n\nfunction portGeometry(\n\tnodeGeometry: ReturnType<typeof computeShapeGeometry>,\n\tport: CoordinatedPort | undefined,\n): ReturnType<typeof computeShapeGeometry> {\n\tif (port === undefined) {\n\t\treturn nodeGeometry;\n\t}\n\treturn {\n\t\t...nodeGeometry,\n\t\tbox: port.box,\n\t\tcenter: port.anchor,\n\t\tanchors: nodeGeometry.anchors.map((anchor) => ({\n\t\t\tname: anchor.name,\n\t\t\tpoint: port.anchor,\n\t\t})),\n\t\tobstacleBox: port.box,\n\t};\n}\n\nfunction stableUniqueById<T extends { id: string }>(\n\titems: readonly T[],\n\tdiagnostics: Diagnostic[],\n\tpathRoot: string,\n\tcode: string,\n): T[] {\n\tconst firstById = new Map<string, T>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (firstById.has(item.id)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode,\n\t\t\t\tmessage: `Duplicate ${pathRoot.slice(0, -1)} id ${item.id} was ignored; first occurrence was kept.`,\n\t\t\t\tpath: [pathRoot, index, \"id\"],\n\t\t\t\tdetail: { id: item.id, duplicateIndex: index },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tfirstById.set(item.id, item);\n\t}\n\treturn [...firstById.values()].sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction stableByConstraintId<T extends { id?: string; kind: string }>(\n\titems: readonly T[],\n): T[] {\n\treturn [...items].sort((a, b) =>\n\t\t`${a.id ?? a.kind}`.localeCompare(`${b.id ?? b.kind}`),\n\t);\n}\n\nfunction groupReferenceMissing(\n\tgroupId: string,\n\treferenceKind: string,\n\tid: string | undefined,\n): Diagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tcode: \"solver.group-reference.missing\",\n\t\tmessage: `Group ${groupId} references a missing ${referenceKind}.`,\n\t\tpath: [\"groups\", groupId],\n\t\tdetail: id === undefined ? { groupId } : { groupId, id },\n\t};\n}\n\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Pipeline factory (Issue #54, 方案 D)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the default layout pipeline. Currently wraps `solveDiagram` in\n * a single mega-phase so custom callers can replace individual phases\n * (e.g. \"initial-layout\", \"route-edges\") without touching the rest.\n *\n * Individual phases will be extracted from the mega-phase in follow-up\n * PRs for 方案 A (recursive layout) and 方案 B (corner-graph A*).\n */\nexport function createDefaultPipeline(): LayoutPipeline {\n\treturn new LayoutPipeline()\n\t\t.addPhase({\n\t\t\tname: \"solve-diagram\",\n\t\t\trun(state: LayoutState): void {\n\t\t\t\tconst result = solveDiagram(state.diagram, state.options);\n\t\t\t\t// Mirror the result back into the state so downstream\n\t\t\t\t// consumers can inspect it after the pipeline runs.\n\t\t\t\tstate.diagnostics.push(...result.diagnostics);\n\t\t\t\tstate.bounds = result.bounds;\n\t\t\t\tstate.degraded = result.degraded ?? false;\n\t\t\t\tstate.coordinatedNodes = result.nodes;\n\t\t\t\tstate.coordinatedEdges = result.edges;\n\t\t\t},\n\t\t})\n\t\t.addPhase({\n\t\t\tname: \"quality-score\",\n\t\t\trun(state: LayoutState): void {\n\t\t\t\tif (!state.options.qualityScore) return;\n\t\t\t\tconst report = scoreLayoutQuality(\n\t\t\t\t\tstate.coordinatedNodes,\n\t\t\t\t\tstate.coordinatedEdges,\n\t\t\t\t);\n\t\t\t\tstate.qualityReport = report;\n\t\t\t\tstate.diagnostics.push(...report.diagnostics);\n\t\t\t},\n\t\t});\n}\n","import type { DslDiagnostic } from \"./types.js\";\n\nconst EDGE_ID_PATTERN = /^[A-Za-z0-9_.:-]+$/;\nconst SHORTHAND_PATTERN = /^(.+?)\\s*->\\s*([^:]+)(?::(.*))?$/;\n\nexport interface ParsedEdgeShorthand {\n\tsourceId: string;\n\ttargetId: string;\n\tlabel?: { text: string };\n}\n\nexport function parseEdgeShorthand(\n\tvalue: string,\n\tpath: Array<string | number>,\n): { edge?: ParsedEdgeShorthand; diagnostics: DslDiagnostic[] } {\n\tconst match = SHORTHAND_PATTERN.exec(value.trim());\n\tif (match === null) {\n\t\treturn invalidEdgeShorthand(path);\n\t}\n\n\tconst sourceId = match[1]?.trim() ?? \"\";\n\tconst targetId = match[2]?.trim() ?? \"\";\n\tconst labelText = match[3]?.trim();\n\n\tif (!isValidEdgeId(sourceId) || !isValidEdgeId(targetId)) {\n\t\treturn invalidEdgeShorthand(path);\n\t}\n\n\treturn {\n\t\tedge: {\n\t\t\tsourceId,\n\t\t\ttargetId,\n\t\t\t...(labelText === undefined || labelText === \"\"\n\t\t\t\t? {}\n\t\t\t\t: { label: { text: labelText } }),\n\t\t},\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction invalidEdgeShorthand(path: Array<string | number>): {\n\tdiagnostics: DslDiagnostic[];\n} {\n\treturn {\n\t\tdiagnostics: [\n\t\t\t{\n\t\t\t\tseverity: \"error\",\n\t\t\t\tlayer: \"validate\",\n\t\t\t\tcode: \"validate.edge-shorthand.invalid\",\n\t\t\t\tmessage: \"Invalid edge shorthand.\",\n\t\t\t\tpath,\n\t\t\t\thint: 'Use \"source -> target\" or \"source -> target: label\".',\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction isValidEdgeId(value: string): boolean {\n\treturn value.length > 0 && EDGE_ID_PATTERN.test(value);\n}\n","import { z } from \"zod\";\nimport { createSchemaDiagnostic, sortDslDiagnostics } from \"./diagnostics.js\";\nimport type { DslDiagnostic } from \"./types.js\";\n\nconst directionSchema = z.enum([\"TB\", \"LR\", \"BT\", \"RL\"]);\nconst layoutModeSchema = z.enum([\"dagre\", \"positions\"]);\nconst routeKindSchema = z.enum([\"orthogonal\", \"straight\", \"obstacle-avoiding\"]);\nconst outputFormatSchema = z.enum([\"svg\", \"excalidraw\"]);\nconst edgeStrokeStyleSchema = z.enum([\"solid\", \"dashed\"]);\nconst edgeArrowheadSchema = z.enum([\"triangle\", \"hollowTriangle\"]);\nconst primaryReadingDirectionSchema = z.enum([\n\t\"top_to_bottom\",\n\t\"top-to-bottom\",\n]);\nconst nodeShapeSchema = z.enum([\n\t\"rectangle\",\n\t\"rounded-rectangle\",\n\t\"ellipse\",\n\t\"diamond\",\n\t\"parallelogram\",\n\t\"hexagon\",\n\t\"cylinder\",\n]);\n\nconst finiteNumberSchema = z.number().finite();\nconst nonNegativeNumberSchema = finiteNumberSchema.min(0);\n\nconst pointSchema = z.object({\n\tx: finiteNumberSchema,\n\ty: finiteNumberSchema,\n});\n\nconst insetsSchema = z.object({\n\ttop: finiteNumberSchema,\n\tright: finiteNumberSchema,\n\tbottom: finiteNumberSchema,\n\tleft: finiteNumberSchema,\n});\n\nconst nonNegativeInsetsSchema = z.object({\n\ttop: nonNegativeNumberSchema,\n\tright: nonNegativeNumberSchema,\n\tbottom: nonNegativeNumberSchema,\n\tleft: nonNegativeNumberSchema,\n});\n\nconst labelSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\ttext: z.string(),\n\t\tmaxWidth: finiteNumberSchema.optional(),\n\t}),\n]);\n\nconst styleSchema = z.object({\n\tfill: z.string().optional(),\n\tstroke: z.string().optional(),\n\tfontFamily: z.string().optional(),\n\tfontSize: finiteNumberSchema.optional(),\n});\n\nconst blockCellSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\ttext: z.string(),\n\t\tfill: z.string().optional(),\n\t\tstroke: z.string().optional(),\n\t\tstyle: styleSchema.optional(),\n\t}),\n]);\n\nconst portSideSchema = z.enum([\"top\", \"right\", \"bottom\", \"left\"]);\nconst portKindSchema = z.enum([\"proxy\", \"flow\"]);\n\nconst portSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tside: portSideSchema,\n\tkind: portKindSchema.optional(),\n\torder: finiteNumberSchema.optional(),\n\tstyle: styleSchema.optional(),\n});\n\nconst compartmentsSchema = z.object({\n\tstereotype: z.string().optional(),\n\tname: z.string().optional(),\n\tproperties: z\n\t\t.array(z.record(z.string(), z.string()).or(z.string()))\n\t\t.optional(),\n\tconstraints: z.array(z.string()).optional(),\n});\n\nconst nodeSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tshape: nodeShapeSchema.optional(),\n\tposition: pointSchema.optional(),\n\tstyle: styleSchema.optional(),\n\tports: z.record(z.string(), portSchema).optional(),\n\tcompartments: compartmentsSchema.optional(),\n});\n\nconst endpointSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\tnode: z.string(),\n\t\tport: z.string().optional(),\n\t}),\n]);\n\nconst structuredEdgeSchema = z\n\t.object({\n\t\tid: z.string().optional(),\n\t\tsource: endpointSchema.optional(),\n\t\ttarget: endpointSchema.optional(),\n\t\tsourceId: z.string().optional(),\n\t\ttargetId: z.string().optional(),\n\t\tlabel: labelSchema.optional(),\n\t\tstyle: edgeStrokeStyleSchema.optional(),\n\t\tarrowhead: edgeArrowheadSchema.optional(),\n\t})\n\t.superRefine((edge, context) => {\n\t\tif (edge.source === undefined && edge.sourceId === undefined) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Edge requires source or sourceId.\",\n\t\t\t\tpath: [\"source\"],\n\t\t\t});\n\t\t}\n\t\tif (edge.target === undefined && edge.targetId === undefined) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Edge requires target or targetId.\",\n\t\t\t\tpath: [\"target\"],\n\t\t\t});\n\t\t}\n\t});\n\nconst edgeSchema = z.union([z.string(), structuredEdgeSchema]);\n\nconst groupSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tnodes: z.array(z.string()).optional(),\n\tgroups: z.array(z.string()).optional(),\n\tpadding: insetsSchema.optional(),\n\theaderHeight: nonNegativeNumberSchema.optional(),\n\tlabelPosition: z.enum([\"top\", \"inside\", \"outside\"]).optional(),\n\tdirection: z.enum([\"horizontal\", \"vertical\"]).optional(),\n});\n\nconst swimlaneSchema = z.object({\n\tlabel: labelSchema.optional(),\n\torientation: z.enum([\"vertical\", \"horizontal\"]).optional(),\n\tlayout: z.enum([\"overlay\", \"contract\"]).optional(),\n\theaderHeight: nonNegativeNumberSchema.optional(),\n\tpadding: nonNegativeNumberSchema.optional(),\n\tlanes: z.record(\n\t\tz.string(),\n\t\tz.object({\n\t\t\tlabel: labelSchema.optional(),\n\t\t\tchildren: z.array(z.string()).optional(),\n\t\t}),\n\t),\n});\n\nconst matrixSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\trows: z.array(z.string()),\n\t\tcols: z.array(z.string()),\n\t\tcells: z.array(z.array(blockCellSchema)),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((matrix, context) => {\n\t\tcheckDuplicateValues(\"matrix row\", matrix.rows, context, (index) => [\n\t\t\t\"rows\",\n\t\t\tindex,\n\t\t]);\n\t\tcheckDuplicateValues(\"matrix column\", matrix.cols, context, (index) => [\n\t\t\t\"cols\",\n\t\t\tindex,\n\t\t]);\n\t\tif (matrix.cells.length !== matrix.rows.length) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Matrix cells must contain exactly ${matrix.rows.length} row(s).`,\n\t\t\t\tpath: [\"cells\"],\n\t\t\t});\n\t\t}\n\t\tmatrix.cells.forEach((row, rowIndex) => {\n\t\t\tif (row.length !== matrix.cols.length) {\n\t\t\t\tcontext.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: `Matrix cell row must contain exactly ${matrix.cols.length} column(s).`,\n\t\t\t\t\tpath: [\"cells\", rowIndex],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\nconst tableColumnSchema = z.object({\n\tid: z.string(),\n\tlabel: labelSchema,\n});\n\nconst tableRowSchema = z.object({\n\tid: z.string(),\n\tcells: z.record(z.string(), blockCellSchema),\n});\n\nconst tableSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tcolumns: z.array(tableColumnSchema),\n\t\trows: z.array(tableRowSchema),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((table, context) => {\n\t\tcheckDuplicateIds(\"column\", table.columns, context, (index) => [\n\t\t\t\"columns\",\n\t\t\tindex,\n\t\t\t\"id\",\n\t\t]);\n\t\tcheckDuplicateIds(\"row\", table.rows, context, (index) => [\n\t\t\t\"rows\",\n\t\t\tindex,\n\t\t\t\"id\",\n\t\t]);\n\t\tconst columnIds = new Set(table.columns.map((column) => column.id));\n\t\ttable.rows.forEach((row, rowIndex) => {\n\t\t\tfor (const columnId of Object.keys(row.cells)) {\n\t\t\t\tif (!columnIds.has(columnId)) {\n\t\t\t\t\tcontext.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: `Table row cell references undeclared column \"${columnId}\".`,\n\t\t\t\t\t\tpath: [\"rows\", rowIndex, \"cells\", columnId],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\nconst panelItemSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\tid: z.string().optional(),\n\t\tlabel: labelSchema,\n\t\tdetail: labelSchema.optional(),\n\t\tstyle: styleSchema.optional(),\n\t}),\n]);\n\nconst evidencePanelSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tkind: z.enum([\"legend\", \"rule\", \"note\", \"verification\"]),\n\t\titems: z.array(panelItemSchema),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((panel, context) => {\n\t\tconst firstIndexByItemId = new Map<string, number>();\n\t\tpanel.items.forEach((item, index) => {\n\t\t\tif (typeof item === \"string\" || item.id === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst firstIndex = firstIndexByItemId.get(item.id);\n\t\t\tif (firstIndex === undefined) {\n\t\t\t\tfirstIndexByItemId.set(item.id, index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Duplicate evidence panel item id \"${item.id}\".`,\n\t\t\t\tpath: [\"items\", index, \"id\"],\n\t\t\t});\n\t\t});\n\t});\n\nconst exactPositionConstraintSchema = z.object({\n\tkind: z.literal(\"exact-position\"),\n\ttarget: z.string().optional(),\n\ttargetId: z.string().optional(),\n\tposition: pointSchema,\n});\n\nconst relativePositionConstraintSchema = z.object({\n\tkind: z.literal(\"relative-position\"),\n\tsource: z.string().optional(),\n\tsourceId: z.string().optional(),\n\treference: z.string().optional(),\n\treferenceId: z.string().optional(),\n\trelation: z.enum([\"above\", \"right-of\", \"below\", \"left-of\"]),\n\toffset: pointSchema.optional(),\n});\n\nconst alignConstraintSchema = z.object({\n\tkind: z.literal(\"align\"),\n\taxis: z.enum([\n\t\t\"x\",\n\t\t\"y\",\n\t\t\"center-x\",\n\t\t\"center-y\",\n\t\t\"top\",\n\t\t\"right\",\n\t\t\"bottom\",\n\t\t\"left\",\n\t]),\n\ttargets: z.array(z.string()).optional(),\n\ttargetIds: z.array(z.string()).optional(),\n});\n\nconst distributeConstraintSchema = z.object({\n\tkind: z.literal(\"distribute\"),\n\taxis: z.enum([\"horizontal\", \"vertical\"]),\n\ttargets: z.array(z.string()).optional(),\n\ttargetIds: z.array(z.string()).optional(),\n\tspacing: finiteNumberSchema.optional(),\n});\n\nconst containmentConstraintSchema = z.object({\n\tkind: z.literal(\"containment\"),\n\tcontainer: z.string().optional(),\n\tcontainerId: z.string().optional(),\n\tchildren: z.array(z.string()).optional(),\n\tchildIds: z.array(z.string()).optional(),\n\tpadding: insetsSchema.optional(),\n});\n\nconst constraintSchema = z.union([\n\texactPositionConstraintSchema,\n\trelativePositionConstraintSchema,\n\talignConstraintSchema,\n\tdistributeConstraintSchema,\n\tcontainmentConstraintSchema,\n]);\n\nexport const diagramDslSchema = z\n\t.object({\n\t\tid: z.string().optional(),\n\t\ttitle: z.string().optional(),\n\t\tdirection: directionSchema.optional(),\n\t\tlayout: z\n\t\t\t.object({\n\t\t\t\tdirection: directionSchema.optional(),\n\t\t\t\tmode: layoutModeSchema.optional(),\n\t\t\t\tprimaryReadingDirection: primaryReadingDirectionSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\trouting: z\n\t\t\t.object({\n\t\t\t\tkind: routeKindSchema.optional(),\n\t\t\t\tportShifting: z\n\t\t\t\t\t.object({\n\t\t\t\t\t\tenabled: z.boolean().optional(),\n\t\t\t\t\t\tspacing: finiteNumberSchema.optional(),\n\t\t\t\t\t})\n\t\t\t\t\t.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\tnodes: z.record(z.string(), nodeSchema),\n\t\tedges: z.array(edgeSchema).optional(),\n\t\tgroups: z.record(z.string(), groupSchema).optional(),\n\t\tswimlanes: z.record(z.string(), swimlaneSchema).optional(),\n\t\tmatrices: z.array(matrixSchema).optional(),\n\t\ttables: z.array(tableSchema).optional(),\n\t\tevidencePanels: z.array(evidencePanelSchema).optional(),\n\t\tconstraints: z.array(constraintSchema).optional(),\n\t\tframe: z\n\t\t\t.object({\n\t\t\t\tkind: z.string(),\n\t\t\t\tcontext: z.string().optional(),\n\t\t\t\tname: z.string().optional(),\n\t\t\t\ttitleTab: z.string(),\n\t\t\t\theaderHeight: nonNegativeNumberSchema.optional(),\n\t\t\t\tpadding: z\n\t\t\t\t\t.union([nonNegativeNumberSchema, nonNegativeInsetsSchema])\n\t\t\t\t\t.optional(),\n\t\t\t\tlabelPosition: z.enum([\"top\", \"inside\", \"outside\"]).optional(),\n\t\t\t\tdirection: z.enum([\"horizontal\", \"vertical\"]).optional(),\n\t\t\t\tstyle: styleSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\toutput: z\n\t\t\t.object({\n\t\t\t\tformat: outputFormatSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.superRefine((diagram, context) => {\n\t\tcheckDuplicateEvidenceBlockIds(\"matrices\", diagram.matrices, context);\n\t\tcheckDuplicateEvidenceBlockIds(\"tables\", diagram.tables, context);\n\t\tcheckDuplicateEvidenceBlockIds(\n\t\t\t\"evidencePanels\",\n\t\t\tdiagram.evidencePanels,\n\t\t\tcontext,\n\t\t);\n\t\tcheckDuplicateEvidenceBlockIdsAcrossTypes(diagram, context);\n\t});\n\nexport type DiagramDsl = z.infer<typeof diagramDslSchema>;\n\nexport function validateDiagramDsl(value: unknown): {\n\tvalue?: DiagramDsl;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tconst result = diagramDslSchema.safeParse(value);\n\n\tif (result.success) {\n\t\treturn { value: result.data, diagnostics: [] };\n\t}\n\n\treturn {\n\t\tdiagnostics: sortDslDiagnostics(\n\t\t\tresult.error.issues.map((issue) =>\n\t\t\t\tcreateSchemaDiagnostic(toDiagnosticPath(issue.path), issue.message),\n\t\t\t),\n\t\t),\n\t};\n}\n\nfunction toDiagnosticPath(path: PropertyKey[]): Array<string | number> {\n\treturn path.flatMap((segment) =>\n\t\ttypeof segment === \"string\" || typeof segment === \"number\" ? [segment] : [],\n\t);\n}\n\nfunction checkDuplicateEvidenceBlockIds(\n\tcollection: \"matrices\" | \"tables\" | \"evidencePanels\",\n\tblocks: readonly { id: string }[] | undefined,\n\tcontext: z.RefinementCtx,\n): void {\n\tcheckDuplicateIds(\n\t\t`evidence block id in ${collection}`,\n\t\tblocks ?? [],\n\t\tcontext,\n\t\t(index) => [collection, index, \"id\"],\n\t);\n}\n\nfunction checkDuplicateIds(\n\tlabel: string,\n\titems: readonly { id: string }[],\n\tcontext: z.RefinementCtx,\n\tpathForIndex: (index: number) => Array<string | number>,\n): void {\n\tconst firstIndexById = new Map<string, number>();\n\titems.forEach((item, index) => {\n\t\tconst firstIndex = firstIndexById.get(item.id);\n\t\tif (firstIndex === undefined) {\n\t\t\tfirstIndexById.set(item.id, index);\n\t\t\treturn;\n\t\t}\n\t\tcontext.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `Duplicate ${label} \"${item.id}\".`,\n\t\t\tpath: pathForIndex(index),\n\t\t});\n\t});\n}\n\nfunction checkDuplicateValues(\n\tlabel: string,\n\tvalues: readonly string[],\n\tcontext: z.RefinementCtx,\n\tpathForIndex: (index: number) => Array<string | number>,\n): void {\n\tconst firstIndexByValue = new Map<string, number>();\n\tvalues.forEach((value, index) => {\n\t\tconst firstIndex = firstIndexByValue.get(value);\n\t\tif (firstIndex === undefined) {\n\t\t\tfirstIndexByValue.set(value, index);\n\t\t\treturn;\n\t\t}\n\t\tcontext.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `Duplicate ${label} \"${value}\".`,\n\t\t\tpath: pathForIndex(index),\n\t\t});\n\t});\n}\n\nfunction checkDuplicateEvidenceBlockIdsAcrossTypes(\n\tdiagram: {\n\t\tmatrices?: readonly { id: string }[] | undefined;\n\t\ttables?: readonly { id: string }[] | undefined;\n\t\tevidencePanels?: readonly { id: string }[] | undefined;\n\t},\n\tcontext: z.RefinementCtx,\n): void {\n\tconst firstById = new Map<\n\t\tstring,\n\t\t{ collection: \"matrices\" | \"tables\" | \"evidencePanels\"; index: number }\n\t>();\n\tfor (const collection of [\"matrices\", \"tables\", \"evidencePanels\"] as const) {\n\t\tconst blocks = diagram[collection] ?? [];\n\t\tblocks.forEach((block, index) => {\n\t\t\tconst first = firstById.get(block.id);\n\t\t\tif (first === undefined) {\n\t\t\t\tfirstById.set(block.id, { collection, index });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Duplicate evidence block id \"${block.id}\" across ${first.collection} and ${collection}.`,\n\t\t\t\tpath: [collection, index, \"id\"],\n\t\t\t});\n\t\t});\n\t}\n}\n","import { Buffer } from \"node:buffer\";\nimport { parseDocument } from \"yaml\";\nimport { createParseDiagnostic, sortDslDiagnostics } from \"./diagnostics.js\";\nimport { parseEdgeShorthand } from \"./edges.js\";\nimport { validateDiagramDsl } from \"./schema.js\";\nimport type {\n\tDslDiagnostic,\n\tParseDiagramDslOptions,\n\tParseDiagramDslResult,\n} from \"./types.js\";\n\nexport const DEFAULT_DSL_MAX_BYTES = 1_000_000;\n\nexport function parseDiagramDsl(\n\tsource: string,\n\toptions: ParseDiagramDslOptions = {},\n): ParseDiagramDslResult {\n\tconst maxBytes = options.maxBytes ?? DEFAULT_DSL_MAX_BYTES;\n\n\tif (Buffer.byteLength(source, \"utf8\") > maxBytes) {\n\t\treturn {\n\t\t\tdiagnostics: [\n\t\t\t\tcreateParseDiagnostic(\n\t\t\t\t\t\"parse.input.too-large\",\n\t\t\t\t\t`Input exceeds the ${maxBytes} byte limit.`,\n\t\t\t\t\t\"Split the diagram into smaller inputs or raise maxBytes for trusted sources.\",\n\t\t\t\t),\n\t\t\t],\n\t\t};\n\t}\n\n\tconst parsed = parseSource(source, options);\n\tif (parsed.value === undefined || hasErrorDiagnostics(parsed.diagnostics)) {\n\t\treturn { diagnostics: sortDslDiagnostics(parsed.diagnostics) };\n\t}\n\n\tconst expanded = expandEdgeShorthand(parsed.value);\n\tif (hasErrorDiagnostics(expanded.diagnostics)) {\n\t\treturn { diagnostics: sortDslDiagnostics(expanded.diagnostics) };\n\t}\n\n\tconst validated = validateDiagramDsl(expanded.value);\n\n\treturn {\n\t\tvalue: validated.value,\n\t\tdiagnostics: sortDslDiagnostics([\n\t\t\t...parsed.diagnostics,\n\t\t\t...validated.diagnostics,\n\t\t]),\n\t};\n}\n\nfunction parseSource(\n\tsource: string,\n\toptions: ParseDiagramDslOptions,\n): { value?: unknown; diagnostics: DslDiagnostic[] } {\n\tif (isJsonSource(options)) {\n\t\treturn parseJsonSource(source);\n\t}\n\n\treturn parseYamlSource(source);\n}\n\nfunction parseJsonSource(source: string): {\n\tvalue?: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\ttry {\n\t\treturn { value: JSON.parse(source), diagnostics: [] };\n\t} catch (error) {\n\t\treturn {\n\t\t\tdiagnostics: [\n\t\t\t\tcreateParseDiagnostic(\n\t\t\t\t\t\"parse.json.invalid\",\n\t\t\t\t\t`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"Fix the JSON syntax or use a .yaml source file.\",\n\t\t\t\t),\n\t\t\t],\n\t\t};\n\t}\n}\n\nfunction parseYamlSource(source: string): {\n\tvalue?: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tconst document = parseDocument(source);\n\tconst diagnostics: DslDiagnostic[] = [\n\t\t...document.errors.map((error) =>\n\t\t\tcreateParseDiagnostic(\n\t\t\t\t\"parse.yaml.invalid\",\n\t\t\t\t`Invalid YAML: ${error.message}`,\n\t\t\t\t\"Fix the YAML syntax near the reported parser error.\",\n\t\t\t),\n\t\t),\n\t\t...document.warnings.map((warning) => ({\n\t\t\tseverity: \"warning\" as const,\n\t\t\tlayer: \"parse\" as const,\n\t\t\tcode: \"parse.yaml.warning\",\n\t\t\tmessage: `YAML warning: ${warning.message}`,\n\t\t\thint: \"Review the YAML warning before relying on the parsed value.\",\n\t\t})),\n\t];\n\n\tif (document.errors.length > 0) {\n\t\treturn { diagnostics };\n\t}\n\n\treturn { value: document.toJS(), diagnostics };\n}\n\nfunction isJsonSource(options: ParseDiagramDslOptions): boolean {\n\treturn (\n\t\toptions.sourceFormat === \"json\" ||\n\t\t(options.sourcePath?.toLowerCase().endsWith(\".json\") ?? false)\n\t);\n}\n\nfunction hasErrorDiagnostics(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n\nfunction expandEdgeShorthand(value: unknown): {\n\tvalue: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tif (\n\t\tvalue === null ||\n\t\ttypeof value !== \"object\" ||\n\t\tArray.isArray(value) ||\n\t\t!(\"edges\" in value)\n\t) {\n\t\treturn { value, diagnostics: [] };\n\t}\n\n\tconst record = value as Record<string, unknown>;\n\tif (!Array.isArray(record.edges)) {\n\t\treturn { value, diagnostics: [] };\n\t}\n\n\tconst diagnostics: DslDiagnostic[] = [];\n\tconst edges = record.edges.map((edge, index) => {\n\t\tconst shorthand = edgeShorthandText(edge);\n\t\tif (shorthand === undefined) {\n\t\t\treturn edge;\n\t\t}\n\n\t\tconst result = parseEdgeShorthand(shorthand, [\"edges\", index]);\n\t\tdiagnostics.push(...result.diagnostics);\n\n\t\tif (result.edge === undefined) {\n\t\t\treturn edge;\n\t\t}\n\n\t\treturn {\n\t\t\tsourceId: result.edge.sourceId,\n\t\t\ttargetId: result.edge.targetId,\n\t\t\t...(result.edge.label === undefined ? {} : { label: result.edge.label }),\n\t\t};\n\t});\n\n\treturn { value: { ...record, edges }, diagnostics };\n}\n\nfunction edgeShorthandText(edge: unknown): string | undefined {\n\tif (typeof edge === \"string\") {\n\t\treturn edge;\n\t}\n\n\tif (edge === null || typeof edge !== \"object\" || Array.isArray(edge)) {\n\t\treturn undefined;\n\t}\n\n\tconst entries = Object.entries(edge);\n\tif (entries.length !== 1) {\n\t\treturn undefined;\n\t}\n\n\tconst entry = entries[0];\n\tif (entry === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst [key, value] = entry;\n\tif (!key.includes(\"->\") || typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\n\treturn `${key}: ${value}`;\n}\n","import { exportExcalidraw, exportSvg } from \"../exporters/index.js\";\nimport type { ExportResult } from \"../exporters/types.js\";\nimport type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type { JsonObject } from \"../ir/geometry.js\";\nimport type {\n\tPortShiftingOptions,\n\tSolveDiagramOptions,\n} from \"../solver/index.js\";\nimport { solveDiagram } from \"../solver/index.js\";\nimport { sortDslDiagnostics } from \"./diagnostics.js\";\nimport { normalizeDiagramDsl } from \"./normalize.js\";\nimport { parseDiagramDsl } from \"./parse.js\";\nimport type {\n\tDslDiagnostic,\n\tDslOutputFormat,\n\tRenderDiagramDslOptions,\n\tRenderDiagramDslResult,\n} from \"./types.js\";\n\nexport function resolveOutputFormat(\n\tcliFormat?: string,\n\tdslFormat?: DslOutputFormat,\n): { format?: DslOutputFormat; diagnostics: DslDiagnostic[] } {\n\tconst selected = cliFormat ?? dslFormat ?? \"svg\";\n\n\tif (selected === \"svg\" || selected === \"excalidraw\") {\n\t\treturn { format: selected, diagnostics: [] };\n\t}\n\n\treturn {\n\t\tdiagnostics: [\n\t\t\t{\n\t\t\t\tseverity: \"error\",\n\t\t\t\tlayer: \"validate\",\n\t\t\t\tcode: \"validate.output-format.unsupported\",\n\t\t\t\tmessage: `Unsupported output format \"${selected}\".`,\n\t\t\t\tpath: [\"output\", \"format\"],\n\t\t\t\thint: \"Use svg or excalidraw.\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function exportDiagram(\n\tformat: DslOutputFormat,\n\tdiagram: CoordinatedDiagram,\n): ExportResult {\n\tconst content =\n\t\tformat === \"svg\" ? exportSvg(diagram) : exportExcalidraw(diagram);\n\n\treturn { format, content, diagnostics: [] };\n}\n\nexport function renderDiagramDsl(\n\tsource: string,\n\toptions: RenderDiagramDslOptions = {},\n): RenderDiagramDslResult {\n\tconst parsed = parseDiagramDsl(source, options);\n\tif (hasErrorDiagnostics(parsed.diagnostics) || parsed.value === undefined) {\n\t\treturn { diagnostics: parsed.diagnostics };\n\t}\n\n\tconst normalized = normalizeDiagramDsl(\n\t\tparsed.value,\n\t\toptions.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer },\n\t);\n\tconst format = resolveOutputFormat(options.format, normalized.output?.format);\n\tconst diagnostics = sortDslDiagnostics([\n\t\t...parsed.diagnostics,\n\t\t...normalized.diagnostics,\n\t\t...format.diagnostics,\n\t]);\n\n\tif (\n\t\tnormalized.diagram === undefined ||\n\t\tformat.format === undefined ||\n\t\thasErrorDiagnostics(diagnostics)\n\t) {\n\t\treturn { diagnostics };\n\t}\n\n\tconst solved = solveDiagram(normalized.diagram, {\n\t\t...solveInitialLayoutOption(normalized.diagram.metadata?.initialLayout),\n\t\trouteKind:\n\t\t\tnormalized.diagram.metadata?.routeKind === \"straight\"\n\t\t\t\t? \"straight\"\n\t\t\t\t: normalized.diagram.metadata?.routeKind === \"obstacle-avoiding\"\n\t\t\t\t\t? \"obstacle-avoiding\"\n\t\t\t\t\t: \"orthogonal\",\n\t\t...solvePortShiftingOption(normalized.diagram.metadata?.portShifting),\n\t\t...(options.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer }),\n\t});\n\tconst solveDiagnostics = solved.diagnostics.map(toSolveDiagnostic);\n\tif (hasErrorDiagnostics(solveDiagnostics)) {\n\t\treturn {\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: sortDslDiagnostics(solveDiagnostics),\n\t\t};\n\t}\n\n\ttry {\n\t\tconst exported = exportDiagram(format.format, solved);\n\t\treturn {\n\t\t\tformat: exported.format,\n\t\t\tcontent: exported.content,\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: sortDslDiagnostics([\n\t\t\t\t...diagnostics,\n\t\t\t\t...solveDiagnostics,\n\t\t\t\t...exported.diagnostics.map(toExportDiagnostic),\n\t\t\t]),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: [\n\t\t\t\t{\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tlayer: \"export\",\n\t\t\t\t\tcode: \"export.failed\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\thint: \"Check the coordinated diagram and selected output format.\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\nfunction toSolveDiagnostic(\n\tdiagnostic: CoordinatedDiagram[\"diagnostics\"][number],\n): DslDiagnostic {\n\treturn { ...diagnostic, layer: \"solve\" };\n}\n\nfunction solveInitialLayoutOption(\n\tvalue: unknown,\n): Pick<SolveDiagramOptions, \"initialLayout\"> {\n\treturn value === \"positions\" ? { initialLayout: \"positions\" } : {};\n}\n\nfunction solvePortShiftingOption(value: unknown):\n\t| {\n\t\t\tportShifting: PortShiftingOptions;\n\t }\n\t| Record<string, never> {\n\tif (!isJsonObject(value)) {\n\t\treturn {};\n\t}\n\tconst portShifting: PortShiftingOptions = {};\n\tif (value.enabled === false) {\n\t\tportShifting.enabled = false;\n\t}\n\tif (typeof value.spacing === \"number\") {\n\t\tportShifting.spacing = value.spacing;\n\t}\n\treturn { portShifting };\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toExportDiagnostic(\n\tdiagnostic: ExportResult[\"diagnostics\"][number],\n): DslDiagnostic {\n\treturn { ...diagnostic, layer: \"export\" };\n}\n\nfunction hasErrorDiagnostics(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n","import {\n\tmkdtemp,\n\treadFile,\n\trename,\n\trm,\n\tstat,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { DslDiagnostic } from \"../dsl/index.js\";\n\nexport const MAX_INPUT_BYTES = 1_000_000;\n\nexport async function readStdin(stream: Readable): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tlet size = 0;\n\n\tfor await (const chunk of stream) {\n\t\tconst buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n\t\tsize += buffer.byteLength;\n\t\tif (size > MAX_INPUT_BYTES) {\n\t\t\tthrow inputTooLargeDiagnostic();\n\t\t}\n\t\tchunks.push(buffer);\n\t}\n\n\treturn Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function readInputFile(path: string): Promise<string> {\n\tconst inputStat = await stat(path);\n\tif (inputStat.size > MAX_INPUT_BYTES) {\n\t\tthrow inputTooLargeDiagnostic();\n\t}\n\n\tconst content = await readFile(path, \"utf8\");\n\tif (Buffer.byteLength(content, \"utf8\") > MAX_INPUT_BYTES) {\n\t\tthrow inputTooLargeDiagnostic();\n\t}\n\n\treturn content;\n}\n\nexport async function writeStdout(\n\tstream: Writable,\n\tcontent: string,\n): Promise<void> {\n\tawait writeStream(stream, content);\n}\n\nexport async function writeStderr(\n\tstream: Writable,\n\tcontent: string,\n): Promise<void> {\n\tawait writeStream(stream, content);\n}\n\nexport async function writeFileAtomic(\n\tpath: string,\n\tcontent: string,\n): Promise<void> {\n\tconst dir = dirname(path);\n\tconst tempDir = await mkdtemp(join(dir, \".agh-output-\"));\n\tconst tempPath = join(tempDir, \"output.tmp\");\n\n\ttry {\n\t\tawait writeFile(tempPath, content, \"utf8\");\n\t\tawait rename(tempPath, path);\n\t} finally {\n\t\tawait rm(tempDir, { force: true, recursive: true });\n\t}\n}\n\nfunction writeStream(stream: Writable, content: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tstream.write(content, (error) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nfunction inputTooLargeDiagnostic(): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"io\",\n\t\tcode: \"io.input.too-large\",\n\t\tmessage: `Input exceeds ${MAX_INPUT_BYTES} bytes.`,\n\t\thint: \"Reduce the DSL input size or split the diagram into smaller files.\",\n\t};\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { Command, CommanderError } from \"commander\";\nimport { sortDslDiagnostics } from \"../dsl/diagnostics.js\";\nimport { renderDiagramDsl } from \"../dsl/render.js\";\nimport type { DslDiagnostic } from \"../dsl/types.js\";\nimport {\n\treadInputFile,\n\treadStdin,\n\twriteFileAtomic,\n\twriteStderr,\n\twriteStdout,\n} from \"./io.js\";\n\nexport interface CliEnvironment {\n\tstdin?: Readable;\n\tstdout?: Writable;\n\tstderr?: Writable;\n}\n\ninterface CliOptions {\n\tinput?: string;\n\toutput?: string;\n\tformat?: string;\n\tjson?: boolean;\n}\n\nexport async function runCli(\n\targs: string[],\n\tenv: CliEnvironment = {},\n): Promise<number> {\n\tconst stdout = env.stdout ?? process.stdout;\n\tconst stderr = env.stderr ?? process.stderr;\n\tconst stdin = env.stdin ?? process.stdin;\n\tconst command = buildCommand();\n\n\ttry {\n\t\tcommand.parse(args, { from: \"user\" });\n\t} catch (error) {\n\t\tif (error instanceof CommanderError) {\n\t\t\tawait writeStderr(stderr, error.message);\n\t\t\treturn error.exitCode === 0 ? 0 : 2;\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst options = command.opts<CliOptions>();\n\n\ttry {\n\t\tconst source =\n\t\t\toptions.input === undefined\n\t\t\t\t? await readStdin(stdin)\n\t\t\t\t: await readInputFile(options.input);\n\t\tconst result = renderDiagramDsl(source, {\n\t\t\t...(options.input === undefined ? {} : { sourcePath: options.input }),\n\t\t\t...(options.format === undefined ? {} : { format: options.format }),\n\t\t});\n\t\tconst diagnostics = sortDslDiagnostics(result.diagnostics);\n\n\t\tif (hasErrors(diagnostics) || result.content === undefined) {\n\t\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (diagnostics.length > 0) {\n\t\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\t}\n\n\t\tif (options.output === undefined) {\n\t\t\tawait writeStdout(stdout, result.content);\n\t\t} else {\n\t\t\tawait writeFileAtomic(options.output, result.content);\n\t\t}\n\n\t\treturn 0;\n\t} catch (error) {\n\t\tconst diagnostics = [toIoDiagnostic(error)];\n\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\treturn 1;\n\t}\n}\n\nfunction buildCommand(): Command {\n\treturn new Command()\n\t\t.name(\"agh\")\n\t\t.exitOverride()\n\t\t.configureOutput({\n\t\t\twriteOut: () => {},\n\t\t\twriteErr: () => {},\n\t\t})\n\t\t.option(\"--input <path>\", \"Read diagram DSL from a file\")\n\t\t.option(\"--output <path>\", \"Write generated output to a file\")\n\t\t.option(\"--format <format>\", \"Output format: svg or excalidraw\")\n\t\t.option(\"--json\", \"Write diagnostics as JSON to stderr\");\n}\n\nasync function writeDiagnostics(\n\tstderr: Writable,\n\tdiagnostics: DslDiagnostic[],\n\tasJson: boolean,\n): Promise<void> {\n\tif (diagnostics.length === 0) {\n\t\treturn;\n\t}\n\n\tconst content = asJson\n\t\t? `${JSON.stringify({ diagnostics }, null, 2)}\\n`\n\t\t: formatHumanDiagnostics(diagnostics);\n\tawait writeStderr(stderr, content);\n}\n\nfunction formatHumanDiagnostics(diagnostics: DslDiagnostic[]): string {\n\tconst lines = [`${diagnostics.length} diagnostic(s):`];\n\n\tfor (const diagnostic of diagnostics) {\n\t\tconst path = formatPath(diagnostic.path);\n\t\tlines.push(\n\t\t\t[\n\t\t\t\tdiagnostic.severity,\n\t\t\t\tdiagnostic.layer,\n\t\t\t\tdiagnostic.code,\n\t\t\t\tpath,\n\t\t\t\tdiagnostic.message,\n\t\t\t\tdiagnostic.hint,\n\t\t\t]\n\t\t\t\t.filter((part) => part !== undefined && part !== \"\")\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t}\n\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatPath(path: DslDiagnostic[\"path\"]): string {\n\treturn path === undefined || path.length === 0\n\t\t? \"\"\n\t\t: `path=${path.map(String).join(\".\")}`;\n}\n\nfunction hasErrors(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n\nfunction toIoDiagnostic(error: unknown): DslDiagnostic {\n\tif (isDslDiagnostic(error)) {\n\t\treturn error;\n\t}\n\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"io\",\n\t\tcode: \"io.failed\",\n\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\thint: \"Check input and output paths, permissions, and CLI arguments.\",\n\t};\n}\n\nfunction isDslDiagnostic(error: unknown): error is DslDiagnostic {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"severity\" in error &&\n\t\t\"layer\" in error &&\n\t\t\"code\" in error &&\n\t\t\"message\" in error\n\t);\n}\n","#!/usr/bin/env node\n\nimport { runCli } from \"./run.js\";\n\nvoid runCli(process.argv.slice(2))\n\t.then((exitCode) => {\n\t\tprocess.exitCode = exitCode;\n\t})\n\t.catch((error: unknown) => {\n\t\tprocess.stderr.write(\n\t\t\terror instanceof Error ? error.message : String(error),\n\t\t);\n\t\tprocess.stderr.write(\"\\n\");\n\t\tprocess.exitCode = 1;\n\t});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/dsl/diagnostics.ts","../../src/exporters/arrow.ts","../../src/exporters/excalidraw.ts","../../src/exporters/svg.ts","../../src/geometry/boxes.ts","../../src/geometry/spatial-index.ts","../../src/constraints/solver.ts","../../src/geometry/shapes.ts","../../src/geometry/containers.ts","../../src/text/types.ts","../../src/text/fallback.ts","../../src/text/node-canvas.ts","../../src/text/pretext.ts","../../src/text/default.ts","../../src/labels/fit.ts","../../src/dsl/normalize.ts","../../src/ir/diagnostics.ts","../../src/layout/dagre.ts","../../src/layout/recursive.ts","../../src/routing/binary-heap.ts","../../src/routing/astar.ts","../../src/routing/budget.ts","../../src/routing/visibility-router.ts","../../src/routing/routes.ts","../../src/solver/solve.ts","../../src/dsl/edges.ts","../../src/dsl/schema.ts","../../src/dsl/parse.ts","../../src/dsl/render.ts","../../src/cli/io.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"names":["point","renderGroup","renderMatrixBlock","renderTableBlock","renderEvidencePanel","renderNode","cell","compartments","line","offset","movingCenter","fixedCenter","contentBox","style","require","createRequire","prepareWithSegments","layoutWithLines","measureNaturalWidth","normalizeMinSize","Graph","layout","simplifyRoute","expandBox","aStarSearch","manhattan","reconstructPath","bestPoints","rerouted","squaredDistance","areCollinear","exit","segmentBox","rangesOverlap","DEFAULT_MATRIX_CELL_SIZE","DEFAULT_TABLE_CELL_SIZE","DEFAULT_PANEL_ITEM_HEIGHT","alignmentValue","distributionStart","lanes","defaultMatrixRowHeaderWidth","tableCellBox","_","panelItemText","compartmentRows","labelOffset","segmentIntersectsBox","pointInsideBox","segmentIntersectsBoxEdge","labelPlacementOnPolyline","nonZeroSegments","z","Buffer","parseDocument","hasErrorDiagnostics","stat","readFile","path","dirname","mkdtemp","join","writeFile","rename","rm","CommanderError","Command","formatPath"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DslDiagnostic, DslDiagnosticLayer } from \"./types.js\";\n\nconst SEVERITY_RANK = new Map([\n\t[\"error\", 0],\n\t[\"warning\", 1],\n\t[\"info\", 2],\n] as const);\n\nconst LAYER_RANK = new Map<DslDiagnosticLayer, number>([\n\t[\"parse\", 0],\n\t[\"validate\", 1],\n\t[\"solve\", 2],\n\t[\"export\", 3],\n\t[\"io\", 4],\n]);\n\nexport function sortDslDiagnostics(\n\tdiagnostics: DslDiagnostic[],\n): DslDiagnostic[] {\n\treturn [...diagnostics].sort((a, b) => {\n\t\tconst severityDelta =\n\t\t\t(SEVERITY_RANK.get(a.severity) ?? 99) -\n\t\t\t(SEVERITY_RANK.get(b.severity) ?? 99);\n\t\tif (severityDelta !== 0) {\n\t\t\treturn severityDelta;\n\t\t}\n\n\t\tconst layerDelta =\n\t\t\t(LAYER_RANK.get(a.layer) ?? 99) - (LAYER_RANK.get(b.layer) ?? 99);\n\t\tif (layerDelta !== 0) {\n\t\t\treturn layerDelta;\n\t\t}\n\n\t\tconst pathDelta = pathKey(a.path).localeCompare(pathKey(b.path));\n\t\tif (pathDelta !== 0) {\n\t\t\treturn pathDelta;\n\t\t}\n\n\t\treturn a.code.localeCompare(b.code);\n\t});\n}\n\nexport function createSchemaDiagnostic(\n\tpath: Array<string | number>,\n\tmessage: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"validate\",\n\t\tcode: \"validate.schema.invalid\",\n\t\tmessage,\n\t\tpath,\n\t\thint: hintForPath(path),\n\t};\n}\n\nexport function createParseDiagnostic(\n\tcode: string,\n\tmessage: string,\n\thint: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"parse\",\n\t\tcode,\n\t\tmessage,\n\t\thint,\n\t};\n}\n\nfunction hintForPath(path: Array<string | number>): string {\n\tconst pathText = pathKey(path);\n\n\tif (pathText.endsWith(\".shape\")) {\n\t\treturn \"Use one of: rectangle, rounded-rectangle, ellipse, diamond, parallelogram, hexagon, cylinder.\";\n\t}\n\n\tif (pathText.endsWith(\".format\")) {\n\t\treturn \"Use output format svg or excalidraw.\";\n\t}\n\n\tif (pathText.includes(\".position.\")) {\n\t\treturn \"Use finite numeric x and y coordinates.\";\n\t}\n\n\treturn \"Check the DSL value at this path against the supported schema.\";\n}\n\nfunction pathKey(path: DslDiagnostic[\"path\"]): string {\n\treturn (path ?? []).map(String).join(\".\");\n}\n","import type { Point } from \"../ir/geometry.js\";\n\nexport interface Arrowhead {\n\ttip: Point;\n\tleft: Point;\n\tright: Point;\n\tdirection: Point;\n}\n\nexport function computeArrowhead(\n\tpoints: readonly Point[],\n\toptions: { length?: number; width?: number } = {},\n): Arrowhead {\n\tconst { length = 10, width = 8 } = options;\n\n\tfor (let index = points.length - 1; index > 0; index -= 1) {\n\t\tconst tip = points[index];\n\t\tconst previous = points[index - 1];\n\t\tif (tip === undefined || previous === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst dx = tip.x - previous.x;\n\t\tconst dy = tip.y - previous.y;\n\t\tconst magnitude = Math.hypot(dx, dy);\n\t\tif (magnitude === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst direction = { x: dx / magnitude, y: dy / magnitude };\n\t\tconst perpendicular = { x: -direction.y, y: direction.x };\n\t\tconst base = {\n\t\t\tx: tip.x - direction.x * length,\n\t\t\ty: tip.y - direction.y * length,\n\t\t};\n\t\tconst halfWidth = width / 2;\n\n\t\treturn {\n\t\t\ttip: { ...tip },\n\t\t\tleft: {\n\t\t\t\tx: base.x + perpendicular.x * halfWidth,\n\t\t\t\ty: base.y + perpendicular.y * halfWidth,\n\t\t\t},\n\t\t\tright: {\n\t\t\t\tx: base.x - perpendicular.x * halfWidth,\n\t\t\t\ty: base.y - perpendicular.y * halfWidth,\n\t\t\t},\n\t\t\tdirection,\n\t\t};\n\t}\n\n\tthrow new TypeError(\"Arrowhead requires at least one non-zero segment\");\n}\n","import type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedTableBlock,\n\tEdgeArrowhead,\n\tLabel,\n\tNodeShape,\n} from \"../ir/elements.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport type { ExportOptions } from \"./types.js\";\n\ntype ExcalidrawElement =\n\t| ExcalidrawShapeElement\n\t| ExcalidrawTextElement\n\t| ExcalidrawArrowElement;\n\ntype ExcalidrawElementType =\n\t| \"rectangle\"\n\t| \"ellipse\"\n\t| \"diamond\"\n\t| \"parallelogram\"\n\t| \"hexagon\"\n\t| \"cylinder\"\n\t| \"text\"\n\t| \"arrow\";\n\ninterface ExcalidrawElementBase<TType extends ExcalidrawElementType> {\n\tid: string;\n\ttype: TType;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\tangle: 0;\n\tstrokeColor: string;\n\tbackgroundColor: string;\n\tfillStyle: \"solid\";\n\tstrokeWidth: number;\n\tstrokeStyle: \"solid\" | \"dashed\";\n\troughness: 0;\n\topacity: 100;\n\tgroupIds: string[];\n\tseed: number;\n\tversion: 1;\n\tversionNonce: number;\n\tisDeleted: false;\n\tboundElements: null;\n\tupdated: 0;\n\tlink: null;\n\tlocked: false;\n}\n\ninterface ExcalidrawShapeElement\n\textends ExcalidrawElementBase<\n\t\t| \"rectangle\"\n\t\t| \"ellipse\"\n\t\t| \"diamond\"\n\t\t| \"parallelogram\"\n\t\t| \"hexagon\"\n\t\t| \"cylinder\"\n\t> {\n\ttype:\n\t\t| \"rectangle\"\n\t\t| \"ellipse\"\n\t\t| \"diamond\"\n\t\t| \"parallelogram\"\n\t\t| \"hexagon\"\n\t\t| \"cylinder\";\n}\n\ninterface ExcalidrawTextElement extends ExcalidrawElementBase<\"text\"> {\n\ttype: \"text\";\n\ttext: string;\n\tfontSize: number;\n\tfontFamily: 1;\n\ttextAlign: \"center\" | \"left\";\n\tverticalAlign: \"middle\" | \"top\";\n\tbaseline: number;\n\tcontainerId: string | null;\n\toriginalText: string;\n\tlineHeight: number;\n}\n\ninterface ExcalidrawArrowElement extends ExcalidrawElementBase<\"arrow\"> {\n\ttype: \"arrow\";\n\tpoints: Point[];\n\tstartBinding: { elementId: string; focus: 0; gap: 0 };\n\tendBinding: { elementId: string; focus: 0; gap: 0 };\n\tstartArrowhead: null;\n\tendArrowhead: \"arrow\" | \"triangle\" | \"triangle_outline\";\n}\n\nexport function exportExcalidraw(\n\tdiagram: CoordinatedDiagram,\n\toptions: ExportOptions = {},\n): string {\n\tconst elements: ExcalidrawElement[] = [];\n\tconst groupIdByChildId = createGroupMembership(diagram.groups);\n\n\tfor (const group of diagram.groups) {\n\t\tconst groupElementId = groupElementIdFor(group.id);\n\t\telements.push(renderGroup(group));\n\t\tconst text = renderText(\n\t\t\t`group-text:${group.id}`,\n\t\t\tgroup.label,\n\t\t\tgroup.box,\n\t\t\tgroupElementId,\n\t\t\tgroupIdByChildId.get(group.id) ?? [],\n\t\t);\n\t\tif (text !== undefined) {\n\t\t\telements.push(text);\n\t\t}\n\t}\n\n\tfor (const node of diagram.nodes) {\n\t\telements.push(renderNode(node, groupIdByChildId.get(node.id) ?? []));\n\t\tconst text = renderText(\n\t\t\t`node-text:${node.id}`,\n\t\t\tnode.label,\n\t\t\tnode.box,\n\t\t\t`node:${node.id}`,\n\t\t\tgroupIdByChildId.get(node.id) ?? [],\n\t\t);\n\t\tif (text !== undefined) {\n\t\t\telements.push(text);\n\t\t}\n\t}\n\n\tfor (const matrix of diagram.matrices ?? []) {\n\t\telements.push(...renderMatrixBlock(matrix as CoordinatedMatrixBlock));\n\t}\n\n\tfor (const table of diagram.tables ?? []) {\n\t\telements.push(...renderTableBlock(table as CoordinatedTableBlock));\n\t}\n\n\tfor (const panel of diagram.evidencePanels ?? []) {\n\t\telements.push(...renderEvidencePanel(panel as CoordinatedEvidencePanel));\n\t}\n\n\tfor (const edge of diagram.edges) {\n\t\telements.push(renderArrow(edge));\n\t}\n\n\tconst scene = {\n\t\ttype: \"excalidraw\",\n\t\tversion: 2,\n\t\tsource: \"auto-graph\",\n\t\telements,\n\t\tappState: {\n\t\t\tname: options.title ?? diagram.title ?? diagram.id,\n\t\t\tviewBackgroundColor: \"#ffffff\",\n\t\t\tgridSize: null,\n\t\t\t...(options.viewportPadding === undefined\n\t\t\t\t? {}\n\t\t\t\t: viewportAppState(diagram.bounds, options.viewportPadding)),\n\t\t},\n\t\tfiles: {},\n\t};\n\n\treturn `${JSON.stringify(scene, null, 2)}\\n`;\n}\n\nfunction viewportAppState(\n\tbounds: Box,\n\tpadding: number,\n): {\n\tscrollX: number;\n\tscrollY: number;\n\tzoom: { value: number };\n} {\n\tconst safePadding = Number.isFinite(padding) ? Math.max(0, padding) : 0;\n\treturn {\n\t\tscrollX: finite(-bounds.x + safePadding),\n\t\tscrollY: finite(-bounds.y + safePadding),\n\t\tzoom: { value: 1 },\n\t};\n}\n\nfunction renderGroup(group: CoordinatedGroup): ExcalidrawShapeElement {\n\treturn {\n\t\t...baseElement(`group:${group.id}`, \"rectangle\", group.box),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeStyle: \"dashed\",\n\t\tgroupIds: groupGroupIds(group.id),\n\t};\n}\n\nfunction renderNode(\n\tnode: CoordinatedNode,\n\tgroupIds: string[],\n): ExcalidrawShapeElement {\n\treturn {\n\t\t...baseElement(`node:${node.id}`, mapShape(node.shape), node.box),\n\t\tgroupIds,\n\t};\n}\n\nfunction renderMatrixBlock(\n\tmatrix: CoordinatedMatrixBlock,\n): ExcalidrawElement[] {\n\tconst containerId = `matrix:${matrix.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\tmatrix.id,\n\t\t`row | ${matrix.cols.join(\" | \")}`,\n\t\t...matrix.rows.map((rowId, rowIndex) => {\n\t\t\tconst row = matrix.cells[rowIndex] ?? [];\n\t\t\treturn `${rowId}: ${matrix.cols\n\t\t\t\t.map((_, columnIndex) => row[columnIndex]?.text ?? \"\")\n\t\t\t\t.join(\" | \")}`;\n\t\t}),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", matrix.box),\n\t\t\tbackgroundColor: matrix.style?.fill ?? \"#f8fafc\",\n\t\t\tstrokeColor: matrix.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`matrix-text:${matrix.id}`,\n\t\t\tlabel,\n\t\t\tmatrix.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderTableBlock(table: CoordinatedTableBlock): ExcalidrawElement[] {\n\tconst containerId = `table:${table.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\ttable.columns.map((column) => column.label.text).join(\" | \"),\n\t\t...table.rows.map((row) =>\n\t\t\ttable.columns\n\t\t\t\t.map((column) => row.cells[column.id]?.text ?? \"\")\n\t\t\t\t.join(\" | \"),\n\t\t),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", table.box),\n\t\t\tbackgroundColor: table.style?.fill ?? \"#f8fafc\",\n\t\t\tstrokeColor: table.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`table-text:${table.id}`,\n\t\t\tlabel,\n\t\t\ttable.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderEvidencePanel(\n\tpanel: CoordinatedEvidencePanel,\n): ExcalidrawElement[] {\n\tconst containerId = `evidence-panel:${panel.id}`;\n\tconst groupIds = [containerId];\n\tconst label = blockText([\n\t\t`${panel.kind}: ${panel.id}`,\n\t\t...panel.items.map((item) =>\n\t\t\titem.detail?.text === undefined\n\t\t\t\t? item.label.text\n\t\t\t\t: `${item.label.text}: ${item.detail.text}`,\n\t\t),\n\t]);\n\treturn [\n\t\t{\n\t\t\t...baseElement(containerId, \"rectangle\", panel.box),\n\t\t\tbackgroundColor: panel.style?.fill ?? panelKindFill(panel.kind),\n\t\t\tstrokeColor: panel.style?.stroke ?? \"#374151\",\n\t\t\tgroupIds,\n\t\t},\n\t\trenderTextBlock(\n\t\t\t`evidence-panel-text:${panel.id}`,\n\t\t\tlabel,\n\t\t\tpanel.box,\n\t\t\tcontainerId,\n\t\t\tgroupIds,\n\t\t),\n\t];\n}\n\nfunction renderArrow(edge: CoordinatedEdge): ExcalidrawArrowElement {\n\tconst first = edge.points[0];\n\tif (first === undefined) {\n\t\tthrow new TypeError(\n\t\t\t`Excalidraw edge ${edge.id} requires at least one point`,\n\t\t);\n\t}\n\n\tconst relativePoints = edge.points.map((point) => ({\n\t\tx: point.x - first.x,\n\t\ty: point.y - first.y,\n\t}));\n\tconst box = pointsBox(relativePoints);\n\n\treturn {\n\t\t...baseElement(`edge:${edge.id}`, \"arrow\", {\n\t\t\tx: first.x,\n\t\t\ty: first.y,\n\t\t\twidth: box.width,\n\t\t\theight: box.height,\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeStyle: edge.style ?? \"solid\",\n\t\tpoints: relativePoints,\n\t\tstartBinding: { elementId: `node:${edge.source.nodeId}`, focus: 0, gap: 0 },\n\t\tendBinding: { elementId: `node:${edge.target.nodeId}`, focus: 0, gap: 0 },\n\t\tstartArrowhead: null,\n\t\tendArrowhead: mapArrowhead(edge.arrowhead),\n\t};\n}\n\nfunction renderText(\n\tid: string,\n\tlabel: Label | undefined,\n\tbox: Box,\n\tcontainerId: string,\n\tgroupIds: string[],\n): ExcalidrawTextElement | undefined {\n\tif (label?.text === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst fontSize = 14;\n\treturn {\n\t\t...baseElement(id, \"text\", {\n\t\t\tx: box.x,\n\t\t\ty: box.y + box.height / 2 - fontSize / 2,\n\t\t\twidth: box.width,\n\t\t\theight: fontSize,\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeColor: \"#111827\",\n\t\tgroupIds,\n\t\ttext: label.text,\n\t\tfontSize,\n\t\tfontFamily: 1,\n\t\ttextAlign: \"center\",\n\t\tverticalAlign: \"middle\",\n\t\tbaseline: fontSize,\n\t\tcontainerId,\n\t\toriginalText: label.text,\n\t\tlineHeight: 1.25,\n\t\tboundElements: null,\n\t\tlink: null,\n\t\tlocked: false,\n\t\tseed: seedFor(id),\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t};\n}\n\nfunction renderTextBlock(\n\tid: string,\n\ttext: string,\n\tbox: Box,\n\tcontainerId: string,\n\tgroupIds: string[],\n): ExcalidrawTextElement {\n\tconst fontSize = 12;\n\treturn {\n\t\t...baseElement(id, \"text\", {\n\t\t\tx: box.x + 8,\n\t\t\ty: box.y + 8,\n\t\t\twidth: Math.max(0, box.width - 16),\n\t\t\theight: Math.max(fontSize, box.height - 16),\n\t\t}),\n\t\tbackgroundColor: \"transparent\",\n\t\tstrokeColor: \"#111827\",\n\t\tgroupIds,\n\t\ttext,\n\t\tfontSize,\n\t\tfontFamily: 1,\n\t\ttextAlign: \"left\",\n\t\tverticalAlign: \"top\",\n\t\tbaseline: fontSize,\n\t\tcontainerId,\n\t\toriginalText: text,\n\t\tlineHeight: 1.25,\n\t\tboundElements: null,\n\t\tlink: null,\n\t\tlocked: false,\n\t\tseed: seedFor(id),\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t};\n}\n\nfunction baseElement<TType extends ExcalidrawElementType>(\n\tid: string,\n\ttype: TType,\n\tbox: Box,\n): ExcalidrawElementBase<TType> {\n\treturn {\n\t\tid,\n\t\ttype,\n\t\tx: finite(box.x),\n\t\ty: finite(box.y),\n\t\twidth: finite(box.width),\n\t\theight: finite(box.height),\n\t\tangle: 0,\n\t\tstrokeColor: \"#374151\",\n\t\tbackgroundColor: \"#f8fafc\",\n\t\tfillStyle: \"solid\",\n\t\tstrokeWidth: 1,\n\t\tstrokeStyle: \"solid\",\n\t\troughness: 0,\n\t\topacity: 100,\n\t\tgroupIds: [],\n\t\tseed: seedFor(id),\n\t\tversion: 1,\n\t\tversionNonce: seedFor(`${id}:nonce`),\n\t\tisDeleted: false,\n\t\tboundElements: null,\n\t\tupdated: 0,\n\t\tlink: null,\n\t\tlocked: false,\n\t};\n}\n\nfunction mapShape(shape: NodeShape): ExcalidrawShapeElement[\"type\"] {\n\tswitch (shape) {\n\t\tcase \"rounded-rectangle\":\n\t\tcase \"rectangle\":\n\t\t\treturn \"rectangle\";\n\t\tcase \"ellipse\":\n\t\t\treturn \"ellipse\";\n\t\tcase \"diamond\":\n\t\t\treturn \"diamond\";\n\t\tcase \"parallelogram\":\n\t\t\treturn \"parallelogram\";\n\t\tcase \"hexagon\":\n\t\t\treturn \"hexagon\";\n\t\tcase \"cylinder\":\n\t\t\treturn \"cylinder\";\n\t}\n}\n\nfunction mapArrowhead(\n\tarrowhead: EdgeArrowhead | undefined,\n): ExcalidrawArrowElement[\"endArrowhead\"] {\n\tswitch (arrowhead) {\n\t\tcase undefined:\n\t\t\treturn \"arrow\";\n\t\tcase \"triangle\":\n\t\t\treturn \"triangle\";\n\t\tcase \"hollowTriangle\":\n\t\t\treturn \"triangle_outline\";\n\t}\n}\n\nfunction createGroupMembership(\n\tgroups: readonly CoordinatedGroup[],\n): Map<string, string[]> {\n\tconst membership = new Map<string, string[]>();\n\tfor (const group of groups) {\n\t\tconst groupElementId = groupElementIdFor(group.id);\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\taddMembership(membership, nodeId, groupElementId);\n\t\t}\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\taddMembership(membership, childGroupId, groupElementId);\n\t\t}\n\t}\n\treturn membership;\n}\n\nfunction addMembership(\n\tmembership: Map<string, string[]>,\n\tchildId: string,\n\tgroupElementId: string,\n): void {\n\tconst existing = membership.get(childId) ?? [];\n\tmembership.set(childId, [...existing, groupElementId].sort());\n}\n\nfunction groupGroupIds(groupId: string): string[] {\n\treturn [groupElementIdFor(groupId)];\n}\n\nfunction groupElementIdFor(groupId: string): string {\n\treturn `group:${groupId}`;\n}\n\nfunction blockText(lines: readonly string[]): string {\n\treturn lines.filter((line) => line.length > 0).join(\"\\n\");\n}\n\nfunction panelKindFill(kind: CoordinatedEvidencePanel[\"kind\"]): string {\n\tswitch (kind) {\n\t\tcase \"legend\":\n\t\t\treturn \"#ecfdf5\";\n\t\tcase \"rule\":\n\t\t\treturn \"#eff6ff\";\n\t\tcase \"note\":\n\t\t\treturn \"#fffbeb\";\n\t\tcase \"verification\":\n\t\t\treturn \"#fef2f2\";\n\t}\n}\n\nfunction pointsBox(points: readonly Point[]): Box {\n\tconst xs = points.map((point) => point.x);\n\tconst ys = points.map((point) => point.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY,\n\t};\n}\n\nfunction finite(value: number): number {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(\n\t\t\t\"Excalidraw export requires finite coordinated numbers\",\n\t\t);\n\t}\n\treturn Number.parseFloat(value.toFixed(3));\n}\n\nfunction seedFor(id: string): number {\n\tlet hash = 2166136261;\n\tfor (let index = 0; index < id.length; index += 1) {\n\t\thash ^= id.charCodeAt(index);\n\t\thash = Math.imul(hash, 16777619);\n\t}\n\treturn Math.abs(hash);\n}\n","import type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedFrame,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedTableBlock,\n\tLabel,\n\tNodeShape,\n\tSwimlane,\n} from \"../ir/elements.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport type { SolvedTextAnnotation } from \"../ir/label-layout.js\";\nimport { computeArrowhead } from \"./arrow.js\";\nimport type { ExportOptions } from \"./types.js\";\n\nconst NODE_FILL = \"#f8fafc\";\nconst GROUP_FILL = \"#f9fafb\";\nconst STROKE = \"#374151\";\nconst EDGE_STROKE = \"#111827\";\nconst FONT_FAMILY = \"Arial, sans-serif\";\nconst EVIDENCE_FILL = \"#f8fafc\";\nconst EVIDENCE_HEADER_FILL = \"#e5e7eb\";\nconst EVIDENCE_TEXT_FONT_SIZE = 10;\nconst EVIDENCE_TEXT_LINE_HEIGHT = 12;\nconst EVIDENCE_PANEL_KIND_FILL = {\n\tlegend: \"#ecfdf5\",\n\trule: \"#eff6ff\",\n\tnote: \"#fffbeb\",\n\tverification: \"#fef2f2\",\n} as const;\n\nexport function exportSvg(\n\tdiagram: CoordinatedDiagram,\n\toptions: ExportOptions = {},\n): string {\n\tconst title = options.title ?? diagram.title;\n\tconst annotations = diagram.textAnnotations ?? [];\n\treturn `${[\n\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" viewBox=\"${formatBoxViewBox(diagram.bounds)}\">`,\n\t\t...(title === undefined ? [] : [` <title>${escapeXml(title)}</title>`]),\n\t\t...(options.viewportPadding === undefined\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t` <metadata data-dge-viewport=\"${escapeAttribute(viewportMetadata(diagram.bounds, options.viewportPadding))}\"></metadata>`,\n\t\t\t\t]),\n\t\t` <rect class=\"background\" x=\"${formatNumber(diagram.bounds.x)}\" y=\"${formatNumber(diagram.bounds.y)}\" width=\"${formatNumber(diagram.bounds.width)}\" height=\"${formatNumber(diagram.bounds.height)}\" fill=\"#ffffff\"/>`,\n\t\t...(diagram.frame === undefined\n\t\t\t? []\n\t\t\t: [indent(renderFrame(diagram.frame, annotations))]),\n\t\t...(diagram.swimlanes ?? []).flatMap((swimlane) =>\n\t\t\trenderSwimlane(swimlane, annotations),\n\t\t),\n\t\t...diagram.groups.map((group) => indent(renderGroup(group))),\n\t\t...(diagram.matrices ?? []).flatMap((matrix) =>\n\t\t\tindentLines(renderMatrixBlock(matrix as CoordinatedMatrixBlock)),\n\t\t),\n\t\t...(diagram.tables ?? []).flatMap((table) =>\n\t\t\tindentLines(renderTableBlock(table as CoordinatedTableBlock)),\n\t\t),\n\t\t...(diagram.evidencePanels ?? []).flatMap((panel) =>\n\t\t\tindentLines(renderEvidencePanel(panel as CoordinatedEvidencePanel)),\n\t\t),\n\t\t...diagram.edges.flatMap((edge) => {\n\t\t\tconst path = renderEdgePath(edge);\n\t\t\treturn path === undefined\n\t\t\t\t? []\n\t\t\t\t: [indent(path), indent(renderArrowhead(edge))];\n\t\t}),\n\t\t...diagram.nodes.map((node) => indent(renderNode(node))),\n\t\t...diagram.nodes.flatMap((node) => renderCompartments(node, annotations)),\n\t\t...diagram.nodes.flatMap((node) => renderPorts(node, annotations)),\n\t\t...diagram.groups.flatMap((group) =>\n\t\t\trenderLabel(group.label, group.box, group, annotations, \"group-label\"),\n\t\t),\n\t\t...diagram.nodes.flatMap((node) =>\n\t\t\tnode.compartments === undefined\n\t\t\t\t? renderLabel(node.label, node.box, node, annotations, \"node-label\")\n\t\t\t\t: [],\n\t\t),\n\t\t...diagram.edges.flatMap((edge) => renderEdgeLabel(edge, annotations)),\n\t\t\"</svg>\",\n\t].join(\"\\n\")}\\n`;\n}\n\nfunction viewportMetadata(bounds: Box, padding: number): string {\n\tconst safePadding = Number.isFinite(padding) ? Math.max(0, padding) : 0;\n\treturn JSON.stringify({\n\t\tx: bounds.x - safePadding,\n\t\ty: bounds.y - safePadding,\n\t\twidth: bounds.width + safePadding * 2,\n\t\theight: bounds.height + safePadding * 2,\n\t\tpadding: safePadding,\n\t});\n}\n\nfunction renderGroup(group: CoordinatedGroup): string {\n\treturn `<rect class=\"group\" data-id=\"${escapeAttribute(group.id)}\" x=\"${formatNumber(group.box.x)}\" y=\"${formatNumber(group.box.y)}\" width=\"${formatNumber(group.box.width)}\" height=\"${formatNumber(group.box.height)}\" fill=\"${GROUP_FILL}\" stroke=\"${STROKE}\" stroke-dasharray=\"6 4\"/>`;\n}\n\nfunction renderMatrixBlock(matrix: CoordinatedMatrixBlock): string[] {\n\tconst columnCount = Math.max(1, matrix.cols.length);\n\tconst rowCount = matrix.rows.length;\n\tconst rowHeaderWidth =\n\t\trowCount > 0 ? Math.min(96, matrix.box.width * 0.28) : 0;\n\tconst dataWidth = Math.max(0, matrix.box.width - rowHeaderWidth);\n\tconst cellWidth = dataWidth / columnCount;\n\tconst rowHeight = matrix.box.height / Math.max(1, rowCount + 1);\n\tconst lines = [\n\t\t`<g class=\"matrix-block\" data-id=\"${escapeAttribute(matrix.id)}\" data-row-count=\"${rowCount}\" data-column-count=\"${matrix.cols.length}\">`,\n\t\t` <rect class=\"matrix-frame\" x=\"${formatNumber(matrix.box.x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(matrix.box.width)}\" height=\"${formatNumber(matrix.box.height)}\" fill=\"${escapeAttribute(matrix.style?.fill ?? EVIDENCE_FILL)}\" stroke=\"${escapeAttribute(matrix.style?.stroke ?? STROKE)}\"/>`,\n\t];\n\n\tif (rowHeaderWidth > 0) {\n\t\tlines.push(\n\t\t\t` <rect class=\"matrix-corner-header\" x=\"${formatNumber(matrix.box.x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(rowHeaderWidth)}\" height=\"${formatNumber(rowHeight)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t);\n\t}\n\n\tfor (\n\t\tlet columnIndex = 0;\n\t\tcolumnIndex < matrix.cols.length;\n\t\tcolumnIndex += 1\n\t) {\n\t\tconst column = matrix.cols[columnIndex];\n\t\tif (column === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst x = matrix.box.x + rowHeaderWidth + columnIndex * cellWidth;\n\t\tlines.push(\n\t\t\t` <rect class=\"matrix-column-header\" data-col=\"${escapeAttribute(column)}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(matrix.box.y)}\" width=\"${formatNumber(cellWidth)}\" height=\"${formatNumber(rowHeight)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\trenderEvidenceText(\n\t\t\t\t\"matrix-column-label\",\n\t\t\t\tmatrix.columnLabelLayouts?.[columnIndex]?.lines ?? [column],\n\t\t\t\t{\n\t\t\t\t\tx,\n\t\t\t\t\ty: matrix.box.y,\n\t\t\t\t\twidth: cellWidth,\n\t\t\t\t\theight: rowHeight,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\tfor (let rowIndex = 0; rowIndex < matrix.rows.length; rowIndex += 1) {\n\t\tconst row = matrix.rows[rowIndex];\n\t\tconst cells = matrix.cells[rowIndex] ?? [];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (rowHeaderWidth > 0) {\n\t\t\tconst rowHeaderBox = {\n\t\t\t\tx: matrix.box.x,\n\t\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\t\twidth: rowHeaderWidth,\n\t\t\t\theight: rowHeight,\n\t\t\t};\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"matrix-row-header\" data-row=\"${escapeAttribute(row)}\" x=\"${formatNumber(rowHeaderBox.x)}\" y=\"${formatNumber(rowHeaderBox.y)}\" width=\"${formatNumber(rowHeaderBox.width)}\" height=\"${formatNumber(rowHeaderBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\t\trenderEvidenceText(\n\t\t\t\t\t\"matrix-row-label\",\n\t\t\t\t\tmatrix.rowLabelLayouts?.[rowIndex]?.lines ?? [row],\n\t\t\t\t\trowHeaderBox,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tfor (\n\t\t\tlet columnIndex = 0;\n\t\t\tcolumnIndex < matrix.cols.length;\n\t\t\tcolumnIndex += 1\n\t\t) {\n\t\t\tconst column = matrix.cols[columnIndex];\n\t\t\tif (column === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cell = cells[columnIndex] ?? { text: \"\" };\n\t\t\tconst box = {\n\t\t\t\tx: matrix.box.x + rowHeaderWidth + columnIndex * cellWidth,\n\t\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\t\twidth: cellWidth,\n\t\t\t\theight: rowHeight,\n\t\t\t};\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"matrix-cell\" data-row=\"${escapeAttribute(row)}\" data-col=\"${escapeAttribute(column)}\" x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\" fill=\"${escapeAttribute(cell.style?.fill ?? \"#ffffff\")}\" stroke=\"${escapeAttribute(cell.style?.stroke ?? STROKE)}\"/>`,\n\t\t\t\trenderEvidenceText(\n\t\t\t\t\t\"matrix-cell-label\",\n\t\t\t\t\tmatrix.cellLabelLayouts?.[rowIndex]?.[columnIndex]?.lines ?? [\n\t\t\t\t\t\tcell.text,\n\t\t\t\t\t],\n\t\t\t\t\tbox,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tlines.push(\"</g>\");\n\treturn lines;\n}\n\nfunction renderTableBlock(table: CoordinatedTableBlock): string[] {\n\tconst columnCount = Math.max(1, table.columns.length);\n\tconst rowHeight = table.box.height / Math.max(1, table.rows.length + 1);\n\tconst lines = [\n\t\t`<g class=\"table-block\" data-id=\"${escapeAttribute(table.id)}\" data-row-count=\"${table.rows.length}\" data-column-count=\"${table.columns.length}\">`,\n\t\t` <rect class=\"table-frame\" x=\"${formatNumber(table.box.x)}\" y=\"${formatNumber(table.box.y)}\" width=\"${formatNumber(table.box.width)}\" height=\"${formatNumber(table.box.height)}\" fill=\"${escapeAttribute(table.style?.fill ?? EVIDENCE_FILL)}\" stroke=\"${escapeAttribute(table.style?.stroke ?? STROKE)}\"/>`,\n\t\t` <g class=\"table-header\" data-column-count=\"${table.columns.length}\">`,\n\t];\n\n\tfor (\n\t\tlet columnIndex = 0;\n\t\tcolumnIndex < table.columns.length;\n\t\tcolumnIndex += 1\n\t) {\n\t\tconst column = table.columns[columnIndex];\n\t\tif (column === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst columnBox = tableCellBox(\n\t\t\ttable,\n\t\t\tcolumnIndex,\n\t\t\t0,\n\t\t\trowHeight,\n\t\t\tcolumnCount,\n\t\t);\n\t\tlines.push(\n\t\t\t` <rect class=\"table-header-cell\" data-col=\"${escapeAttribute(column.id)}\" x=\"${formatNumber(columnBox.x)}\" y=\"${formatNumber(columnBox.y)}\" width=\"${formatNumber(columnBox.width)}\" height=\"${formatNumber(columnBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t\t` ${renderEvidenceText(\"table-header-label\", table.columnLabelLayouts?.[columnIndex]?.lines ?? [column.label.text], columnBox)}`,\n\t\t);\n\t}\n\tlines.push(\" </g>\");\n\n\tfor (let rowIndex = 0; rowIndex < table.rows.length; rowIndex += 1) {\n\t\tconst row = table.rows[rowIndex];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rowBox = {\n\t\t\tx: table.box.x,\n\t\t\ty: table.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: table.box.width,\n\t\t\theight: rowHeight,\n\t\t};\n\t\tconst rowClass = rowIndex % 2 === 0 ? \"table-row-even\" : \"table-row-odd\";\n\t\tlines.push(\n\t\t\t` <g class=\"table-row ${rowClass}\" data-row=\"${escapeAttribute(row.id)}\">`,\n\t\t\t` <rect class=\"${rowClass}\" data-row=\"${escapeAttribute(row.id)}\" x=\"${formatNumber(rowBox.x)}\" y=\"${formatNumber(rowBox.y)}\" width=\"${formatNumber(rowBox.width)}\" height=\"${formatNumber(rowBox.height)}\" fill=\"${rowIndex % 2 === 0 ? \"#ffffff\" : \"#f3f4f6\"}\" stroke=\"none\"/>`,\n\t\t);\n\t\tfor (\n\t\t\tlet columnIndex = 0;\n\t\t\tcolumnIndex < table.columns.length;\n\t\t\tcolumnIndex += 1\n\t\t) {\n\t\t\tconst column = table.columns[columnIndex];\n\t\t\tif (column === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cell = row.cells[column.id] ?? { text: \"\" };\n\t\t\tconst cellBox = tableCellBox(\n\t\t\t\ttable,\n\t\t\t\tcolumnIndex,\n\t\t\t\trowIndex + 1,\n\t\t\t\trowHeight,\n\t\t\t\tcolumnCount,\n\t\t\t);\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"table-cell\" data-col=\"${escapeAttribute(column.id)}\" x=\"${formatNumber(cellBox.x)}\" y=\"${formatNumber(cellBox.y)}\" width=\"${formatNumber(cellBox.width)}\" height=\"${formatNumber(cellBox.height)}\" fill=\"${escapeAttribute(cell.style?.fill ?? \"transparent\")}\" stroke=\"${escapeAttribute(cell.style?.stroke ?? STROKE)}\"/>`,\n\t\t\t\t` ${renderEvidenceText(\"table-cell-label\", table.cellLabelLayouts?.[rowIndex]?.[columnIndex]?.lines ?? [cell.text], cellBox)}`,\n\t\t\t);\n\t\t}\n\t\tlines.push(\" </g>\");\n\t}\n\n\tlines.push(\"</g>\");\n\treturn lines;\n}\n\nfunction renderEvidencePanel(panel: CoordinatedEvidencePanel): string[] {\n\tconst titleWidth = Math.min(panel.box.width * 0.36, 140);\n\tconst itemBox = {\n\t\tx: panel.box.x + titleWidth,\n\t\ty: panel.box.y,\n\t\twidth: panel.box.width - titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst titleBox = {\n\t\tx: panel.box.x,\n\t\ty: panel.box.y,\n\t\twidth: titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst itemHeight = panel.box.height / Math.max(1, panel.items.length);\n\tconst lines = [\n\t\t`<g class=\"evidence-panel evidence-panel--${panel.kind}\" data-id=\"${escapeAttribute(panel.id)}\" data-kind=\"${escapeAttribute(panel.kind)}\" data-item-count=\"${panel.items.length}\">`,\n\t\t` <rect class=\"evidence-panel-frame\" x=\"${formatNumber(panel.box.x)}\" y=\"${formatNumber(panel.box.y)}\" width=\"${formatNumber(panel.box.width)}\" height=\"${formatNumber(panel.box.height)}\" fill=\"${escapeAttribute(panel.style?.fill ?? EVIDENCE_PANEL_KIND_FILL[panel.kind])}\" stroke=\"${escapeAttribute(panel.style?.stroke ?? STROKE)}\"/>`,\n\t\t` <g class=\"evidence-panel-title-cell\">`,\n\t\t` <rect class=\"evidence-panel-title-bg\" x=\"${formatNumber(titleBox.x)}\" y=\"${formatNumber(titleBox.y)}\" width=\"${formatNumber(titleBox.width)}\" height=\"${formatNumber(titleBox.height)}\" fill=\"${EVIDENCE_HEADER_FILL}\" stroke=\"${STROKE}\"/>`,\n\t\t` ${renderEvidenceText(\"evidence-panel-title\", panel.titleLayout?.lines ?? [`${panel.kind}: ${panel.id}`], titleBox)}`,\n\t\t\" </g>\",\n\t\t` <g class=\"evidence-panel-items-cell\">`,\n\t\t` <rect class=\"evidence-panel-items-bg\" x=\"${formatNumber(itemBox.x)}\" y=\"${formatNumber(itemBox.y)}\" width=\"${formatNumber(itemBox.width)}\" height=\"${formatNumber(itemBox.height)}\" fill=\"transparent\" stroke=\"${STROKE}\"/>`,\n\t];\n\n\tfor (let index = 0; index < panel.items.length; index += 1) {\n\t\tconst item = panel.items[index];\n\t\tif (item === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst text = panelItemText(item.label.text, item.detail?.text);\n\t\tconst box = {\n\t\t\tx: itemBox.x,\n\t\t\ty: itemBox.y + index * itemHeight,\n\t\t\twidth: itemBox.width,\n\t\t\theight: itemHeight,\n\t\t};\n\t\tlines.push(\n\t\t\t` <rect class=\"evidence-panel-item\" data-item=\"${escapeAttribute(item.id ?? String(index))}\" x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\" fill=\"${escapeAttribute(item.style?.fill ?? \"transparent\")}\" stroke=\"${escapeAttribute(item.style?.stroke ?? \"none\")}\"/>`,\n\t\t\t` ${renderEvidenceText(\"evidence-panel-item-label\", panel.itemLayouts?.[index]?.lines ?? [text], box)}`,\n\t\t);\n\t}\n\n\tlines.push(\" </g>\", \"</g>\");\n\treturn lines;\n}\n\nfunction renderNode(node: CoordinatedNode): string {\n\tconst fill = node.style?.fill ?? NODE_FILL;\n\tconst stroke = node.style?.stroke ?? STROKE;\n\tconst common = `class=\"node node-${node.shape}\" data-id=\"${escapeAttribute(node.id)}\" fill=\"${escapeAttribute(fill)}\" stroke=\"${escapeAttribute(stroke)}\"`;\n\tswitch (node.shape) {\n\t\tcase \"rectangle\":\n\t\t\treturn renderRect(node.box, common);\n\t\tcase \"rounded-rectangle\":\n\t\t\treturn renderRect(node.box, `${common} rx=\"8\" ry=\"8\"`);\n\t\tcase \"ellipse\":\n\t\t\treturn `<ellipse ${common} cx=\"${formatNumber(node.box.x + node.box.width / 2)}\" cy=\"${formatNumber(node.box.y + node.box.height / 2)}\" rx=\"${formatNumber(node.box.width / 2)}\" ry=\"${formatNumber(node.box.height / 2)}\"/>`;\n\t\tcase \"diamond\":\n\t\tcase \"parallelogram\":\n\t\tcase \"hexagon\":\n\t\t\treturn `<polygon ${common} points=\"${formatPoints(shapePoints(node.shape, node.box))}\"/>`;\n\t\tcase \"cylinder\":\n\t\t\treturn `<path ${common} d=\"${formatCylinderPath(node.box)}\"/>`;\n\t}\n}\n\nfunction renderFrame(\n\tframe: CoordinatedFrame,\n\tannotations: readonly SolvedTextAnnotation[],\n): string {\n\tconst stroke = frame.style?.stroke ?? \"#6b7280\";\n\tconst fill = frame.style?.fill ?? \"transparent\";\n\treturn [\n\t\t`<g class=\"sysml-frame\" data-kind=\"${escapeAttribute(frame.kind)}\">`,\n\t\t` <rect class=\"sysml-frame-border\" x=\"${formatNumber(frame.box.x)}\" y=\"${formatNumber(frame.box.y)}\" width=\"${formatNumber(frame.box.width)}\" height=\"${formatNumber(frame.box.height)}\" fill=\"${escapeAttribute(fill)}\" stroke=\"${escapeAttribute(stroke)}\"/>`,\n\t\t` <path class=\"sysml-title-tab\" d=\"M ${formatNumber(frame.titleBox.x)} ${formatNumber(frame.titleBox.y + frame.titleBox.height)} L ${formatNumber(frame.titleBox.x)} ${formatNumber(frame.titleBox.y)} L ${formatNumber(frame.titleBox.x + frame.titleBox.width - 16)} ${formatNumber(frame.titleBox.y)} L ${formatNumber(frame.titleBox.x + frame.titleBox.width)} ${formatNumber(frame.titleBox.y + frame.titleBox.height)} Z\" fill=\"#f3f4f6\" stroke=\"${escapeAttribute(stroke)}\"/>`,\n\t\t...(renderSolvedTextAnnotation(\n\t\t\tfindAnnotation(annotations, \"frame-title\", frame.kind),\n\t\t\t`sysml-title-tab-label`,\n\t\t\t{\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t\tfallbackText: frame.titleTab,\n\t\t\t\tfallbackFontSize: 12,\n\t\t\t},\n\t\t) ?? [\n\t\t\t` <text class=\"sysml-title-tab-label\" x=\"${formatNumber(frame.titleBox.x + 8)}\" y=\"${formatNumber(frame.titleBox.y + frame.titleBox.height / 2)}\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(frame.titleTab)}</text>`,\n\t\t]),\n\t\t\"</g>\",\n\t].join(\"\\n\");\n}\n\nfunction renderSwimlane(\n\tswimlane: Swimlane,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tif (swimlane.box === undefined) {\n\t\treturn [];\n\t}\n\tconst lines = [\n\t\t` <g class=\"swimlane\" data-id=\"${escapeAttribute(swimlane.id)}\">`,\n\t\t` <rect class=\"swimlane-frame\" x=\"${formatNumber(swimlane.box.x)}\" y=\"${formatNumber(swimlane.box.y)}\" width=\"${formatNumber(swimlane.box.width)}\" height=\"${formatNumber(swimlane.box.height)}\" fill=\"#ffffff\" stroke=\"${STROKE}\"/>`,\n\t];\n\tfor (const lane of swimlane.lanes) {\n\t\tif (lane.box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(\n\t\t\t` <rect class=\"swimlane-lane\" data-lane=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.box.x)}\" y=\"${formatNumber(lane.box.y)}\" width=\"${formatNumber(lane.box.width)}\" height=\"${formatNumber(lane.box.height)}\" fill=\"none\" stroke=\"${STROKE}\"/>`,\n\t\t);\n\t\tif (lane.headerBox !== undefined) {\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"swimlane-header\" data-lane-header=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.headerBox.x)}\" y=\"${formatNumber(lane.headerBox.y)}\" width=\"${formatNumber(lane.headerBox.width)}\" height=\"${formatNumber(lane.headerBox.height)}\" fill=\"#f3f4f6\" stroke=\"${STROKE}\"/>`,\n\t\t\t);\n\t\t}\n\t\tif (lane.contentBox !== undefined) {\n\t\t\tlines.push(\n\t\t\t\t` <rect class=\"swimlane-content\" data-lane-content=\"${escapeAttribute(`${swimlane.id}.${lane.id}`)}\" x=\"${formatNumber(lane.contentBox.x)}\" y=\"${formatNumber(lane.contentBox.y)}\" width=\"${formatNumber(lane.contentBox.width)}\" height=\"${formatNumber(lane.contentBox.height)}\" fill=\"none\" stroke=\"none\"/>`,\n\t\t\t);\n\t\t}\n\t\tif (lane.label?.text !== undefined) {\n\t\t\tconst annotation = findAnnotation(\n\t\t\t\tannotations,\n\t\t\t\t\"swimlane-label\",\n\t\t\t\t`${swimlane.id}.${lane.id}`,\n\t\t\t);\n\t\t\tlines.push(\n\t\t\t\t...(annotation === undefined\n\t\t\t\t\t? [\n\t\t\t\t\t\t\trenderSwimlaneLabel(\n\t\t\t\t\t\t\t\tswimlane,\n\t\t\t\t\t\t\t\tlane.label.text,\n\t\t\t\t\t\t\t\tlane.headerBox ?? lane.box,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: (renderSolvedTextAnnotation(annotation, \"swimlane-label\", {\n\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t\trotate: swimlane.orientation === \"horizontal\",\n\t\t\t\t\t\t}) ?? [])),\n\t\t\t);\n\t\t}\n\t}\n\tlines.push(\" </g>\");\n\treturn lines;\n}\n\nfunction renderPorts(\n\tnode: CoordinatedNode,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\treturn (node.ports ?? []).flatMap((port) => [\n\t\t` <rect class=\"port\" data-kind=\"${escapeAttribute(port.kind)}\" data-port=\"${escapeAttribute(`${node.id}.${port.id}`)}\" x=\"${formatNumber(port.box.x)}\" y=\"${formatNumber(port.box.y)}\" width=\"${formatNumber(port.box.width)}\" height=\"${formatNumber(port.box.height)}\" fill=\"${escapeAttribute(port.style?.fill ?? \"#d9ead3\")}\" stroke=\"${escapeAttribute(port.style?.stroke ?? STROKE)}\"/>`,\n\t\t...(port.label?.text === undefined\n\t\t\t? []\n\t\t\t: (() => {\n\t\t\t\t\tconst annotation = findAnnotation(\n\t\t\t\t\t\tannotations,\n\t\t\t\t\t\t\"port-label\",\n\t\t\t\t\t\t`${node.id}.${port.id}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn annotation === undefined\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t` <text class=\"port-label\" data-for=\"${escapeAttribute(`${node.id}.${port.id}`)}\" x=\"${formatNumber(portLabelX(port.anchor.x, port.side))}\" y=\"${formatNumber(port.anchor.y - 8)}\" text-anchor=\"${port.side === \"left\" ? \"end\" : \"start\"}\" font-family=\"${FONT_FAMILY}\" font-size=\"10\" fill=\"#111827\">${escapeXml(port.label.text)}</text>`,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: (renderSolvedTextAnnotation(annotation, \"port-label\", {\n\t\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t\t\ttextAnchor: port.side === \"left\" ? \"end\" : \"start\",\n\t\t\t\t\t\t\t}) ?? []);\n\t\t\t\t})()),\n\t]);\n}\n\nfunction renderCompartments(\n\tnode: CoordinatedNode,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tconst compartments = node.compartments;\n\tif (compartments === undefined) {\n\t\treturn [];\n\t}\n\tconst rows = [\n\t\t...(compartments.stereotype === undefined\n\t\t\t? []\n\t\t\t: [{ className: \"stereotype\", text: compartments.stereotype }]),\n\t\t{\n\t\t\tclassName: \"name\",\n\t\t\ttext: compartments.name ?? node.label?.text ?? node.id,\n\t\t},\n\t\t...(compartments.properties ?? []).map((text) => ({\n\t\t\tclassName: \"properties\",\n\t\t\ttext,\n\t\t})),\n\t\t...(compartments.constraints ?? []).map((text) => ({\n\t\t\tclassName: \"constraints\",\n\t\t\ttext,\n\t\t})),\n\t];\n\tconst lines = [\n\t\t` <g class=\"compartment\" data-for=\"${escapeAttribute(node.id)}\">`,\n\t];\n\tfor (let index = 0; index < rows.length; index += 1) {\n\t\tconst row = rows[index];\n\t\tif (row === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst y = node.box.y + 18 + index * 16;\n\t\tif (index > 1) {\n\t\t\tlines.push(\n\t\t\t\t` <line class=\"compartment-separator\" x1=\"${formatNumber(node.box.x)}\" y1=\"${formatNumber(y - 12)}\" x2=\"${formatNumber(node.box.x + node.box.width)}\" y2=\"${formatNumber(y - 12)}\" stroke=\"${STROKE}\"/>`,\n\t\t\t);\n\t\t}\n\t\tconst annotation = findAnnotation(\n\t\t\tannotations,\n\t\t\t\"compartment-row\",\n\t\t\tnode.id,\n\t\t\tindex,\n\t\t);\n\t\tlines.push(\n\t\t\t...(annotation === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t` <text class=\"compartment-${row.className}\" x=\"${formatNumber(node.box.x + node.box.width / 2)}\" y=\"${formatNumber(y)}\" text-anchor=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"11\" fill=\"#111827\">${escapeXml(row.text)}</text>`,\n\t\t\t\t\t]\n\t\t\t\t: (renderSolvedTextAnnotation(\n\t\t\t\t\t\tannotation,\n\t\t\t\t\t\t`compartment-${row.className}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindent: \" \",\n\t\t\t\t\t\t\tmode: \"center\",\n\t\t\t\t\t\t},\n\t\t\t\t\t) ?? [])),\n\t\t);\n\t}\n\tlines.push(\" </g>\");\n\treturn lines;\n}\n\nfunction tableCellBox(\n\ttable: CoordinatedTableBlock,\n\tcolumnIndex: number,\n\trowIndex: number,\n\trowHeight: number,\n\tcolumnCount: number,\n): Box {\n\tconst x =\n\t\ttable.columnXOffsets[columnIndex] ??\n\t\ttable.box.x + (table.box.width / columnCount) * columnIndex;\n\tconst nextX =\n\t\ttable.columnXOffsets[columnIndex + 1] ?? table.box.x + table.box.width;\n\treturn {\n\t\tx,\n\t\ty: table.box.y + rowIndex * rowHeight,\n\t\twidth: nextX - x,\n\t\theight: rowHeight,\n\t};\n}\n\nfunction renderEvidenceText(\n\tclassName: string,\n\tlines: readonly string[],\n\tbox: Box,\n): string {\n\tconst fontSize = EVIDENCE_TEXT_FONT_SIZE;\n\tconst lineHeight = EVIDENCE_TEXT_LINE_HEIGHT;\n\tconst x = box.x + box.width / 2;\n\n\tif (lines.length <= 1) {\n\t\treturn `<text class=\"${className}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(box.y + box.height / 2)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(fontSize)}\" fill=\"#111827\">${escapeXml(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst totalHeight = (lines.length - 1) * lineHeight;\n\tconst firstBaselineY = box.y + box.height / 2 - totalHeight / 2;\n\treturn [\n\t\t`<text class=\"${className}\" x=\"${formatNumber(x)}\" y=\"${formatNumber(firstBaselineY)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(fontSize)}\" fill=\"#111827\">`,\n\t\t...lines.map(\n\t\t\t(line, index) =>\n\t\t\t\t` <tspan x=\"${formatNumber(x)}\" y=\"${formatNumber(firstBaselineY + index * lineHeight)}\">${escapeXml(line)}</tspan>`,\n\t\t),\n\t\t\"</text>\",\n\t].join(\"\\n\");\n}\n\nfunction panelItemText(label: string, detail: string | undefined): string {\n\treturn detail === undefined ? label : `${label}: ${detail}`;\n}\nfunction renderLabel(\n\tlabel: Label | undefined,\n\tbox: Box,\n\titem: CoordinatedNode | CoordinatedGroup,\n\tannotations: readonly SolvedTextAnnotation[],\n\tsurfaceKind: SolvedTextAnnotation[\"surfaceKind\"],\n): string[] {\n\tconst annotation = findAnnotation(annotations, surfaceKind, item.id);\n\tif (annotation !== undefined) {\n\t\treturn (\n\t\t\trenderSolvedTextAnnotation(annotation, \"label\", {\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t}) ?? []\n\t\t);\n\t}\n\tconst labelLayout = item.labelLayout;\n\tif (labelLayout?.lines !== undefined && labelLayout.lines.length > 0) {\n\t\tconst offset = { x: box.x, y: box.y };\n\t\treturn [\n\t\t\t` <text class=\"label\" data-for=\"${escapeAttribute(item.id)}\" font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(labelLayout.font.fontSize)}\" fill=\"#111827\">`,\n\t\t\t...labelLayout.lines.map(\n\t\t\t\t(line) =>\n\t\t\t\t\t` <tspan x=\"${formatNumber(offset.x + line.box.x)}\" y=\"${formatNumber(offset.y + line.baselineY)}\">${escapeXml(line.text)}</tspan>`,\n\t\t\t),\n\t\t\t\" </text>\",\n\t\t];\n\t}\n\tif (label?.text === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t` <text class=\"label\" data-for=\"${escapeAttribute(item.id)}\" x=\"${formatNumber(box.x + box.width / 2)}\" y=\"${formatNumber(box.y + box.height / 2)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"14\" fill=\"#111827\">${escapeXml(label.text)}</text>`,\n\t];\n}\n\nfunction renderEdgePath(edge: CoordinatedEdge): string | undefined {\n\tif (edge.points.length < 2) {\n\t\treturn undefined;\n\t}\n\tconst dash = edge.style === \"dashed\" ? ' stroke-dasharray=\"6 4\"' : \"\";\n\treturn `<path class=\"edge\" data-id=\"${escapeAttribute(edge.id)}\" d=\"${formatPath(pathPointsBeforeArrowhead(edge.points))}\" fill=\"none\" stroke=\"${EDGE_STROKE}\" stroke-width=\"1.5\"${dash}/>`;\n}\n\nfunction renderEdgeLabel(\n\tedge: CoordinatedEdge,\n\tannotations: readonly SolvedTextAnnotation[],\n): string[] {\n\tif (edge.label?.text === undefined || edge.points.length < 2) {\n\t\treturn [];\n\t}\n\tconst annotation = findAnnotation(annotations, \"edge-label\", edge.id);\n\tif (annotation !== undefined) {\n\t\treturn (\n\t\t\trenderSolvedTextAnnotation(annotation, \"edge-label\", {\n\t\t\t\tindent: \" \",\n\t\t\t\tmode: \"center\",\n\t\t\t}) ?? []\n\t\t);\n\t}\n\tconst placement = labelPlacementOnPolyline(edge.points);\n\tif (placement === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t` <text class=\"edge-label\" data-for=\"${escapeAttribute(edge.id)}\" x=\"${formatNumber(placement.x)}\" y=\"${formatNumber(placement.y)}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(edge.label.text)}</text>`,\n\t];\n}\n\nfunction renderArrowhead(edge: CoordinatedEdge): string {\n\tconst arrowhead = computeArrowhead(edge.points);\n\tconst fill = edge.arrowhead === \"hollowTriangle\" ? \"none\" : EDGE_STROKE;\n\treturn `<polygon class=\"edge-arrowhead\" data-edge=\"${escapeAttribute(edge.id)}\" points=\"${formatPoints([arrowhead.tip, arrowhead.left, arrowhead.right])}\" fill=\"${fill}\" stroke=\"${EDGE_STROKE}\"/>`;\n}\n\nfunction renderSolvedTextAnnotation(\n\tannotation: SolvedTextAnnotation | undefined,\n\tclassName: string,\n\toptions: {\n\t\tindent: string;\n\t\tmode: \"center\" | \"start\";\n\t\ttextAnchor?: string;\n\t\trotate?: boolean;\n\t\tfallbackText?: string;\n\t\tfallbackFontSize?: number;\n\t},\n): string[] | undefined {\n\tif (annotation === undefined) {\n\t\treturn undefined;\n\t}\n\tconst x =\n\t\toptions.mode === \"center\"\n\t\t\t? annotation.box.x + annotation.box.width / 2\n\t\t\t: annotation.box.x;\n\tconst y =\n\t\toptions.mode === \"center\"\n\t\t\t? annotation.box.y + annotation.box.height / 2\n\t\t\t: annotation.box.y + annotation.box.height;\n\tconst rotate = options.rotate\n\t\t? ` transform=\"rotate(-90 ${formatNumber(x)} ${formatNumber(y)})\"`\n\t\t: \"\";\n\tconst attrs = [\n\t\t`class=\"${className}\"`,\n\t\t`data-for=\"${escapeAttribute(annotation.ownerId)}\"`,\n\t\t`data-text-surface=\"${escapeAttribute(annotation.surfaceKind)}\"`,\n\t\t`data-owner-id=\"${escapeAttribute(annotation.ownerId)}\"`,\n\t\t`data-text-backend=\"${escapeAttribute(annotation.textBackend ?? \"deterministic\")}\"`,\n\t\t`font-family=\"${escapeAttribute(annotation.fontFamily)}\"`,\n\t\t`font-size=\"${formatNumber(annotation.fontSize)}\"`,\n\t\t`fill=\"#111827\"`,\n\t];\n\tif (options.mode === \"center\") {\n\t\tattrs.push('text-anchor=\"middle\"');\n\t} else {\n\t\tattrs.push(`text-anchor=\"${options.textAnchor ?? \"start\"}\"`);\n\t}\n\tif (annotation.lines.length > 1) {\n\t\treturn [\n\t\t\t`${options.indent}<text ${attrs.join(\" \")}${rotate}>`,\n\t\t\t...annotation.lines.map(\n\t\t\t\t(line) =>\n\t\t\t\t\t`${options.indent} <tspan x=\"${formatNumber(textLineX(annotation, line, options))}\" y=\"${formatNumber(annotation.box.y + line.baselineY)}\">${escapeXml(line.text)}</tspan>`,\n\t\t\t),\n\t\t\t`${options.indent}</text>`,\n\t\t];\n\t}\n\tconst line = annotation.lines[0];\n\tconst text = line?.text ?? options.fallbackText ?? annotation.text;\n\tconst singleLineAttrs =\n\t\toptions.mode === \"center\"\n\t\t\t? [...attrs, 'dominant-baseline=\"middle\"']\n\t\t\t: attrs;\n\treturn [\n\t\t`${options.indent}<text ${singleLineAttrs.join(\" \")} x=\"${formatNumber(x)}\" y=\"${formatNumber(y)}\"${rotate}>${escapeXml(text)}</text>`,\n\t];\n}\n\nfunction textLineX(\n\tannotation: SolvedTextAnnotation,\n\tline: SolvedTextAnnotation[\"lines\"][number],\n\toptions: {\n\t\tmode: \"center\" | \"start\";\n\t\ttextAnchor?: string;\n\t},\n): number {\n\tif (options.mode === \"center\") {\n\t\treturn annotation.box.x + line.box.x + line.box.width / 2;\n\t}\n\tif ((options.textAnchor ?? \"start\") === \"end\") {\n\t\treturn annotation.box.x + line.box.x + line.box.width;\n\t}\n\treturn annotation.box.x + line.box.x;\n}\n\nfunction findAnnotation(\n\tannotations: readonly SolvedTextAnnotation[],\n\tsurfaceKind: SolvedTextAnnotation[\"surfaceKind\"],\n\townerId: string,\n\tindex?: number,\n): SolvedTextAnnotation | undefined {\n\treturn annotations.find((annotation) => {\n\t\tif (annotation.surfaceKind !== surfaceKind) {\n\t\t\treturn false;\n\t\t}\n\t\tif (annotation.ownerId !== ownerId) {\n\t\t\treturn false;\n\t\t}\n\t\tif (index === undefined) {\n\t\t\treturn annotation.surfaceIndex === undefined;\n\t\t}\n\t\treturn annotation.surfaceIndex === index;\n\t});\n}\n\nfunction renderSwimlaneLabel(\n\tswimlane: Swimlane,\n\ttext: string,\n\tlabelBox: Box,\n): string {\n\tconst x = labelBox.x + labelBox.width / 2;\n\tconst y = labelBox.y + labelBox.height / 2;\n\tconst transform =\n\t\tswimlane.orientation === \"horizontal\"\n\t\t\t? ` transform=\"rotate(-90 ${formatNumber(x)} ${formatNumber(y)})\"`\n\t\t\t: \"\";\n\treturn ` <text class=\"swimlane-label\" x=\"${formatNumber(x)}\" y=\"${formatNumber(y)}\" text-anchor=\"middle\" dominant-baseline=\"middle\"${transform} font-family=\"${FONT_FAMILY}\" font-size=\"12\" fill=\"#111827\">${escapeXml(text)}</text>`;\n}\n\nfunction renderRect(box: Box, attributes: string): string {\n\treturn `<rect ${attributes} x=\"${formatNumber(box.x)}\" y=\"${formatNumber(box.y)}\" width=\"${formatNumber(box.width)}\" height=\"${formatNumber(box.height)}\"/>`;\n}\n\nfunction portLabelX(x: number, side: string): number {\n\tif (side === \"left\") {\n\t\treturn x - 8;\n\t}\n\tif (side === \"right\") {\n\t\treturn x + 8;\n\t}\n\treturn x + 8;\n}\n\nfunction labelPlacementOnPolyline(points: readonly Point[]): Point | undefined {\n\tconst segments = nonZeroSegments(points);\n\tconst totalLength = segments.reduce(\n\t\t(sum, segment) => sum + segment.length,\n\t\t0,\n\t);\n\tif (totalLength <= 0) {\n\t\treturn undefined;\n\t}\n\tlet remaining = totalLength / 2;\n\tfor (const segment of segments) {\n\t\tif (remaining <= segment.length) {\n\t\t\tconst ratio = remaining / segment.length;\n\t\t\tconst x = segment.start.x + (segment.end.x - segment.start.x) * ratio;\n\t\t\tconst y = segment.start.y + (segment.end.y - segment.start.y) * ratio;\n\t\t\tconst offset = labelOffset(segment);\n\t\t\treturn { x: x + offset.x, y: y + offset.y };\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\tconst last = segments.at(-1);\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst offset = labelOffset(last);\n\treturn { x: last.end.x + offset.x, y: last.end.y + offset.y };\n}\n\nfunction nonZeroSegments(points: readonly Point[]): Array<{\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}> {\n\tconst segments: Array<{ start: Point; end: Point; length: number }> = [];\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst length = Math.hypot(end.x - start.x, end.y - start.y);\n\t\tif (length > 0) {\n\t\t\tsegments.push({ start, end, length });\n\t\t}\n\t}\n\treturn segments;\n}\n\nfunction labelOffset(segment: {\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}): Point {\n\tconst offset = 10;\n\tconst dx = segment.end.x - segment.start.x;\n\tconst dy = segment.end.y - segment.start.y;\n\treturn {\n\t\tx: (-dy / segment.length) * offset,\n\t\ty: (dx / segment.length) * offset,\n\t};\n}\n\nfunction pathPointsBeforeArrowhead(points: readonly Point[]): Point[] {\n\tconst arrowhead = computeArrowhead(points);\n\tconst base = {\n\t\tx: (arrowhead.left.x + arrowhead.right.x) / 2,\n\t\ty: (arrowhead.left.y + arrowhead.right.y) / 2,\n\t};\n\treturn [...points.slice(0, -1), base];\n}\n\nfunction shapePoints(\n\tshape: Exclude<\n\t\tNodeShape,\n\t\t\"rectangle\" | \"rounded-rectangle\" | \"ellipse\" | \"cylinder\"\n\t>,\n\tbox: Box,\n): Point[] {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst midX = box.x + box.width / 2;\n\tconst midY = box.y + box.height / 2;\n\tconst skew = Math.min(box.width * 0.2, 24);\n\tswitch (shape) {\n\t\tcase \"diamond\":\n\t\t\treturn [\n\t\t\t\t{ x: midX, y: top },\n\t\t\t\t{ x: right, y: midY },\n\t\t\t\t{ x: midX, y: bottom },\n\t\t\t\t{ x: left, y: midY },\n\t\t\t];\n\t\tcase \"parallelogram\":\n\t\t\treturn [\n\t\t\t\t{ x: left + skew, y: top },\n\t\t\t\t{ x: right, y: top },\n\t\t\t\t{ x: right - skew, y: bottom },\n\t\t\t\t{ x: left, y: bottom },\n\t\t\t];\n\t\tcase \"hexagon\":\n\t\t\treturn [\n\t\t\t\t{ x: left + skew, y: top },\n\t\t\t\t{ x: right - skew, y: top },\n\t\t\t\t{ x: right, y: midY },\n\t\t\t\t{ x: right - skew, y: bottom },\n\t\t\t\t{ x: left + skew, y: bottom },\n\t\t\t\t{ x: left, y: midY },\n\t\t\t];\n\t}\n}\n\nfunction formatCylinderPath(box: Box): string {\n\tconst rx = box.width / 2;\n\tconst ry = Math.min(12, box.height / 4);\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst midX = box.x + rx;\n\treturn [\n\t\t`M ${formatNumber(left)} ${formatNumber(top + ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 1 ${formatNumber(right)} ${formatNumber(top + ry)}`,\n\t\t`L ${formatNumber(right)} ${formatNumber(bottom - ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 1 ${formatNumber(left)} ${formatNumber(bottom - ry)}`,\n\t\t\"Z\",\n\t\t`M ${formatNumber(left)} ${formatNumber(top + ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 0 ${formatNumber(right)} ${formatNumber(top + ry)}`,\n\t\t`M ${formatNumber(left)} ${formatNumber(bottom - ry)}`,\n\t\t`A ${formatNumber(rx)} ${formatNumber(ry)} 0 0 0 ${formatNumber(right)} ${formatNumber(bottom - ry)}`,\n\t\t`M ${formatNumber(midX)} ${formatNumber(top)}`,\n\t].join(\" \");\n}\n\nfunction formatPath(points: readonly Point[]): string {\n\treturn points\n\t\t.map(\n\t\t\t(point, index) =>\n\t\t\t\t`${index === 0 ? \"M\" : \"L\"} ${formatNumber(point.x)} ${formatNumber(point.y)}`,\n\t\t)\n\t\t.join(\" \");\n}\n\nfunction formatPoints(points: readonly Point[]): string {\n\treturn points\n\t\t.map((point) => `${formatNumber(point.x)},${formatNumber(point.y)}`)\n\t\t.join(\" \");\n}\n\nfunction formatBoxViewBox(box: Box): string {\n\treturn `${formatNumber(box.x)} ${formatNumber(box.y)} ${formatNumber(box.width)} ${formatNumber(box.height)}`;\n}\n\nfunction formatNumber(value: number): string {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(\"SVG export requires finite coordinated numbers\");\n\t}\n\treturn Number.isInteger(value)\n\t\t? String(value)\n\t\t: value.toFixed(3).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\nfunction escapeXml(value: string): string {\n\treturn value\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n\treturn escapeXml(value).replaceAll('\"', \""\");\n}\n\nfunction indent(value: string): string {\n\treturn ` ${value}`;\n}\n\nfunction indentLines(values: readonly string[]): string[] {\n\treturn values.map(indent);\n}\n","import type { Box, Insets, Point } from \"../ir/geometry.js\";\n\nexport function normalizeInsets(input: Insets | number = 0): Insets {\n\tif (typeof input === \"number\") {\n\t\tvalidateMargin(input, \"margin\");\n\t\treturn {\n\t\t\ttop: input,\n\t\t\tright: input,\n\t\t\tbottom: input,\n\t\t\tleft: input,\n\t\t};\n\t}\n\n\tvalidateMargin(input.top, \"insets.top\");\n\tvalidateMargin(input.right, \"insets.right\");\n\tvalidateMargin(input.bottom, \"insets.bottom\");\n\tvalidateMargin(input.left, \"insets.left\");\n\n\treturn {\n\t\ttop: input.top,\n\t\tright: input.right,\n\t\tbottom: input.bottom,\n\t\tleft: input.left,\n\t};\n}\n\nexport function validateBox(box: Box, label = \"box\"): void {\n\tvalidateFinite(box.x, `${label}.x`);\n\tvalidateFinite(box.y, `${label}.y`);\n\tvalidateFinite(box.width, `${label}.width`);\n\tvalidateFinite(box.height, `${label}.height`);\n\n\tif (box.width < 0 || box.height < 0) {\n\t\tthrow new TypeError(`${label} dimensions must be non-negative`);\n\t}\n}\n\nexport function boxCenter(box: Box): Point {\n\tvalidateBox(box);\n\n\treturn {\n\t\tx: box.x + box.width / 2,\n\t\ty: box.y + box.height / 2,\n\t};\n}\n\nexport function expandBox(box: Box, margin: number | Insets): Box {\n\tvalidateBox(box);\n\n\tconst insets = normalizeInsets(margin);\n\n\treturn {\n\t\tx: box.x - insets.left,\n\t\ty: box.y - insets.top,\n\t\twidth: box.width + insets.left + insets.right,\n\t\theight: box.height + insets.top + insets.bottom,\n\t};\n}\n\nexport function unionBoxes(boxes: readonly Box[]): Box {\n\tif (boxes.length === 0) {\n\t\tthrow new TypeError(\"Cannot union empty box collection\");\n\t}\n\n\tfor (const [index, box] of boxes.entries()) {\n\t\tvalidateBox(box, `boxes[${index}]`);\n\t}\n\n\tconst minX = Math.min(...boxes.map((box) => box.x));\n\tconst minY = Math.min(...boxes.map((box) => box.y));\n\tconst maxX = Math.max(...boxes.map((box) => box.x + box.width));\n\tconst maxY = Math.max(...boxes.map((box) => box.y + box.height));\n\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY,\n\t};\n}\n\nexport function intersectsAabb(a: Box, b: Box): boolean {\n\tvalidateBox(a, \"a\");\n\tvalidateBox(b, \"b\");\n\n\treturn (\n\t\ta.x <= b.x + b.width &&\n\t\ta.x + a.width >= b.x &&\n\t\ta.y <= b.y + b.height &&\n\t\ta.y + a.height >= b.y\n\t);\n}\n\n/**\n * Area of overlap between two boxes, in square pixels.\n * Returns 0 when the boxes do not intersect.\n */\nexport function overlapArea(first: Box, second: Box): number {\n\tconst x = Math.max(\n\t\t0,\n\t\tMath.min(first.x + first.width, second.x + second.width) -\n\t\t\tMath.max(first.x, second.x),\n\t);\n\tconst y = Math.max(\n\t\t0,\n\t\tMath.min(first.y + first.height, second.y + second.height) -\n\t\t\tMath.max(first.y, second.y),\n\t);\n\treturn x * y;\n}\n\nfunction validateMargin(value: number, label: string): void {\n\tvalidateFinite(value, label);\n\n\tif (value < 0) {\n\t\tthrow new TypeError(`${label} must be non-negative`);\n\t}\n}\n\nfunction validateFinite(value: number, label: string): void {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(`${label} must be finite`);\n\t}\n}\n","import type { Box, Point } from \"../ir/geometry.js\";\nimport { intersectsAabb } from \"./boxes.js\";\n\nexport interface BoxSpatialIndexEntry {\n\tid: string;\n\tbox: Box;\n}\n\nexport interface BoxSpatialIndex {\n\tcellSize: number;\n\tentries: ReadonlyMap<string, Box>;\n\tcells: ReadonlyMap<string, readonly string[]>;\n}\n\nexport function createBoxSpatialIndex(\n\tentries: Iterable<BoxSpatialIndexEntry>,\n\tcellSize = 128,\n): BoxSpatialIndex {\n\tconst normalizedCellSize =\n\t\tNumber.isFinite(cellSize) && cellSize > 0 ? cellSize : 128;\n\tconst boxes = new Map<string, Box>();\n\tconst mutableCells = new Map<string, string[]>();\n\n\tfor (const entry of entries) {\n\t\tboxes.set(entry.id, { ...entry.box });\n\t\tfor (const key of cellKeysForBox(entry.box, normalizedCellSize)) {\n\t\t\tconst ids = mutableCells.get(key) ?? [];\n\t\t\tids.push(entry.id);\n\t\t\tmutableCells.set(key, ids);\n\t\t}\n\t}\n\n\tconst cells = new Map<string, readonly string[]>();\n\tfor (const [key, ids] of mutableCells) {\n\t\tcells.set(key, [...new Set(ids)].sort());\n\t}\n\n\treturn { cellSize: normalizedCellSize, entries: boxes, cells };\n}\n\nexport function queryBoxSpatialIndex(\n\tindex: BoxSpatialIndex,\n\tbox: Box,\n): BoxSpatialIndexEntry[] {\n\tconst ids = new Set<string>();\n\tfor (const key of cellKeysForBox(box, index.cellSize)) {\n\t\tfor (const id of index.cells.get(key) ?? []) {\n\t\t\tids.add(id);\n\t\t}\n\t}\n\n\treturn [...ids].sort().flatMap((id) => {\n\t\tconst candidate = index.entries.get(id);\n\t\treturn candidate !== undefined && intersectsAabb(candidate, box)\n\t\t\t? [{ id, box: candidate }]\n\t\t\t: [];\n\t});\n}\n\nexport function querySegmentSpatialIndex(\n\tindex: BoxSpatialIndex,\n\tstart: Point,\n\tend: Point,\n): BoxSpatialIndexEntry[] {\n\treturn queryBoxSpatialIndex(index, segmentBox(start, end));\n}\n\nexport function expandBoxForQuery(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x - margin,\n\t\ty: box.y - margin,\n\t\twidth: box.width + margin * 2,\n\t\theight: box.height + margin * 2,\n\t};\n}\n\nfunction cellKeysForBox(box: Box, cellSize: number): string[] {\n\tconst minCol = Math.floor(box.x / cellSize);\n\tconst maxCol = Math.floor((box.x + Math.max(1, box.width)) / cellSize);\n\tconst minRow = Math.floor(box.y / cellSize);\n\tconst maxRow = Math.floor((box.y + Math.max(1, box.height)) / cellSize);\n\tconst keys: string[] = [];\n\tfor (let col = minCol; col <= maxCol; col += 1) {\n\t\tfor (let row = minRow; row <= maxRow; row += 1) {\n\t\t\tkeys.push(`${col}:${row}`);\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction segmentBox(start: Point, end: Point): Box {\n\tconst x = Math.min(start.x, end.x);\n\tconst y = Math.min(start.y, end.y);\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth: Math.max(1, Math.abs(start.x - end.x)),\n\t\theight: Math.max(1, Math.abs(start.y - end.y)),\n\t};\n}\n","import { intersectsAabb, overlapArea, validateBox } from \"../geometry/boxes.js\";\nimport {\n\tcreateBoxSpatialIndex,\n\tqueryBoxSpatialIndex,\n} from \"../geometry/spatial-index.js\";\nimport type {\n\tAlignConstraint,\n\tConstraint,\n\tDistributeConstraint,\n\tRelativePositionConstraint,\n} from \"../ir/constraints.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { NormalizedNode } from \"../ir/elements.js\";\nimport type { Box, Insets, Point } from \"../ir/geometry.js\";\nimport type {\n\tConstraintSolverInput,\n\tConstraintSolverResult,\n\tLayoutLock,\n} from \"./types.js\";\n\nexport function applyLayoutConstraints(\n\tinput: ConstraintSolverInput,\n): ConstraintSolverResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = cloneValidBoxes(input.boxes, diagnostics);\n\tconst locks = new Map<string, LayoutLock>();\n\tconst nodeById = new Map(input.nodes.map((node) => [node.id, node]));\n\n\tapplyFixedPositionLocks(input.nodes, boxes, locks, diagnostics);\n\tapplyExactPositions(input.constraints, boxes, locks, diagnostics, nodeById);\n\n\t// When distribution is enabled, drop fixed-position locks early so\n\t// repairOverlaps and containment treat positioned children as\n\t// movable instead of displacing unrelated nodes (Codex P2).\n\t// Only yields locks for children in containment constraints that\n\t// will actually be distributed (2+ eligible children).\n\tif (input.distributeContainedChildren) {\n\t\tyieldFixedPositionLocks(input, boxes, locks);\n\t}\n\n\t// Drop fixed-position locks for non-contract swimlane children\n\t// before overlap repair so they are treated as movable instead\n\t// of emitting stale locked-conflict diagnostics (Issue #61 codex P2).\n\t// Only drop locks when distribution will actually run for the lane —\n\t// i.e. ≥2 children would participate (no-lock or fixed-position;\n\t// exact-position children are reserved, not distributed). Matches the\n\t// participant count in distributeSwimlaneChildren (Codex review P2).\n\tif (\n\t\tinput.swimlanes !== undefined &&\n\t\tinput.swimlanes.length > 0 &&\n\t\tinput.distributeSwimlaneChildren\n\t) {\n\t\tfor (const swimlane of input.swimlanes) {\n\t\t\tif (swimlane.layout === \"contract\") continue;\n\t\t\tfor (const lane of swimlane.lanes) {\n\t\t\t\tconst fixedChildren: string[] = [];\n\t\t\t\tlet participantCount = 0;\n\t\t\t\tfor (const childId of lane.children) {\n\t\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t\tif (lock === undefined) {\n\t\t\t\t\t\tparticipantCount += 1;\n\t\t\t\t\t} else if (lock.source === \"fixed-position\") {\n\t\t\t\t\t\tparticipantCount += 1;\n\t\t\t\t\t\tfixedChildren.push(childId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (participantCount < 2) continue;\n\t\t\t\tfor (const childId of fixedChildren) {\n\t\t\t\t\tlocks.delete(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tapplyContainment(input.constraints, boxes, locks, diagnostics, false);\n\tapplyRelative(input.constraints, boxes, locks, diagnostics);\n\tapplyAlign(input.constraints, boxes, locks, diagnostics);\n\tapplyDistribute(input.constraints, boxes, locks, diagnostics);\n\trepairOverlaps(\n\t\tinput,\n\t\tboxes,\n\t\tlocks,\n\t\tdiagnostics,\n\t\tsiblingOverlapKeys(input.constraints),\n\t);\n\tapplyContainment(input.constraints, boxes, locks, diagnostics, true);\n\tapplyDistributeContained(input, boxes, locks, diagnostics);\n\n\t// After distribution, re-run containment and distribution for\n\t// nested containers whose own children may have been displaced,\n\t// then clean up any remaining loose ends (Codex P2).\n\tif (input.distributeContainedChildren) {\n\t\tconst diagBefore = diagnostics.length;\n\t\tapplyContainment(input.constraints, boxes, locks, diagnostics, true);\n\t\tapplyDistributeContained(input, boxes, locks, diagnostics);\n\t\t// Remove duplicate diagnostics emitted by the re-run on\n\t\t// containers that were already handled in the first pass\n\t\t// (Codex P3: avoid re-emitting distribution diagnostics).\n\t\tdedupReplayDiagnostics(diagnostics, diagBefore);\n\t}\n\n\t// Swimlane distribution (Issue #60): non-contract swimlanes are\n\t// NOT modeled as containment constraints, so distribute children\n\t// inside each lane content box separately. Moved outside\n\t// applyDistributeContained so it runs independently of the\n\t// distributeContainedChildren flag (Issue #61 codex P2).\n\tif (\n\t\tinput.swimlanes !== undefined &&\n\t\tinput.swimlanes.length > 0 &&\n\t\tinput.distributeSwimlaneChildren\n\t) {\n\t\tdistributeSwimlaneChildren(input, boxes, locks, diagnostics);\n\t}\n\n\t// Clean up diagnostics that distribution may have resolved (Codex P2).\n\tremoveResolvedConstraintDiagnostics(input.constraints, boxes, diagnostics);\n\n\treportOverlaps(\n\t\tboxes,\n\t\tdiagnostics,\n\t\tcontainmentOverlapKeys(input.constraints),\n\t\tlocks,\n\t);\n\treportIntraContainerOverflow(input, boxes, diagnostics);\n\n\treturn { boxes, locks, diagnostics };\n}\n\nfunction cloneValidBoxes(\n\tinput: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tconst boxes = new Map<string, Box>();\n\n\tfor (const [id, box] of input) {\n\t\tif (isFiniteBox(box)) {\n\t\t\tboxes.set(id, { ...box });\n\t\t} else {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Box ${id} contains invalid coordinates.`,\n\t\t\t\tpath: [\"boxes\", id],\n\t\t\t\tdetail: { nodeId: id },\n\t\t\t});\n\t\t}\n\t}\n\n\treturn boxes;\n}\n\nfunction applyFixedPositionLocks(\n\tnodes: readonly NormalizedNode[],\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const node of nodes) {\n\t\tif (node.position === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"node\", node.id);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFinitePoint(node.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Fixed position for ${node.id} is invalid.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"position\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, { ...box, x: node.position.x, y: node.position.y });\n\t\tlocks.set(node.id, { nodeId: node.id, source: \"fixed-position\" });\n\t}\n}\n\n/**\n * Remove duplicate diagnostics that the re-run containment/distribution\n * pass may have emitted for containers already handled in the first pass\n * (Codex P3).\n */\nfunction dedupReplayDiagnostics(\n\tdiagnostics: Diagnostic[],\n\tkeepUpTo: number,\n): void {\n\tconst seen = new Set<string>();\n\t// Mark pre-existing diagnostics as seen.\n\tfor (let i = 0; i < keepUpTo && i < diagnostics.length; i += 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\t\tseen.add(diagnosticFingerprint(d));\n\t}\n\t// Remove new duplicates.\n\tfor (let i = diagnostics.length - 1; i >= keepUpTo; i -= 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\t\tconst fp = diagnosticFingerprint(d);\n\t\tif (seen.has(fp)) {\n\t\t\tdiagnostics.splice(i, 1);\n\t\t} else {\n\t\t\tseen.add(fp);\n\t\t}\n\t}\n}\n\n/**\n * Stable fingerprint of a diagnostic for dedup: code + primary node/container.\n */\nfunction diagnosticFingerprint(d: Diagnostic): string {\n\tconst nodeId = typeof d.detail?.nodeId === \"string\" ? d.detail.nodeId : \"\";\n\tconst containerId =\n\t\ttypeof d.detail?.containerId === \"string\" ? d.detail.containerId : \"\";\n\treturn `${d.code}|${nodeId}|${containerId}`;\n}\n\n/**\n * Drop fixed-position locks for children that will be distributed,\n * so downstream passes (repairOverlaps, containment) treat them as\n * movable instead of displacing unrelated nodes (Codex P2).\n *\n * Only yields locks on children inside containment constraints with\n * 2+ eligible children — a single positioned child outside a\n * container is intentionally left locked.\n */\nfunction yieldFixedPositionLocks(\n\tinput: ConstraintSolverInput,\n\tboxes: ReadonlyMap<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n): void {\n\tfor (const c of input.constraints) {\n\t\tif (c.kind !== \"containment\") continue;\n\t\tconst container = boxes.get(c.containerId);\n\t\tif (container === undefined) continue;\n\t\tconst content = contentBox(container, c.padding);\n\t\tconst mainAxis: \"width\" | \"height\" =\n\t\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"width\" : \"height\";\n\t\tconst crossAxis: \"width\" | \"height\" =\n\t\t\tmainAxis === \"width\" ? \"height\" : \"width\";\n\t\t// Count eligible children: unlocked or fixed-position locked,\n\t\t// not oversized (distribution would skip oversized children).\n\t\t// Exact-position locks are reserved and not counted.\n\t\tlet eligible = 0;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst box = boxes.get(childId);\n\t\t\tif (box === undefined) continue;\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock?.source === \"exact-position\") continue;\n\t\t\tconst fits =\n\t\t\t\tbox[mainAxis] <= content[mainAxis] &&\n\t\t\t\tbox[crossAxis] <= content[crossAxis];\n\t\t\tif (fits) {\n\t\t\t\teligible += 1;\n\t\t\t}\n\t\t}\n\t\tif (eligible < 2) continue;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock?.source === \"fixed-position\") {\n\t\t\t\tconst box = boxes.get(childId);\n\t\t\t\tif (box === undefined) continue;\n\t\t\t\tconst fits =\n\t\t\t\t\tbox[mainAxis] <= content[mainAxis] &&\n\t\t\t\t\tbox[crossAxis] <= content[crossAxis];\n\t\t\t\tif (fits) {\n\t\t\t\t\tlocks.delete(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction applyExactPositions(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tnodeById: ReadonlyMap<string, NormalizedNode>,\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"exact-position\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targetId = constraintTargetId(constraint);\n\t\tif (targetId === undefined || !nodeById.has(targetId)) {\n\t\t\tmissingReference(diagnostics, \"target\", targetId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst box = boxes.get(targetId);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"box\", targetId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFinitePoint(constraint.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.position.invalid\",\n\t\t\t\tmessage: `Exact position for ${targetId} is invalid.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? targetId, \"position\"],\n\t\t\t\tdetail: { nodeId: targetId },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst existingLock = locks.get(targetId);\n\t\tif (\n\t\t\texistingLock !== undefined &&\n\t\t\t(box.x !== constraint.position.x || box.y !== constraint.position.y)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"constraints.conflict.exact-position\",\n\t\t\t\tmessage: `Exact position conflicts with existing lock for ${targetId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? targetId],\n\t\t\t\tdetail: { nodeId: targetId, source: existingLock.source },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(targetId, {\n\t\t\t...box,\n\t\t\tx: constraint.position.x,\n\t\t\ty: constraint.position.y,\n\t\t});\n\t\tlocks.set(targetId, { nodeId: targetId, source: \"exact-position\" });\n\t}\n}\n\nfunction applyContainment(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\treportOverflow: boolean,\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tmissingReference(diagnostics, \"container\", constraint.containerId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst content = contentBox(container, constraint.padding);\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst child = boxes.get(childId);\n\t\t\tif (child === undefined) {\n\t\t\t\tmissingReference(diagnostics, \"child\", childId);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst next = moveInside(child, content);\n\t\t\tif (samePosition(child, next)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst lock = locks.get(childId);\n\t\t\tif (lock !== undefined) {\n\t\t\t\tif (!reportOverflow) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\t\tmessage: `Locked child ${childId} was not moved into containment.`,\n\t\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tnodeId: childId,\n\t\t\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\t\t\tlockSource: lock.source,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (!isInside(child, content)) {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\t\t\t\tmessage: `Locked child ${childId} cannot fit inside ${constraint.containerId}.`,\n\t\t\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (next.width > content.width || next.height > content.height) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\t\tmessage: `Child ${childId} cannot fit inside ${constraint.containerId}.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tboxes.set(childId, next);\n\t\t\tif (reportOverflow) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"containment_overflow\",\n\t\t\t\t\tmessage: `Child ${childId} was clamped back inside ${constraint.containerId} after constraint solving.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction applyRelative(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"relative-position\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst source = boxes.get(constraint.sourceId);\n\t\tconst reference = boxes.get(constraint.referenceId);\n\t\tif (source === undefined) {\n\t\t\tmissingReference(diagnostics, \"source\", constraint.sourceId);\n\t\t\tcontinue;\n\t\t}\n\t\tif (reference === undefined) {\n\t\t\tmissingReference(diagnostics, \"reference\", constraint.referenceId);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst next = relativeBox(source, reference, constraint);\n\t\tsetUnlockedBox(\n\t\t\tconstraint.sourceId,\n\t\t\tnext,\n\t\t\tboxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tconstraint,\n\t\t);\n\t}\n}\n\nfunction applyAlign(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"align\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targets = collectTargets(constraint.targetIds, boxes, diagnostics);\n\t\tconst anchor = targets[0];\n\t\tif (anchor === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = alignmentValue(anchor.box, constraint.axis);\n\t\tfor (const { id, box } of targets.slice(1)) {\n\t\t\tconst next = alignBox(box, constraint.axis, value);\n\t\t\tsetUnlockedBox(id, next, boxes, locks, diagnostics, constraint);\n\t\t}\n\t}\n}\n\nfunction applyDistribute(\n\tconstraints: readonly Constraint[],\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"distribute\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targets = collectTargets(\n\t\t\tconstraint.targetIds,\n\t\t\tboxes,\n\t\t\tdiagnostics,\n\t\t).sort((a, b) => {\n\t\t\tconst delta =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? a.box.x - b.box.x\n\t\t\t\t\t: a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.id.localeCompare(b.id) : delta;\n\t\t});\n\t\tif (targets.length < 3) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst first = targets[0];\n\t\tconst last = targets[targets.length - 1];\n\t\tif (first === undefined || last === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst spacing =\n\t\t\tconstraint.spacing ??\n\t\t\t(distributionStart(last.box, constraint.axis) -\n\t\t\t\tdistributionStart(first.box, constraint.axis)) /\n\t\t\t\t(targets.length - 1);\n\n\t\tfor (const [index, target] of targets.slice(1, -1).entries()) {\n\t\t\tconst nextStart =\n\t\t\t\tdistributionStart(first.box, constraint.axis) + spacing * (index + 1);\n\t\t\tconst next =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? { ...target.box, x: nextStart }\n\t\t\t\t\t: { ...target.box, y: nextStart };\n\t\t\tsetUnlockedBox(target.id, next, boxes, locks, diagnostics, constraint);\n\t\t}\n\t}\n}\n\nfunction repairOverlaps(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tsiblingPairs: ReadonlySet<string>,\n): void {\n\tconst spacing = input.overlapSpacing ?? 40;\n\tconst axis = input.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\tconst secondaryAxis = axis === \"x\" ? \"y\" : \"x\";\n\tconst ignoredPairs = containmentOverlapKeys(input.constraints);\n\tconst ids = [...boxes.keys()].sort();\n\n\tconst index = createBoxSpatialIndex(\n\t\tids.flatMap((id) => {\n\t\t\tconst box = boxes.get(id);\n\t\t\treturn box === undefined ? [] : [{ id, box }];\n\t\t}),\n\t\tspacing,\n\t);\n\tfor (let pass = 0; pass < 2; pass += 1) {\n\t\tfor (const firstId of ids) {\n\t\t\tconst first = boxes.get(firstId);\n\t\t\tif (first === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidateIds = queryBoxSpatialIndex(index, first)\n\t\t\t\t.map((candidate) => candidate.id)\n\t\t\t\t.filter((id) => id > firstId)\n\t\t\t\t.sort();\n\t\t\tfor (const secondId of candidateIds) {\n\t\t\t\tif (firstId >= secondId) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (ignoredPairs.has(overlapKey(firstId, secondId))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst second = boxes.get(secondId);\n\t\t\t\tif (second === undefined || !intersectsAabb(first, second)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst firstLocked = locks.has(firstId);\n\t\t\t\tconst secondLocked = locks.has(secondId);\n\t\t\t\tif (firstLocked && secondLocked) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst movingId = firstLocked\n\t\t\t\t\t? secondId\n\t\t\t\t\t: secondLocked\n\t\t\t\t\t\t? firstId\n\t\t\t\t\t\t: secondId;\n\t\t\t\tconst moving = movingId === firstId ? first : second;\n\t\t\t\tconst fixed = movingId === firstId ? second : first;\n\t\t\t\tconst repairAxis =\n\t\t\t\t\tfirstLocked === secondLocked && pass === 0 ? secondaryAxis : axis;\n\t\t\t\tconst pairKey = overlapKey(firstId, secondId);\n\t\t\t\tconst effectiveSpacing = siblingPairs.has(pairKey)\n\t\t\t\t\t? Math.max(spacing, input.minSiblingGap ?? 0)\n\t\t\t\t\t: spacing;\n\t\t\t\tconst moved = movePastOverlap(\n\t\t\t\t\tmoving,\n\t\t\t\t\tfixed,\n\t\t\t\t\trepairAxis,\n\t\t\t\t\teffectiveSpacing,\n\t\t\t\t);\n\t\t\t\tboxes.set(movingId, moved);\n\t\t\t}\n\t\t}\n\t}\n\n\treportOverlaps(boxes, diagnostics, ignoredPairs, locks);\n}\n\nfunction removeResolvedConstraintDiagnostics(\n\tconstraints: readonly Constraint[],\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): void {\n\t// Remove diagnostics for issues that distribution or a later\n\t// containment pass may have resolved (Codex P2).\n\tfor (let i = diagnostics.length - 1; i >= 0; i -= 1) {\n\t\tconst d = diagnostics[i];\n\t\tif (d === undefined) continue;\n\n\t\t// ---- stale overlap warnings ----\n\t\tif (d.code === \"constraints.overlap.unresolved\") {\n\t\t\tconst aId = d.detail?.firstId;\n\t\t\tconst bId = d.detail?.secondId;\n\t\t\tif (typeof aId !== \"string\" || typeof bId !== \"string\") continue;\n\t\t\tconst a = boxes.get(aId);\n\t\t\tconst b = boxes.get(bId);\n\t\t\tif (a !== undefined && b !== undefined && !intersectsAabb(a, b)) {\n\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// ---- stale containment warnings (from applyContainment,\n\t\t// not from applyDistributeContained) ----\n\t\tif (\n\t\t\td.code === \"constraints.containment.impossible\" ||\n\t\t\t(d.code === \"constraints.locked-target-not-moved\" &&\n\t\t\t\ttypeof d.message === \"string\" &&\n\t\t\t\td.message.includes(\"not moved into containment\"))\n\t\t) {\n\t\t\tconst nodeId = d.detail?.nodeId;\n\t\t\tif (typeof nodeId !== \"string\") continue;\n\t\t\tconst child = boxes.get(nodeId);\n\t\t\tif (child === undefined) continue;\n\t\t\t// Extract the specific container that emitted this\n\t\t\t// diagnostic so we only clear it when THAT container\n\t\t\t// is satisfied (Codex P2: multi-container case).\n\t\t\tconst diagContainerId =\n\t\t\t\ttypeof d.detail?.containerId === \"string\"\n\t\t\t\t\t? d.detail.containerId\n\t\t\t\t\t: undefined;\n\t\t\tlet resolved = false;\n\t\t\tfor (const c of constraints) {\n\t\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t\tif (!c.childIds.includes(nodeId)) continue;\n\t\t\t\t// If we know which container emitted the diagnostic,\n\t\t\t\t// only match against that one.\n\t\t\t\tif (\n\t\t\t\t\tdiagContainerId !== undefined &&\n\t\t\t\t\tc.containerId !== diagContainerId\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst container = boxes.get(c.containerId);\n\t\t\t\tif (container === undefined) continue;\n\t\t\t\tconst content = contentBox(container, c.padding);\n\t\t\t\tif (isInside(child, content)) {\n\t\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t\t\tresolved = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// If we matched a specific container and it wasn't\n\t\t\t// satisfied, keep searching for the right one.\n\t\t\tif (!resolved && diagContainerId !== undefined) {\n\t\t\t\tfor (const c of constraints) {\n\t\t\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t\t\tif (c.containerId !== diagContainerId) continue;\n\t\t\t\t\tif (!c.childIds.includes(nodeId)) continue;\n\t\t\t\t\tconst container = boxes.get(c.containerId);\n\t\t\t\t\tif (container === undefined) continue;\n\t\t\t\t\tconst content = contentBox(container, c.padding);\n\t\t\t\t\tif (isInside(child, content)) {\n\t\t\t\t\t\tdiagnostics.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOverlaps(\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n\tignoredPairs: ReadonlySet<string> = new Set(),\n\tlocks: ReadonlyMap<string, LayoutLock> = new Map(),\n): void {\n\tconst ids = [...boxes.keys()].sort();\n\tconst reported = new Set(\n\t\tdiagnostics\n\t\t\t.filter(\n\t\t\t\t(diagnostic) =>\n\t\t\t\t\tdiagnostic.code === \"constraints.overlap.unresolved\" ||\n\t\t\t\t\tdiagnostic.code === \"constraints.overlap.locked-conflict\",\n\t\t\t)\n\t\t\t.map((diagnostic) => {\n\t\t\t\tconst firstId = diagnostic.detail?.firstId;\n\t\t\t\tconst secondId = diagnostic.detail?.secondId;\n\t\t\t\treturn typeof firstId === \"string\" && typeof secondId === \"string\"\n\t\t\t\t\t? overlapKey(firstId, secondId)\n\t\t\t\t\t: undefined;\n\t\t\t})\n\t\t\t.filter((key): key is string => key !== undefined),\n\t);\n\tconst index = createBoxSpatialIndex(\n\t\tids.flatMap((id) => {\n\t\t\tconst box = boxes.get(id);\n\t\t\treturn box === undefined ? [] : [{ id, box }];\n\t\t}),\n\t\t40,\n\t);\n\n\tfor (const firstId of ids) {\n\t\tconst first = boxes.get(firstId);\n\t\tif (first === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst candidateIds = queryBoxSpatialIndex(index, first)\n\t\t\t.map((candidate) => candidate.id)\n\t\t\t.filter((id) => id > firstId)\n\t\t\t.sort();\n\t\tfor (const secondId of candidateIds) {\n\t\t\tconst key = overlapKey(firstId, secondId);\n\t\t\tif (reported.has(key) || ignoredPairs.has(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst second = boxes.get(secondId);\n\t\t\tif (second !== undefined && intersectsAabb(first, second)) {\n\t\t\t\tconst firstLock = locks.get(firstId);\n\t\t\t\tconst secondLock = locks.get(secondId);\n\t\t\t\tif (firstLock !== undefined && secondLock !== undefined) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tcode: \"constraints.overlap.locked-conflict\",\n\t\t\t\t\t\tmessage: `Locked boxes ${firstId} (${firstLock.source}) and ${secondId} (${secondLock.source}) overlap and cannot be repaired.`,\n\t\t\t\t\t\tpath: [\"boxes\"],\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tfirstId,\n\t\t\t\t\t\t\tsecondId,\n\t\t\t\t\t\t\tfirstLockSource: firstLock.source,\n\t\t\t\t\t\t\tsecondLockSource: secondLock.source,\n\t\t\t\t\t\t\toverlapArea: overlapArea(first, second),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\treported.add(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\t\tmessage: `Boxes ${firstId} and ${secondId} still overlap after stable sorted primary axis repair with configured spacing.`,\n\t\t\t\t\tpath: [\"boxes\"],\n\t\t\t\t\tdetail: { firstId, secondId },\n\t\t\t\t});\n\t\t\t\treported.add(key);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportIntraContainerOverflow(\n\tinput: ConstraintSolverInput,\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (input.minSiblingGap === undefined) {\n\t\treturn;\n\t}\n\tconst minGap = input.minSiblingGap;\n\tconst axis: \"x\" | \"y\" =\n\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\n\tfor (const constraint of input.constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst children: Box[] = [];\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst child = boxes.get(childId);\n\t\t\tif (child !== undefined) {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\t\t}\n\t\tif (children.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Sort by main-axis position so pair-check can break early.\n\t\tconst sorted = [...children].sort((a, b) => a[axis] - b[axis]);\n\t\tconst mainDim = axis === \"x\" ? \"width\" : \"height\";\n\t\tlet overlapPairs = 0;\n\t\tfor (let i = 0; i < sorted.length; i += 1) {\n\t\t\tconst first = sorted[i];\n\t\t\tif (first === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (let j = i + 1; j < sorted.length; j += 1) {\n\t\t\t\tconst second = sorted[j];\n\t\t\t\tif (second === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Children are sorted by main-axis position; if second starts\n\t\t\t\t// beyond first's far edge it cannot overlap first (or any\n\t\t\t\t// earlier child), so we can break the inner loop.\n\t\t\t\tif (second[axis] >= first[axis] + first[mainDim]) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (intersectsAabb(first, second)) {\n\t\t\t\t\toverlapPairs += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (overlapPairs > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"intra_container_overflow\",\n\t\t\t\tmessage: `${overlapPairs} sibling pair(s) overlap inside ${constraint.containerId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\toverlapPairs,\n\t\t\t\t\tminGap,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Compute content size inline to avoid allocating a full Box.\n\t\tconst pad = constraint.padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\t\tconst contentMain =\n\t\t\tmainDim === \"width\"\n\t\t\t\t? Math.max(0, container.width - pad.left - pad.right)\n\t\t\t\t: Math.max(0, container.height - pad.top - pad.bottom);\n\t\t// Use actual spatial extent rather than sequential-stack\n\t\t// estimate. Children may be laid out along the cross-axis,\n\t\t// making the sequential sum too pessimistic.\n\t\tlet childStart = Infinity;\n\t\tlet childEnd = -Infinity;\n\t\tfor (const child of sorted) {\n\t\t\tconst start = child[axis];\n\t\t\tconst end = start + child[mainDim];\n\t\t\tif (start < childStart) childStart = start;\n\t\t\tif (end > childEnd) childEnd = end;\n\t\t}\n\t\tif (sorted.length === 0) {\n\t\t\tchildStart = 0;\n\t\t\tchildEnd = 0;\n\t\t}\n\t\tconst actualExtent = childEnd - childStart;\n\t\tif (actualExtent > contentMain) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"intra_container_overflow_total\",\n\t\t\t\tmessage: `Container ${constraint.containerId} cannot fit ${sorted.length} siblings along ${axis} (extent ${actualExtent}, available ${contentMain}).`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\taxis,\n\t\t\t\t\tneeded: actualExtent,\n\t\t\t\t\tavailable: contentMain,\n\t\t\t\t\tsiblingCount: sorted.length,\n\t\t\t\t\tminGap,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction overlapKey(firstId: string, secondId: string): string {\n\treturn firstId < secondId\n\t\t? `${firstId}\\0${secondId}`\n\t\t: `${secondId}\\0${firstId}`;\n}\n\nfunction containmentOverlapKeys(\n\tconstraints: readonly Constraint[],\n): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tkeys.add(overlapKey(constraint.containerId, childId));\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction siblingOverlapKeys(constraints: readonly Constraint[]): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const constraint of constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst { childIds } = constraint;\n\t\tfor (let i = 0; i < childIds.length; i += 1) {\n\t\t\tfor (let j = i + 1; j < childIds.length; j += 1) {\n\t\t\t\tconst a = childIds[i];\n\t\t\t\tconst b = childIds[j];\n\t\t\t\tif (a === undefined || b === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tkeys.add(overlapKey(a, b));\n\t\t\t}\n\t\t}\n\t}\n\treturn keys;\n}\n\nfunction setUnlockedBox(\n\tid: string,\n\tnext: Box,\n\tboxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n\tconstraint: Constraint,\n): void {\n\tconst current = boxes.get(id);\n\tif (current === undefined) {\n\t\tmissingReference(diagnostics, \"target\", id);\n\t\treturn;\n\t}\n\n\tif (!isFiniteBox(next)) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"constraints.position.invalid\",\n\t\t\tmessage: `Constraint produced an invalid position for ${id}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? id],\n\t\t\tdetail: { nodeId: id },\n\t\t});\n\t\treturn;\n\t}\n\n\tif (locks.has(id) && !samePosition(current, next)) {\n\t\tconst lock = locks.get(id);\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\tmessage: `Locked target ${id} was not moved by ${constraint.kind}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? id],\n\t\t\tdetail: {\n\t\t\t\tnodeId: id,\n\t\t\t\tconstraintKind: constraint.kind,\n\t\t\t\t...(lock === undefined ? {} : { lockSource: lock.source }),\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tboxes.set(id, next);\n}\n\nfunction constraintTargetId(\n\tconstraint: Extract<Constraint, { kind: \"exact-position\" }>,\n): string | undefined {\n\treturn constraint.targetId ?? constraint.target?.id;\n}\n\nfunction collectTargets(\n\tids: readonly string[],\n\tboxes: ReadonlyMap<string, Box>,\n\tdiagnostics: Diagnostic[],\n): { id: string; box: Box }[] {\n\tconst targets: { id: string; box: Box }[] = [];\n\tfor (const id of ids) {\n\t\tconst box = boxes.get(id);\n\t\tif (box === undefined) {\n\t\t\tmissingReference(diagnostics, \"target\", id);\n\t\t} else {\n\t\t\ttargets.push({ id, box });\n\t\t}\n\t}\n\treturn targets;\n}\n\nfunction relativeBox(\n\tsource: Box,\n\treference: Box,\n\tconstraint: RelativePositionConstraint,\n): Box {\n\tconst offset = constraint.offset ?? { x: 0, y: 0 };\n\tswitch (constraint.relation) {\n\t\tcase \"above\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y - source.height + offset.y,\n\t\t\t};\n\t\tcase \"right-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + reference.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t\tcase \"below\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y + reference.height + offset.y,\n\t\t\t};\n\t\tcase \"left-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x - source.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t}\n}\n\nfunction alignmentValue(box: Box, axis: AlignConstraint[\"axis\"]): number {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn box.x;\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn box.y;\n\t\tcase \"center-x\":\n\t\t\treturn box.x + box.width / 2;\n\t\tcase \"center-y\":\n\t\t\treturn box.y + box.height / 2;\n\t\tcase \"right\":\n\t\t\treturn box.x + box.width;\n\t\tcase \"bottom\":\n\t\t\treturn box.y + box.height;\n\t}\n}\n\nfunction alignBox(box: Box, axis: AlignConstraint[\"axis\"], value: number): Box {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn { ...box, x: value };\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn { ...box, y: value };\n\t\tcase \"center-x\":\n\t\t\treturn { ...box, x: value - box.width / 2 };\n\t\tcase \"center-y\":\n\t\t\treturn { ...box, y: value - box.height / 2 };\n\t\tcase \"right\":\n\t\t\treturn { ...box, x: value - box.width };\n\t\tcase \"bottom\":\n\t\t\treturn { ...box, y: value - box.height };\n\t}\n}\n\nfunction distributionStart(\n\tbox: Box,\n\taxis: DistributeConstraint[\"axis\"],\n): number {\n\treturn axis === \"horizontal\" ? box.x : box.y;\n}\n\nfunction contentBox(container: Box, padding: Insets | undefined): Box {\n\tconst margin = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\tx: container.x + margin.left,\n\t\ty: container.y + margin.top,\n\t\twidth: Math.max(0, container.width - margin.left - margin.right),\n\t\theight: Math.max(0, container.height - margin.top - margin.bottom),\n\t};\n}\n\ntype ReservedInterval = { start: number; end: number };\n\nfunction applyDistributeContained(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (!input.distributeContainedChildren) {\n\t\treturn;\n\t}\n\n\tconst axis: \"x\" | \"y\" =\n\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\tconst crossAxis = axis === \"x\" ? \"y\" : \"x\";\n\tconst mainSize = axis === \"x\" ? \"width\" : \"height\";\n\tconst crossSize = axis === \"x\" ? \"height\" : \"width\";\n\t// Default to a positive gap so distributed children are\n\t// visually separated even when minSiblingGap is not set.\n\tconst minGap = input.minSiblingGap ?? 8;\n\n\tfor (const constraint of input.constraints) {\n\t\tif (constraint.kind !== \"containment\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst container = boxes.get(constraint.containerId);\n\t\tif (container === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst content = contentBox(container, constraint.padding);\n\t\tconst unlocked: { id: string; box: Box }[] = [];\n\t\tconst reserved: ReservedInterval[] = [];\n\t\tfor (const childId of constraint.childIds) {\n\t\t\tconst box = boxes.get(childId);\n\t\t\tif (box === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (locks.has(childId)) {\n\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t// When distribution is explicitly requested, a fixed-position\n\t\t\t\t// lock (from the node's `position` field) yields to the\n\t\t\t\t// distributor so the caller's distributeContainedChildren\n\t\t\t\t// option actually takes effect (#37). Explicit exact-position\n\t\t\t\t// constraints still win and are reserved.\n\t\t\t\tif (lock?.source === \"fixed-position\") {\n\t\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\tmessage: `Locked child ${childId} skipped during containment distribution.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: childId },\n\t\t\t\t});\n\t\t\t\treserved.push(intervalForBox(box, axis, mainSize));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tunlocked.push({ id: childId, box });\n\t\t}\n\t\tif (unlocked.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip children that are already larger than the content area;\n\t\t// applyContainment already diagnoses these and moving them is futile.\n\t\tconst oversized = unlocked.filter(\n\t\t\t(child) =>\n\t\t\t\tchild.box[mainSize] > content[mainSize] ||\n\t\t\t\tchild.box[crossSize] > content[crossSize],\n\t\t);\n\t\tif (oversized.length > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.containment.impossible\",\n\t\t\t\tmessage: `Skipped ${oversized.length} oversized child(ren) during distribution in ${constraint.containerId}.`,\n\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\tdetail: {\n\t\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\t\toversized: oversized.map((c) => c.id),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tfor (const child of oversized) {\n\t\t\treserved.push(intervalForBox(child.box, axis, mainSize));\n\t\t}\n\t\treserved.sort((a, b) => a.start - b.start || a.end - b.end);\n\t\tconst distributable = unlocked.filter(\n\t\t\t(child) =>\n\t\t\t\tchild.box[mainSize] <= content[mainSize] &&\n\t\t\t\tchild.box[crossSize] <= content[crossSize],\n\t\t);\n\t\tif (distributable.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Distribute along the main axis within the content box.\n\t\t// When spread mode is requested, distribute children across\n\t\t// the full content area instead of stacking at one end (#49).\n\t\tconst spread = typeof input.distributeContainedChildren === \"string\";\n\t\tlet effectiveGap = minGap;\n\t\tlet pos = content[axis];\n\t\tif (spread) {\n\t\t\tlet totalChildSpan = 0;\n\t\t\tfor (const child of distributable) {\n\t\t\t\ttotalChildSpan += child.box[mainSize];\n\t\t\t}\n\t\t\t// Subtract reserved intervals and their required gaps so\n\t\t\t// the spread gap is computed from actually usable space\n\t\t\t// (Codex P2: advancePastReserved needs minGap around reserved).\n\t\t\tlet reservedSpan = 0;\n\t\t\tconst contentEnd = content[axis] + content[mainSize];\n\t\t\tfor (const r of reserved) {\n\t\t\t\tconst rStart = Math.max(r.start, content[axis]);\n\t\t\t\tconst rEnd = Math.min(r.end, contentEnd);\n\t\t\t\tif (rEnd > rStart) {\n\t\t\t\t\treservedSpan += rEnd - rStart + minGap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst remaining =\n\t\t\t\tcontent[mainSize] -\n\t\t\t\ttotalChildSpan -\n\t\t\t\treservedSpan -\n\t\t\t\tminGap * (distributable.length - 1);\n\t\t\tif (remaining > 0) {\n\t\t\t\teffectiveGap = minGap + remaining / (distributable.length - 1);\n\t\t\t}\n\t\t}\n\t\tfor (const child of distributable) {\n\t\t\tpos = advancePastReserved(pos, child.box[mainSize], reserved, minGap);\n\t\t\tconst crossPos =\n\t\t\t\tcontent[crossAxis] +\n\t\t\t\tMath.max(0, (content[crossSize] - child.box[crossSize]) / 2);\n\t\t\tconst next: Box = { ...child.box };\n\t\t\tnext[axis] = pos;\n\t\t\tnext[crossAxis] = crossPos;\n\t\t\tconst clamped = moveInside(next, content);\n\t\t\t// Report when clamping squashed the requested spacing.\n\t\t\tif (clamped[axis] !== next[axis]) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"intra_container_distributed_clamped\",\n\t\t\t\t\tmessage: `Distribution gap clamped for ${child.id} in ${constraint.containerId}.`,\n\t\t\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\t\t\tdetail: { nodeId: child.id, containerId: constraint.containerId },\n\t\t\t\t});\n\t\t\t}\n\t\t\tboxes.set(child.id, clamped);\n\t\t\t// Fixed-position locks only yield once distribution succeeds.\n\t\t\tlocks.delete(child.id);\n\t\t\tpos = clamped[axis] + clamped[mainSize] + effectiveGap;\n\t\t}\n\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"intra_container_distributed\",\n\t\t\tmessage: `Distributed ${distributable.length} children in ${constraint.containerId} along ${axis}.`,\n\t\t\tpath: [\"constraints\", constraint.id ?? constraint.containerId],\n\t\t\tdetail: {\n\t\t\t\tcontainerId: constraint.containerId,\n\t\t\t\tcount: distributable.length,\n\t\t\t\taxis,\n\t\t\t},\n\t\t});\n\t}\n}\n\n/**\n * Distribute children of non-contract swimlanes inside their lane\n * content box (Issue #60). Similar to applyDistributeContained but\n * operates on swimlane lanes instead of containment constraints.\n */\nfunction distributeSwimlaneChildren(\n\tinput: ConstraintSolverInput,\n\tboxes: Map<string, Box>,\n\tlocks: Map<string, LayoutLock>,\n\tdiagnostics: Diagnostic[],\n): void {\n\tconst spread = input.distributeSwimlaneChildren === \"spread\";\n\tconst minGap = input.minSiblingGap ?? 8;\n\n\tfor (const swimlane of input.swimlanes!) {\n\t\tif (swimlane.layout === \"contract\") continue;\n\t\tconst isVertical = swimlane.orientation !== \"horizontal\";\n\t\tconst axis = isVertical ? (\"x\" as const) : (\"y\" as const);\n\t\tconst mainSize = isVertical ? (\"width\" as const) : (\"height\" as const);\n\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (lane.children.length < 2) continue;\n\n\t\t\tconst unlocked: { id: string; box: Box }[] = [];\n\t\t\tconst reserved: ReservedInterval[] = [];\n\n\t\t\tfor (const childId of lane.children) {\n\t\t\t\tconst box = boxes.get(childId);\n\t\t\t\tif (box === undefined) continue;\n\t\t\t\tif (locks.has(childId)) {\n\t\t\t\t\tconst lock = locks.get(childId)!;\n\t\t\t\t\tif (lock.source === \"fixed-position\") {\n\t\t\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treserved.push(intervalForBox(box, axis, mainSize));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tunlocked.push({ id: childId, box });\n\t\t\t}\n\n\t\t\tif (unlocked.length < 2) continue;\n\n\t\t\tconst contentStart = isVertical\n\t\t\t\t? Math.min(...unlocked.map((c) => c.box.x))\n\t\t\t\t: Math.min(...unlocked.map((c) => c.box.y));\n\t\t\tconst contentEnd = isVertical\n\t\t\t\t? Math.max(...unlocked.map((c) => c.box.x + c.box.width))\n\t\t\t\t: Math.max(...unlocked.map((c) => c.box.y + c.box.height));\n\t\t\tconst contentSpan = contentEnd - contentStart;\n\n\t\t\tconst totalChildSpan = unlocked.reduce((s, c) => s + c.box[mainSize], 0);\n\t\t\tconst reservedSpan = reserved.reduce((s, r) => s + (r.end - r.start), 0);\n\t\t\tlet effectiveGap = minGap;\n\t\t\tconst remaining =\n\t\t\t\tcontentSpan -\n\t\t\t\ttotalChildSpan -\n\t\t\t\treservedSpan -\n\t\t\t\tminGap * (unlocked.length - 1);\n\t\t\tif (spread && remaining > 0) {\n\t\t\t\teffectiveGap = minGap + remaining / (unlocked.length - 1);\n\t\t\t}\n\n\t\t\tunlocked.sort((a, b) => a.box[axis] - b.box[axis]);\n\n\t\t\treserved.sort((a, b) => a.start - b.start);\n\t\t\tlet pos = contentStart;\n\t\t\tfor (const child of unlocked) {\n\t\t\t\tpos = advancePastReserved(pos, child.box[mainSize], reserved, minGap);\n\t\t\t\tconst newBox = { ...child.box };\n\t\t\t\tif (axis === \"x\") {\n\t\t\t\t\tnewBox.x = pos;\n\t\t\t\t} else {\n\t\t\t\t\tnewBox.y = pos;\n\t\t\t\t}\n\t\t\t\tboxes.set(child.id, newBox);\n\t\t\t\tlocks.delete(child.id);\n\t\t\t\tpos += child.box[mainSize] + effectiveGap;\n\t\t\t}\n\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tcode: \"intra_container_distributed\",\n\t\t\t\tmessage: `Distributed ${unlocked.length} children in swimlane ${lane.id} along ${axis}.`,\n\t\t\t\tdetail: { containerId: lane.id, count: unlocked.length, axis },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction intervalForBox(\n\tbox: Box,\n\taxis: \"x\" | \"y\",\n\tmainSize: \"width\" | \"height\",\n): ReservedInterval {\n\treturn { start: box[axis], end: box[axis] + box[mainSize] };\n}\n\nfunction advancePastReserved(\n\tpos: number,\n\tsize: number,\n\treserved: readonly ReservedInterval[],\n\tminGap: number,\n): number {\n\tlet next = pos;\n\tfor (const interval of reserved) {\n\t\tif (next + size + minGap <= interval.start) {\n\t\t\tbreak;\n\t\t}\n\t\tif (next >= interval.end + minGap) {\n\t\t\tcontinue;\n\t\t}\n\t\tnext = interval.end + minGap;\n\t}\n\treturn next;\n}\n\nfunction moveInside(child: Box, container: Box): Box {\n\treturn {\n\t\t...child,\n\t\tx: Math.min(\n\t\t\tMath.max(child.x, container.x),\n\t\t\tcontainer.x + container.width - child.width,\n\t\t),\n\t\ty: Math.min(\n\t\t\tMath.max(child.y, container.y),\n\t\t\tcontainer.y + container.height - child.height,\n\t\t),\n\t};\n}\n\nfunction isInside(child: Box, container: Box): boolean {\n\treturn (\n\t\tchild.x >= container.x &&\n\t\tchild.y >= container.y &&\n\t\tchild.x + child.width <= container.x + container.width &&\n\t\tchild.y + child.height <= container.y + container.height\n\t);\n}\n\nfunction movePastOverlap(\n\tmoving: Box,\n\tfixed: Box,\n\tprimaryAxis: \"x\" | \"y\",\n\tspacing: number,\n): Box {\n\tif (primaryAxis === \"x\") {\n\t\tconst movingCenter = moving.x + moving.width / 2;\n\t\tconst fixedCenter = fixed.x + fixed.width / 2;\n\t\tconst x =\n\t\t\tmovingCenter >= fixedCenter\n\t\t\t\t? fixed.x + fixed.width + spacing\n\t\t\t\t: fixed.x - moving.width - spacing;\n\t\treturn { ...moving, x };\n\t}\n\n\tconst movingCenter = moving.y + moving.height / 2;\n\tconst fixedCenter = fixed.y + fixed.height / 2;\n\tconst y =\n\t\tmovingCenter >= fixedCenter\n\t\t\t? fixed.y + fixed.height + spacing\n\t\t\t: fixed.y - moving.height - spacing;\n\treturn { ...moving, y };\n}\n\nfunction samePosition(a: Box, b: Box): boolean {\n\treturn a.x === b.x && a.y === b.y;\n}\n\nfunction isFiniteBox(box: Box): boolean {\n\ttry {\n\t\tvalidateBox(box);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isFinitePoint(point: Point): boolean {\n\treturn Number.isFinite(point.x) && Number.isFinite(point.y);\n}\n\nfunction missingReference(\n\tdiagnostics: Diagnostic[],\n\treferenceKind: string,\n\tid: string | undefined,\n): void {\n\tdiagnostics.push({\n\t\tseverity: \"error\",\n\t\tcode: \"constraints.reference.missing\",\n\t\tmessage: `Missing ${referenceKind} reference${id === undefined ? \"\" : `: ${id}`}.`,\n\t\tpath: [\"constraints\", referenceKind],\n\t\tdetail: id === undefined ? {} : { id },\n\t});\n}\n","import type { NodeShape } from \"../ir/elements.js\";\nimport type {\n\tAnchorName,\n\tAnchorPoint,\n\tBox,\n\tInsets,\n\tPoint,\n} from \"../ir/geometry.js\";\nimport { boxCenter, expandBox, validateBox } from \"./boxes.js\";\n\nconst SUPPORTED_SHAPES = new Set<NodeShape>([\n\t\"rectangle\",\n\t\"rounded-rectangle\",\n\t\"ellipse\",\n\t\"diamond\",\n\t\"parallelogram\",\n\t\"hexagon\",\n\t\"cylinder\",\n]);\n\nexport interface ShapeGeometryInput {\n\tshape: NodeShape;\n\tbox: Box;\n\tobstacleMargin?: number | Insets;\n}\n\nexport interface ShapeGeometry {\n\tshape: NodeShape;\n\tbox: Box;\n\tcenter: Point;\n\tanchors: AnchorPoint[];\n\tobstacleBox: Box;\n}\n\nexport function computeShapeGeometry(input: ShapeGeometryInput): ShapeGeometry {\n\tvalidateShape(input.shape);\n\tvalidateBox(input.box);\n\n\tconst box = { ...input.box };\n\n\treturn {\n\t\tshape: input.shape,\n\t\tbox,\n\t\tcenter: boxCenter(box),\n\t\tanchors: createAnchors(box),\n\t\tobstacleBox: expandBox(box, input.obstacleMargin ?? 0),\n\t};\n}\n\nexport function getEdgePort(\n\tgeometry: ShapeGeometry,\n\ttoward: Point,\n\tpreferredAnchor?: AnchorName,\n): Point {\n\tvalidateShape(geometry.shape);\n\tvalidateBox(geometry.box);\n\tvalidatePoint(toward, \"toward\");\n\n\tif (preferredAnchor !== undefined) {\n\t\tconst anchor = geometry.anchors.find((candidate) => {\n\t\t\treturn candidate.name === preferredAnchor;\n\t\t});\n\n\t\tif (anchor === undefined) {\n\t\t\tthrow new TypeError(`Unsupported anchor: ${preferredAnchor}`);\n\t\t}\n\n\t\treturn { ...anchor.point };\n\t}\n\n\tif (\n\t\tgeometry.shape === \"rectangle\" ||\n\t\tgeometry.shape === \"rounded-rectangle\"\n\t) {\n\t\treturn rayToBox(geometry.box, toward);\n\t}\n\n\t// Practical deterministic approximation: precise visual boundary intersections\n\t// are deferred; Phase 2 returns stable ports inside the outer shape box.\n\treturn snapToNearestAnchor(geometry, toward);\n}\n\nfunction createAnchors(box: Box): AnchorPoint[] {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst center = boxCenter(box);\n\n\treturn [\n\t\t{ name: \"center\", point: center },\n\t\t{ name: \"top\", point: { x: center.x, y: top } },\n\t\t{ name: \"right\", point: { x: right, y: center.y } },\n\t\t{ name: \"bottom\", point: { x: center.x, y: bottom } },\n\t\t{ name: \"left\", point: { x: left, y: center.y } },\n\t\t{ name: \"top-left\", point: { x: left, y: top } },\n\t\t{ name: \"top-right\", point: { x: right, y: top } },\n\t\t{ name: \"bottom-right\", point: { x: right, y: bottom } },\n\t\t{ name: \"bottom-left\", point: { x: left, y: bottom } },\n\t];\n}\n\nfunction rayToBox(box: Box, toward: Point): Point {\n\tconst center = boxCenter(box);\n\tconst dx = toward.x - center.x;\n\tconst dy = toward.y - center.y;\n\n\tif (dx === 0 && dy === 0) {\n\t\treturn center;\n\t}\n\n\tconst halfWidth = box.width / 2;\n\tconst halfHeight = box.height / 2;\n\tconst scaleX = dx === 0 ? Number.POSITIVE_INFINITY : halfWidth / Math.abs(dx);\n\tconst scaleY =\n\t\tdy === 0 ? Number.POSITIVE_INFINITY : halfHeight / Math.abs(dy);\n\tconst scale = Math.min(scaleX, scaleY);\n\n\treturn clampPointToBox(\n\t\t{\n\t\t\tx: center.x + dx * scale,\n\t\t\ty: center.y + dy * scale,\n\t\t},\n\t\tbox,\n\t);\n}\n\nfunction snapToNearestAnchor(geometry: ShapeGeometry, toward: Point): Point {\n\tlet best = geometry.anchors[0];\n\tlet bestDistance = Number.POSITIVE_INFINITY;\n\n\tfor (const anchor of geometry.anchors) {\n\t\tif (anchor.name === \"center\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst distance = squaredDistance(anchor.point, toward);\n\n\t\tif (distance < bestDistance) {\n\t\t\tbest = anchor;\n\t\t\tbestDistance = distance;\n\t\t}\n\t}\n\n\tif (best === undefined) {\n\t\treturn { ...geometry.center };\n\t}\n\n\treturn clampPointToBox(best.point, geometry.box);\n}\n\nfunction clampPointToBox(point: Point, box: Box): Point {\n\treturn {\n\t\tx: Math.min(Math.max(point.x, box.x), box.x + box.width),\n\t\ty: Math.min(Math.max(point.y, box.y), box.y + box.height),\n\t};\n}\n\nfunction squaredDistance(a: Point, b: Point): number {\n\tconst dx = a.x - b.x;\n\tconst dy = a.y - b.y;\n\n\treturn dx * dx + dy * dy;\n}\n\nfunction validateShape(shape: NodeShape): void {\n\tif (!SUPPORTED_SHAPES.has(shape)) {\n\t\tthrow new TypeError(`Unsupported shape: ${shape}`);\n\t}\n}\n\nfunction validatePoint(point: Point, label: string): void {\n\tif (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n\t\tthrow new TypeError(`${label} point must be finite`);\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { AnchorPoint, Box, Insets, Size } from \"../ir/geometry.js\";\nimport type { LabelLayout } from \"../labels/index.js\";\nimport { expandBox, normalizeInsets, unionBoxes } from \"./boxes.js\";\nimport { computeShapeGeometry } from \"./shapes.js\";\n\nexport interface ContainerGeometryInput {\n\tid: string;\n\tchildBoxes: readonly Box[];\n\tpadding: Insets | number;\n\tlabelLayout?: LabelLayout;\n\tminSize?: Partial<Size>;\n\tobstacleMargin?: number | Insets;\n}\n\nexport interface ContainerGeometry {\n\tid: string;\n\tbox: Box;\n\tcontentBox: Box;\n\tchildBounds: Box;\n\tlabelLayout?: LabelLayout;\n\tanchors: AnchorPoint[];\n\tobstacleBox: Box;\n\tdiagnostics: Diagnostic[];\n}\n\nexport function computeContainerGeometry(\n\tinput: ContainerGeometryInput,\n): ContainerGeometry {\n\tconst childBounds = unionBoxes(input.childBoxes);\n\tconst padding = normalizeInsets(input.padding);\n\tconst minSize = normalizeMinSize(input.minSize);\n\tconst headerHeight =\n\t\tinput.labelLayout?.fittedSize.height ?? input.labelLayout?.box.height ?? 0;\n\tconst intrinsicBox = {\n\t\tx: childBounds.x - padding.left,\n\t\ty: childBounds.y - padding.top - headerHeight,\n\t\twidth: childBounds.width + padding.left + padding.right,\n\t\theight: childBounds.height + padding.top + padding.bottom + headerHeight,\n\t};\n\tconst box = {\n\t\t...intrinsicBox,\n\t\twidth: Math.max(intrinsicBox.width, minSize.width ?? 0),\n\t\theight: Math.max(intrinsicBox.height, minSize.height ?? 0),\n\t};\n\tconst contentBox = {\n\t\tx: childBounds.x,\n\t\ty: childBounds.y,\n\t\twidth: childBounds.width,\n\t\theight: childBounds.height,\n\t};\n\tconst shape = computeShapeGeometry({\n\t\tshape: \"rectangle\",\n\t\tbox,\n\t});\n\tconst obstacleBox = expandBox(box, input.obstacleMargin ?? 0);\n\n\treturn {\n\t\tid: input.id,\n\t\tbox,\n\t\tcontentBox,\n\t\tchildBounds,\n\t\t...(input.labelLayout === undefined\n\t\t\t? {}\n\t\t\t: { labelLayout: input.labelLayout }),\n\t\tanchors: shape.anchors,\n\t\tobstacleBox,\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction normalizeMinSize(minSize: Partial<Size> = {}): Partial<Size> {\n\tif (minSize.width !== undefined) {\n\t\tvalidateSize(minSize.width, \"minSize.width\");\n\t}\n\n\tif (minSize.height !== undefined) {\n\t\tvalidateSize(minSize.height, \"minSize.height\");\n\t}\n\n\treturn { ...minSize };\n}\n\nfunction validateSize(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new TypeError(`${label} must be finite and non-negative`);\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\n\nexport interface TextStyleOptions {\n\tfontFamily: string;\n\tfontSize: number;\n\tfontWeight?: number | string;\n\tfontStyle?: \"normal\" | \"italic\";\n\tlineHeight?: number;\n\tletterSpacing?: number;\n\twhiteSpace?: \"normal\" | \"pre-wrap\";\n\twordBreak?: \"normal\" | \"keep-all\";\n}\n\nexport type TextMeasurementBackend = \"deterministic\" | \"pretext\";\n\nexport interface PreparedText {\n\ttext: string;\n\tfont: string;\n\tstyle: TextStyleOptions;\n\tbackend: TextMeasurementBackend;\n}\n\nexport interface TextCursor {\n\tsegmentIndex: number;\n\tgraphemeIndex: number;\n}\n\nexport interface TextLayoutLine {\n\ttext: string;\n\twidth: number;\n\tstart: TextCursor;\n\tend: TextCursor;\n}\n\nexport interface TextLayout {\n\twidth: number;\n\theight: number;\n\tlineHeight: number;\n\tlineCount: number;\n\tlines: TextLayoutLine[];\n\tdiagnostics: Diagnostic[];\n}\n\nexport interface TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText;\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight?: number,\n\t): TextLayout;\n\tnaturalWidth(prepared: PreparedText): number;\n}\n\nexport function assertFinitePositive(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new TypeError(`${label} must be finite and positive`);\n\t}\n}\n\nexport function assertFiniteNonNegative(value: number, label: string): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new TypeError(`${label} must be a finite non-negative width`);\n\t}\n}\n\nexport function validateTextStyle(style: TextStyleOptions): void {\n\tassertFinitePositive(style.fontSize, \"fontSize\");\n\n\tif (style.lineHeight !== undefined) {\n\t\tassertFinitePositive(style.lineHeight, \"lineHeight\");\n\t}\n\n\tif (\n\t\tstyle.letterSpacing !== undefined &&\n\t\t!Number.isFinite(style.letterSpacing)\n\t) {\n\t\tthrow new TypeError(\"letterSpacing must be finite\");\n\t}\n}\n\nexport function resolveLineHeight(style: TextStyleOptions): number {\n\tvalidateTextStyle(style);\n\treturn style.lineHeight ?? style.fontSize * 1.2;\n}\n\nexport function toCanvasFont(style: TextStyleOptions): string {\n\tvalidateTextStyle(style);\n\n\tconst fontStyle = style.fontStyle === \"italic\" ? \"italic \" : \"\";\n\tconst fontWeight = style.fontWeight ?? 400;\n\n\treturn `${fontStyle}${fontWeight} ${style.fontSize}px ${style.fontFamily}`;\n}\n","import type {\n\tPreparedText,\n\tTextLayout,\n\tTextLayoutLine,\n\tTextMeasurer,\n\tTextStyleOptions,\n} from \"./types.js\";\nimport {\n\tassertFiniteNonNegative,\n\tresolveLineHeight,\n\ttoCanvasFont,\n\tvalidateTextStyle,\n} from \"./types.js\";\n\nexport class DeterministicTextMeasurer implements TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText {\n\t\tvalidateTextStyle(style);\n\n\t\treturn {\n\t\t\ttext,\n\t\t\tfont: toCanvasFont(style),\n\t\t\tstyle: { ...style },\n\t\t\tbackend: \"deterministic\",\n\t\t};\n\t}\n\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight = resolveLineHeight(prepared.style),\n\t): TextLayout {\n\t\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\t\tassertFinitePositiveLineHeight(lineHeight);\n\n\t\tconst lines = this.wrap(prepared, maxWidth);\n\t\tconst width = lines.reduce(\n\t\t\t(current, line) => Math.max(current, line.width),\n\t\t\t0,\n\t\t);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight: lines.length * lineHeight,\n\t\t\tlineHeight,\n\t\t\tlineCount: lines.length,\n\t\t\tlines,\n\t\t\tdiagnostics: [],\n\t\t};\n\t}\n\n\tnaturalWidth(prepared: PreparedText): number {\n\t\tconst charWidth = getCharacterWidth(prepared.style);\n\n\t\treturn prepared.text.split(\"\\n\").reduce((width, line) => {\n\t\t\treturn Math.max(width, line.length * charWidth);\n\t\t}, 0);\n\t}\n\n\tprivate wrap(prepared: PreparedText, maxWidth: number): TextLayoutLine[] {\n\t\tconst charWidth = getCharacterWidth(prepared.style);\n\t\tconst sourceLines = prepared.text.split(\"\\n\");\n\t\tconst output: TextLayoutLine[] = [];\n\t\tlet segmentIndex = 0;\n\n\t\tfor (const sourceLine of sourceLines) {\n\t\t\tif (sourceLine.length === 0) {\n\t\t\t\toutput.push(createLine(\"\", 0, segmentIndex, 0, 0));\n\t\t\t\tsegmentIndex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst maxChars =\n\t\t\t\tmaxWidth <= 0 ? 1 : Math.max(1, Math.floor(maxWidth / charWidth));\n\n\t\t\tfor (let start = 0; start < sourceLine.length; start += maxChars) {\n\t\t\t\tconst text = sourceLine.slice(start, start + maxChars);\n\t\t\t\toutput.push(\n\t\t\t\t\tcreateLine(\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\ttext.length * charWidth,\n\t\t\t\t\t\tsegmentIndex,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + text.length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsegmentIndex += 1;\n\t\t}\n\n\t\tif (output.length === 0) {\n\t\t\toutput.push(createLine(\"\", 0, 0, 0, 0));\n\t\t}\n\n\t\treturn output;\n\t}\n}\n\nfunction getCharacterWidth(style: TextStyleOptions): number {\n\tconst letterSpacing = style.letterSpacing ?? 0;\n\treturn Math.max(0, style.fontSize * 0.6 + letterSpacing);\n}\n\nfunction createLine(\n\ttext: string,\n\twidth: number,\n\tsegmentIndex: number,\n\tstart: number,\n\tend: number,\n): TextLayoutLine {\n\treturn {\n\t\ttext,\n\t\twidth,\n\t\tstart: {\n\t\t\tsegmentIndex,\n\t\t\tgraphemeIndex: start,\n\t\t},\n\t\tend: {\n\t\t\tsegmentIndex,\n\t\t\tgraphemeIndex: end,\n\t\t},\n\t};\n}\n\nfunction assertFinitePositiveLineHeight(lineHeight: number): void {\n\tif (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n\t\tthrow new TypeError(\"lineHeight must be finite and positive\");\n\t}\n}\n","import { createRequire } from \"node:module\";\n\ntype OffscreenCanvasConstructor = typeof globalThis.OffscreenCanvas;\ntype NodeCanvas = import(\"@napi-rs/canvas\").Canvas;\ntype NodeCanvasModule = {\n\tcreateCanvas(width: number, height: number): NodeCanvas;\n};\ntype LoadNodeCanvasModule = () => NodeCanvasModule;\n\nconst require = createRequire(import.meta.url);\n\nexport function installNodeCanvasRuntime(\n\tloadNodeCanvasModule: LoadNodeCanvasModule = loadDefaultNodeCanvasModule,\n): boolean {\n\tif (typeof globalThis.OffscreenCanvas === \"function\") {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst canvasModule = loadNodeCanvasModule();\n\t\tconst { createCanvas } = canvasModule;\n\t\tconst NodeOffscreenCanvas = class {\n\t\t\tprivate readonly canvas: NodeCanvas;\n\n\t\t\tconstructor(width: number, height: number) {\n\t\t\t\tthis.canvas = createCanvas(width, height);\n\t\t\t}\n\n\t\t\tgetContext(contextId: \"2d\") {\n\t\t\t\treturn contextId === \"2d\" ? this.canvas.getContext(\"2d\") : null;\n\t\t\t}\n\t\t};\n\n\t\tglobalThis.OffscreenCanvas =\n\t\t\tNodeOffscreenCanvas as unknown as OffscreenCanvasConstructor;\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction loadDefaultNodeCanvasModule(): NodeCanvasModule {\n\treturn require(\"@napi-rs/canvas\") as NodeCanvasModule;\n}\n","import type { PreparedTextWithSegments } from \"@chenglou/pretext\";\nimport {\n\tlayoutWithLines,\n\tmeasureNaturalWidth,\n\tprepareWithSegments,\n} from \"@chenglou/pretext\";\nimport type {\n\tPreparedText,\n\tTextLayout,\n\tTextMeasurer,\n\tTextStyleOptions,\n} from \"./types.js\";\nimport {\n\tassertFiniteNonNegative,\n\tresolveLineHeight,\n\ttoCanvasFont,\n\tvalidateTextStyle,\n} from \"./types.js\";\n\ntype InternalPretextPrepared = PreparedText & {\n\treadonly pretextPrepared: PreparedTextWithSegments;\n};\n\nconst RUNTIME_UNAVAILABLE = \"text.pretext.runtime-unavailable\";\n\nexport function isPretextRuntimeAvailable(): boolean {\n\treturn (\n\t\ttypeof Intl.Segmenter === \"function\" &&\n\t\ttypeof globalThis.OffscreenCanvas === \"function\"\n\t);\n}\n\nexport class PretextTextMeasurer implements TextMeasurer {\n\tprepare(text: string, style: TextStyleOptions): PreparedText {\n\t\tif (!isPretextRuntimeAvailable()) {\n\t\t\tthrow new TypeError(RUNTIME_UNAVAILABLE);\n\t\t}\n\n\t\tvalidateTextStyle(style);\n\n\t\tconst font = toCanvasFont(style);\n\t\tconst options = {\n\t\t\t...(style.whiteSpace === undefined\n\t\t\t\t? {}\n\t\t\t\t: { whiteSpace: style.whiteSpace }),\n\t\t\t...(style.wordBreak === undefined ? {} : { wordBreak: style.wordBreak }),\n\t\t\t...(style.letterSpacing === undefined\n\t\t\t\t? {}\n\t\t\t\t: { letterSpacing: style.letterSpacing }),\n\t\t};\n\t\tconst prepared = prepareWithSegments(text, font, options);\n\n\t\treturn {\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tstyle: { ...style },\n\t\t\tbackend: \"pretext\",\n\t\t\tpretextPrepared: prepared,\n\t\t} as InternalPretextPrepared;\n\t}\n\n\tlayout(\n\t\tprepared: PreparedText,\n\t\tmaxWidth: number,\n\t\tlineHeight = resolveLineHeight(prepared.style),\n\t): TextLayout {\n\t\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\t\tif (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n\t\t\tthrow new TypeError(\"lineHeight must be finite and positive\");\n\t\t}\n\n\t\tconst result = layoutWithLines(\n\t\t\ttoInternalPrepared(prepared),\n\t\t\tmaxWidth,\n\t\t\tlineHeight,\n\t\t);\n\t\tconst width = result.lines.reduce(\n\t\t\t(current, line) => Math.max(current, line.width),\n\t\t\t0,\n\t\t);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight: result.height,\n\t\t\tlineHeight,\n\t\t\tlineCount: result.lineCount,\n\t\t\tlines: result.lines.map((line) => ({\n\t\t\t\ttext: line.text,\n\t\t\t\twidth: line.width,\n\t\t\t\tstart: {\n\t\t\t\t\tsegmentIndex: line.start.segmentIndex,\n\t\t\t\t\tgraphemeIndex: line.start.graphemeIndex,\n\t\t\t\t},\n\t\t\t\tend: {\n\t\t\t\t\tsegmentIndex: line.end.segmentIndex,\n\t\t\t\t\tgraphemeIndex: line.end.graphemeIndex,\n\t\t\t\t},\n\t\t\t})),\n\t\t\tdiagnostics: [],\n\t\t};\n\t}\n\n\tnaturalWidth(prepared: PreparedText): number {\n\t\treturn measureNaturalWidth(toInternalPrepared(prepared));\n\t}\n}\n\nfunction toInternalPrepared(prepared: PreparedText): PreparedTextWithSegments {\n\tif (prepared.backend !== \"pretext\" || !(\"pretextPrepared\" in prepared)) {\n\t\tthrow new TypeError(\"prepared text was not created by PretextTextMeasurer\");\n\t}\n\n\treturn prepared.pretextPrepared as PreparedTextWithSegments;\n}\n","import { DeterministicTextMeasurer } from \"./fallback.js\";\nimport { installNodeCanvasRuntime } from \"./node-canvas.js\";\nimport { isPretextRuntimeAvailable, PretextTextMeasurer } from \"./pretext.js\";\nimport type { TextMeasurer } from \"./types.js\";\n\nexport interface DefaultTextMeasurerOptions {\n\tinstallNodeCanvasRuntime?: () => boolean;\n}\n\nexport function createDefaultTextMeasurer(\n\toptions: DefaultTextMeasurerOptions = {},\n): TextMeasurer {\n\tconst installRuntime =\n\t\toptions.installNodeCanvasRuntime ?? installNodeCanvasRuntime;\n\tinstallRuntime();\n\n\treturn isPretextRuntimeAvailable()\n\t\t? new PretextTextMeasurer()\n\t\t: new DeterministicTextMeasurer();\n}\n","import { normalizeInsets } from \"../geometry/index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Insets, Size } from \"../ir/geometry.js\";\nimport type { TextLayout, TextMeasurer } from \"../text/index.js\";\nimport { assertFiniteNonNegative, resolveLineHeight } from \"../text/index.js\";\nimport type { LabelFitOptions, LabelLayout, LabelLineLayout } from \"./types.js\";\n\nexport function fitLabel(\n\ttext: string,\n\toptions: LabelFitOptions,\n\tmeasurer: TextMeasurer,\n): LabelLayout {\n\treturn computeLabelLayout(text, options, measurer);\n}\n\nexport class LabelFitter {\n\tconstructor(private readonly measurer: TextMeasurer) {}\n\n\tfit(text: string, options: LabelFitOptions): LabelLayout {\n\t\treturn computeLabelLayout(text, options, this.measurer);\n\t}\n}\n\nfunction computeLabelLayout(\n\ttext: string,\n\toptions: LabelFitOptions,\n\tmeasurer: TextMeasurer,\n): LabelLayout {\n\tconst padding = normalizeInsets(options.padding);\n\tconst minSize = normalizeMinSize(options.minSize);\n\tconst lineHeight = resolveLineHeight(options.font);\n\tconst maxWidth = normalizeMaxWidth(options.maxWidth);\n\tconst prepared = measurer.prepare(text, options.font);\n\tconst naturalTextWidth = measurer.naturalWidth(prepared);\n\tconst contentMaxWidth =\n\t\tmaxWidth === undefined\n\t\t\t? naturalTextWidth\n\t\t\t: Math.max(0, maxWidth - padding.left - padding.right);\n\tconst textLayout = measurer.layout(prepared, contentMaxWidth, lineHeight);\n\tconst naturalSize = {\n\t\twidth: naturalTextWidth,\n\t\theight: textLayout.height,\n\t};\n\tconst contentWidth = Math.max(\n\t\ttextLayout.width,\n\t\tminContentWidth(minSize, padding),\n\t);\n\tconst contentHeight = Math.max(\n\t\ttextLayout.height,\n\t\tminContentHeight(minSize, padding),\n\t);\n\tconst idealWidth = contentWidth + padding.left + padding.right;\n\tconst idealHeight = contentHeight + padding.top + padding.bottom;\n\tconst fittedSize = {\n\t\twidth: maxWidth === undefined ? idealWidth : Math.min(maxWidth, idealWidth),\n\t\theight: idealHeight,\n\t};\n\tconst box: Box = {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: fittedSize.width,\n\t\theight: fittedSize.height,\n\t};\n\tconst contentBox: Box = {\n\t\tx: padding.left,\n\t\ty: padding.top,\n\t\twidth: Math.max(0, box.width - padding.left - padding.right),\n\t\theight: Math.max(0, box.height - padding.top - padding.bottom),\n\t};\n\tconst overflow = {\n\t\thorizontal: textLayout.width > contentBox.width,\n\t\tvertical:\n\t\t\ttextLayout.height > contentBox.height ||\n\t\t\tdiagnosedHeightConstraintOverflow(textLayout.height, padding, minSize),\n\t\ttruncated:\n\t\t\toptions.overflow === \"truncate\" && textLayout.width > contentBox.width,\n\t};\n\tconst diagnostics = buildDiagnostics(overflow, options.overflow);\n\n\treturn {\n\t\ttext,\n\t\tbox,\n\t\tcontentBox,\n\t\tnaturalSize,\n\t\tfittedSize,\n\t\tpadding,\n\t\tfont: { ...options.font },\n\t\ttextBackend: prepared.backend,\n\t\tlineHeight,\n\t\tlines: buildLines(textLayout, contentBox, lineHeight),\n\t\toverflow,\n\t\tdiagnostics,\n\t};\n}\n\nfunction buildLines(\n\ttextLayout: TextLayout,\n\tcontentBox: Box,\n\tlineHeight: number,\n): LabelLineLayout[] {\n\treturn textLayout.lines.map((line, lineIndex) => ({\n\t\ttext: line.text,\n\t\tbox: {\n\t\t\tx: contentBox.x,\n\t\t\ty: contentBox.y + lineIndex * lineHeight,\n\t\t\twidth: line.width,\n\t\t\theight: lineHeight,\n\t\t},\n\t\tbaselineY: contentBox.y + lineIndex * lineHeight + lineHeight * 0.8,\n\t\twidth: line.width,\n\t\tlineIndex,\n\t\tsourceStart: { ...line.start },\n\t\tsourceEnd: { ...line.end },\n\t}));\n}\n\nfunction normalizeMinSize(minSize: Partial<Size> = {}): Partial<Size> {\n\tif (minSize.width !== undefined) {\n\t\tassertFiniteNonNegative(minSize.width, \"minSize.width\");\n\t}\n\n\tif (minSize.height !== undefined) {\n\t\tassertFiniteNonNegative(minSize.height, \"minSize.height\");\n\t}\n\n\treturn { ...minSize };\n}\n\nfunction normalizeMaxWidth(maxWidth: number | undefined): number | undefined {\n\tif (maxWidth === undefined) {\n\t\treturn undefined;\n\t}\n\n\tassertFiniteNonNegative(maxWidth, \"maxWidth\");\n\n\treturn maxWidth;\n}\n\nfunction minContentWidth(minSize: Partial<Size>, padding: Insets): number {\n\treturn Math.max(0, (minSize.width ?? 0) - padding.left - padding.right);\n}\n\nfunction minContentHeight(minSize: Partial<Size>, padding: Insets): number {\n\treturn Math.max(0, (minSize.height ?? 0) - padding.top - padding.bottom);\n}\n\nfunction diagnosedHeightConstraintOverflow(\n\ttextHeight: number,\n\tpadding: Insets,\n\tminSize: Partial<Size>,\n): boolean {\n\treturn (\n\t\tminSize.height !== undefined &&\n\t\ttextHeight + padding.top + padding.bottom > minSize.height\n\t);\n}\n\nfunction buildDiagnostics(\n\toverflow: LabelLayout[\"overflow\"],\n\tmode: LabelFitOptions[\"overflow\"] = \"allow\",\n): Diagnostic[] {\n\tif (mode !== \"diagnose\") {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: Diagnostic[] = [];\n\n\tif (overflow.horizontal) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"label.overflow.horizontal\",\n\t\t\tmessage: \"Label text exceeds the fitted content width.\",\n\t\t});\n\t}\n\n\tif (overflow.vertical) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"label.overflow.vertical\",\n\t\t\tmessage: \"Label text exceeds the fitted content height.\",\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n","import type { Constraint } from \"../ir/constraints.js\";\nimport type { NormalizedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tEvidenceCell,\n\tEvidencePanel,\n\tEvidencePanelItem,\n\tLabel,\n\tMatrixBlock,\n\tNodeCompartments,\n\tNodePort,\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n\tSwimlane,\n\tTableBlock,\n\tTableColumn,\n\tTableRow,\n\tVisualStyle,\n} from \"../ir/elements.js\";\nimport type { Insets, Point, Size } from \"../ir/geometry.js\";\nimport { fitLabel } from \"../labels/index.js\";\nimport { createDefaultTextMeasurer, type TextMeasurer } from \"../text/index.js\";\nimport { sortDslDiagnostics } from \"./diagnostics.js\";\nimport type { DiagramDsl } from \"./schema.js\";\nimport type { DslDiagnostic, NormalizeDiagramDslResult } from \"./types.js\";\n\nexport const DEFAULT_NODE_PADDING: Insets = {\n\ttop: 12,\n\tright: 16,\n\tbottom: 12,\n\tleft: 16,\n};\nexport const DEFAULT_NODE_MIN_SIZE: Size = { width: 80, height: 40 };\nconst DEFAULT_GROUP_PADDING: Insets = {\n\ttop: 16,\n\tright: 16,\n\tbottom: 16,\n\tleft: 16,\n};\nexport const DEFAULT_LABEL_MAX_WIDTH = 160;\nexport const DEFAULT_FONT = {\n\tfontFamily: \"Arial\",\n\tfontSize: 14,\n\tlineHeight: 18,\n};\nconst DEFAULT_MATRIX_CELL_SIZE: Size = { width: 120, height: 36 };\nconst DEFAULT_TABLE_CELL_SIZE: Size = { width: 128, height: 34 };\nconst DEFAULT_PANEL_ITEM_HEIGHT = 28;\n\nexport interface NormalizeDiagramDslOptions {\n\tid?: string;\n\ttextMeasurer?: TextMeasurer;\n}\n\nexport function normalizeDiagramDsl(\n\tdslValue: unknown,\n\toptions: NormalizeDiagramDslOptions = {},\n): NormalizeDiagramDslResult {\n\tconst dsl = dslValue as DiagramDsl;\n\tconst diagnostics = validateReferences(dsl);\n\tif (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) {\n\t\treturn {\n\t\t\tdiagnostics: sortDslDiagnostics(diagnostics),\n\t\t\t...outputResult(dsl),\n\t\t};\n\t}\n\n\tconst measurer = options.textMeasurer ?? createDefaultTextMeasurer();\n\tconst routeKind = dsl.routing?.kind ?? \"orthogonal\";\n\tconst portShifting = normalizePortShifting(dsl.routing?.portShifting);\n\tconst initialLayout = dsl.layout?.mode;\n\tconst primaryReadingDirection = dsl.layout?.primaryReadingDirection;\n\tconst matrices = normalizeMatrices(dsl);\n\tconst tables = normalizeTables(dsl);\n\tconst evidencePanels = normalizeEvidencePanels(dsl);\n\tconst diagram: NormalizedDiagram = {\n\t\tid: options.id ?? dsl.id ?? \"diagram\",\n\t\t...(dsl.title === undefined ? {} : { title: dsl.title }),\n\t\tdirection: dsl.layout?.direction ?? dsl.direction ?? \"TB\",\n\t\tnodes: normalizeNodes(dsl, measurer),\n\t\tedges: normalizeEdges(dsl),\n\t\tgroups: normalizeGroups(dsl, measurer),\n\t\tswimlanes: normalizeSwimlanes(dsl),\n\t\t...(matrices === undefined ? {} : { matrices }),\n\t\t...(tables === undefined ? {} : { tables }),\n\t\t...(evidencePanels === undefined ? {} : { evidencePanels }),\n\t\tconstraints: normalizeConstraints(dsl),\n\t\tdiagnostics: [],\n\t\t...(dsl.frame === undefined ? {} : { frame: normalizeFrame(dsl.frame) }),\n\t\tmetadata: {\n\t\t\trouteKind,\n\t\t\t...(initialLayout === undefined ? {} : { initialLayout }),\n\t\t\t...(primaryReadingDirection === undefined\n\t\t\t\t? {}\n\t\t\t\t: { primaryReadingDirection }),\n\t\t\t...(portShifting === undefined ? {} : { portShifting }),\n\t\t},\n\t};\n\n\treturn {\n\t\tdiagram,\n\t\tdiagnostics: [],\n\t\t...outputResult(dsl),\n\t};\n}\n\nfunction normalizePortShifting(\n\tportShifting: NonNullable<DiagramDsl[\"routing\"]>[\"portShifting\"] | undefined,\n):\n\t| {\n\t\t\tenabled?: boolean;\n\t\t\tspacing?: number;\n\t }\n\t| undefined {\n\tif (portShifting === undefined) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(portShifting.enabled === undefined\n\t\t\t? {}\n\t\t\t: { enabled: portShifting.enabled }),\n\t\t...(portShifting.spacing === undefined\n\t\t\t? {}\n\t\t\t: { spacing: portShifting.spacing }),\n\t};\n}\n\nfunction outputResult(\n\tdsl: DiagramDsl,\n): Pick<NormalizeDiagramDslResult, \"output\"> {\n\treturn dsl.output?.format === undefined\n\t\t? {}\n\t\t: { output: { format: dsl.output.format } };\n}\n\nfunction normalizeNodes(\n\tdsl: DiagramDsl,\n\tmeasurer: TextMeasurer,\n): NormalizedNode[] {\n\treturn Object.keys(dsl.nodes)\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst node = dsl.nodes[id];\n\t\t\tconst label = toLabel(node?.label);\n\t\t\tconst labelLayout =\n\t\t\t\tlabel === undefined ? undefined : fitDslLabel(label, measurer);\n\t\t\tconst fittedSize = labelLayout?.fittedSize;\n\t\t\tconst nodeCompartments =\n\t\t\t\tnode?.compartments === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: compartments(node.compartments);\n\t\t\tconst compartmentWidth =\n\t\t\t\tnodeCompartments === undefined\n\t\t\t\t\t? 0\n\t\t\t\t\t: compartmentNaturalWidth(id, label, nodeCompartments, measurer);\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tshape: node?.shape ?? \"rectangle\",\n\t\t\t\t...(node?.position === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { position: point(node.position) }),\n\t\t\t\t...(node?.style === undefined ? {} : { style: style(node.style) }),\n\t\t\t\t...(node?.ports === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { ports: normalizePorts(node.ports) }),\n\t\t\t\t...(nodeCompartments === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { compartments: nodeCompartments }),\n\t\t\t\tsize: {\n\t\t\t\t\twidth: Math.max(\n\t\t\t\t\t\tDEFAULT_NODE_MIN_SIZE.width,\n\t\t\t\t\t\tfittedSize?.width ?? 0,\n\t\t\t\t\t\tcompartmentWidth,\n\t\t\t\t\t),\n\t\t\t\t\theight: Math.max(\n\t\t\t\t\t\tnodeCompartments === undefined\n\t\t\t\t\t\t\t? DEFAULT_NODE_MIN_SIZE.height\n\t\t\t\t\t\t\t: compartmentHeight(nodeCompartments),\n\t\t\t\t\t\tfittedSize?.height ?? 0,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tpadding: { ...DEFAULT_NODE_PADDING },\n\t\t\t\t...(labelLayout === undefined ? {} : { labelLayout }),\n\t\t\t};\n\t\t});\n}\n\nfunction compartmentHeight(value: NodeCompartments): number {\n\tconst rowCount =\n\t\t(value.stereotype === undefined ? 0 : 1) +\n\t\t1 +\n\t\t(value.properties?.length ?? 0) +\n\t\t(value.constraints?.length ?? 0);\n\tconst rowHeight = 16;\n\tconst verticalPadding = 20;\n\treturn Math.max(\n\t\tDEFAULT_NODE_MIN_SIZE.height,\n\t\trowCount * rowHeight + verticalPadding,\n\t);\n}\n\nfunction compartmentNaturalWidth(\n\tid: string,\n\tlabel: Label | undefined,\n\tvalue: NodeCompartments,\n\tmeasurer: TextMeasurer,\n): number {\n\tconst rows = compartmentRows(id, label, value);\n\tconst maxRowWidth = rows.reduce((width, row) => {\n\t\tconst prepared = measurer.prepare(row, DEFAULT_FONT);\n\t\treturn Math.max(width, measurer.naturalWidth(prepared));\n\t}, 0);\n\treturn Math.ceil(\n\t\tmaxRowWidth + DEFAULT_NODE_PADDING.left + DEFAULT_NODE_PADDING.right,\n\t);\n}\n\nfunction compartmentRows(\n\tid: string,\n\tlabel: Label | undefined,\n\tvalue: NodeCompartments,\n): string[] {\n\treturn [\n\t\t...(value.stereotype === undefined ? [] : [value.stereotype]),\n\t\tvalue.name ?? label?.text ?? id,\n\t\t...(value.properties ?? []),\n\t\t...(value.constraints ?? []),\n\t];\n}\n\nfunction normalizeEdges(dsl: DiagramDsl): NormalizedEdge[] {\n\tconst counts = new Map<string, number>();\n\n\treturn (dsl.edges ?? []).map((edge) => {\n\t\tconst source = typeof edge === \"string\" ? undefined : edge.source;\n\t\tconst target = typeof edge === \"string\" ? undefined : edge.target;\n\t\tconst sourceId =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? \"\"\n\t\t\t\t: (edge.sourceId ?? endpointNodeId(source) ?? \"\");\n\t\tconst targetId =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? \"\"\n\t\t\t\t: (edge.targetId ?? endpointNodeId(target) ?? \"\");\n\t\tconst sourceEndpoint =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? { nodeId: sourceId }\n\t\t\t\t: endpoint(source, edge.sourceId);\n\t\tconst targetEndpoint =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? { nodeId: targetId }\n\t\t\t\t: endpoint(target, edge.targetId);\n\t\tconst baseId = `${sourceId}-${targetId}`;\n\t\tconst count = counts.get(baseId) ?? 0;\n\t\tcounts.set(baseId, count + 1);\n\t\tconst id =\n\t\t\ttypeof edge === \"string\"\n\t\t\t\t? baseId\n\t\t\t\t: (edge.id ?? (count === 0 ? baseId : `${baseId}-${count + 1}`));\n\t\tconst label = typeof edge === \"string\" ? undefined : toLabel(edge.label);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tsource: sourceEndpoint,\n\t\t\ttarget: targetEndpoint,\n\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t...(typeof edge === \"string\" || edge.style === undefined\n\t\t\t\t? {}\n\t\t\t\t: { style: edge.style }),\n\t\t\t...(typeof edge === \"string\" || edge.arrowhead === undefined\n\t\t\t\t? {}\n\t\t\t\t: { arrowhead: edge.arrowhead }),\n\t\t};\n\t});\n}\n\nfunction normalizePorts(\n\tports: NonNullable<DiagramDsl[\"nodes\"][string]>[\"ports\"],\n): NodePort[] {\n\treturn Object.keys(ports ?? {})\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst port = ports?.[id];\n\t\t\tconst label = toLabel(port?.label);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tside: port?.side ?? \"right\",\n\t\t\t\tkind: port?.kind ?? \"proxy\",\n\t\t\t\t...(port?.order === undefined ? {} : { order: port.order }),\n\t\t\t\t...(port?.style === undefined ? {} : { style: style(port.style) }),\n\t\t\t};\n\t\t});\n}\n\nfunction endpoint(\n\tvalue: string | { node: string; port?: string | undefined } | undefined,\n\tnodeIdOverride?: string | undefined,\n): NormalizedEdge[\"source\"] {\n\tif (nodeIdOverride !== undefined) {\n\t\treturn {\n\t\t\tnodeId: nodeIdOverride,\n\t\t\t...(typeof value === \"object\" &&\n\t\t\tvalue.node === nodeIdOverride &&\n\t\t\tvalue.port !== undefined\n\t\t\t\t? { portId: value.port }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\tif (value === undefined) {\n\t\treturn { nodeId: \"\" };\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn { nodeId: value };\n\t}\n\treturn {\n\t\tnodeId: value.node,\n\t\t...(value.port === undefined ? {} : { portId: value.port }),\n\t};\n}\n\nfunction style(value: {\n\tfill?: string | undefined;\n\tstroke?: string | undefined;\n\tfontFamily?: string | undefined;\n\tfontSize?: number | undefined;\n}): VisualStyle {\n\treturn {\n\t\t...(value.fill === undefined ? {} : { fill: value.fill }),\n\t\t...(value.stroke === undefined ? {} : { stroke: value.stroke }),\n\t\t...(value.fontFamily === undefined ? {} : { fontFamily: value.fontFamily }),\n\t\t...(value.fontSize === undefined ? {} : { fontSize: value.fontSize }),\n\t};\n}\n\nfunction compartments(value: {\n\tstereotype?: string | undefined;\n\tname?: string | undefined;\n\tproperties?: Array<Record<string, string> | string> | undefined;\n\tconstraints?: string[] | undefined;\n}): NodeCompartments {\n\treturn {\n\t\t...(value.stereotype === undefined ? {} : { stereotype: value.stereotype }),\n\t\t...(value.name === undefined ? {} : { name: value.name }),\n\t\t...(value.properties === undefined\n\t\t\t? {}\n\t\t\t: { properties: value.properties.map(formatCompartmentEntry) }),\n\t\t...(value.constraints === undefined\n\t\t\t? {}\n\t\t\t: { constraints: [...value.constraints] }),\n\t};\n}\n\nfunction normalizeFrame(frame: NonNullable<DiagramDsl[\"frame\"]>) {\n\treturn {\n\t\tkind: frame.kind,\n\t\t...(frame.context === undefined ? {} : { context: frame.context }),\n\t\t...(frame.name === undefined ? {} : { name: frame.name }),\n\t\ttitleTab: frame.titleTab,\n\t\t...(frame.headerHeight === undefined\n\t\t\t? {}\n\t\t\t: { headerHeight: frame.headerHeight }),\n\t\t...(frame.padding === undefined ? {} : { padding: frame.padding }),\n\t\t...(frame.labelPosition === undefined\n\t\t\t? {}\n\t\t\t: { labelPosition: frame.labelPosition }),\n\t\t...(frame.direction === undefined ? {} : { direction: frame.direction }),\n\t\t...(frame.style === undefined ? {} : { style: style(frame.style) }),\n\t};\n}\n\nfunction formatCompartmentEntry(\n\tvalue: Record<string, string> | string,\n): string {\n\tif (typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tconst [entry] = Object.entries(value);\n\tif (entry === undefined) {\n\t\treturn \"\";\n\t}\n\treturn `${entry[0]}: ${entry[1]}`;\n}\n\nfunction normalizeSwimlanes(dsl: DiagramDsl): Swimlane[] {\n\treturn Object.keys(dsl.swimlanes ?? {}).map((id) => {\n\t\tconst swimlane = dsl.swimlanes?.[id];\n\t\tconst label = toLabel(swimlane?.label);\n\t\treturn {\n\t\t\tid,\n\t\t\t...(label === undefined ? {} : { label }),\n\t\t\torientation: swimlane?.orientation ?? \"vertical\",\n\t\t\tlayout: swimlane?.layout ?? \"overlay\",\n\t\t\t...(swimlane?.headerHeight === undefined\n\t\t\t\t? {}\n\t\t\t\t: { headerHeight: swimlane.headerHeight }),\n\t\t\t...(swimlane?.padding === undefined ? {} : { padding: swimlane.padding }),\n\t\t\tlanes: Object.keys(swimlane?.lanes ?? {}).map((laneId) => {\n\t\t\t\tconst lane = swimlane?.lanes[laneId];\n\t\t\t\tconst laneLabel = toLabel(lane?.label);\n\t\t\t\treturn {\n\t\t\t\t\tid: laneId,\n\t\t\t\t\t...(laneLabel === undefined ? {} : { label: laneLabel }),\n\t\t\t\t\tchildren: [...(lane?.children ?? [])],\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\nfunction normalizeMatrices(dsl: DiagramDsl): MatrixBlock[] | undefined {\n\tif (dsl.matrices === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.matrices.map((matrix) => ({\n\t\tid: matrix.id,\n\t\trows: [...matrix.rows],\n\t\tcols: [...matrix.cols],\n\t\tcells: matrix.cells.map((row) => row.map(cell)),\n\t\t...(matrix.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(matrix.position) }),\n\t\tsize: matrix.size ?? {\n\t\t\twidth:\n\t\t\t\tdefaultMatrixRowHeaderWidth(matrix) +\n\t\t\t\tMath.max(1, matrix.cols.length) * DEFAULT_MATRIX_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, matrix.rows.length + 1) * DEFAULT_MATRIX_CELL_SIZE.height,\n\t\t},\n\t\t...(matrix.style === undefined ? {} : { style: style(matrix.style) }),\n\t}));\n}\n\nfunction defaultMatrixRowHeaderWidth(matrix: {\n\trows: readonly string[];\n}): number {\n\treturn matrix.rows.length === 0\n\t\t? 0\n\t\t: Math.min(96, DEFAULT_MATRIX_CELL_SIZE.width);\n}\n\nfunction normalizeTables(dsl: DiagramDsl): TableBlock[] | undefined {\n\tif (dsl.tables === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.tables.map((table) => ({\n\t\tid: table.id,\n\t\tcolumns: table.columns.map(tableColumn),\n\t\trows: table.rows.map(tableRow),\n\t\t...(table.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(table.position) }),\n\t\tsize: table.size ?? {\n\t\t\twidth: Math.max(1, table.columns.length) * DEFAULT_TABLE_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, table.rows.length + 1) * DEFAULT_TABLE_CELL_SIZE.height,\n\t\t},\n\t\t...(table.style === undefined ? {} : { style: style(table.style) }),\n\t}));\n}\n\nfunction normalizeEvidencePanels(dsl: DiagramDsl): EvidencePanel[] | undefined {\n\tif (dsl.evidencePanels === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn dsl.evidencePanels.map((panel) => ({\n\t\tid: panel.id,\n\t\tkind: panel.kind,\n\t\titems: panel.items.map(panelItem),\n\t\t...(panel.position === undefined\n\t\t\t? {}\n\t\t\t: { position: point(panel.position) }),\n\t\tsize: panel.size ?? {\n\t\t\twidth: 320,\n\t\t\theight: Math.max(1, panel.items.length) * DEFAULT_PANEL_ITEM_HEIGHT,\n\t\t},\n\t\t...(panel.style === undefined ? {} : { style: style(panel.style) }),\n\t}));\n}\n\nfunction cell(value: string | CellObject): EvidenceCell {\n\tif (typeof value === \"string\") {\n\t\treturn { text: value };\n\t}\n\n\treturn {\n\t\ttext: value.text,\n\t\t...(value.style === undefined &&\n\t\tvalue.fill === undefined &&\n\t\tvalue.stroke === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tstyle: style({\n\t\t\t\t\t\t...value.style,\n\t\t\t\t\t\t...(value.fill === undefined ? {} : { fill: value.fill }),\n\t\t\t\t\t\t...(value.stroke === undefined ? {} : { stroke: value.stroke }),\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t};\n}\n\nfunction tableColumn(value: {\n\tid: string;\n\tlabel: string | { text: string; maxWidth?: number | undefined };\n}): TableColumn {\n\treturn {\n\t\tid: value.id,\n\t\tlabel: toLabel(value.label) ?? { text: value.id },\n\t};\n}\n\nfunction tableRow(value: {\n\tid: string;\n\tcells: Record<string, string | CellObject>;\n}): TableRow {\n\treturn {\n\t\tid: value.id,\n\t\tcells: Object.fromEntries(\n\t\t\tObject.keys(value.cells).map((columnId) => [\n\t\t\t\tcolumnId,\n\t\t\t\tcell(value.cells[columnId] ?? \"\"),\n\t\t\t]),\n\t\t),\n\t};\n}\n\nfunction panelItem(\n\tvalue:\n\t\t| string\n\t\t| {\n\t\t\t\tid?: string | undefined;\n\t\t\t\tlabel: string | { text: string; maxWidth?: number | undefined };\n\t\t\t\tdetail?:\n\t\t\t\t\t| string\n\t\t\t\t\t| { text: string; maxWidth?: number | undefined }\n\t\t\t\t\t| undefined;\n\t\t\t\tstyle?:\n\t\t\t\t\t| { fill?: string | undefined; stroke?: string | undefined }\n\t\t\t\t\t| undefined;\n\t\t },\n): EvidencePanelItem {\n\tif (typeof value === \"string\") {\n\t\treturn { label: { text: value } };\n\t}\n\n\tconst detail = toLabel(value.detail);\n\treturn {\n\t\t...(value.id === undefined ? {} : { id: value.id }),\n\t\tlabel: toLabel(value.label) ?? { text: \"\" },\n\t\t...(detail === undefined ? {} : { detail }),\n\t\t...(value.style === undefined ? {} : { style: style(value.style) }),\n\t};\n}\n\ntype CellObject = {\n\ttext: string;\n\tfill?: string | undefined;\n\tstroke?: string | undefined;\n\tstyle?:\n\t\t| { fill?: string | undefined; stroke?: string | undefined }\n\t\t| undefined;\n};\n\nfunction normalizeGroups(\n\tdsl: DiagramDsl,\n\tmeasurer: TextMeasurer,\n): NormalizedGroup[] {\n\treturn Object.keys(dsl.groups ?? {})\n\t\t.sort()\n\t\t.map((id) => {\n\t\t\tconst group = dsl.groups?.[id];\n\t\t\tconst label = toLabel(group?.label);\n\t\t\tconst labelLayout =\n\t\t\t\tlabel === undefined ? undefined : fitDslLabel(label, measurer);\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...(label === undefined ? {} : { label }),\n\t\t\t\tnodeIds: [...(group?.nodes ?? [])],\n\t\t\t\tgroupIds: [...(group?.groups ?? [])],\n\t\t\t\tpadding: group?.padding ?? { ...DEFAULT_GROUP_PADDING },\n\t\t\t\t...(group?.headerHeight === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { headerHeight: group.headerHeight }),\n\t\t\t\t...(group?.labelPosition === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { labelPosition: group.labelPosition }),\n\t\t\t\t...(group?.direction === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { direction: group.direction }),\n\t\t\t\t...(labelLayout === undefined ? {} : { labelLayout }),\n\t\t\t};\n\t\t});\n}\n\nfunction normalizeConstraints(dsl: DiagramDsl): Constraint[] {\n\tconst constraints: Constraint[] = [];\n\n\tfor (const constraint of dsl.constraints ?? []) {\n\t\tswitch (constraint.kind) {\n\t\t\tcase \"exact-position\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"exact-position\",\n\t\t\t\t\ttargetId: constraint.targetId ?? constraint.target ?? \"\",\n\t\t\t\t\tposition: point(constraint.position),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"relative-position\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"relative-position\",\n\t\t\t\t\tsourceId: constraint.sourceId ?? constraint.source ?? \"\",\n\t\t\t\t\treferenceId: constraint.referenceId ?? constraint.reference ?? \"\",\n\t\t\t\t\trelation: constraint.relation,\n\t\t\t\t\t...(constraint.offset === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { offset: point(constraint.offset) }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"align\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"align\",\n\t\t\t\t\taxis: constraint.axis,\n\t\t\t\t\ttargetIds: [...(constraint.targetIds ?? constraint.targets ?? [])],\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"distribute\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"distribute\",\n\t\t\t\t\taxis: constraint.axis,\n\t\t\t\t\ttargetIds: [...(constraint.targetIds ?? constraint.targets ?? [])],\n\t\t\t\t\t...(constraint.spacing === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { spacing: constraint.spacing }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"containment\":\n\t\t\t\tconstraints.push({\n\t\t\t\t\tkind: \"containment\",\n\t\t\t\t\tcontainerId: constraint.containerId ?? constraint.container ?? \"\",\n\t\t\t\t\tchildIds: [...(constraint.childIds ?? constraint.children ?? [])],\n\t\t\t\t\t...(constraint.padding === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { padding: constraint.padding }),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn constraints;\n}\n\nfunction validateReferences(dsl: DiagramDsl): DslDiagnostic[] {\n\tconst diagnostics: DslDiagnostic[] = [];\n\tconst nodeIds = new Set(Object.keys(dsl.nodes));\n\tconst groupIds = new Set(Object.keys(dsl.groups ?? {}));\n\n\t(dsl.edges ?? []).forEach((edge, index) => {\n\t\tif (typeof edge === \"string\") {\n\t\t\treturn;\n\t\t}\n\t\tconst sourceId = edge.sourceId ?? endpointNodeId(edge.source);\n\t\tconst targetId = edge.targetId ?? endpointNodeId(edge.target);\n\t\tconst sourceEndpoint = endpoint(edge.source, edge.sourceId);\n\t\tconst targetEndpoint = endpoint(edge.target, edge.targetId);\n\t\tif (sourceId !== undefined && !nodeIds.has(sourceId)) {\n\t\t\tdiagnostics.push(referenceMissing([\"edges\", index, \"source\"], sourceId));\n\t\t}\n\t\tif (targetId !== undefined && !nodeIds.has(targetId)) {\n\t\t\tdiagnostics.push(referenceMissing([\"edges\", index, \"target\"], targetId));\n\t\t}\n\t\tvalidateEndpointPort(\n\t\t\tdsl,\n\t\t\tsourceEndpoint,\n\t\t\t[\"edges\", index, \"source\"],\n\t\t\tdiagnostics,\n\t\t);\n\t\tvalidateEndpointPort(\n\t\t\tdsl,\n\t\t\ttargetEndpoint,\n\t\t\t[\"edges\", index, \"target\"],\n\t\t\tdiagnostics,\n\t\t);\n\t});\n\n\tfor (const [groupId, group] of Object.entries(dsl.groups ?? {})) {\n\t\t(group.nodes ?? []).forEach((nodeId, index) => {\n\t\t\tif (!nodeIds.has(nodeId)) {\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\treferenceMissing([\"groups\", groupId, \"nodes\", index], nodeId),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\t(group.groups ?? []).forEach((childGroupId, index) => {\n\t\t\tif (!groupIds.has(childGroupId)) {\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\treferenceMissing([\"groups\", groupId, \"groups\", index], childGroupId),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tfor (const [swimlaneId, swimlane] of Object.entries(dsl.swimlanes ?? {})) {\n\t\tfor (const [laneId, lane] of Object.entries(swimlane.lanes)) {\n\t\t\t(lane.children ?? []).forEach((child, childIndex) => {\n\t\t\t\tif (!nodeIds.has(child)) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\"swimlanes\",\n\t\t\t\t\t\t\t\tswimlaneId,\n\t\t\t\t\t\t\t\t\"lanes\",\n\t\t\t\t\t\t\t\tlaneId,\n\t\t\t\t\t\t\t\t\"children\",\n\t\t\t\t\t\t\t\tchildIndex,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t(dsl.constraints ?? []).forEach((constraint, index) => {\n\t\tswitch (constraint.kind) {\n\t\t\tcase \"exact-position\": {\n\t\t\t\tconst target = constraint.targetId ?? constraint.target;\n\t\t\t\tif (\n\t\t\t\t\ttarget !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(target, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"target\"], target),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"relative-position\": {\n\t\t\t\tconst source = constraint.sourceId ?? constraint.source;\n\t\t\t\tconst reference = constraint.referenceId ?? constraint.reference;\n\t\t\t\tif (\n\t\t\t\t\tsource !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(source, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"source\"], source),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\treference !== undefined &&\n\t\t\t\t\t!hasNodeOrGroup(reference, nodeIds, groupIds)\n\t\t\t\t) {\n\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"reference\"], reference),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"align\":\n\t\t\tcase \"distribute\":\n\t\t\t\t(constraint.targetIds ?? constraint.targets ?? []).forEach(\n\t\t\t\t\t(target, targetIndex) => {\n\t\t\t\t\t\tif (!hasNodeOrGroup(target, nodeIds, groupIds)) {\n\t\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t\t\t[\"constraints\", index, \"targets\", targetIndex],\n\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"containment\": {\n\t\t\t\tconst container = constraint.containerId ?? constraint.container;\n\t\t\t\tif (container !== undefined) {\n\t\t\t\t\tif (!nodeIds.has(container)) {\n\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\treferenceMissing([\"constraints\", index, \"container\"], container),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t(constraint.childIds ?? constraint.children ?? []).forEach(\n\t\t\t\t\t(child, childIndex) => {\n\t\t\t\t\t\tif (!hasNodeOrGroup(child, nodeIds, groupIds)) {\n\t\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\t\treferenceMissing(\n\t\t\t\t\t\t\t\t\t[\"constraints\", index, \"children\", childIndex],\n\t\t\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn sortDslDiagnostics(diagnostics);\n}\n\nfunction referenceMissing(\n\tpath: Array<string | number>,\n\tid: string,\n): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"validate\",\n\t\tcode: \"validate.reference.missing\",\n\t\tmessage: `Reference \"${id}\" does not exist.`,\n\t\tpath,\n\t\thint: \"Define the referenced node or group id, or update this reference.\",\n\t};\n}\n\nfunction hasNodeOrGroup(\n\tid: string,\n\tnodeIds: ReadonlySet<string>,\n\tgroupIds: ReadonlySet<string>,\n\tswimlaneLaneIds: ReadonlySet<string> = new Set(),\n): boolean {\n\treturn nodeIds.has(id) || groupIds.has(id) || swimlaneLaneIds.has(id);\n}\n\nfunction endpointNodeId(\n\tendpointValue:\n\t\t| string\n\t\t| { node: string; port?: string | undefined }\n\t\t| undefined,\n): string | undefined {\n\tif (typeof endpointValue === \"string\" || endpointValue === undefined) {\n\t\treturn endpointValue;\n\t}\n\treturn endpointValue.node;\n}\n\nfunction validateEndpointPort(\n\tdsl: DiagramDsl,\n\tendpointValue: NormalizedEdge[\"source\"],\n\tpath: Array<string | number>,\n\tdiagnostics: DslDiagnostic[],\n): void {\n\tif (endpointValue.portId === undefined) {\n\t\treturn;\n\t}\n\n\tconst node = dsl.nodes[endpointValue.nodeId];\n\tif (node !== undefined && node.ports?.[endpointValue.portId] === undefined) {\n\t\tdiagnostics.push(referenceMissing([...path, \"port\"], endpointValue.portId));\n\t}\n}\n\nfunction toLabel(\n\tvalue: DiagramDsl[\"nodes\"][string][\"label\"],\n): Label | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof value === \"string\") {\n\t\treturn { text: value };\n\t}\n\n\treturn value.maxWidth === undefined\n\t\t? { text: value.text }\n\t\t: { text: value.text, maxWidth: value.maxWidth };\n}\n\nfunction fitDslLabel(label: Label, measurer: TextMeasurer) {\n\treturn fitLabel(\n\t\tlabel.text,\n\t\t{\n\t\t\tfont: DEFAULT_FONT,\n\t\t\tpadding: DEFAULT_NODE_PADDING,\n\t\t\tminSize: DEFAULT_NODE_MIN_SIZE,\n\t\t\tmaxWidth: label.maxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n\t\t},\n\t\tmeasurer,\n\t);\n}\n\nfunction point(value: Point): Point {\n\treturn { x: value.x, y: value.y };\n}\n","import type { JsonObject } from \"./geometry.js\";\n\nexport type DiagnosticSeverity = \"info\" | \"warning\" | \"error\";\n\nexport type DiagnosticPathSegment = string | number;\n\nexport interface Diagnostic {\n\tseverity: DiagnosticSeverity;\n\tcode: string;\n\tmessage: string;\n\tpath?: DiagnosticPathSegment[];\n\tdetail?: JsonObject;\n}\n\n/**\n * Diagnostic codes that indicate the solver produced a degraded\n * (non-deliverable) layout. Downstream consumers can gate on the\n * {@link CoordinatedDiagram.degraded} flag or use the\n * {@link SolveDiagramOptions.strict} option to promote these to\n * errors.\n */\nexport const DELIVERABILITY_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set([\n\t\"constraints.locked-target-not-moved\",\n\t\"constraints.overlap.locked-conflict\",\n\t\"routing.evidence.crossing_forbidden\",\n\t\"routing.obstacle.unavoidable\",\n\t\"route_obstacle_fallback\",\n\t\"routing.text-clearance.unresolved\",\n]);\n","import type { EdgeLabel, GraphLabel, NodeLabel } from \"@dagrejs/dagre\";\nimport { Graph, layout } from \"@dagrejs/dagre\";\nimport { unionBoxes } from \"../geometry/index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box } from \"../ir/geometry.js\";\nimport type {\n\tDagreLayoutEdge,\n\tDagreLayoutInput,\n\tDagreLayoutNode,\n\tDagreLayoutOptions,\n\tInitialLayoutResult,\n} from \"./types.js\";\n\nconst DEFAULT_OPTIONS: DagreLayoutOptions = {\n\tnodesep: 80,\n\tranksep: 100,\n\tedgesep: 40,\n\tmarginx: 0,\n\tmarginy: 0,\n\tcomponentGap: 160,\n\tranker: \"network-simplex\",\n};\n\nexport function runDagreInitialLayout(\n\tinput: DagreLayoutInput,\n): InitialLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst validNodeIds = new Set<string>();\n\tconst graph = new Graph<GraphLabel, NodeLabel, EdgeLabel>({\n\t\tdirected: true,\n\t\tmultigraph: true,\n\t\tcompound: false,\n\t});\n\tconst options = { ...DEFAULT_OPTIONS, ...input.options };\n\n\tgraph.setGraph({\n\t\trankdir: input.direction,\n\t\tnodesep: options.nodesep,\n\t\tranksep: options.ranksep,\n\t\tedgesep: options.edgesep,\n\t\tmarginx: options.marginx,\n\t\tmarginy: options.marginy,\n\t\tranker: options.ranker,\n\t});\n\tgraph.setDefaultEdgeLabel(() => ({}));\n\n\tfor (const node of input.nodes) {\n\t\tif (\n\t\t\t!isValidDimension(node.size.width) ||\n\t\t\t!isValidDimension(node.size.height)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-size.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has invalid layout dimensions.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"size\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalidNodeIds.add(node.id);\n\t\tgraph.setNode(node.id, {\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\tfor (const edge of input.edges) {\n\t\tif (!validNodeIds.has(edge.sourceId) || !validNodeIds.has(edge.targetId)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing layout node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.sourceId,\n\t\t\t\t\ttargetId: edge.targetId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tgraph.setEdge(\n\t\t\tedge.sourceId,\n\t\t\tedge.targetId,\n\t\t\t{ minlen: 1, weight: 1 },\n\t\t\tedge.id,\n\t\t);\n\t}\n\n\tlayout(graph);\n\n\tfor (const node of input.nodes) {\n\t\tif (!validNodeIds.has(node.id)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst label = graph.node(node.id);\n\t\tconst centerX = label?.x;\n\t\tconst centerY = label?.y;\n\t\tif (\n\t\t\ttypeof centerX !== \"number\" ||\n\t\t\ttypeof centerY !== \"number\" ||\n\t\t\t!Number.isFinite(centerX) ||\n\t\t\t!Number.isFinite(centerY)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-position.invalid\",\n\t\t\t\tmessage: `Dagre returned an invalid position for node ${node.id}.`,\n\t\t\t\tpath: [\"nodes\", node.id],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, {\n\t\t\tx: centerX - node.size.width / 2,\n\t\t\ty: centerY - node.size.height / 2,\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nexport function runComponentAwareDagreInitialLayout(\n\tinput: DagreLayoutInput,\n): InitialLayoutResult {\n\tconst options = { ...DEFAULT_OPTIONS, ...input.options };\n\tconst diagnostics = reportMissingEdgeReferences(input);\n\tconst validNodeIds = new Set(input.nodes.map((node) => node.id));\n\tconst validEdges = input.edges.filter(\n\t\t(edge) =>\n\t\t\tvalidNodeIds.has(edge.sourceId) && validNodeIds.has(edge.targetId),\n\t);\n\tconst components = connectedComponents(input.nodes, validEdges);\n\tif (components.length <= 1) {\n\t\tconst layout = runDagreInitialLayout({ ...input, edges: validEdges });\n\t\treturn {\n\t\t\tboxes: layout.boxes,\n\t\t\tdiagnostics: [...diagnostics, ...layout.diagnostics],\n\t\t};\n\t}\n\n\tconst boxes = new Map<string, Box>();\n\tlet cursor = 0;\n\tfor (const component of components) {\n\t\tconst componentNodeIds = new Set(component.map((node) => node.id));\n\t\tconst componentLayout = runDagreInitialLayout({\n\t\t\t...input,\n\t\t\tnodes: component,\n\t\t\tedges: validEdges.filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\tcomponentNodeIds.has(edge.sourceId) &&\n\t\t\t\t\tcomponentNodeIds.has(edge.targetId),\n\t\t\t),\n\t\t});\n\t\tdiagnostics.push(...componentLayout.diagnostics);\n\t\tif (componentLayout.boxes.size === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst bounds = unionBoxes([...componentLayout.boxes.values()]);\n\t\tconst axis =\n\t\t\tinput.direction === \"LR\" || input.direction === \"RL\" ? \"x\" : \"y\";\n\t\tconst dx = axis === \"x\" ? cursor - bounds.x : -bounds.x;\n\t\tconst dy = axis === \"y\" ? cursor - bounds.y : -bounds.y;\n\t\tfor (const [id, box] of componentLayout.boxes) {\n\t\t\tboxes.set(id, { ...box, x: box.x + dx, y: box.y + dy });\n\t\t}\n\t\tcursor +=\n\t\t\t(axis === \"x\" ? bounds.width : bounds.height) + options.componentGap;\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nfunction reportMissingEdgeReferences(input: DagreLayoutInput): Diagnostic[] {\n\tconst validNodeIds = new Set(input.nodes.map((node) => node.id));\n\treturn input.edges.flatMap((edge) => {\n\t\tif (validNodeIds.has(edge.sourceId) && validNodeIds.has(edge.targetId)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tseverity: \"error\" as const,\n\t\t\t\tcode: \"layout.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing layout node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.sourceId,\n\t\t\t\t\ttargetId: edge.targetId,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction isValidDimension(value: number): boolean {\n\treturn Number.isFinite(value) && value >= 0;\n}\n\nfunction connectedComponents(\n\tnodes: readonly DagreLayoutNode[],\n\tedges: readonly DagreLayoutEdge[],\n): DagreLayoutNode[][] {\n\tconst nodeById = new Map(nodes.map((node) => [node.id, node]));\n\tconst adjacency = new Map(nodes.map((node) => [node.id, new Set<string>()]));\n\tfor (const edge of edges) {\n\t\tif (!nodeById.has(edge.sourceId) || !nodeById.has(edge.targetId)) {\n\t\t\tcontinue;\n\t\t}\n\t\tadjacency.get(edge.sourceId)?.add(edge.targetId);\n\t\tadjacency.get(edge.targetId)?.add(edge.sourceId);\n\t}\n\n\tconst visited = new Set<string>();\n\tconst components: DagreLayoutNode[][] = [];\n\tfor (const node of [...nodes].sort((a, b) => a.id.localeCompare(b.id))) {\n\t\tif (visited.has(node.id)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst ids: string[] = [];\n\t\tconst stack = [node.id];\n\t\tvisited.add(node.id);\n\t\twhile (stack.length > 0) {\n\t\t\tconst id = stack.pop();\n\t\t\tif (id === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tids.push(id);\n\t\t\tfor (const neighbor of [...(adjacency.get(id) ?? [])].sort().reverse()) {\n\t\t\t\tif (!visited.has(neighbor)) {\n\t\t\t\t\tvisited.add(neighbor);\n\t\t\t\t\tstack.push(neighbor);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcomponents.push(\n\t\t\tids.sort().flatMap((id) => {\n\t\t\t\tconst componentNode = nodeById.get(id);\n\t\t\t\treturn componentNode === undefined ? [] : [componentNode];\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn components.sort((a, b) => {\n\t\tconst left = a[0]?.id ?? \"\";\n\t\tconst right = b[0]?.id ?? \"\";\n\t\treturn left.localeCompare(right);\n\t});\n}\n","import { unionBoxes } from \"../geometry/boxes.js\";\nimport type { Constraint } from \"../ir/constraints.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type {\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n} from \"../ir/elements.js\";\nimport type { Box } from \"../ir/geometry.js\";\nimport {\n\trunComponentAwareDagreInitialLayout,\n\trunDagreInitialLayout,\n} from \"./dagre.js\";\nimport type { DagreLayoutOptions, InitialLayoutResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Recursive container layout (Issue #54, 方案 A)\n// ---------------------------------------------------------------------------\n\nexport interface RecursiveLayoutInput {\n\tdirection: \"TB\" | \"LR\" | \"BT\" | \"RL\";\n\tnodes: readonly NormalizedNode[];\n\tgroups: readonly NormalizedGroup[];\n\tedges: readonly NormalizedEdge[];\n\tconstraints: readonly Constraint[];\n\toptions?: Partial<DagreLayoutOptions>;\n}\n\nexport interface RecursiveLayoutResult {\n\tboxes: Map<string, Box>;\n\tgroupBoxes: Map<string, Box>;\n\tdiagnostics: Diagnostic[];\n}\n\n/**\n * Build parent→children maps from groups and containment constraints.\n *\n * A node is a child of group G if G.nodeIds includes the node's id.\n * A group C is a child of group G if G.groupIds includes C's id.\n * Containment constraints supplement (or override) group membership.\n */\nexport function buildContainerTree(\n\tgroups: readonly NormalizedGroup[],\n\tconstraints: readonly Constraint[],\n\tedges: readonly NormalizedEdge[],\n): {\n\tchildrenOf: Map<string, string[]>; // groupId → child node/group ids (leaf nodes + nested groups)\n\trootIds: Set<string>; // groups with no parent\n\tedgesInGroup: Map<string, NormalizedEdge[]>; // groupId → edges internal to that group\n\tdiagnostics: Diagnostic[];\n} {\n\tconst childrenOf = new Map<string, string[]>();\n\tconst parentOf = new Map<string, string>(); // childId → parent groupId\n\n\t// Populate from group.nodeIds / group.groupIds\n\tfor (const group of groups) {\n\t\tconst children: string[] = [];\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\tchildren.push(nodeId);\n\t\t\tparentOf.set(nodeId, group.id);\n\t\t}\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\tchildren.push(childGroupId);\n\t\t\tparentOf.set(childGroupId, group.id);\n\t\t}\n\t\tchildrenOf.set(group.id, children);\n\t}\n\n\t// Supplement from containment constraints\n\tfor (const c of constraints) {\n\t\tif (c.kind !== \"containment\") continue;\n\t\tfor (const childId of c.childIds) {\n\t\t\tconst existing = parentOf.get(childId);\n\t\t\tif (existing !== undefined) {\n\t\t\t\t// Already parented — containment constraint takes precedence.\n\t\t\t\t// Migrate child from old parent to new container.\n\t\t\t\tif (existing === c.containerId) continue;\n\t\t\t\tconst oldSiblings = childrenOf.get(existing) ?? [];\n\t\t\t\tconst pruned = oldSiblings.filter((id) => id !== childId);\n\t\t\t\tif (pruned.length === 0) {\n\t\t\t\t\tchildrenOf.delete(existing);\n\t\t\t\t} else {\n\t\t\t\t\tchildrenOf.set(existing, pruned);\n\t\t\t\t}\n\t\t\t\tconst newSiblings = childrenOf.get(c.containerId) ?? [];\n\t\t\t\tnewSiblings.push(childId);\n\t\t\t\tchildrenOf.set(c.containerId, newSiblings);\n\t\t\t\tparentOf.set(childId, c.containerId);\n\t\t\t} else {\n\t\t\t\tconst list = childrenOf.get(c.containerId) ?? [];\n\t\t\t\tlist.push(childId);\n\t\t\t\tchildrenOf.set(c.containerId, list);\n\t\t\t\tparentOf.set(childId, c.containerId);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Identify root groups (groups not contained by any other group)\n\tconst rootIds = new Set<string>();\n\tfor (const group of groups) {\n\t\tif (!parentOf.has(group.id)) {\n\t\t\trootIds.add(group.id);\n\t\t}\n\t}\n\n\t// Map edges to their innermost containing group\n\tconst edgesInGroup = new Map<string, NormalizedEdge[]>();\n\tfor (const edge of edges) {\n\t\tconst srcParent = parentOf.get(edge.source.nodeId);\n\t\tconst tgtParent = parentOf.get(edge.target.nodeId);\n\t\tif (srcParent !== undefined && srcParent === tgtParent) {\n\t\t\tconst list = edgesInGroup.get(srcParent) ?? [];\n\t\t\tlist.push(edge);\n\t\t\tedgesInGroup.set(srcParent, list);\n\t\t}\n\t}\n\n\tconst treeDiagnostics: Diagnostic[] = [];\n\treturn { childrenOf, rootIds, edgesInGroup, diagnostics: treeDiagnostics };\n}\n\n/**\n * Run recursive bottom-up container layout.\n *\n * Leaf containers are laid out first (DFS post-order). Container\n * size = union of child boxes + padding. The global pass treats\n * containers as atomic nodes.\n */\nexport function runRecursiveContainerLayout(\n\tinput: RecursiveLayoutInput,\n): RecursiveLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst groupBoxes = new Map<string, Box>();\n\n\t// Build O(1) lookup maps\n\tconst nodeById = new Map(input.nodes.map((n) => [n.id, n]));\n\tconst groupById = new Map(input.groups.map((g) => [g.id, g]));\n\tconst groupIdSet = new Set(input.groups.map((g) => g.id));\n\n\tconst {\n\t\tchildrenOf,\n\t\trootIds,\n\t\tedgesInGroup,\n\t\tdiagnostics: treeDiagnostics,\n\t} = buildContainerTree(input.groups, input.constraints, input.edges);\n\tdiagnostics.push(...treeDiagnostics);\n\n\t// If no groups, fall through to flat layout\n\tif (input.groups.length === 0) {\n\t\tconst flat = runComponentAwareDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: input.nodes.map((n) => ({ id: n.id, size: n.size })),\n\t\t\tedges: input.edges.map((e) => ({\n\t\t\t\tid: e.id,\n\t\t\t\tsourceId: e.source.nodeId,\n\t\t\t\ttargetId: e.target.nodeId,\n\t\t\t})),\n\t\t\t...(input.options === undefined ? {} : { options: input.options }),\n\t\t});\n\t\tdiagnostics.push(...flat.diagnostics);\n\t\tfor (const [id, box] of flat.boxes) {\n\t\t\tboxes.set(id, box);\n\t\t}\n\t\treturn { boxes, groupBoxes, diagnostics };\n\t}\n\n\t// Collect all descendant node/group IDs for a given group\n\tconst descendants = new Map<string, Set<string>>();\n\tfunction collectDescendants(groupId: string): Set<string> {\n\t\tconst cached = descendants.get(groupId);\n\t\tif (cached !== undefined) return cached;\n\t\tconst result = new Set<string>();\n\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\tfor (const childId of children) {\n\t\t\tresult.add(childId);\n\t\t\tconst childDesc = collectDescendants(childId);\n\t\t\tfor (const d of childDesc) result.add(d);\n\t\t}\n\t\tdescendants.set(groupId, result);\n\t\treturn result;\n\t}\n\n\t// DFS post-order: lay out each group from leaves to root\n\tconst groupOrder = topologicalSort(input.groups, childrenOf, groupIdSet);\n\n\tfor (const groupId of groupOrder) {\n\t\tconst group = groupById.get(groupId);\n\t\tif (group === undefined) continue;\n\n\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\tif (children.length === 0) {\n\t\t\t// Empty group — min size with padding\n\t\t\tconst box: Box = {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: (group.padding?.left ?? 8) + (group.padding?.right ?? 8) + 40,\n\t\t\t\theight: (group.padding?.top ?? 8) + (group.padding?.bottom ?? 8) + 20,\n\t\t\t};\n\t\t\tgroupBoxes.set(groupId, box);\n\t\t\tboxes.set(groupId, box);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Separate leaf nodes from nested groups\n\t\tconst leafNodeIds: string[] = [];\n\t\tconst nestedGroupIds: string[] = [];\n\t\tfor (const childId of children) {\n\t\t\tif (groupIdSet.has(childId)) {\n\t\t\t\tnestedGroupIds.push(childId);\n\t\t\t} else {\n\t\t\t\tleafNodeIds.push(childId);\n\t\t\t}\n\t\t}\n\n\t\t// Collect child sizes: leaf nodes use their declared size,\n\t\t// nested groups use their already-computed box\n\t\tconst childSizes = new Map<string, { width: number; height: number }>();\n\t\tfor (const nodeId of leafNodeIds) {\n\t\t\tconst node = nodeById.get(nodeId);\n\t\t\tif (node !== undefined) {\n\t\t\t\tchildSizes.set(nodeId, {\n\t\t\t\t\twidth: node.size.width,\n\t\t\t\t\theight: node.size.height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tfor (const nestedId of nestedGroupIds) {\n\t\t\tconst nestedBox = groupBoxes.get(nestedId);\n\t\t\tif (nestedBox !== undefined) {\n\t\t\t\tchildSizes.set(nestedId, {\n\t\t\t\t\twidth: nestedBox.width,\n\t\t\t\t\theight: nestedBox.height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Build mini-Dagre input for this group's children + internal edges\n\t\tconst groupEdges = edgesInGroup.get(groupId) ?? [];\n\t\tconst childLayout = runDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: children.flatMap((childId) => {\n\t\t\t\tconst size = childSizes.get(childId);\n\t\t\t\treturn size === undefined ? [] : [{ id: childId, size }];\n\t\t\t}),\n\t\t\tedges: groupEdges.map((e) => ({\n\t\t\t\tid: e.id,\n\t\t\t\tsourceId: e.source.nodeId,\n\t\t\t\ttargetId: e.target.nodeId,\n\t\t\t})),\n\t\t\toptions: {\n\t\t\t\t...(input.options ?? {}),\n\t\t\t\tranksep: (input.options?.ranksep ?? 100) * 0.6, // tighter inside containers\n\t\t\t\tnodesep: (input.options?.nodesep ?? 80) * 0.6,\n\t\t\t},\n\t\t});\n\t\tdiagnostics.push(...childLayout.diagnostics);\n\n\t\tif (childLayout.boxes.size === 0) continue;\n\n\t\t// Compute container box from child bounds + padding\n\t\tconst childBoxes = [...childLayout.boxes.values()];\n\t\tconst contentBounds = unionBoxes(childBoxes);\n\t\tconst padding = group.padding ?? {\n\t\t\ttop: 8,\n\t\t\tright: 8,\n\t\t\tbottom: 8,\n\t\t\tleft: 8,\n\t\t};\n\t\tconst containerBox: Box = {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: contentBounds.width + (padding.left ?? 8) + (padding.right ?? 8),\n\t\t\theight: contentBounds.height + (padding.top ?? 8) + (padding.bottom ?? 8),\n\t\t};\n\n\t\t// Offset children inside the container\n\t\tconst offsetX = padding.left ?? 8;\n\t\tconst offsetY = padding.top ?? 8;\n\t\tfor (const [childId, childBox] of childLayout.boxes) {\n\t\t\tboxes.set(childId, {\n\t\t\t\t...childBox,\n\t\t\t\tx: childBox.x + offsetX,\n\t\t\t\ty: childBox.y + offsetY,\n\t\t\t});\n\t\t}\n\n\t\tgroupBoxes.set(groupId, containerBox);\n\t\tboxes.set(groupId, containerBox);\n\t}\n\n\t// Global layout for top-level entities:\n\t// root groups (as atomic nodes) + uncontained leaf nodes + cross-group edges.\n\t// Use childrenOf to determine containment (covers group.nodeIds,\n\t// group.groupIds, and containment constraints).\n\tconst allContainedIds = new Set<string>();\n\tfor (const [, childIds] of childrenOf) {\n\t\tfor (const cid of childIds) allContainedIds.add(cid);\n\t}\n\tconst topLevelNodeIds = new Set<string>();\n\tfor (const node of input.nodes) {\n\t\tif (!allContainedIds.has(node.id)) {\n\t\t\ttopLevelNodeIds.add(node.id);\n\t\t}\n\t}\n\n\t// Build global Dagre input\n\tconst globalNodes: Array<{\n\t\tid: string;\n\t\tsize: { width: number; height: number };\n\t}> = [];\n\tfor (const nodeId of topLevelNodeIds) {\n\t\tconst node = nodeById.get(nodeId);\n\t\tif (node !== undefined) {\n\t\t\tglobalNodes.push({ id: nodeId, size: node.size });\n\t\t}\n\t}\n\tfor (const rootId of rootIds) {\n\t\tconst gb = groupBoxes.get(rootId);\n\t\tif (gb !== undefined) {\n\t\t\tglobalNodes.push({\n\t\t\t\tid: rootId,\n\t\t\t\tsize: { width: gb.width, height: gb.height },\n\t\t\t});\n\t\t}\n\t}\n\n\t// Map a node/group id to its outermost container root (if any).\n\tfunction rootContainerOf(id: string): string | undefined {\n\t\tfor (const rootId of rootIds) {\n\t\t\tconst desc = collectDescendants(rootId);\n\t\t\tif (desc.has(id)) return rootId;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Cross-group edges (not internal to any group).\n\t// Map internal endpoints to their containing root group so\n\t// Dagre always references nodes that exist in globalNodes.\n\tconst globalEdges = input.edges\n\t\t.filter((e) => {\n\t\t\tfor (const group of input.groups) {\n\t\t\t\tconst desc = collectDescendants(group.id);\n\t\t\t\tif (desc.has(e.source.nodeId) && desc.has(e.target.nodeId)) {\n\t\t\t\t\treturn false; // internal to a group\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.map((e) => ({\n\t\t\tid: e.id,\n\t\t\tsourceId: rootContainerOf(e.source.nodeId) ?? e.source.nodeId,\n\t\t\ttargetId: rootContainerOf(e.target.nodeId) ?? e.target.nodeId,\n\t\t}));\n\n\tif (globalNodes.length > 0) {\n\t\tconst globalLayout = runDagreInitialLayout({\n\t\t\tdirection: input.direction,\n\t\t\tnodes: globalNodes,\n\t\t\tedges: globalEdges,\n\t\t\t...(input.options === undefined ? {} : { options: input.options }),\n\t\t});\n\t\tdiagnostics.push(...globalLayout.diagnostics);\n\n\t\t// Apply global positions to root groups\n\t\tfor (const [id, box] of globalLayout.boxes) {\n\t\t\tif (groupBoxes.has(id)) {\n\t\t\t\tgroupBoxes.set(id, box);\n\t\t\t\tboxes.set(id, box);\n\t\t\t} else if (topLevelNodeIds.has(id)) {\n\t\t\t\tboxes.set(id, box);\n\t\t\t}\n\t\t}\n\n\t\t// Translate contained children by their container's global position\n\t\tfor (const groupId of groupOrder) {\n\t\t\tconst containerBox = groupBoxes.get(groupId);\n\t\t\tif (containerBox === undefined) continue;\n\t\t\tconst offsetX = containerBox.x;\n\t\t\tconst offsetY = containerBox.y;\n\t\t\tconst children = childrenOf.get(groupId) ?? [];\n\t\t\tfor (const childId of children) {\n\t\t\t\tconst childBox = boxes.get(childId);\n\t\t\t\tif (childBox !== undefined) {\n\t\t\t\t\tboxes.set(childId, {\n\t\t\t\t\t\t...childBox,\n\t\t\t\t\t\tx: childBox.x + offsetX,\n\t\t\t\t\t\ty: childBox.y + offsetY,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Recurse into nested groups\n\t\t\t\ttranslateDescendants(childId, offsetX, offsetY, boxes, childrenOf);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { boxes, groupBoxes, diagnostics };\n}\n\nfunction translateDescendants(\n\tgroupId: string,\n\tdx: number,\n\tdy: number,\n\tboxes: Map<string, Box>,\n\tchildrenOf: Map<string, string[]>,\n): void {\n\tconst children = childrenOf.get(groupId) ?? [];\n\tfor (const childId of children) {\n\t\tconst box = boxes.get(childId);\n\t\tif (box !== undefined) {\n\t\t\tboxes.set(childId, { ...box, x: box.x + dx, y: box.y + dy });\n\t\t}\n\t\ttranslateDescendants(childId, dx, dy, boxes, childrenOf);\n\t}\n}\n\n/**\n * Topological sort of groups: leaves first (DFS post-order).\n */\nfunction topologicalSort(\n\tgroups: readonly NormalizedGroup[],\n\tchildrenOf: Map<string, string[]>,\n\tgroupIdSet: Set<string>,\n): string[] {\n\tconst visited = new Set<string>();\n\tconst result: string[] = [];\n\n\tfunction visit(id: string): void {\n\t\tif (visited.has(id)) return;\n\t\tvisited.add(id);\n\t\tconst children = childrenOf.get(id) ?? [];\n\t\tfor (const childId of children) {\n\t\t\tif (groupIdSet.has(childId)) {\n\t\t\t\tvisit(childId);\n\t\t\t}\n\t\t}\n\t\tresult.push(id);\n\t}\n\n\tfor (const group of groups) {\n\t\tvisit(group.id);\n\t}\n\n\treturn result;\n}\n","// ---------------------------------------------------------------------------\n// Deterministic binary min-heap for A* search (Issue #60)\n//\n// The tie-breaking on insertion order guarantees deterministic output\n// when multiple entries share the same priority — critical for auto-graph's\n// deterministic contract (tested in determinism.test.ts).\n// ---------------------------------------------------------------------------\n\ninterface HeapEntry<T> {\n\treadonly value: T;\n\treadonly priority: number;\n\treadonly order: number;\n}\n\nexport class BinaryHeap<T> {\n\tprivate _data: HeapEntry<T>[] = [];\n\tprivate _nextOrder = 0;\n\n\tget size(): number {\n\t\treturn this._data.length;\n\t}\n\n\tpush(value: T, priority: number): void {\n\t\tconst entry: HeapEntry<T> = { value, priority, order: this._nextOrder++ };\n\t\tthis._data.push(entry);\n\t\tthis._siftUp(this._data.length - 1);\n\t}\n\n\tpop(): T | undefined {\n\t\tif (this._data.length === 0) return undefined;\n\t\tconst top = this._data[0] as HeapEntry<T>;\n\t\tconst last = this._data.pop()!;\n\t\tif (this._data.length > 0) {\n\t\t\tthis._data[0] = last;\n\t\t\tthis._siftDown(0);\n\t\t}\n\t\treturn top.value;\n\t}\n\n\tpeek(): T | undefined {\n\t\treturn this._data.length > 0 ? this._data[0]!.value : undefined;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internals\n\t// -----------------------------------------------------------------------\n\n\tprivate _siftUp(idx: number): void {\n\t\tconst entry = this._data[idx] as HeapEntry<T>;\n\t\twhile (idx > 0) {\n\t\t\tconst parentIdx = (idx - 1) >> 1;\n\t\t\tconst parent = this._data[parentIdx] as HeapEntry<T>;\n\t\t\tif (this._less(entry, parent)) {\n\t\t\t\tthis._data[idx] = parent;\n\t\t\t\tidx = parentIdx;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis._data[idx] = entry;\n\t}\n\n\tprivate _siftDown(idx: number): void {\n\t\tconst entry = this._data[idx] as HeapEntry<T>;\n\t\tconst size = this._data.length;\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tlet smallestIdx = idx;\n\t\t\tconst leftIdx = (idx << 1) + 1;\n\t\t\tconst rightIdx = leftIdx + 1;\n\t\t\t// Compare children against entry (the held element being\n\t\t\t// sifted down), not this._data[smallestIdx], because after\n\t\t\t// an earlier swap this._data[idx] holds a child that was\n\t\t\t// moved up, not entry.\n\t\t\tif (\n\t\t\t\tleftIdx < size &&\n\t\t\t\tthis._less(this._data[leftIdx] as HeapEntry<T>, entry)\n\t\t\t) {\n\t\t\t\tsmallestIdx = leftIdx;\n\t\t\t}\n\t\t\tif (\n\t\t\t\trightIdx < size &&\n\t\t\t\tthis._less(\n\t\t\t\t\tthis._data[rightIdx] as HeapEntry<T>,\n\t\t\t\t\tsmallestIdx === leftIdx\n\t\t\t\t\t\t? (this._data[leftIdx] as HeapEntry<T>)\n\t\t\t\t\t\t: entry,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsmallestIdx = rightIdx;\n\t\t\t}\n\t\t\tif (smallestIdx !== idx) {\n\t\t\t\tthis._data[idx] = this._data[smallestIdx] as HeapEntry<T>;\n\t\t\t\tidx = smallestIdx;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis._data[idx] = entry;\n\t}\n\n\t/**\n\t * Two entries are compared first by priority, then by insertion order\n\t * when priorities are equal. The insertion-order tie-break makes the\n\t * heap deterministic: for a given sequence of {value, priority} pushes,\n\t * the extraction order is always the same.\n\t */\n\tprivate _less(a: HeapEntry<T>, b: HeapEntry<T>): boolean {\n\t\tif (a.priority !== b.priority) return a.priority < b.priority;\n\t\treturn a.order < b.order;\n\t}\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport { BinaryHeap } from \"./binary-heap.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface AstarOptions {\n\t/** Per-unit cost for each segment length unit (default 1.0). */\n\treadonly segmentPenalty?: number;\n\t/** Cost added for each direction change / turn (default 50). */\n\treadonly turnPenalty?: number;\n\t/** Obstacle expansion margin (default 0). */\n\treadonly margin?: number;\n\t/** Boxes that block edges unless the segment is the first or last. */\n\treadonly endpointObstacles?: readonly Box[];\n\t/** Maximum number of graph nodes before giving up (default 4000). */\n\treadonly maxNodes?: number;\n\t/**\n\t * Pre-filter obstacles to those whose AABB intersects the\n\t * source→target corridor (libavoid-style local routing).\n\t * Reduces grid size 50–80% on typical topologies (default true).\n\t *\n\t * The corridor is conservative: obstacles within `corridorMargin`\n\t * pixels of the source→target AABB are retained. For unusually\n\t * wide detours (U-shaped paths around a single obstacle), increase\n\t * `corridorMargin` or set `corridorPrefilter: false` to search\n\t * against the full obstacle set.\n\t */\n\treadonly corridorPrefilter?: boolean;\n\t/** Corridor expansion margin in px (default 32). */\n\treadonly corridorMargin?: number;\n}\n\ninterface GraphNode {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly id: number;\n\tneighbors: Map<number, number>; // neighbor id → edge cost\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Find an orthogonal, obstacle-free path from `source` to `target`\n * using a coordinate-aligned visibility graph + A* search.\n *\n * Returns the path as an array of Points (source first, target last), or\n * `null` if no path exists or the graph exceeds `maxNodes`.\n */\nexport function findObstacleFreePath(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\toptions: AstarOptions = {},\n\tdiagnostics?: Diagnostic[],\n): Point[] | null {\n\tconst margin = options.margin ?? 0;\n\tconst turnPenalty = options.turnPenalty ?? 50;\n\tconst segmentPenalty = options.segmentPenalty ?? 1;\n\tconst endpointObstacles = options.endpointObstacles ?? [];\n\tconst maxNodes = options.maxNodes ?? (obstacles.length > 30 ? 16000 : 4000);\n\tconst useCorridor = options.corridorPrefilter ?? true;\n\tconst corridorMargin = options.corridorMargin ?? 32;\n\n\t// Corridor prefilter (libavoid-style local routing, Issue #60).\n\t// Only obstacles whose AABB intersects the source→target corridor\n\t// can possibly block a path, so filter before grid construction.\n\tconst filtered = useCorridor\n\t\t? filterObstaclesByCorridor(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tobstacles,\n\t\t\t\tendpointObstacles,\n\t\t\t\tcorridorMargin,\n\t\t\t)\n\t\t: obstacles;\n\n\t// 1. Collect interesting coordinates.\n\tconst xs = collectXs(source, target, filtered, margin);\n\tconst ys = collectYs(source, target, filtered, margin);\n\n\tif (xs.length * ys.length > maxNodes) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.astar.grid_overflow\",\n\t\t\tmessage: `A* grid overflow: ${xs.length * ys.length} nodes > ${maxNodes} limit. Falling back to heuristic routing.`,\n\t\t\tdetail: {\n\t\t\t\txsCount: xs.length,\n\t\t\t\tysCount: ys.length,\n\t\t\t\tmaxNodes,\n\t\t\t\tobstacleCount: obstacles.length,\n\t\t\t\tstage: \"corridor-filtered\",\n\t\t\t\t...(corridorMargin === undefined ? {} : { corridorMargin }),\n\t\t\t},\n\t\t});\n\t\treturn null;\n\t}\n\n\t// 2. Build graph.\n\tconst { nodes, nodeIndex } = buildGraph(xs, ys);\n\n\t// 3. Connect edges.\n\tconnectHorizontalEdges(nodes, ys, filtered, endpointObstacles, margin);\n\tconnectVerticalEdges(nodes, xs, filtered, endpointObstacles, margin);\n\n\t// 4. A* search.\n\tconst path = aStarSearch(\n\t\tnodes,\n\t\tnodeIndex,\n\t\tsource,\n\t\ttarget,\n\t\tturnPenalty,\n\t\tsegmentPenalty,\n\t);\n\n\tif (path !== null) {\n\t\t// 5. Simplify.\n\t\tconst simplified = simplifyRoute(path);\n\n\t\t// Validate the simplified path against obstacles that were\n\t\t// filtered out by the corridor prefilter (Issue #61 codex P2).\n\t\t// If the path crosses any excluded obstacle, retry with the\n\t\t// full obstacle set to avoid routes that pass through obstacles.\n\t\tconst filteredSet = new Set<Box>(filtered);\n\t\tif (useCorridor && obstacles.some((o) => !filteredSet.has(o))) {\n\t\t\tlet crossesExcluded = false;\n\t\t\tfor (let i = 0; i < simplified.length - 1; i++) {\n\t\t\t\tconst a = simplified[i] as Point;\n\t\t\t\tconst b = simplified[i + 1] as Point;\n\t\t\t\tfor (const obs of obstacles) {\n\t\t\t\t\tif (filteredSet.has(obs)) continue;\n\t\t\t\t\tif (segmentCrossesBoxStrict(a, b, obs, margin)) {\n\t\t\t\t\t\tcrossesExcluded = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (crossesExcluded) break;\n\t\t\t}\n\t\t\tif (!crossesExcluded) return simplified;\n\t\t\t// Fall through to full-obstacle retry below.\n\t\t} else {\n\t\t\treturn simplified;\n\t\t}\n\t}\n\n\t// If the corridor-prefiltered search failed, retry with the full\n\t// obstacle set (Issue #60 review): an obstacle inside the corridor\n\t// may have forced a detour outside it, where obstacles were omitted.\n\tif (!useCorridor) return null;\n\n\tconst xsFull = collectXs(source, target, obstacles, margin);\n\tconst ysFull = collectYs(source, target, obstacles, margin);\n\n\tif (xsFull.length * ysFull.length > maxNodes) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.astar.grid_overflow\",\n\t\t\tmessage: `A* full-retry grid overflow: ${xsFull.length * ysFull.length} nodes > ${maxNodes} limit. Falling back to heuristic routing.`,\n\t\t\tdetail: {\n\t\t\t\txsCount: xsFull.length,\n\t\t\t\tysCount: ysFull.length,\n\t\t\t\tmaxNodes,\n\t\t\t\tobstacleCount: obstacles.length,\n\t\t\t\tstage: \"full-retry\",\n\t\t\t\t...(corridorMargin === undefined ? {} : { corridorMargin }),\n\t\t\t},\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst { nodes: nodesFull, nodeIndex: idxFull } = buildGraph(xsFull, ysFull);\n\tconnectHorizontalEdges(\n\t\tnodesFull,\n\t\tysFull,\n\t\tobstacles,\n\t\tendpointObstacles,\n\t\tmargin,\n\t);\n\tconnectVerticalEdges(nodesFull, xsFull, obstacles, endpointObstacles, margin);\n\n\tconst pathFull = aStarSearch(\n\t\tnodesFull,\n\t\tidxFull,\n\t\tsource,\n\t\ttarget,\n\t\tturnPenalty,\n\t\tsegmentPenalty,\n\t);\n\n\tif (pathFull === null) return null;\n\treturn simplifyRoute(pathFull);\n}\n\n// ---------------------------------------------------------------------------\n// Coordinate collection\n// ---------------------------------------------------------------------------\n\n/**\n * Filter obstacles to those whose AABB (optionally expanded by margin)\n * intersects the source→target corridor. Obstacles entirely outside\n * this bounding box cannot possibly block a path between source and\n * target, so excluding them reduces grid size 50–80% on typical\n * topologies (libavoid local-corridor approach, Issue #60).\n *\n * The corridor is conservative: obstacles within `margin` pixels of\n * the source→target AABB are always retained. For very wide detours,\n * callers should pass `corridorPrefilter: false` to search against the\n * full obstacle set.\n */\nexport function filterObstaclesByCorridor(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): Box[] {\n\tconst cx1 = Math.min(source.x, target.x) - margin;\n\tconst cx2 = Math.max(source.x, target.x) + margin;\n\tconst cy1 = Math.min(source.y, target.y) - margin;\n\tconst cy2 = Math.max(source.y, target.y) + margin;\n\n\tconst result: Box[] = [];\n\tfor (const obs of obstacles) {\n\t\tif (\n\t\t\tobs.x + obs.width >= cx1 &&\n\t\t\tobs.x <= cx2 &&\n\t\t\tobs.y + obs.height >= cy1 &&\n\t\t\tobs.y <= cy2\n\t\t) {\n\t\t\tresult.push(obs);\n\t\t}\n\t}\n\t// endpointObstacles are always kept (they only block the last\n\t// segment, but the corridor filter is conservative — obstacles\n\t// outside the corridor can't intersect the source→target corridor).\n\tfor (const ep of endpointObstacles) {\n\t\tresult.push(ep);\n\t}\n\treturn result;\n}\n\nfunction collectXs(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number,\n): number[] {\n\tconst raw: number[] = [];\n\t// Offset obstacle edges by 2 px so grid lines sit just outside,\n\t// avoiding tangent-touch AABB intersections (Issue #39).\n\tfor (const obs of obstacles) {\n\t\traw.push(obs.x - margin - 2, obs.x + obs.width + margin + 2);\n\t}\n\t// Deduplicate obstacle grid lines, then always include source\n\t// and target exactly so A* can find its start/goal nodes even\n\t// when they happen to be near a grid line (Codex P2).\n\tconst deduped = insertChannelMidpoints(dedupSorted(raw));\n\tfor (const v of [source.x, target.x]) {\n\t\tif (!deduped.includes(v)) {\n\t\t\tdeduped.push(v);\n\t\t}\n\t}\n\treturn deduped.sort((a, b) => a - b);\n}\n\nfunction collectYs(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number,\n): number[] {\n\tconst raw: number[] = [];\n\t// Offset obstacle edges by 2 px so grid lines sit just outside,\n\t// avoiding tangent-touch AABB intersections (Issue #39).\n\tfor (const obs of obstacles) {\n\t\traw.push(obs.y - margin - 2, obs.y + obs.height + margin + 2);\n\t}\n\t// Deduplicate obstacle grid lines, then always include source\n\t// and target exactly so A* can find its start/goal nodes even\n\t// when they happen to be near a grid line (Codex P2).\n\tconst deduped = insertChannelMidpoints(dedupSorted(raw));\n\tfor (const v of [source.y, target.y]) {\n\t\tif (!deduped.includes(v)) {\n\t\t\tdeduped.push(v);\n\t\t}\n\t}\n\treturn deduped.sort((a, b) => a - b);\n}\n\n/**\n * Sort and merge coordinates within 2 px tolerance so aligned\n * obstacles (e.g. same container) produce fewer redundant grid\n * lines (Issue #47).\n */\nfunction dedupSorted(values: number[]): number[] {\n\tconst sorted = [...values].sort((a, b) => a - b);\n\tconst result: number[] = [];\n\tfor (const v of sorted) {\n\t\tconst last = result[result.length - 1];\n\t\tif (last === undefined || v - last > 2) {\n\t\t\tresult.push(v);\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Insert midpoints between adjacent coordinate pairs that are more\n * than `minGap` apart, so the visibility graph has grid lines\n * inside narrow channels between close obstacles (libavoid approach:\n * \"non-uniform grid whose mesh size is tailored to the geometry\").\n * Issue #49, P0-2.\n */\nfunction insertChannelMidpoints(sorted: number[], minGap = 8): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < sorted.length - 1; i++) {\n\t\tconst a = sorted[i] as number;\n\t\tconst b = sorted[i + 1] as number;\n\t\tresult.push(a);\n\t\tif (b - a > minGap) {\n\t\t\tresult.push((a + b) / 2);\n\t\t}\n\t}\n\tresult.push(sorted[sorted.length - 1] as number);\n\treturn result.sort((a, b) => a - b);\n}\n\n// ---------------------------------------------------------------------------\n// Graph construction\n// ---------------------------------------------------------------------------\n\nfunction buildGraph(\n\txs: number[],\n\tys: number[],\n): { nodes: GraphNode[]; nodeIndex: Map<string, number> } {\n\tconst nodes: GraphNode[] = [];\n\tconst nodeIndex = new Map<string, number>();\n\n\tfor (let xi = 0; xi < xs.length; xi++) {\n\t\tfor (let yi = 0; yi < ys.length; yi++) {\n\t\t\tconst x = xs[xi] as number;\n\t\t\tconst y = ys[yi] as number;\n\t\t\tconst id = nodes.length;\n\t\t\tnodes.push({ x, y, id, neighbors: new Map() });\n\t\t\tnodeIndex.set(`${x},${y}`, id);\n\t\t}\n\t}\n\n\treturn { nodes, nodeIndex };\n}\n\n// ---------------------------------------------------------------------------\n// Edge connection\n// ---------------------------------------------------------------------------\n\nfunction connectHorizontalEdges(\n\tnodes: GraphNode[],\n\tys: number[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): void {\n\tfor (const y of ys) {\n\t\tconst row = nodes.filter((n) => n.y === y).sort((a, b) => a.x - b.x);\n\t\tfor (let i = 0; i < row.length - 1; i++) {\n\t\t\tconst a = row[i] as GraphNode;\n\t\t\tconst b = row[i + 1] as GraphNode;\n\t\t\tconst dx = b.x - a.x;\n\t\t\tif (dx <= 0) continue;\n\t\t\tif (segmentCrossesAny(a, b, obstacles, endpointObstacles, margin)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta.neighbors.set(b.id, dx);\n\t\t\tb.neighbors.set(a.id, dx);\n\t\t}\n\t}\n}\n\nfunction connectVerticalEdges(\n\tnodes: GraphNode[],\n\txs: number[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): void {\n\tfor (const x of xs) {\n\t\tconst col = nodes.filter((n) => n.x === x).sort((a, b) => a.y - b.y);\n\t\tfor (let i = 0; i < col.length - 1; i++) {\n\t\t\tconst a = col[i] as GraphNode;\n\t\t\tconst b = col[i + 1] as GraphNode;\n\t\t\tconst dy = b.y - a.y;\n\t\t\tif (dy <= 0) continue;\n\t\t\tif (segmentCrossesAny(a, b, obstacles, endpointObstacles, margin)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ta.neighbors.set(b.id, dy);\n\t\t\tb.neighbors.set(a.id, dy);\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Edge validity\n// ---------------------------------------------------------------------------\n\nfunction segmentCrossesAny(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tmargin: number,\n): boolean {\n\tfor (const obs of obstacles) {\n\t\tif (segmentCrossesBoxStrict(a, b, obs, margin)) return true;\n\t}\n\tfor (const ep of endpointObstacles) {\n\t\tif (segmentCrossesBoxStrict(a, b, ep, margin)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Like `segmentIntersectsBox` but excludes tangent touches — only\n * returns true when the segment truly enters the box interior.\n * Endpoints ON the box boundary are not counted as interior.\n */\nfunction segmentCrossesBoxStrict(\n\tstart: Point,\n\tend: Point,\n\tbox: Box,\n\tmargin: number,\n): boolean {\n\tconst left = box.x - margin;\n\tconst right = box.x + box.width + margin;\n\tconst top = box.y - margin;\n\tconst bottom = box.y + box.height + margin;\n\n\t// Strict interior check for endpoints\n\tif (pointInsideStrict(start, left, right, top, bottom)) return true;\n\tif (pointInsideStrict(end, left, right, top, bottom)) return true;\n\n\t// Axis-aligned segments — use non-strict comparisons so\n\t// tangent-touching edges are caught, matching intersectsAabb.\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x >= left &&\n\t\t\tstart.x <= right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y >= top &&\n\t\t\tstart.y <= bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\n\t// Diagonal: check all four edges\n\treturn (\n\t\tsegmentEdgeIntersect(start, end, left, top, right, top) ||\n\t\tsegmentEdgeIntersect(start, end, right, top, right, bottom) ||\n\t\tsegmentEdgeIntersect(start, end, right, bottom, left, bottom) ||\n\t\tsegmentEdgeIntersect(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideStrict(\n\tp: Point,\n\tleft: number,\n\tright: number,\n\ttop: number,\n\tbottom: number,\n): boolean {\n\treturn p.x > left && p.x < right && p.y > top && p.y < bottom;\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentEdgeIntersect(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) return false;\n\n\tconst t =\n\t\t((start.x - x1) * (y2 - y1) - (start.y - y1) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((start.x - x1) * (end.y - start.y) - (start.y - y1) * (end.x - start.x)) /\n\t\tdenominator;\n\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\n// ---------------------------------------------------------------------------\n// A* search (open set uses BinaryHeap from ./binary-heap.js, Issue #60)\n// ---------------------------------------------------------------------------\n\nfunction aStarSearch(\n\tnodes: GraphNode[],\n\tnodeIndex: Map<string, number>,\n\tsource: Point,\n\ttarget: Point,\n\tturnPenalty: number,\n\tsegmentPenalty: number,\n): Point[] | null {\n\tconst startId = nodeIndex.get(`${source.x},${source.y}`);\n\tconst goalId = nodeIndex.get(`${target.x},${target.y}`);\n\tif (startId === undefined || goalId === undefined) return null;\n\n\tconst gScore = new Map<number, number>();\n\tgScore.set(startId, 0);\n\n\tconst cameFrom = new Map<number, number>();\n\tconst cameFromDir = new Map<number, \"h\" | \"v\">();\n\n\t// Binary min-heap open set (Issue #60).\n\t// Stores {id, f} where f = g + h. Lazy deletion: stale entries\n\t// (whose gScore has been improved since insertion) are skipped\n\t// on extraction. Deterministic via insertion-order tie-break.\n\tconst openSet = new BinaryHeap<number>();\n\topenSet.push(startId, manhattan(source, target));\n\n\twhile (openSet.size > 0) {\n\t\tconst currentId = openSet.pop()!;\n\t\tconst currentG = gScore.get(currentId);\n\t\t// Lazy deletion: skip if this entry's gScore is stale.\n\t\tif (currentG === undefined) continue;\n\n\t\tif (currentId === goalId) {\n\t\t\treturn reconstructPath(nodes, cameFrom, goalId);\n\t\t}\n\n\t\tconst node = nodes[currentId] as GraphNode;\n\t\tconst prevDir = cameFromDir.get(currentId);\n\n\t\tfor (const [neighborId, edgeCost] of node.neighbors) {\n\t\t\tconst neighbor = nodes[neighborId] as GraphNode;\n\t\t\tconst tentativeG = currentG + edgeCost * segmentPenalty;\n\n\t\t\tconst newDir: \"h\" | \"v\" = neighbor.y === node.y ? \"h\" : \"v\";\n\t\t\tconst turnCost =\n\t\t\t\tprevDir !== undefined && prevDir !== newDir ? turnPenalty : 0;\n\t\t\tconst totalG = tentativeG + turnCost;\n\n\t\t\tconst existingG = gScore.get(neighborId);\n\t\t\tif (existingG === undefined || totalG < existingG) {\n\t\t\t\tgScore.set(neighborId, totalG);\n\t\t\t\tcameFrom.set(neighborId, currentId);\n\t\t\t\tcameFromDir.set(neighborId, newDir);\n\t\t\t\tconst f = totalG + manhattan(neighbor, target);\n\t\t\t\topenSet.push(neighborId, f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction manhattan(a: Point, b: Point): number {\n\treturn Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction reconstructPath(\n\tnodes: GraphNode[],\n\tcameFrom: Map<number, number>,\n\tgoalId: number,\n): Point[] {\n\tconst path: Point[] = [];\n\tlet current: number | undefined = goalId;\n\twhile (current !== undefined) {\n\t\tconst node = nodes[current] as GraphNode;\n\t\tpath.unshift({ x: node.x, y: node.y });\n\t\tcurrent = cameFrom.get(current);\n\t}\n\treturn path;\n}\n\n// ---------------------------------------------------------------------------\n// Route simplification\n// ---------------------------------------------------------------------------\n\n/**\n * Remove intermediate collinear points from the route.\n */\nfunction simplifyRoute(points: readonly Point[]): Point[] {\n\tif (points.length <= 2) return [...points];\n\n\tconst result: Point[] = [points[0] as Point];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst prev = result[result.length - 1] as Point;\n\t\tconst curr = points[i] as Point;\n\t\tconst next = points[i + 1] as Point;\n\t\tif (!areCollinear(prev, curr, next)) {\n\t\t\tresult.push(curr);\n\t\t}\n\t}\n\tresult.push(points[points.length - 1] as Point);\n\treturn result;\n}\n\nfunction areCollinear(a: Point, b: Point, c: Point): boolean {\n\treturn (a.x === b.x && b.x === c.x) || (a.y === b.y && b.y === c.y);\n}\n","// ---------------------------------------------------------------------------\n// Unified routing budget model (Issue #68)\n//\n// corridorMargin, maxCorners, and maxNodes are three coupled parts of one\n// routing budget: corridorMargin (upstream) decides how many obstacles fall\n// inside the local corridor, and maxCorners / maxNodes (downstream) must then\n// scale with that obstacle count or the routers overflow and cascade-fall\n// back to heuristics.\n//\n// This module is the single source of truth for that coupling. It is called\n// once per (source, target) at the routeEdge call site — the only place that\n// simultaneously sees the corridor-filtered obstacle set, the full obstacle\n// set, and the retry chain — so corner and grid stages share one consistent\n// adaptive ceiling instead of each router re-deriving its own.\n// ---------------------------------------------------------------------------\n\nimport type { Box } from \"../ir/geometry.js\";\n\n/** Floor for the corner-graph vertex budget (preserves the old default). */\nexport const MIN_CORNER_BUDGET = 600;\n/** Ceiling for the corner-graph vertex budget (OOM protection). */\nexport const MAX_CORNER_BUDGET = 3000;\n/** Floor for the grid A* node budget (preserves the old default). */\nexport const MIN_NODE_BUDGET = 4000;\n/** Ceiling for the grid A* node budget (BinaryHeap A* stays fast enough). */\nexport const MAX_NODE_BUDGET = 64000;\n\n// Per-obstacle vertex yield in collectCornerVertices: 4 corners + 8 Steiner\n// projections (4 per endpoint × 2 endpoints). Interior projections add up to\n// +4 in edge cases; the 2× headroom below absorbs that and any dedup misses.\nconst CORNERS_PER_OBSTACLE = 12;\nconst CORNER_HEADROOM = 2;\n\n// Per-obstacle grid line yield per axis (left + right edges, each offset).\n// Worst-case grid nodes ≈ (2N + 2)²; the safety factor covers channel\n// midpoints that roughly double the grid in dense layouts.\nconst GRID_SAFETY_FACTOR = 3;\n\n// Corridor growth model: larger corridor pulls in proportionally more\n// obstacles (and their projections), so both budgets scale linearly with\n// corridor expansion. 0.5 keeps the factor gentle (1.0 at margin=0, ~2.1 at\n// the typical max margin of 445).\nconst CORRIDOR_SCALING_K = 0.5;\nconst CORRIDOR_SCALING_BASE = 200;\n\nexport interface RoutingBudget {\n\t/** Vertex budget for findCornerGraphPath. */\n\treadonly maxCorners: number;\n\t/** Node budget for findObstacleFreePath (grid A*). */\n\treadonly maxNodes: number;\n\t/** Obstacle count the corner router actually sees (corridor-filtered). */\n\treadonly cornerObstacleCount: number;\n\t/** Obstacle count the grid router sees (full set). */\n\treadonly gridObstacleCount: number;\n\t/** Corridor margin used for the prefilter (echoed for diagnostics). */\n\treadonly corridorMargin: number;\n}\n\nexport interface BudgetOverrides {\n\treadonly maxCorners?: number | undefined;\n\treadonly maxNodes?: number | undefined;\n}\n\n/**\n * Derive the unified routing budget for one (source, target) call to the\n * obstacle-avoiding router. Explicit overrides take precedence over the\n * adaptive derivation but are still clamped to the OOM ceilings.\n *\n * @param cornerObstacles obstacles the corner router processes\n * (corridor-filtered, or full set when corridor\n * was empty)\n * @param allObstacles full obstacle set the grid router processes\n * @param corridorMargin px margin used for the corridor prefilter\n * @param overrides explicit user values from RouteEdgeInput\n */\nexport function computeRoutingBudget(\n\tcornerObstacles: readonly Box[],\n\tallObstacles: readonly Box[],\n\tcorridorMargin: number,\n\toverrides: BudgetOverrides = {},\n): RoutingBudget {\n\tconst adaptiveMaxCorners = deriveMaxCorners(\n\t\tcornerObstacles.length,\n\t\tcorridorMargin,\n\t);\n\tconst adaptiveMaxNodes = deriveMaxNodes(\n\t\tallObstacles.length,\n\t\tcorridorMargin,\n\t);\n\n\treturn {\n\t\tmaxCorners: resolveBudget(\n\t\t\toverrides.maxCorners,\n\t\t\tadaptiveMaxCorners,\n\t\t\tMIN_CORNER_BUDGET,\n\t\t\tMAX_CORNER_BUDGET,\n\t\t),\n\t\tmaxNodes: resolveBudget(\n\t\t\toverrides.maxNodes,\n\t\t\tadaptiveMaxNodes,\n\t\t\tMIN_NODE_BUDGET,\n\t\t\tMAX_NODE_BUDGET,\n\t\t),\n\t\tcornerObstacleCount: cornerObstacles.length,\n\t\tgridObstacleCount: allObstacles.length,\n\t\tcorridorMargin,\n\t};\n}\n\nfunction deriveMaxCorners(obstacleCount: number, corridorMargin: number): number {\n\tconst base = 2 + obstacleCount * CORNERS_PER_OBSTACLE * CORNER_HEADROOM;\n\tconst corridorFactor = corridorScalingFactor(corridorMargin);\n\treturn Math.ceil(base * corridorFactor);\n}\n\nfunction deriveMaxNodes(obstacleCount: number, corridorMargin: number): number {\n\tconst base = 4 * obstacleCount * obstacleCount + 4 * obstacleCount + 100;\n\tconst corridorFactor = corridorScalingFactor(corridorMargin);\n\treturn Math.ceil(base * GRID_SAFETY_FACTOR * corridorFactor);\n}\n\nfunction corridorScalingFactor(corridorMargin: number): number {\n\treturn 1 + (corridorMargin / CORRIDOR_SCALING_BASE) * CORRIDOR_SCALING_K;\n}\n\n// An explicit override wins when valid (finite, >= 1); otherwise fall back to\n// the adaptive value. The result is always clamped to [min, max] so a bad\n// override cannot crash the router or starve it.\nfunction resolveBudget(\n\toverride: number | undefined,\n\tadaptive: number,\n\tmin: number,\n\tmax: number,\n): number {\n\tconst chosen =\n\t\toverride !== undefined && Number.isFinite(override) && override >= 1\n\t\t\t? override\n\t\t\t: adaptive;\n\treturn clamp(chosen, min, max);\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n","import type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type { Box, Point } from \"../ir/geometry.js\";\nimport { BinaryHeap } from \"./binary-heap.js\";\n\n// ---------------------------------------------------------------------------\n// Corner visibility-graph A* (Issue #54, 方案 B — libavoid approach)\n// ---------------------------------------------------------------------------\n\nexport interface VisibilityRouterOptions {\n\treadonly segmentPenalty?: number;\n\treadonly turnPenalty?: number;\n\treadonly margin?: number;\n\treadonly endpointObstacles?: readonly Box[];\n\treadonly maxCorners?: number;\n\t/** Corridor margin used by the caller's prefilter. Diagnostic-only —\n\t * does not affect vertex generation (Issue #68). */\n\treadonly corridorMargin?: number;\n}\n\ninterface CornerVertex {\n\treadonly point: Point;\n\treadonly obstacleIndex: number; // -1 for source/target\n}\n\ninterface VisEdge {\n\treadonly from: number;\n\treadonly to: number;\n\treadonly cost: number; // euclidean distance\n}\n\n/**\n * Find an obstacle-free path using corner-based visibility graph + A*.\n * Returns the path or null if no path exists or corner count exceeds maxCorners.\n */\nexport function findCornerGraphPath(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\toptions: VisibilityRouterOptions = {},\n\tdiagnostics?: Diagnostic[],\n): Point[] | null {\n\tconst margin = options.margin ?? 0;\n\tconst turnPenalty = options.turnPenalty ?? 50;\n\tconst segmentPenalty = options.segmentPenalty ?? 1;\n\tconst endpointObstacles = options.endpointObstacles ?? [];\n\tconst maxCorners = options.maxCorners ?? 600;\n\n\t// Collect vertices\n\tconst vertices = collectCornerVertices(source, target, obstacles, margin);\n\tif (vertices.length > maxCorners) {\n\t\tdiagnostics?.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.visibility.corner_overflow\",\n\t\t\tmessage: `Corner graph overflow: ${vertices.length} vertices > ${maxCorners}. Falling back to grid A*.`,\n\t\t\tdetail: {\n\t\t\t\tvertexCount: vertices.length,\n\t\t\t\tmaxCorners,\n\t\t\t\tobstacleCount: obstacles.length,\n\t\t\t\t...(options.corridorMargin === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { corridorMargin: options.corridorMargin }),\n\t\t\t},\n\t\t});\n\t\treturn null;\n\t}\n\n\tif (obstacles.length === 0) {\n\t\treturn simplifyRoute([source, target]);\n\t}\n\n\t// Build visibility edges\n\tconst expandedObstacles =\n\t\tmargin === 0 ? obstacles : obstacles.map((o) => expandBox(o, margin));\n\tconst edges = buildVisibilityEdges(\n\t\tvertices,\n\t\texpandedObstacles,\n\t\tendpointObstacles,\n\t);\n\n\t// A*\n\tconst path = aStarSearch(\n\t\tvertices,\n\t\tedges,\n\t\tsource,\n\t\ttarget,\n\t\tsegmentPenalty,\n\t\tturnPenalty,\n\t);\n\tif (path === null) return null;\n\n\treturn simplifyRoute(path, expandedObstacles);\n}\n\n// ---------------------------------------------------------------------------\n// Vertex collection\n// ---------------------------------------------------------------------------\n\nfunction collectCornerVertices(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n\tmargin: number = 0,\n): CornerVertex[] {\n\tconst vertices: CornerVertex[] = [\n\t\t{ point: { x: source.x, y: source.y }, obstacleIndex: -1 },\n\t\t{ point: { x: target.x, y: target.y }, obstacleIndex: -1 },\n\t];\n\n\tconst seen = new Set<string>();\n\tseen.add(`${source.x},${source.y}`);\n\tseen.add(`${target.x},${target.y}`);\n\n\tconst addVertex = (p: Point, obstacleIndex: number): void => {\n\t\tconst key = `${p.x},${p.y}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tvertices.push({ point: p, obstacleIndex });\n\t};\n\n\tfor (let i = 0; i < obstacles.length; i++) {\n\t\tconst obs = obstacles[i] as Box;\n\t\t// When margin > 0, corners are also offset outward so the\n\t\t// resulting path doesn't tangent-touch the obstacle edge\n\t\t// (which the loose AABB intersection check would reject).\n\t\tconst c0: Point = { x: obs.x - margin, y: obs.y - margin };\n\t\tconst c1: Point = { x: obs.x + obs.width + margin, y: obs.y - margin };\n\t\tconst c2: Point = {\n\t\t\tx: obs.x + obs.width + margin,\n\t\t\ty: obs.y + obs.height + margin,\n\t\t};\n\t\tconst c3: Point = { x: obs.x - margin, y: obs.y + obs.height + margin };\n\t\tfor (const c of [c0, c1, c2, c3]) {\n\t\t\taddVertex(c, i);\n\t\t}\n\t}\n\n\t// Steiner points: axis-aligned projections where source/target\n\t// coordinates project onto obstacle edges. These create waypoints\n\t// so the router can leave source/target perpendicular to an\n\t// obstacle edge before routing along it (corner-astar review fix).\n\t// With margin > 0, projections are offset outward so the path\n\t// stays outside the expanded obstacle and avoids tangent touches.\n\tfor (const p of [source, target]) {\n\t\tfor (let i = 0; i < obstacles.length; i++) {\n\t\t\tconst obs = obstacles[i] as Box;\n\t\t\t// Project p.x onto left/right edges (offset outward by margin).\n\t\t\taddVertex({ x: obs.x - margin, y: p.y }, i);\n\t\t\taddVertex({ x: obs.x + obs.width + margin, y: p.y }, i);\n\t\t\t// Project p.y onto top/bottom edges (offset outward by margin).\n\t\t\taddVertex({ x: p.x, y: obs.y - margin }, i);\n\t\t\taddVertex({ x: p.x, y: obs.y + obs.height + margin }, i);\n\t\t\t// Also project the source/target coordinate lines onto the\n\t\t\t// edges they intersect (interior projections).\n\t\t\tif (p.x > obs.x && p.x < obs.x + obs.width) {\n\t\t\t\taddVertex({ x: p.x, y: obs.y - margin }, i);\n\t\t\t\taddVertex({ x: p.x, y: obs.y + obs.height + margin }, i);\n\t\t\t}\n\t\t\tif (p.y > obs.y && p.y < obs.y + obs.height) {\n\t\t\t\taddVertex({ x: obs.x - margin, y: p.y }, i);\n\t\t\t\taddVertex({ x: obs.x + obs.width + margin, y: p.y }, i);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn vertices;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility graph construction\n// ---------------------------------------------------------------------------\n\nfunction buildVisibilityEdges(\n\tvertices: CornerVertex[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n): VisEdge[] {\n\tconst edges: VisEdge[] = [];\n\n\t// For each vertex, find nearest visible neighbor in 4 directions\n\tfor (let i = 0; i < vertices.length; i++) {\n\t\tconst v = vertices[i] as CornerVertex;\n\t\tconst right = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"right\",\n\t\t);\n\t\tconst left = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"left\",\n\t\t);\n\t\tconst down = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"down\",\n\t\t);\n\t\tconst up = visibleInDirection(\n\t\t\tv,\n\t\t\tvertices,\n\t\t\tobstacles,\n\t\t\tendpointObstacles,\n\t\t\t\"up\",\n\t\t);\n\n\t\tfor (const neighbor of [right, left, down, up]) {\n\t\t\tif (neighbor !== null && neighbor.index > i) {\n\t\t\t\tedges.push({\n\t\t\t\t\tfrom: i,\n\t\t\t\t\tto: neighbor.index,\n\t\t\t\t\tcost: neighbor.distance,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn edges;\n}\n\ninterface VisibleNeighbor {\n\tindex: number;\n\tdistance: number;\n}\n\nfunction visibleInDirection(\n\torigin: CornerVertex,\n\tvertices: CornerVertex[],\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\tdir: \"left\" | \"right\" | \"up\" | \"down\",\n): VisibleNeighbor | null {\n\tconst candidates: Array<{ index: number; dist: number }> = [];\n\n\tfor (let i = 0; i < vertices.length; i++) {\n\t\tconst v = vertices[i] as CornerVertex;\n\t\tconst dx = v.point.x - origin.point.x;\n\t\tconst dy = v.point.y - origin.point.y;\n\n\t\tswitch (dir) {\n\t\t\tcase \"right\":\n\t\t\t\tif (dx > 0 && dy === 0) candidates.push({ index: i, dist: dx });\n\t\t\t\tbreak;\n\t\t\tcase \"left\":\n\t\t\t\tif (dx < 0 && dy === 0) candidates.push({ index: i, dist: -dx });\n\t\t\t\tbreak;\n\t\t\tcase \"down\":\n\t\t\t\tif (dy > 0 && dx === 0) candidates.push({ index: i, dist: dy });\n\t\t\t\tbreak;\n\t\t\tcase \"up\":\n\t\t\t\tif (dy < 0 && dx === 0) candidates.push({ index: i, dist: -dy });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tcandidates.sort((a, b) => a.dist - b.dist);\n\n\tfor (const c of candidates) {\n\t\tif (\n\t\t\tisSegmentVisible(\n\t\t\t\torigin.point,\n\t\t\t\t(vertices[c.index] as CornerVertex).point,\n\t\t\t\tobstacles,\n\t\t\t\tendpointObstacles,\n\t\t\t\torigin.obstacleIndex,\n\t\t\t\t(vertices[c.index] as CornerVertex).obstacleIndex,\n\t\t\t)\n\t\t) {\n\t\t\treturn { index: c.index, distance: c.dist };\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility test\n// ---------------------------------------------------------------------------\n\nfunction isSegmentVisible(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n\tendpointObstacles: readonly Box[],\n\t_aObsIdx: number,\n\t_bObsIdx: number,\n): boolean {\n\t// Use strict interior check for ALL obstacles. The strict check\n\t// treats endpoints on the boundary as not \"inside\", so Steiner\n\t// points on obstacle edges can still leave the edge without\n\t// being falsely rejected. This also correctly rejects segments\n\t// that re-enter an obstacle after leaving from an edge.\n\tfor (let i = 0; i < obstacles.length; i++) {\n\t\tif (segmentEntersBox(a, b, obstacles[i] as Box)) return false;\n\t}\n\tfor (const ep of endpointObstacles) {\n\t\tif (segmentEntersBox(a, b, ep)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * Returns true if the segment enters the INTERIOR of the box\n * (strict). Endpoints on the boundary and segments tangent to the\n * boundary are NOT considered entering.\n */\nfunction segmentEntersBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tconst inside = (p: Point): boolean =>\n\t\tp.x > left && p.x < right && p.y > top && p.y < bottom;\n\tif (inside(start) || inside(end)) return true;\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\tMath.max(start.y, end.y) > top &&\n\t\t\tMath.min(start.y, end.y) < bottom\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\tMath.max(start.x, end.x) > left &&\n\t\t\tMath.min(start.x, end.x) < right\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction expandBox(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x - margin,\n\t\ty: box.y - margin,\n\t\twidth: box.width + margin * 2,\n\t\theight: box.height + margin * 2,\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// A* on visibility graph (open set uses BinaryHeap, Issue #60)\n// ---------------------------------------------------------------------------\n\nfunction aStarSearch(\n\tvertices: CornerVertex[],\n\tedges: VisEdge[],\n\tsource: Point,\n\ttarget: Point,\n\tsegmentPenalty: number,\n\tturnPenalty: number,\n): Point[] | null {\n\tconst startId = 0; // source is always first vertex\n\tconst goalId = 1; // target is always second vertex\n\n\tconst gScore = new Map<number, number>();\n\tgScore.set(startId, 0);\n\n\tconst cameFrom = new Map<number, number>();\n\tconst cameFromDir = new Map<number, \"h\" | \"v\">();\n\n\tconst openSet = new BinaryHeap<number>();\n\topenSet.push(startId, manhattan(source, target));\n\n\tconst neighborMap = new Map<number, Array<{ to: number; cost: number }>>();\n\tfor (const e of edges) {\n\t\tlet list = neighborMap.get(e.from);\n\t\tif (list === undefined) {\n\t\t\tlist = [];\n\t\t\tneighborMap.set(e.from, list);\n\t\t}\n\t\tlist.push({ to: e.to, cost: e.cost });\n\t\tlist = neighborMap.get(e.to);\n\t\tif (list === undefined) {\n\t\t\tlist = [];\n\t\t\tneighborMap.set(e.to, list);\n\t\t}\n\t\tlist.push({ to: e.from, cost: e.cost });\n\t}\n\n\twhile (openSet.size > 0) {\n\t\tconst currentId = openSet.pop()!;\n\t\tconst currentG = gScore.get(currentId);\n\t\t// Lazy deletion: skip stale entries.\n\t\tif (currentG === undefined) continue;\n\n\t\tif (currentId === goalId) {\n\t\t\treturn reconstructPath(vertices, cameFrom, goalId);\n\t\t}\n\n\t\tconst prevDir = cameFromDir.get(currentId);\n\t\tconst neighbors = neighborMap.get(currentId) ?? [];\n\n\t\tfor (const { to, cost } of neighbors) {\n\t\t\tconst tentativeG = currentG + cost * segmentPenalty;\n\t\t\tconst toV = vertices[to] as CornerVertex;\n\t\t\tconst curV = vertices[currentId] as CornerVertex;\n\t\t\tconst newDir: \"h\" | \"v\" = toV.point.y === curV.point.y ? \"h\" : \"v\";\n\t\t\tconst turnCost =\n\t\t\t\tprevDir !== undefined && prevDir !== newDir ? turnPenalty : 0;\n\t\t\tconst totalG = tentativeG + turnCost;\n\n\t\t\tconst existingG = gScore.get(to);\n\t\t\tif (existingG === undefined || totalG < existingG) {\n\t\t\t\tgScore.set(to, totalG);\n\t\t\t\tcameFrom.set(to, currentId);\n\t\t\t\tcameFromDir.set(to, newDir);\n\t\t\t\tconst f = totalG + manhattan(toV.point, target);\n\t\t\t\topenSet.push(to, f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction manhattan(a: Point, b: Point): number {\n\treturn Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction reconstructPath(\n\tvertices: CornerVertex[],\n\tcameFrom: Map<number, number>,\n\tgoalId: number,\n): Point[] {\n\tconst path: Point[] = [];\n\tlet current: number | undefined = goalId;\n\twhile (current !== undefined) {\n\t\tconst v = vertices[current] as CornerVertex;\n\t\tpath.unshift({ x: v.point.x, y: v.point.y });\n\t\tcurrent = cameFrom.get(current);\n\t}\n\treturn path;\n}\n\n// ---------------------------------------------------------------------------\n// Route simplification\n// ---------------------------------------------------------------------------\n\nfunction simplifyRoute(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[] = [],\n): Point[] {\n\tif (points.length <= 2) return [...points];\n\tconst result: Point[] = [points[0] as Point];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst prev = result[result.length - 1] as Point;\n\t\tconst curr = points[i] as Point;\n\t\tconst next = points[i + 1] as Point;\n\t\tconst collinear =\n\t\t\t(prev.x === curr.x && curr.x === next.x) ||\n\t\t\t(prev.y === curr.y && curr.y === next.y);\n\t\tif (!collinear) {\n\t\t\tresult.push(curr);\n\t\t\tcontinue;\n\t\t}\n\t\t// Only collapse if the resulting direct segment is still\n\t\t// obstacle-free. Otherwise keep the intermediate waypoint\n\t\t// so the route hugs the obstacle boundary instead of cutting\n\t\t// through it (corner-astar review fix).\n\t\tif (segmentCrossesAnyObstacle(prev, next, obstacles)) {\n\t\t\tresult.push(curr);\n\t\t}\n\t}\n\tresult.push(points[points.length - 1] as Point);\n\treturn result;\n}\n\nfunction segmentCrossesAnyObstacle(\n\ta: Point,\n\tb: Point,\n\tobstacles: readonly Box[],\n): boolean {\n\tfor (const obs of obstacles) {\n\t\tif (segmentEntersBox(a, b, obs)) return true;\n\t}\n\treturn false;\n}\n","import { intersectsAabb, validateBox } from \"../geometry/boxes.js\";\nimport { getEdgePort } from \"../geometry/shapes.js\";\nimport {\n\ttype BoxSpatialIndex,\n\tcreateBoxSpatialIndex,\n\tquerySegmentSpatialIndex,\n} from \"../geometry/spatial-index.js\";\nimport type { Diagnostic } from \"../ir/diagnostics.js\";\nimport type {\n\tAnchorName,\n\tBox,\n\tDiagramDirection,\n\tPoint,\n} from \"../ir/geometry.js\";\nimport { filterObstaclesByCorridor, findObstacleFreePath } from \"./astar.js\";\nimport { computeRoutingBudget } from \"./budget.js\";\nimport type { RouteEdgeInput, RouteEdgeResult } from \"./types.js\";\nimport { findCornerGraphPath } from \"./visibility-router.js\";\n\n/**\n * Emit a diagnostic when the route length exceeds `threshold` × the\n * straight-line distance between source and target (Issue #49, P0-4).\n */\nfunction checkBacktracking(\n\tpoints: readonly Point[],\n\tsource: Point,\n\ttarget: Point,\n\tdiagnostics: Diagnostic[],\n\tmaxRatio?: number,\n): void {\n\tif (points.length < 2) return;\n\tconst direct = Math.hypot(target.x - source.x, target.y - source.y);\n\tif (direct <= 0) return;\n\tlet routeLen = 0;\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst a = points[i] as Point;\n\t\tconst b = points[i + 1] as Point;\n\t\trouteLen += Math.hypot(b.x - a.x, b.y - a.y);\n\t}\n\tconst threshold = maxRatio ?? 20;\n\tif (routeLen > direct * threshold) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.backtracking_excessive\",\n\t\t\tmessage: `Route length ${Math.round(routeLen)} px exceeds ${threshold}× direct distance ${Math.round(direct)} px.`,\n\t\t\tdetail: {\n\t\t\t\trouteLength: Math.round(routeLen),\n\t\t\t\tdirectDistance: Math.round(direct),\n\t\t\t\tthreshold,\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport function routeEdge(input: RouteEdgeInput): RouteEdgeResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst softObstacles = input.obstacles ?? [];\n\tconst hardObstacles = input.hardObstacles ?? [];\n\t// Best rejected path from A* routing — used as fallback when all\n\t// heuristic candidates also fail, to avoid returning a 2-point\n\t// direct connection that is always worse than a path with minor\n\t// crossings (Issue #66, root cause 3). Only hard-clear paths are stored,\n\t// and among those the one with the fewest soft-obstacle crossings wins\n\t// (Codex P2: compare across corridor/full/grid attempts, not fill-once).\n\tlet bestRejectedPath: Point[] | undefined;\n\tlet bestRejectedCrossings = Number.POSITIVE_INFINITY;\n\tconst softObstacleIndex =\n\t\tinput.obstacleIndex ?? createBoxSpatialIndex(indexedBoxes(softObstacles));\n\tconst hardObstacleIndex =\n\t\tinput.hardObstacleIndex ??\n\t\tcreateBoxSpatialIndex(indexedBoxes(hardObstacles));\n\t// Record a rejected but hard-clear finalized path, keeping the one with\n\t// the fewest soft-obstacle crossings (Issue #66, Codex P2).\n\tconst recordRejected = (candidate: Point[]): void => {\n\t\tif (routeIntersectsObstacles(candidate, hardObstacles, hardObstacleIndex)) {\n\t\t\treturn;\n\t\t}\n\t\tconst crossings = countObstacleCrossings(candidate, softObstacles);\n\t\tif (crossings < bestRejectedCrossings) {\n\t\t\tbestRejectedCrossings = crossings;\n\t\t\tbestRejectedPath = candidate;\n\t\t}\n\t};\n\tconst maxAttempts = input.maxRoutingAttempts ?? 5;\n\tconst defaultAnchors = defaultAnchorsForGeometry(\n\t\tinput.source.box,\n\t\tinput.target.box,\n\t\tinput.direction,\n\t);\n\n\tif ((input.kind ?? \"orthogonal\") === \"straight\") {\n\t\tconst source = getEdgePort(\n\t\t\tinput.source,\n\t\t\tinput.target.center,\n\t\t\tinput.sourceAnchor ?? defaultAnchors.sourceAnchor,\n\t\t);\n\t\tconst target = getEdgePort(\n\t\t\tinput.target,\n\t\t\tinput.source.center,\n\t\t\tinput.targetAnchor ?? defaultAnchors.targetAnchor,\n\t\t);\n\t\tconst points = finalizeRoute(\n\t\t\t[source, target],\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t\tsoftObstacleIndex,\n\t\t\thardObstacleIndex,\n\t\t);\n\t\tif (routeCrossesBoxes(points, hardObstacles, hardObstacleIndex)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"routing.evidence.crossing_forbidden\",\n\t\t\t\tmessage: \"Straight route crosses hard evidence block obstacles.\",\n\t\t\t});\n\t\t\treturn { points, diagnostics };\n\t\t}\n\t\tif (routeCrossesBoxes(points, softObstacles, softObstacleIndex)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\t\tmessage: \"Straight route crosses soft obstacles.\",\n\t\t\t});\n\t\t}\n\t\treturn { points, diagnostics };\n\t}\n\n\t// For obstacle-avoiding edges, try A* visibility-graph routing\n\t// first. Fall through to heuristic candidates if it fails (#39).\n\tif ((input.kind ?? \"orthogonal\") === \"obstacle-avoiding\") {\n\t\tconst endpointObstacles = endpointObstaclesForAutoAnchors(input);\n\t\tfor (const { sourceAnchor, targetAnchor } of routeAnchorPairs(\n\t\t\tinput,\n\t\t\tdefaultAnchors,\n\t\t)) {\n\t\t\tconst source = getEdgePort(\n\t\t\t\tinput.source,\n\t\t\t\tinput.target.center,\n\t\t\t\tsourceAnchor,\n\t\t\t);\n\t\t\tconst target = getEdgePort(\n\t\t\t\tinput.target,\n\t\t\t\tinput.source.center,\n\t\t\t\ttargetAnchor,\n\t\t\t);\n\t\t\t// Try corner visibility graph first (Issue #54, 方案 B).\n\t\t\t// Use margin 2 so the resulting path stays outside the\n\t\t\t// obstacle boundary and avoids tangent-touch rejections\n\t\t\t// by the loose AABB intersection check.\n\t\t\t// Corridor prefilter reduces obstacle count for the corner\n\t\t\t// graph, preventing maxCorners overflow (Issue #62).\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\tconst corridorMargin = input.corridorMargin ?? 32;\n\t\t\tconst corridorObstacles = filterObstaclesByCorridor(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tallObstacles,\n\t\t\t\t[], // endpointObstacles passed separately via options\n\t\t\t\tcorridorMargin,\n\t\t\t);\n\t\t\t// When the corridor filter removes every obstacle but the\n\t\t\t// diagram still has obstacles, an empty set makes the corner\n\t\t\t// router take its no-obstacle fast path (a diagonal source→\n\t\t\t// target segment), regressing orthogonality. Use the full set\n\t\t\t// in that case so projection vertices still yield an orthogonal\n\t\t\t// path (Codex P2).\n\t\t\tconst cornerObstacles =\n\t\t\t\tcorridorObstacles.length === 0 && allObstacles.length > 0\n\t\t\t\t\t? allObstacles\n\t\t\t\t\t: corridorObstacles;\n\t\t\t// Unified routing budget: corridor expansion, corner-vertex ceiling,\n\t\t\t// and grid-node ceiling all scale together from the actual problem\n\t\t\t// size, so a large corridor no longer overflows fixed limits\n\t\t\t// (Issue #68). Computed once here — the only call site seeing both\n\t\t\t// the corridor-filtered and full obstacle sets — and threaded\n\t\t\t// through every corner/grid attempt so the retry chain is consistent.\n\t\t\tconst budget = computeRoutingBudget(\n\t\t\t\tcornerObstacles,\n\t\t\t\tallObstacles,\n\t\t\t\tcorridorMargin,\n\t\t\t\t{ maxCorners: input.maxCorners, maxNodes: input.maxNodes },\n\t\t\t);\n\t\t\tlet cornerPath = findCornerGraphPath(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\tcornerObstacles,\n\t\t\t\t{\n\t\t\t\t\tendpointObstacles,\n\t\t\t\t\tmargin: 2,\n\t\t\t\t\tmaxCorners: budget.maxCorners,\n\t\t\t\t\tcorridorMargin,\n\t\t\t\t},\n\t\t\t\tdiagnostics,\n\t\t\t);\n\t\t\t// If corridor-filtered call failed and excluded some obstacles,\n\t\t\t// retry with the full set (mirrors grid A* full-retry pattern).\n\t\t\tif (cornerPath === null && cornerObstacles.length < allObstacles.length) {\n\t\t\t\tcornerPath = findCornerGraphPath(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\t{\n\t\t\t\t\t\tendpointObstacles,\n\t\t\t\t\t\tmargin: 2,\n\t\t\t\t\t\tmaxCorners: budget.maxCorners,\n\t\t\t\t\t\tcorridorMargin,\n\t\t\t\t\t},\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Fall back to grid A* if corner graph fails or is rejected.\n\t\t\tconst path =\n\t\t\t\tcornerPath ??\n\t\t\t\tfindObstacleFreePath(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\t{\n\t\t\t\t\t\tendpointObstacles,\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tcorridorMargin,\n\t\t\t\t\t\tmaxNodes: budget.maxNodes,\n\t\t\t\t\t},\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\tif (path !== null && path.length >= 2) {\n\t\t\t\tconst finalized = finalizeRoute(\n\t\t\t\t\tpath,\n\t\t\t\t\tsoftObstacles,\n\t\t\t\t\thardObstacles,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\thardObstacleIndex,\n\t\t\t\t);\n\t\t\t\t// Verify the A* path against the router.s AABB\n\t\t\t\t// collision contract (segmentBox with 1 px floor)\n\t\t\t\t// so we do not accept routes that the existing\n\t\t\t\t// non-A* path would reject (Codex P2).\n\t\t\t\tif (\n\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\tfinalized,\n\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t) &&\n\t\t\t\t\t!routeIntersectsObstacles(finalized, hardObstacles, hardObstacleIndex)\n\t\t\t\t) {\n\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\tfinalized,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t);\n\t\t\t\t\treturn { points: finalized, diagnostics };\n\t\t\t\t}\n\t\t\t\t// Save rejected finalized path as best-effort fallback —\n\t\t\t\t// it has minor crossings but is far better than a 2-point\n\t\t\t\t// direct connection (Issue #66). Only hard-clear paths are\n\t\t\t\t// kept, and the fewest-crossings one wins (Codex P1/P2).\n\t\t\t\trecordRejected(finalized);\n\t\t\t\t// Corner path was rejected — retry full-obstacle corner graph\n\t\t\t\t// first (it may still be under maxCorners and can route around\n\t\t\t\t// the excluded obstacle), then fall back to grid A* (Codex P2).\n\t\t\t\tif (cornerPath !== null) {\n\t\t\t\t\tconst fullCornerPath =\n\t\t\t\t\t\tcornerObstacles.length < allObstacles.length\n\t\t\t\t\t\t\t? findCornerGraphPath(\n\t\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t\tallObstacles,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tendpointObstacles,\n\t\t\t\t\t\t\t\t\t\tmargin: 2,\n\t\t\t\t\t\t\t\t\t\tmaxCorners: budget.maxCorners,\n\t\t\t\t\t\t\t\t\t\tcorridorMargin,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tif (fullCornerPath !== null && fullCornerPath.length >= 2) {\n\t\t\t\t\t\tconst fullFinalized = finalizeRoute(\n\t\t\t\t\t\t\tfullCornerPath,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\t\t\tfullFinalized,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { points: fullFinalized, diagnostics };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Record hard-clear full-retry path as fallback (Codex P2).\n\t\t\t\t\t\trecordRejected(fullFinalized);\n\t\t\t\t\t}\n\t\t\t\t\tconst gridPath = findObstacleFreePath(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tallObstacles,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tendpointObstacles,\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tcorridorMargin,\n\t\t\t\t\t\t\tmaxNodes: budget.maxNodes,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t);\n\t\t\t\t\tif (gridPath !== null && gridPath.length >= 2) {\n\t\t\t\t\t\tconst gridFinalized = finalizeRoute(\n\t\t\t\t\t\t\tgridPath,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\t\tsoftObstacleIndex,\n\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t!routeIntersectsObstacles(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\t\thardObstacleIndex,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcheckBacktracking(\n\t\t\t\t\t\t\t\tgridFinalized,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { points: gridFinalized, diagnostics };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Record hard-clear grid-retry path as fallback (Codex P2).\n\t\t\t\t\t\trecordRejected(gridFinalized);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst routeLaneObstacles = [...softObstacles, ...hardObstacles];\n\tconst anchorPairs = routeAnchorPairs(input, defaultAnchors);\n\tconst candidateRoutes = anchorPairs.flatMap(\n\t\t({ sourceAnchor, targetAnchor }) => {\n\t\t\tconst source = getEdgePort(\n\t\t\t\tinput.source,\n\t\t\t\tinput.target.center,\n\t\t\t\tsourceAnchor,\n\t\t\t);\n\t\t\tconst target = getEdgePort(\n\t\t\t\tinput.target,\n\t\t\t\tinput.source.center,\n\t\t\t\ttargetAnchor,\n\t\t\t);\n\t\t\tconst routes = [\n\t\t\t\t...orthogonalCandidates(source, target, input.direction),\n\t\t\t\t...expandedObstacleCandidates(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tinput.direction,\n\t\t\t\t\trouteLaneObstacles,\n\t\t\t\t),\n\t\t\t\t...outerDoglegCandidates(\n\t\t\t\t\tsource,\n\t\t\t\t\ttarget,\n\t\t\t\t\tinput.direction,\n\t\t\t\t\trouteLaneObstacles,\n\t\t\t\t),\n\t\t\t];\n\t\t\tconst endpointObstacles = endpointObstaclesForAutoAnchors(input);\n\t\t\treturn routes.map((points) => ({ points, endpointObstacles }));\n\t\t},\n\t);\n\tfor (const candidate of candidateRoutes) {\n\t\tif (\n\t\t\t!routeIntersectsObstacles(candidate.points, softObstacles) &&\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\tsoftObstacles,\n\t\t\t\tsoftObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\thardObstacles,\n\t\t\t\thardObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\tcandidate.points,\n\t\t\t\tcandidate.endpointObstacles,\n\t\t\t)\n\t\t) {\n\t\t\tconst finalizedClean = finalizeRoute(\n\t\t\t\tcandidate.points,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t\tsoftObstacleIndex,\n\t\t\t\thardObstacleIndex,\n\t\t\t);\n\t\t\tcheckBacktracking(\n\t\t\t\tfinalizedClean,\n\t\t\t\tcandidate.points[0] as Point,\n\t\t\t\tcandidate.points[candidate.points.length - 1] as Point,\n\t\t\t\tdiagnostics,\n\t\t\t\tinput.maxBacktrackingRatio,\n\t\t\t);\n\t\t\treturn { points: finalizedClean, diagnostics };\n\t\t}\n\t}\n\n\tconst hardClearCandidate = candidateRoutes.find(\n\t\t(candidate) =>\n\t\t\t!routeIntersectsObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\thardObstacles,\n\t\t\t\thardObstacleIndex,\n\t\t\t) &&\n\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\tcandidate.points,\n\t\t\t\tcandidate.endpointObstacles,\n\t\t\t),\n\t);\n\tif (hardClearCandidate !== undefined) {\n\t\tlet bestPoints = hardClearCandidate.points;\n\t\tif (input.kind === \"obstacle-avoiding\") {\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\t// Try greedy rerouting on all hard-clear candidates, not just the first.\n\t\t\tfor (const candidate of candidateRoutes) {\n\t\t\t\tif (\n\t\t\t\t\trouteCrossesBoxes(candidate.points, hardObstacles) ||\n\t\t\t\t\trouteIntersectsEndpointInteriors(\n\t\t\t\t\t\tcandidate.points,\n\t\t\t\t\t\tcandidate.endpointObstacles,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\t\tcandidate.points,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\t!routeCrossesBoxes(rerouted, allObstacles) &&\n\t\t\t\t\t!routeIntersectsEndpointInteriors(\n\t\t\t\t\t\trerouted,\n\t\t\t\t\t\tcandidate.endpointObstacles,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\t\trerouted,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Fall back to improving the first hard-clear candidate\n\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\tbestPoints,\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t\tconst reroutedAvoidsEndpointInteriors = !routeIntersectsEndpointInteriors(\n\t\t\t\trerouted,\n\t\t\t\thardClearCandidate.endpointObstacles,\n\t\t\t);\n\t\t\tif (reroutedAvoidsEndpointInteriors) {\n\t\t\t\tif (\n\t\t\t\t\trouteCrossesBoxes(rerouted, hardObstacles) &&\n\t\t\t\t\t!routeCrossesBoxes(bestPoints, hardObstacles)\n\t\t\t\t) {\n\t\t\t\t\t// keep original hard-clear candidate\n\t\t\t\t} else {\n\t\t\t\t\tbestPoints = rerouted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\tmessage:\n\t\t\t\t\"No bounded orthogonal route candidate avoided all soft obstacles.\",\n\t\t});\n\n\t\t// Prefer the path with fewer soft-obstacle crossings between the A*\n\t\t// rejected path and the heuristic candidate (Codex P2). Compare AFTER\n\t\t// finalization — only prefer rejected when strictly better.\n\t\tconst finalizedSoftBest = finalizeRoute(\n\t\t\tbestPoints,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t);\n\t\tlet softFallback = finalizedSoftBest;\n\t\tif (bestRejectedPath !== undefined) {\n\t\t\tconst finalizedRejected = finalizeRoute(\n\t\t\t\tbestRejectedPath,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t);\n\t\t\tconst rejectedCrossings = countObstacleCrossings(\n\t\t\t\tfinalizedRejected,\n\t\t\t\tsoftObstacles,\n\t\t\t);\n\t\t\tconst heuristicCrossings = countObstacleCrossings(\n\t\t\t\tfinalizedSoftBest,\n\t\t\t\tsoftObstacles,\n\t\t\t);\n\t\t\tif (rejectedCrossings < heuristicCrossings) {\n\t\t\t\tsoftFallback = finalizedRejected;\n\t\t\t}\n\t\t}\n\n\t\t// Run backtracking check on the chosen fallback too (Codex P2).\n\t\tcheckBacktracking(\n\t\t\tsoftFallback,\n\t\t\tsoftFallback[0] as Point,\n\t\t\tsoftFallback[softFallback.length - 1] as Point,\n\t\t\tdiagnostics,\n\t\t\tinput.maxBacktrackingRatio,\n\t\t);\n\t\treturn {\n\t\t\tpoints: softFallback,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tif (hardObstacles.length > 0) {\n\t\tlet bestPoints =\n\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors);\n\t\tif (input.kind === \"obstacle-avoiding\") {\n\t\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t\t// Try greedy rerouting on all candidates, return first clean one.\n\t\t\tfor (const candidate of candidateRoutes) {\n\t\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\t\tcandidate.points,\n\t\t\t\t\tallObstacles,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t);\n\t\t\t\tif (!routeCrossesBoxes(rerouted, allObstacles)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\t\trerouted,\n\t\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tbestPoints = greedyRerouteAroundObstacles(\n\t\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors),\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t}\n\t\t// If A* found a hard-clear path (bestRejectedPath is only ever set\n\t\t// to hard-clear routes), prefer it over a heuristic candidate that\n\t\t// crosses hard evidence obstacles (Issue #66, Codex P1).\n\t\tif (bestRejectedPath !== undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.obstacle.unavoidable\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Using A* route with minor soft-obstacle crossings to avoid hard evidence obstacles.\",\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\tbestRejectedPath,\n\t\t\t\t\tsoftObstacles,\n\t\t\t\t\thardObstacles,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t),\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"routing.evidence.crossing_forbidden\",\n\t\t\tmessage:\n\t\t\t\t\"No bounded orthogonal route candidate avoided hard evidence block obstacles.\",\n\t\t});\n\n\t\treturn {\n\t\t\tpoints: finalizeRoute(\n\t\t\t\tbestPoints,\n\t\t\t\tsoftObstacles,\n\t\t\t\thardObstacles,\n\t\t\t\tdiagnostics,\n\t\t\t),\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tlet bestPoints =\n\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors);\n\tif (input.kind === \"obstacle-avoiding\") {\n\t\tconst allObstacles = [...softObstacles, ...hardObstacles];\n\t\t// Try greedy rerouting on multiple candidates, not just the first.\n\t\tfor (const candidate of candidateRoutes) {\n\t\t\tconst rerouted = greedyRerouteAroundObstacles(\n\t\t\t\tcandidate.points,\n\t\t\t\tallObstacles,\n\t\t\t\tmaxAttempts,\n\t\t\t);\n\t\t\tif (!routeCrossesBoxes(rerouted, allObstacles)) {\n\t\t\t\treturn {\n\t\t\t\t\tpoints: finalizeRoute(\n\t\t\t\t\t\trerouted,\n\t\t\t\t\t\tsoftObstacles,\n\t\t\t\t\t\thardObstacles,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t),\n\t\t\t\t\tdiagnostics,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// Keep the best attempt from the first candidate\n\t\tbestPoints = greedyRerouteAroundObstacles(\n\t\t\tcandidateRoutes[0]?.points ?? fallbackRoute(input, defaultAnchors),\n\t\t\tallObstacles,\n\t\t\tmaxAttempts,\n\t\t);\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"routing.obstacle.unavoidable\",\n\t\tmessage: \"No bounded orthogonal route candidate avoided all obstacles.\",\n\t});\n\n\t// Prefer the path with fewer soft-obstacle crossings between the A*\n\t// rejected path and the heuristic fallback (Codex P2). Compare AFTER\n\t// finalization — finalizeRoute can expand/simplify routes to avoid\n\t// obstacles, so raw crossing counts on unfinalized paths are misleading.\n\t// Only prefer the A* path when it is strictly better after finalization.\n\tconst finalizedBestPoints = finalizeRoute(\n\t\tbestPoints,\n\t\tsoftObstacles,\n\t\thardObstacles,\n\t\tdiagnostics,\n\t);\n\tlet fallbackPoints = finalizedBestPoints;\n\tif (bestRejectedPath !== undefined) {\n\t\tconst finalizedRejected = finalizeRoute(\n\t\t\tbestRejectedPath,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t);\n\t\tconst rejectedCrossings = countObstacleCrossings(\n\t\t\tfinalizedRejected,\n\t\t\tsoftObstacles,\n\t\t);\n\t\tconst heuristicCrossings = countObstacleCrossings(\n\t\t\tfinalizedBestPoints,\n\t\t\tsoftObstacles,\n\t\t);\n\t\tif (rejectedCrossings < heuristicCrossings) {\n\t\t\tfallbackPoints = finalizedRejected;\n\t\t}\n\t}\n\n\t// Run backtracking check on the chosen fallback too (Codex P2).\n\tcheckBacktracking(\n\t\tfallbackPoints,\n\t\tfallbackPoints[0] as Point,\n\t\tfallbackPoints[fallbackPoints.length - 1] as Point,\n\t\tdiagnostics,\n\t\tinput.maxBacktrackingRatio,\n\t);\n\treturn {\n\t\tpoints: fallbackPoints,\n\t\tdiagnostics,\n\t};\n}\n\nfunction finalizeRoute(\n\tpoints: readonly Point[],\n\tsoftObstacles: readonly Box[],\n\thardObstacles: readonly Box[],\n\tdiagnostics: Diagnostic[],\n\tsoftObstacleIndex?: BoxSpatialIndex,\n\thardObstacleIndex?: BoxSpatialIndex,\n): Point[] {\n\tconst simplified = simplifyRoute(points);\n\tif (simplified.length >= 3) {\n\t\treturn simplified;\n\t}\n\tconst crossesHardObstacles = routeCrossesBoxes(\n\t\tsimplified,\n\t\thardObstacles,\n\t\thardObstacleIndex,\n\t);\n\tconst crossesSoftObstacles = routeCrossesBoxes(\n\t\tsimplified,\n\t\tsoftObstacles,\n\t\tsoftObstacleIndex,\n\t);\n\tif (!crossesHardObstacles && !crossesSoftObstacles) {\n\t\treturn simplified;\n\t}\n\tconst expanded = expandFallbackRoute(simplified, [\n\t\t...softObstacles,\n\t\t...hardObstacles,\n\t]);\n\tconst expandedCrossesHard = routeCrossesBoxes(\n\t\texpanded,\n\t\thardObstacles,\n\t\thardObstacleIndex,\n\t);\n\tconst expandedCrossesSoft = routeCrossesBoxes(\n\t\texpanded,\n\t\tsoftObstacles,\n\t\tsoftObstacleIndex,\n\t);\n\tif (expandedCrossesHard || expandedCrossesSoft) {\n\t\tdiagnostics.push({\n\t\t\tseverity: expandedCrossesHard ? \"error\" : \"warning\",\n\t\t\tcode: \"route_obstacle_fallback\",\n\t\t\tmessage:\n\t\t\t\t\"Obstacle-aware routing fell back to fewer than three route points.\",\n\t\t\tdetail: { pointCount: simplified.length },\n\t\t});\n\t}\n\treturn expanded;\n}\n\nfunction expandFallbackRoute(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): Point[] {\n\tif (points.length !== 2) {\n\t\treturn points.map((point) => ({ ...point }));\n\t}\n\tconst [source, target] = points;\n\tif (source === undefined || target === undefined) {\n\t\treturn points.map((point) => ({ ...point }));\n\t}\n\tif (source.y === target.y) {\n\t\tconst detourY = horizontalDetourLane(source, target, obstacles);\n\t\treturn [\n\t\t\t{ ...source },\n\t\t\t{ x: source.x, y: detourY },\n\t\t\t{ x: target.x, y: detourY },\n\t\t\t{ ...target },\n\t\t];\n\t}\n\tif (source.x === target.x) {\n\t\tconst detourX = verticalDetourLane(source, target, obstacles);\n\t\treturn [\n\t\t\t{ ...source },\n\t\t\t{ x: detourX, y: source.y },\n\t\t\t{ x: detourX, y: target.y },\n\t\t\t{ ...target },\n\t\t];\n\t}\n\t// Generate two L-shaped detour candidates for diagonal edges,\n\t// picking the one that avoids all obstacles with the smallest\n\t// path-length increase (issue #21 approach A).\n\tconst hv = diagonalDetourHV(source, target, obstacles);\n\tconst vh = diagonalDetourVH(source, target, obstacles);\n\t// Filter to obstacle-free candidates, preferring shorter paths.\n\tconst viable = [hv, vh].filter((c) => !routeCrossesBoxes(c, obstacles));\n\tconst [firstViable, ...remainingViable] = viable;\n\tif (firstViable !== undefined) {\n\t\tconst directLen = Math.hypot(target.x - source.x, target.y - source.y);\n\t\tlet best = firstViable;\n\t\tfor (const cand of remainingViable) {\n\t\t\tif (pathLength(cand) - directLen < pathLength(best) - directLen) {\n\t\t\t\tbest = cand;\n\t\t\t}\n\t\t}\n\t\treturn best;\n\t}\n\t// Fallback: midpoint L-shape (same as before).\n\treturn [\n\t\t{ ...source },\n\t\t{ x: (source.x + target.x) / 2, y: source.y },\n\t\t{ x: (source.x + target.x) / 2, y: target.y },\n\t\t{ ...target },\n\t];\n}\n\nfunction horizontalDetourLane(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): number {\n\tconst crossing = obstacles.filter((obstacle) =>\n\t\tsegmentIntersectsBox(source, target, obstacle),\n\t);\n\tif (crossing.length === 0) {\n\t\treturn source.y + (source.x <= target.x ? 1 : -1) * 24;\n\t}\n\tconst margin = 24;\n\tconst above = Math.min(...crossing.map((obstacle) => obstacle.y)) - margin;\n\tconst below =\n\t\tMath.max(...crossing.map((obstacle) => obstacle.y + obstacle.height)) +\n\t\tmargin;\n\treturn Math.abs(above - source.y) <= Math.abs(below - source.y)\n\t\t? above\n\t\t: below;\n}\n\nfunction verticalDetourLane(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): number {\n\tconst crossing = obstacles.filter((obstacle) =>\n\t\tsegmentIntersectsBox(source, target, obstacle),\n\t);\n\tif (crossing.length === 0) {\n\t\treturn source.x + (source.y <= target.y ? 1 : -1) * 24;\n\t}\n\tconst margin = 24;\n\tconst left = Math.min(...crossing.map((obstacle) => obstacle.x)) - margin;\n\tconst right =\n\t\tMath.max(...crossing.map((obstacle) => obstacle.x + obstacle.width)) +\n\t\tmargin;\n\treturn Math.abs(left - source.x) <= Math.abs(right - source.x) ? left : right;\n}\n\nfunction diagonalDetourHV(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): Point[] {\n\tconst detourY = horizontalDetourLane(source, target, obstacles);\n\treturn [\n\t\t{ ...source },\n\t\t{ x: source.x, y: detourY },\n\t\t{ x: target.x, y: detourY },\n\t\t{ ...target },\n\t];\n}\n\nfunction diagonalDetourVH(\n\tsource: Point,\n\ttarget: Point,\n\tobstacles: readonly Box[],\n): Point[] {\n\tconst detourX = verticalDetourLane(source, target, obstacles);\n\treturn [\n\t\t{ ...source },\n\t\t{ x: detourX, y: source.y },\n\t\t{ x: detourX, y: target.y },\n\t\t{ ...target },\n\t];\n}\n\nfunction pathLength(points: readonly Point[]): number {\n\tlet len = 0;\n\tfor (let i = 1; i < points.length; i += 1) {\n\t\tconst a = points[i - 1];\n\t\tconst b = points[i];\n\t\tif (a !== undefined && b !== undefined) {\n\t\t\tlen += Math.hypot(b.x - a.x, b.y - a.y);\n\t\t}\n\t}\n\treturn len;\n}\n\nfunction endpointObstaclesForAutoAnchors(input: RouteEdgeInput): Box[] {\n\tconst boxes: Box[] = [];\n\tif (input.sourceAnchor === undefined && hasDistinctAnchors(input.source)) {\n\t\tboxes.push(insetBox(input.source.box, 1));\n\t}\n\tif (input.targetAnchor === undefined && hasDistinctAnchors(input.target)) {\n\t\tboxes.push(insetBox(input.target.box, 1));\n\t}\n\treturn boxes.filter((box) => box.width > 0 && box.height > 0);\n}\n\nfunction hasDistinctAnchors(geometry: RouteEdgeInput[\"source\"]): boolean {\n\tconst points = new Set(\n\t\tgeometry.anchors.map((anchor) => `${anchor.point.x},${anchor.point.y}`),\n\t);\n\treturn points.size > 1;\n}\n\nfunction insetBox(box: Box, margin: number): Box {\n\treturn {\n\t\tx: box.x + margin,\n\t\ty: box.y + margin,\n\t\twidth: box.width - margin * 2,\n\t\theight: box.height - margin * 2,\n\t};\n}\n\n/**\n * Iteratively pushes route segments away from intersecting obstacles,\n * up to maxIterations times. Returns the improved route (may still\n * cross obstacles if avoidance was not possible).\n */\nfunction greedyRerouteAroundObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tmaxIterations: number,\n): Point[] {\n\tlet current = [...points];\n\tfor (let iter = 0; iter < maxIterations; iter++) {\n\t\tconst improved = pushRouteAwayFromObstacles(current, obstacles);\n\t\tif (improved === null) {\n\t\t\tbreak; // no improvements possible\n\t\t}\n\t\tcurrent = improved;\n\t\tif (!routeCrossesBoxes(current, obstacles)) {\n\t\t\tbreak; // route is clean\n\t\t}\n\t}\n\treturn current;\n}\n\n/**\n * Tries to push each segment of the route away from intersecting obstacles.\n * Returns a new route with waypoints inserted, or null if no push was possible.\n */\nfunction pushRouteAwayFromObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): Point[] | null {\n\tconst result: Point[] = [];\n\tlet improved = false;\n\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tresult.push(a ?? b ?? { x: 0, y: 0 });\n\t\t\tcontinue;\n\t\t}\n\t\tresult.push(a);\n\n\t\tconst intersectors = obstacles.filter((obs) =>\n\t\t\tsegmentIntersectsBox(a, b, obs),\n\t\t);\n\t\tif (intersectors.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Find the obstacle whose edge is closest to the segment midpoint.\n\t\tconst mx = (a.x + b.x) / 2;\n\t\tconst my = (a.y + b.y) / 2;\n\t\tconst isHorizontal = a.y === b.y;\n\t\tconst margin = 12;\n\n\t\tlet bestWaypoint: Point | null = null;\n\t\tlet bestDist = Infinity;\n\n\t\tfor (const obs of intersectors) {\n\t\t\t// Try escaping above/below (for horizontal segments) or left/right (for vertical)\n\t\t\tconst candidates: Point[] = isHorizontal\n\t\t\t\t? [\n\t\t\t\t\t\t{ x: mx, y: obs.y - margin },\n\t\t\t\t\t\t{ x: mx, y: obs.y + obs.height + margin },\n\t\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\t\t{ x: obs.x - margin, y: my },\n\t\t\t\t\t\t{ x: obs.x + obs.width + margin, y: my },\n\t\t\t\t\t];\n\n\t\t\tfor (const wp of candidates) {\n\t\t\t\tconst dist = Math.hypot(wp.x - mx, wp.y - my);\n\t\t\t\tif (dist < bestDist) {\n\t\t\t\t\tbestDist = dist;\n\t\t\t\t\tbestWaypoint = wp;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (bestWaypoint !== null) {\n\t\t\tresult.push(bestWaypoint);\n\t\t\timproved = true;\n\t\t}\n\t}\n\n\tconst last = points[points.length - 1];\n\tif (last !== undefined) {\n\t\tresult.push(last);\n\t}\n\n\treturn improved ? result : null;\n}\n\nfunction fallbackRoute(\n\tinput: RouteEdgeInput,\n\tdefaultAnchors: { sourceAnchor: AnchorName; targetAnchor: AnchorName },\n): Point[] {\n\treturn [\n\t\tgetEdgePort(\n\t\t\tinput.source,\n\t\t\tinput.target.center,\n\t\t\tinput.sourceAnchor ?? defaultAnchors.sourceAnchor,\n\t\t),\n\t\tgetEdgePort(\n\t\t\tinput.target,\n\t\t\tinput.source.center,\n\t\t\tinput.targetAnchor ?? defaultAnchors.targetAnchor,\n\t\t),\n\t];\n}\n\nfunction routeAnchorPairs(\n\tinput: RouteEdgeInput,\n\tdefaultAnchors: { sourceAnchor: AnchorName; targetAnchor: AnchorName },\n): Array<{ sourceAnchor: AnchorName; targetAnchor: AnchorName }> {\n\tconst sourceAnchors = routeAnchorCandidates(\n\t\tinput.sourceAnchor,\n\t\tdefaultAnchors.sourceAnchor,\n\t\tinput.source,\n\t\tinput.target.center,\n\t);\n\tconst targetAnchors = routeAnchorCandidates(\n\t\tinput.targetAnchor,\n\t\tdefaultAnchors.targetAnchor,\n\t\tinput.target,\n\t\tinput.source.center,\n\t);\n\tconst pairs = sourceAnchors.flatMap((sourceAnchor) =>\n\t\ttargetAnchors.map((targetAnchor) => ({ sourceAnchor, targetAnchor })),\n\t);\n\tconst seen = new Set<string>();\n\treturn pairs.filter((pair) => {\n\t\tconst key = `${pair.sourceAnchor}->${pair.targetAnchor}`;\n\t\tif (seen.has(key)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(key);\n\t\treturn true;\n\t});\n}\n\nfunction routeAnchorCandidates(\n\texplicitAnchor: AnchorName | undefined,\n\tdefaultAnchor: AnchorName,\n\tgeometry: RouteEdgeInput[\"source\"],\n\ttoward: Point,\n): AnchorName[] {\n\tif (explicitAnchor !== undefined) {\n\t\treturn [explicitAnchor];\n\t}\n\tconst ranked = rankedSideAnchors(geometry, toward);\n\treturn [defaultAnchor, ...ranked].filter(\n\t\t(anchor, index, anchors) => anchors.indexOf(anchor) === index,\n\t);\n}\n\nfunction rankedSideAnchors(\n\tgeometry: RouteEdgeInput[\"source\"],\n\ttoward: Point,\n): AnchorName[] {\n\tconst anchors = outwardSideAnchors(geometry.box, toward);\n\treturn anchors.sort((left, right) => {\n\t\tconst leftPoint = getEdgePort(geometry, toward, left);\n\t\tconst rightPoint = getEdgePort(geometry, toward, right);\n\t\tconst distance =\n\t\t\tsquaredDistance(leftPoint, toward) - squaredDistance(rightPoint, toward);\n\t\treturn distance === 0 ? left.localeCompare(right) : distance;\n\t});\n}\n\nfunction outwardSideAnchors(box: Box, toward: Point): AnchorName[] {\n\tconst center = {\n\t\tx: box.x + box.width / 2,\n\t\ty: box.y + box.height / 2,\n\t};\n\tconst dx = toward.x - center.x;\n\tconst dy = toward.y - center.y;\n\tif (Math.abs(dx) >= Math.abs(dy)) {\n\t\treturn dx >= 0 ? [\"right\", \"top\", \"bottom\"] : [\"left\", \"top\", \"bottom\"];\n\t}\n\treturn dy >= 0 ? [\"bottom\", \"left\", \"right\"] : [\"top\", \"left\", \"right\"];\n}\n\nfunction squaredDistance(a: Point, b: Point): number {\n\tconst dx = a.x - b.x;\n\tconst dy = a.y - b.y;\n\treturn dx * dx + dy * dy;\n}\n\nexport function simplifyRoute(points: readonly Point[]): Point[] {\n\tconst withoutDuplicates: Point[] = [];\n\tfor (const point of points) {\n\t\tconst previous = withoutDuplicates.at(-1);\n\t\tif (\n\t\t\tprevious === undefined ||\n\t\t\tprevious.x !== point.x ||\n\t\t\tprevious.y !== point.y\n\t\t) {\n\t\t\twithoutDuplicates.push({ ...point });\n\t\t}\n\t}\n\n\tconst simplified: Point[] = [];\n\tfor (const point of withoutDuplicates) {\n\t\tconst previous = simplified.at(-1);\n\t\tconst beforePrevious = simplified.at(-2);\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tbeforePrevious !== undefined &&\n\t\t\tareCollinear(beforePrevious, previous, point)\n\t\t) {\n\t\t\tsimplified[simplified.length - 1] = { ...point };\n\t\t} else {\n\t\t\tsimplified.push({ ...point });\n\t\t}\n\t}\n\n\treturn simplified;\n}\n\nfunction orthogonalCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n): Point[][] {\n\tconst midpointX = (source.x + target.x) / 2;\n\tconst midpointY = (source.y + target.y) / 2;\n\tconst candidates: Point[][] = [];\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tcandidates.push([\n\t\t\tsource,\n\t\t\t{ x: source.x, y: midpointY },\n\t\t\t{ x: target.x, y: midpointY },\n\t\t\ttarget,\n\t\t]);\n\t} else {\n\t\tcandidates.push([\n\t\t\tsource,\n\t\t\t{ x: midpointX, y: source.y },\n\t\t\t{ x: midpointX, y: target.y },\n\t\t\ttarget,\n\t\t]);\n\t}\n\n\tcandidates.push(\n\t\t[source, { x: target.x, y: source.y }, target],\n\t\t[source, { x: source.x, y: target.y }, target],\n\t);\n\n\treturn candidates;\n}\n\nfunction defaultSourceAnchor(direction: DiagramDirection): AnchorName {\n\tswitch (direction) {\n\t\tcase \"LR\":\n\t\t\treturn \"right\";\n\t\tcase \"RL\":\n\t\t\treturn \"left\";\n\t\tcase \"TB\":\n\t\t\treturn \"bottom\";\n\t\tcase \"BT\":\n\t\t\treturn \"top\";\n\t}\n}\n\nfunction defaultAnchorsForGeometry(\n\tsource: Box,\n\ttarget: Box,\n\tdirection: DiagramDirection,\n): { sourceAnchor: AnchorName; targetAnchor: AnchorName } {\n\tconst dx = target.x + target.width / 2 - (source.x + source.width / 2);\n\tconst dy = target.y + target.height / 2 - (source.y + source.height / 2);\n\n\tif (Math.abs(dy) > Math.abs(dx)) {\n\t\treturn dy >= 0\n\t\t\t? { sourceAnchor: \"bottom\", targetAnchor: \"top\" }\n\t\t\t: { sourceAnchor: \"top\", targetAnchor: \"bottom\" };\n\t}\n\n\tif (Math.abs(dx) > 0) {\n\t\treturn dx >= 0\n\t\t\t? { sourceAnchor: \"right\", targetAnchor: \"left\" }\n\t\t\t: { sourceAnchor: \"left\", targetAnchor: \"right\" };\n\t}\n\n\treturn {\n\t\tsourceAnchor: defaultSourceAnchor(direction),\n\t\ttargetAnchor: defaultTargetAnchor(direction),\n\t};\n}\n\nfunction defaultTargetAnchor(direction: DiagramDirection): AnchorName {\n\tswitch (direction) {\n\t\tcase \"LR\":\n\t\t\treturn \"left\";\n\t\tcase \"RL\":\n\t\t\treturn \"right\";\n\t\tcase \"TB\":\n\t\t\treturn \"top\";\n\t\tcase \"BT\":\n\t\t\treturn \"bottom\";\n\t}\n}\n\nfunction expandedObstacleCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n\tobstacles: readonly Box[],\n): Point[][] {\n\tif (obstacles.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst margin = 16;\n\tconst candidates: Point[][] = [];\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tconst lanes = sortedUniqueLanes(\n\t\t\tobstacles.flatMap((obstacle) => [\n\t\t\t\tobstacle.x - margin,\n\t\t\t\tobstacle.x + obstacle.width + margin,\n\t\t\t]),\n\t\t\t(source.x + target.x) / 2,\n\t\t);\n\n\t\tfor (const laneX of lanes) {\n\t\t\tcandidates.push([\n\t\t\t\tsource,\n\t\t\t\t{ x: laneX, y: source.y },\n\t\t\t\t{ x: laneX, y: target.y },\n\t\t\t\ttarget,\n\t\t\t]);\n\t\t}\n\t} else {\n\t\tconst lanes = sortedUniqueLanes(\n\t\t\tobstacles.flatMap((obstacle) => [\n\t\t\t\tobstacle.y - margin,\n\t\t\t\tobstacle.y + obstacle.height + margin,\n\t\t\t]),\n\t\t\t(source.y + target.y) / 2,\n\t\t);\n\n\t\tfor (const laneY of lanes) {\n\t\t\tcandidates.push([\n\t\t\t\tsource,\n\t\t\t\t{ x: source.x, y: laneY },\n\t\t\t\t{ x: target.x, y: laneY },\n\t\t\t\ttarget,\n\t\t\t]);\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction outerDoglegCandidates(\n\tsource: Point,\n\ttarget: Point,\n\tdirection: RouteEdgeInput[\"direction\"],\n\tobstacles: readonly Box[],\n): Point[][] {\n\tif (obstacles.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst margin = 24;\n\tconst minX = Math.min(...obstacles.map((obstacle) => obstacle.x)) - margin;\n\tconst maxX =\n\t\tMath.max(...obstacles.map((obstacle) => obstacle.x + obstacle.width)) +\n\t\tmargin;\n\tconst minY = Math.min(...obstacles.map((obstacle) => obstacle.y)) - margin;\n\tconst maxY =\n\t\tMath.max(...obstacles.map((obstacle) => obstacle.y + obstacle.height)) +\n\t\tmargin;\n\n\tif (direction === \"TB\" || direction === \"BT\") {\n\t\tconst exit = exitDelta(source, target, \"y\");\n\t\treturn sortedUniqueLanes([minX, maxX], (source.x + target.x) / 2).map(\n\t\t\t(laneX) => [\n\t\t\t\tsource,\n\t\t\t\t{ x: source.x, y: source.y + exit },\n\t\t\t\t{ x: laneX, y: source.y + exit },\n\t\t\t\t{ x: laneX, y: target.y - exit },\n\t\t\t\t{ x: target.x, y: target.y - exit },\n\t\t\t\ttarget,\n\t\t\t],\n\t\t);\n\t}\n\n\tconst exit = exitDelta(source, target, \"x\");\n\treturn sortedUniqueLanes([minY, maxY], (source.y + target.y) / 2).map(\n\t\t(laneY) => [\n\t\t\tsource,\n\t\t\t{ x: source.x + exit, y: source.y },\n\t\t\t{ x: source.x + exit, y: laneY },\n\t\t\t{ x: target.x - exit, y: laneY },\n\t\t\t{ x: target.x - exit, y: target.y },\n\t\t\ttarget,\n\t\t],\n\t);\n}\n\nfunction exitDelta(source: Point, target: Point, axis: \"x\" | \"y\"): number {\n\tconst delta = axis === \"x\" ? target.x - source.x : target.y - source.y;\n\treturn (delta >= 0 ? 1 : -1) * 24;\n}\n\nfunction sortedUniqueLanes(\n\tlanes: readonly number[],\n\tmidpoint: number,\n): number[] {\n\treturn [...new Set(lanes)]\n\t\t.filter((lane) => Number.isFinite(lane))\n\t\t.sort((left, right) => {\n\t\t\tconst distance = Math.abs(left - midpoint) - Math.abs(right - midpoint);\n\t\t\treturn distance === 0 ? left - right : distance;\n\t\t});\n}\n\nfunction routeIntersectsObstacles(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tspatialIndex?: BoxSpatialIndex,\n): boolean {\n\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\tconst a = points[pointIndex];\n\t\tconst b = points[pointIndex + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = segmentBox(a, b);\n\t\tfor (const obstacle of candidateBoxesForSegment(\n\t\t\tobstacles,\n\t\t\ta,\n\t\t\tb,\n\t\t\tspatialIndex,\n\t\t)) {\n\t\t\tvalidateBox(obstacle);\n\t\t\tif (intersectsAabb(segment, obstacle)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n// Count how many distinct obstacles a route crosses — used to compare\n// rejected A* fallback paths and keep the one with the fewest crossings\n// (Issue #66, Codex P2).\nfunction countObstacleCrossings(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n): number {\n\tlet count = 0;\n\tfor (const obstacle of obstacles) {\n\t\tvalidateBox(obstacle);\n\t\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\t\tconst a = points[pointIndex];\n\t\t\tconst b = points[pointIndex + 1];\n\t\t\tif (a === undefined || b === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (intersectsAabb(segmentBox(a, b), obstacle)) {\n\t\t\t\tcount += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\n\nfunction routeIntersectsEndpointInteriors(\n\tpoints: readonly Point[],\n\tendpointInteriors: readonly Box[],\n): boolean {\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst a = points[index];\n\t\tconst b = points[index + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = segmentBox(a, b);\n\t\tfor (const endpointInterior of endpointInteriors) {\n\t\t\tvalidateBox(endpointInterior);\n\t\t\tif (intersectsAabb(segment, endpointInterior)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction routeCrossesBoxes(\n\tpoints: readonly Point[],\n\tobstacles: readonly Box[],\n\tspatialIndex?: BoxSpatialIndex,\n): boolean {\n\tfor (let pointIndex = 0; pointIndex < points.length - 1; pointIndex += 1) {\n\t\tconst a = points[pointIndex];\n\t\tconst b = points[pointIndex + 1];\n\t\tif (a === undefined || b === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const obstacle of candidateBoxesForSegment(\n\t\t\tobstacles,\n\t\t\ta,\n\t\t\tb,\n\t\t\tspatialIndex,\n\t\t)) {\n\t\t\tvalidateBox(obstacle);\n\t\t\tif (segmentIntersectsBox(a, b, obstacle)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction candidateBoxesForSegment(\n\tobstacles: readonly Box[],\n\tstart: Point,\n\tend: Point,\n\tindex: BoxSpatialIndex | undefined,\n): readonly Box[] {\n\treturn index === undefined\n\t\t? obstacles\n\t\t: querySegmentSpatialIndex(index, start, end).map((entry) => entry.box);\n}\n\nfunction indexedBoxes(\n\tobstacles: readonly Box[],\n): Array<{ id: string; box: Box }> {\n\treturn obstacles.map((box, index) => ({ id: `obstacle:${index}`, box }));\n}\n\nfunction segmentIntersectsBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tif (pointInsideBox(start, box) || pointInsideBox(end, box)) {\n\t\treturn true;\n\t}\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\treturn (\n\t\tsegmentIntersectsBoxEdge(start, end, left, top, right, top) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, top, right, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, bottom, left, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideBox(point: Point, box: Box): boolean {\n\treturn (\n\t\tpoint.x > box.x &&\n\t\tpoint.x < box.x + box.width &&\n\t\tpoint.y > box.y &&\n\t\tpoint.y < box.y + box.height\n\t);\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentIntersectsBoxEdge(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) {\n\t\treturn false;\n\t}\n\tconst t =\n\t\t((x1 - start.x) * (y2 - y1) - (y1 - start.y) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((x1 - start.x) * (end.y - start.y) - (y1 - start.y) * (end.x - start.x)) /\n\t\tdenominator;\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\nfunction segmentBox(a: Point, b: Point): Box {\n\tconst minX = Math.min(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: Math.max(1, Math.abs(a.x - b.x)),\n\t\theight: Math.max(1, Math.abs(a.y - b.y)),\n\t};\n}\n\nfunction areCollinear(a: Point, b: Point, c: Point): boolean {\n\treturn (a.x === b.x && b.x === c.x) || (a.y === b.y && b.y === c.y);\n}\n","import { applyLayoutConstraints } from \"../constraints/index.js\";\nimport {\n\tDEFAULT_FONT,\n\tDEFAULT_LABEL_MAX_WIDTH,\n\tDEFAULT_NODE_MIN_SIZE,\n\tDEFAULT_NODE_PADDING,\n} from \"../dsl/normalize.js\";\nimport { computeArrowhead } from \"../exporters/arrow.js\";\nimport {\n\tcomputeContainerGeometry,\n\tcomputeShapeGeometry,\n\tcreateBoxSpatialIndex,\n\texpandBox,\n\texpandBoxForQuery,\n\tintersectsAabb,\n\tnormalizeInsets,\n\tqueryBoxSpatialIndex,\n\tunionBoxes,\n} from \"../geometry/index.js\";\nimport type { Constraint } from \"../ir/constraints.js\";\nimport {\n\tDELIVERABILITY_DIAGNOSTIC_CODES,\n\ttype Diagnostic,\n} from \"../ir/diagnostics.js\";\nimport type { CoordinatedDiagram, NormalizedDiagram } from \"../ir/diagram.js\";\nimport type {\n\tCoordinatedEdge,\n\tCoordinatedEvidencePanel,\n\tCoordinatedFrame,\n\tCoordinatedGroup,\n\tCoordinatedMatrixBlock,\n\tCoordinatedNode,\n\tCoordinatedPort,\n\tCoordinatedTableBlock,\n\tEvidencePanel,\n\tEvidenceTextLayout,\n\tMatrixBlock,\n\tNormalizedEdge,\n\tNormalizedGroup,\n\tNormalizedNode,\n\tSwimlane,\n\tSwimlaneLane,\n\tTableBlock,\n\tVisualStyle,\n} from \"../ir/elements.js\";\nimport type { Box, Insets, Point, Size } from \"../ir/geometry.js\";\nimport type {\n\tLabelLayout,\n\tSolvedTextAnnotation,\n\tTextSurfaceKind,\n} from \"../ir/label-layout.js\";\nimport { fitLabel } from \"../labels/index.js\";\nimport {\n\ttype InitialLayoutResult,\n\trunComponentAwareDagreInitialLayout,\n\trunDagreInitialLayout,\n} from \"../layout/index.js\";\nimport { runRecursiveContainerLayout } from \"../layout/recursive.js\";\nimport { type RouteKind, routeEdge } from \"../routing/index.js\";\nimport { createDefaultTextMeasurer } from \"../text/index.js\";\nimport type { TextMeasurer, TextStyleOptions } from \"../text/types.js\";\nimport { LayoutPipeline } from \"./pipeline/pipeline.js\";\nimport { scoreLayoutQuality } from \"./pipeline/quality.js\";\nimport type { LayoutState } from \"./pipeline/types.js\";\n\nexport type InitialLayoutMode = \"dagre\" | \"positions\";\n\nexport interface SolveDiagramOptions {\n\t/** Selects the seed coordinates before constraints, routing, and export. */\n\tinitialLayout?: InitialLayoutMode;\n\t/** When true, use recursive bottom-up layout for container groups (Issue #54, 方案 A). */\n\trecursiveLayout?: boolean;\n\trouteKind?: RouteKind;\n\tobstacleMargin?: number | Insets;\n\t/** When true, compute quality score after solving (Issue #54, 方案 E). */\n\tqualityScore?: boolean;\n\t/** Extra horizontal/vertical clearance reserved around nodes for edge corridors. */\n\troutingGutter?: number;\n\toverlapSpacing?: number;\n\tminLaneGutter?: number;\n\tprefitLabelSize?: boolean;\n\tminSiblingGap?: number;\n\tdistributeContainedChildren?: boolean | \"spread\";\n\t/** When \"spread\", distribute children within non-contract swimlane\n\t * lanes (Issue #60). Opt-in: no redistribution occurs unless explicitly set. */\n\tdistributeSwimlaneChildren?: boolean | \"spread\";\n\tpageBounds?: { width: number; height: number };\n\tmaxStackDepth?: number;\n\tpreferredAspectRatio?: number;\n\t/** Target aspect ratio (width/height). When bounds exceed\n\t * target*3, nodes are rewrapped (Issue #60). */\n\ttargetAspectRatio?: number;\n\t/** Max nodes per row for TB/BT horizontal-rewrap (Issue #60). */\n\tmaxRowDepth?: number;\n\tportShifting?: PortShiftingOptions;\n\tcjkFontFamily?: string | false;\n\tminCjkFontSize?: number | false;\n\ttextMeasurer?: TextMeasurer;\n\t/** When true, promote deliverability-breaking diagnostics to errors. */\n\tstrict?: boolean;\n\t/** Maximum greedy rerouting iterations per edge (default 5). */\n\tmaxRoutingAttempts?: number;\n\t/** Edge label placement mode: \"beside\" offsets away from the edge, \"on-path\" (default) places at the midpoint. */\n\tlabelPlacement?: \"beside\" | \"on-path\";\n\t/** Pixels to offset edge labels from the edge path when labelPlacement is \"beside\". */\n\tlabelOffset?: number;\n\t/** Corridor expansion margin for corner-graph prefilter.\n\t * - number: fixed px margin\n\t * - \"auto\" (default): max(200, contentDiagonal * 0.3)\n\t * Larger margins include more obstacles in the local routing window,\n\t * improving path quality on dense diagrams at the cost of more vertices. */\n\tcorridorMargin?: number | \"auto\";\n\t/** Route-length / direct-distance ratio above which a backtracking\n\t * warning is emitted (default 20). */\n\tmaxBacktrackingRatio?: number;\n}\n\nexport interface PortShiftingOptions {\n\tenabled?: boolean;\n\tspacing?: number;\n}\n\nconst DEFAULT_MATRIX_CELL_SIZE: Size = { width: 120, height: 36 };\nconst DEFAULT_TABLE_CELL_SIZE: Size = { width: 128, height: 34 };\nconst DEFAULT_PANEL_WIDTH = 320;\nconst DEFAULT_PANEL_ITEM_HEIGHT = 28;\nconst DEFAULT_EVIDENCE_BLOCK_GAP = 24;\nconst EDGE_LABEL_CLEARANCE = 8;\nconst DEFAULT_CJK_FONT_FAMILY = \"YaHei,SimSun,sans-serif\";\nconst DEFAULT_MIN_CJK_FONT_SIZE = 14;\n// Reuse DSL defaults — these are the same values as DEFAULT_FONT,\n// DEFAULT_NODE_PADDING, DEFAULT_NODE_MIN_SIZE, DEFAULT_LABEL_MAX_WIDTH\n// imported from normalize.ts above.\nfunction prefitLabelFont(\n\tnode: NormalizedNode,\n\t_options: SolveDiagramOptions,\n): TextStyleOptions {\n\tconst cjk = labelCjkTypography(node.label?.metadata);\n\tconst fontFamily = cjk.fontFamily ?? DEFAULT_FONT.fontFamily;\n\tconst fontSize = cjk.fontSize ?? DEFAULT_FONT.fontSize;\n\tconst lineHeight =\n\t\tfontSize !== DEFAULT_FONT.fontSize\n\t\t\t? Math.max(DEFAULT_FONT.lineHeight ?? 18, fontSize * 1.2)\n\t\t\t: (DEFAULT_FONT.lineHeight ?? 18);\n\treturn { fontFamily, fontSize, lineHeight };\n}\n\nconst EVIDENCE_TEXT_FONT = {\n\tfontFamily: \"Arial, sans-serif\",\n\tfontSize: 10,\n\tlineHeight: 12,\n} as const;\n\ninterface SwimlaneContractLayout {\n\tbox: Box;\n\tslotWidth: number;\n\tslotHeight: number;\n\tlaneStep: number;\n}\n\ninterface SwimlaneContractResult {\n\tlayouts: Map<string, SwimlaneContractLayout>;\n\tdiagnostics: Diagnostic[];\n\tmovedChildIds: Set<string>;\n}\n\ninterface LayoutLockLike {\n\tnodeId: string;\n\tsource: string;\n}\n\ninterface CjkTypographyOptions {\n\tfontFamily?: string;\n\tminFontSize?: number;\n}\n\ninterface CjkTypography {\n\tfontFamily?: string;\n\tfontSize?: number;\n}\n\nexport function solveDiagram(\n\tdiagram: NormalizedDiagram,\n\toptions: SolveDiagramOptions = {},\n): CoordinatedDiagram {\n\tconst diagnostics: Diagnostic[] = [...diagram.diagnostics];\n\tconst nodes = stableUniqueById(\n\t\tdiagram.nodes,\n\t\tdiagnostics,\n\t\t\"nodes\",\n\t\t\"duplicate_node_id\",\n\t);\n\tconst edges = stableUniqueById(\n\t\tdiagram.edges,\n\t\tdiagnostics,\n\t\t\"edges\",\n\t\t\"duplicate_edge_id\",\n\t);\n\tconst groups = stableUniqueById(\n\t\tdiagram.groups,\n\t\tdiagnostics,\n\t\t\"groups\",\n\t\t\"duplicate_group_id\",\n\t);\n\tconst cjkTypography = createCjkTypographyOptions(options);\n\tconst cjkStyledNodes = nodes.map((node) =>\n\t\tenhanceNodeCjkTypography(node, cjkTypography, diagnostics),\n\t);\n\tconst styledNodes =\n\t\toptions.prefitLabelSize === true\n\t\t\t? cjkStyledNodes.map((node) =>\n\t\t\t\t\tprefitNodeLabelSize(node, options, diagnostics),\n\t\t\t\t)\n\t\t\t: cjkStyledNodes;\n\tconst styledEdges = edges.map((edge) =>\n\t\tenhanceEdgeCjkTypography(edge, cjkTypography, diagnostics),\n\t);\n\tconst styledGroups = groups.map((group) =>\n\t\tenhanceGroupCjkTypography(group, cjkTypography, diagnostics),\n\t);\n\tconst styledSwimlanes = (diagram.swimlanes ?? []).map((swimlane) =>\n\t\tenhanceSwimlaneCjkTypography(swimlane, cjkTypography, diagnostics),\n\t);\n\tconst constraints = stableByConstraintId(diagram.constraints);\n\tconst initialLayoutMode = options.initialLayout ?? \"dagre\";\n\tconst useRecursive = options.recursiveLayout === true;\n\tif (useRecursive && initialLayoutMode === \"positions\") {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"layout.recursive-ignores-positions\",\n\t\t\tmessage:\n\t\t\t\t'recursiveLayout overrides initialLayout \"positions\" — seed positions are ignored for bottom-up container layout.',\n\t\t});\n\t}\n\tconst layout = useRecursive\n\t\t? runRecursiveContainerLayout({\n\t\t\t\tdirection: diagram.direction,\n\t\t\t\tnodes: styledNodes,\n\t\t\t\tgroups: styledGroups,\n\t\t\t\tedges: styledEdges,\n\t\t\t\tconstraints,\n\t\t\t})\n\t\t: runInitialLayout({\n\t\t\t\tmode: initialLayoutMode,\n\t\t\t\tcomponentAware: options.maxStackDepth === undefined,\n\t\t\t\tdirection: diagram.direction,\n\t\t\t\tnodes: styledNodes,\n\t\t\t\tedges: styledEdges,\n\t\t\t});\n\n\tdiagnostics.push(...layout.diagnostics);\n\tconst initialNodeBoxes =\n\t\tinitialLayoutMode === \"positions\" ||\n\t\t(diagram.direction !== \"LR\" && diagram.direction !== \"RL\")\n\t\t\t? layout.boxes\n\t\t\t: wrapVerticalStackIfNeeded(\n\t\t\t\t\tlayout.boxes,\n\t\t\t\t\tstyledNodes,\n\t\t\t\t\tstyledEdges,\n\t\t\t\t\tdiagram.direction,\n\t\t\t\t\toptions,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\n\t// Horizontal rewrap for TB/BT layouts (Issue #60).\n\tif (\n\t\t(diagram.direction === \"TB\" || diagram.direction === \"BT\") &&\n\t\t(options.maxRowDepth !== undefined ||\n\t\t\toptions.targetAspectRatio !== undefined)\n\t) {\n\t\tconst diagCountBefore = diagnostics.length;\n\t\tconst rewrapped = wrapHorizontalStackIfNeeded(\n\t\t\tinitialNodeBoxes,\n\t\t\tstyledNodes,\n\t\t\tdiagram.direction,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\tfor (const [id, box] of rewrapped) {\n\t\t\tinitialNodeBoxes.set(id, box);\n\t\t}\n\t\t// Only clear position fields when the rewrap actually executed\n\t\t// (horizontal_runaway diagnostic was emitted).\n\t\tif (diagnostics.length > diagCountBefore) {\n\t\t\tfor (const node of styledNodes) {\n\t\t\t\tif (node.position !== undefined && rewrapped.has(node.id)) {\n\t\t\t\t\tconst rwBox = rewrapped.get(node.id)!;\n\t\t\t\t\t// Clone node before setting position to avoid mutating\n\t\t\t\t\t// caller diagram.nodes (Issue #61 codex P2).\n\t\t\t\t\tconst idx = styledNodes.indexOf(node);\n\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\tstyledNodes[idx] = {\n\t\t\t\t\t\t\t...node,\n\t\t\t\t\t\t\tposition: { x: rwBox.x, y: rwBox.y },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// When using recursive layout, pre-populate group boxes from\n\t// bottom-up layout so downstream coordinateGroups does not\n\t// recompute them from scratch.\n\tif (useRecursive && \"groupBoxes\" in layout) {\n\t\tconst recursiveLayout =\n\t\t\tlayout as import(\"../layout/recursive.js\").RecursiveLayoutResult;\n\t\tfor (const [groupId, groupBox] of recursiveLayout.groupBoxes) {\n\t\t\tinitialNodeBoxes.set(groupId, groupBox);\n\t\t}\n\t}\n\n\t// Expand node boxes for port capacity before constraint solving\n\t// so containment, overlap repair, and swimlane contracts see the\n\t// final sizes (Codex P2: avoid post-hoc expansion issues).\n\texpandNodeBoxesForPorts(styledNodes, initialNodeBoxes, options, diagnostics);\n\n\tconst constrained = applyLayoutConstraints({\n\t\tdirection: diagram.direction,\n\t\toverlapSpacing: options?.overlapSpacing ?? 40,\n\t\t...(options.minSiblingGap === undefined\n\t\t\t? {}\n\t\t\t: { minSiblingGap: options.minSiblingGap }),\n\t\tdistributeContainedChildren: options.distributeContainedChildren ?? true,\n\t\t...(options.distributeSwimlaneChildren !== undefined\n\t\t\t? { distributeSwimlaneChildren: options.distributeSwimlaneChildren }\n\t\t\t: {}),\n\t\tswimlanes: styledSwimlanes,\n\t\tboxes: initialNodeBoxes,\n\t\tnodes: styledNodes,\n\t\tgroups: styledGroups,\n\t\tconstraints,\n\t});\n\n\tdiagnostics.push(...constrained.diagnostics);\n\tconst swimlaneContracts = applySwimlaneLayoutContracts(\n\t\tstyledSwimlanes,\n\t\tconstraints,\n\t\tstyledEdges,\n\t\tisTopToBottomReadingDirection(diagram.metadata?.primaryReadingDirection),\n\t\tconstrained.boxes,\n\t\tconstrained.locks,\n\t\toptions?.overlapSpacing ?? 40,\n\t\tMath.max(0, options?.minLaneGutter ?? 0),\n\t\toptions.distributeContainedChildren ?? true,\n\t);\n\t// Distribution may resolve overlaps that were reported earlier\n\t// by repairOverlaps — clean those up before continuing.\n\tremoveResolvedOverlapDiagnostics(diagnostics, constrained.boxes);\n\tdiagnostics.push(...swimlaneContracts.diagnostics);\n\n\tconst coordinatedNodes = coordinateNodes(\n\t\tstyledNodes,\n\t\tconstrained.boxes,\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst nodeGeometryById = new Map(\n\t\tcoordinatedNodes.map((node) => [\n\t\t\tnode.id,\n\t\t\tcomputeShapeGeometry({\n\t\t\t\tshape: node.shape,\n\t\t\t\tbox: node.box,\n\t\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t\t}),\n\t\t]),\n\t);\n\tconst coordinatedGroups = coordinateGroups(\n\t\tstyledGroups,\n\t\tconstrained.boxes,\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst coordinatedSwimlanes = coordinateSwimlanes(\n\t\tstyledSwimlanes,\n\t\tconstrained.boxes,\n\t\tswimlaneContracts.layouts,\n\t);\n\tconst coordinatedMatrices = coordinateMatrices(diagram.matrices ?? []);\n\tconst coordinatedTables = coordinateTables(diagram.tables ?? []);\n\tconst coordinatedEvidencePanels = coordinateEvidencePanels(\n\t\tdiagram.evidencePanels ?? [],\n\t);\n\tconst groupBoxes = new Map(\n\t\tcoordinatedGroups.map((group) => [group.id, group.box]),\n\t);\n\tconst baseTextAnnotations = coordinateBaseTextAnnotations({\n\t\tnodes: coordinatedNodes,\n\t\tgroups: coordinatedGroups,\n\t\tswimlanes: coordinatedSwimlanes,\n\t\t...(options.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer }),\n\t});\n\tconst edgeLabelEstimates = estimateEdgeLabelAnnotations(\n\t\tstyledEdges,\n\t\tnodeGeometryById,\n\t\toptions.textMeasurer,\n\t);\n\tconst layoutBoxes = [\n\t\t...coordinatedNodes.map((node) => node.box),\n\t\t...coordinatedNodes.flatMap((node) =>\n\t\t\t(node.ports ?? []).flatMap((port) =>\n\t\t\t\tport.label === undefined ? [port.box] : [port.box, portLabelBox(port)],\n\t\t\t),\n\t\t),\n\t\t...groupBoxes.values(),\n\t\t...coordinatedSwimlanes.flatMap((swimlane) =>\n\t\t\tswimlane.box === undefined ? [] : [swimlane.box],\n\t\t),\n\t\t...baseTextAnnotations.map((annotation) => annotation.box),\n\t];\n\tconst initialContentBounds =\n\t\tlayoutBoxes.length === 0\n\t\t\t? { x: 0, y: 0, width: 0, height: 0 }\n\t\t\t: unionBoxes(layoutBoxes);\n\tplaceEvidenceBlocks(\n\t\toptions.obstacleMargin ?? 0,\n\t\t[\n\t\t\t...coordinatedMatrices,\n\t\t\t...coordinatedTables,\n\t\t\t...coordinatedEvidencePanels,\n\t\t],\n\t\tinitialContentBounds,\n\t);\n\trefreshTableColumnXOffsets(coordinatedTables);\n\tmeasureEvidenceTextBlocks(\n\t\tcoordinatedMatrices,\n\t\tcoordinatedTables,\n\t\tcoordinatedEvidencePanels,\n\t\toptions.textMeasurer,\n\t);\n\tconst evidenceBoxes = [\n\t\t...coordinatedMatrices.map((matrix) => matrix.box),\n\t\t...coordinatedTables.map((table) => table.box),\n\t\t...coordinatedEvidencePanels.map((panel) => panel.box),\n\t];\n\tdiagnostics.push(\n\t\t...reportEvidenceBlockOverlaps(\n\t\t\t[\n\t\t\t\t...coordinatedMatrices.map((matrix) => ({\n\t\t\t\t\tid: matrix.id,\n\t\t\t\t\tkind: \"matrix\",\n\t\t\t\t\t...(matrix.position === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { position: matrix.position }),\n\t\t\t\t\tbox: matrix.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedTables.map((table) => ({\n\t\t\t\t\tid: table.id,\n\t\t\t\t\tkind: \"table\",\n\t\t\t\t\t...(table.position === undefined ? {} : { position: table.position }),\n\t\t\t\t\tbox: table.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedEvidencePanels.map((panel) => ({\n\t\t\t\t\tid: panel.id,\n\t\t\t\t\tkind: \"evidence-panel\",\n\t\t\t\t\t...(panel.position === undefined ? {} : { position: panel.position }),\n\t\t\t\t\tbox: panel.box,\n\t\t\t\t})),\n\t\t\t],\n\t\t\t[\n\t\t\t\t...coordinatedNodes.map((node) => ({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\tkind: \"node\",\n\t\t\t\t\tbox: node.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedGroups.map((group) => ({\n\t\t\t\t\tid: group.id,\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\tbox: group.box,\n\t\t\t\t})),\n\t\t\t\t...coordinatedSwimlanes.flatMap((swimlane) =>\n\t\t\t\t\tswimlane.box === undefined\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [{ id: swimlane.id, kind: \"swimlane\", box: swimlane.box }],\n\t\t\t\t),\n\t\t\t],\n\t\t),\n\t);\n\tconst allBoxes = [...layoutBoxes, ...evidenceBoxes];\n\tconst contentBounds =\n\t\tallBoxes.length === 0\n\t\t\t? { x: 0, y: 0, width: 0, height: 0 }\n\t\t\t: unionBoxes(allBoxes);\n\tconst frame =\n\t\tdiagram.frame === undefined\n\t\t\t? undefined\n\t\t\t: coordinateFrame(diagram.frame, contentBounds);\n\tconst frameTextAnnotation =\n\t\tframe === undefined\n\t\t\t? []\n\t\t\t: [coordinateFrameTextAnnotation(frame, options.textMeasurer)];\n\tconst routingTextObstacles = [\n\t\t...baseTextAnnotations.filter(isPreRouteTextObstacle),\n\t\t...frameTextAnnotation.filter(isPreRouteTextObstacle),\n\t\t// Dry-run edge-label estimates so edges route around\n\t\t// each other's label areas (Issue #41).\n\t\t...edgeLabelEstimates,\n\t];\n\t// Expand evidence-block boxes by obstacleMargin so edges route\n\t// around them with the same clearance as node/group boxes.\n\tconst margin = options.obstacleMargin ?? 0;\n\tconst softObstacles = [\n\t\t...coordinatedTables.map((table) => expandBox(table.box, margin)),\n\t\t...coordinatedEvidencePanels.map((panel) => expandBox(panel.box, margin)),\n\t];\n\tconst hardObstacles = coordinatedMatrices.map((matrix) =>\n\t\texpandBox(matrix.box, margin),\n\t);\n\n\t// Include frame title box and swimlane lane header boxes so edges\n\t// do not route through title bars (issue #29).\n\tconst titleBarObstacles: Box[] = [];\n\tif (frame !== undefined) {\n\t\ttitleBarObstacles.push(expandBox(frame.titleBox, margin));\n\t}\n\tfor (const swimlane of coordinatedSwimlanes) {\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (\n\t\t\t\tlane.headerBox !== undefined &&\n\t\t\t\tlane.headerBox.width > 0 &&\n\t\t\t\tlane.headerBox.height > 0\n\t\t\t) {\n\t\t\t\ttitleBarObstacles.push(expandBox(lane.headerBox, margin));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst coordinatedEdges = coordinateEdges(\n\t\tstyledEdges,\n\t\tnodeGeometryById,\n\t\tcoordinatedNodes,\n\t\t[...nodeGeometryById.values()].map((geometry) =>\n\t\t\toptions.routingGutter === undefined\n\t\t\t\t? geometry.obstacleBox\n\t\t\t\t: expandBox(geometry.obstacleBox, options.routingGutter),\n\t\t),\n\t\t[...softObstacles, ...titleBarObstacles],\n\t\troutingTextObstacles,\n\t\thardObstacles,\n\t\tdiagram.direction,\n\t\toptions,\n\t\tdiagnostics,\n\t\tcoordinatedGroups,\n\t\tcontentBounds,\n\t);\n\tconst edgeTextAnnotations = coordinateEdgeTextAnnotations(\n\t\tcoordinatedEdges,\n\t\t[\n\t\t\t...coordinatedNodes.map((node) => node.box),\n\t\t\t...baseTextAnnotations.map((annotation) => annotation.box),\n\t\t\t...frameTextAnnotation.map((annotation) => annotation.box),\n\t\t],\n\t\toptions.textMeasurer,\n\t\toptions.labelPlacement,\n\t\toptions.labelOffset,\n\t);\n\tconst textAnnotations = [\n\t\t...baseTextAnnotations,\n\t\t...frameTextAnnotation,\n\t\t...edgeTextAnnotations,\n\t];\n\tdiagnostics.push(...reportTextAnnotationCollisions(textAnnotations));\n\tdiagnostics.push(\n\t\t...reportRouteTextClearance(coordinatedEdges, textAnnotations),\n\t);\n\tconst edgePointBounds = edgeBounds(coordinatedEdges);\n\tconst boundsBase = [\n\t\tcontentBounds,\n\t\t...edgePointBounds,\n\t\t...edgeTextAnnotations.map((annotation) => annotation.box),\n\t];\n\tdiagnostics.push(\n\t\t...reportPageOverflow(\n\t\t\tframe === undefined\n\t\t\t\t? unionBoxes(boundsBase)\n\t\t\t\t: unionBoxes([...boundsBase, frame.box, frame.titleBox]),\n\t\t\toptions.pageBounds,\n\t\t),\n\t);\n\n\tlet degraded = false;\n\tconst resultDiagnostics = diagnostics.map((diagnostic) => {\n\t\tif (DELIVERABILITY_DIAGNOSTIC_CODES.has(diagnostic.code)) {\n\t\t\tdegraded = true;\n\t\t\tif (options.strict) {\n\t\t\t\treturn { ...diagnostic, severity: \"error\" as const };\n\t\t\t}\n\t\t}\n\t\treturn diagnostic;\n\t});\n\n\treturn {\n\t\tid: diagram.id,\n\t\t...(diagram.title === undefined ? {} : { title: diagram.title }),\n\t\tdirection: diagram.direction,\n\t\tnodes: coordinatedNodes,\n\t\tedges: coordinatedEdges,\n\t\tgroups: coordinatedGroups,\n\t\t...(coordinatedSwimlanes.length === 0\n\t\t\t? {}\n\t\t\t: { swimlanes: coordinatedSwimlanes }),\n\t\t...(coordinatedMatrices.length === 0\n\t\t\t? {}\n\t\t\t: { matrices: coordinatedMatrices }),\n\t\t...(coordinatedTables.length === 0 ? {} : { tables: coordinatedTables }),\n\t\t...(coordinatedEvidencePanels.length === 0\n\t\t\t? {}\n\t\t\t: { evidencePanels: coordinatedEvidencePanels }),\n\t\tdiagnostics: resultDiagnostics,\n\t\tdegraded,\n\t\tbounds:\n\t\t\tframe === undefined\n\t\t\t\t? unionBoxes(boundsBase)\n\t\t\t\t: unionBoxes([...boundsBase, frame.box, frame.titleBox]),\n\t\t...(frame === undefined ? {} : { frame }),\n\t\t...(textAnnotations.length === 0 ? {} : { textAnnotations }),\n\t\t...(diagram.metadata === undefined ? {} : { metadata: diagram.metadata }),\n\t};\n}\n\n/**\n * Convenience wrapper around {@link solveDiagram} that enables\n * {@link SolveDiagramOptions.prefitLabelSize} by default so node sizes are\n * expanded to fit their label text. Direct callers of `solveDiagram` who\n * pass hard-coded `NormalizedNode.size` values without a `labelLayout`\n * often see truncated labels; this wrapper avoids that trap.\n *\n * @see SolveDiagramOptions.prefitLabelSize\n */\nexport function solveDiagramSafe(\n\tdiagram: NormalizedDiagram,\n\toptions: SolveDiagramOptions = {},\n): CoordinatedDiagram {\n\treturn solveDiagram(diagram, { ...options, prefitLabelSize: true });\n}\n\nfunction runInitialLayout(input: {\n\tmode: InitialLayoutMode;\n\tcomponentAware: boolean;\n\tdirection: NormalizedDiagram[\"direction\"];\n\tnodes: readonly NormalizedNode[];\n\tedges: readonly NormalizedEdge[];\n}): InitialLayoutResult {\n\tif (input.mode === \"positions\") {\n\t\treturn runPositionSeededInitialLayout(input);\n\t}\n\n\tconst runAutoLayout = input.componentAware\n\t\t? runComponentAwareDagreInitialLayout\n\t\t: runDagreInitialLayout;\n\treturn runAutoLayout({\n\t\tdirection: input.direction,\n\t\tnodes: input.nodes.map((node) => ({ id: node.id, size: node.size })),\n\t\tedges: input.edges.map((edge) => ({\n\t\t\tid: edge.id,\n\t\t\tsourceId: edge.source.nodeId,\n\t\t\ttargetId: edge.target.nodeId,\n\t\t})),\n\t});\n}\n\nfunction runPositionSeededInitialLayout(input: {\n\tdirection: NormalizedDiagram[\"direction\"];\n\tnodes: readonly NormalizedNode[];\n\tedges: readonly NormalizedEdge[];\n}): InitialLayoutResult {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst boxes = new Map<string, Box>();\n\tconst autoNodes: NormalizedNode[] = [];\n\n\tfor (const node of input.nodes) {\n\t\tif (\n\t\t\t!isValidInitialDimension(node.size.width) ||\n\t\t\t!isValidInitialDimension(node.size.height)\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-size.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has invalid layout dimensions.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"size\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.position === undefined) {\n\t\t\tautoNodes.push(node);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isFiniteInitialPoint(node.position)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"layout.node-position.invalid\",\n\t\t\t\tmessage: `Node ${node.id} has an invalid seeded position.`,\n\t\t\t\tpath: [\"nodes\", node.id, \"position\"],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tboxes.set(node.id, {\n\t\t\tx: node.position.x,\n\t\t\ty: node.position.y,\n\t\t\twidth: node.size.width,\n\t\t\theight: node.size.height,\n\t\t});\n\t}\n\n\tif (autoNodes.length === 0) {\n\t\treturn { boxes, diagnostics };\n\t}\n\n\tconst autoNodeIds = new Set(autoNodes.map((node) => node.id));\n\tconst autoLayout = runComponentAwareDagreInitialLayout({\n\t\tdirection: input.direction,\n\t\tnodes: autoNodes.map((node) => ({ id: node.id, size: node.size })),\n\t\tedges: input.edges\n\t\t\t.filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\tautoNodeIds.has(edge.source.nodeId) &&\n\t\t\t\t\tautoNodeIds.has(edge.target.nodeId),\n\t\t\t)\n\t\t\t.map((edge) => ({\n\t\t\t\tid: edge.id,\n\t\t\t\tsourceId: edge.source.nodeId,\n\t\t\t\ttargetId: edge.target.nodeId,\n\t\t\t})),\n\t});\n\tdiagnostics.push(...autoLayout.diagnostics);\n\tfor (const [id, box] of autoLayout.boxes) {\n\t\tboxes.set(id, box);\n\t}\n\n\treturn { boxes, diagnostics };\n}\n\nfunction isValidInitialDimension(value: number): boolean {\n\treturn Number.isFinite(value) && value >= 0;\n}\n\nfunction isFiniteInitialPoint(point: Point): boolean {\n\treturn Number.isFinite(point.x) && Number.isFinite(point.y);\n}\n\nfunction prefitNodeLabelSize(\n\tnode: NormalizedNode,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedNode {\n\tif (node.label === undefined) {\n\t\treturn node;\n\t}\n\tconst measurer = options.textMeasurer ?? createDefaultTextMeasurer();\n\tconst layout = fitLabel(\n\t\tnode.label.text,\n\t\t{\n\t\t\tfont: prefitLabelFont(node, options),\n\t\t\tpadding: DEFAULT_NODE_PADDING,\n\t\t\tminSize: DEFAULT_NODE_MIN_SIZE,\n\t\t\tmaxWidth:\n\t\t\t\tnode.label.maxWidth ??\n\t\t\t\tMath.max(node.size.width, DEFAULT_LABEL_MAX_WIDTH),\n\t\t},\n\t\tmeasurer,\n\t);\n\tconst width = Math.max(node.size.width, layout.fittedSize.width);\n\tconst height = Math.max(node.size.height, layout.fittedSize.height);\n\tconst resized = width !== node.size.width || height !== node.size.height;\n\tif (resized) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"prefit_label_resized\",\n\t\t\tmessage: `Node ${node.id} size expanded to fit its label.`,\n\t\t\tpath: [\"nodes\", node.id],\n\t\t\tdetail: {\n\t\t\t\tnodeId: node.id,\n\t\t\t\tfrom: { width: node.size.width, height: node.size.height },\n\t\t\t\tto: { width, height },\n\t\t\t},\n\t\t});\n\t}\n\t// Center the label layout within the node dimensions so the\n\t// annotation is visually centered even when the node is larger\n\t// than what the label text requires (codex P2).\n\tconst centeredLayout = expandLabelLayoutToNode(layout, { width, height });\n\treturn { ...node, size: { width, height }, labelLayout: centeredLayout };\n}\nfunction expandLabelLayoutToNode(\n\tlayout: LabelLayout,\n\tnodeSize: Size,\n): LabelLayout {\n\tif (\n\t\tlayout.box.width >= nodeSize.width &&\n\t\tlayout.box.height >= nodeSize.height\n\t) {\n\t\treturn layout;\n\t}\n\tconst offsetX = Math.max(0, (nodeSize.width - layout.box.width) / 2);\n\tconst offsetY = Math.max(0, (nodeSize.height - layout.box.height) / 2);\n\tif (offsetX === 0 && offsetY === 0) {\n\t\treturn layout;\n\t}\n\treturn {\n\t\t...layout,\n\t\tbox: {\n\t\t\tx: layout.box.x + offsetX,\n\t\t\ty: layout.box.y + offsetY,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t},\n\t};\n}\n\nfunction reportPageOverflow(\n\tcontentBounds: Box,\n\tpageBounds: { width: number; height: number } | undefined,\n): Diagnostic[] {\n\tif (pageBounds === undefined) {\n\t\treturn [];\n\t}\n\tconst overflowRight = Math.max(\n\t\t0,\n\t\tcontentBounds.x + contentBounds.width - pageBounds.width,\n\t);\n\tconst overflowBottom = Math.max(\n\t\t0,\n\t\tcontentBounds.y + contentBounds.height - pageBounds.height,\n\t);\n\tconst overflowLeft = Math.max(0, -contentBounds.x);\n\tconst overflowTop = Math.max(0, -contentBounds.y);\n\tif (\n\t\toverflowRight === 0 &&\n\t\toverflowBottom === 0 &&\n\t\toverflowLeft === 0 &&\n\t\toverflowTop === 0\n\t) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t{\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"page_overflow\",\n\t\t\tmessage: `Content ${contentBounds.width}x${contentBounds.height} exceeds page ${pageBounds.width}x${pageBounds.height}.`,\n\t\t\tpath: [\"bounds\"],\n\t\t\tdetail: {\n\t\t\t\tpage: { width: pageBounds.width, height: pageBounds.height },\n\t\t\t\tcontent: {\n\t\t\t\t\twidth: contentBounds.width,\n\t\t\t\t\theight: contentBounds.height,\n\t\t\t\t},\n\t\t\t\toverflow: {\n\t\t\t\t\tright: overflowRight,\n\t\t\t\t\tbottom: overflowBottom,\n\t\t\t\t\tleft: overflowLeft,\n\t\t\t\t\ttop: overflowTop,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t];\n}\n\nfunction createCjkTypographyOptions(\n\toptions: SolveDiagramOptions,\n): CjkTypographyOptions {\n\tconst fontFamily =\n\t\toptions.cjkFontFamily === false\n\t\t\t? undefined\n\t\t\t: (options.cjkFontFamily ?? DEFAULT_CJK_FONT_FAMILY);\n\tconst minFontSize =\n\t\toptions.minCjkFontSize === false\n\t\t\t? undefined\n\t\t\t: (options.minCjkFontSize ?? DEFAULT_MIN_CJK_FONT_SIZE);\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(minFontSize === undefined ? {} : { minFontSize }),\n\t};\n}\n\nfunction enhanceNodeCjkTypography(\n\tnode: NormalizedNode,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedNode {\n\tconst nodeWithStyle = enhanceStyledLabelOwner(\n\t\tnode,\n\t\t[\"nodes\", node.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst ports =\n\t\tnodeWithStyle.ports === undefined\n\t\t\t? undefined\n\t\t\t: nodeWithStyle.ports.map((port) =>\n\t\t\t\t\tenhanceStyledLabelOwner(\n\t\t\t\t\t\tport,\n\t\t\t\t\t\t[\"nodes\", node.id, \"ports\", port.id],\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t),\n\t\t\t\t);\n\treturn ports === undefined ? nodeWithStyle : { ...nodeWithStyle, ports };\n}\n\nfunction enhanceEdgeCjkTypography(\n\tedge: NormalizedEdge,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedEdge {\n\treturn enhanceStyledLabelOwner(\n\t\tedge,\n\t\t[\"edges\", edge.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceGroupCjkTypography(\n\tgroup: NormalizedGroup,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): NormalizedGroup {\n\treturn enhanceStyledLabelOwner(\n\t\tgroup,\n\t\t[\"groups\", group.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceSwimlaneCjkTypography(\n\tswimlane: Swimlane,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): Swimlane {\n\tconst root = enhanceStyledLabelOwner(\n\t\tswimlane,\n\t\t[\"swimlanes\", swimlane.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n\tconst lanes = root.lanes.map((lane) =>\n\t\tenhanceSwimlaneLaneCjkTypography(swimlane.id, lane, options, diagnostics),\n\t);\n\treturn { ...root, lanes };\n}\n\nfunction enhanceSwimlaneLaneCjkTypography(\n\tswimlaneId: string,\n\tlane: SwimlaneLane,\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): SwimlaneLane {\n\treturn enhanceStyledLabelOwner(\n\t\tlane,\n\t\t[\"swimlanes\", swimlaneId, \"lanes\", lane.id],\n\t\toptions,\n\t\tdiagnostics,\n\t);\n}\n\nfunction enhanceStyledLabelOwner<\n\tT extends { id: string; label?: { text: string; metadata?: unknown } },\n>(\n\towner: T,\n\tpath: readonly (string | number)[],\n\toptions: CjkTypographyOptions,\n\tdiagnostics: Diagnostic[],\n): T {\n\tconst text = owner.label?.text;\n\tif (text === undefined || !containsCjk(text)) {\n\t\treturn owner;\n\t}\n\tconst typography = cjkTypographyForOwner(owner, options);\n\tif (\n\t\ttypography.fontFamily === undefined &&\n\t\ttypography.fontSize === undefined\n\t) {\n\t\treturn owner;\n\t}\n\tconst label = owner.label;\n\tif (label === undefined) {\n\t\treturn owner;\n\t}\n\tconst nextLabel = {\n\t\t...label,\n\t\tmetadata: {\n\t\t\t...metadataObject(label.metadata),\n\t\t\tcjkTypography: typography,\n\t\t},\n\t};\n\tconst nextOwner = { ...owner, label: nextLabel };\n\tconst maybeStyled = nextOwner as T & { style?: VisualStyle };\n\tconst nextStyle = enhanceCjkStyle(maybeStyled.style, typography);\n\treportCjkTypographyDiagnostics(\n\t\tpath,\n\t\ttypography,\n\t\tmaybeStyled.style,\n\t\tdiagnostics,\n\t);\n\treturn nextStyle === maybeStyled.style\n\t\t? nextOwner\n\t\t: { ...nextOwner, style: nextStyle };\n}\n\nfunction cjkTypographyForOwner(\n\towner: {\n\t\tlabel?: { metadata?: unknown } | undefined;\n\t\tstyle?: VisualStyle | undefined;\n\t},\n\toptions: CjkTypographyOptions,\n): CjkTypography {\n\tconst metadataTypography = labelCjkTypography(owner.label?.metadata);\n\tconst fontFamily =\n\t\tmetadataTypography.fontFamily ??\n\t\towner.style?.fontFamily ??\n\t\toptions.fontFamily;\n\tconst fontSize = boostedCjkFontSize(\n\t\tmetadataTypography.fontSize ?? owner.style?.fontSize,\n\t\toptions.minFontSize,\n\t);\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(fontSize === undefined ? {} : { fontSize }),\n\t};\n}\n\nfunction labelCjkTypography(metadata: unknown): CjkTypography {\n\tconst metadataRecord = metadataObject(metadata);\n\tif (metadataRecord === undefined) {\n\t\treturn {};\n\t}\n\tconst value = metadataRecord.cjkTypography;\n\tif (value === undefined || value === null || typeof value !== \"object\") {\n\t\treturn {};\n\t}\n\tconst typography = value as Record<string, unknown>;\n\tconst fontFamily =\n\t\ttypeof typography.fontFamily === \"string\"\n\t\t\t? typography.fontFamily\n\t\t\t: undefined;\n\tconst fontSize =\n\t\ttypeof typography.fontSize === \"number\" &&\n\t\tNumber.isFinite(typography.fontSize) &&\n\t\ttypography.fontSize > 0\n\t\t\t? typography.fontSize\n\t\t\t: undefined;\n\treturn {\n\t\t...(fontFamily === undefined ? {} : { fontFamily }),\n\t\t...(fontSize === undefined ? {} : { fontSize }),\n\t};\n}\n\nfunction metadataObject(\n\tmetadata: unknown,\n): Record<string, unknown> | undefined {\n\tif (\n\t\tmetadata === undefined ||\n\t\tmetadata === null ||\n\t\ttypeof metadata !== \"object\" ||\n\t\tArray.isArray(metadata)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn metadata as Record<string, unknown>;\n}\n\nfunction typographyForLabel(\n\tlabel: { metadata?: unknown } | undefined,\n): CjkTypography {\n\treturn labelCjkTypography(label?.metadata);\n}\n\nfunction typographyTextStyle(\n\tlabel: { metadata?: unknown } | undefined,\n\tbase: TextStyleOptions,\n): TextStyleOptions {\n\tconst typography = typographyForLabel(label);\n\treturn {\n\t\t...base,\n\t\t...(typography.fontFamily === undefined\n\t\t\t? {}\n\t\t\t: { fontFamily: typography.fontFamily }),\n\t\t...(typography.fontSize === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tfontSize: typography.fontSize,\n\t\t\t\t\tlineHeight: Math.max(base.lineHeight ?? 0, typography.fontSize * 1.2),\n\t\t\t\t}),\n\t};\n}\n\nfunction boostedCjkFontSize(\n\tcurrent: number | undefined,\n\tminFontSize: number | undefined,\n): number | undefined {\n\tif (minFontSize === undefined) {\n\t\treturn current;\n\t}\n\tif (current === undefined || current < minFontSize) {\n\t\treturn minFontSize;\n\t}\n\treturn current;\n}\n\nfunction enhanceCjkStyle(\n\tstyle: VisualStyle | undefined,\n\ttypography: CjkTypography,\n): VisualStyle | undefined {\n\tlet next = style;\n\tif (typography.fontFamily !== undefined && next?.fontFamily === undefined) {\n\t\tnext = { ...next, fontFamily: typography.fontFamily };\n\t}\n\tif (\n\t\ttypography.fontSize !== undefined &&\n\t\t(next?.fontSize === undefined || next.fontSize < typography.fontSize)\n\t) {\n\t\tnext = { ...next, fontSize: typography.fontSize };\n\t}\n\treturn next;\n}\n\nfunction reportCjkTypographyDiagnostics(\n\tpath: readonly (string | number)[],\n\ttypography: CjkTypography,\n\tpreviousStyle: VisualStyle | undefined,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (\n\t\ttypography.fontFamily !== undefined &&\n\t\tpreviousStyle?.fontFamily === undefined\n\t) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"cjk_font_family_applied\",\n\t\t\tmessage: `Applied CJK font family ${typography.fontFamily}.`,\n\t\t\tpath: [...path, \"label\", \"metadata\", \"cjkTypography\", \"fontFamily\"],\n\t\t\tdetail: { fontFamily: typography.fontFamily },\n\t\t});\n\t}\n\tif (\n\t\ttypography.fontSize !== undefined &&\n\t\t(previousStyle?.fontSize === undefined ||\n\t\t\tpreviousStyle.fontSize < typography.fontSize)\n\t) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"cjk_font_size_boosted\",\n\t\t\tmessage: `Raised CJK font size to ${typography.fontSize}.`,\n\t\t\tpath: [...path, \"label\", \"metadata\", \"cjkTypography\", \"fontSize\"],\n\t\t\tdetail: {\n\t\t\t\tminFontSize: typography.fontSize,\n\t\t\t\t...(previousStyle?.fontSize === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { previousFontSize: previousStyle.fontSize }),\n\t\t\t},\n\t\t});\n\t}\n}\n\nfunction containsCjk(value: string): boolean {\n\treturn /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\uf900-\\ufaff]/u.test(value);\n}\n\nfunction applySwimlaneLayoutContracts(\n\tswimlanes: readonly Swimlane[],\n\tconstraints: readonly Constraint[],\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\toverlapSpacing: number,\n\tlaneGutter: number,\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractResult {\n\tconst layouts = new Map<string, SwimlaneContractLayout>();\n\tconst diagnostics: Diagnostic[] = [];\n\tconst movedChildIds = new Set<string>();\n\tfor (const swimlane of swimlanes) {\n\t\tif ((swimlane.layout ?? \"overlay\") !== \"contract\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (swimlane.lanes.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = applySingleSwimlaneContract(\n\t\t\tswimlane,\n\t\t\tedges,\n\t\t\ttopToBottomFlow,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tlaneGutter,\n\t\t\tconstraints,\n\t\t\tdistributeContainedChildren,\n\t\t);\n\t\tif (layout !== undefined) {\n\t\t\tlayouts.set(swimlane.id, layout);\n\t\t}\n\t}\n\tif (layouts.size > 0) {\n\t\tdiagnostics.push(\n\t\t\t...reportSwimlaneOverlaps(nodeBoxes, locks, overlapSpacing),\n\t\t\t...reportSwimlaneConstraintInvalidations(\n\t\t\t\tconstraints,\n\t\t\t\tnodeBoxes,\n\t\t\t\tmovedChildIds,\n\t\t\t),\n\t\t);\n\t\tif (laneGutter > 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tcode: \"lane_gutter_applied\",\n\t\t\t\tmessage: `Applied ${laneGutter}px gutter between ${layouts.size} contract swimlane lane(s).`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: { laneGutter, swimlaneCount: layouts.size },\n\t\t\t});\n\t\t}\n\t}\n\treturn { layouts, diagnostics, movedChildIds };\n}\n\nfunction wrapVerticalStackIfNeeded(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tedges: readonly NormalizedEdge[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tconst wrapped = new Map([...boxes].map(([id, box]) => [id, { ...box }]));\n\tconst maxStackDepth = options.maxStackDepth;\n\tif (\n\t\tmaxStackDepth === undefined ||\n\t\tmaxStackDepth <= 0 ||\n\t\tnodes.length <= maxStackDepth\n\t) {\n\t\treportVerticalRunaway(\n\t\t\twrapped,\n\t\t\tnodes,\n\t\t\tedges,\n\t\t\tdirection,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\treturn wrapped;\n\t}\n\tif (edges.length > 0 || !isStackRunaway(wrapped, nodes, direction, options)) {\n\t\treportVerticalRunaway(\n\t\t\twrapped,\n\t\t\tnodes,\n\t\t\tedges,\n\t\t\tdirection,\n\t\t\toptions,\n\t\t\tdiagnostics,\n\t\t);\n\t\treturn wrapped;\n\t}\n\n\tconst ordered = nodes\n\t\t.map((node) => ({ node, box: wrapped.get(node.id) }))\n\t\t.filter(\n\t\t\t(item): item is { node: NormalizedNode; box: Box } =>\n\t\t\t\titem.box !== undefined,\n\t\t)\n\t\t.sort((a, b) => {\n\t\t\tconst delta = a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.node.id.localeCompare(b.node.id) : delta;\n\t\t});\n\tconst columns = Math.ceil(ordered.length / maxStackDepth);\n\tconst horizontalGap = options.overlapSpacing ?? 40;\n\tconst verticalGap = Math.max(24, horizontalGap / 2);\n\tconst columnWidths = Array.from({ length: columns }, (_, column) =>\n\t\tMath.max(\n\t\t\t0,\n\t\t\t...ordered\n\t\t\t\t.slice(column * maxStackDepth, (column + 1) * maxStackDepth)\n\t\t\t\t.map((item) => item.box.width),\n\t\t),\n\t);\n\tconst startX = Math.min(...ordered.map((item) => item.box.x));\n\tconst startY = Math.min(...ordered.map((item) => item.box.y));\n\tlet columnX = startX;\n\tfor (let column = 0; column < columns; column += 1) {\n\t\tlet y = startY;\n\t\tconst items = ordered.slice(\n\t\t\tcolumn * maxStackDepth,\n\t\t\t(column + 1) * maxStackDepth,\n\t\t);\n\t\tfor (const item of items) {\n\t\t\twrapped.set(item.node.id, { ...item.box, x: columnX, y });\n\t\t\ty += item.box.height + verticalGap;\n\t\t}\n\t\tcolumnX += (columnWidths[column] ?? 0) + horizontalGap;\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"vertical_runaway\",\n\t\tmessage: `Single-column layout exceeded maxStackDepth ${maxStackDepth}; wrapped into ${columns} columns.`,\n\t\tpath: [\"nodes\"],\n\t\tdetail: { nodeCount: ordered.length, maxStackDepth, columns },\n\t});\n\treturn wrapped;\n}\n\n/**\n * Wrap a TB/BT single horizontal row into multiple rows when\n * the layout exceeds maxRowDepth or targetAspectRatio (Issue #60).\n * Mirror of wrapVerticalStackIfNeeded for vertical layouts.\n */\nfunction wrapHorizontalStackIfNeeded(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): Map<string, Box> {\n\tif (!isStackRunaway(boxes, nodes, direction, options)) {\n\t\treturn new Map(boxes);\n\t}\n\tlet maxRowDepth = options.maxRowDepth;\n\tif (\n\t\tmaxRowDepth === undefined ||\n\t\tmaxRowDepth <= 0 ||\n\t\tnodes.length <= maxRowDepth\n\t) {\n\t\t// When called with only targetAspectRatio (no maxRowDepth),\n\t\t// derive a row depth so the rewrap is not silently skipped\n\t\t// (Issue #61 codex P2).\n\t\tif (maxRowDepth === undefined && options.targetAspectRatio !== undefined) {\n\t\t\tmaxRowDepth = Math.ceil(Math.sqrt(nodes.length));\n\t\t\tif (nodes.length <= maxRowDepth) return new Map(boxes);\n\t\t} else {\n\t\t\treturn new Map(boxes);\n\t\t}\n\t}\n\tconst ordered = [...nodes].sort((a, b) => {\n\t\tconst ba = boxes.get(a.id);\n\t\tconst bb = boxes.get(b.id);\n\t\tif (ba === undefined || bb === undefined) return 0;\n\t\tconst dx = ba.x - bb.x;\n\t\treturn dx !== 0 ? dx : ba.y - bb.y;\n\t});\n\tconst rows = Math.ceil(ordered.length / maxRowDepth);\n\tconst wrapped = new Map(boxes);\n\tconst rowSpacing = options.overlapSpacing ?? 40;\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxH = 0;\n\tfor (const n of ordered) {\n\t\tconst b = boxes.get(n.id);\n\t\tif (b !== undefined) {\n\t\t\tminX = Math.min(minX, b.x);\n\t\t\tminY = Math.min(minY, b.y);\n\t\t\tmaxH = Math.max(maxH, b.height);\n\t\t}\n\t}\n\tfor (let ri = 0; ri < rows; ri++) {\n\t\tconst rowNodes = ordered.slice(ri * maxRowDepth, (ri + 1) * maxRowDepth);\n\t\tlet x = minX;\n\t\tconst y = minY + ri * (maxH + rowSpacing);\n\t\tfor (const node of rowNodes) {\n\t\t\tconst box = boxes.get(node.id);\n\t\t\tif (box === undefined) continue;\n\t\t\twrapped.set(node.id, { ...box, x, y });\n\t\t\tx += box.width + rowSpacing;\n\t\t}\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"horizontal_runaway\",\n\t\tmessage: `Single-row layout exceeded maxRowDepth ${maxRowDepth}; wrapped into ${rows} rows.`,\n\t\tpath: [\"nodes\"],\n\t\tdetail: { nodeCount: ordered.length, maxRowDepth, rows },\n\t});\n\treturn wrapped;\n}\n\nfunction reportVerticalRunaway(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tedges: readonly NormalizedEdge[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): void {\n\tif (!isStackRunaway(boxes, nodes, direction, options)) {\n\t\treturn;\n\t}\n\tdiagnostics.push({\n\t\tseverity: \"warning\",\n\t\tcode: \"vertical_runaway\",\n\t\tmessage:\n\t\t\t\"Layout produced a tall vertical stack beyond the preferred aspect ratio.\",\n\t\tpath: [\"nodes\"],\n\t\tdetail: {\n\t\t\tnodeCount: nodes.length,\n\t\t\tedgeCount: edges.length,\n\t\t\t...(options.preferredAspectRatio === undefined\n\t\t\t\t? {}\n\t\t\t\t: { preferredAspectRatio: options.preferredAspectRatio }),\n\t\t\t...(options.maxStackDepth === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxStackDepth: options.maxStackDepth }),\n\t\t},\n\t});\n}\n\n/**\n * Detect stack runaway in either direction.\n * For LR/RL: height/width > preferred (vertical runaway).\n * For TB/BT: width/height > preferred (horizontal runaway, Issue #60).\n */\nfunction isStackRunaway(\n\tboxes: ReadonlyMap<string, Box>,\n\tnodes: readonly NormalizedNode[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n): boolean {\n\tif (\n\t\toptions.maxStackDepth === undefined &&\n\t\toptions.preferredAspectRatio === undefined &&\n\t\toptions.targetAspectRatio === undefined &&\n\t\toptions.maxRowDepth === undefined\n\t) {\n\t\treturn false;\n\t}\n\tif (nodes.length < 2) {\n\t\treturn false;\n\t}\n\tconst nodeBoxes = nodes\n\t\t.map((node) => boxes.get(node.id))\n\t\t.filter((box): box is Box => box !== undefined);\n\tif (nodeBoxes.length < 2) {\n\t\treturn false;\n\t}\n\tconst bounds = unionBoxes(nodeBoxes);\n\n\tconst isHorizontal = direction === \"TB\" || direction === \"BT\";\n\tconst aspectRatio = isHorizontal\n\t\t? bounds.height <= 0\n\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t: bounds.width / bounds.height\n\t\t: bounds.width <= 0\n\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t: bounds.height / bounds.width;\n\tconst preferred = isHorizontal\n\t\t? (options.targetAspectRatio ?? options.preferredAspectRatio ?? 3)\n\t\t: (options.preferredAspectRatio ?? 3);\n\tif (\n\t\t(options.preferredAspectRatio !== undefined ||\n\t\t\toptions.targetAspectRatio !== undefined) &&\n\t\taspectRatio < preferred\n\t) {\n\t\treturn false;\n\t}\n\n\tif (isHorizontal) {\n\t\t// TB/BT: check y-spread vs maxHeight (single row runaway).\n\t\tconst yCenters = nodeBoxes.map((box) => box.y + box.height / 2);\n\t\tconst ySpread = Math.max(...yCenters) - Math.min(...yCenters);\n\t\tconst maxHeight = Math.max(...nodeBoxes.map((box) => box.height));\n\t\treturn ySpread <= Math.max(maxHeight, options.overlapSpacing ?? 40);\n\t}\n\n\t// LR/RL: check x-spread vs maxWidth (single column runaway).\n\tconst xCenters = nodeBoxes.map((box) => box.x + box.width / 2);\n\tconst xSpread = Math.max(...xCenters) - Math.min(...xCenters);\n\tconst maxWidth = Math.max(...nodeBoxes.map((box) => box.width));\n\treturn xSpread <= Math.max(maxWidth, options.overlapSpacing ?? 40);\n}\n\nfunction applySingleSwimlaneContract(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n\tconstraints: readonly Constraint[],\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractLayout | undefined {\n\tconst headerHeight = swimlane.headerHeight ?? 28;\n\tconst padding = swimlane.padding ?? 16;\n\tconst laneBounds = swimlane.lanes.map((lane) => {\n\t\tconst childBoxes = lane.children\n\t\t\t.map((child) => nodeBoxes.get(child))\n\t\t\t.filter((box): box is Box => box !== undefined);\n\t\treturn childBoxes.length === 0 ? undefined : unionBoxes(childBoxes);\n\t});\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tif (populatedBounds.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (swimlane.orientation === \"vertical\") {\n\t\treturn applyVerticalSwimlaneContract(\n\t\t\tswimlane,\n\t\t\tedges,\n\t\t\ttopToBottomFlow,\n\t\t\tnodeBoxes,\n\t\t\tlaneBounds,\n\t\t\theaderHeight,\n\t\t\tpadding,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tlaneGutter,\n\t\t\tconstraints,\n\t\t\tdistributeContainedChildren,\n\t\t);\n\t}\n\treturn applyHorizontalSwimlaneContract(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tlaneBounds,\n\t\theaderHeight,\n\t\tpadding,\n\t\tlocks,\n\t\tdiagnostics,\n\t\tmovedChildIds,\n\t\tlaneGutter,\n\t);\n}\n\nfunction applyVerticalSwimlaneContract(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n\ttopToBottomFlow: boolean,\n\tnodeBoxes: Map<string, Box>,\n\tlaneBounds: ReadonlyArray<Box | undefined>,\n\theaderHeight: number,\n\tpadding: number,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n\tconstraints: readonly Constraint[],\n\tdistributeContainedChildren: boolean | \"spread\",\n): SwimlaneContractLayout {\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tconst top = Math.min(...populatedBounds.map((box) => box.y));\n\tconst left = Math.min(...populatedBounds.map((box) => box.x));\n\tconst maxChildHeight = Math.max(...populatedBounds.map((box) => box.height));\n\n\t// Build a set of child IDs that were placed as a UNIT by containment\n\t// distribution — cross-axis spread must be skipped for them to avoid\n\t// conflicting with that distribution (Issue #66, root cause 2). Only\n\t// suppress spread for constraints the distributor actually ran:\n\t// distributeContainedChildren enabled AND ≥2 children that would be\n\t// distributed. A child is distributable only if it has a box and is not\n\t// exact-position locked (fixed-position yields to the distributor). This\n\t// mirrors applyDistributeContained's `distributable.length < 2` guard so\n\t// single-child, all-locked, or missing-box containments do NOT suppress\n\t// spread (Codex P2).\n\tconst containedChildIds = new Set<string>();\n\tif (distributeContainedChildren) {\n\t\tfor (const c of constraints) {\n\t\t\tif (c.kind !== \"containment\") continue;\n\t\t\t// Skip if the container itself has no box — applyDistributeContained\n\t\t\t// skips missing containers (Codex P2).\n\t\t\tif (nodeBoxes.get(c.containerId) === undefined) continue;\n\t\t\tconst distributable = c.childIds.filter((childId) => {\n\t\t\t\tif (nodeBoxes.get(childId) === undefined) return false;\n\t\t\t\tconst lock = locks.get(childId);\n\t\t\t\t// exact-position (and other non-fixed) locks are reserved, not\n\t\t\t\t// distributed; fixed-position yields to the distributor.\n\t\t\t\treturn lock === undefined || lock.source === \"fixed-position\";\n\t\t\t});\n\t\t\tif (distributable.length < 2) continue;\n\t\t\t// Only mark actually distributable children — locked/oversized\n\t\t\t// children that the distributor skips should NOT suppress spread\n\t\t\t// for lanes they happen to be in (Codex P2).\n\t\t\tfor (const childId of distributable) {\n\t\t\t\tcontainedChildIds.add(childId);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst flowRanks = topToBottomFlow\n\t\t? rankVerticalSwimlaneChildren(swimlane, edges)\n\t\t: new Map<string, number>();\n\tconst maxRank =\n\t\tflowRanks.size === 0 ? 0 : Math.max(...Array.from(flowRanks.values()));\n\tconst rankStackGap = Math.max(8, padding / 2);\n\tconst maxRankStackHeight = maxVerticalRankStackHeight(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tflowRanks,\n\t\trankStackGap,\n\t);\n\tconst rankSpacing = Math.max(96, maxRankStackHeight + padding);\n\tconst contentHeight =\n\t\tmaxRank === 0 ? maxChildHeight : maxRankStackHeight + maxRank * rankSpacing;\n\t// Base slot width fits the widest single child plus padding. When a rank\n\t// will be spread horizontally, the slot must also fit the full spread\n\t// width so children stay inside lane bounds and laneStep/swimlane box\n\t// (returned below and consumed by coordinateSwimlanes) stay consistent\n\t// (Codex P2).\n\tconst spreadWidth = maxCrossAxisSpreadWidth(\n\t\tswimlane,\n\t\tnodeBoxes,\n\t\tflowRanks,\n\t\tlocks,\n\t\trankStackGap,\n\t\tcontainedChildIds,\n\t);\n\tconst slotWidth =\n\t\tMath.max(\n\t\t\tMath.max(...populatedBounds.map((box) => box.width)),\n\t\t\tspreadWidth,\n\t\t) +\n\t\tpadding * 2;\n\tconst laneStep = slotWidth + laneGutter;\n\tconst laneContentTop = top + headerHeight + padding;\n\n\tfor (let index = 0; index < swimlane.lanes.length; index += 1) {\n\t\tconst lane = swimlane.lanes[index];\n\t\tconst bounds = laneBounds[index];\n\t\tif (lane === undefined || bounds === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst target = {\n\t\t\tx: left + laneStep * index + padding,\n\t\t\ty: laneContentTop,\n\t\t};\n\t\tif (maxRank === 0) {\n\t\t\t// When ≥3 unlocked children could participate in distribution\n\t\t\t// but there are no flow edges (maxRank=0), route through the\n\t\t\t// ranked function which applies cross-axis spread (Issue #62,\n\t\t\t// Codex P2). Locked children never participate.\n\t\t\t// Skip cross-axis spread if ANY lane child is already covered by\n\t\t\t// a containment constraint — the containment distribution already\n\t\t\t// placed them and cross-axis would conflict (Issue #66).\n\t\t\tconst distributable = lane.children.filter(\n\t\t\t\t(childId) => !locks.has(childId),\n\t\t\t);\n\t\t\tconst coveredByContainment = lane.children.some((childId) =>\n\t\t\t\tcontainedChildIds.has(childId),\n\t\t\t);\n\t\t\tif (\n\t\t\t\t!coveredByContainment &&\n\t\t\t\tdistributable.length >= CROSS_AXIS_SPREAD_THRESHOLD\n\t\t\t) {\n\t\t\t\tmoveRankedVerticalLaneChildren(\n\t\t\t\t\tlane.children,\n\t\t\t\t\tnodeBoxes,\n\t\t\t\t\tlocks,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t\tmovedChildIds,\n\t\t\t\t\tflowRanks,\n\t\t\t\t\trankSpacing,\n\t\t\t\t\trankStackGap,\n\t\t\t\t\t{ x: target.x, y: laneContentTop },\n\t\t\t\t\tslotWidth - padding * 2,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmoveLaneChildren(\n\t\t\t\tlane.children,\n\t\t\t\tnodeBoxes,\n\t\t\t\tlocks,\n\t\t\t\tdiagnostics,\n\t\t\t\tmovedChildIds,\n\t\t\t\t{\n\t\t\t\t\tx: target.x - bounds.x,\n\t\t\t\t\ty: target.y - bounds.y,\n\t\t\t\t},\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\t// Skip cross-axis spread for ranked lanes when children are already\n\t\t// covered by a containment constraint (Issue #66). Keep ranked\n\t\t// placement (rank spacing / flow order) but suppress horizontal\n\t\t// spread so it doesn't conflict with containment distribution (Codex P2).\n\t\tconst rankedCoveredByContainment = lane.children.some((childId) =>\n\t\t\tcontainedChildIds.has(childId),\n\t\t);\n\t\tmoveRankedVerticalLaneChildren(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\tflowRanks,\n\t\t\trankSpacing,\n\t\t\trankStackGap,\n\t\t\t{ x: target.x, y: laneContentTop },\n\t\t\tslotWidth - padding * 2,\n\t\t\trankedCoveredByContainment,\n\t\t);\n\t}\n\n\treturn {\n\t\tbox: {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth: laneStep * (swimlane.lanes.length - 1) + slotWidth,\n\t\t\theight: contentHeight + padding * 2 + headerHeight,\n\t\t},\n\t\tslotWidth,\n\t\tslotHeight: contentHeight + padding * 2 + headerHeight,\n\t\tlaneStep,\n\t};\n}\n\nfunction isTopToBottomReadingDirection(value: unknown): boolean {\n\treturn value === \"top_to_bottom\" || value === \"top-to-bottom\";\n}\n\nfunction rankVerticalSwimlaneChildren(\n\tswimlane: Swimlane,\n\tedges: readonly NormalizedEdge[],\n): Map<string, number> {\n\tconst childOrder = new Map<string, number>();\n\tfor (const lane of swimlane.lanes) {\n\t\tfor (const childId of lane.children) {\n\t\t\tif (!childOrder.has(childId)) {\n\t\t\t\tchildOrder.set(childId, childOrder.size);\n\t\t\t}\n\t\t}\n\t}\n\tif (childOrder.size === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst childIds = new Set(childOrder.keys());\n\tconst relevantEdges = edges.filter(\n\t\t(edge) =>\n\t\t\tchildIds.has(edge.source.nodeId) &&\n\t\t\tchildIds.has(edge.target.nodeId) &&\n\t\t\tedge.source.nodeId !== edge.target.nodeId,\n\t);\n\tif (relevantEdges.length === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst ranks = new Map([...childIds].map((id) => [id, 0]));\n\tconst outgoing = new Map<string, string[]>();\n\tconst inDegree = new Map([...childIds].map((id) => [id, 0]));\n\tfor (const edge of relevantEdges) {\n\t\tconst targets = outgoing.get(edge.source.nodeId) ?? [];\n\t\ttargets.push(edge.target.nodeId);\n\t\toutgoing.set(edge.source.nodeId, targets);\n\t\tinDegree.set(\n\t\t\tedge.target.nodeId,\n\t\t\t(inDegree.get(edge.target.nodeId) ?? 0) + 1,\n\t\t);\n\t}\n\n\tconst queue = [...childIds]\n\t\t.filter((id) => (inDegree.get(id) ?? 0) === 0)\n\t\t.sort((a, b) => (childOrder.get(a) ?? 0) - (childOrder.get(b) ?? 0));\n\tlet visited = 0;\n\tfor (let cursor = 0; cursor < queue.length; cursor += 1) {\n\t\tconst sourceId = queue[cursor];\n\t\tif (sourceId === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tvisited += 1;\n\t\tfor (const targetId of outgoing.get(sourceId) ?? []) {\n\t\t\tranks.set(\n\t\t\t\ttargetId,\n\t\t\t\tMath.max(ranks.get(targetId) ?? 0, (ranks.get(sourceId) ?? 0) + 1),\n\t\t\t);\n\t\t\tconst nextInDegree = (inDegree.get(targetId) ?? 0) - 1;\n\t\t\tinDegree.set(targetId, nextInDegree);\n\t\t\tif (nextInDegree === 0) {\n\t\t\t\tqueue.push(targetId);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn visited === childIds.size\n\t\t? ranks\n\t\t: rankCyclicSwimlaneChildren(childIds, relevantEdges);\n}\n\nfunction rankCyclicSwimlaneChildren(\n\tchildIds: ReadonlySet<string>,\n\tedges: readonly NormalizedEdge[],\n): Map<string, number> {\n\tconst maxRank = Math.max(0, childIds.size - 1);\n\tconst ranks = new Map([...childIds].map((id) => [id, 0]));\n\tfor (let iteration = 0; iteration < childIds.size; iteration += 1) {\n\t\tlet changed = false;\n\t\tfor (const edge of edges) {\n\t\t\tconst nextRank = Math.min(\n\t\t\t\tmaxRank,\n\t\t\t\t(ranks.get(edge.source.nodeId) ?? 0) + 1,\n\t\t\t);\n\t\t\tif (nextRank > (ranks.get(edge.target.nodeId) ?? 0)) {\n\t\t\t\tranks.set(edge.target.nodeId, nextRank);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif (!changed) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn ranks;\n}\n\nfunction maxVerticalRankStackHeight(\n\tswimlane: Swimlane,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n\tgap: number,\n): number {\n\tlet maxHeight = 0;\n\tfor (const lane of swimlane.lanes) {\n\t\tfor (const stack of rankStacks(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tflowRanks,\n\t\t).values()) {\n\t\t\tconst height = stack.reduce(\n\t\t\t\t(total, item, index) =>\n\t\t\t\t\ttotal + item.box.height + (index === 0 ? 0 : gap),\n\t\t\t\t0,\n\t\t\t);\n\t\t\tmaxHeight = Math.max(maxHeight, height);\n\t\t}\n\t}\n\treturn maxHeight;\n}\n\n// Minimum unlocked same-rank children that trigger cross-axis spread\n// instead of vertical stacking (Issue #62).\nconst CROSS_AXIS_SPREAD_THRESHOLD = 3;\n\n// Width a single rank's children occupy when spread horizontally: sum of\n// widths plus inter-child gaps. Used both to pre-size the lane slot and to\n// lay the children out, so geometry stays consistent (Codex P2).\nfunction crossAxisSpreadWidth(\n\titems: ReadonlyArray<{ box: Box }>,\n\tgap: number,\n): number {\n\treturn items.reduce(\n\t\t(sum, item, index) => sum + item.box.width + (index === 0 ? 0 : gap),\n\t\t0,\n\t);\n}\n\n// Largest cross-axis spread width across all lanes/ranks of a swimlane.\n// Returns 0 when no rank meets the spread threshold. Locked children are\n// excluded (they never participate in distribution). Lanes whose children\n// are covered by a containment constraint are also excluded — they will use\n// moveLaneChildren (pure offset) instead of cross-axis spread (Issue #66).\nfunction maxCrossAxisSpreadWidth(\n\tswimlane: Swimlane,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tgap: number,\n\tcontainedChildIds?: ReadonlySet<string>,\n): number {\n\tlet maxWidth = 0;\n\tfor (const lane of swimlane.lanes) {\n\t\t// Skip lanes covered by containment constraints — they won't spread.\n\t\tif (\n\t\t\tcontainedChildIds !== undefined &&\n\t\t\tlane.children.some((childId) => containedChildIds.has(childId))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const stack of rankStacks(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tflowRanks,\n\t\t).values()) {\n\t\t\tconst unlocked = stack.filter((item) => !locks.has(item.childId));\n\t\t\tif (unlocked.length < CROSS_AXIS_SPREAD_THRESHOLD) continue;\n\t\t\tmaxWidth = Math.max(maxWidth, crossAxisSpreadWidth(unlocked, gap));\n\t\t}\n\t}\n\treturn maxWidth;\n}\n\nfunction moveRankedVerticalLaneChildren(\n\tchildIds: readonly string[],\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tflowRanks: ReadonlyMap<string, number>,\n\trankSpacing: number,\n\trankStackGap: number,\n\ttarget: Point,\n\tcontentWidth: number,\n\tsuppressSpread?: boolean,\n): void {\n\tfor (const [rank, stack] of rankStacks(childIds, nodeBoxes, flowRanks)) {\n\t\t// Filter out locked children for layout purposes. All locks are\n\t\t// respected (fixed-position and exact-position alike) so lock\n\t\t// behavior is consistent across ranked/unranked/horizontal contract\n\t\t// paths and does not depend on unrelated flow edges (Codex P2).\n\t\tconst unlocked: Array<{ childId: string; box: Box }> = [];\n\t\tfor (const item of stack) {\n\t\t\tif (locks.has(item.childId)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\t\tmessage: `Locked child ${item.childId} was not moved into contract swimlane slot.`,\n\t\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\t\tdetail: { nodeId: item.childId },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tunlocked.push(item);\n\t\t\t}\n\t\t}\n\t\tif (unlocked.length === 0) continue;\n\n\t\tif (unlocked.length === 1) {\n\t\t\t// Single child: center within the lane content width (target.x is\n\t\t\t// already the content-left edge, i.e. lane-left + padding).\n\t\t\tconst { childId, box } = unlocked[0]!;\n\t\t\tconst next = {\n\t\t\t\t...box,\n\t\t\t\tx: target.x + (contentWidth - box.width) / 2,\n\t\t\t\ty: target.y + rank * rankSpacing,\n\t\t\t};\n\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\tmovedChildIds.add(childId);\n\t\t\t}\n\t\t\tnodeBoxes.set(childId, next);\n\t\t} else {\n\t\t\t// Determine whether to spread horizontally or stack vertically.\n\t\t\t// When 3+ children share a rank, horizontal distribution avoids\n\t\t\t// vertical overflow that causes sibling_overlap_collapse (Issue #62).\n\t\t\t// For 2 children, vertical stacking is acceptable.\n\t\t\tconst shouldSpread =\n\t\t\t\t!suppressSpread && unlocked.length >= CROSS_AXIS_SPREAD_THRESHOLD;\n\n\t\t\tif (!shouldSpread) {\n\t\t\t\t// Normal vertical stacking (2 children fit within rank).\n\t\t\t\tlet yOffset = 0;\n\t\t\t\tfor (const { childId, box } of unlocked) {\n\t\t\t\t\tconst next = {\n\t\t\t\t\t\t...box,\n\t\t\t\t\t\tx: target.x + (contentWidth - box.width) / 2,\n\t\t\t\t\t\ty: target.y + rank * rankSpacing + yOffset,\n\t\t\t\t\t};\n\t\t\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\t\t\tmovedChildIds.add(childId);\n\t\t\t\t\t}\n\t\t\t\t\tnodeBoxes.set(childId, next);\n\t\t\t\t\tyOffset += box.height + rankStackGap;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Cross-axis (horizontal) distribution: pack children left to\n\t\t\t\t// right by their own widths plus gaps (NOT equal subslots — a\n\t\t\t\t// child wider than the average subslot would overlap neighbors),\n\t\t\t\t// then center the whole packed row within the lane content width.\n\t\t\t\t// contentWidth was pre-sized to fit this row (see\n\t\t\t\t// maxCrossAxisSpreadWidth), so the row stays within lane bounds,\n\t\t\t\t// and target.x is already the content-left edge (Codex P2). All\n\t\t\t\t// children share the same y (same rank → no vertical stagger).\n\t\t\t\tconst packedWidth = crossAxisSpreadWidth(unlocked, rankStackGap);\n\t\t\t\tlet xCursor = target.x + Math.max(0, (contentWidth - packedWidth) / 2);\n\t\t\t\tfor (const { childId, box } of unlocked) {\n\t\t\t\t\tconst next = {\n\t\t\t\t\t\t...box,\n\t\t\t\t\t\tx: xCursor,\n\t\t\t\t\t\ty: target.y + rank * rankSpacing,\n\t\t\t\t\t};\n\t\t\t\t\tif (next.x !== box.x || next.y !== box.y) {\n\t\t\t\t\t\tmovedChildIds.add(childId);\n\t\t\t\t\t}\n\t\t\t\t\tnodeBoxes.set(childId, next);\n\t\t\t\t\txCursor += box.width + rankStackGap;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\tcode: \"swimlane_contract.cross_axis_distributed\",\n\t\t\t\t\tmessage: `Spread ${unlocked.length} same-rank children horizontally in contract lane (rank ${rank}).`,\n\t\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\trank,\n\t\t\t\t\t\tchildCount: unlocked.length,\n\t\t\t\t\t\tcontentWidth,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction rankStacks(\n\tchildIds: readonly string[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n): Map<number, Array<{ childId: string; box: Box }>> {\n\tconst stacks = new Map<number, Array<{ childId: string; box: Box }>>();\n\tfor (const childId of childIds) {\n\t\tconst box = nodeBoxes.get(childId);\n\t\tif (box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rank = flowRanks.get(childId) ?? 0;\n\t\tconst stack = stacks.get(rank) ?? [];\n\t\tstack.push({ childId, box });\n\t\tstacks.set(rank, stack);\n\t}\n\tfor (const stack of stacks.values()) {\n\t\tstack.sort((a, b) => {\n\t\t\tconst deltaY = a.box.y - b.box.y;\n\t\t\treturn deltaY === 0 ? a.childId.localeCompare(b.childId) : deltaY;\n\t\t});\n\t}\n\treturn stacks;\n}\n\nfunction applyHorizontalSwimlaneContract(\n\tswimlane: Swimlane,\n\tnodeBoxes: Map<string, Box>,\n\tlaneBounds: ReadonlyArray<Box | undefined>,\n\theaderHeight: number,\n\tpadding: number,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\tlaneGutter: number,\n): SwimlaneContractLayout {\n\tconst populatedBounds = laneBounds.filter(\n\t\t(box): box is Box => box !== undefined,\n\t);\n\tconst top = Math.min(...populatedBounds.map((box) => box.y));\n\tconst left = Math.min(...populatedBounds.map((box) => box.x));\n\tconst slotWidth =\n\t\tMath.max(...populatedBounds.map((box) => box.width)) +\n\t\theaderHeight +\n\t\tpadding * 2;\n\tconst slotHeight =\n\t\tMath.max(...populatedBounds.map((box) => box.height)) + padding * 2;\n\tconst laneStep = slotHeight + laneGutter;\n\n\tfor (let index = 0; index < swimlane.lanes.length; index += 1) {\n\t\tconst lane = swimlane.lanes[index];\n\t\tconst bounds = laneBounds[index];\n\t\tif (lane === undefined || bounds === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst target = {\n\t\t\tx: left + headerHeight + padding,\n\t\t\ty: top + laneStep * index + padding,\n\t\t};\n\t\tmoveLaneChildren(\n\t\t\tlane.children,\n\t\t\tnodeBoxes,\n\t\t\tlocks,\n\t\t\tdiagnostics,\n\t\t\tmovedChildIds,\n\t\t\t{\n\t\t\t\tx: target.x - bounds.x,\n\t\t\t\ty: target.y - bounds.y,\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\tbox: {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth: slotWidth,\n\t\t\theight: laneStep * (swimlane.lanes.length - 1) + slotHeight,\n\t\t},\n\t\tslotWidth,\n\t\tslotHeight,\n\t\tlaneStep,\n\t};\n}\n\nfunction moveLaneChildren(\n\tchildIds: readonly string[],\n\tnodeBoxes: Map<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tdiagnostics: Diagnostic[],\n\tmovedChildIds: Set<string>,\n\toffset: Point,\n): void {\n\tfor (const childId of childIds) {\n\t\tconst box = nodeBoxes.get(childId);\n\t\tif (box === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (locks.has(childId)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.locked-target-not-moved\",\n\t\t\t\tmessage: `Locked child ${childId} was not moved into contract swimlane slot.`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: { nodeId: childId },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (offset.x !== 0 || offset.y !== 0) {\n\t\t\tmovedChildIds.add(childId);\n\t\t}\n\t\tnodeBoxes.set(childId, {\n\t\t\t...box,\n\t\t\tx: box.x + offset.x,\n\t\t\ty: box.y + offset.y,\n\t\t});\n\t}\n}\n\nfunction removeResolvedOverlapDiagnostics(\n\tdiagnostics: Diagnostic[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n): void {\n\tfor (let index = diagnostics.length - 1; index >= 0; index -= 1) {\n\t\tconst diagnostic = diagnostics[index];\n\t\tif (diagnostic?.code !== \"constraints.overlap.unresolved\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst firstId = detailString(diagnostic, \"firstId\");\n\t\tconst secondId = detailString(diagnostic, \"secondId\");\n\t\tconst first = firstId === undefined ? undefined : nodeBoxes.get(firstId);\n\t\tconst second = secondId === undefined ? undefined : nodeBoxes.get(secondId);\n\t\tif (\n\t\t\tfirst !== undefined &&\n\t\t\tsecond !== undefined &&\n\t\t\t!intersectsAabb(first, second)\n\t\t) {\n\t\t\tdiagnostics.splice(index, 1);\n\t\t}\n\t}\n}\n\nfunction reportSwimlaneConstraintInvalidations(\n\tconstraints: readonly Constraint[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tfor (const constraint of constraints) {\n\t\tconst invalidatedNodeIds = movedConstraintNodeIds(\n\t\t\tconstraint,\n\t\t\tnodeBoxes,\n\t\t\tmovedChildIds,\n\t\t);\n\t\tif (invalidatedNodeIds.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"constraints.swimlane-contract.invalidated\",\n\t\t\tmessage: `Contract swimlane placement moved node(s) after ${constraint.kind} constraint solving; final geometry no longer satisfies that constraint.`,\n\t\t\tpath: [\"swimlanes\"],\n\t\t\tdetail: {\n\t\t\t\tconstraintKind: constraint.kind,\n\t\t\t\t...(constraint.id === undefined ? {} : { constraintId: constraint.id }),\n\t\t\t\tnodeIds: invalidatedNodeIds,\n\t\t\t},\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction movedConstraintNodeIds(\n\tconstraint: Constraint,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tswitch (constraint.kind) {\n\t\tcase \"exact-position\":\n\t\t\treturn [];\n\t\tcase \"containment\":\n\t\t\treturn movedContainmentViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"relative-position\":\n\t\t\treturn movedRelativeViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"align\":\n\t\t\treturn movedAlignViolations(constraint, nodeBoxes, movedChildIds);\n\t\tcase \"distribute\":\n\t\t\treturn movedDistributeViolations(constraint, nodeBoxes, movedChildIds);\n\t}\n}\n\nfunction movedContainmentViolations(\n\tconstraint: Extract<Constraint, { kind: \"containment\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tconst container = nodeBoxes.get(constraint.containerId);\n\tif (container === undefined) {\n\t\treturn [];\n\t}\n\tconst content = paddedContentBox(container, constraint.padding);\n\treturn constraint.childIds.filter((childId) => {\n\t\tif (!movedChildIds.has(childId)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst child = nodeBoxes.get(childId);\n\t\treturn child !== undefined && !boxInside(child, content);\n\t});\n}\n\nfunction movedRelativeViolations(\n\tconstraint: Extract<Constraint, { kind: \"relative-position\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (\n\t\t!movedChildIds.has(constraint.sourceId) &&\n\t\t!movedChildIds.has(constraint.referenceId)\n\t) {\n\t\treturn [];\n\t}\n\tconst source = nodeBoxes.get(constraint.sourceId);\n\tconst reference = nodeBoxes.get(constraint.referenceId);\n\tif (source === undefined || reference === undefined) {\n\t\treturn [];\n\t}\n\treturn sameBoxPosition(\n\t\tsource,\n\t\texpectedRelativeBox(source, reference, constraint),\n\t)\n\t\t? []\n\t\t: [constraint.sourceId];\n}\n\nfunction movedAlignViolations(\n\tconstraint: Extract<Constraint, { kind: \"align\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (!constraint.targetIds.some((id) => movedChildIds.has(id))) {\n\t\treturn [];\n\t}\n\tconst targets = constraint.targetIds\n\t\t.map((id) => ({ id, box: nodeBoxes.get(id) }))\n\t\t.filter(\n\t\t\t(target): target is { id: string; box: Box } => target.box !== undefined,\n\t\t);\n\tconst anchor = targets[0];\n\tif (anchor === undefined) {\n\t\treturn [];\n\t}\n\tconst expected = alignmentValue(anchor.box, constraint.axis);\n\treturn targets\n\t\t.filter(\n\t\t\t(target) =>\n\t\t\t\tmovedChildIds.has(target.id) &&\n\t\t\t\t!sameNumber(alignmentValue(target.box, constraint.axis), expected),\n\t\t)\n\t\t.map((target) => target.id);\n}\n\nfunction movedDistributeViolations(\n\tconstraint: Extract<Constraint, { kind: \"distribute\" }>,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tmovedChildIds: ReadonlySet<string>,\n): string[] {\n\tif (!constraint.targetIds.some((id) => movedChildIds.has(id))) {\n\t\treturn [];\n\t}\n\tconst targets = constraint.targetIds\n\t\t.map((id) => ({ id, box: nodeBoxes.get(id) }))\n\t\t.filter(\n\t\t\t(target): target is { id: string; box: Box } => target.box !== undefined,\n\t\t)\n\t\t.sort((a, b) => {\n\t\t\tconst delta =\n\t\t\t\tconstraint.axis === \"horizontal\"\n\t\t\t\t\t? a.box.x - b.box.x\n\t\t\t\t\t: a.box.y - b.box.y;\n\t\t\treturn delta === 0 ? a.id.localeCompare(b.id) : delta;\n\t\t});\n\tif (targets.length < 3) {\n\t\treturn [];\n\t}\n\tconst first = targets[0];\n\tconst last = targets.at(-1);\n\tif (first === undefined || last === undefined) {\n\t\treturn [];\n\t}\n\tconst expectedSpacing =\n\t\tconstraint.spacing ??\n\t\t(distributionStart(last.box, constraint.axis) -\n\t\t\tdistributionStart(first.box, constraint.axis)) /\n\t\t\t(targets.length - 1);\n\treturn targets\n\t\t.slice(1)\n\t\t.filter((target, index) => {\n\t\t\tconst previous = targets[index];\n\t\t\tif (previous === undefined || !movedChildIds.has(target.id)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn !sameNumber(\n\t\t\t\tdistributionStart(target.box, constraint.axis) -\n\t\t\t\t\tdistributionStart(previous.box, constraint.axis),\n\t\t\t\texpectedSpacing,\n\t\t\t);\n\t\t})\n\t\t.map((target) => target.id);\n}\n\nfunction expectedRelativeBox(\n\tsource: Box,\n\treference: Box,\n\tconstraint: Extract<Constraint, { kind: \"relative-position\" }>,\n): Box {\n\tconst offset = constraint.offset ?? { x: 0, y: 0 };\n\tswitch (constraint.relation) {\n\t\tcase \"above\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y - source.height + offset.y,\n\t\t\t};\n\t\tcase \"right-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + reference.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t\tcase \"below\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x + offset.x,\n\t\t\t\ty: reference.y + reference.height + offset.y,\n\t\t\t};\n\t\tcase \"left-of\":\n\t\t\treturn {\n\t\t\t\t...source,\n\t\t\t\tx: reference.x - source.width + offset.x,\n\t\t\t\ty: reference.y + offset.y,\n\t\t\t};\n\t}\n}\n\nfunction paddedContentBox(container: Box, padding: Insets | undefined): Box {\n\tconst margin = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\tx: container.x + margin.left,\n\t\ty: container.y + margin.top,\n\t\twidth: container.width - margin.left - margin.right,\n\t\theight: container.height - margin.top - margin.bottom,\n\t};\n}\n\nfunction boxInside(child: Box, container: Box): boolean {\n\treturn (\n\t\tchild.x >= container.x &&\n\t\tchild.y >= container.y &&\n\t\tchild.x + child.width <= container.x + container.width &&\n\t\tchild.y + child.height <= container.y + container.height\n\t);\n}\n\nfunction sameBoxPosition(first: Box, second: Box): boolean {\n\treturn sameNumber(first.x, second.x) && sameNumber(first.y, second.y);\n}\n\nfunction sameNumber(first: number, second: number): boolean {\n\treturn Math.abs(first - second) < 0.001;\n}\n\nfunction alignmentValue(\n\tbox: Box,\n\taxis: Extract<Constraint, { kind: \"align\" }>[\"axis\"],\n): number {\n\tswitch (axis) {\n\t\tcase \"x\":\n\t\tcase \"left\":\n\t\t\treturn box.x;\n\t\tcase \"y\":\n\t\tcase \"top\":\n\t\t\treturn box.y;\n\t\tcase \"center-x\":\n\t\t\treturn box.x + box.width / 2;\n\t\tcase \"center-y\":\n\t\t\treturn box.y + box.height / 2;\n\t\tcase \"right\":\n\t\t\treturn box.x + box.width;\n\t\tcase \"bottom\":\n\t\t\treturn box.y + box.height;\n\t}\n}\n\nfunction distributionStart(\n\tbox: Box,\n\taxis: Extract<Constraint, { kind: \"distribute\" }>[\"axis\"],\n): number {\n\treturn axis === \"horizontal\" ? box.x : box.y;\n}\n\nfunction detailString(\n\tdiagnostic: Diagnostic,\n\tkey: \"firstId\" | \"secondId\",\n): string | undefined {\n\tconst value = diagnostic.detail?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction reportSwimlaneOverlaps(\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\toverlapSpacing: number,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst ids = [...nodeBoxes.keys()].sort();\n\tfor (const firstId of ids) {\n\t\tfor (const secondId of ids) {\n\t\t\tif (firstId >= secondId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst first = nodeBoxes.get(firstId);\n\t\t\tconst second = nodeBoxes.get(secondId);\n\t\t\tif (first === undefined || second === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!intersectsAabb(first, second)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\tmessage: `Boxes ${firstId} and ${secondId} still overlap after contract swimlane placement with configured spacing ${overlapSpacing}.`,\n\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\tdetail: {\n\t\t\t\t\tfirstId,\n\t\t\t\t\tsecondId,\n\t\t\t\t\tfirstLocked: locks.has(firstId),\n\t\t\t\t\tsecondLocked: locks.has(secondId),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction coordinateNodes(\n\tnodes: readonly NormalizedNode[],\n\tboxes: ReadonlyMap<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): CoordinatedNode[] {\n\tconst coordinated: CoordinatedNode[] = [];\n\n\tfor (const node of nodes) {\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"solver.node-box.missing\",\n\t\t\t\tmessage: `Node ${node.id} has no solved box.`,\n\t\t\t\tpath: [\"nodes\", node.id],\n\t\t\t\tdetail: { nodeId: node.id },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Place ports first — they may expand the node box to\n\t\t// accommodate minimum port spacing (#42).\n\t\tconst ports =\n\t\t\tnode.ports === undefined\n\t\t\t\t? undefined\n\t\t\t\t: coordinatePorts(node, box, options.portShifting);\n\n\t\tconst geometry = computeShapeGeometry({\n\t\t\tshape: node.shape,\n\t\t\tbox,\n\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t});\n\n\t\tcoordinated.push({\n\t\t\tid: node.id,\n\t\t\t...(node.label === undefined ? {} : { label: node.label }),\n\t\t\t...(node.style === undefined ? {} : { style: node.style }),\n\t\t\t...(ports === undefined ? {} : { ports }),\n\t\t\t...(node.compartments === undefined\n\t\t\t\t? {}\n\t\t\t\t: { compartments: node.compartments }),\n\t\t\t...(node.labelLayout === undefined\n\t\t\t\t? {}\n\t\t\t\t: { labelLayout: node.labelLayout }),\n\t\t\tshape: node.shape,\n\t\t\t...(node.metadata === undefined ? {} : { metadata: node.metadata }),\n\t\t\tbox: geometry.box,\n\t\t\tanchors: geometry.anchors,\n\t\t\t...(node.parentId === undefined ? {} : { parentId: node.parentId }),\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nconst PORT_BOX_SIZE = 10;\nconst MIN_PORT_EDGE_GAP = 12;\n\n/**\n * Pre-expand node boxes whose sides cannot accommodate all ports\n * at the minimum spacing. Runs before constraint solving so\n * containment, overlap repair, and swimlane contracts see the\n * expanded sizes (Codex P2: #42).\n */\nfunction expandNodeBoxesForPorts(\n\tnodes: readonly NormalizedNode[],\n\tboxes: Map<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): void {\n\tconst shiftingEnabled = options.portShifting?.enabled ?? true;\n\tif (!shiftingEnabled) return;\n\tconst requestedSpacing = options.portShifting?.spacing ?? 24;\n\tconst minSpacing = Math.max(\n\t\trequestedSpacing,\n\t\tPORT_BOX_SIZE + MIN_PORT_EDGE_GAP,\n\t);\n\n\tfor (const node of nodes) {\n\t\tif (node.ports === undefined || node.ports.length === 0) continue;\n\t\tconst box = boxes.get(node.id);\n\t\tif (box === undefined) continue;\n\n\t\t// Aggregate required expansion per axis so all sides\n\t\t// are handled atomically (Codex P2: avoid stale anchors).\n\t\tlet heightExpansion = 0;\n\t\tlet widthExpansion = 0;\n\n\t\tconst portsBySide = new Map<string, NormalizedNode[\"ports\"]>();\n\t\tfor (const port of node.ports) {\n\t\t\tconst list = portsBySide.get(port.side) ?? [];\n\t\t\tlist.push(port);\n\t\t\tportsBySide.set(port.side, list);\n\t\t}\n\n\t\tfor (const [side, ports] of portsBySide) {\n\t\t\tconst count = (ports ?? []).length;\n\t\t\tif (count <= 1) continue;\n\t\t\tconst isVertical = side === \"left\" || side === \"right\";\n\t\t\tconst availableSpan = isVertical ? box.height : box.width;\n\t\t\tconst requiredSpan = (count - 1) * minSpacing + PORT_BOX_SIZE;\n\t\t\tif (requiredSpan > availableSpan) {\n\t\t\t\tconst expansion = requiredSpan - availableSpan;\n\t\t\t\tif (isVertical) {\n\t\t\t\t\theightExpansion = Math.max(heightExpansion, expansion);\n\t\t\t\t} else {\n\t\t\t\t\twidthExpansion = Math.max(widthExpansion, expansion);\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\tcode: \"port_capacity_overflow\",\n\t\t\t\t\tmessage: `Expanded node ${node.id} ${isVertical ? \"height\" : \"width\"} by ${Math.ceil(expansion)} px to fit ${count} port(s) on ${side} side.`,\n\t\t\t\t\tpath: [\"nodes\", node.id, \"ports\"],\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tnodeId: node.id,\n\t\t\t\t\t\tside,\n\t\t\t\t\t\tportCount: count,\n\t\t\t\t\t\texpansion: Math.ceil(expansion),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (heightExpansion > 0) {\n\t\t\tbox.y -= heightExpansion / 2;\n\t\t\tbox.height += heightExpansion;\n\t\t}\n\t\tif (widthExpansion > 0) {\n\t\t\tbox.x -= widthExpansion / 2;\n\t\t\tbox.width += widthExpansion;\n\t\t}\n\t\t// Recenter the label layout to match the expanded box.\n\t\t// Only shift layout.box — lines and contentBox stay\n\t\t// relative to the label area so the SVG renderer's\n\t\t// annotation.box + line.box addition is not doubled\n\t\t// (Codex P2: multiline labels on port-expanded nodes).\n\t\tif (\n\t\t\t(heightExpansion > 0 || widthExpansion > 0) &&\n\t\t\tnode.labelLayout !== undefined\n\t\t) {\n\t\t\tconst layout = node.labelLayout;\n\t\t\tconst newOffsetX = Math.max(0, (box.width - layout.box.width) / 2);\n\t\t\tconst newOffsetY = Math.max(0, (box.height - layout.box.height) / 2);\n\t\t\t(node as NormalizedNode).labelLayout = {\n\t\t\t\t...layout,\n\t\t\t\tbox: {\n\t\t\t\t\t...layout.box,\n\t\t\t\t\tx: newOffsetX,\n\t\t\t\t\ty: newOffsetY,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction coordinatePorts(\n\tnode: NormalizedNode,\n\tnodeBox: Box,\n\tportShifting: PortShiftingOptions | undefined,\n): CoordinatedPort[] {\n\tconst portsBySide = new Map<string, NormalizedNode[\"ports\"]>();\n\tfor (const port of node.ports ?? []) {\n\t\tconst ports = portsBySide.get(port.side) ?? [];\n\t\tports.push(port);\n\t\tportsBySide.set(port.side, ports);\n\t}\n\n\tconst coordinated: CoordinatedPort[] = [];\n\tfor (const [side, ports] of portsBySide) {\n\t\tconst sorted = [...(ports ?? [])].sort((a, b) => {\n\t\t\tconst order = (a.order ?? 0) - (b.order ?? 0);\n\t\t\treturn order === 0 ? a.id.localeCompare(b.id) : order;\n\t\t});\n\t\tfor (let index = 0; index < sorted.length; index += 1) {\n\t\t\tconst port = sorted[index];\n\t\t\tif (port === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst anchor = portAnchor(\n\t\t\t\tnodeBox,\n\t\t\t\tside as CoordinatedPort[\"side\"],\n\t\t\t\tindex,\n\t\t\t\tsorted.length,\n\t\t\t\tportShifting,\n\t\t\t);\n\t\t\tconst box = portBox(anchor);\n\t\t\tcoordinated.push({ ...port, box, anchor });\n\t\t}\n\t}\n\n\treturn coordinated.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction portAnchor(\n\tnodeBox: Box,\n\tside: CoordinatedPort[\"side\"],\n\tindex: number,\n\tcount: number,\n\tportShifting: PortShiftingOptions | undefined,\n): Point {\n\tconst shiftingEnabled = portShifting?.enabled ?? true;\n\tconst requestedSpacing = portShifting?.spacing ?? 24;\n\tconst maxOffset =\n\t\tside === \"left\" || side === \"right\"\n\t\t\t? nodeBox.height / 2\n\t\t\t: nodeBox.width / 2;\n\t// When (count - 1) * spacing would overflow the node edge, compress the\n\t// spacing so every port still gets a distinct anchor evenly distributed\n\t// within the available extent, instead of clamping several ports onto the\n\t// same endpoint.\n\tconst availableSpan = 2 * maxOffset;\n\tconst minSpacing = PORT_BOX_SIZE + MIN_PORT_EDGE_GAP;\n\tconst spacing =\n\t\tshiftingEnabled && count > 1\n\t\t\t? Math.max(\n\t\t\t\t\tMath.min(requestedSpacing, availableSpan / (count - 1)),\n\t\t\t\t\tminSpacing,\n\t\t\t\t)\n\t\t\t: requestedSpacing;\n\tconst centeredOffset = shiftingEnabled\n\t\t? (index - (count - 1) / 2) * spacing\n\t\t: 0;\n\tswitch (side) {\n\t\tcase \"left\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x,\n\t\t\t\ty: nodeBox.y + nodeBox.height / 2 + centeredOffset,\n\t\t\t};\n\t\tcase \"right\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width,\n\t\t\t\ty: nodeBox.y + nodeBox.height / 2 + centeredOffset,\n\t\t\t};\n\t\tcase \"top\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width / 2 + centeredOffset,\n\t\t\t\ty: nodeBox.y,\n\t\t\t};\n\t\tcase \"bottom\":\n\t\t\treturn {\n\t\t\t\tx: nodeBox.x + nodeBox.width / 2 + centeredOffset,\n\t\t\t\ty: nodeBox.y + nodeBox.height,\n\t\t\t};\n\t}\n}\n\nfunction portBox(anchor: Point): Box {\n\tconst size = PORT_BOX_SIZE;\n\treturn {\n\t\tx: anchor.x - size / 2,\n\t\ty: anchor.y - size / 2,\n\t\twidth: size,\n\t\theight: size,\n\t};\n}\n\nfunction portLabelBox(port: CoordinatedPort): Box {\n\tconst textWidth = Math.max(0, (port.label?.text.length ?? 0) * 6);\n\tconst height = 12;\n\tconst gap = 8;\n\tconst x =\n\t\tport.side === \"left\"\n\t\t\t? port.anchor.x - gap - textWidth\n\t\t\t: port.anchor.x + gap;\n\treturn {\n\t\tx,\n\t\ty: port.anchor.y - 8 - height,\n\t\twidth: textWidth,\n\t\theight,\n\t};\n}\n\nfunction coordinateSwimlanes(\n\tswimlanes: readonly Swimlane[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tlayouts: ReadonlyMap<string, SwimlaneContractLayout>,\n): Swimlane[] {\n\treturn swimlanes.map((swimlane) => {\n\t\tconst layout = swimlane.layout ?? \"overlay\";\n\t\tconst headerHeight = swimlane.headerHeight ?? 28;\n\t\tconst padding = swimlane.padding ?? 16;\n\t\tconst contractLayout = layouts.get(swimlane.id);\n\t\tif (layout === \"contract\" && contractLayout !== undefined) {\n\t\t\tconst lanes = swimlane.lanes.map((lane, index) => {\n\t\t\t\tconst box =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: contractLayout.box.x + contractLayout.laneStep * index,\n\t\t\t\t\t\t\t\ty: contractLayout.box.y,\n\t\t\t\t\t\t\t\twidth: contractLayout.slotWidth,\n\t\t\t\t\t\t\t\theight: contractLayout.box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: contractLayout.box.x,\n\t\t\t\t\t\t\t\ty: contractLayout.box.y + contractLayout.laneStep * index,\n\t\t\t\t\t\t\t\twidth: contractLayout.box.width,\n\t\t\t\t\t\t\t\theight: contractLayout.slotHeight,\n\t\t\t\t\t\t\t};\n\t\t\t\tconst headerBox =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: headerHeight,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: headerHeight,\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t};\n\t\t\t\tconst contentBox =\n\t\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y + headerHeight,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: Math.max(0, box.height - headerHeight),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x + headerHeight,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: Math.max(0, box.width - headerHeight),\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\t...lane,\n\t\t\t\t\tbox,\n\t\t\t\t\theaderBox,\n\t\t\t\t\tcontentBox,\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...swimlane,\n\t\t\t\tlanes,\n\t\t\t\tbox: contractLayout.box,\n\t\t\t\t...(headerHeight === undefined ? {} : { headerHeight }),\n\t\t\t\t...(padding === undefined ? {} : { padding }),\n\t\t\t};\n\t\t}\n\t\tconst laneContentBoxes = swimlane.lanes.map((lane) => {\n\t\t\tconst childBoxes = lane.children\n\t\t\t\t.map((child) => nodeBoxes.get(child))\n\t\t\t\t.filter((box): box is Box => box !== undefined);\n\t\t\treturn childBoxes.length === 0 ? undefined : unionBoxes(childBoxes);\n\t\t});\n\t\tconst laneUnion =\n\t\t\tlaneContentBoxes.filter((box): box is Box => box !== undefined).length ===\n\t\t\t0\n\t\t\t\t? { x: 0, y: 0, width: 120, height: 80 }\n\t\t\t\t: unionBoxes(\n\t\t\t\t\t\tlaneContentBoxes.filter((box): box is Box => box !== undefined),\n\t\t\t\t\t);\n\t\tconst outer = expand(laneUnion, padding, headerHeight);\n\t\tconst laneCount = Math.max(1, swimlane.lanes.length);\n\t\tconst lanes = swimlane.lanes.map((lane, index) => {\n\t\t\tconst box =\n\t\t\t\tswimlane.orientation === \"vertical\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tx: outer.x + (outer.width / laneCount) * index,\n\t\t\t\t\t\t\ty: outer.y,\n\t\t\t\t\t\t\twidth: outer.width / laneCount,\n\t\t\t\t\t\t\theight: outer.height,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tx: outer.x,\n\t\t\t\t\t\t\ty: outer.y + (outer.height / laneCount) * index,\n\t\t\t\t\t\t\twidth: outer.width,\n\t\t\t\t\t\t\theight: outer.height / laneCount,\n\t\t\t\t\t\t};\n\t\t\tconst headerBox =\n\t\t\t\tlayout === \"contract\"\n\t\t\t\t\t? swimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: headerHeight,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: headerHeight,\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\tconst contentBox =\n\t\t\t\tlayout === \"contract\"\n\t\t\t\t\t? swimlane.orientation === \"vertical\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: box.x,\n\t\t\t\t\t\t\t\ty: box.y + headerHeight,\n\t\t\t\t\t\t\t\twidth: box.width,\n\t\t\t\t\t\t\t\theight: Math.max(0, box.height - headerHeight),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: box.x + headerHeight,\n\t\t\t\t\t\t\t\ty: box.y,\n\t\t\t\t\t\t\t\twidth: Math.max(0, box.width - headerHeight),\n\t\t\t\t\t\t\t\theight: box.height,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\t...lane,\n\t\t\t\tbox,\n\t\t\t\t...(headerBox === undefined ? {} : { headerBox }),\n\t\t\t\t...(contentBox === undefined ? {} : { contentBox }),\n\t\t\t};\n\t\t});\n\t\treturn {\n\t\t\t...swimlane,\n\t\t\tlanes,\n\t\t\tbox: outer,\n\t\t\t...(headerHeight === undefined ? {} : { headerHeight }),\n\t\t\t...(padding === undefined ? {} : { padding }),\n\t\t};\n\t});\n}\n\nfunction coordinateFrame(\n\tframe: NonNullable<NormalizedDiagram[\"frame\"]>,\n\tcontentBounds: Box,\n): CoordinatedFrame {\n\tconst padding = framePadding(frame.padding);\n\tconst titleHeight = frame.headerHeight ?? 28;\n\tconst titleWidth = Math.max(180, frame.titleTab.length * 7);\n\tconst box = {\n\t\tx: contentBounds.x - padding.left,\n\t\ty: contentBounds.y - padding.top - titleHeight,\n\t\twidth: contentBounds.width + padding.left + padding.right,\n\t\theight: contentBounds.height + padding.top + padding.bottom + titleHeight,\n\t};\n\treturn {\n\t\t...frame,\n\t\theaderHeight: titleHeight,\n\t\tpadding: frame.padding ?? 32,\n\t\tbox,\n\t\ttitleBox: {\n\t\t\tx: box.x,\n\t\t\ty: box.y,\n\t\t\twidth: Math.min(titleWidth, box.width * 0.8),\n\t\t\theight: titleHeight,\n\t\t},\n\t};\n}\n\nfunction framePadding(\n\tvalue: NonNullable<NormalizedDiagram[\"frame\"]>[\"padding\"],\n): Insets {\n\treturn normalizeInsets(value ?? 32);\n}\n\nfunction expand(box: Box, padding: number, titleSize: number): Box {\n\treturn {\n\t\tx: box.x - padding,\n\t\ty: box.y - padding - titleSize,\n\t\twidth: box.width + padding * 2,\n\t\theight: box.height + padding * 2 + titleSize,\n\t};\n}\n\nfunction coordinateGroups(\n\tgroups: readonly NormalizedGroup[],\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n): CoordinatedGroup[] {\n\tconst coordinated: CoordinatedGroup[] = [];\n\tconst groupBoxes = new Map<string, Box>();\n\n\tfor (const group of groups) {\n\t\tconst childBoxes: Box[] = [];\n\t\tlet missing = false;\n\n\t\tfor (const nodeId of group.nodeIds) {\n\t\t\tconst box = nodeBoxes.get(nodeId);\n\t\t\tif (box === undefined) {\n\t\t\t\tmissing = true;\n\t\t\t\tdiagnostics.push(groupReferenceMissing(group.id, \"node\", nodeId));\n\t\t\t} else {\n\t\t\t\tchildBoxes.push(box);\n\t\t\t}\n\t\t}\n\n\t\tfor (const childGroupId of group.groupIds) {\n\t\t\tconst box = groupBoxes.get(childGroupId);\n\t\t\tif (box === undefined) {\n\t\t\t\tmissing = true;\n\t\t\t\tdiagnostics.push(\n\t\t\t\t\tgroupReferenceMissing(group.id, \"group\", childGroupId),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchildBoxes.push(box);\n\t\t\t}\n\t\t}\n\n\t\tif (missing || childBoxes.length === 0) {\n\t\t\tif (childBoxes.length === 0) {\n\t\t\t\tdiagnostics.push(groupReferenceMissing(group.id, \"child\", undefined));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst geometry = computeContainerGeometry({\n\t\t\tid: group.id,\n\t\t\tchildBoxes,\n\t\t\tpadding: group.padding,\n\t\t\t...(group.labelLayout === undefined\n\t\t\t\t? {}\n\t\t\t\t: { labelLayout: group.labelLayout }),\n\t\t\tobstacleMargin: options.obstacleMargin ?? 0,\n\t\t});\n\t\tgroupBoxes.set(group.id, geometry.box);\n\t\tdiagnostics.push(...geometry.diagnostics);\n\t\tcoordinated.push({\n\t\t\t...group,\n\t\t\tbox: geometry.box,\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nfunction coordinateMatrices(\n\tmatrices: readonly MatrixBlock[],\n): CoordinatedMatrixBlock[] {\n\treturn matrices.map((block) => ({\n\t\t...block,\n\t\tbox: blockBox(block, {\n\t\t\twidth:\n\t\t\t\tdefaultMatrixRowHeaderWidth(block) +\n\t\t\t\tMath.max(1, block.cols.length) * DEFAULT_MATRIX_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, block.rows.length + 1) * DEFAULT_MATRIX_CELL_SIZE.height,\n\t\t}),\n\t}));\n}\n\nfunction defaultMatrixRowHeaderWidth(block: MatrixBlock): number {\n\treturn block.rows.length === 0\n\t\t? 0\n\t\t: Math.min(96, DEFAULT_MATRIX_CELL_SIZE.width);\n}\n\nfunction coordinateTables(\n\ttables: readonly TableBlock[],\n): CoordinatedTableBlock[] {\n\treturn tables.map((table) => {\n\t\tconst box = blockBox(table, {\n\t\t\twidth: Math.max(1, table.columns.length) * DEFAULT_TABLE_CELL_SIZE.width,\n\t\t\theight:\n\t\t\t\tMath.max(1, table.rows.length + 1) * DEFAULT_TABLE_CELL_SIZE.height,\n\t\t});\n\t\treturn {\n\t\t\t...table,\n\t\t\tbox,\n\t\t\tcolumnXOffsets: columnXOffsets(table, box),\n\t\t};\n\t});\n}\n\nfunction coordinateEvidencePanels(\n\tpanels: readonly EvidencePanel[],\n): CoordinatedEvidencePanel[] {\n\treturn panels.map((block) => ({\n\t\t...block,\n\t\tbox: blockBox(block, {\n\t\t\twidth: DEFAULT_PANEL_WIDTH,\n\t\t\theight: Math.max(1, block.items.length) * DEFAULT_PANEL_ITEM_HEIGHT,\n\t\t}),\n\t}));\n}\n\nfunction edgeBounds(edges: readonly CoordinatedEdge[]): Box[] {\n\treturn edges.flatMap((edge) => {\n\t\tif (edge.points.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\t// Include the rendered arrowhead polygon (tip/left/right) so page\n\t\t// overflow accounts for geometry that extends past the route points.\n\t\tconst extraPoints: Point[] = [];\n\t\tif (edge.points.length >= 2) {\n\t\t\tconst arrowhead = computeArrowhead(edge.points);\n\t\t\textraPoints.push(arrowhead.tip, arrowhead.left, arrowhead.right);\n\t\t}\n\t\tconst allPoints = [...edge.points, ...extraPoints];\n\t\tconst minX = Math.min(...allPoints.map((point) => point.x));\n\t\tconst minY = Math.min(...allPoints.map((point) => point.y));\n\t\tconst maxX = Math.max(...allPoints.map((point) => point.x));\n\t\tconst maxY = Math.max(...allPoints.map((point) => point.y));\n\t\treturn [\n\t\t\t{\n\t\t\t\tx: minX,\n\t\t\t\ty: minY,\n\t\t\t\twidth: maxX - minX,\n\t\t\t\theight: maxY - minY,\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction blockBox(\n\tblock: { position?: Point; size?: Size },\n\tdefaultSize: Size,\n): Box {\n\treturn {\n\t\tx: block.position?.x ?? 0,\n\t\ty: block.position?.y ?? 0,\n\t\twidth: block.size?.width ?? defaultSize.width,\n\t\theight: block.size?.height ?? defaultSize.height,\n\t};\n}\n\nfunction placeEvidenceBlocks(\n\tobstacleMargin: number | Insets,\n\tblocks: Array<{ position?: Point; box: Box }>,\n\tcontentBounds: Box,\n): void {\n\tconst margin = normalizeInsets(obstacleMargin);\n\tconst horizontalGap = Math.max(\n\t\tDEFAULT_EVIDENCE_BLOCK_GAP,\n\t\tmargin.right + margin.left,\n\t);\n\tconst verticalGap = Math.max(\n\t\tDEFAULT_EVIDENCE_BLOCK_GAP,\n\t\tmargin.bottom + margin.top,\n\t);\n\tlet nextY = contentBounds.y;\n\tconst x = contentBounds.x + contentBounds.width + horizontalGap;\n\tfor (const block of blocks) {\n\t\tif (block.position !== undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tblock.box.x = x;\n\t\tblock.box.y = nextY;\n\t\tnextY += block.box.height + verticalGap;\n\t}\n}\n\nfunction columnXOffsets(table: TableBlock, box: Box): number[] {\n\tif (table.columns.length === 0) {\n\t\treturn [];\n\t}\n\tconst columnWidth = box.width / table.columns.length;\n\treturn table.columns.map((_, index) => box.x + index * columnWidth);\n}\n\nfunction tableCellBox(\n\ttable: CoordinatedTableBlock,\n\tcolumnIndex: number,\n\trowIndex: number,\n\trowHeight: number,\n\tcolumnCount: number,\n): Box {\n\tconst x =\n\t\ttable.columnXOffsets[columnIndex] ??\n\t\ttable.box.x + (table.box.width / columnCount) * columnIndex;\n\tconst nextX =\n\t\ttable.columnXOffsets[columnIndex + 1] ?? table.box.x + table.box.width;\n\treturn {\n\t\tx,\n\t\ty: table.box.y + rowIndex * rowHeight,\n\t\twidth: nextX - x,\n\t\theight: rowHeight,\n\t};\n}\n\nfunction refreshTableColumnXOffsets(tables: CoordinatedTableBlock[]): void {\n\tfor (const table of tables) {\n\t\ttable.columnXOffsets = columnXOffsets(table, table.box);\n\t}\n}\n\nfunction measureEvidenceTextBlocks(\n\tmatrices: CoordinatedMatrixBlock[],\n\ttables: CoordinatedTableBlock[],\n\tpanels: CoordinatedEvidencePanel[],\n\ttextMeasurer?: TextMeasurer,\n): void {\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tfor (const matrix of matrices) {\n\t\tconst geometry = matrixGeometry(matrix);\n\t\tmatrix.columnLabelLayouts = matrix.cols.map((column) =>\n\t\t\tmeasureEvidenceTextLayout(column, geometry.columnHeaderBox, measurer),\n\t\t);\n\t\tmatrix.rowLabelLayouts = matrix.rows.map((row, index) =>\n\t\t\tmeasureEvidenceTextLayout(row, geometry.rowHeaderBox(index), measurer),\n\t\t);\n\t\tmatrix.cellLabelLayouts = matrix.rows.map((_, rowIndex) =>\n\t\t\tmatrix.cols.map((_, columnIndex) => {\n\t\t\t\tconst cell = matrix.cells[rowIndex]?.[columnIndex] ?? { text: \"\" };\n\t\t\t\treturn measureEvidenceTextLayout(\n\t\t\t\t\tcell.text,\n\t\t\t\t\tgeometry.cellBox(rowIndex, columnIndex),\n\t\t\t\t\tmeasurer,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const table of tables) {\n\t\tconst rowHeight = table.box.height / Math.max(1, table.rows.length + 1);\n\t\tconst columnCount = Math.max(1, table.columns.length);\n\t\ttable.columnLabelLayouts = table.columns.map((column, columnIndex) =>\n\t\t\tmeasureEvidenceTextLayout(\n\t\t\t\tcolumn.label.text,\n\t\t\t\ttableCellBox(table, columnIndex, 0, rowHeight, columnCount),\n\t\t\t\tmeasurer,\n\t\t\t),\n\t\t);\n\t\ttable.cellLabelLayouts = table.rows.map((row, rowIndex) =>\n\t\t\ttable.columns.map((column, columnIndex) => {\n\t\t\t\tconst cell = row.cells[column.id] ?? { text: \"\" };\n\t\t\t\treturn measureEvidenceTextLayout(\n\t\t\t\t\tcell.text,\n\t\t\t\t\ttableCellBox(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tcolumnIndex,\n\t\t\t\t\t\trowIndex + 1,\n\t\t\t\t\t\trowHeight,\n\t\t\t\t\t\tcolumnCount,\n\t\t\t\t\t),\n\t\t\t\t\tmeasurer,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const panel of panels) {\n\t\tconst geometry = panelGeometry(panel);\n\t\tpanel.titleLayout = measureEvidenceTextLayout(\n\t\t\t`${panel.kind}: ${panel.id}`,\n\t\t\tgeometry.titleBox,\n\t\t\tmeasurer,\n\t\t);\n\t\tpanel.itemLayouts = panel.items.map((item, index) =>\n\t\t\tmeasureEvidenceTextLayout(\n\t\t\t\tpanelItemText(item.label.text, item.detail?.text),\n\t\t\t\tgeometry.itemRowBox(index),\n\t\t\t\tmeasurer,\n\t\t\t),\n\t\t);\n\t}\n}\n\nfunction measureEvidenceTextLayout(\n\ttext: string,\n\tbox: Box,\n\ttextMeasurer: TextMeasurer,\n): EvidenceTextLayout {\n\tconst lineHeight = EVIDENCE_TEXT_FONT.lineHeight;\n\treturn {\n\t\tlines: wrapEvidenceText(text, {\n\t\t\tmaxWidth: Math.max(0, box.width - 8),\n\t\t\tmaxLines: Math.max(1, Math.floor((box.height - 4) / lineHeight)),\n\t\t\ttextMeasurer,\n\t\t}),\n\t};\n}\n\nfunction wrapEvidenceText(\n\ttext: string,\n\toptions: { maxWidth: number; maxLines: number; textMeasurer: TextMeasurer },\n): string[] {\n\tconst normalized = text.trim().replace(/\\s+/g, \" \");\n\tif (normalized.length === 0) {\n\t\treturn [\"\"];\n\t}\n\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tlet overflow = false;\n\tfor (const word of normalized.split(\" \")) {\n\t\tconst chunks = chunkEvidenceWord(\n\t\t\tword,\n\t\t\toptions.maxWidth,\n\t\t\toptions.textMeasurer,\n\t\t);\n\t\tfor (const chunk of chunks) {\n\t\t\tconst candidate = current.length === 0 ? chunk : `${current} ${chunk}`;\n\t\t\tif (\n\t\t\t\tmeasureEvidenceText(candidate, options.textMeasurer) <= options.maxWidth\n\t\t\t) {\n\t\t\t\tcurrent = candidate;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (current.length > 0) {\n\t\t\t\tlines.push(current);\n\t\t\t\tcurrent = chunk;\n\t\t\t} else {\n\t\t\t\tlines.push(chunk);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (lines.length >= options.maxLines) {\n\t\t\t\toverflow = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (overflow) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!overflow && current.length > 0) {\n\t\tlines.push(current);\n\t}\n\tif (lines.length > options.maxLines) {\n\t\toverflow = true;\n\t\tlines.length = options.maxLines;\n\t}\n\tif (overflow || lines.length === options.maxLines) {\n\t\tconst rendered = lines.join(\" \");\n\t\tif (rendered.length < normalized.length) {\n\t\t\tlines[lines.length - 1] = ellipsizeMeasuredEvidenceLine(\n\t\t\t\tlines[lines.length - 1] ?? \"\",\n\t\t\t\toptions.maxWidth,\n\t\t\t\toptions.textMeasurer,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn lines.length === 0 ? [\"\"] : lines;\n}\n\nfunction chunkEvidenceWord(\n\tword: string,\n\tmaxWidth: number,\n\ttextMeasurer: TextMeasurer,\n): string[] {\n\tif (measureEvidenceText(word, textMeasurer) <= maxWidth) {\n\t\treturn [word];\n\t}\n\tconst chunks: string[] = [];\n\tlet current = \"\";\n\tfor (const char of Array.from(word)) {\n\t\tconst candidate = `${current}${char}`;\n\t\tif (\n\t\t\tcurrent.length > 0 &&\n\t\t\tmeasureEvidenceText(candidate, textMeasurer) > maxWidth\n\t\t) {\n\t\t\tchunks.push(current);\n\t\t\tcurrent = char;\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent = candidate;\n\t}\n\tif (current.length > 0) {\n\t\tchunks.push(current);\n\t}\n\treturn chunks.length === 0 ? [word] : chunks;\n}\n\nfunction ellipsizeMeasuredEvidenceLine(\n\tline: string,\n\tmaxWidth: number,\n\ttextMeasurer: TextMeasurer,\n): string {\n\tconst ellipsis = \"...\";\n\tif (measureEvidenceText(ellipsis, textMeasurer) > maxWidth) {\n\t\treturn \"\";\n\t}\n\tlet candidate = line.trimEnd();\n\twhile (\n\t\tcandidate.length > 0 &&\n\t\tmeasureEvidenceText(`${candidate}${ellipsis}`, textMeasurer) > maxWidth\n\t) {\n\t\tcandidate = Array.from(candidate).slice(0, -1).join(\"\").trimEnd();\n\t}\n\treturn `${candidate}${ellipsis}`;\n}\n\nfunction measureEvidenceText(text: string, textMeasurer: TextMeasurer): number {\n\treturn textMeasurer.naturalWidth(\n\t\ttextMeasurer.prepare(text, EVIDENCE_TEXT_FONT),\n\t);\n}\n\nfunction matrixGeometry(matrix: CoordinatedMatrixBlock): {\n\trowHeaderWidth: number;\n\tcellWidth: number;\n\trowHeight: number;\n\tcolumnHeaderBox: Box;\n\trowHeaderBox: (rowIndex: number) => Box;\n\tcellBox: (rowIndex: number, columnIndex: number) => Box;\n} {\n\tconst columnCount = Math.max(1, matrix.cols.length);\n\tconst rowCount = matrix.rows.length;\n\tconst rowHeaderWidth =\n\t\trowCount > 0 ? Math.min(96, matrix.box.width * 0.28) : 0;\n\tconst dataWidth = Math.max(0, matrix.box.width - rowHeaderWidth);\n\tconst cellWidth = dataWidth / columnCount;\n\tconst rowHeight = matrix.box.height / Math.max(1, rowCount + 1);\n\treturn {\n\t\trowHeaderWidth,\n\t\tcellWidth,\n\t\trowHeight,\n\t\tcolumnHeaderBox: {\n\t\t\tx: matrix.box.x + rowHeaderWidth,\n\t\t\ty: matrix.box.y,\n\t\t\twidth: cellWidth,\n\t\t\theight: rowHeight,\n\t\t},\n\t\trowHeaderBox: (rowIndex) => ({\n\t\t\tx: matrix.box.x,\n\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: rowHeaderWidth,\n\t\t\theight: rowHeight,\n\t\t}),\n\t\tcellBox: (rowIndex, columnIndex) => ({\n\t\t\tx: matrix.box.x + rowHeaderWidth + columnIndex * cellWidth,\n\t\t\ty: matrix.box.y + (rowIndex + 1) * rowHeight,\n\t\t\twidth: cellWidth,\n\t\t\theight: rowHeight,\n\t\t}),\n\t};\n}\n\nfunction panelGeometry(panel: CoordinatedEvidencePanel): {\n\ttitleBox: Box;\n\titemRowBox: (index: number) => Box;\n} {\n\tconst titleWidth = Math.min(panel.box.width * 0.36, 140);\n\tconst itemBox = {\n\t\tx: panel.box.x + titleWidth,\n\t\ty: panel.box.y,\n\t\twidth: panel.box.width - titleWidth,\n\t\theight: panel.box.height,\n\t};\n\tconst itemHeight = panel.box.height / Math.max(1, panel.items.length);\n\treturn {\n\t\ttitleBox: {\n\t\t\tx: panel.box.x,\n\t\t\ty: panel.box.y,\n\t\t\twidth: titleWidth,\n\t\t\theight: panel.box.height,\n\t\t},\n\t\titemRowBox: (index) => ({\n\t\t\tx: itemBox.x,\n\t\t\ty: itemBox.y + index * itemHeight,\n\t\t\twidth: itemBox.width,\n\t\t\theight: itemHeight,\n\t\t}),\n\t};\n}\n\nfunction panelItemText(label: string, detail: string | undefined): string {\n\treturn detail === undefined ? label : `${label}: ${detail}`;\n}\n\nfunction reportEvidenceBlockOverlaps(\n\tevidenceBlocks: Array<{\n\t\tid: string;\n\t\tkind: string;\n\t\tposition?: Point;\n\t\tbox: Box;\n\t}>,\n\tcontentBlocks: Array<{ id: string; kind: string; box: Box }>,\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tfor (let index = 0; index < evidenceBlocks.length; index += 1) {\n\t\tconst block = evidenceBlocks[index];\n\t\tif (block === undefined || block.position === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const content of contentBlocks) {\n\t\t\tif (intersectsAabb(block.box, content.box)) {\n\t\t\t\tdiagnostics.push(evidenceOverlapDiagnostic(block, content));\n\t\t\t}\n\t\t}\n\t\tfor (\n\t\t\tlet otherIndex = 0;\n\t\t\totherIndex < evidenceBlocks.length;\n\t\t\totherIndex += 1\n\t\t) {\n\t\t\tif (otherIndex === index) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst other = evidenceBlocks[otherIndex];\n\t\t\tif (\n\t\t\t\tother === undefined ||\n\t\t\t\t(other.position !== undefined && otherIndex < index) ||\n\t\t\t\t!intersectsAabb(block.box, other.box)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push(evidenceOverlapDiagnostic(block, other));\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction evidenceOverlapDiagnostic(\n\tblock: { id: string; kind: string },\n\tconflict: { id: string; kind: string },\n): Diagnostic {\n\treturn {\n\t\tseverity: \"warning\",\n\t\tcode: \"constraints.overlap.unresolved\",\n\t\tmessage: `Evidence block ${block.id} overlaps ${conflict.kind} ${conflict.id}.`,\n\t\tpath: [\"evidence\", block.id],\n\t\tdetail: {\n\t\t\tevidenceBlockId: block.id,\n\t\t\tevidenceBlockKind: block.kind,\n\t\t\tconflictingObjectId: conflict.id,\n\t\t\tconflictingObjectKind: conflict.kind,\n\t\t},\n\t};\n}\n\nfunction coordinateEdges(\n\tedges: readonly NormalizedEdge[],\n\tnodes: ReadonlyMap<string, ReturnType<typeof computeShapeGeometry>>,\n\tcoordinatedNodes: readonly CoordinatedNode[],\n\tobstacles: readonly Box[],\n\tsoftObstacles: readonly Box[],\n\ttextObstacles: readonly SolvedTextAnnotation[],\n\thardObstacles: readonly Box[],\n\tdirection: NormalizedDiagram[\"direction\"],\n\toptions: SolveDiagramOptions,\n\tdiagnostics: Diagnostic[],\n\tgroups: readonly CoordinatedGroup[],\n\tcontentBounds: Box,\n): CoordinatedEdge[] {\n\tconst coordinated: CoordinatedEdge[] = [];\n\tconst coordinatedNodeById = new Map(\n\t\tcoordinatedNodes.map((node) => [node.id, node]),\n\t);\n\t// Compute adaptive corridor margin for corner-graph prefilter (Issue #66).\n\t// \"auto\" uses 30% of the content diagonal (min 200 px) so the corridor\n\t// covers ~60% of the page on dense diagrams instead of the old fixed 32 px.\n\tconst corridorMarginOption = options.corridorMargin ?? \"auto\";\n\tconst corridorMargin: number =\n\t\ttypeof corridorMarginOption === \"number\"\n\t\t\t? corridorMarginOption\n\t\t\t: Math.max(\n\t\t\t\t\t200,\n\t\t\t\t\tMath.hypot(contentBounds.width, contentBounds.height) * 0.3,\n\t\t\t\t);\n\n\t// Effective query gutter for node-obstacle prefilter. Only widen for\n\t// obstacle-avoiding routes that actually use the adaptive corridor —\n\t// other route kinds should respect the caller's routingGutter as-is to\n\t// avoid unnecessary detours from over-including nodes (Codex P2).\n\tconst routingGutter = options.routingGutter ?? 160;\n\tconst queryGutter =\n\t\t(options.routeKind ?? \"orthogonal\") === \"obstacle-avoiding\"\n\t\t\t? Math.max(routingGutter, corridorMargin)\n\t\t\t: routingGutter;\n\tconst nodeObstacleIndex = createBoxSpatialIndex(\n\t\tobstacles.map((box, index) => ({ id: `node-obstacle:${index}`, box })),\n\t\tqueryGutter,\n\t);\n\n\tfor (const edge of edges) {\n\t\tconst source = nodes.get(edge.source.nodeId);\n\t\tconst target = nodes.get(edge.target.nodeId);\n\t\tif (source === undefined || target === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"solver.edge-reference.missing\",\n\t\t\t\tmessage: `Edge ${edge.id} references a missing coordinated node.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: {\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\tsourceId: edge.source.nodeId,\n\t\t\t\t\ttargetId: edge.target.nodeId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst sourcePort = coordinatedNodeById\n\t\t\t.get(edge.source.nodeId)\n\t\t\t?.ports?.find((port) => port.id === edge.source.portId);\n\t\tconst targetPort = coordinatedNodeById\n\t\t\t.get(edge.target.nodeId)\n\t\t\t?.ports?.find((port) => port.id === edge.target.portId);\n\t\tconst routeTextObstacles = textObstacles\n\t\t\t.filter((annotation) => !isEdgeConnectedTextAnnotation(edge, annotation))\n\t\t\t.map((annotation) => annotation.box);\n\t\tconst corridor = edgeCorridorBox(source.box, target.box, queryGutter);\n\t\tconst routeNodeObstacles = queryBoxSpatialIndex(nodeObstacleIndex, corridor)\n\t\t\t.map((entry) => entry.box)\n\t\t\t.filter(\n\t\t\t\t(obstacle) =>\n\t\t\t\t\t!sameBox(obstacle, source.obstacleBox) &&\n\t\t\t\t\t!sameBox(obstacle, target.obstacleBox),\n\t\t\t);\n\n\t\tconst route = routeEdge({\n\t\t\tkind: options.routeKind ?? \"orthogonal\",\n\t\t\tdirection,\n\t\t\tsource: portGeometry(source, sourcePort),\n\t\t\ttarget: portGeometry(target, targetPort),\n\t\t\t...(edge.source.anchor === undefined\n\t\t\t\t? {}\n\t\t\t\t: { sourceAnchor: edge.source.anchor }),\n\t\t\t...(edge.target.anchor === undefined\n\t\t\t\t? {}\n\t\t\t\t: { targetAnchor: edge.target.anchor }),\n\t\t\tobstacles: [\n\t\t\t\t...routeNodeObstacles,\n\t\t\t\t...softObstacles,\n\t\t\t\t...groupObstaclesForEdge(edge, groups, options.obstacleMargin ?? 0),\n\t\t\t\t...routeTextObstacles,\n\t\t\t],\n\t\t\thardObstacles,\n\t\t\tcorridorMargin,\n\t\t\t...(options.maxRoutingAttempts === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxRoutingAttempts: options.maxRoutingAttempts }),\n\t\t\t...(options.maxBacktrackingRatio === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxBacktrackingRatio: options.maxBacktrackingRatio }),\n\t\t});\n\t\tdiagnostics.push(\n\t\t\t...route.diagnostics.map((diagnostic) => ({\n\t\t\t\t...diagnostic,\n\t\t\t\tdetail: { ...diagnostic.detail, edgeId: edge.id },\n\t\t\t})),\n\t\t);\n\t\tcoordinated.push({\n\t\t\t...edge,\n\t\t\tpoints: route.points,\n\t\t});\n\t}\n\n\treturn coordinated;\n}\n\nfunction edgeCorridorBox(source: Box, target: Box, margin: number): Box {\n\tconst minX = Math.min(source.x, target.x);\n\tconst minY = Math.min(source.y, target.y);\n\tconst maxX = Math.max(source.x + source.width, target.x + target.width);\n\tconst maxY = Math.max(source.y + source.height, target.y + target.height);\n\treturn expandBoxForQuery(\n\t\t{ x: minX, y: minY, width: maxX - minX, height: maxY - minY },\n\t\tmargin,\n\t);\n}\n\nfunction sameBox(first: Box, second: Box): boolean {\n\treturn (\n\t\tfirst.x === second.x &&\n\t\tfirst.y === second.y &&\n\t\tfirst.width === second.width &&\n\t\tfirst.height === second.height\n\t);\n}\n\nfunction isEdgeConnectedTextAnnotation(\n\tedge: NormalizedEdge | CoordinatedEdge,\n\tannotation: SolvedTextAnnotation,\n): boolean {\n\tswitch (annotation.surfaceKind) {\n\t\tcase \"edge-label\":\n\t\t\treturn annotation.ownerId === edge.id;\n\t\tcase \"node-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn (\n\t\t\t\tannotation.ownerId === edge.source.nodeId ||\n\t\t\t\tannotation.ownerId === edge.target.nodeId\n\t\t\t);\n\t\tcase \"port-label\":\n\t\t\treturn (\n\t\t\t\t(edge.source.portId !== undefined &&\n\t\t\t\t\tannotation.ownerId ===\n\t\t\t\t\t\t`${edge.source.nodeId}.${edge.source.portId}`) ||\n\t\t\t\t(edge.target.portId !== undefined &&\n\t\t\t\t\tannotation.ownerId === `${edge.target.nodeId}.${edge.target.portId}`)\n\t\t\t);\n\t\tcase \"group-label\":\n\t\tcase \"swimlane-label\":\n\t\tcase \"frame-title\":\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Collect every group (including nested ancestors) that contains\n * the given node, by walking `group.nodeIds` and `group.groupIds`.\n */\nfunction ancestorGroupIds(\n\tgroups: readonly CoordinatedGroup[],\n\tnodeId: string,\n): Set<string> {\n\tconst direct = new Set<string>();\n\tfor (const group of groups) {\n\t\tif (group.nodeIds.includes(nodeId)) {\n\t\t\tdirect.add(group.id);\n\t\t}\n\t}\n\t// Walk upward: if a group contains any of the direct parent groups,\n\t// it is an ancestor container that should also be skipped.\n\tlet previousSize = -1;\n\tconst ancestors = new Set(direct);\n\twhile (ancestors.size !== previousSize) {\n\t\tpreviousSize = ancestors.size;\n\t\tfor (const group of groups) {\n\t\t\tfor (const candidate of ancestors) {\n\t\t\t\tif (group.groupIds.includes(candidate)) {\n\t\t\t\t\tancestors.add(group.id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn ancestors;\n}\n\n/**\n * Return group boxes that should act as soft routing obstacles for a\n * given edge. Groups that contain both endpoints (or are ancestors\n * of such groups) are skipped — an edge entirely inside a container\n * is free to route within that container (Issue #41).\n */\nfunction groupObstaclesForEdge(\n\tedge: NormalizedEdge,\n\tgroups: readonly CoordinatedGroup[],\n\tmargin: number | Insets,\n): Box[] {\n\tconst sourceAncestors = ancestorGroupIds(groups, edge.source.nodeId);\n\tconst targetAncestors = ancestorGroupIds(groups, edge.target.nodeId);\n\t// Edges that touch a group (at least one endpoint inside)\n\t// are allowed to cross its boundary; only fully external\n\t// edges must detour around the group box.\n\treturn groups\n\t\t.filter((group) => {\n\t\t\tif (sourceAncestors.has(group.id) || targetAncestors.has(group.id)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.map((group) => (margin === 0 ? group.box : expandBox(group.box, margin)));\n}\n\nfunction coordinateBaseTextAnnotations(input: {\n\tnodes: readonly CoordinatedNode[];\n\tgroups: readonly CoordinatedGroup[];\n\tswimlanes: readonly Swimlane[];\n\ttextMeasurer?: TextMeasurer;\n\t/** When true, promote deliverability-breaking diagnostics to errors. */\n\tstrict?: boolean;\n}): SolvedTextAnnotation[] {\n\tconst measurer = input.textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\n\tfor (const node of input.nodes) {\n\t\tif (node.compartments !== undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (node.labelLayout === undefined && node.label === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout =\n\t\t\tnode.labelLayout ?? fallbackLabelLayout(node.label?.text ?? \"\");\n\t\tconst buildAnnotation =\n\t\t\tnode.labelLayout === undefined\n\t\t\t\t? buildAnchorCenteredTextAnnotation\n\t\t\t\t: buildTextAnnotation;\n\t\tannotations.push(\n\t\t\tbuildAnnotation({\n\t\t\t\townerId: node.id,\n\t\t\t\tsurfaceKind: \"node-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(node.label),\n\t\t\t\tanchor: node.box,\n\t\t\t}),\n\t\t);\n\t}\n\n\tfor (const group of input.groups) {\n\t\tif (group.labelLayout === undefined && group.label === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout =\n\t\t\tgroup.labelLayout ?? fallbackLabelLayout(group.label?.text ?? \"\");\n\t\tconst buildAnnotation =\n\t\t\tgroup.labelLayout === undefined\n\t\t\t\t? buildAnchorCenteredTextAnnotation\n\t\t\t\t: buildTextAnnotation;\n\t\tannotations.push(\n\t\t\tbuildAnnotation({\n\t\t\t\townerId: group.id,\n\t\t\t\tsurfaceKind: \"group-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(group.label),\n\t\t\t\tanchor: group.box,\n\t\t\t}),\n\t\t);\n\t}\n\n\tfor (const node of input.nodes) {\n\t\tfor (const port of node.ports ?? []) {\n\t\t\tif (port.label?.text === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst layout = fitLabel(\n\t\t\t\tport.label.text,\n\t\t\t\t{\n\t\t\t\t\tfont: typographyTextStyle(port.label, {\n\t\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\t\tfontSize: 10,\n\t\t\t\t\t\tlineHeight: 12,\n\t\t\t\t\t}),\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth: 160,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildTextAnnotation({\n\t\t\t\t\townerId: `${node.id}.${port.id}`,\n\t\t\t\t\tsurfaceKind: \"port-label\",\n\t\t\t\t\tlayout,\n\t\t\t\t\ttypography: typographyForLabel(port.label),\n\t\t\t\t\tanchor: portLabelBox(port),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const node of input.nodes) {\n\t\tif (node.compartments === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rows = compartmentRows(node);\n\t\tfor (let index = 0; index < rows.length; index += 1) {\n\t\t\tconst row = rows[index];\n\t\t\tif (row === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst layout = fitLabel(\n\t\t\t\trow,\n\t\t\t\t{\n\t\t\t\t\tfont: { fontFamily: \"Arial\", fontSize: 11, lineHeight: 13 },\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth: node.box.width,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildAnchorCenteredTextAnnotation({\n\t\t\t\t\townerId: node.id,\n\t\t\t\t\tsurfaceKind: \"compartment-row\",\n\t\t\t\t\tsurfaceIndex: index,\n\t\t\t\t\tlayout,\n\t\t\t\t\tanchor: {\n\t\t\t\t\t\tx: node.box.x,\n\t\t\t\t\t\ty: node.box.y + 18 + index * 16,\n\t\t\t\t\t\twidth: node.box.width,\n\t\t\t\t\t\theight: 16,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const swimlane of input.swimlanes) {\n\t\tfor (const lane of swimlane.lanes) {\n\t\t\tif (lane.label?.text === undefined || lane.box === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst labelBox = lane.headerBox ?? lane.box;\n\t\t\tconst layout = fitLabel(\n\t\t\t\tlane.label.text,\n\t\t\t\t{\n\t\t\t\t\tfont: typographyTextStyle(lane.label, {\n\t\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tlineHeight: 14,\n\t\t\t\t\t}),\n\t\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\t\tmaxWidth:\n\t\t\t\t\t\tswimlane.orientation === \"horizontal\"\n\t\t\t\t\t\t\t? labelBox.height\n\t\t\t\t\t\t\t: labelBox.width,\n\t\t\t\t},\n\t\t\t\tmeasurer,\n\t\t\t);\n\t\t\tannotations.push(\n\t\t\t\tbuildAnchorCenteredTextAnnotation({\n\t\t\t\t\townerId: `${swimlane.id}.${lane.id}`,\n\t\t\t\t\tsurfaceKind: \"swimlane-label\",\n\t\t\t\t\tlayout,\n\t\t\t\t\ttypography: typographyForLabel(lane.label),\n\t\t\t\t\tanchor: labelBox,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn annotations;\n}\n\nfunction coordinateEdgeTextAnnotations(\n\tedges: readonly CoordinatedEdge[],\n\tobstacleBoxes: readonly Box[],\n\ttextMeasurer?: TextMeasurer,\n\tlabelPlacement?: \"beside\" | \"on-path\",\n\tlabelOffset?: number,\n): SolvedTextAnnotation[] {\n\tconst labelBaseOffset =\n\t\tlabelPlacement === \"beside\" ? (labelOffset ?? 16) : 10;\n\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\tconst placedLabelBoxes: Box[] = [];\n\n\tfor (const edge of edges) {\n\t\tif (edge.label?.text === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = fitLabel(\n\t\t\tedge.label.text,\n\t\t\t{\n\t\t\t\tfont: typographyTextStyle(edge.label, {\n\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tlineHeight: 14,\n\t\t\t\t}),\n\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\tmaxWidth: 200,\n\t\t\t},\n\t\t\tmeasurer,\n\t\t);\n\t\tconst center = edgeLabelAnchor(\n\t\t\tedge,\n\t\t\tlayout,\n\t\t\tedges,\n\t\t\tobstacleBoxes,\n\t\t\tplacedLabelBoxes,\n\t\t\tlabelBaseOffset,\n\t\t);\n\t\tplacedLabelBoxes.push({\n\t\t\tx: center.x - layout.box.width / 2,\n\t\t\ty: center.y - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t});\n\t\tannotations.push(\n\t\t\tbuildCenteredTextAnnotation({\n\t\t\t\townerId: edge.id,\n\t\t\t\tsurfaceKind: \"edge-label\",\n\t\t\t\tlayout,\n\t\t\t\ttypography: typographyForLabel(edge.label),\n\t\t\t\tcenter,\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn annotations;\n}\n\n/**\n * Produce a rough edge-label box estimate using the straight-line\n * midpoint between source and target node centers. The estimate is\n * used as a pre-route text obstacle so edges can avoid each other's\n * label areas before the real label placement runs (Issue #41).\n */\nfunction estimateEdgeLabelAnnotations(\n\tedges: readonly NormalizedEdge[],\n\tnodes: ReadonlyMap<string, ReturnType<typeof computeShapeGeometry>>,\n\ttextMeasurer: TextMeasurer | undefined,\n): SolvedTextAnnotation[] {\n\tconst measurer = textMeasurer ?? createDefaultTextMeasurer();\n\tconst annotations: SolvedTextAnnotation[] = [];\n\n\tfor (const edge of edges) {\n\t\tif (edge.label?.text === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst sourceGeom = nodes.get(edge.source.nodeId);\n\t\tconst targetGeom = nodes.get(edge.target.nodeId);\n\t\tif (sourceGeom === undefined || targetGeom === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst layout = fitLabel(\n\t\t\tedge.label.text,\n\t\t\t{\n\t\t\t\tfont: typographyTextStyle(edge.label, {\n\t\t\t\t\tfontFamily: \"Arial\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tlineHeight: 14,\n\t\t\t\t}),\n\t\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\t\tminSize: { width: 0, height: 0 },\n\t\t\t\tmaxWidth: 200,\n\t\t\t},\n\t\t\tmeasurer,\n\t\t);\n\t\t// Straight-line midpoint between node centers.\n\t\tconst cx = (sourceGeom.center.x + targetGeom.center.x) / 2;\n\t\tconst cy = (sourceGeom.center.y + targetGeom.center.y) / 2;\n\t\tconst box: Box = {\n\t\t\tx: cx - layout.box.width / 2,\n\t\t\ty: cy - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t};\n\t\tannotations.push({\n\t\t\ttext: layout.text,\n\t\t\townerId: edge.id,\n\t\t\tsurfaceKind: \"edge-label\",\n\t\t\tbox,\n\t\t\tanchor: { x: cx, y: cy },\n\t\t\tpaddings: layout.padding,\n\t\t\tlines: layout.lines,\n\t\t\tfontFamily: normalizeOutputFontFamily(layout.font),\n\t\t\tfontSize: layout.font.fontSize,\n\t\t\ttextBackend: layout.textBackend,\n\t\t});\n\t}\n\treturn annotations;\n}\n\nfunction coordinateFrameTextAnnotation(\n\tframe: CoordinatedFrame,\n\ttextMeasurer?: TextMeasurer,\n): SolvedTextAnnotation {\n\tconst layout = fitLabel(\n\t\tframe.titleTab,\n\t\t{\n\t\t\tfont: { fontFamily: \"Arial\", fontSize: 12, lineHeight: 14 },\n\t\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\tminSize: { width: 0, height: 0 },\n\t\t\tmaxWidth: frame.titleBox.width,\n\t\t},\n\t\ttextMeasurer ?? createDefaultTextMeasurer(),\n\t);\n\treturn buildAnchorCenteredTextAnnotation({\n\t\townerId: frame.kind,\n\t\tsurfaceKind: \"frame-title\",\n\t\tlayout,\n\t\tanchor: frame.titleBox,\n\t});\n}\n\nfunction buildTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tanchor: Box;\n}): SolvedTextAnnotation {\n\treturn {\n\t\ttext: input.layout.text,\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tbox: {\n\t\t\tx: input.anchor.x + input.layout.box.x,\n\t\t\ty: input.anchor.y + input.layout.box.y,\n\t\t\twidth: input.layout.box.width,\n\t\t\theight: input.layout.box.height,\n\t\t},\n\t\tanchor: input.anchor,\n\t\tpaddings: input.layout.padding,\n\t\tlines: input.layout.lines,\n\t\tfontFamily:\n\t\t\tinput.typography?.fontFamily ??\n\t\t\tnormalizeOutputFontFamily(input.layout.font),\n\t\tfontSize: input.typography?.fontSize ?? input.layout.font.fontSize,\n\t\ttextBackend: input.layout.textBackend,\n\t};\n}\n\nfunction buildAnchorCenteredTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tanchor: Box;\n}): SolvedTextAnnotation {\n\treturn buildCenteredTextAnnotation({\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tlayout: input.layout,\n\t\t...(input.typography === undefined ? {} : { typography: input.typography }),\n\t\tcenter: {\n\t\t\tx: input.anchor.x + input.anchor.width / 2,\n\t\t\ty: input.anchor.y + input.anchor.height / 2,\n\t\t},\n\t\tanchor: input.anchor,\n\t});\n}\n\nfunction buildCenteredTextAnnotation(input: {\n\townerId: string;\n\tsurfaceKind: TextSurfaceKind;\n\tsurfaceIndex?: number;\n\tlayout: LabelLayout;\n\ttypography?: CjkTypography;\n\tcenter: Point;\n\tanchor?: Box | Point;\n}): SolvedTextAnnotation {\n\treturn {\n\t\ttext: input.layout.text,\n\t\townerId: input.ownerId,\n\t\tsurfaceKind: input.surfaceKind,\n\t\t...(input.surfaceIndex === undefined\n\t\t\t? {}\n\t\t\t: { surfaceIndex: input.surfaceIndex }),\n\t\tbox: {\n\t\t\tx: input.center.x - input.layout.box.width / 2,\n\t\t\ty: input.center.y - input.layout.box.height / 2,\n\t\t\twidth: input.layout.box.width,\n\t\t\theight: input.layout.box.height,\n\t\t},\n\t\tanchor: input.anchor ?? input.center,\n\t\tpaddings: input.layout.padding,\n\t\tlines: input.layout.lines,\n\t\tfontFamily:\n\t\t\tinput.typography?.fontFamily ??\n\t\t\tnormalizeOutputFontFamily(input.layout.font),\n\t\tfontSize: input.typography?.fontSize ?? input.layout.font.fontSize,\n\t\ttextBackend: input.layout.textBackend,\n\t};\n}\n\nfunction normalizeOutputFontFamily(font: TextStyleOptions): string {\n\treturn font.fontFamily === \"Arial\" ? \"Arial, sans-serif\" : font.fontFamily;\n}\n\nfunction reportTextAnnotationCollisions(\n\tannotations: readonly SolvedTextAnnotation[],\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\n\tconst relevantAnnotations = annotations.filter((annotation) =>\n\t\tisExternallyPlacedText(annotation.surfaceKind),\n\t);\n\n\tfor (\n\t\tlet annotationIndex = 0;\n\t\tannotationIndex < relevantAnnotations.length;\n\t\tannotationIndex += 1\n\t) {\n\t\tconst annotation = relevantAnnotations[annotationIndex];\n\t\tif (annotation === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (\n\t\t\tlet otherIndex = annotationIndex + 1;\n\t\t\totherIndex < relevantAnnotations.length;\n\t\t\totherIndex += 1\n\t\t) {\n\t\t\tconst other = relevantAnnotations[otherIndex];\n\t\t\tif (other === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!intersectsAabb(annotation.box, other.box)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tannotation.ownerId === other.ownerId &&\n\t\t\t\tannotation.surfaceKind === other.surfaceKind\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"constraints.overlap.unresolved\",\n\t\t\t\tmessage: `Text surface ${annotation.surfaceKind} for ${annotation.ownerId} overlaps text surface ${other.surfaceKind} for ${other.ownerId}.`,\n\t\t\t\tpath: [\"textAnnotations\", annotation.surfaceKind, annotation.ownerId],\n\t\t\t\tdetail: compactDetail({\n\t\t\t\t\ttextSurfaceKind: annotation.surfaceKind,\n\t\t\t\t\townerId: annotation.ownerId,\n\t\t\t\t\tconflictingObjectId: other.ownerId,\n\t\t\t\t\tconflictingObjectKind: other.surfaceKind,\n\t\t\t\t\tsurfaceIndex: annotation.surfaceIndex,\n\t\t\t\t\totherSurfaceKind: other.surfaceKind,\n\t\t\t\t\totherSurfaceIndex: other.surfaceIndex,\n\t\t\t\t\ttextBackend: annotation.textBackend,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction reportRouteTextClearance(\n\tedges: readonly CoordinatedEdge[],\n\tannotations: readonly SolvedTextAnnotation[],\n): Diagnostic[] {\n\tconst diagnostics: Diagnostic[] = [];\n\tconst relevantAnnotations = annotations.filter(isRouteClearanceText);\n\n\tfor (const edge of edges) {\n\t\tfor (const annotation of relevantAnnotations) {\n\t\t\tif (isEdgeConnectedTextAnnotation(edge, annotation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!routeIntersectsTextBox(edge.points, annotation.box)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"routing.text-clearance.unresolved\",\n\t\t\t\tmessage: `Edge ${edge.id} intersects solved text surface ${annotation.surfaceKind} for ${annotation.ownerId}.`,\n\t\t\t\tpath: [\"edges\", edge.id],\n\t\t\t\tdetail: compactDetail({\n\t\t\t\t\tedgeId: edge.id,\n\t\t\t\t\ttextSurfaceKind: annotation.surfaceKind,\n\t\t\t\t\tconflictingObjectId: annotation.ownerId,\n\t\t\t\t\tsurfaceIndex: annotation.surfaceIndex,\n\t\t\t\t\ttextBackend: annotation.textBackend,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction isPreRouteTextObstacle(annotation: SolvedTextAnnotation): boolean {\n\treturn isRouteClearanceText(annotation);\n}\n\nfunction isRouteClearanceText(annotation: SolvedTextAnnotation): boolean {\n\tswitch (annotation.surfaceKind) {\n\t\tcase \"port-label\":\n\t\tcase \"edge-label\":\n\t\tcase \"swimlane-label\":\n\t\tcase \"frame-title\":\n\t\t\treturn true;\n\t\tcase \"node-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn true;\n\t\tcase \"group-label\":\n\t\t\treturn textExtendsOutsideAnchor(annotation);\n\t}\n}\n\nfunction textExtendsOutsideAnchor(annotation: SolvedTextAnnotation): boolean {\n\tif (!(\"width\" in annotation.anchor)) {\n\t\treturn true;\n\t}\n\tconst epsilon = 0.001;\n\treturn (\n\t\tannotation.box.x < annotation.anchor.x - epsilon ||\n\t\tannotation.box.y < annotation.anchor.y - epsilon ||\n\t\tannotation.box.x + annotation.box.width >\n\t\t\tannotation.anchor.x + annotation.anchor.width + epsilon ||\n\t\tannotation.box.y + annotation.box.height >\n\t\t\tannotation.anchor.y + annotation.anchor.height + epsilon\n\t);\n}\n\nfunction routeIntersectsTextBox(points: readonly Point[], box: Box): boolean {\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (segmentIntersectsBox(start, end, box)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction segmentIntersectsBox(start: Point, end: Point, box: Box): boolean {\n\tconst left = box.x;\n\tconst right = box.x + box.width;\n\tconst top = box.y;\n\tconst bottom = box.y + box.height;\n\tif (pointInsideBox(start, box) || pointInsideBox(end, box)) {\n\t\treturn true;\n\t}\n\tif (start.x === end.x) {\n\t\treturn (\n\t\t\tstart.x > left &&\n\t\t\tstart.x < right &&\n\t\t\trangesOverlap(start.y, end.y, top, bottom)\n\t\t);\n\t}\n\tif (start.y === end.y) {\n\t\treturn (\n\t\t\tstart.y > top &&\n\t\t\tstart.y < bottom &&\n\t\t\trangesOverlap(start.x, end.x, left, right)\n\t\t);\n\t}\n\treturn (\n\t\tsegmentIntersectsBoxEdge(start, end, left, top, right, top) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, top, right, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, right, bottom, left, bottom) ||\n\t\tsegmentIntersectsBoxEdge(start, end, left, bottom, left, top)\n\t);\n}\n\nfunction pointInsideBox(point: Point, box: Box): boolean {\n\treturn (\n\t\tpoint.x > box.x &&\n\t\tpoint.x < box.x + box.width &&\n\t\tpoint.y > box.y &&\n\t\tpoint.y < box.y + box.height\n\t);\n}\n\nfunction rangesOverlap(\n\ta: number,\n\tb: number,\n\tmin: number,\n\tmax: number,\n): boolean {\n\tconst low = Math.min(a, b);\n\tconst high = Math.max(a, b);\n\treturn high > min && low < max;\n}\n\nfunction segmentIntersectsBoxEdge(\n\tstart: Point,\n\tend: Point,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): boolean {\n\tconst denominator =\n\t\t(end.x - start.x) * (y2 - y1) - (end.y - start.y) * (x2 - x1);\n\tif (denominator === 0) {\n\t\treturn false;\n\t}\n\tconst t =\n\t\t((x1 - start.x) * (y2 - y1) - (y1 - start.y) * (x2 - x1)) / denominator;\n\tconst u =\n\t\t((x1 - start.x) * (end.y - start.y) - (y1 - start.y) * (end.x - start.x)) /\n\t\tdenominator;\n\treturn t > 0 && t < 1 && u > 0 && u < 1;\n}\n\nfunction compactDetail(\n\tdetail: Record<string, string | number | boolean | undefined>,\n): Record<string, string | number | boolean> {\n\treturn Object.fromEntries(\n\t\tObject.entries(detail).filter(\n\t\t\t(entry): entry is [string, string | number | boolean] =>\n\t\t\t\tentry[1] !== undefined,\n\t\t),\n\t);\n}\n\nfunction isExternallyPlacedText(surfaceKind: TextSurfaceKind): boolean {\n\tswitch (surfaceKind) {\n\t\tcase \"port-label\":\n\t\t\treturn true;\n\t\tcase \"edge-label\":\n\t\t\treturn false;\n\t\tcase \"swimlane-label\":\n\t\t\treturn true;\n\t\tcase \"frame-title\":\n\t\t\treturn true;\n\t\tcase \"node-label\":\n\t\tcase \"group-label\":\n\t\tcase \"compartment-row\":\n\t\t\treturn false;\n\t}\n}\n\nfunction fallbackLabelLayout(text: string): LabelLayout {\n\tconst width = Math.max(0, text.length * 7);\n\treturn {\n\t\ttext,\n\t\tbox: { x: 0, y: 0, width, height: 14 },\n\t\tcontentBox: { x: 0, y: 0, width, height: 14 },\n\t\tnaturalSize: { width, height: 14 },\n\t\tfittedSize: { width, height: 14 },\n\t\tpadding: { top: 0, right: 0, bottom: 0, left: 0 },\n\t\tfont: { fontFamily: \"Arial\", fontSize: 12, lineHeight: 14 },\n\t\tlineHeight: 14,\n\t\tlines: [\n\t\t\t{\n\t\t\t\ttext,\n\t\t\t\tbox: { x: 0, y: 0, width, height: 14 },\n\t\t\t\tbaselineY: 11.2,\n\t\t\t\twidth,\n\t\t\t\tlineIndex: 0,\n\t\t\t},\n\t\t],\n\t\toverflow: { horizontal: false, vertical: false, truncated: false },\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction edgeLabelAnchor(\n\tedge: CoordinatedEdge,\n\tlayout: LabelLayout,\n\tedges: readonly CoordinatedEdge[],\n\tobstacleBoxes: readonly Box[],\n\tplacedLabelBoxes: readonly Box[],\n\tbaseOffset = 10,\n): Point {\n\tconst placement = labelPlacementOnPolyline(edge.points, baseOffset);\n\tif (placement === undefined) {\n\t\treturn { x: 0, y: 0 };\n\t}\n\n\tfor (const candidate of edgeLabelAnchorCandidates(\n\t\tedge.points,\n\t\tplacement,\n\t\tlayout,\n\t\tbaseOffset,\n\t)) {\n\t\tconst labelBox = {\n\t\t\tx: candidate.x - layout.box.width / 2,\n\t\t\ty: candidate.y - layout.box.height / 2,\n\t\t\twidth: layout.box.width,\n\t\t\theight: layout.box.height,\n\t\t};\n\t\tif (routeIntersectsTextBox(edge.points, labelBox)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst crossesOtherRoute = edges.some(\n\t\t\t(other) =>\n\t\t\t\tother.id !== edge.id && routeIntersectsTextBox(other.points, labelBox),\n\t\t);\n\t\tif (crossesOtherRoute) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst overlapsNode = obstacleBoxes.some((box) =>\n\t\t\tintersectsAabb(labelBox, box),\n\t\t);\n\t\tif (overlapsNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst overlapsPlacedLabel = placedLabelBoxes.some((box) =>\n\t\t\tintersectsAabb(labelBox, box),\n\t\t);\n\t\tif (!overlapsPlacedLabel) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn placement;\n}\n\nfunction edgeLabelAnchorCandidates(\n\tpoints: readonly Point[],\n\tplacement: Point,\n\tlayout: LabelLayout,\n\tbaseOffset = 10,\n): Point[] {\n\tconst segment = labelSegmentOnPolyline(points, baseOffset);\n\tif (segment === undefined) {\n\t\treturn [placement];\n\t}\n\n\tconst candidates: Point[] = [placement];\n\t// Expand the offset progressively. The number of steps is derived from the\n\t// label's own size so wide/tall labels can move far enough to clear their\n\t// own route segment (a fixed step count fails for labels wider than the\n\t// search range).\n\tif (segment.start.y === segment.end.y) {\n\t\t// Horizontal segment: label moves vertically; must clear half its height.\n\t\tconst needed = layout.box.height / 2 + EDGE_LABEL_CLEARANCE;\n\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\tcandidates.push(\n\t\t\t\t{ x: placement.x, y: placement.y - offset },\n\t\t\t\t{ x: placement.x, y: placement.y + offset },\n\t\t\t);\n\t\t}\n\t} else if (segment.start.x === segment.end.x) {\n\t\t// Vertical segment: label moves horizontally; must clear half its width.\n\t\tconst needed = layout.box.width / 2 + EDGE_LABEL_CLEARANCE;\n\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\tcandidates.push(\n\t\t\t\t{ x: placement.x + offset, y: placement.y },\n\t\t\t\t{ x: placement.x - offset, y: placement.y },\n\t\t\t);\n\t\t}\n\t} else {\n\t\t// Diagonal segment: expand in both perpendicular directions.\n\t\tconst dx = segment.end.x - segment.start.x;\n\t\tconst dy = segment.end.y - segment.start.y;\n\t\tconst segLen = Math.hypot(dx, dy);\n\t\tif (segLen > 0) {\n\t\t\tconst nx = -dy / segLen;\n\t\t\tconst ny = dx / segLen;\n\t\t\tconst needed =\n\t\t\t\t(Math.abs(nx) * layout.box.width + Math.abs(ny) * layout.box.height) /\n\t\t\t\t\t2 +\n\t\t\t\tEDGE_LABEL_CLEARANCE;\n\t\t\tconst maxSteps = Math.max(12, Math.ceil(needed / EDGE_LABEL_CLEARANCE));\n\t\t\tfor (let step = 1; step <= maxSteps; step += 1) {\n\t\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\t\tcandidates.push(\n\t\t\t\t\t{ x: placement.x + nx * offset, y: placement.y + ny * offset },\n\t\t\t\t\t{ x: placement.x - nx * offset, y: placement.y - ny * offset },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// For long edges, also try quartile positions along the polyline.\n\tconst totalLen = points.reduce((sum, p, idx) => {\n\t\tif (idx === 0) return 0;\n\t\tconst prev = points[idx - 1];\n\t\treturn (\n\t\t\tsum +\n\t\t\tMath.hypot((p?.x ?? 0) - (prev?.x ?? 0), (p?.y ?? 0) - (prev?.y ?? 0))\n\t\t);\n\t}, 0);\n\tif (totalLen > 200) {\n\t\tfor (const ratio of [0.25, 0.75]) {\n\t\t\tconst qp = labelPlacementAtRatio(points, ratio, totalLen, baseOffset);\n\t\t\tif (qp !== undefined) {\n\t\t\t\tcandidates.push(qp);\n\t\t\t\t// Find the segment that contains the quartile point\n\t\t\t\t// (labelSegmentOnPolyline gives the midpoint segment, not the quartile one)\n\t\t\t\tconst qTargetDist = totalLen * ratio;\n\t\t\t\tlet qTravelled = 0;\n\t\t\t\tlet seg: { start: Point; end: Point; length: number } | undefined;\n\t\t\t\tfor (let si = 1; si < points.length; si++) {\n\t\t\t\t\tconst sp = points[si - 1];\n\t\t\t\t\tconst sc = points[si];\n\t\t\t\t\tif (sp === undefined || sc === undefined) continue;\n\t\t\t\t\tconst sl = Math.hypot(sc.x - sp.x, sc.y - sp.y);\n\t\t\t\t\tif (sl <= 0) continue;\n\t\t\t\t\tif (qTravelled + sl >= qTargetDist) {\n\t\t\t\t\t\tseg = { start: sp, end: sc, length: sl };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tqTravelled += sl;\n\t\t\t\t}\n\t\t\t\tif (seg !== undefined) {\n\t\t\t\t\tconst segLen = Math.hypot(\n\t\t\t\t\t\tseg.end.x - seg.start.x,\n\t\t\t\t\t\tseg.end.y - seg.start.y,\n\t\t\t\t\t);\n\t\t\t\t\tconst qpNeeded =\n\t\t\t\t\t\tseg.start.y === seg.end.y\n\t\t\t\t\t\t\t? layout.box.height / 2 + EDGE_LABEL_CLEARANCE\n\t\t\t\t\t\t\t: seg.start.x === seg.end.x\n\t\t\t\t\t\t\t\t? layout.box.width / 2 + EDGE_LABEL_CLEARANCE\n\t\t\t\t\t\t\t\t: (Math.abs(seg.start.y - seg.end.y) * layout.box.width +\n\t\t\t\t\t\t\t\t\t\tMath.abs(seg.end.x - seg.start.x) * layout.box.height) /\n\t\t\t\t\t\t\t\t\t\t(2 * segLen) +\n\t\t\t\t\t\t\t\t\tEDGE_LABEL_CLEARANCE;\n\t\t\t\t\tconst qpMaxSteps = Math.max(\n\t\t\t\t\t\t12,\n\t\t\t\t\t\tMath.ceil(qpNeeded / EDGE_LABEL_CLEARANCE),\n\t\t\t\t\t);\n\t\t\t\t\tfor (let step = 1; step <= qpMaxSteps; step += 1) {\n\t\t\t\t\t\tconst offset = EDGE_LABEL_CLEARANCE * step;\n\t\t\t\t\t\tif (seg.start.y === seg.end.y) {\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x, y: qp.y - offset },\n\t\t\t\t\t\t\t\t{ x: qp.x, y: qp.y + offset },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (seg.start.x === seg.end.x) {\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x - offset, y: qp.y },\n\t\t\t\t\t\t\t\t{ x: qp.x + offset, y: qp.y },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst nx = -(seg.end.y - seg.start.y) / segLen;\n\t\t\t\t\t\t\tconst ny = (seg.end.x - seg.start.x) / segLen;\n\t\t\t\t\t\t\tcandidates.push(\n\t\t\t\t\t\t\t\t{ x: qp.x + nx * offset, y: qp.y + ny * offset },\n\t\t\t\t\t\t\t\t{ x: qp.x - nx * offset, y: qp.y - ny * offset },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction labelPlacementOnPolyline(\n\tpoints: readonly Point[],\n\tbaseOffset = 10,\n): Point | undefined {\n\treturn labelSegmentOnPolyline(points, baseOffset)?.placement;\n}\n\nfunction labelSegmentOnPolyline(\n\tpoints: readonly Point[],\n\tbaseOffset = 10,\n): { start: Point; end: Point; placement: Point } | undefined {\n\tconst segments = nonZeroSegments(points);\n\tconst totalLength = segments.reduce(\n\t\t(sum, segment) => sum + segment.length,\n\t\t0,\n\t);\n\tif (totalLength <= 0) {\n\t\treturn undefined;\n\t}\n\n\tlet remaining = totalLength / 2;\n\tfor (const segment of segments) {\n\t\tif (remaining <= segment.length) {\n\t\t\tconst ratio = remaining / segment.length;\n\t\t\tconst x = segment.start.x + (segment.end.x - segment.start.x) * ratio;\n\t\t\tconst y = segment.start.y + (segment.end.y - segment.start.y) * ratio;\n\t\t\tconst offset = labelOffset(segment, baseOffset);\n\t\t\treturn {\n\t\t\t\tstart: segment.start,\n\t\t\t\tend: segment.end,\n\t\t\t\tplacement: { x: x + offset.x, y: y + offset.y },\n\t\t\t};\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst last = segments.at(-1);\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst offset = labelOffset(last, baseOffset);\n\treturn {\n\t\tstart: last.start,\n\t\tend: last.end,\n\t\tplacement: { x: last.end.x + offset.x, y: last.end.y + offset.y },\n\t};\n}\n\nfunction nonZeroSegments(points: readonly Point[]): Array<{\n\tstart: Point;\n\tend: Point;\n\tlength: number;\n}> {\n\tconst segments: Array<{ start: Point; end: Point; length: number }> = [];\n\tfor (let index = 0; index < points.length - 1; index += 1) {\n\t\tconst start = points[index];\n\t\tconst end = points[index + 1];\n\t\tif (start === undefined || end === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst length = Math.hypot(end.x - start.x, end.y - start.y);\n\t\tif (length > 0) {\n\t\t\tsegments.push({ start, end, length });\n\t\t}\n\t}\n\treturn segments;\n}\n\nfunction labelPlacementAtRatio(\n\tpoints: readonly Point[],\n\tratio: number,\n\ttotalLength: number,\n\tbaseOffset = 10,\n): Point | undefined {\n\tif (points.length < 2 || ratio < 0 || ratio > 1) {\n\t\treturn undefined;\n\t}\n\tconst targetDist = totalLength * ratio;\n\tlet travelled = 0;\n\tfor (let idx = 1; idx < points.length; idx++) {\n\t\tconst prev = points[idx - 1];\n\t\tconst curr = points[idx];\n\t\tif (prev === undefined || curr === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst segLen = Math.hypot(curr.x - prev.x, curr.y - prev.y);\n\t\tif (segLen <= 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (travelled + segLen >= targetDist) {\n\t\t\tconst t = (targetDist - travelled) / segLen;\n\t\t\tconst offset = labelOffset(\n\t\t\t\t{ start: prev, end: curr, length: segLen },\n\t\t\t\tbaseOffset,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tx: prev.x + (curr.x - prev.x) * t + offset.x,\n\t\t\t\ty: prev.y + (curr.y - prev.y) * t + offset.y,\n\t\t\t};\n\t\t}\n\t\ttravelled += segLen;\n\t}\n\treturn undefined;\n}\n\nfunction labelOffset(\n\tsegment: { start: Point; end: Point; length: number },\n\tbaseOffset = 10,\n): Point {\n\tconst offset = baseOffset;\n\tconst dx = segment.end.x - segment.start.x;\n\tconst dy = segment.end.y - segment.start.y;\n\treturn {\n\t\tx: (-dy / segment.length) * offset,\n\t\ty: (dx / segment.length) * offset,\n\t};\n}\n\nfunction compartmentRows(node: CoordinatedNode): string[] {\n\tconst compartments = node.compartments;\n\tif (compartments === undefined) {\n\t\treturn [];\n\t}\n\treturn [\n\t\t...(compartments.stereotype === undefined ? [] : [compartments.stereotype]),\n\t\t...(compartments.name === undefined\n\t\t\t? [node.label?.text ?? node.id]\n\t\t\t: [compartments.name]),\n\t\t...(compartments.properties ?? []),\n\t\t...(compartments.constraints ?? []),\n\t];\n}\n\nfunction portGeometry(\n\tnodeGeometry: ReturnType<typeof computeShapeGeometry>,\n\tport: CoordinatedPort | undefined,\n): ReturnType<typeof computeShapeGeometry> {\n\tif (port === undefined) {\n\t\treturn nodeGeometry;\n\t}\n\treturn {\n\t\t...nodeGeometry,\n\t\tbox: port.box,\n\t\tcenter: port.anchor,\n\t\tanchors: nodeGeometry.anchors.map((anchor) => ({\n\t\t\tname: anchor.name,\n\t\t\tpoint: port.anchor,\n\t\t})),\n\t\tobstacleBox: port.box,\n\t};\n}\n\nfunction stableUniqueById<T extends { id: string }>(\n\titems: readonly T[],\n\tdiagnostics: Diagnostic[],\n\tpathRoot: string,\n\tcode: string,\n): T[] {\n\tconst firstById = new Map<string, T>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (firstById.has(item.id)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode,\n\t\t\t\tmessage: `Duplicate ${pathRoot.slice(0, -1)} id ${item.id} was ignored; first occurrence was kept.`,\n\t\t\t\tpath: [pathRoot, index, \"id\"],\n\t\t\t\tdetail: { id: item.id, duplicateIndex: index },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tfirstById.set(item.id, item);\n\t}\n\treturn [...firstById.values()].sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction stableByConstraintId<T extends { id?: string; kind: string }>(\n\titems: readonly T[],\n): T[] {\n\treturn [...items].sort((a, b) =>\n\t\t`${a.id ?? a.kind}`.localeCompare(`${b.id ?? b.kind}`),\n\t);\n}\n\nfunction groupReferenceMissing(\n\tgroupId: string,\n\treferenceKind: string,\n\tid: string | undefined,\n): Diagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tcode: \"solver.group-reference.missing\",\n\t\tmessage: `Group ${groupId} references a missing ${referenceKind}.`,\n\t\tpath: [\"groups\", groupId],\n\t\tdetail: id === undefined ? { groupId } : { groupId, id },\n\t};\n}\n\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Pipeline factory (Issue #54, 方案 D)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the default layout pipeline. Currently wraps `solveDiagram` in\n * a single mega-phase so custom callers can replace individual phases\n * (e.g. \"initial-layout\", \"route-edges\") without touching the rest.\n *\n * Individual phases will be extracted from the mega-phase in follow-up\n * PRs for 方案 A (recursive layout) and 方案 B (corner-graph A*).\n */\nexport function createDefaultPipeline(): LayoutPipeline {\n\treturn new LayoutPipeline()\n\t\t.addPhase({\n\t\t\tname: \"solve-diagram\",\n\t\t\trun(state: LayoutState): void {\n\t\t\t\tconst result = solveDiagram(state.diagram, state.options);\n\t\t\t\t// Mirror the result back into the state so downstream\n\t\t\t\t// consumers can inspect it after the pipeline runs.\n\t\t\t\tstate.diagnostics.push(...result.diagnostics);\n\t\t\t\tstate.bounds = result.bounds;\n\t\t\t\tstate.degraded = result.degraded ?? false;\n\t\t\t\tstate.coordinatedNodes = result.nodes;\n\t\t\t\tstate.coordinatedEdges = result.edges;\n\t\t\t},\n\t\t})\n\t\t.addPhase({\n\t\t\tname: \"quality-score\",\n\t\t\trun(state: LayoutState): void {\n\t\t\t\tif (!state.options.qualityScore) return;\n\t\t\t\tconst report = scoreLayoutQuality(\n\t\t\t\t\tstate.coordinatedNodes,\n\t\t\t\t\tstate.coordinatedEdges,\n\t\t\t\t);\n\t\t\t\tstate.qualityReport = report;\n\t\t\t\tstate.diagnostics.push(...report.diagnostics);\n\t\t\t},\n\t\t});\n}\n","import type { DslDiagnostic } from \"./types.js\";\n\nconst EDGE_ID_PATTERN = /^[A-Za-z0-9_.:-]+$/;\nconst SHORTHAND_PATTERN = /^(.+?)\\s*->\\s*([^:]+)(?::(.*))?$/;\n\nexport interface ParsedEdgeShorthand {\n\tsourceId: string;\n\ttargetId: string;\n\tlabel?: { text: string };\n}\n\nexport function parseEdgeShorthand(\n\tvalue: string,\n\tpath: Array<string | number>,\n): { edge?: ParsedEdgeShorthand; diagnostics: DslDiagnostic[] } {\n\tconst match = SHORTHAND_PATTERN.exec(value.trim());\n\tif (match === null) {\n\t\treturn invalidEdgeShorthand(path);\n\t}\n\n\tconst sourceId = match[1]?.trim() ?? \"\";\n\tconst targetId = match[2]?.trim() ?? \"\";\n\tconst labelText = match[3]?.trim();\n\n\tif (!isValidEdgeId(sourceId) || !isValidEdgeId(targetId)) {\n\t\treturn invalidEdgeShorthand(path);\n\t}\n\n\treturn {\n\t\tedge: {\n\t\t\tsourceId,\n\t\t\ttargetId,\n\t\t\t...(labelText === undefined || labelText === \"\"\n\t\t\t\t? {}\n\t\t\t\t: { label: { text: labelText } }),\n\t\t},\n\t\tdiagnostics: [],\n\t};\n}\n\nfunction invalidEdgeShorthand(path: Array<string | number>): {\n\tdiagnostics: DslDiagnostic[];\n} {\n\treturn {\n\t\tdiagnostics: [\n\t\t\t{\n\t\t\t\tseverity: \"error\",\n\t\t\t\tlayer: \"validate\",\n\t\t\t\tcode: \"validate.edge-shorthand.invalid\",\n\t\t\t\tmessage: \"Invalid edge shorthand.\",\n\t\t\t\tpath,\n\t\t\t\thint: 'Use \"source -> target\" or \"source -> target: label\".',\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction isValidEdgeId(value: string): boolean {\n\treturn value.length > 0 && EDGE_ID_PATTERN.test(value);\n}\n","import { z } from \"zod\";\nimport { createSchemaDiagnostic, sortDslDiagnostics } from \"./diagnostics.js\";\nimport type { DslDiagnostic } from \"./types.js\";\n\nconst directionSchema = z.enum([\"TB\", \"LR\", \"BT\", \"RL\"]);\nconst layoutModeSchema = z.enum([\"dagre\", \"positions\"]);\nconst routeKindSchema = z.enum([\"orthogonal\", \"straight\", \"obstacle-avoiding\"]);\nconst outputFormatSchema = z.enum([\"svg\", \"excalidraw\"]);\nconst edgeStrokeStyleSchema = z.enum([\"solid\", \"dashed\"]);\nconst edgeArrowheadSchema = z.enum([\"triangle\", \"hollowTriangle\"]);\nconst primaryReadingDirectionSchema = z.enum([\n\t\"top_to_bottom\",\n\t\"top-to-bottom\",\n]);\nconst nodeShapeSchema = z.enum([\n\t\"rectangle\",\n\t\"rounded-rectangle\",\n\t\"ellipse\",\n\t\"diamond\",\n\t\"parallelogram\",\n\t\"hexagon\",\n\t\"cylinder\",\n]);\n\nconst finiteNumberSchema = z.number().finite();\nconst nonNegativeNumberSchema = finiteNumberSchema.min(0);\n\nconst pointSchema = z.object({\n\tx: finiteNumberSchema,\n\ty: finiteNumberSchema,\n});\n\nconst insetsSchema = z.object({\n\ttop: finiteNumberSchema,\n\tright: finiteNumberSchema,\n\tbottom: finiteNumberSchema,\n\tleft: finiteNumberSchema,\n});\n\nconst nonNegativeInsetsSchema = z.object({\n\ttop: nonNegativeNumberSchema,\n\tright: nonNegativeNumberSchema,\n\tbottom: nonNegativeNumberSchema,\n\tleft: nonNegativeNumberSchema,\n});\n\nconst labelSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\ttext: z.string(),\n\t\tmaxWidth: finiteNumberSchema.optional(),\n\t}),\n]);\n\nconst styleSchema = z.object({\n\tfill: z.string().optional(),\n\tstroke: z.string().optional(),\n\tfontFamily: z.string().optional(),\n\tfontSize: finiteNumberSchema.optional(),\n});\n\nconst blockCellSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\ttext: z.string(),\n\t\tfill: z.string().optional(),\n\t\tstroke: z.string().optional(),\n\t\tstyle: styleSchema.optional(),\n\t}),\n]);\n\nconst portSideSchema = z.enum([\"top\", \"right\", \"bottom\", \"left\"]);\nconst portKindSchema = z.enum([\"proxy\", \"flow\"]);\n\nconst portSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tside: portSideSchema,\n\tkind: portKindSchema.optional(),\n\torder: finiteNumberSchema.optional(),\n\tstyle: styleSchema.optional(),\n});\n\nconst compartmentsSchema = z.object({\n\tstereotype: z.string().optional(),\n\tname: z.string().optional(),\n\tproperties: z\n\t\t.array(z.record(z.string(), z.string()).or(z.string()))\n\t\t.optional(),\n\tconstraints: z.array(z.string()).optional(),\n});\n\nconst nodeSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tshape: nodeShapeSchema.optional(),\n\tposition: pointSchema.optional(),\n\tstyle: styleSchema.optional(),\n\tports: z.record(z.string(), portSchema).optional(),\n\tcompartments: compartmentsSchema.optional(),\n});\n\nconst endpointSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\tnode: z.string(),\n\t\tport: z.string().optional(),\n\t}),\n]);\n\nconst structuredEdgeSchema = z\n\t.object({\n\t\tid: z.string().optional(),\n\t\tsource: endpointSchema.optional(),\n\t\ttarget: endpointSchema.optional(),\n\t\tsourceId: z.string().optional(),\n\t\ttargetId: z.string().optional(),\n\t\tlabel: labelSchema.optional(),\n\t\tstyle: edgeStrokeStyleSchema.optional(),\n\t\tarrowhead: edgeArrowheadSchema.optional(),\n\t})\n\t.superRefine((edge, context) => {\n\t\tif (edge.source === undefined && edge.sourceId === undefined) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Edge requires source or sourceId.\",\n\t\t\t\tpath: [\"source\"],\n\t\t\t});\n\t\t}\n\t\tif (edge.target === undefined && edge.targetId === undefined) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Edge requires target or targetId.\",\n\t\t\t\tpath: [\"target\"],\n\t\t\t});\n\t\t}\n\t});\n\nconst edgeSchema = z.union([z.string(), structuredEdgeSchema]);\n\nconst groupSchema = z.object({\n\tlabel: labelSchema.optional(),\n\tnodes: z.array(z.string()).optional(),\n\tgroups: z.array(z.string()).optional(),\n\tpadding: insetsSchema.optional(),\n\theaderHeight: nonNegativeNumberSchema.optional(),\n\tlabelPosition: z.enum([\"top\", \"inside\", \"outside\"]).optional(),\n\tdirection: z.enum([\"horizontal\", \"vertical\"]).optional(),\n});\n\nconst swimlaneSchema = z.object({\n\tlabel: labelSchema.optional(),\n\torientation: z.enum([\"vertical\", \"horizontal\"]).optional(),\n\tlayout: z.enum([\"overlay\", \"contract\"]).optional(),\n\theaderHeight: nonNegativeNumberSchema.optional(),\n\tpadding: nonNegativeNumberSchema.optional(),\n\tlanes: z.record(\n\t\tz.string(),\n\t\tz.object({\n\t\t\tlabel: labelSchema.optional(),\n\t\t\tchildren: z.array(z.string()).optional(),\n\t\t}),\n\t),\n});\n\nconst matrixSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\trows: z.array(z.string()),\n\t\tcols: z.array(z.string()),\n\t\tcells: z.array(z.array(blockCellSchema)),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((matrix, context) => {\n\t\tcheckDuplicateValues(\"matrix row\", matrix.rows, context, (index) => [\n\t\t\t\"rows\",\n\t\t\tindex,\n\t\t]);\n\t\tcheckDuplicateValues(\"matrix column\", matrix.cols, context, (index) => [\n\t\t\t\"cols\",\n\t\t\tindex,\n\t\t]);\n\t\tif (matrix.cells.length !== matrix.rows.length) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Matrix cells must contain exactly ${matrix.rows.length} row(s).`,\n\t\t\t\tpath: [\"cells\"],\n\t\t\t});\n\t\t}\n\t\tmatrix.cells.forEach((row, rowIndex) => {\n\t\t\tif (row.length !== matrix.cols.length) {\n\t\t\t\tcontext.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: `Matrix cell row must contain exactly ${matrix.cols.length} column(s).`,\n\t\t\t\t\tpath: [\"cells\", rowIndex],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\nconst tableColumnSchema = z.object({\n\tid: z.string(),\n\tlabel: labelSchema,\n});\n\nconst tableRowSchema = z.object({\n\tid: z.string(),\n\tcells: z.record(z.string(), blockCellSchema),\n});\n\nconst tableSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tcolumns: z.array(tableColumnSchema),\n\t\trows: z.array(tableRowSchema),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((table, context) => {\n\t\tcheckDuplicateIds(\"column\", table.columns, context, (index) => [\n\t\t\t\"columns\",\n\t\t\tindex,\n\t\t\t\"id\",\n\t\t]);\n\t\tcheckDuplicateIds(\"row\", table.rows, context, (index) => [\n\t\t\t\"rows\",\n\t\t\tindex,\n\t\t\t\"id\",\n\t\t]);\n\t\tconst columnIds = new Set(table.columns.map((column) => column.id));\n\t\ttable.rows.forEach((row, rowIndex) => {\n\t\t\tfor (const columnId of Object.keys(row.cells)) {\n\t\t\t\tif (!columnIds.has(columnId)) {\n\t\t\t\t\tcontext.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: `Table row cell references undeclared column \"${columnId}\".`,\n\t\t\t\t\t\tpath: [\"rows\", rowIndex, \"cells\", columnId],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\nconst panelItemSchema = z.union([\n\tz.string(),\n\tz.object({\n\t\tid: z.string().optional(),\n\t\tlabel: labelSchema,\n\t\tdetail: labelSchema.optional(),\n\t\tstyle: styleSchema.optional(),\n\t}),\n]);\n\nconst evidencePanelSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tkind: z.enum([\"legend\", \"rule\", \"note\", \"verification\"]),\n\t\titems: z.array(panelItemSchema),\n\t\tposition: pointSchema.optional(),\n\t\tsize: z\n\t\t\t.object({\n\t\t\t\twidth: nonNegativeNumberSchema,\n\t\t\t\theight: nonNegativeNumberSchema,\n\t\t\t})\n\t\t\t.optional(),\n\t\tstyle: styleSchema.optional(),\n\t})\n\t.superRefine((panel, context) => {\n\t\tconst firstIndexByItemId = new Map<string, number>();\n\t\tpanel.items.forEach((item, index) => {\n\t\t\tif (typeof item === \"string\" || item.id === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst firstIndex = firstIndexByItemId.get(item.id);\n\t\t\tif (firstIndex === undefined) {\n\t\t\t\tfirstIndexByItemId.set(item.id, index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Duplicate evidence panel item id \"${item.id}\".`,\n\t\t\t\tpath: [\"items\", index, \"id\"],\n\t\t\t});\n\t\t});\n\t});\n\nconst exactPositionConstraintSchema = z.object({\n\tkind: z.literal(\"exact-position\"),\n\ttarget: z.string().optional(),\n\ttargetId: z.string().optional(),\n\tposition: pointSchema,\n});\n\nconst relativePositionConstraintSchema = z.object({\n\tkind: z.literal(\"relative-position\"),\n\tsource: z.string().optional(),\n\tsourceId: z.string().optional(),\n\treference: z.string().optional(),\n\treferenceId: z.string().optional(),\n\trelation: z.enum([\"above\", \"right-of\", \"below\", \"left-of\"]),\n\toffset: pointSchema.optional(),\n});\n\nconst alignConstraintSchema = z.object({\n\tkind: z.literal(\"align\"),\n\taxis: z.enum([\n\t\t\"x\",\n\t\t\"y\",\n\t\t\"center-x\",\n\t\t\"center-y\",\n\t\t\"top\",\n\t\t\"right\",\n\t\t\"bottom\",\n\t\t\"left\",\n\t]),\n\ttargets: z.array(z.string()).optional(),\n\ttargetIds: z.array(z.string()).optional(),\n});\n\nconst distributeConstraintSchema = z.object({\n\tkind: z.literal(\"distribute\"),\n\taxis: z.enum([\"horizontal\", \"vertical\"]),\n\ttargets: z.array(z.string()).optional(),\n\ttargetIds: z.array(z.string()).optional(),\n\tspacing: finiteNumberSchema.optional(),\n});\n\nconst containmentConstraintSchema = z.object({\n\tkind: z.literal(\"containment\"),\n\tcontainer: z.string().optional(),\n\tcontainerId: z.string().optional(),\n\tchildren: z.array(z.string()).optional(),\n\tchildIds: z.array(z.string()).optional(),\n\tpadding: insetsSchema.optional(),\n});\n\nconst constraintSchema = z.union([\n\texactPositionConstraintSchema,\n\trelativePositionConstraintSchema,\n\talignConstraintSchema,\n\tdistributeConstraintSchema,\n\tcontainmentConstraintSchema,\n]);\n\nexport const diagramDslSchema = z\n\t.object({\n\t\tid: z.string().optional(),\n\t\ttitle: z.string().optional(),\n\t\tdirection: directionSchema.optional(),\n\t\tlayout: z\n\t\t\t.object({\n\t\t\t\tdirection: directionSchema.optional(),\n\t\t\t\tmode: layoutModeSchema.optional(),\n\t\t\t\tprimaryReadingDirection: primaryReadingDirectionSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\trouting: z\n\t\t\t.object({\n\t\t\t\tkind: routeKindSchema.optional(),\n\t\t\t\tportShifting: z\n\t\t\t\t\t.object({\n\t\t\t\t\t\tenabled: z.boolean().optional(),\n\t\t\t\t\t\tspacing: finiteNumberSchema.optional(),\n\t\t\t\t\t})\n\t\t\t\t\t.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\tnodes: z.record(z.string(), nodeSchema),\n\t\tedges: z.array(edgeSchema).optional(),\n\t\tgroups: z.record(z.string(), groupSchema).optional(),\n\t\tswimlanes: z.record(z.string(), swimlaneSchema).optional(),\n\t\tmatrices: z.array(matrixSchema).optional(),\n\t\ttables: z.array(tableSchema).optional(),\n\t\tevidencePanels: z.array(evidencePanelSchema).optional(),\n\t\tconstraints: z.array(constraintSchema).optional(),\n\t\tframe: z\n\t\t\t.object({\n\t\t\t\tkind: z.string(),\n\t\t\t\tcontext: z.string().optional(),\n\t\t\t\tname: z.string().optional(),\n\t\t\t\ttitleTab: z.string(),\n\t\t\t\theaderHeight: nonNegativeNumberSchema.optional(),\n\t\t\t\tpadding: z\n\t\t\t\t\t.union([nonNegativeNumberSchema, nonNegativeInsetsSchema])\n\t\t\t\t\t.optional(),\n\t\t\t\tlabelPosition: z.enum([\"top\", \"inside\", \"outside\"]).optional(),\n\t\t\t\tdirection: z.enum([\"horizontal\", \"vertical\"]).optional(),\n\t\t\t\tstyle: styleSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\toutput: z\n\t\t\t.object({\n\t\t\t\tformat: outputFormatSchema.optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.superRefine((diagram, context) => {\n\t\tcheckDuplicateEvidenceBlockIds(\"matrices\", diagram.matrices, context);\n\t\tcheckDuplicateEvidenceBlockIds(\"tables\", diagram.tables, context);\n\t\tcheckDuplicateEvidenceBlockIds(\n\t\t\t\"evidencePanels\",\n\t\t\tdiagram.evidencePanels,\n\t\t\tcontext,\n\t\t);\n\t\tcheckDuplicateEvidenceBlockIdsAcrossTypes(diagram, context);\n\t});\n\nexport type DiagramDsl = z.infer<typeof diagramDslSchema>;\n\nexport function validateDiagramDsl(value: unknown): {\n\tvalue?: DiagramDsl;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tconst result = diagramDslSchema.safeParse(value);\n\n\tif (result.success) {\n\t\treturn { value: result.data, diagnostics: [] };\n\t}\n\n\treturn {\n\t\tdiagnostics: sortDslDiagnostics(\n\t\t\tresult.error.issues.map((issue) =>\n\t\t\t\tcreateSchemaDiagnostic(toDiagnosticPath(issue.path), issue.message),\n\t\t\t),\n\t\t),\n\t};\n}\n\nfunction toDiagnosticPath(path: PropertyKey[]): Array<string | number> {\n\treturn path.flatMap((segment) =>\n\t\ttypeof segment === \"string\" || typeof segment === \"number\" ? [segment] : [],\n\t);\n}\n\nfunction checkDuplicateEvidenceBlockIds(\n\tcollection: \"matrices\" | \"tables\" | \"evidencePanels\",\n\tblocks: readonly { id: string }[] | undefined,\n\tcontext: z.RefinementCtx,\n): void {\n\tcheckDuplicateIds(\n\t\t`evidence block id in ${collection}`,\n\t\tblocks ?? [],\n\t\tcontext,\n\t\t(index) => [collection, index, \"id\"],\n\t);\n}\n\nfunction checkDuplicateIds(\n\tlabel: string,\n\titems: readonly { id: string }[],\n\tcontext: z.RefinementCtx,\n\tpathForIndex: (index: number) => Array<string | number>,\n): void {\n\tconst firstIndexById = new Map<string, number>();\n\titems.forEach((item, index) => {\n\t\tconst firstIndex = firstIndexById.get(item.id);\n\t\tif (firstIndex === undefined) {\n\t\t\tfirstIndexById.set(item.id, index);\n\t\t\treturn;\n\t\t}\n\t\tcontext.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `Duplicate ${label} \"${item.id}\".`,\n\t\t\tpath: pathForIndex(index),\n\t\t});\n\t});\n}\n\nfunction checkDuplicateValues(\n\tlabel: string,\n\tvalues: readonly string[],\n\tcontext: z.RefinementCtx,\n\tpathForIndex: (index: number) => Array<string | number>,\n): void {\n\tconst firstIndexByValue = new Map<string, number>();\n\tvalues.forEach((value, index) => {\n\t\tconst firstIndex = firstIndexByValue.get(value);\n\t\tif (firstIndex === undefined) {\n\t\t\tfirstIndexByValue.set(value, index);\n\t\t\treturn;\n\t\t}\n\t\tcontext.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `Duplicate ${label} \"${value}\".`,\n\t\t\tpath: pathForIndex(index),\n\t\t});\n\t});\n}\n\nfunction checkDuplicateEvidenceBlockIdsAcrossTypes(\n\tdiagram: {\n\t\tmatrices?: readonly { id: string }[] | undefined;\n\t\ttables?: readonly { id: string }[] | undefined;\n\t\tevidencePanels?: readonly { id: string }[] | undefined;\n\t},\n\tcontext: z.RefinementCtx,\n): void {\n\tconst firstById = new Map<\n\t\tstring,\n\t\t{ collection: \"matrices\" | \"tables\" | \"evidencePanels\"; index: number }\n\t>();\n\tfor (const collection of [\"matrices\", \"tables\", \"evidencePanels\"] as const) {\n\t\tconst blocks = diagram[collection] ?? [];\n\t\tblocks.forEach((block, index) => {\n\t\t\tconst first = firstById.get(block.id);\n\t\t\tif (first === undefined) {\n\t\t\t\tfirstById.set(block.id, { collection, index });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `Duplicate evidence block id \"${block.id}\" across ${first.collection} and ${collection}.`,\n\t\t\t\tpath: [collection, index, \"id\"],\n\t\t\t});\n\t\t});\n\t}\n}\n","import { Buffer } from \"node:buffer\";\nimport { parseDocument } from \"yaml\";\nimport { createParseDiagnostic, sortDslDiagnostics } from \"./diagnostics.js\";\nimport { parseEdgeShorthand } from \"./edges.js\";\nimport { validateDiagramDsl } from \"./schema.js\";\nimport type {\n\tDslDiagnostic,\n\tParseDiagramDslOptions,\n\tParseDiagramDslResult,\n} from \"./types.js\";\n\nexport const DEFAULT_DSL_MAX_BYTES = 1_000_000;\n\nexport function parseDiagramDsl(\n\tsource: string,\n\toptions: ParseDiagramDslOptions = {},\n): ParseDiagramDslResult {\n\tconst maxBytes = options.maxBytes ?? DEFAULT_DSL_MAX_BYTES;\n\n\tif (Buffer.byteLength(source, \"utf8\") > maxBytes) {\n\t\treturn {\n\t\t\tdiagnostics: [\n\t\t\t\tcreateParseDiagnostic(\n\t\t\t\t\t\"parse.input.too-large\",\n\t\t\t\t\t`Input exceeds the ${maxBytes} byte limit.`,\n\t\t\t\t\t\"Split the diagram into smaller inputs or raise maxBytes for trusted sources.\",\n\t\t\t\t),\n\t\t\t],\n\t\t};\n\t}\n\n\tconst parsed = parseSource(source, options);\n\tif (parsed.value === undefined || hasErrorDiagnostics(parsed.diagnostics)) {\n\t\treturn { diagnostics: sortDslDiagnostics(parsed.diagnostics) };\n\t}\n\n\tconst expanded = expandEdgeShorthand(parsed.value);\n\tif (hasErrorDiagnostics(expanded.diagnostics)) {\n\t\treturn { diagnostics: sortDslDiagnostics(expanded.diagnostics) };\n\t}\n\n\tconst validated = validateDiagramDsl(expanded.value);\n\n\treturn {\n\t\tvalue: validated.value,\n\t\tdiagnostics: sortDslDiagnostics([\n\t\t\t...parsed.diagnostics,\n\t\t\t...validated.diagnostics,\n\t\t]),\n\t};\n}\n\nfunction parseSource(\n\tsource: string,\n\toptions: ParseDiagramDslOptions,\n): { value?: unknown; diagnostics: DslDiagnostic[] } {\n\tif (isJsonSource(options)) {\n\t\treturn parseJsonSource(source);\n\t}\n\n\treturn parseYamlSource(source);\n}\n\nfunction parseJsonSource(source: string): {\n\tvalue?: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\ttry {\n\t\treturn { value: JSON.parse(source), diagnostics: [] };\n\t} catch (error) {\n\t\treturn {\n\t\t\tdiagnostics: [\n\t\t\t\tcreateParseDiagnostic(\n\t\t\t\t\t\"parse.json.invalid\",\n\t\t\t\t\t`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"Fix the JSON syntax or use a .yaml source file.\",\n\t\t\t\t),\n\t\t\t],\n\t\t};\n\t}\n}\n\nfunction parseYamlSource(source: string): {\n\tvalue?: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tconst document = parseDocument(source);\n\tconst diagnostics: DslDiagnostic[] = [\n\t\t...document.errors.map((error) =>\n\t\t\tcreateParseDiagnostic(\n\t\t\t\t\"parse.yaml.invalid\",\n\t\t\t\t`Invalid YAML: ${error.message}`,\n\t\t\t\t\"Fix the YAML syntax near the reported parser error.\",\n\t\t\t),\n\t\t),\n\t\t...document.warnings.map((warning) => ({\n\t\t\tseverity: \"warning\" as const,\n\t\t\tlayer: \"parse\" as const,\n\t\t\tcode: \"parse.yaml.warning\",\n\t\t\tmessage: `YAML warning: ${warning.message}`,\n\t\t\thint: \"Review the YAML warning before relying on the parsed value.\",\n\t\t})),\n\t];\n\n\tif (document.errors.length > 0) {\n\t\treturn { diagnostics };\n\t}\n\n\treturn { value: document.toJS(), diagnostics };\n}\n\nfunction isJsonSource(options: ParseDiagramDslOptions): boolean {\n\treturn (\n\t\toptions.sourceFormat === \"json\" ||\n\t\t(options.sourcePath?.toLowerCase().endsWith(\".json\") ?? false)\n\t);\n}\n\nfunction hasErrorDiagnostics(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n\nfunction expandEdgeShorthand(value: unknown): {\n\tvalue: unknown;\n\tdiagnostics: DslDiagnostic[];\n} {\n\tif (\n\t\tvalue === null ||\n\t\ttypeof value !== \"object\" ||\n\t\tArray.isArray(value) ||\n\t\t!(\"edges\" in value)\n\t) {\n\t\treturn { value, diagnostics: [] };\n\t}\n\n\tconst record = value as Record<string, unknown>;\n\tif (!Array.isArray(record.edges)) {\n\t\treturn { value, diagnostics: [] };\n\t}\n\n\tconst diagnostics: DslDiagnostic[] = [];\n\tconst edges = record.edges.map((edge, index) => {\n\t\tconst shorthand = edgeShorthandText(edge);\n\t\tif (shorthand === undefined) {\n\t\t\treturn edge;\n\t\t}\n\n\t\tconst result = parseEdgeShorthand(shorthand, [\"edges\", index]);\n\t\tdiagnostics.push(...result.diagnostics);\n\n\t\tif (result.edge === undefined) {\n\t\t\treturn edge;\n\t\t}\n\n\t\treturn {\n\t\t\tsourceId: result.edge.sourceId,\n\t\t\ttargetId: result.edge.targetId,\n\t\t\t...(result.edge.label === undefined ? {} : { label: result.edge.label }),\n\t\t};\n\t});\n\n\treturn { value: { ...record, edges }, diagnostics };\n}\n\nfunction edgeShorthandText(edge: unknown): string | undefined {\n\tif (typeof edge === \"string\") {\n\t\treturn edge;\n\t}\n\n\tif (edge === null || typeof edge !== \"object\" || Array.isArray(edge)) {\n\t\treturn undefined;\n\t}\n\n\tconst entries = Object.entries(edge);\n\tif (entries.length !== 1) {\n\t\treturn undefined;\n\t}\n\n\tconst entry = entries[0];\n\tif (entry === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst [key, value] = entry;\n\tif (!key.includes(\"->\") || typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\n\treturn `${key}: ${value}`;\n}\n","import { exportExcalidraw, exportSvg } from \"../exporters/index.js\";\nimport type { ExportResult } from \"../exporters/types.js\";\nimport type { CoordinatedDiagram } from \"../ir/diagram.js\";\nimport type { JsonObject } from \"../ir/geometry.js\";\nimport type {\n\tPortShiftingOptions,\n\tSolveDiagramOptions,\n} from \"../solver/index.js\";\nimport { solveDiagram } from \"../solver/index.js\";\nimport { sortDslDiagnostics } from \"./diagnostics.js\";\nimport { normalizeDiagramDsl } from \"./normalize.js\";\nimport { parseDiagramDsl } from \"./parse.js\";\nimport type {\n\tDslDiagnostic,\n\tDslOutputFormat,\n\tRenderDiagramDslOptions,\n\tRenderDiagramDslResult,\n} from \"./types.js\";\n\nexport function resolveOutputFormat(\n\tcliFormat?: string,\n\tdslFormat?: DslOutputFormat,\n): { format?: DslOutputFormat; diagnostics: DslDiagnostic[] } {\n\tconst selected = cliFormat ?? dslFormat ?? \"svg\";\n\n\tif (selected === \"svg\" || selected === \"excalidraw\") {\n\t\treturn { format: selected, diagnostics: [] };\n\t}\n\n\treturn {\n\t\tdiagnostics: [\n\t\t\t{\n\t\t\t\tseverity: \"error\",\n\t\t\t\tlayer: \"validate\",\n\t\t\t\tcode: \"validate.output-format.unsupported\",\n\t\t\t\tmessage: `Unsupported output format \"${selected}\".`,\n\t\t\t\tpath: [\"output\", \"format\"],\n\t\t\t\thint: \"Use svg or excalidraw.\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function exportDiagram(\n\tformat: DslOutputFormat,\n\tdiagram: CoordinatedDiagram,\n): ExportResult {\n\tconst content =\n\t\tformat === \"svg\" ? exportSvg(diagram) : exportExcalidraw(diagram);\n\n\treturn { format, content, diagnostics: [] };\n}\n\nexport function renderDiagramDsl(\n\tsource: string,\n\toptions: RenderDiagramDslOptions = {},\n): RenderDiagramDslResult {\n\tconst parsed = parseDiagramDsl(source, options);\n\tif (hasErrorDiagnostics(parsed.diagnostics) || parsed.value === undefined) {\n\t\treturn { diagnostics: parsed.diagnostics };\n\t}\n\n\tconst normalized = normalizeDiagramDsl(\n\t\tparsed.value,\n\t\toptions.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer },\n\t);\n\tconst format = resolveOutputFormat(options.format, normalized.output?.format);\n\tconst diagnostics = sortDslDiagnostics([\n\t\t...parsed.diagnostics,\n\t\t...normalized.diagnostics,\n\t\t...format.diagnostics,\n\t]);\n\n\tif (\n\t\tnormalized.diagram === undefined ||\n\t\tformat.format === undefined ||\n\t\thasErrorDiagnostics(diagnostics)\n\t) {\n\t\treturn { diagnostics };\n\t}\n\n\tconst solved = solveDiagram(normalized.diagram, {\n\t\t...solveInitialLayoutOption(normalized.diagram.metadata?.initialLayout),\n\t\trouteKind:\n\t\t\tnormalized.diagram.metadata?.routeKind === \"straight\"\n\t\t\t\t? \"straight\"\n\t\t\t\t: normalized.diagram.metadata?.routeKind === \"obstacle-avoiding\"\n\t\t\t\t\t? \"obstacle-avoiding\"\n\t\t\t\t\t: \"orthogonal\",\n\t\t...solvePortShiftingOption(normalized.diagram.metadata?.portShifting),\n\t\t...(options.textMeasurer === undefined\n\t\t\t? {}\n\t\t\t: { textMeasurer: options.textMeasurer }),\n\t});\n\tconst solveDiagnostics = solved.diagnostics.map(toSolveDiagnostic);\n\tif (hasErrorDiagnostics(solveDiagnostics)) {\n\t\treturn {\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: sortDslDiagnostics(solveDiagnostics),\n\t\t};\n\t}\n\n\ttry {\n\t\tconst exported = exportDiagram(format.format, solved);\n\t\treturn {\n\t\t\tformat: exported.format,\n\t\t\tcontent: exported.content,\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: sortDslDiagnostics([\n\t\t\t\t...diagnostics,\n\t\t\t\t...solveDiagnostics,\n\t\t\t\t...exported.diagnostics.map(toExportDiagnostic),\n\t\t\t]),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tdiagram: solved,\n\t\t\tdiagnostics: [\n\t\t\t\t{\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tlayer: \"export\",\n\t\t\t\t\tcode: \"export.failed\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\thint: \"Check the coordinated diagram and selected output format.\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\nfunction toSolveDiagnostic(\n\tdiagnostic: CoordinatedDiagram[\"diagnostics\"][number],\n): DslDiagnostic {\n\treturn { ...diagnostic, layer: \"solve\" };\n}\n\nfunction solveInitialLayoutOption(\n\tvalue: unknown,\n): Pick<SolveDiagramOptions, \"initialLayout\"> {\n\treturn value === \"positions\" ? { initialLayout: \"positions\" } : {};\n}\n\nfunction solvePortShiftingOption(value: unknown):\n\t| {\n\t\t\tportShifting: PortShiftingOptions;\n\t }\n\t| Record<string, never> {\n\tif (!isJsonObject(value)) {\n\t\treturn {};\n\t}\n\tconst portShifting: PortShiftingOptions = {};\n\tif (value.enabled === false) {\n\t\tportShifting.enabled = false;\n\t}\n\tif (typeof value.spacing === \"number\") {\n\t\tportShifting.spacing = value.spacing;\n\t}\n\treturn { portShifting };\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toExportDiagnostic(\n\tdiagnostic: ExportResult[\"diagnostics\"][number],\n): DslDiagnostic {\n\treturn { ...diagnostic, layer: \"export\" };\n}\n\nfunction hasErrorDiagnostics(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n","import {\n\tmkdtemp,\n\treadFile,\n\trename,\n\trm,\n\tstat,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { DslDiagnostic } from \"../dsl/index.js\";\n\nexport const MAX_INPUT_BYTES = 1_000_000;\n\nexport async function readStdin(stream: Readable): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tlet size = 0;\n\n\tfor await (const chunk of stream) {\n\t\tconst buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n\t\tsize += buffer.byteLength;\n\t\tif (size > MAX_INPUT_BYTES) {\n\t\t\tthrow inputTooLargeDiagnostic();\n\t\t}\n\t\tchunks.push(buffer);\n\t}\n\n\treturn Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function readInputFile(path: string): Promise<string> {\n\tconst inputStat = await stat(path);\n\tif (inputStat.size > MAX_INPUT_BYTES) {\n\t\tthrow inputTooLargeDiagnostic();\n\t}\n\n\tconst content = await readFile(path, \"utf8\");\n\tif (Buffer.byteLength(content, \"utf8\") > MAX_INPUT_BYTES) {\n\t\tthrow inputTooLargeDiagnostic();\n\t}\n\n\treturn content;\n}\n\nexport async function writeStdout(\n\tstream: Writable,\n\tcontent: string,\n): Promise<void> {\n\tawait writeStream(stream, content);\n}\n\nexport async function writeStderr(\n\tstream: Writable,\n\tcontent: string,\n): Promise<void> {\n\tawait writeStream(stream, content);\n}\n\nexport async function writeFileAtomic(\n\tpath: string,\n\tcontent: string,\n): Promise<void> {\n\tconst dir = dirname(path);\n\tconst tempDir = await mkdtemp(join(dir, \".agh-output-\"));\n\tconst tempPath = join(tempDir, \"output.tmp\");\n\n\ttry {\n\t\tawait writeFile(tempPath, content, \"utf8\");\n\t\tawait rename(tempPath, path);\n\t} finally {\n\t\tawait rm(tempDir, { force: true, recursive: true });\n\t}\n}\n\nfunction writeStream(stream: Writable, content: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tstream.write(content, (error) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nfunction inputTooLargeDiagnostic(): DslDiagnostic {\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"io\",\n\t\tcode: \"io.input.too-large\",\n\t\tmessage: `Input exceeds ${MAX_INPUT_BYTES} bytes.`,\n\t\thint: \"Reduce the DSL input size or split the diagram into smaller files.\",\n\t};\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { Command, CommanderError } from \"commander\";\nimport { sortDslDiagnostics } from \"../dsl/diagnostics.js\";\nimport { renderDiagramDsl } from \"../dsl/render.js\";\nimport type { DslDiagnostic } from \"../dsl/types.js\";\nimport {\n\treadInputFile,\n\treadStdin,\n\twriteFileAtomic,\n\twriteStderr,\n\twriteStdout,\n} from \"./io.js\";\n\nexport interface CliEnvironment {\n\tstdin?: Readable;\n\tstdout?: Writable;\n\tstderr?: Writable;\n}\n\ninterface CliOptions {\n\tinput?: string;\n\toutput?: string;\n\tformat?: string;\n\tjson?: boolean;\n}\n\nexport async function runCli(\n\targs: string[],\n\tenv: CliEnvironment = {},\n): Promise<number> {\n\tconst stdout = env.stdout ?? process.stdout;\n\tconst stderr = env.stderr ?? process.stderr;\n\tconst stdin = env.stdin ?? process.stdin;\n\tconst command = buildCommand();\n\n\ttry {\n\t\tcommand.parse(args, { from: \"user\" });\n\t} catch (error) {\n\t\tif (error instanceof CommanderError) {\n\t\t\tawait writeStderr(stderr, error.message);\n\t\t\treturn error.exitCode === 0 ? 0 : 2;\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst options = command.opts<CliOptions>();\n\n\ttry {\n\t\tconst source =\n\t\t\toptions.input === undefined\n\t\t\t\t? await readStdin(stdin)\n\t\t\t\t: await readInputFile(options.input);\n\t\tconst result = renderDiagramDsl(source, {\n\t\t\t...(options.input === undefined ? {} : { sourcePath: options.input }),\n\t\t\t...(options.format === undefined ? {} : { format: options.format }),\n\t\t});\n\t\tconst diagnostics = sortDslDiagnostics(result.diagnostics);\n\n\t\tif (hasErrors(diagnostics) || result.content === undefined) {\n\t\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (diagnostics.length > 0) {\n\t\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\t}\n\n\t\tif (options.output === undefined) {\n\t\t\tawait writeStdout(stdout, result.content);\n\t\t} else {\n\t\t\tawait writeFileAtomic(options.output, result.content);\n\t\t}\n\n\t\treturn 0;\n\t} catch (error) {\n\t\tconst diagnostics = [toIoDiagnostic(error)];\n\t\tawait writeDiagnostics(stderr, diagnostics, options.json === true);\n\t\treturn 1;\n\t}\n}\n\nfunction buildCommand(): Command {\n\treturn new Command()\n\t\t.name(\"agh\")\n\t\t.exitOverride()\n\t\t.configureOutput({\n\t\t\twriteOut: () => {},\n\t\t\twriteErr: () => {},\n\t\t})\n\t\t.option(\"--input <path>\", \"Read diagram DSL from a file\")\n\t\t.option(\"--output <path>\", \"Write generated output to a file\")\n\t\t.option(\"--format <format>\", \"Output format: svg or excalidraw\")\n\t\t.option(\"--json\", \"Write diagnostics as JSON to stderr\");\n}\n\nasync function writeDiagnostics(\n\tstderr: Writable,\n\tdiagnostics: DslDiagnostic[],\n\tasJson: boolean,\n): Promise<void> {\n\tif (diagnostics.length === 0) {\n\t\treturn;\n\t}\n\n\tconst content = asJson\n\t\t? `${JSON.stringify({ diagnostics }, null, 2)}\\n`\n\t\t: formatHumanDiagnostics(diagnostics);\n\tawait writeStderr(stderr, content);\n}\n\nfunction formatHumanDiagnostics(diagnostics: DslDiagnostic[]): string {\n\tconst lines = [`${diagnostics.length} diagnostic(s):`];\n\n\tfor (const diagnostic of diagnostics) {\n\t\tconst path = formatPath(diagnostic.path);\n\t\tlines.push(\n\t\t\t[\n\t\t\t\tdiagnostic.severity,\n\t\t\t\tdiagnostic.layer,\n\t\t\t\tdiagnostic.code,\n\t\t\t\tpath,\n\t\t\t\tdiagnostic.message,\n\t\t\t\tdiagnostic.hint,\n\t\t\t]\n\t\t\t\t.filter((part) => part !== undefined && part !== \"\")\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t}\n\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatPath(path: DslDiagnostic[\"path\"]): string {\n\treturn path === undefined || path.length === 0\n\t\t? \"\"\n\t\t: `path=${path.map(String).join(\".\")}`;\n}\n\nfunction hasErrors(diagnostics: DslDiagnostic[]): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n}\n\nfunction toIoDiagnostic(error: unknown): DslDiagnostic {\n\tif (isDslDiagnostic(error)) {\n\t\treturn error;\n\t}\n\n\treturn {\n\t\tseverity: \"error\",\n\t\tlayer: \"io\",\n\t\tcode: \"io.failed\",\n\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\thint: \"Check input and output paths, permissions, and CLI arguments.\",\n\t};\n}\n\nfunction isDslDiagnostic(error: unknown): error is DslDiagnostic {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"severity\" in error &&\n\t\t\"layer\" in error &&\n\t\t\"code\" in error &&\n\t\t\"message\" in error\n\t);\n}\n","#!/usr/bin/env node\n\nimport { runCli } from \"./run.js\";\n\nvoid runCli(process.argv.slice(2))\n\t.then((exitCode) => {\n\t\tprocess.exitCode = exitCode;\n\t})\n\t.catch((error: unknown) => {\n\t\tprocess.stderr.write(\n\t\t\terror instanceof Error ? error.message : String(error),\n\t\t);\n\t\tprocess.stderr.write(\"\\n\");\n\t\tprocess.exitCode = 1;\n\t});\n"]}
|