@crazyhappyone/auto-graph 0.2.7 → 0.2.9

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.
@@ -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(\"&\", \"&amp;\")\n\t\t.replaceAll(\"<\", \"&lt;\")\n\t\t.replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n\treturn escapeXml(value).replaceAll('\"', \"&quot;\");\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\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// 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\t// Swimlane distribution (Issue #60): non-contract swimlanes are\n\t// NOT modeled as containment constraints, so distribute children\n\t// inside each lane's content box separately.\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\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\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\tif (\n\t\t\t\tleftIdx < size &&\n\t\t\t\tthis._less(\n\t\t\t\t\tthis._data[leftIdx] as HeapEntry<T>,\n\t\t\t\t\tthis._data[smallestIdx] as HeapEntry<T>,\n\t\t\t\t)\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\tthis._data[smallestIdx] as HeapEntry<T>,\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\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) return null;\n\n\t// 5. Simplify.\n\treturn simplifyRoute(path);\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 */\nfunction 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 ?? 300;\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 { 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): 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 = 10;\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\tconst softObstacleIndex =\n\t\tinput.obstacleIndex ?? createBoxSpatialIndex(indexedBoxes(softObstacles));\n\tconst hardObstacleIndex =\n\t\tinput.hardObstacleIndex ??\n\t\tcreateBoxSpatialIndex(indexedBoxes(hardObstacles));\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\tconst cornerPath = findCornerGraphPath(\n\t\t\t\tsource,\n\t\t\t\ttarget,\n\t\t\t\t[...softObstacles, ...hardObstacles],\n\t\t\t\t{ endpointObstacles, margin: 2 },\n\t\t\t\tdiagnostics,\n\t\t\t);\n\t\t\t// Fall back to grid A* if corner graph fails.\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\t[...softObstacles, ...hardObstacles],\n\t\t\t\t\t{ endpointObstacles, margin: 0 },\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(finalized, source, target, diagnostics);\n\t\t\t\t\treturn { points: finalized, diagnostics };\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);\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\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\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\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\treturn {\n\t\tpoints: finalizeRoute(\n\t\t\tbestPoints,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t),\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\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). Default \"spread\". */\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}\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\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\toptions.maxRowDepth !== undefined\n\t) {\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}\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\tdistributeSwimlaneChildren: options.distributeSwimlaneChildren ?? \"spread\",\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);\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);\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): 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);\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\tconst maxRowDepth = options.maxRowDepth;\n\tif (maxRowDepth === undefined || nodes.length <= maxRowDepth) {\n\t\treturn new Map(boxes);\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) {\n\t\treturn false;\n\t}\n\tif (nodes.length < 2 || (direction !== \"LR\" && direction !== \"RL\")) {\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\tconst aspectRatio =\n\t\tbounds.width <= 0 ? Number.POSITIVE_INFINITY : bounds.height / bounds.width;\n\tconst preferred = options.preferredAspectRatio ?? 3;\n\tif (aspectRatio < preferred) {\n\t\treturn false;\n\t}\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): 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);\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): 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\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\tconst slotWidth =\n\t\tMath.max(...populatedBounds.map((box) => box.width)) + padding * 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\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\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{\n\t\t\t\tx: target.x - bounds.x,\n\t\t\t\ty: laneContentTop,\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: 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\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): void {\n\tfor (const [rank, stack] of rankStacks(childIds, nodeBoxes, flowRanks)) {\n\t\tlet yOffset = 0;\n\t\tfor (const item of stack) {\n\t\t\tconst { childId, box } = item;\n\t\t\tif (locks.has(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 ${childId} was not moved into contract swimlane slot.`,\n\t\t\t\t\tpath: [\"swimlanes\"],\n\t\t\t\t\tdetail: { nodeId: childId },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst next = {\n\t\t\t\t...box,\n\t\t\t\tx: box.x + target.x,\n\t\t\t\ty: target.y + rank * rankSpacing + yOffset,\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\tyOffset += box.height + rankStackGap;\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, diagnostics);\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// 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\tdiagnostics?: Diagnostic[],\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\tdiagnostics,\n\t\t\t\tnode.id,\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\tdiagnostics?: Diagnostic[],\n\tnodeId?: string,\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 effectiveSpacing =\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\t// Emit diagnostic when port spacing was compressed (Issue #60).\n\tif (\n\t\tshiftingEnabled &&\n\t\tcount > 1 &&\n\t\teffectiveSpacing < requestedSpacing &&\n\t\tdiagnostics !== undefined &&\n\t\tnodeId !== undefined\n\t) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"port_constraint_overlap\",\n\t\t\tmessage: `Port spacing on ${nodeId} ${side} compressed from ${requestedSpacing}px to ${Math.round(effectiveSpacing)}px for ${count} ports.`,\n\t\t\tpath: [\"nodes\", nodeId, \"ports\"],\n\t\t\tdetail: {\n\t\t\t\tnodeId,\n\t\t\t\tside,\n\t\t\t\trequestedSpacing,\n\t\t\t\teffectiveSpacing: Math.round(effectiveSpacing),\n\t\t\t\tportCount: count,\n\t\t\t},\n\t\t});\n\t}\n\tconst spacing = effectiveSpacing;\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): CoordinatedEdge[] {\n\tconst coordinated: CoordinatedEdge[] = [];\n\tconst coordinatedNodeById = new Map(\n\t\tcoordinatedNodes.map((node) => [node.id, node]),\n\t);\n\tconst nodeObstacleIndex = createBoxSpatialIndex(\n\t\tobstacles.map((box, index) => ({ id: `node-obstacle:${index}`, box })),\n\t\toptions.routingGutter ?? 160,\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(\n\t\t\tsource.box,\n\t\t\ttarget.box,\n\t\t\toptions.routingGutter ?? 160,\n\t\t);\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\t...(options.maxRoutingAttempts === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxRoutingAttempts: options.maxRoutingAttempts }),\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/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(\"&\", \"&amp;\")\n\t\t.replaceAll(\"<\", \"&lt;\")\n\t\t.replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n\treturn escapeXml(value).replaceAll('\"', \"&quot;\");\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): 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 = 10;\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\tconst softObstacleIndex =\n\t\tinput.obstacleIndex ?? createBoxSpatialIndex(indexedBoxes(softObstacles));\n\tconst hardObstacleIndex =\n\t\tinput.hardObstacleIndex ??\n\t\tcreateBoxSpatialIndex(indexedBoxes(hardObstacles));\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 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\t32,\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 },\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(finalized, source, target, diagnostics);\n\t\t\t\t\treturn { points: finalized, diagnostics };\n\t\t\t\t}\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(fullFinalized, source, target, diagnostics);\n\t\t\t\t\t\t\treturn { points: fullFinalized, diagnostics };\n\t\t\t\t\t\t}\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 },\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(gridFinalized, source, target, diagnostics);\n\t\t\t\t\t\t\treturn { points: gridFinalized, diagnostics };\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\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);\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\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\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\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\treturn {\n\t\tpoints: finalizeRoute(\n\t\t\tbestPoints,\n\t\t\tsoftObstacles,\n\t\t\thardObstacles,\n\t\t\tdiagnostics,\n\t\t),\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\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}\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);\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);\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): 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);\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): 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);\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): 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\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);\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\tconst distributable = lane.children.filter(\n\t\t\t\t(childId) => !locks.has(childId),\n\t\t\t);\n\t\t\tif (distributable.length >= CROSS_AXIS_SPREAD_THRESHOLD) {\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\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);\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).\nfunction maxCrossAxisSpreadWidth(\n\tswimlane: Swimlane,\n\tnodeBoxes: ReadonlyMap<string, Box>,\n\tflowRanks: ReadonlyMap<string, number>,\n\tlocks: ReadonlyMap<string, LayoutLockLike>,\n\tgap: number,\n): number {\n\tlet maxWidth = 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 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): 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 = 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): CoordinatedEdge[] {\n\tconst coordinated: CoordinatedEdge[] = [];\n\tconst coordinatedNodeById = new Map(\n\t\tcoordinatedNodes.map((node) => [node.id, node]),\n\t);\n\tconst nodeObstacleIndex = createBoxSpatialIndex(\n\t\tobstacles.map((box, index) => ({ id: `node-obstacle:${index}`, box })),\n\t\toptions.routingGutter ?? 160,\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(\n\t\t\tsource.box,\n\t\t\ttarget.box,\n\t\t\toptions.routingGutter ?? 160,\n\t\t);\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\t...(options.maxRoutingAttempts === undefined\n\t\t\t\t? {}\n\t\t\t\t: { maxRoutingAttempts: options.maxRoutingAttempts }),\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"]}