@cardenelabs/dragon 0.7.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/keywords.ts","../src/parser.ts","../src/focus.ts","../src/color.ts","../src/input-size.ts","../src/relative-pos.ts","../src/compile.ts","../src/v05/parser.ts","../src/notation-lint.ts","../src/canvas-bounds.ts","../src/write-position.ts","../src/json-parser.ts","../src/schemas/diagram.json","../src/schema.ts","../src/index.ts"],"names":["diagram","NODE_KINDS","flow","parseActor","opts","namePart","layout","indentText","rawName","indent","r"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Text DSL i18n キーワード一覧\n * 日本語 / 英語両対応 (大文字小文字無視)\n */\n\nimport type { NodeKind, Tone } from \"@cardenelabs/cdl\";\n\n/** ブロック ヘッダー */\nexport const HEADERS = {\n title: [\"タイトル\", \"title\"],\n type: [\"種類\", \"type\"],\n actors: [\"登場人物\", \"actors\"],\n flow: [\"流れ\", \"flow\", \"steps\"],\n animate: [\"アニメーション\", \"animate\", \"animation\"],\n} as const;\n\n/** preset 名 */\nexport const PRESET_NAMES = [\"sequence\", \"flow\", \"swimlane\", \"er\", \"state\", \"topology\"] as const;\n\n/** NodeKind 別名 (日本語 → English) */\nexport const NODE_KIND_ALIAS: Record<string, NodeKind> = {\n // 日本語\n 人: \"actor\",\n 関数: \"function\",\n ストレージ: \"storage\",\n イベント: \"event\",\n // 英語 (NodeKind そのまま)\n actor: \"actor\",\n function: \"function\",\n storage: \"storage\",\n event: \"event\",\n cdn: \"cdn\",\n service: \"service\",\n database: \"database\",\n cache: \"cache\",\n queue: \"queue\",\n // ... 残り 29 NodeKind は parser 内で types.NodeKind を直接受理\n};\n\n/** Tone 別名 */\nexport const TONE_ALIAS: Record<string, Tone> = {\n // 日本語\n 成功: \"success\",\n 失敗: \"error\",\n 警告: \"warning\",\n 情報: \"info\",\n 中立: \"accent\",\n // 英語\n success: \"success\",\n error: \"error\",\n warning: \"warning\",\n info: \"info\",\n neutral: \"accent\",\n accent: \"accent\",\n teal: \"teal\",\n};\n\n/** アニメ サブキー */\nexport const ANIM_SUBKEYS = {\n state: [\"状態\", \"state\"],\n step: [\"ステップ\", \"step\"],\n highlight: [\"強調\", \"highlight\", \"active\", \"activate\"],\n tween: [\"遷移\", \"tween\"],\n set: [\"切替\", \"set\"],\n body: [\"説明\", \"body\", \"description\"],\n badge: [\"バッジ\", \"badge\"],\n} as const;\n\n/** 矢印記号 全変種を統一形 → に正規化 */\nexport const ARROW_PATTERNS = [\"→\", \"->\", \"=>\", \">>\", \"->>\", \"-->>\", \"->>\"];\n\nexport function normalizeArrow(s: string): string {\n let r = s;\n for (const p of ARROW_PATTERNS) {\n r = r.split(p).join(\"→\");\n }\n return r;\n}\n\n/** ヘッダー名 (日本語 or 英語) を canonical name に解決 */\nexport function resolveHeader(s: string): keyof typeof HEADERS | null {\n const lower = s.toLowerCase().trim();\n for (const [canon, aliases] of Object.entries(HEADERS)) {\n if ((aliases as readonly string[]).some((a) => a.toLowerCase() === lower)) {\n return canon as keyof typeof HEADERS;\n }\n }\n return null;\n}\n\nexport function resolveAnimSubkey(s: string): keyof typeof ANIM_SUBKEYS | null {\n const lower = s.toLowerCase().trim();\n for (const [canon, aliases] of Object.entries(ANIM_SUBKEYS)) {\n if ((aliases as readonly string[]).some((a) => a.toLowerCase() === lower)) {\n return canon as keyof typeof ANIM_SUBKEYS;\n }\n }\n return null;\n}\n\n/** duration 文字列 (1.5 秒 / 1500ms / 2 秒) を ms に変換 */\nexport function parseDuration(s: string): number | null {\n const trimmed = s.trim();\n // \"1.5 秒\" / \"2 秒\"\n const sec = trimmed.match(/^([\\d.]+)\\s*秒$/);\n if (sec) return Math.round(parseFloat(sec[1]!) * 1000);\n // \"1500ms\" / \"1500 ms\"\n const ms = trimmed.match(/^([\\d.]+)\\s*ms$/i);\n if (ms) return Math.round(parseFloat(ms[1]!));\n // \"1.5s\" / \"2s\"\n const en = trimmed.match(/^([\\d.]+)\\s*s$/i);\n if (en) return Math.round(parseFloat(en[1]!) * 1000);\n return null;\n}\n","/**\n * Text DSL parser\n * 入力: docs/cdl/text-dsl-spec.md 準拠の箇条書きテキスト\n * 出力: DslDocument AST or DslError[]\n */\n\nimport type {\n DslDocument,\n DslActor,\n DslStep,\n DslAnimate,\n DslState,\n DslPhase,\n DslError,\n PresetType,\n} from \"./types\";\nimport type { NodeKind, Tone } from \"@cardenelabs/cdl\";\nimport {\n PRESET_NAMES,\n NODE_KIND_ALIAS,\n TONE_ALIAS,\n normalizeArrow,\n resolveHeader,\n resolveAnimSubkey,\n parseDuration,\n} from \"./keywords\";\n\ntype Line = { raw: string; trimmed: string; indent: number; lineNo: number };\n\nfunction indentOf(s: string): number {\n let n = 0;\n for (const c of s) {\n if (c === \" \") n += 1;\n else if (c === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction splitLines(src: string): Line[] {\n return src.split(\"\\n\").map((raw, i) => {\n // # コメントを除去 (行末まで)\n const noComment = raw.replace(/\\s*#.*$/, \"\");\n return {\n raw,\n trimmed: noComment.trim(),\n indent: indentOf(noComment),\n lineNo: i + 1,\n };\n });\n}\n\nfunction isBlank(l: Line): boolean {\n return l.trimmed === \"\";\n}\n\n/** \"key: value\" を split */\nfunction splitKv(s: string): [string, string] | null {\n const idx = s.indexOf(\":\");\n if (idx < 0) return null;\n return [s.slice(0, idx).trim(), s.slice(idx + 1).trim()];\n}\n\n/** 行の \"- item (kind)\" or \"- item\" を parse */\nfunction parseListItem(s: string): { name: string; paren?: string } | null {\n const m = s.match(/^-\\s*(.+?)(?:\\s*\\(\\s*(.+?)\\s*\\))?\\s*$/);\n if (!m) return null;\n return { name: m[1]!.trim(), paren: m[2]?.trim() };\n}\n\n/**\n * Parser 本体\n */\nexport type ParseResult = { ok: true; doc: DslDocument } | { ok: false; errors: DslError[] };\n\nexport function parseTextDsl(src: string): ParseResult {\n const lines = splitLines(src);\n const errors: DslError[] = [];\n\n let title: string | undefined;\n let type: PresetType | undefined;\n const actors: DslActor[] = [];\n const steps: DslStep[] = [];\n let animate: DslAnimate | undefined;\n\n let i = 0;\n while (i < lines.length) {\n const l = lines[i]!;\n if (isBlank(l)) { i += 1; continue; }\n\n // top-level header の検出 (`タイトル:` 等)\n const kv = splitKv(l.trimmed);\n if (kv && l.indent === 0) {\n const header = resolveHeader(kv[0]);\n if (header === \"title\") {\n title = kv[1];\n i += 1; continue;\n }\n if (header === \"type\") {\n if (!(PRESET_NAMES as readonly string[]).includes(kv[1].toLowerCase())) {\n errors.push({\n line: l.lineNo,\n message: `未知の種類 \"${kv[1]}\"`,\n hint: `次から選んでください: ${PRESET_NAMES.join(\" / \")}`,\n });\n }\n type = kv[1].toLowerCase() as PresetType;\n i += 1; continue;\n }\n if (header === \"actors\") {\n // 次のブロック (indent > 0) を全部読む\n i += 1;\n while (i < lines.length && (lines[i]!.indent > 0 || isBlank(lines[i]!))) {\n if (!isBlank(lines[i]!)) {\n const a = parseActor(lines[i]!, errors);\n if (a) actors.push(a);\n }\n i += 1;\n }\n continue;\n }\n if (header === \"flow\") {\n i += 1;\n while (i < lines.length && (lines[i]!.indent > 0 || isBlank(lines[i]!))) {\n if (!isBlank(lines[i]!)) {\n const s = parseStep(lines[i]!, errors, actors);\n if (s) steps.push(s);\n }\n i += 1;\n }\n continue;\n }\n if (header === \"animate\") {\n const r = parseAnimate(lines, i + 1, errors);\n animate = r.anim;\n i = r.nextIndex;\n continue;\n }\n }\n\n // 知らない top-level 行はスキップ (warning に降格、 ignore)\n i += 1;\n }\n\n // 必須項目チェック\n if (!title) errors.push({ line: 1, message: \"タイトル: が見つかりません\", hint: \"ファイル先頭に `タイトル: <名前>` を追加\" });\n if (!type) errors.push({ line: 1, message: \"種類: が見つかりません\", hint: \"ファイルに `種類: sequence` 等を追加\" });\n if (actors.length === 0) errors.push({ line: 1, message: \"登場人物: ブロックが空または見つかりません\", hint: \"`登場人物:` の下に `- 名前 (種類)` を追加\" });\n\n if (errors.length > 0) return { ok: false, errors };\n\n return {\n ok: true,\n doc: {\n title: title!,\n type: type!,\n actors,\n flow: steps,\n animate,\n pos: { line: 1 },\n },\n };\n}\n\nfunction parseActor(l: Line, errors: DslError[]): DslActor | null {\n const item = parseListItem(l.trimmed);\n if (!item) {\n errors.push({ line: l.lineNo, message: `登場人物の書式エラー: \"${l.trimmed}\"`, hint: \"`- 名前 (種類)` 形式で書いてください\" });\n return null;\n }\n let kind: NodeKind = \"actor\";\n let kindWritten = false;\n if (item.paren) {\n const resolved = NODE_KIND_ALIAS[item.paren] ?? (item.paren as NodeKind);\n kind = resolved;\n kindWritten = true;\n }\n return { name: item.name, kind, kindWritten, pos: { line: l.lineNo } };\n}\n\nfunction parseStep(l: Line, errors: DslError[], actors: DslActor[]): DslStep | null {\n // \"1. ユーザー → API: ログイン情報 (成功)\"\n const m = l.trimmed.match(/^(\\d+)\\.\\s*(.+)$/);\n if (!m) {\n errors.push({ line: l.lineNo, message: `流れの書式エラー: \"${l.trimmed}\"`, hint: \"`番号. <from> → <to>: <ラベル>` 形式\" });\n return null;\n }\n const no = parseInt(m[1]!, 10);\n const rest = normalizeArrow(m[2]!);\n // \"A → B: label (tone)\"\n const m2 = rest.match(/^(.+?)\\s*→\\s*(.+?)\\s*:\\s*(.+)$/);\n if (!m2) {\n errors.push({ line: l.lineNo, message: `矢印または ラベル なし: \"${l.trimmed}\"`, hint: \"`<from> → <to>: <ラベル>` 形式\" });\n return null;\n }\n const from = m2[1]!.trim();\n const to = m2[2]!.trim();\n let labelPart = m2[3]!.trim();\n\n // tone in () at end\n let tone: Tone | undefined;\n const toneMatch = labelPart.match(/^(.+?)\\s*\\(\\s*(.+?)\\s*\\)\\s*$/);\n if (toneMatch) {\n const resolved = TONE_ALIAS[toneMatch[2]!];\n if (resolved) {\n tone = resolved;\n labelPart = toneMatch[1]!.trim();\n }\n }\n\n // sub label syntax: \"label (sub)\" → label, sub の使い分けは tone と曖昧。\n // 仕様 ... 末尾 (...) は tone を優先解釈、 tone エイリアスに一致しなければ sub。\n let sub: string | undefined;\n if (!tone && toneMatch) {\n sub = toneMatch[2];\n labelPart = toneMatch[1]!.trim();\n }\n\n // actor 名チェック\n const names = new Set(actors.map((a) => a.name));\n if (!names.has(from)) {\n errors.push({ line: l.lineNo, message: `\"${from}\" が登場人物にいません`, hint: `登場人物: に \"- ${from}\" を追加` });\n }\n if (!names.has(to)) {\n errors.push({ line: l.lineNo, message: `\"${to}\" が登場人物にいません`, hint: `登場人物: に \"- ${to}\" を追加` });\n }\n\n return { no, from, to, label: labelPart, sub, tone, pos: { line: l.lineNo } };\n}\n\ntype ParseAnimResult = { anim: DslAnimate; nextIndex: number };\n\nfunction parseAnimate(lines: Line[], startIdx: number, errors: DslError[]): ParseAnimResult {\n const states: DslState[] = [];\n const phases: DslPhase[] = [];\n const anim: DslAnimate = { states, phases, pos: { line: startIdx + 1 } };\n\n let i = startIdx;\n while (i < lines.length) {\n const l = lines[i]!;\n if (isBlank(l)) { i += 1; continue; }\n // animate ブロックは indent > 0 が前提、 indent=0 なら top-level に戻る\n if (l.indent === 0) break;\n\n const kv = splitKv(l.trimmed);\n if (kv) {\n // kv[0] は \"ステップ「送信」 1.5 秒\" のような形 もあり得るので prefix 一致で resolve\n // 「ステップ」 「step」 で始まる → \"step\"、 それ以外は exact match\n let sub: ReturnType<typeof resolveAnimSubkey> = null;\n const head = kv[0].trim();\n if (/^(ステップ|step|STEP)/i.test(head)) sub = \"step\";\n else sub = resolveAnimSubkey(head);\n if (sub === \"state\") {\n // \"状態: 残高 = 100\"\n const m = kv[1].match(/^(.+?)\\s*=\\s*(.+)$/);\n if (!m) {\n errors.push({ line: l.lineNo, message: `状態 書式エラー: \"${kv[1]}\"`, hint: \"`状態: <名前> = <初期値>`\" });\n } else {\n const name = m[1]!.trim();\n const raw = m[2]!.trim();\n const num = parseFloat(raw);\n const initial = isNaN(num) ? raw.replace(/^[\"']|[\"']$/g, \"\") : num;\n states.push({ name, initial, pos: { line: l.lineNo } });\n }\n i += 1; continue;\n }\n if (sub === \"step\") {\n // \"ステップ「送信」 1.5 秒\" or \"step \\\"submit\\\" 1.5s\"\n // kv[0] には keyword + 「name」 + duration、 kv[1] は空 (`ステップ「送信」 1.5 秒:` の場合)\n // ただし resolveAnimSubkey は kv[0] の最初の単語 (ステップ) だけ見るので、\n // 残りは kv[0] 全体から keyword を除去して name + duration を抽出する。\n const afterKeyword = kv[0]\n .replace(/^(ステップ|step|STEP)\\s*/i, \"\")\n .trim();\n const nameMatch = afterKeyword.match(/^[「\"](.+?)[」\"]\\s*(.+)$/);\n if (!nameMatch) {\n errors.push({ line: l.lineNo, message: `ステップ 書式エラー: \"${kv[0]}\"`, hint: `\\`ステップ「<名前>」 <時間>:\\` 形式` });\n i += 1; continue;\n }\n const phaseName = nameMatch[1]!;\n const durStr = nameMatch[2]!.trim();\n const durMs = parseDuration(durStr);\n if (durMs === null) {\n errors.push({ line: l.lineNo, message: `時間 解釈不能: \"${durStr}\"`, hint: \"`1.5 秒` / `1500ms` / `2s` 等\" });\n i += 1; continue;\n }\n const phase: DslPhase = { name: phaseName, durationMs: durMs, pos: { line: l.lineNo } };\n // sub block を読む\n i += 1;\n const phaseBaseIndent = l.indent;\n while (i < lines.length && (lines[i]!.indent > phaseBaseIndent || isBlank(lines[i]!))) {\n if (!isBlank(lines[i]!)) {\n applyPhaseSubLine(lines[i]!, phase, errors);\n }\n i += 1;\n }\n phases.push(phase);\n continue;\n }\n }\n i += 1;\n }\n\n return { anim, nextIndex: i };\n}\n\nfunction applyPhaseSubLine(l: Line, phase: DslPhase, errors: DslError[]): void {\n const kv = splitKv(l.trimmed);\n if (!kv) return;\n const sub = resolveAnimSubkey(kv[0]);\n if (sub === \"highlight\") {\n phase.highlight = kv[1].split(\",\").map((s) => s.trim()).filter(Boolean);\n return;\n }\n if (sub === \"tween\") {\n // \"残高: 100 → 90\"\n const rest = normalizeArrow(kv[1]);\n const m = rest.match(/^(.+?)\\s*:\\s*([\\d.]+)\\s*→\\s*([\\d.]+)$/);\n if (!m) {\n errors.push({ line: l.lineNo, message: `遷移 書式エラー: \"${kv[1]}\"`, hint: \"`遷移: <state>: <from> → <to>`\" });\n return;\n }\n phase.tweens = phase.tweens ?? [];\n phase.tweens.push({\n state: m[1]!.trim(),\n from: parseFloat(m[2]!),\n to: parseFloat(m[3]!),\n pos: { line: l.lineNo },\n });\n return;\n }\n if (sub === \"set\") {\n // \"ステータス: 完了\"\n const m = kv[1].match(/^(.+?)\\s*:\\s*(.+)$/);\n if (!m) {\n errors.push({ line: l.lineNo, message: `切替 書式エラー: \"${kv[1]}\"`, hint: \"`切替: <state>: <値>`\" });\n return;\n }\n const raw = m[2]!.trim();\n const num = parseFloat(raw);\n const value = isNaN(num) ? raw : num;\n phase.sets = phase.sets ?? [];\n phase.sets.push({ state: m[1]!.trim(), value, pos: { line: l.lineNo } });\n return;\n }\n if (sub === \"body\") {\n phase.body = kv[1];\n return;\n }\n if (sub === \"badge\") {\n phase.badge = kv[1];\n return;\n }\n}\n","/**\n * 光らせる相手 (`focus:`) の書き方を読む。\n *\n * 書き方は 2 通り。 箱の名前 1 つか、 矢印 (`A -> B`) で 2 者を指す形。\n *\n * 読み方をここに 1 つだけ置く。 id の形は図種で違う (順序図は縦列の上端 / 下端 / 手順箱、\n * 流れ図は箱 1 個) ため id への解決は図種ごとに残すが、 「どちらの書き方か」 の判断を\n * 図種ごとに持つと、 同じ記述が図種によって別の意味になる。\n *\n * 以前は図種ごとに判定していて、 順序図と汎用の 2 経路が `-` 1 文字を矢印と見なしていた。\n * その結果 `api-gateway` のような名前が「api から gateway への矢印」 と読まれ、 順序図では\n * 光らず、 流れ図では名前に部分一致した別の矢印が光っていた (実測)。\n */\n\n/** 光らせる相手の指定。 */\nexport type FocusEntry =\n | { kind: \"edge\"; from: string; to: string }\n | { kind: \"node\"; name: string };\n\n/**\n * 矢印の形。 `->` の 2 文字か `→` の 1 文字だけを矢印と見なす。\n *\n * `-` 1 文字を矢印に含めてはいけない。 名前に `-` を使う箱 (`api-gateway` / `shape-api-gateway`)\n * が矢印として読まれる。\n */\nconst ARROW = /^(.+?)\\s*(?:->|→)\\s*(.+)$/;\n\n/**\n * 書かれた 1 件を読む。\n *\n * 矢印の両側は 1 文字以上を要求するので、 片側だけの形 (`-> API` / `API ->`) は矢印に\n * ならず名前として読まれる。\n *\n * `knownNames` に一致する名前は矢印より先に名前として読む。 引用符付きで矢印を含む名前\n * (`\"A -> B\"`) を書いた箱は実在し得るので、 常に矢印と読むと光らせられない (実測 = 名前が\n * 一致する箱があるのに何も光らず、 「矢印が流れにありません」 と誤報した)。\n *\n * @param knownNames 実在する箱の名前。 渡さない場合は書き方だけで判断する\n */\nexport function parseFocusEntry(raw: string, knownNames?: ReadonlySet<string>): FocusEntry {\n const item = raw.trim();\n if (knownNames?.has(item)) return { kind: \"node\", name: item };\n const m = item.match(ARROW);\n if (!m) return { kind: \"node\", name: item };\n return { kind: \"edge\", from: m[1]!.trim(), to: m[2]!.trim() };\n}\n","/**\n * 色として読める値かの判定と、 図から外部参照を落とす処理 (#1004)。\n *\n * 図の中の文字列は最終的に SVG の属性になる。 色を塗る位置 (`fill` / `stroke` 等) に\n * `url(https://example.invalid/x)` が入ると、 図を開いた人の環境からその URL へ要求が飛ぶ。\n * 書き出した SVG を配布しても同じことが起きる。\n *\n * 入口は 1 つではない (状態の上書き / phase の `set` / 画面が直接書く背景色 / 埋め込んだ JSON)。\n * 入口ごとに塞ぐと 1 つ見落とした時に穴が残るため、 **組み立ての最後に図全体を走査する**\n * 出口の検査を置く。 入口側の判定 (`isColorValue`) は「正しい図を保つ」 ため、\n * 出口の検査 (`stripExternalPaint`) は「漏れを塞ぐ」 ための二重の構えになっている。\n */\n\n/**\n * CSS の標準色名。\n *\n * 色名を色として扱わないと、 初期値に `red` を持つ状態が「色ではない」 判定になり、\n * その状態への上書きが無検査で通る (実測で `fill=\"url(...)\"` が生成された)。\n * 逆に 16 進の初期値へ正当な `red` を書いた時に元の色へ戻る退行も起きる。\n *\n * 完全一致で照合する。 部分一致にすると `red; background:url(x)` のような形が通る。\n */\nconst CSS_COLOR_NAMES: ReadonlySet<string> = new Set([\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\", \"bisque\", \"black\",\n \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\", \"burlywood\", \"cadetblue\", \"chartreuse\",\n \"chocolate\", \"coral\", \"cornflowerblue\", \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\",\n \"darkgoldenrod\", \"darkgray\", \"darkgreen\", \"darkgrey\", \"darkkhaki\", \"darkmagenta\",\n \"darkolivegreen\", \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkslategrey\", \"darkturquoise\", \"darkviolet\", \"deeppink\",\n \"deepskyblue\", \"dimgray\", \"dimgrey\", \"dodgerblue\", \"firebrick\", \"floralwhite\", \"forestgreen\",\n \"fuchsia\", \"gainsboro\", \"ghostwhite\", \"gold\", \"goldenrod\", \"gray\", \"green\", \"greenyellow\",\n \"grey\", \"honeydew\", \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\", \"lightcyan\",\n \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightgrey\", \"lightpink\", \"lightsalmon\",\n \"lightseagreen\", \"lightskyblue\", \"lightslategray\", \"lightslategrey\", \"lightsteelblue\",\n \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\", \"maroon\", \"mediumaquamarine\",\n \"mediumblue\", \"mediumorchid\", \"mediumpurple\", \"mediumseagreen\", \"mediumslateblue\",\n \"mediumspringgreen\", \"mediumturquoise\", \"mediumvioletred\", \"midnightblue\", \"mintcream\",\n \"mistyrose\", \"moccasin\", \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\",\n \"orangered\", \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\", \"purple\", \"rebeccapurple\",\n \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\", \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\",\n \"sienna\", \"silver\", \"skyblue\", \"slateblue\", \"slategray\", \"slategrey\", \"snow\", \"springgreen\",\n \"steelblue\", \"tan\", \"teal\", \"thistle\", \"tomato\", \"transparent\", \"turquoise\", \"violet\", \"wheat\",\n \"white\", \"whitesmoke\", \"yellow\", \"yellowgreen\",\n // 塗らないことを表す値。 色ではないが、 色を書く位置に置ける正当な値\n \"none\", \"currentcolor\",\n]);\n\n/**\n * 色として読める値か。\n *\n * 状態の値は node の `fill` にそのまま入る。 そのため「色の状態を探す」 判定と\n * 「上書きを受け入れるか」 の判定は同じ物差しでなければならない。 別々に持つと、\n * 片方だけ直した時に片方が通してしまう。\n *\n * 通すのは 16 進の 3 形 (`#rgb` / `#rrggbb` / `#rrggbbaa`) と、 標準の色名。\n * 桁数を絞るのは、 `#1234` のような半端な形を色として扱うと描画側の解釈に委ねる範囲が\n * 広がるため。 見本のすべての色が 3 形に収まることは `parts-color-hex-format.test.ts` が検査している。\n *\n * `rgb(...)` / `hsl(...)` は通さない。 括弧を含む形を許すと、 括弧の中身を見る判定が要る。\n * 見本のどのパーツも使っておらず、 通す理由が無い。\n */\nexport function isColorValue(v: unknown): v is string {\n if (typeof v !== \"string\") return false;\n const s = v.trim();\n if (/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(s)) return true;\n return CSS_COLOR_NAMES.has(s.toLowerCase());\n}\n\n/**\n * 図の外側を指す値か。\n *\n * SVG の `url(...)` は図の中の定義 (`url(#gradient-1)`) も指せる。 これは正当な用途なので、\n * 括弧の中が `#` で始まる形だけを残し、 それ以外を外向きとみなす。\n *\n * 空白と大文字小文字は無視する。 `URL( https://... )` のような書き方で判定を抜けられないため。\n */\nexport function pointsOutside(v: unknown): boolean {\n if (typeof v !== \"string\") return false;\n // 空白をすべて落としてから見る。 `url ( http...)` のように間に空白を挟む形も同じ扱いにする\n const compact = v.replace(/\\s+/g, \"\").toLowerCase();\n const m = compact.match(/url\\(([^)]*)/);\n if (m) {\n const inner = (m[1] ?? \"\").replace(/^[\"']/, \"\");\n // 図の中の定義を指すものだけ残す\n return !inner.startsWith(\"#\");\n }\n // `url(` を伴わない直書きの参照。 属性によってはこの形でも読み込まれる\n return /^(https?:)?\\/\\//.test(compact) || compact.startsWith(\"data:\");\n}\n\n/** 色を塗る位置に使われる key。 ここに入る値は SVG の paint 属性になる */\nconst PAINT_KEYS: ReadonlySet<string> = new Set([\n \"fill\", \"stroke\", \"color\", \"bg\", \"background\",\n \"fillbind\", \"strokebind\", \"colorbind\",\n \"stfill\", \"strokecolor\", \"fillcolor\",\n]);\n\n/** 落とした時に入れる値。 「塗らない」 を表す SVG の正当な値 */\nconst SAFE_PAINT = \"none\";\n\n/** 落とした場所と値。 呼出側が書いた人に知らせるために使う */\nexport type StrippedPaint = { path: string; value: string };\n\n/**\n * 図の中から、 色を塗る位置に入った外部参照を落とす。\n *\n * 対象は 2 種類ある。\n *\n * - 色を塗る key (`fill` / `stroke` / `bg` 等) の値\n * - 状態の値 (`states[].initial` と、 phase が状態へ入れる値)。 状態は `{名前}` の形で\n * `fill` に差し込まれるため、 色を塗る位置に届く\n *\n * 説明文 (`title` / `subtitle` / `value` / `rows`) は対象外。 文字として出るだけで\n * 属性にはならないため、 URL を書く正当な用途を壊さない。\n *\n * 図を直接書き換える (返り値ではなく引数を変える)。 組み立ての最後に 1 度だけ呼ぶ前提。\n */\nexport function stripExternalPaint(diagram: unknown): StrippedPaint[] {\n const stripped: StrippedPaint[] = [];\n walk(diagram, \"\", false, stripped);\n return stripped;\n}\n\n/**\n * 図の中を辿って外部参照を落とす。\n *\n * `inStateValue` = 今見ている場所が状態の値かどうか。 状態は key の名前が `initial` や\n * 状態名そのもの (phase の `sets`) になるため、 key の名前だけでは色かどうか分からない。\n * 「状態を入れる箱の中にいる」 ことを引き継いで判断する。\n */\nfunction walk(node: unknown, path: string, inStateValue: boolean, out: StrippedPaint[]): void {\n if (node === null || typeof node !== \"object\") return;\n\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) {\n walk(node[i], `${path}[${i}]`, inStateValue, out);\n }\n return;\n }\n\n const obj = node as Record<string, unknown>;\n for (const [key, value] of Object.entries(obj)) {\n const here = path ? `${path}.${key}` : key;\n const lower = key.toLowerCase();\n // 状態を入れる箱に入ったら、 その中の値はすべて状態の値として扱う\n const nextInState = inStateValue || lower === \"states\" || lower === \"sets\" || lower === \"tweens\";\n\n if (typeof value === \"string\") {\n const isPaint = PAINT_KEYS.has(lower) || (nextInState && (lower === \"initial\" || lower === \"to\" || lower === \"from\" || !isReservedStateKey(lower)));\n if (isPaint && pointsOutside(value)) {\n obj[key] = SAFE_PAINT;\n out.push({ path: here, value });\n }\n continue;\n }\n walk(value, here, nextInState, out);\n }\n}\n\n/**\n * 状態を入れる箱の中で、 値ではなく仕組みを表す key。\n *\n * phase の `sets` は「状態名: 値」 の形なので、 key の名前を列挙して除外できない。\n * 代わりに、 状態の箱が持つ決まった名前 (`id` / `stateId` / `duration` 等) を除いた残りを\n * 値とみなす。\n */\nfunction isReservedStateKey(lowerKey: string): boolean {\n return lowerKey === \"id\" || lowerKey === \"stateid\" || lowerKey === \"duration\" ||\n lowerKey === \"title\" || lowerKey === \"body\" || lowerKey === \"badge\" || lowerKey === \"kind\";\n}\n","import type { DslDocument } from \"./types\";\n\n/**\n * 図を組み立てる前に、 大きすぎる入力を止める (#1005)。\n *\n * 組み立てにかかる時間は要素数の 2 乗で伸びる。 実測 (要素だけを並べた形)。\n *\n * | 要素 | 組み立て |\n * |---|---|\n * | 1,000 | 104ms |\n * | 2,000 | 346ms |\n * | 5,000 | 1,647ms |\n * | 10,000 | 7,622ms |\n *\n * 待機 (500ms) の後に同じ流れの中で走るため、 この間 editor は操作を受け付けない。\n * 貼ってしまうと tab を閉じるまで戻らない。\n *\n * 見本 (catalog) は 1 図あたり平均 4 要素、 最も多い file でも平均 7 要素。 実用の規模と\n * 1 秒の境界 (約 3,000 要素) は桁が 2-3 つ違うため、 上限を置いても正当な図には当たらない。\n *\n * 既にある `dom-complexity-budget` (400 要素) とは別物。 あちらは組み立てた**後**に\n * 「見やすさ」 の観点で警告を出すだけで、 組み立て自体は走る。 こちらは組み立てる**前**に\n * 「固まらない」 ために止める。 400-2,000 の範囲は従来どおり警告が出て図も描ける。\n */\n\n/** 組み立てを止める要素数。 1 秒を明確に下回る水準に置く (2,000 要素で約 350ms) */\nexport const MAX_INPUT_ELEMENTS = 2000;\n\n/**\n * 組み立てを止める本文の大きさ (byte)。\n *\n * 要素数だけでは、 1 要素に極端に長い文字列を持つ形を捉えられない。 読み取り自体は速い\n * (10,000 要素 98,936 byte で 2ms) ので、 実用の余裕を大きく取って置く。\n */\nexport const MAX_INPUT_BYTES = 512 * 1024;\n\n/** 数えた結果。 超過した時に何がどれだけ超えたかを画面に出すために使う */\nexport interface InputSize {\n elements: number;\n bytes: number;\n}\n\n/**\n * 記法の解析結果から要素数を数える。\n *\n * 数えるのは組み立ての重さに効くもの = 要素 / 流れ / 段 / 状態 / 段組み。\n * 図の題名や表示の設定は数に入れない (何件あっても重さが変わらない)。\n *\n * **段の中身 (光らせる相手 / 遷移 / 即時変更) も数える**。 段の数だけを見ると、\n * 1 段に 1,000 件の相手を書いた形が 1 件として通る。 実測ではこの形が組み立ての中で\n * 約 100 万件に展開され、 呼び出しの深さが上限を超えて落ちた。\n */\nexport function countDocElements(doc: DslDocument): number {\n const phases = doc.animate?.phases ?? [];\n const phaseChildren = phases.reduce(\n (acc, p) => acc + (p.highlight?.length ?? 0) + (p.tweens?.length ?? 0) + (p.sets?.length ?? 0),\n 0,\n );\n return (\n doc.actors.length +\n doc.flow.length +\n phases.length +\n phaseChildren +\n (doc.animate?.states.length ?? 0) +\n (doc.groups ? Object.keys(doc.groups).length : 0) +\n (doc.lanes ? Object.keys(doc.lanes).length : 0)\n );\n}\n\n/**\n * 組み立て済みの図から要素数を数える。\n *\n * 記法を通らない入口 (本文に埋め込んだ図の定義) 用。 解析結果が無いため、 図の側で数える。\n *\n * **段の中身と読み取り部品も数える**。 段を 1 件として数えるだけだと、段の中に 10,000 件の\n * 光らせる指定を持つ図が「1 要素」 と判定されて素通りする (実測)。 記法側の数え方\n * (`countDocElements`) は段の中身を足しているので、こちらも揃える。\n */\nexport function countDiagramElements(diagram: {\n nodes?: unknown[];\n edges?: unknown[];\n lanes?: unknown[];\n states?: unknown[];\n phases?: unknown[];\n readouts?: unknown[];\n inputs?: unknown[];\n formulas?: unknown[];\n scrollTriggers?: unknown[];\n eventBindings?: unknown[];\n}): number {\n const phases = Array.isArray(diagram.phases) ? diagram.phases : [];\n const phaseChildren = phases.reduce((acc: number, p) => {\n const ph = p as { activate?: unknown[]; highlight?: unknown[]; tweens?: unknown[]; sets?: unknown[] };\n return (\n acc +\n (Array.isArray(ph?.activate) ? ph.activate.length : 0) +\n (Array.isArray(ph?.highlight) ? ph.highlight.length : 0) +\n (Array.isArray(ph?.tweens) ? ph.tweens.length : 0) +\n (Array.isArray(ph?.sets) ? ph.sets.length : 0)\n );\n }, 0);\n return (\n (diagram.nodes?.length ?? 0) +\n (diagram.edges?.length ?? 0) +\n (diagram.lanes?.length ?? 0) +\n (diagram.states?.length ?? 0) +\n phases.length +\n phaseChildren +\n // 図が持てる並びは全部数える。 1 つでも外すと、そこに寄せた図が素通りする\n (diagram.readouts?.length ?? 0) +\n (diagram.inputs?.length ?? 0) +\n (diagram.formulas?.length ?? 0) +\n (diagram.scrollTriggers?.length ?? 0) +\n (diagram.eventBindings?.length ?? 0)\n );\n}\n\n/** 本文の大きさを byte で数える (文字数ではなく実際の大きさ) */\nexport function countBytes(src: string): number {\n // Node にも browser にもある形で数える。 `Buffer` は browser に無い\n return new TextEncoder().encode(src).length;\n}\n\n/**\n * 大きすぎる入力なら、 その旨を伝える文を返す。 収まっていれば `null`。\n *\n * 投げるのではなく文を返すのは、 呼出側が「誤りとして表示する」 か「別の扱いにする」 かを\n * 選べるようにするため。\n *\n * `bytes` に 0 を渡すと大きさの検査を飛ばす (要素数だけを見たい合流点で使う)。\n */\nexport function describeOversize(size: InputSize): string | null {\n if (size.elements > MAX_INPUT_ELEMENTS) {\n return `要素が ${size.elements.toLocaleString()} 件あります。 ${MAX_INPUT_ELEMENTS.toLocaleString()} 件までにしてください (これ以上は組み立てに時間がかかり、 画面が止まります)`;\n }\n if (size.bytes > MAX_INPUT_BYTES) {\n // KB の整数で出す。 MB 小数 1 桁だと、 1 byte 超えただけの時に「0.5MB / 上限 0.5MB」 と\n // 同じ数字が並び、 制限内なのに拒まれたように読める\n const kb = Math.ceil(size.bytes / 1024);\n const limitKb = Math.floor(MAX_INPUT_BYTES / 1024);\n return `本文が ${kb.toLocaleString()}KB あります。 ${limitKb.toLocaleString()}KB までにしてください (これ以上は読み取りだけで待たされ、 記憶も大きく使います)`;\n }\n return null;\n}\n\n/**\n * 本文が大きすぎるなら、 その旨を伝える文を返す。 収まっていれば `null`。\n *\n * **読み取る前に呼ぶ**。 要素数の上限は読み取った後にしか分からないため、 巨大な本文を\n * 渡された時の読み取り自体 (11.9MB で記憶 200MB) を防げない。\n */\nexport function describeOversizeSource(src: string): string | null {\n return describeOversize({ elements: 0, bytes: countBytes(src) });\n}\n","/**\n * 位置を他の要素からの相対で書くための解決。\n *\n * `位置: Web の右 200` のように、 座標の代わりに「誰の」「どちら側に」「どれだけ離して」 を書く。\n * 書く人も LLM も座標を知らないので、 数値を当てさせない形を用意する。\n *\n * 解決結果は絶対座標 (`posX` / `posY`) で、 座標を直接書いた時と同じ経路を通る。\n * 書き方が増えるだけで、 効き方は変わらない。\n *\n * 座標を決める場所が組み立て側 (`compile.ts`) と画面側 (playground の `overlay-dsl.ts`) の\n * 2 つあるため、 解決の規則は本 file に 1 つだけ置いて両方から呼ぶ。 片方だけ直すと画面が\n * 直らない事故を、 規則を共有することで構造的に防ぐ。\n */\n\n/** 基準からどちら側に置くか。 */\nexport type RelativeDirection = \"right\" | \"left\" | \"above\" | \"below\";\n\n/** 相対で書かれた位置の指定。 */\nexport type RelativePos = {\n /** 基準にする相手の名前。 `actors:` に書かれた名前をそのまま持つ。 */\n anchor: string;\n dir: RelativeDirection;\n /** 相手との間隔。 書かなかった時は `RELATIVE_GAP_DEFAULT`。 */\n gap?: number;\n};\n\n/** 位置を決めるのに必要な、 基準の中心と大きさ。 */\nexport type AnchorBox = { cx: number; cy: number; w: number; h: number };\n\n/**\n * 間隔を書かなかった時の既定値。\n *\n * 8 図種 × 4 向きで間隔を変えながら、 cdl が出す近すぎ系の指摘の数を数えて決めた。\n * 100 で 17 件、 130 で 10 件、 140 で 4 件と減り、 160 で 2 件に落ちて以降は変わらない。\n * 残る 2 件は間隔と無関係な指摘なので、 減らなくなる 160 を既定にする。\n *\n * 自動配置が空ける隙間も実測では縦 100 / 横 256-406 で、 160 はその間に収まる。\n * 隣に置いたと読める近さと、 詰まって見えない広さの両方を満たす。\n */\nexport const RELATIVE_GAP_DEFAULT = 160;\n\n/**\n * 書かれた向きの語。 日本語と英語の両方を受け付ける。\n *\n * 項目名が日本語でも英語でもよい (`種類` / `kind`) のと揃える。\n */\nconst DIRECTION_WORDS: Readonly<Record<string, RelativeDirection>> = {\n 右: \"right\",\n 左: \"left\",\n 上: \"above\",\n 下: \"below\",\n right: \"right\",\n left: \"left\",\n above: \"above\",\n below: \"below\",\n};\n\n/**\n * 間隔として受け付ける数の形。\n *\n * 負の数は含めない (向きが裏返るため)。 小数と指数表記は受け付ける。 整数だけに絞ると、\n * 有効な数を書いたのに「書き方が読めません」 と返す (実測 = `1e2` / `.5` が弾かれた)。\n */\nconst GAP_NUM = String.raw`(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?`;\n\n/**\n * 日本語の形。 `Web の右` / `Web の右 200` / `Web の右200`。\n *\n * 相手の名前は控えめ (`.+?`) に取る。 名前自体が `の右` で終わる場合 (`Aの右 の左`) でも、\n * 後戻りして末尾の向きを先に確定するため取り違えない。\n */\nconst RE_JA = new RegExp(String.raw`^(.+?)\\s*の\\s*(右|左|上|下)(?:\\s*(${GAP_NUM}))?$`);\n\n/** 英語の形。 `Web right` / `Web right 200`。 向きの前後は空白で区切る。 */\nconst RE_EN = new RegExp(String.raw`^(.+?)\\s+(right|left|above|below)(?:\\s+(${GAP_NUM}))?$`, \"i\");\n\n/**\n * `位置:` に書かれた値を相対指定として読む。 相対の形でなければ null。\n *\n * 座標の形 (`300,200`) は呼ぶ側が先に判定する。 ここは相対だけを見る。\n */\nexport function parseRelativePos(raw: string): RelativePos | null {\n const s = raw.trim();\n if (s === \"\") return null;\n const m = s.match(RE_JA) ?? s.match(RE_EN);\n if (!m) return null;\n const anchor = m[1]!.trim();\n if (anchor === \"\") return null;\n const dir = DIRECTION_WORDS[m[2]!.toLowerCase()];\n if (dir === undefined) return null;\n const gapRaw = m[3];\n if (gapRaw === undefined) return { anchor, dir };\n const gap = Number(gapRaw);\n // 数として読めない間隔は書かなかった扱いにする。 既定の間隔で置く方が、\n // 図から消えるより書いた人が気付きやすい。\n return Number.isFinite(gap) ? { anchor, dir, gap } : { anchor, dir };\n}\n\n/**\n * 相対指定を絶対座標に直す。\n *\n * `posX` / `posY` は箱の中心。 間隔は箱の縁と縁の間の距離として扱う。 中心間の距離にすると、\n * 大きさの違う箱を並べた時に見た目の隙間が揃わない。\n */\nexport function resolveRelativePos(\n rel: RelativePos,\n anchor: AnchorBox,\n target: { w: number; h: number },\n): { posX: number; posY: number } {\n // 負の間隔は向きを裏返す。 `Web の右 -1000` が Web の左に置かれ、 確かめる側も同じ値で\n // 期待を作るので矛盾に気付けない (実測 = 右と書いて左に出た)。 間隔は 0 以上として扱う。\n // 記法から来る値は parser が弾くが、 本関数は公開しているので入口で閉じる\n const raw = rel.gap ?? RELATIVE_GAP_DEFAULT;\n const gap = Number.isFinite(raw) && raw >= 0 ? raw : RELATIVE_GAP_DEFAULT;\n const dx = anchor.w / 2 + gap + target.w / 2;\n const dy = anchor.h / 2 + gap + target.h / 2;\n switch (rel.dir) {\n case \"right\":\n return { posX: anchor.cx + dx, posY: anchor.cy };\n case \"left\":\n return { posX: anchor.cx - dx, posY: anchor.cy };\n case \"below\":\n return { posX: anchor.cx, posY: anchor.cy + dy };\n case \"above\":\n return { posX: anchor.cx, posY: anchor.cy - dy };\n }\n}\n\n/**\n * 相対指定を解く順番を決める。\n *\n * 基準にした相手がまた相対で書かれていることがある (`B は A の右`、 `C は B の右`)。\n * 先に相手が決まっていないと座標を出せないので、 依存の浅い順に並べ替える。\n *\n * 輪になっている分 (`A は B の右`、 `B は A の右`) は解けないため、 順番からは外して\n * 名前だけを返す。 呼ぶ側が誤りとして扱う。\n */\nexport function orderByDependency(\n items: ReadonlyArray<{ name: string; rel?: RelativePos }>,\n): { order: string[]; cyclic: string[] } {\n const relOf = new Map<string, RelativePos>();\n const known = new Set<string>();\n for (const it of items) {\n known.add(it.name);\n if (it.rel) relOf.set(it.name, it.rel);\n }\n const order: string[] = [];\n const done = new Set<string>();\n const cyclic = new Set<string>();\n\n // 再帰にすると基準の連鎖の長さだけ stack を積む。 連鎖の長さは書く人が決めるので\n // 上限を置けない。 明示的な配列で辿る。\n for (const it of items) {\n if (done.has(it.name) || cyclic.has(it.name)) continue;\n // path は [自分, 基準, 基準の基準, ...] の順に伸びる\n const path: string[] = [];\n const onPath = new Set<string>();\n let cur: string | undefined = it.name;\n while (cur !== undefined) {\n if (done.has(cur) || cyclic.has(cur)) break;\n if (onPath.has(cur)) {\n // 輪を見つけた。 輪に含まれる分だけを外す。 輪に入る手前の分は解けるので残す\n for (const n of path.slice(path.indexOf(cur))) cyclic.add(n);\n break;\n }\n path.push(cur);\n onPath.add(cur);\n const rel = relOf.get(cur);\n // 相対で書かれていない、 または相手が居ない = ここで辿り終わり\n if (rel === undefined || !known.has(rel.anchor)) break;\n cur = rel.anchor;\n }\n // 奥 (基準側) から順に並べる。 基準が先に決まっていないと座標を出せない\n for (let i = path.length - 1; i >= 0; i -= 1) {\n const n = path[i]!;\n if (cyclic.has(n) || done.has(n)) continue;\n done.add(n);\n order.push(n);\n }\n }\n return { order, cyclic: [...cyclic] };\n}\n","/**\n * AST (DslDocument) → 既存 preset API 経由 → LaidDiagram\n *\n * v0.3 ... アニメーション ブロック full compile 対応 (sequence preset のみ、 他 preset は v0.4 で順次)\n * - state / tween / set / highlight / badge / body を実 phase に注入\n * - アニメーション ありなら builder 直接経路 ... preset の標準 phase を置換\n * - アニメーション なしは v0.2 と同じく preset 経由\n *\n * v0.2 ... 6 preset 全対応 (sequence / flow / swimlane / er / state / topology)\n */\n\nimport type { DslDocument, DslPhase } from \"./types\";\nimport type { CdlDiagram, ErRelationCardinality, LaidDiagram } from \"@cardenelabs/cdl\";\nimport {\n sequence, flow, swimlane, er, stateMachine, topology, diagram, layout,\n rendersRows, requiredRowsHeight, requiredRowsWidth, NODE_KINDS,\n} from \"@cardenelabs/cdl\";\nimport { parseFocusEntry } from \"./focus\";\nimport { isColorValue, stripExternalPaint } from \"./color\";\nimport {\n MAX_INPUT_ELEMENTS,\n countDiagramElements,\n countDocElements,\n describeOversize,\n} from \"./input-size\";\nimport {\n orderByDependency,\n resolveRelativePos,\n type AnchorBox,\n type RelativeDirection,\n} from \"./relative-pos\";\n\nexport interface CompileToCdlOpts {\n /**\n * CAR-1657 = parts identifier lookup catalog、 caller (CdlEditor / test) が inject。\n * DslActor.partId が set された actor を検出したら partsCatalog[partId] から CdlDiagram を\n * lookup + mergePartIntoDiagram で target に統合。 未渡し時は parts kind actor を skip + warn。\n */\n partsCatalog?: Record<string, CdlDiagram>;\n /**\n * 組み立ての途中で分かった「書いたのに効かなかったこと」 の受け取り口。\n *\n * 図は出せるので誤りにはしないが、 黙って捨てると書いた人が理由を追えない。 editor は\n * これを受けて画面に出す。 判定は組み立て側だけが持ち、 画面側は表示に徹する。\n */\n onNotice?: (notice: CompileNotice) => void;\n /**\n * edge が DSL のどの行から来たかの受け取り口 (#998)。\n *\n * preset によっては書いた step と生成される edge が一致しない (`type: flow` は actor を鎖状に\n * 繋ぐため `a -> c` と書いても `a -> b` になる)。 edge を起点に本文の行を直す機能は、 この\n * 対応が無いと別の行を書き換える。\n *\n * **対応が取れない edge については呼ばれない**。 「対応が無い」 と「行 0」 を区別するため。\n */\n onEdgeSource?: (edgeId: string, line: number) => void;\n}\n\n/** 図は出せるが書いた通りにならなかった、 という知らせ。 */\nexport type CompileNotice = {\n kind:\n | \"relative-position-ignored\"\n | \"focus-target-missing\"\n | \"state-override-rejected\"\n | \"external-paint-dropped\"\n // 図の中に描く部品を持たない見本を重ねた (#1017)\n | \"part-not-drawn\"\n // `倍率:` を書いた見本が、同じ名前の状態も持っていた (#1026)\n | \"scale-reserved\";\n /** 対象の名前。 光らせる相手なら書かれた指定そのまま */\n actor: string;\n /** 書かれていた行 */\n line: number;\n message: string;\n hint?: string;\n};\n\nexport function compileToCdl(doc: DslDocument, opts?: CompileToCdlOpts): CdlDiagram {\n // 大きすぎる図は組み立てない (#1005)。 組み立てにかかる時間は要素数の 2 乗で伸び、\n // 待機の後に同じ流れの中で走るため、 貼ってしまうと画面が戻らない (実測 = 10,000 要素で 7.6 秒)。\n // 両方の記法がここを通るので、 入口ごとに置かずここで 1 度だけ見る\n const oversize = describeOversize({ elements: countDocElements(doc), bytes: 0 });\n if (oversize) throw new Error(oversize);\n\n let diagram: CdlDiagram;\n switch (doc.type) {\n case \"sequence\":\n diagram = compileSequence(doc);\n break;\n case \"flow\":\n diagram = compileFlow(doc);\n break;\n case \"swimlane\":\n diagram = compileSwimlane(doc);\n break;\n case \"er\":\n diagram = compileEr(doc);\n break;\n case \"state\":\n diagram = compileState(doc);\n break;\n case \"topology\":\n diagram = compileTopology(doc);\n break;\n case \"solidity\":\n diagram = compileSolidity(doc);\n break;\n case \"gantt\":\n diagram = compileGantt(doc);\n break;\n case \"class\":\n diagram = compileClass(doc);\n break;\n case \"pie\":\n diagram = compilePie(doc);\n break;\n case \"c4\":\n diagram = compileC4(doc);\n break;\n case \"mind\":\n diagram = compileMind(doc);\n break;\n default:\n // switch case で全 type を網羅済のため default は unreachable、 template expression で\n // never 型を直接埋込めないので String() で明示 (defensive runtime error message 用)。\n throw new Error(`unknown type: ${String(doc.type)}`);\n }\n // edge と本文の行の対応は表に集めてから 1 edge = 1 回で知らせる (#998)。 経路ごとに\n // その場で呼ぶと、 同じ edge に別の行を 2 度知らせることになる。\n const edgeSourceLines = opts?.onEdgeSource ? new Map<string, number>() : undefined;\n applyEdgeInlineOptions(diagram, doc, edgeSourceLines);\n // `type: flow` は actor を鎖状に繋ぐため上の (from, to) 一致では取れない。 preset の規則で埋める。\n if (edgeSourceLines) fillFlowEdgeSources(diagram, doc, edgeSourceLines);\n applyGroupContainers(diagram, doc);\n applyNodeTones(diagram, doc);\n // 光らせる相手が実在するかを確かめる。 id への解決は図種ごとに違うが、 名前が居るか\n // 居ないかは記述だけで決まるので 1 か所で見る\n reportMissingFocusTargets(doc, opts?.onNotice);\n // `位置: Web の右` を実際の配置から絶対座標に直す。 以降は座標を直接書いた時と同じ経路\n const placed = resolveRelativeDoc(diagram, doc, opts?.onNotice, opts?.partsCatalog);\n // canvas pivot 新 spec = 全 preset 共通の post-process で actor.posX/Y を CDL lane / node に伝播\n applyCanvasPivotPositions(diagram, placed);\n // CAR-1657 = parts kind actor を merge (opts.partsCatalog 経由)、 applyV05Extensions 後段で実行\n const extended = applyV05Extensions(diagram, placed);\n const merged = mergePartsFromActors(extended, placed, opts?.partsCatalog, opts?.onNotice);\n // 表が揃ってから 1 edge = 1 回で知らせる。 merge 後に残っている edge だけを対象にする =\n // 途中で消えた edge の行を知らせても呼出側が使えない。\n if (edgeSourceLines && opts?.onEdgeSource) {\n const alive = new Set(merged.edges.map((e) => e.id));\n for (const [id, line] of edgeSourceLines) {\n if (alive.has(id)) opts.onEdgeSource(id, line);\n }\n }\n // 動かない図に段を 1 つ入れる (#1086)。\n //\n // 描画側は「段が 1 件以上」 を要求するが、 段を作るかどうかは種類ごとにばらけている。\n // 実測 = `animation:` を書かない同じ記法を 12 種に与えると、 6 種 (sequence / flow / er /\n // state / topology / solidity) は描かれ、 6 種 (swimlane / gantt / class / pie / c4 / mind)\n // は「phase が 0 件です」 で弾かれた。 書く人から見ると区別する手がかりが無い。\n //\n // **出口で 1 度だけ見る**。 種類ごとに塞ぐと 12 経路のどれかを見落とす。 図は必ずここを\n // 通るので、 ここで段が無ければ入れる。\n injectStaticPhase(merged);\n // 図の外を指す値を、 色を塗る位置から落とす (#1004)。\n //\n // 入口ごとに塞ぐ形は採らない。 状態の上書き / phase が入れる値 / 画面が直接書く背景色 /\n // 埋め込んだ JSON と入口が 4 つ以上あり、 1 つ見落とすと穴が残る。 描画へ渡る図は必ず\n // ここを通るので、 出口で 1 度だけ見る。\n for (const dropped of stripExternalPaint(merged)) {\n opts?.onNotice?.({\n kind: \"external-paint-dropped\",\n actor: dropped.path,\n line: 0,\n message: `図の外を指す値 (${truncateForMessage(dropped.value)}) は色として使えないため外しました`,\n hint: \"色は `#ff0000` のような色番号か、 `red` のような色名で書く\",\n });\n }\n return merged;\n}\n\n/**\n * 動かない図に段を 1 つ入れる (#1086)。\n *\n * 描画側は段が 1 件以上あることを要求する。 一方で段を作るかどうかは種類ごとにばらけており、\n * `animation:` を書かない図は 12 種のうち 6 種だけが描かれ、 残り 6 種は弾かれていた。\n *\n * ## 何も光らせない段にはしない\n *\n * 段には「この段で何が主役か」 を示す役割がある。 空の段を入れると図は描かれるが、 全ての\n * 要素が主役でない状態 (薄い表示) になり、 動かない図として読めない。 全部を光らせる段なら、\n * 動かない図が「常に全部が主役」 として自然に読める。\n *\n * ## 既に段がある図には触らない\n *\n * `animation:` を書いた図と、 描画側が段を作る 6 種はここに入らない。 段の数と中身は書いた\n * とおりに保たれる。\n */\nfunction injectStaticPhase(diagram: CdlDiagram): void {\n if (diagram.phases.length > 0) return;\n // 光らせる相手が 1 つも無い図 (要素ゼロ) でも段は入れる。 描画側が要求するのは段の存在で\n // あって中身ではなく、 ここで諦めると「空の図は描けない」 という別の欠落になる\n const activate = [...diagram.nodes.map((n) => n.id), ...diagram.edges.map((e) => e.id)];\n diagram.phases.push({\n id: \"static\",\n duration: 1000,\n title: diagram.topic ?? \"全体\",\n body: \"\",\n activate,\n tweens: [],\n sets: [],\n });\n}\n\n/** 知らせに載せる値を短く切る。 長い URL をそのまま出すと画面の帯が読めなくなる */\nfunction truncateForMessage(v: string): string {\n const s = v.trim();\n return s.length <= 40 ? s : `${s.slice(0, 37)}...`;\n}\n\n/**\n * 光らせる相手 (`focus:`) が実在しない分を知らせる。\n *\n * 名前が当たらなかった指定は静かに消える。 光らせたい相手を書いたのに光らない状態が、\n * 手掛かりなしで起きる。\n *\n * 見るのは記述だけ。 id の形は図種で違うが、 「その名前の箱が居るか」「その矢印が流れに\n * あるか」 は書かれた内容だけで決まる。 図種ごとの解決経路に検査を分けると、 経路が増える\n * たびに検査が取り残される。\n */\nfunction reportMissingFocusTargets(\n doc: DslDocument,\n onNotice?: (notice: CompileNotice) => void,\n): void {\n if (!onNotice || !doc.animate) return;\n const names = new Set(doc.actors.map((a) => a.name));\n // 解決側は名前が見つからない時に slug へ落とす。 受理集合もそれに合わせる。\n // 合わせないと、 実際は光る指定 (`API Gateway` を `api-gateway` と書いた形) を\n // 「見つかりません」 と誤報する (実測)\n //\n // 2 つ以上の名前が同じ slug になる時は受理しない。 解決側も曖昧として光らせないため、\n // 受理すると「知らせは出ないのに何も光らない」 状態になる (実測)\n const accepted = new Set(names);\n const slugCount = new Map<string, number>();\n for (const n of names) {\n const sl = slugify(n);\n slugCount.set(sl, (slugCount.get(sl) ?? 0) + 1);\n }\n for (const [sl, count] of slugCount) if (count === 1) accepted.add(sl);\n //\n // 縦列の id は受理しない。 3 つの解決経路はいずれも縦列を光らせないため、 受理すると\n // 「知らせは出ないのに何も光らない」 状態を作る (実測 = `focus: [main]` で activate が空)\n // 矢印は流れに書かれた組合せだけを認める。 名前に空白を含められる (`決済 基盤`) ため、\n // 連結した 1 本の鍵にはしない (`\"a b\" -> \"c\"` と `\"a\" -> \"b c\"` が同じ鍵になる)\n const steps = new Map<string, Set<string>>();\n for (const st of doc.flow) {\n const tos = steps.get(st.from) ?? new Set<string>();\n tos.add(st.to);\n steps.set(st.from, tos);\n }\n\n for (const phase of doc.animate.phases) {\n for (const raw of phase.highlight ?? []) {\n const entry = parseFocusEntry(raw, names);\n const found =\n entry.kind === \"edge\"\n ? (steps.get(entry.from)?.has(entry.to) ?? false)\n : accepted.has(entry.name);\n if (found) continue;\n onNotice({\n kind: \"focus-target-missing\",\n actor: raw,\n line: phase.pos.line,\n message:\n entry.kind === \"edge\"\n ? `光らせる矢印が流れにありません: \"${raw}\"`\n : `光らせる相手が見つかりません: \"${raw}\"`,\n hint:\n entry.kind === \"edge\"\n ? \"flow: に書いた矢印と同じ向きで書く\"\n : `actors: に書かれている名前 = ${[...names].join(\", \")}`,\n // 縦列の id は受理しないので、 その旨は hint に出さない (光らせられないため)\n });\n }\n }\n}\n\n/**\n * 相対で書かれた位置 (`位置: Web の右 200`) を絶対座標に直した doc を返す。\n *\n * 基準の実座標は配置を 1 度計算しないと分からない。 cdl の `layout` を呼んで測り、\n * 基準の縁から間隔を空けた位置を求める。 元の doc は書き換えず、 座標を入れた複製を返す。\n *\n * 相対指定が 1 件も無ければ何もしない。 配置計算は 1 回 1ms 前後かかるので、 使っていない\n * 図に負担をかけない。\n */\nfunction resolveRelativeDoc(\n diagram: CdlDiagram,\n doc: DslDocument,\n onNotice?: (notice: CompileNotice) => void,\n partsCatalog?: Record<string, CdlDiagram>,\n): DslDocument {\n if (!doc.actors.some((a) => a.posRel !== undefined)) return doc;\n\n // 1. 座標を書いた分を先に反映してから測る。 基準がどこに居るかはここで分かる。\n //\n // 自動配置のまま測ると、 座標で固定した箱を基準にした指定が壊れる。 基準の自動配置位置\n // から狙いを作るため、 実際の位置と食い違い、 最後の確認で「効きません」 と捨てられる\n // (実測 = `Web @1000,500` の右に置くはずの箱が 200 に出て、 そのまま落とされた)。\n const measured = measureActorBoxes(withPositions(diagram, doc, new Map()));\n // パーツの箱は catalog から作る。 組み立て前の図に残っている仮の箱を測ると、 実際に\n // 描かれる大きさと違う値で間隔を計算することになる\n const baseBoxes = new Map(measured);\n if (partsCatalog) {\n for (const [name, box] of partBoxes(diagram, doc, partsCatalog)) baseBoxes.set(name, box);\n }\n const sizeOverride = partsCatalog\n ? partSizes(doc, partsCatalog)\n : new Map<string, { w: number; h: number; dx: number; dy: number }>();\n const want = desiredCenters(doc, baseBoxes, sizeOverride);\n if (want.size === 0) return doc;\n\n // 2. 狙った中心をそのまま座標として仮に置く。\n // パーツは渡す座標が段の中心なので、 矩形の中心とのずれを引く\n const naive = new Map(\n [...want].map(([name, c]) => {\n const off = sizeOverride.get(name);\n return [name, { posX: c.cx - (off?.dx ?? 0), posY: c.cy - (off?.dy ?? 0) }] as const;\n }),\n );\n\n // 3. 測り直して、 狙いとの差を足す。\n //\n // 座標を書いた時に中心がどこに来るかは図種で違う。 順序図の座標は縦列の左端を動かすので、\n // 中心を狙って書くと縦列の幅の半分だけ右にずれる (実測 = 200 空けたいのに 370 空いた)。\n // 図種ごとの規則を書き写すと cdl 側の変更で黙って壊れるため、 実際に置いた結果との差を\n // 使って直す。 差は図種ごとに一定なので 1 度で合う (実測 = 8 図種すべてで狙い通り)。\n const isPart = new Set(doc.actors.filter((a) => a.partId !== undefined).map((a) => a.name));\n // 確かめる時も、 基準になるパーツは catalog 由来の箱で見る。 この時点の図には仮の箱しか\n // 無いため、 測ると解決側と違う基準で期待を作ることになる (実測 = 正しく置いた箱が\n // 「効きません」 と落とされた)\n const partOverride = new Map<string, AnchorBox>();\n for (const [name, box] of baseBoxes) {\n if (isPart.has(name)) partOverride.set(name, box);\n }\n for (const [name, c] of want) {\n if (!isPart.has(name)) continue;\n partOverride.set(name, c);\n }\n const placedBoxes = measureActorBoxes(withPositions(diagram, doc, naive));\n const fixed = new Map<string, { posX: number; posY: number }>();\n for (const [name, pos] of naive) {\n // パーツは補正しない。 merge が座標を中心としてそのまま使うので狙いがそのまま効く。\n // 一方この時点の図にはパーツの仮の箱しか無く、 動いていない位置を測って差を足すと\n // ずれが二重になる (実測 = 狙い 760 に対して 1320 に飛んだ)\n if (isPart.has(name)) {\n fixed.set(name, pos);\n continue;\n }\n const got = placedBoxes.get(name);\n const target = want.get(name)!;\n if (!got) {\n fixed.set(name, pos);\n continue;\n }\n fixed.set(name, {\n posX: pos.posX + (target.cx - got.cx),\n posY: pos.posY + (target.cy - got.cy),\n });\n }\n\n // 4. 効いたかを確かめ、 効かなかった分は自動配置に戻す。\n //\n // 座標がどの向きにも効く保証は無い。 順序図の縦位置がその例で、 縦列は横に並ぶものなので\n // 下に動かせない。 そのまま出すと基準の上に重なった図が出る (実測)。 動かなかった時は\n // 書かなかった時と同じ配置に戻し、 何が効かなかったかを呼出側に伝える。\n return withDocPositions(doc, verifyPlacement(diagram, doc, fixed, partOverride, onNotice));\n}\n\n/**\n * 置いた結果が書いた通りかを確かめ、 外れた分を落とす。\n *\n * 確かめるのは最後の配置での「基準との位置関係」 で、 手順 1 で測った狙いではない。\n * 誰かを固定すると周りの自動配置が動くため、 狙いと突き合わせると基準がずれた分を\n * 見逃す。 書いた言葉 (`Web の右 200`) が最後の図でも成り立つかを見る。\n */\nfunction verifyPlacement(\n diagram: CdlDiagram,\n doc: DslDocument,\n assign: ReadonlyMap<string, { posX: number; posY: number }>,\n partOverride: ReadonlyMap<string, AnchorBox>,\n onNotice?: (notice: CompileNotice) => void,\n): Map<string, { posX: number; posY: number }> {\n const boxes = measureActorBoxes(withPositions(diagram, doc, assign));\n // パーツは merge 前なので、 図には実寸と違う仮の箱しか無い。 解決側と同じ箱に差し替える。\n //\n // 差し替えないと 2 通りに壊れる。 パーツを基準にした箱は仮の箱から期待を作って落とされ\n // (実測 = 正しく置いた箱が「効きません」 になった)、 パーツ自身も仮の箱の位置と\n // 突き合わせて落とされる。\n for (const [name, box] of partOverride) boxes.set(name, box);\n const kept = new Map(assign);\n for (const actor of doc.actors) {\n const rel = actor.posRel;\n const pos = assign.get(actor.name);\n if (!rel || !pos) continue;\n const self = boxes.get(actor.name);\n const anchor = boxes.get(rel.anchor);\n if (!self || !anchor) continue;\n const expect = resolveRelativePos(rel, anchor, self);\n const offX = Math.abs(expect.posX - self.cx);\n const offY = Math.abs(expect.posY - self.cy);\n if (offX <= PLACEMENT_TOLERANCE && offY <= PLACEMENT_TOLERANCE) continue;\n kept.delete(actor.name);\n onNotice?.({\n kind: \"relative-position-ignored\",\n actor: actor.name,\n line: actor.pos.line,\n message: `\"${actor.name}\" の位置 (${rel.anchor} の${DIRECTION_LABEL[rel.dir]}) は${doc.type}図では効きません`,\n hint: \"座標 (`位置: 300,200`) で置くか、 自動配置に任せる\",\n });\n }\n return kept;\n}\n\n/** 向きの表示名。 効かなかった時の知らせで、 書いた言葉に近い形で返すために持つ。 */\nconst DIRECTION_LABEL: Readonly<Record<RelativeDirection, string>> = {\n right: \"右\",\n left: \"左\",\n above: \"上\",\n below: \"下\",\n};\n\n/**\n * 書いた通りに置けたと見なす誤差。\n *\n * 補正が効いた図種では実測 0.0 で一致する。 効かない向き (順序図の縦) は数百ずれるので、\n * その間で切る。 丸めと配置計算の揺れを吸収する幅として 1 を取る。\n */\nconst PLACEMENT_TOLERANCE = 1;\n\n/**\n * 相対で書かれた分について、 中心をどこに置きたいかを求める。\n *\n * 基準がまた相対で書かれていることがある (`C は B の右`、 `B は A の右`) ため、 依存の浅い順に\n * 解く。 解けた中心は基準として次に使う。\n */\nfunction desiredCenters(\n doc: DslDocument,\n boxes: ReadonlyMap<string, AnchorBox>,\n sizeOverride: ReadonlyMap<string, { w: number; h: number }> = new Map(),\n): Map<string, AnchorBox> {\n // 大きさだけを見る。 中心のずれは呼ぶ側が座標に直す時に引く\n const byName = new Map(doc.actors.map((a) => [a.name, a] as const));\n const { order } = orderByDependency(doc.actors.map((a) => ({ name: a.name, rel: a.posRel })));\n // 基準に使う中心。 相対で書かれていない分は測った位置をそのまま使う\n const centers = new Map<string, AnchorBox>(boxes);\n const out = new Map<string, AnchorBox>();\n\n for (const name of order) {\n const actor = byName.get(name);\n // 自分の大きさ。 パーツは catalog の値を使う (図に残る仮の箱は実寸と違う)\n const override = sizeOverride.get(name);\n const measuredSelf = boxes.get(name);\n const self = override\n ? { cx: measuredSelf?.cx ?? 0, cy: measuredSelf?.cy ?? 0, w: override.w, h: override.h }\n : measuredSelf;\n if (!actor?.posRel || !self) continue;\n const anchor = centers.get(actor.posRel.anchor);\n // 測れない相手を基準にした分は自動配置のまま残す。 相手が居ることは parser が確かめて\n // いるので、 ここに来るのは図に箱として現れない相手 (catalog に無いパーツ等) を指した場合\n if (!anchor) continue;\n const p = resolveRelativePos(actor.posRel, anchor, self);\n const center: AnchorBox = { cx: p.posX, cy: p.posY, w: self.w, h: self.h };\n centers.set(name, center);\n out.set(name, center);\n }\n return out;\n}\n\n/**\n * 登場人物ごとの、 図の上での中心と大きさを測る。\n *\n * 対応付けは箱に表示される名前で行う。 id を使わない理由は `applyNodeTones` と同じで、\n * slug の作り方が dragon と cdl で違うため記号を含む名前で一致しない。\n *\n * 1 人が複数の箱に分かれる図種 (順序図の上端 / 下端) では、 全部を囲む矩形を返す。\n * 箱として現れない登場人物は縦列の矩形で代用する。\n */\nexport function measureActorBoxes(\n diagram: CdlDiagram,\n /**\n * 配置まで済ませた図。 渡すとここでは測り直さない (#1006)。\n *\n * 呼出側が既に組み立てているなら、 ここで `layout` を呼ぶと同じ図の配置を 2 度計算する。\n * 図の規模に比例して重く、 辺 500 本で約 300ms (実測)。\n * 渡す時は `diagram` と対にする = 別の図の配置を渡すと、 測る位置がずれる。\n */\n laidHint?: LaidDiagram,\n): Map<string, AnchorBox> {\n const laid = laidHint ?? layout(diagram);\n const bounds = new Map<string, { x0: number; y0: number; x1: number; y1: number }>();\n for (const n of laid.nodes) {\n const title = n.title;\n if (!title) continue;\n const x0 = n.cx - n.w / 2;\n const y0 = n.cy - n.h / 2;\n const x1 = n.cx + n.w / 2;\n const y1 = n.cy + n.h / 2;\n const cur = bounds.get(title);\n if (cur) {\n cur.x0 = Math.min(cur.x0, x0);\n cur.y0 = Math.min(cur.y0, y0);\n cur.x1 = Math.max(cur.x1, x1);\n cur.y1 = Math.max(cur.y1, y1);\n } else {\n bounds.set(title, { x0, y0, x1, y1 });\n }\n }\n const out = new Map<string, AnchorBox>();\n for (const [name, b] of bounds) {\n out.set(name, { cx: (b.x0 + b.x1) / 2, cy: (b.y0 + b.y1) / 2, w: b.x1 - b.x0, h: b.y1 - b.y0 });\n }\n for (const lane of laid.lanes) {\n const label = lane.label;\n if (!label || out.has(label)) continue;\n const y = lane.y ?? 0;\n const h = lane.height ?? 0;\n out.set(label, { cx: (lane.x ?? 0) + lane.width / 2, cy: y + h / 2, w: lane.width, h });\n }\n return out;\n}\n\n/** doc の複製に、 決まった座標を入れる。 元の doc は書き換えない。 */\nfunction withDocPositions(\n doc: DslDocument,\n assign: ReadonlyMap<string, { posX: number; posY: number }>,\n): DslDocument {\n if (assign.size === 0) return doc;\n return {\n ...doc,\n actors: doc.actors.map((a) => {\n const p = assign.get(a.name);\n return p ? { ...a, posX: p.posX, posY: p.posY } : a;\n }),\n };\n}\n\n/** 決まった座標を反映した図の複製を作る。 測り直す時だけ使う捨て図。 */\nfunction withPositions(\n diagram: CdlDiagram,\n doc: DslDocument,\n assign: ReadonlyMap<string, { posX: number; posY: number }>,\n): CdlDiagram {\n const probe: CdlDiagram = {\n ...diagram,\n lanes: diagram.lanes.map((l) => ({ ...l })),\n nodes: diagram.nodes.map((n) => ({ ...n })),\n };\n applyCanvasPivotPositions(probe, withDocPositions(doc, assign));\n return probe;\n}\n\n/**\n * 全図種共通の後処理で、 登場人物に書かれた色を対応する箱に載せる。\n *\n * 箱を作る経路は図種ごとに違い、 cdl の preset を経由する図種 (流れ図 / ER / 状態遷移 / 構成図)\n * では preset の入力型が色の項目を持たない。 箱が出来上がった後に id で対応付けることで、\n * どの図種でも同じ書き方が効く。 座標を伝播する `applyCanvasPivotPositions` と同じ経路。\n *\n * 対応付けは箱に表示される名前との一致で行う。 id は使わない。\n *\n * id での対応付けは 2 通りに壊れる。 id は名前を slug に変換して作るが、 その変換規則が\n * dragon と cdl で違い、 記号を含む名前では一致しない (実測 = `A_B` が dragon 側で `a_b`、\n * cdl 側で `a-b`)。 逆に、 生成した id (`{slug}-header`) をそのまま名前に持つ登場人物が\n * 居ると、 別人の箱を巻き込む。\n *\n * 表示名は変換を経ないので前者が起きず、 別人と一致しないので後者も起きない。 順序図で\n * 1 人が分かれる複数の箱のうち、 間隔用と手順ごとの anchor は表示名が空なので自然に対象外に\n * なる (色を持っても幅 2 で見えない)。\n *\n * parts は対象外。 parts の `tone` は色ではなく状態の上書きとして parser が扱うため、\n * ここに色として渡ってこない。\n */\nfunction applyNodeTones(diagram: CdlDiagram, doc: DslDocument): void {\n for (const actor of doc.actors) {\n if (actor.tone === undefined) continue;\n for (const node of diagram.nodes) {\n if (node.title === actor.name) node.tone = actor.tone;\n }\n }\n}\n\n/**\n * canvas pivot 新 spec = 全 preset 共通の post-process で actor.posX/Y/W/H を CDL 側 lane / node に伝播。\n * preset builder が生成した diagram に対して、 doc.actors の 4 field を絶対座標として反映する。\n * slugify で actor 名 → lane id / node id の逆引き、 posX/Y set 済 actor に対応する lane / node に\n * 座標を書込む。 未指定 actor は従来 auto layout 経路そのまま。\n */\nfunction applyCanvasPivotPositions(diagram: CdlDiagram, doc: DslDocument): void {\n for (const actor of doc.actors) {\n if (actor.partId !== undefined) continue; // parts actor は別経路 (mergePartsFromActors) で処理\n const aliasSlug = slugify(actor.name);\n // actor 全体 posX/Y = lane と単一 node に一括反映 (従来経路)\n if (actor.posX !== undefined && actor.posY !== undefined) {\n for (const lane of diagram.lanes) {\n if (lane.id === aliasSlug || lane.id === actor.name) {\n lane.posX = actor.posX;\n lane.posY = actor.posY;\n if (actor.posW !== undefined) lane.posW = actor.posW;\n if (actor.posH !== undefined) lane.posH = actor.posH;\n }\n }\n for (const node of diagram.nodes) {\n if (node.id === aliasSlug || node.id === actor.name) {\n node.posX = actor.posX;\n node.posY = actor.posY;\n if (actor.posW !== undefined) node.posW = actor.posW;\n if (actor.posH !== undefined) node.posH = actor.posH;\n }\n }\n }\n // canvas pivot UX 修正 (B1) = actor.nodes[subKey] を対応 CDL node に個別反映。\n // sub-node id pattern を actor scope 限定の 2 経路に絞る (subagent review MAJOR-1 対応、 CAR-canvas-pivot):\n // 1. `{aliasSlug}-{subKey}` = header / footer / spacer 等 suffix\n // 2. `{subKey}-{aliasSlug}` = sequence step box `s{N}-{aliasSlug}` 等 prefix\n // 旧 `node.id === subKey` 完全一致 fallback は actor scope を持たず cross-actor pollution risk\n // (別 actor が保有する同名 id node に座標が漏れる silent bug) のため削除。 全 sub-node は必ず\n // aliasSlug を接頭 / 接尾に含む形式で生成されるため、 2 経路で網羅済。\n // lane 側は触らない = 他 sub-node の auto layout 経路を保持 (B1 独立性の SSOT)。\n if (actor.nodes) {\n for (const [subKey, override] of Object.entries(actor.nodes)) {\n if (override.posX === undefined || override.posY === undefined) continue;\n for (const node of diagram.nodes) {\n if (\n node.id === `${aliasSlug}-${subKey}` ||\n node.id === `${subKey}-${aliasSlug}`\n ) {\n node.posX = override.posX;\n node.posY = override.posY;\n if (override.posW !== undefined) node.posW = override.posW;\n if (override.posH !== undefined) node.posH = override.posH;\n }\n }\n }\n }\n }\n}\n\n/**\n * catalog からパーツ 1 個の図を引く。\n *\n * `Object.hasOwn` で引く。 素の添字だと `__proto__` 等の既定の持ち物が引けてしまう\n * (catalog は呼出側が渡す untrusted な値)。\n *\n * **測れない図は「無い」 として扱う** (#1015)。 大きさを測れないまま取り込むと、既定の\n * 400x200 の枠を確保した場所に中身が全て展開される。 上限を置いた目的 (大きすぎる入力で\n * 止まらないようにする) も達成されない。\n */\nfunction lookupPart(\n partsCatalog: Record<string, CdlDiagram>,\n partId: string | undefined,\n): CdlDiagram | undefined {\n const found = lookupPartRaw(partsCatalog, partId);\n if (found === undefined) return undefined;\n return partIsMeasurable(found) ? found : undefined;\n}\n\n/** catalog を引くところだけ。 測れるかは見ない。 */\nfunction lookupPartRaw(\n partsCatalog: Record<string, CdlDiagram>,\n partId: string | undefined,\n): CdlDiagram | undefined {\n if (typeof partId !== \"string\" || partId.length === 0) return undefined;\n if (Object.hasOwn(partsCatalog, partId)) return partsCatalog[partId];\n if (Object.hasOwn(partsCatalog, `parts-${partId}`)) return partsCatalog[`parts-${partId}`];\n return undefined;\n}\n\n/**\n * この図を取り込んでよいか (#1015)。\n *\n * 見るのは **要素数が上限 (`MAX_INPUT_ELEMENTS`) を超えていないこと** だけ。\n * 超えた図を取り込むと、既定の 400x200 の枠を確保した場所に中身が全て展開される。\n * 上限を置いた意図 (大きすぎる入力で止まらないようにする) も達成されない。\n *\n * **配置計算が通るかは見ない**。 取り込みは lane を張り替えるため、単体では配置計算が\n * 通らない図でも取り込みは成功する (実測 = 存在しない lane を指す箱を持つ見本が、\n * 取り込み後は正しい lane に載った)。 配置計算で弾くと、動いている本文が描けなくなる。\n */\nexport function partIsMeasurable(part: CdlDiagram): boolean {\n return countDiagramElements(part) <= MAX_INPUT_ELEMENTS;\n}\n\n/**\n * 箱の大きさを書かなかった時に cdl が使う値。\n *\n * 幅は実測で 340 固定 (縦列の幅を変えても変わらない)。 高さは種類で変わるため、 よく使われる\n * 値を既定にする。 パーツの図が大きさを書いていれば、 こちらは使われない。\n */\nconst CDL_DEFAULT_NODE_W = 340;\nconst CDL_DEFAULT_NODE_H = 200;\n\n/** 有限で正の数だけを通す。 catalog は呼出側が渡す値なので、 異常値を計算に入れない。 */\nfunction positiveOr(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\n/**\n * 配列の最大値 / 最小値。 spread で展開しない (要素数が多い catalog で stack が溢れる)。\n *\n * 空の時だけ既定値を返す。 既定値を初期値にすると、 全要素が既定値より小さい (大きい) 時に\n * 存在しない値を範囲に含める (実測 = stack 5 だけのパーツで 0 を含め、 高さが 5 段分になった)。\n */\nfunction maxOf(values: readonly number[], fallback: number): number {\n if (values.length === 0) return fallback;\n let out = values[0]!;\n for (const v of values) if (v > out) out = v;\n return out;\n}\n\nfunction minOf(values: readonly number[], fallback: number): number {\n if (values.length === 0) return fallback;\n let out = values[0]!;\n for (const v of values) if (v < out) out = v;\n return out;\n}\n\n/**\n * merge がパーツを縦に送る幅。 `mergePartIntoDiagram` の `STACK_PITCH_APPROX` と同じ値。\n *\n * 大きさの見積りは merge が実際に置く形と揃える。 別の規則で見積ると、 間隔が狂う\n * (実測 = 2 段のパーツで 200 空けたいところが 90 になった)。\n */\nconst PART_STACK_PITCH = 220;\n\n/**\n * 倍率の上限 (#1020)。\n *\n * 図枠は数百 world 単位なので、1000 倍で数十万になる。 これを超える倍率は画面上で意味を持たず、\n * 掛けた先が非有限になる危険だけが残る。\n */\nexport const MAX_PART_SCALE = 1000;\n\n/**\n * 本文に書かれた倍率を、描ける値に直す (#1020 / #1026)。\n *\n * 記法は `倍率: -2` も `倍率: 0` も、桁が溢れて `Infinity` になる値も書ける。 置き場所と\n * 描画で別々に直すと、同じ見本が「置き場所は等倍・画面では消える」 状態になる (実測 =\n * `scale: 0` が等倍の場所を占めるのに画面には出なかった)。 読んだ時点で直す。\n *\n * **画面側と組み立て側の両方から呼ぶ**。 別々に持つと、同じ本文が経路で別の絵になる (#1026)。\n */\nexport function normalizePartScale(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.min(value, MAX_PART_SCALE);\n}\n\n/**\n * `大きさ:` と `倍率:` を合成した最終の伸縮率 (#1026)。\n *\n * **上限は合成した後に 1 度だけ掛ける**。 率ごとに掛けると、`大きさ:` 由来 1000 倍と\n * `倍率: 2` で合わせて 2000 倍になり、1 度だけ掛ける経路 (1000 倍) と食い違う (実測)。\n *\n * 基準は `大きさ:` と同じ物差し (縦列の外接矩形と段の送り幅)。 図枠を基準にすると、\n * 図枠と外接矩形の差のぶんだけ余分に掛かる (実測 = 3 倍と書いて 4.0875 倍になった)。\n *\n * 画面側 (重ねて描く時の `transform`) と組み立て側 (取り込む時の伸縮) が同じ値を使う。\n */\nexport function partScaleFactor(\n part: CdlDiagram,\n posW: number | undefined,\n posH: number | undefined,\n scale: number | undefined,\n): { x: number; y: number } {\n const base = partScaleBase(part);\n const k = scale === undefined ? 1 : normalizePartScale(scale);\n const rx = posW !== undefined && posW > 0 ? posW / base.w : 1;\n const ry = posH !== undefined && posH > 0 ? posH / base.h : 1;\n return { x: normalizePartScale(rx * k), y: normalizePartScale(ry * k) };\n}\n\n/**\n * 見本 1 件の狙いの大きさ (#1026)。\n *\n * 合成した率を基準に掛けて返す。 取り込み側はこの値から自分で率を出し直すため、\n * ここで上限を掛けておかないと「見積りは上限どまり・実体は青天井」 になる (実測 =\n * 見積り 1000 倍に対して実体 10000 倍)。\n *\n * 何も書かれていない辺は「狙いなし」 のまま返す。 基準の値を入れると、取り込み側が\n * 自前で測る外接矩形との差だけ伸縮が掛かってしまう。\n */\nexport function partTargetSize(\n part: CdlDiagram,\n posW: number | undefined,\n posH: number | undefined,\n scale: number | undefined,\n): { w: number | undefined; h: number | undefined } {\n if (posW === undefined && posH === undefined && scale === undefined) {\n return { w: undefined, h: undefined };\n }\n const base = partScaleBase(part);\n const f = partScaleFactor(part, posW, posH, scale);\n return {\n w: posW === undefined && scale === undefined ? undefined : base.w * f.x,\n h: posH === undefined && scale === undefined ? undefined : base.h * f.y,\n };\n}\n\n/**\n * `大きさ:` と `倍率:` が掛かる時の基準の大きさ (#1026)。\n *\n * 横は縦列の外接矩形、縦は段の送り幅の合計。 **図枠 (`partRenderSize`) ではない**。\n * 図枠は余白を含むため、これを基準にすると書いた倍率より大きく掛かる。\n *\n * `partTargetScale` と `partTargetSize` が同じ物差しを使うことで、\n * `partTargetScale(part, base.w * k, base.h * k)` が丁度 `k` 倍を返す関係が保たれる。\n */\nfunction partScaleBase(part: CdlDiagram): { w: number; h: number } {\n const lanes = Array.isArray(part.lanes) ? part.lanes : [];\n const nodes = Array.isArray(part.nodes) ? part.nodes : [];\n const lefts: number[] = [];\n const rights: number[] = [];\n for (const l of lanes) {\n const lx = typeof l.x === \"number\" && Number.isFinite(l.x) ? l.x : 0;\n const lw = positiveOr(l.width, 400);\n lefts.push(lx);\n rights.push(lx + lw);\n }\n const stacks = nodes.map((n) =>\n typeof n.stack === \"number\" && Number.isFinite(n.stack) ? n.stack : 0,\n );\n return {\n w: positiveOr(maxOf(rights, 400) - minOf(lefts, 0), 400),\n h: Math.max(1, (maxOf(stacks, 0) - minOf(stacks, 0) + 1) * PART_STACK_PITCH),\n };\n}\n\n/**\n * `大きさ:` を書いた時に、見本を何倍にするか (#1018)。\n *\n * 横は縦列の幅、縦は段の数から出す。 どちらも書かなければ 1 倍。\n *\n * **縦は「書いた高さにする」 ではなく「段の送り幅の合計に対する倍率」**。 `大きさ: 2000,300` を\n * 1 段の見本に書くと、横は 2000 になるが縦は 300 ではなく 409 になる (段の送り幅 220 に対して\n * 300 なので 1.36 倍、それが箱の高さ 300 に掛かる)。 意図した仕様かは怪しいが、既に本文が\n * この前提で書かれているため変えない。 画面側も同じ規則で拡大する。\n *\n * 組み立て側 (`partExtent`) と画面側 (playground) の両方から呼ぶ。 別々に持つと、`大きさ:` を\n * 書いた見本だけ経路で大きさが変わる。\n */\nexport function partTargetScale(\n part: CdlDiagram,\n targetW?: number,\n targetH?: number,\n): { x: number; y: number } {\n const none = { x: 1, y: 1 };\n if (!Array.isArray(part.lanes) || !Array.isArray(part.nodes)) return none;\n // 箱が 1 つも無い図でも縦列があれば取り込み側は伸縮する。 ここで 1 に倒すと、\n // 箱を持たない外部の見本だけ画面が等倍のまま残る\n\n // 倍率を書かない場合の合成率。 上限の掛け方を 1 箇所に閉じるため同じ関数を通す\n return partScaleFactor(part, targetW, targetH, undefined);\n}\n\n\n\n/**\n * パーツ 1 個が図の上で占める外接矩形。\n *\n * `w` / `h` は大きさ、 `dx` / `dy` は矩形の中心が「merge に渡す座標」 からどれだけずれるか。\n *\n * merge がパーツを置く時に基準にするのは段の中心で、 外接矩形の中心とは一致しない。 段ごとに\n * 箱の高さが違うと、 上下の伸び方が非対称になるため (実測 = 段 0 に高さ 50、 段 5 に高さ 200 の\n * パーツで中心が 37.5 下にずれる)。 ずれを返して呼ぶ側が引く。\n *\n * 箱ごとに位置と大きさを見る。 一番高い箱の高さと段の数から概算すると実際の矩形と合わない\n * (実測 = 段 5 だけのパーツで 200 空けたいところが 750、 段 0,5 で高さが違うと 275 になった)。\n *\n * 段の送り幅は merge の近似 (`PART_STACK_PITCH`) を使う。 パーツを自分の図として配置計算した\n * 実寸とは段を持つパーツで 3% ほど違うが (実測 = 3 段で実高 620 に対して 640)、 ここで見たいのは\n * 「merge がどこに置くか」 なので merge の規則に合わせる。\n */\nfunction partExtent(\n part: CdlDiagram,\n targetW?: number,\n targetH?: number,\n): { w: number; h: number; dx: number; dy: number } {\n const fallback = { w: 400, h: 200, dx: 0, dy: 0 };\n if (!Array.isArray(part.lanes) || !Array.isArray(part.nodes)) return fallback;\n if (part.nodes.length === 0) return fallback;\n\n // 縦列の位置と幅を先に正す。 catalog は呼出側が渡す値なので、 数でない値を計算に入れない\n const lanes = new Map<string, { x: number; w: number }>();\n const laneLefts: number[] = [];\n const laneRights: number[] = [];\n for (const l of part.lanes) {\n const x = typeof l.x === \"number\" && Number.isFinite(l.x) ? l.x : 0;\n const w = positiveOr(l.width, 400);\n lanes.set(l.id, { x, w });\n laneLefts.push(x);\n laneRights.push(x + w);\n }\n const bboxW = positiveOr(maxOf(laneRights, 400) - minOf(laneLefts, 0), 400);\n const bboxCenterX = minOf(laneLefts, 0) + bboxW / 2;\n const { x: scaleX, y: scaleY } = partTargetScale(part, targetW, targetH);\n\n const stacks = part.nodes.map((n) =>\n typeof n.stack === \"number\" && Number.isFinite(n.stack) ? n.stack : 0,\n );\n const maxStack = maxOf(stacks, 0);\n const minStack = minOf(stacks, 0);\n const centerStack = (minStack + maxStack) / 2;\n\n // 箱ごとに、 merge が置く位置 (基準からの相対) と大きさから上下左右の端を出す\n const tops: number[] = [];\n const bottoms: number[] = [];\n const lefts: number[] = [];\n const rights: number[] = [];\n part.nodes.forEach((n, i) => {\n const lane = lanes.get(n.lane) ?? { x: 0, w: 320 };\n const cx = (lane.x + lane.w / 2 - bboxCenterX) * scaleX;\n const cy = ((stacks[i] ?? 0) - centerStack) * PART_STACK_PITCH * scaleY;\n const halfW = (positiveOr(n.w, CDL_DEFAULT_NODE_W) * scaleX) / 2;\n const halfH = (positiveOr(n.h, CDL_DEFAULT_NODE_H) * scaleY) / 2;\n lefts.push(cx - halfW);\n rights.push(cx + halfW);\n tops.push(cy - halfH);\n bottoms.push(cy + halfH);\n });\n const x0 = minOf(lefts, 0);\n const x1 = maxOf(rights, 400);\n const y0 = minOf(tops, 0);\n const y1 = maxOf(bottoms, 200);\n\n return {\n w: positiveOr(x1 - x0, 400),\n h: positiveOr(y1 - y0, 200),\n dx: Number.isFinite((x0 + x1) / 2) ? (x0 + x1) / 2 : 0,\n dy: Number.isFinite((y0 + y1) / 2) ? (y0 + y1) / 2 : 0,\n };\n}\n\n/**\n * パーツ 1 個が実際に描かれる大きさ (#937)。\n *\n * 図枠 (`viewBox`) を返す。 箱の外接矩形 (`partVisualSize`) ではない。 2 つは別物で、\n * 実測では図枠 525x520 に対し箱 380x400 と余白の分だけ違う。 SVG は図枠を基準に\n * `preserveAspectRatio` で収めるため、 箱の値を渡すと縮んで描いた大きさと食い違う\n * (実測 = achievement が箱の値で描くと約 275x275 になった)。\n *\n * 箱を持たないパーツ (実体が操作パネルの部品である 17 件) でも図枠は出る。 箱だけを見ると\n * 1x1 になり、 その値で描くと潰れる。\n *\n * ただし **図枠は場所を確保するだけで、図の中に何か描かれることは保証しない**。 上の 17 件は\n * 図の中に描く部品を持たず、重ねても図には出ない (`partDrawsInDiagram`、#1017)。\n *\n * 画面が描く大きさと、 組み立て側の格子が確保する場所の両方がこれを見る。 別々の物差しを\n * 持っていた頃は、 同じ本文でも通った経路でパーツの位置が変わっていた (#937)。\n *\n * 組み立てに失敗する図では、 既定の大きさに落とす (呼出側は catalog を渡すので通常起きない)。\n */\nexport function partRenderSize(part: CdlDiagram): { w: number; h: number } {\n const g = partFrameGeometry(part);\n return { w: g.w, h: g.h };\n}\n\n/**\n * この見本が、図の中に描かれる部品を持っているか (#1017)。\n *\n * 見本の中には実体が **操作パネルの部品** (`readouts`) だけのものがある。 配置計算も描画も\n * `readouts` を図の中では扱わないため、図として重ねても何も出ない。 位置決めのための\n * 1x1 の箱が 1 つあるだけになる。\n *\n * catalog 80 件を測ると、この 2 群は `readouts` の有無で完全に分かれた。\n * `readouts` を持つ 17 件は箱と図枠の面積比が全件 0.0000 (箱は 1x1)、\n * 持たない 63 件は最小でも 0.1877。 境目に入る件は無い。\n *\n * 判定は面積の閾値ではなく **`readouts` を持ち、かつ箱が図枠に対して極小** の 2 条件で行う。\n * 閾値だけで見ると、小さい箱を意図して置いた見本を巻き込む。 `readouts` だけで見ると、\n * 箱も実体も両方持つ見本 (現状 0 件だが作れる) を誤って弾く。\n *\n * 測れない図では「持っている」 側に倒す。 弾く側に倒すと、測れないだけの見本が使えなくなる。\n */\nexport function partDrawsInDiagram(part: CdlDiagram): boolean {\n const readouts = (part as { readouts?: unknown }).readouts;\n if (!Array.isArray(readouts) || readouts.length === 0) return true;\n const g = partFrameGeometry(part);\n if (!(g.w > 0) || !(g.h > 0)) return true;\n // 箱が図枠の 1% にも満たなければ、実体は図の外にある。\n //\n // **辺ごとに割ってから掛ける**。 面積を先に出すと桁の大きい図で溢れ、判定が反転する\n // (実測 = 箱 1.7e305 x 1e4 / 図枠 1.7e308 x 1e4 は比 0.001 で「描かない」 が正しいのに、\n // 面積を先に出すと Infinity / Infinity = NaN になって「描く」 に倒れた)。\n //\n // それでも出せない時は「持っている」 側に倒す。 弾く側に倒すと、\n // 測れないだけの見本が使えなくなる\n const ratio = (g.boxW / g.w) * (g.boxH / g.h);\n if (!Number.isFinite(ratio)) return true;\n return ratio >= 0.01;\n}\n\n/**\n * 図枠の中で、 箱の外接矩形がどこにどれだけの大きさで描かれるか (#1014)。\n *\n * `left` / `top` は図枠の左上からの余白、 `w` / `h` は箱の大きさ。 図枠は 1 対 1 で描かれるので、\n * 画面上の箱の位置は「図枠の左上 + `left`/`top`」 になる。\n *\n * 相対で書いた位置 (`位置: Web の右 200`) の間隔は、 見えている箱の縁から測る。 図枠の縁で\n * 測ると余白のぶんだけ広がる (実測 = 200 と書いて画面では 260 空いた)。 画面側が間隔を解く時に\n * 図枠ではなくこちらを使うことで、 組み立て側と同じ間隔になる。\n *\n * 測れない図では図枠と同じ大きさ・余白 0 を返す。 箱を持たない図でも同じで、 図枠がそのまま\n * 箱として扱われる。\n */\nexport function partBoxInFrame(part: CdlDiagram): {\n w: number;\n h: number;\n left: number;\n top: number;\n} {\n const g = partFrameGeometry(part);\n return { w: g.boxW, h: g.boxH, left: g.left, top: g.top };\n}\n\n/**\n * 見本 1 個の図枠と、 その中の箱の外接矩形 (位置と大きさ)。\n *\n * 図枠の大きさ・余白・箱の大きさは同じ配置計算から出るので、 1 回で全部を取る。 別々に呼ぶと\n * 同じ図を何度も組み立てることになり、 パーツを 1 個置くたびに配置計算が 2 回走る。\n *\n * 結果は見本ごとに覚えておく。 catalog の見本は複数の別名から同じものを指すため、 覚えないと\n * 別名の数だけ組み立て直す (相対指定があると 1 個につき 4 回になる)。 覚えるのは大きさだけで、\n * 色などの見た目は含まないため、 呼出側が色を差し替えても古い値にはならない。\n *\n * 組み立てと違い画面を描くたびに呼ばれるので、 大きすぎる図は測る前に止める。 上限は\n * 組み立て側と同じ物差しを使う (#1005)。 catalog の見本は数十要素なので通常は掛からない。\n *\n * 測れない図では既定の大きさと余白 0 に落とす。\n */\ntype PartFrameGeometry = {\n w: number;\n h: number;\n left: number;\n top: number;\n boxW: number;\n boxH: number;\n};\n\nconst PART_FRAME_CACHE = new WeakMap<CdlDiagram, PartFrameGeometry>();\n\nfunction partFrameGeometry(part: CdlDiagram): PartFrameGeometry {\n const cached = PART_FRAME_CACHE.get(part);\n if (cached) return cached;\n const fallback = { w: 400, h: 200, left: 0, top: 0, boxW: 400, boxH: 200 };\n let out = fallback;\n if (countDiagramElements(part) <= MAX_INPUT_ELEMENTS) {\n try {\n const own = layout(part);\n const vb = own.viewBox;\n const w = positiveOr(vb.w, 400);\n const h = positiveOr(vb.h, 200);\n if (own.nodes.length === 0) {\n // 箱を持たない図では図枠をそのまま箱として扱う。 相対指定の間隔は図枠の縁から測る\n out = { w, h, left: 0, top: 0, boxW: w, boxH: h };\n } else {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const n of own.nodes) {\n x0 = Math.min(x0, n.cx - n.w / 2);\n x1 = Math.max(x1, n.cx + n.w / 2);\n y0 = Math.min(y0, n.cy - n.h / 2);\n y1 = Math.max(y1, n.cy + n.h / 2);\n }\n const left = x0 - vb.x;\n const top = y0 - vb.y;\n out = {\n w,\n h,\n left: Number.isFinite(left) ? left : 0,\n top: Number.isFinite(top) ? top : 0,\n boxW: positiveOr(x1 - x0, w),\n boxH: positiveOr(y1 - y0, h),\n };\n }\n } catch {\n out = fallback;\n }\n }\n PART_FRAME_CACHE.set(part, out);\n return out;\n}\n\n/**\n * パーツ 1 個が図の上で確保する図枠 (merge に渡す座標での表し方)。\n *\n * `w` / `h` は図枠の大きさ、 `dx` / `dy` は図枠の中心が「merge に渡す座標」 からどれだけ\n * ずれるか。 画面側は図枠をそのまま置くので、 格子が図枠で場所を決めれば 2 経路が揃う。\n *\n * **合わせるのは箱の中心ではなく左上**。 段を 2 つ以上持つパーツは、 取り込んだ後に本体の\n * 送り幅で並び直すため箱の高さが単体の時と変わる (実測 = 単体 300 が取り込むと 320)。\n * 中心で合わせると、 高さの差の半分だけ上端がずれて段内の揃いが崩れる (実測で 12.5)。\n * 左上で合わせれば、 高さが変わっても上端は動かない。\n *\n * 図枠にも箱にも `大きさ:` の伸縮を掛ける。 画面側も同じ率で伸縮するので、掛けないと\n * 確保する場所だけが元の大きさのまま残る (実測 = 240 ずれた、#1018)。\n *\n * 確保するのは図枠と箱の両方を含む矩形。 縦横で率が違うと箱が図枠からはみ出すことがあり、\n * 図枠だけを確保すると隣に重なる (実測 = `大きさ: 2000,300` の箱が x=60..2060 に伸び、\n * 隣が 725 から始まって 1335 重なった)。 `大きさ:` を書かなければ図枠が箱を包むので、\n * 和は図枠と一致して 2 経路の一致は保たれる。\n */\nfunction partFrameExtent(\n part: CdlDiagram,\n targetW?: number,\n targetH?: number,\n): { w: number; h: number; dx: number; dy: number } {\n const box = partExtent(part, targetW, targetH);\n const geom = partFrameGeometry(part);\n // 図枠にも `大きさ:` の伸縮を掛ける。 掛けないと箱だけが伸びて、確保する場所が足りなくなる\n // (実測 = `大きさ: 2000,300` で組み立て側の箱が 60..2060、画面側が 300..2300 と 240 ずれた、#1018)\n const t = partTargetScale(part, targetW, targetH);\n const frame = {\n w: geom.w * t.x,\n h: geom.h * t.y,\n left: geom.left * t.x,\n top: geom.top * t.y,\n };\n // merge に渡す座標を原点にした時の、 図枠の中心\n const frameDx = box.dx + frame.w / 2 - frame.left - box.w / 2;\n const frameDy = box.dy + frame.h / 2 - frame.top - box.h / 2;\n const x0 = Math.min(frameDx - frame.w / 2, box.dx - box.w / 2);\n const x1 = Math.max(frameDx + frame.w / 2, box.dx + box.w / 2);\n const y0 = Math.min(frameDy - frame.h / 2, box.dy - box.h / 2);\n const y1 = Math.max(frameDy + frame.h / 2, box.dy + box.h / 2);\n return {\n w: positiveOr(x1 - x0, frame.w),\n h: positiveOr(y1 - y0, frame.h),\n dx: Number.isFinite((x0 + x1) / 2) ? (x0 + x1) / 2 : frameDx,\n dy: Number.isFinite((y0 + y1) / 2) ? (y0 + y1) / 2 : frameDy,\n };\n}\n\n/**\n * パーツ 1 個の箱の外接矩形。\n *\n * 図枠 (`partRenderSize`) とは別で、 余白を含まない。 相対指定を解く時の「縁からの距離」 に使う。\n */\nexport function partVisualSize(\n part: CdlDiagram,\n targetW?: number,\n targetH?: number,\n): { w: number; h: number } {\n const e = partExtent(part, targetW, targetH);\n return { w: e.w, h: e.h };\n}\n\n/** 格子に並べる時の 1 行あたりの個数と隙間。 */\nconst PARTS_PER_ROW = 3;\nconst PARTS_GAP = 120;\n/**\n * 既存の図の下に置く時の目安。\n *\n * 既存の箱は自動配置なので、 この時点では座標を持たない。 箱の数から概算する。\n * 1 段あたりの高さは cdl の既定の縦送り幅に合わせる。\n */\nconst STACK_PITCH = 280;\n\n/**\n * 位置を書かなかったパーツを格子に並べた時の、 矩形の中心。\n *\n * 組み立て側 (`mergePartsFromActors`) と画面側 (playground の overlay) の両方から呼ぶ。\n * 別々に計算すると、 同じ本文でも経路によってパーツの位置が変わる。\n *\n * 列の送り幅は並べる全パーツの最大幅で揃える。 個々の幅で送ると、 幅の違うパーツが混ざった時に\n * 隣と重なる (実測 = 400 の次に 200 を置くと 280 重なった)。 段の高さも段内の最大高で揃える。\n * 縦は自分の高さの半分だけ段の上端から下げて、 段内で上端を揃える。\n *\n * @param baseNodeCount パーツ以外の箱の数。 既存の図の下から並べ始めるために使う\n */\nexport function partsGridCenters(\n baseNodeCount: number,\n items: ReadonlyArray<{ id: string; w: number; h: number }>,\n): Map<string, { cx: number; cy: number }> {\n const out = new Map<string, { cx: number; cy: number }>();\n if (items.length === 0) return out;\n // 公開している関数なので、 呼出側が渡す値を入口で閉じる。 数でない箱の数や桁溢れを\n // そのまま計算に入れると、 描けない座標を返すことになる\n const safeCount =\n Number.isSafeInteger(baseNodeCount) && baseNodeCount >= 0 ? baseNodeCount : 0;\n const top = safeCount * STACK_PITCH + PARTS_GAP * 2;\n // 同じ名前が 2 度来たら先の方だけを見る。 後の分を残すと、 どちらを指したか決められない\n // まま列の送り幅にも影響する\n const seen = new Set<string>();\n const unique = items.filter((i) => {\n if (seen.has(i.id)) return false;\n seen.add(i.id);\n return true;\n });\n const cellW = maxOf(\n unique.map((i) => positiveOr(i.w, 400)),\n 400,\n );\n const rowTops: number[] = [];\n {\n let y = top;\n for (let i = 0; i < unique.length; i += PARTS_PER_ROW) {\n rowTops.push(y);\n const rowH = maxOf(\n unique.slice(i, i + PARTS_PER_ROW).map((x) => positiveOr(x.h, 200)),\n 200,\n );\n y += rowH + PARTS_GAP;\n }\n }\n unique.forEach((item, i) => {\n const col = i % PARTS_PER_ROW;\n const row = Math.floor(i / PARTS_PER_ROW);\n const cx = col * (cellW + PARTS_GAP) + cellW / 2;\n const cy = (rowTops[row] ?? top) + positiveOr(item.h, 200) / 2;\n // 桁溢れした座標は描けない。 返さずに落として、 呼出側が自動配置に倒せるようにする\n if (!Number.isFinite(cx) || !Number.isFinite(cy)) return;\n out.set(item.id, { cx, cy });\n });\n return out;\n}\n\n/**\n * 取り込んでよい見本の名前 (#1015)。\n *\n * 1 件ずつが上限以下でも、同じ見本を別名で何度も参照すれば合計は上限を超える\n * (実測 = 1,001 要素の見本を 3 名で参照して最終図が 3,005 要素になった)。\n * 本体の分を引いた残りを予算とし、本文に書かれた順に配る。\n *\n * 順に配るのは、どれを落とすかを決める規則が要るため。 先に書いたものを優先する形なら、\n * 書いた人から見て「後ろが落ちる」 と読める。\n */\nfunction partsBudget(\n target: CdlDiagram,\n partsActors: ReadonlyArray<{ name: string; partId?: string }>,\n partsCatalog: Record<string, CdlDiagram>,\n): Set<number> {\n // 名前ではなく **書かれた順番** で覚える。 名前で覚えると、同じ名前を 2 度書いた時に\n // 先の 1 件が入れた名前で後の 1 件まで採用扱いになる\n const accepted = new Set<number>();\n let used = countDiagramElements(target);\n partsActors.forEach((a, i) => {\n const part = lookupPart(partsCatalog, a.partId);\n if (part === undefined) return;\n const cost = countDiagramElements(part);\n if (used + cost > MAX_INPUT_ELEMENTS) return;\n used += cost;\n accepted.add(i);\n });\n return accepted;\n}\n\n/**\n * 位置を書かなかったパーツの、 merge に渡す座標。\n *\n * 格子の規則は `partsGridCenters` が持つ。 merge は矩形の中心を渡された座標に合わせるので、\n * 中心をそのまま渡す。\n */\nfunction partGridCenters(\n target: CdlDiagram,\n doc: DslDocument,\n partsCatalog: Record<string, CdlDiagram>,\n /** 取り込む見本の書かれた順番。 渡さなければ全部を並べる */\n accepted?: ReadonlySet<number>,\n /** 順番の元になった一覧 (本文に書かれた順) */\n acceptedFrom?: ReadonlyArray<{ name: string }>,\n): Map<string, { cx: number; cy: number }> {\n const partsActors = doc.actors.filter((a) => a.partId !== undefined);\n // 格子に並ぶのは座標を 1 つも書かず相対でも書かなかった分だけ。\n //\n // merge 側は「縦横どちらも書かなかった時」 に格子へ落とす。 条件が食い違うと、 片方だけ\n // 書いたパーツが格子の枠を 1 つ消費して後続がずれる (実測 = 後続の中心が 200 から 720 に動いた)\n const autoActors = partsActors.filter(\n (a) => a.posX === undefined && a.posY === undefined && a.posRel === undefined,\n );\n if (autoActors.length === 0) return new Map();\n // パーツ自身の仮の箱は数えない。 この時点では未削除で残っており、 数えるとパーツを足すたびに\n // 置き場所が下へずれる。\n //\n // 名札 (`title`) だけを見ると、 順序図で 1 人につき作られる 3 つの箱のうち間隔用のものが\n // 漏れる (名札が空のため)。 パーツ 1 個につき 1 つ残り、 格子の起点が 1 段ぶん下がって\n // 画面側とずれていた (実測 = 縦が 840 = 3 段ぶん違った)。\n //\n // 属する列で特定するが、 列の id は名前を slug に変換して作るため名前とは一致しない\n // (実測 = `My Part` の列 id は `My-Part`)。 名前で引くと記号を含む名前だけ取りこぼす。\n // 列の `label` は slug の経路によらず名前の生値を持つので、 そちらで引く (§ merge の\n // 仮の箱の掃除が同じ方法を採っている)。\n //\n // どの列がパーツのものか決められない時は、 数から外さない。 外す側に倒すと本体の箱まで\n // 消えて、 パーツが本体の図に重なる (実測 = 同じ名前を本体とパーツの両方に書くと、\n // 上端が 1140 から 300 に飛んで本体の中に入った)。 外さなければ間隔が 1 段ぶん広がるだけで済む\n const otherActorNames = new Set(\n doc.actors.filter((a) => a.partId === undefined).map((a) => a.name),\n );\n // 本体にも同じ名前がある分は外さない。 名札でも列でも本体と区別できないため\n const partsActorNames = new Set(\n partsActors.map((a) => a.name).filter((n) => !otherActorNames.has(n)),\n );\n // 明示的に他の列へ張ったパーツは、 その列を専有していない (本体と共有している)\n const sharedLaneIds = new Set(\n partsActors.map((a) => a.lane).filter((l): l is string => l !== undefined),\n );\n const partsLaneIds = new Set<string>();\n for (const l of target.lanes) {\n if (l.label === undefined) continue;\n if (!partsActorNames.has(l.label)) continue;\n if (sharedLaneIds.has(l.id)) continue;\n partsLaneIds.add(l.id);\n }\n const baseNodes = target.nodes.filter(\n (n) => !partsActorNames.has(n.title) && !partsLaneIds.has(n.lane),\n );\n // 取り込まれない見本は格子の枠を使わない (#1015)。 枠を使うと、落とした見本の分だけ\n // 後続がずれる (実測 = 隣の見本の左端が 60 から 725 に動いた)\n const acceptedNames =\n accepted === undefined || acceptedFrom === undefined\n ? undefined\n : new Set(acceptedFrom.filter((_, i) => accepted.has(i)).map((a) => a.name));\n const placedActors = autoActors.filter(\n (a) =>\n lookupPart(partsCatalog, a.partId) !== undefined &&\n (acceptedNames === undefined || acceptedNames.has(a.name)),\n );\n const extents = new Map<string, { w: number; h: number; dx: number; dy: number }>();\n for (const a of placedActors) {\n const part = lookupPart(partsCatalog, a.partId)!;\n // 格子は図枠で決める。 画面側も図枠をそのまま置くので、 同じ物差しで並べれば\n // 2 経路の置き場所が揃う (#937)\n const t = partTargetSize(part, a.posW, a.posH, a.scale);\n extents.set(a.name, partFrameExtent(part, t.w, t.h));\n }\n const centers = partsGridCenters(\n baseNodes.length,\n placedActors.map((a) => ({ id: a.name, ...extents.get(a.name)! })),\n );\n // merge に渡すのは段の中心。 矩形の中心とのずれを引く。 引かないと、 段ごとに箱の高さが\n // 違うパーツで段内の上端が揃わない (実測 = 対称なパーツの上端 520 に対して 507.5)\n const out = new Map<string, { cx: number; cy: number }>();\n for (const [name, c] of centers) {\n const e = extents.get(name)!;\n out.set(name, { cx: c.cx - e.dx, cy: c.cy - e.dy });\n }\n return out;\n}\n\n/**\n * パーツごとの外接矩形 (catalog 由来)。 相対指定を解く時に自分の大きさとして使う。\n *\n * `dx` / `dy` は矩形の中心と merge に渡す座標のずれ。 狙った中心から引いて座標にする。\n */\nfunction partSizes(\n doc: DslDocument,\n partsCatalog: Record<string, CdlDiagram>,\n): Map<string, { w: number; h: number; dx: number; dy: number }> {\n const out = new Map<string, { w: number; h: number; dx: number; dy: number }>();\n for (const a of doc.actors) {\n if (a.partId === undefined) continue;\n const part = lookupPart(partsCatalog, a.partId);\n if (part) {\n const t = partTargetSize(part, a.posW, a.posH, a.scale);\n out.set(a.name, partExtent(part, t.w, t.h));\n }\n }\n return out;\n}\n\n/**\n * パーツの箱 (中心と大きさ)。 相対指定を解く時の基準として使う。\n *\n * 大きさは catalog の図から求める。 組み立て前の図に残っている仮の箱を測ると、 実際に\n * 描かれる大きさと違う値で間隔を計算することになる。\n */\nfunction partBoxes(\n target: CdlDiagram,\n doc: DslDocument,\n partsCatalog: Record<string, CdlDiagram>,\n): Map<string, AnchorBox> {\n const grid = partGridCenters(target, doc, partsCatalog);\n const out = new Map<string, AnchorBox>();\n for (const a of doc.actors) {\n if (a.partId === undefined) continue;\n const part = lookupPart(partsCatalog, a.partId);\n if (!part) continue;\n const t = partTargetSize(part, a.posW, a.posH, a.scale);\n const size = partExtent(part, t.w, t.h);\n const placed =\n a.posX !== undefined && a.posY !== undefined\n ? { cx: a.posX, cy: a.posY }\n : grid.get(a.name);\n // 相対で書いた分はここでは決まらない (解決側が後で埋める)\n if (!placed) continue;\n // 渡す座標は段の中心。 矩形の中心はそこからずれる\n out.set(a.name, { cx: placed.cx + size.dx, cy: placed.cy + size.dy, w: size.w, h: size.h });\n }\n return out;\n}\n\n/**\n * パーツ用に作られた仮の箱 / 線 / 列を掃除する (#1015 で helper 化)。\n *\n * 取り込む時だけでなく **落とす時にも呼ぶ**。 落とした時に残すと、格子から外した後続の見本と\n * 重なる (実測で 64,000 の重なりが出た)。\n */\nfunction cleanupPlaceholderActor(\n target: CdlDiagram,\n doc: DslDocument,\n a: { name: string; lane?: string },\n): void {\n const aliasSlug = slugify(a.name);\n const ownedLaneIds = new Set<string>();\n if (doc.type === \"sequence\" || doc.type === \"solidity\") {\n for (const l of target.lanes) {\n // 明示 lane mapping (a.lane) 先は part の張替え先で actor 専用 lane ではないため除外\n if (a.lane !== undefined && l.id === a.lane) continue;\n if (l.label === a.name) ownedLaneIds.add(l.id);\n }\n }\n const ownedNodeIds = new Set<string>();\n for (const n of target.nodes) {\n if (ownedLaneIds.has(n.lane)) ownedNodeIds.add(n.id);\n }\n // actor 専用 lane を引き当てられない経路 (flow / topology 等の共有 lane preset) は従来どおり dragon\n // slug の prefix match に fallback する。 これらは 1 actor = 1 node (id = slug) の生成規則。\n const matchesAliasSlug = (id: string): boolean => {\n if (id === aliasSlug) return true;\n if (id.startsWith(`${aliasSlug}-`)) return true;\n // sequence step anchor = `s{N}-{aliasSlug}` pattern\n if (/^s\\d+-/.test(id) && id.endsWith(`-${aliasSlug}`)) return true;\n return false;\n };\n const relatedToActor = (id: string): boolean =>\n ownedLaneIds.size > 0 ? ownedNodeIds.has(id) : matchesAliasSlug(id);\n target.nodes = target.nodes.filter((n) => !relatedToActor(n.id));\n // edge も同経路で削除 (parts actor に接続していた flow を除去、 parts merge 後の flow は user が\n // 別途書く経路になる)。 削除した edge の id は phase.activate に残ると dangling 参照になるため回収する。\n const removedEdgeIds = new Set<string>();\n target.edges = target.edges.filter((e) => {\n const drop = relatedToActor(e.from) || relatedToActor(e.to);\n if (drop) removedEdgeIds.add(e.id);\n return !drop;\n });\n // lane も削除 = sequence preset は parts actor 用に lane (id = aliasSlug、 label = actor 名) を\n // 生成する。 node/edge だけ消して lane を残すと、 merge 後の part 側 lane (label = alias) と 2 本が\n // 同じ label を lane-label として描画し二重表示になる (actor ラベル二重表示 bug の root cause)。\n //\n // 削除は seq-like preset (sequence / solidity = compileSequence 経由) に限定する。 これらは\n // 1 actor = 1 lane (lane.label === a.name、 lane.id は actor 名の slug) の生成規則が成立し、\n // parts actor 用 lane を安全に削除できる。 他 preset (flow / topology / class / pie 等) は複数\n // actor が共有 lane (id = \"main\" 等) を参照するため、 一致 lane を消すと通常 actor の node が\n // 削除済 lane を参照する不正 diagram になる (cc-codex MAJOR 指摘)。\n //\n // leftover lane の特定は lane.label === a.name を第一に使う。 seq-like preset は非 animate 経路\n // (cdl preset の slugify) と animate 経路 (dragon の slugify) で lane.id の slug 規則が異なり\n // (`_`/全角の扱い等)、 aliasSlug (dragon slugify) と lane.id が不一致になる actor 名がある。 lane.label\n // は両経路とも a.name 生値なので slug 差の影響を受けず確実に一致する。 id === aliasSlug は\n // label 未設定 preset への fallback (exact match のみ、 prefix は false match risk のため付けない)。\n if (doc.type === \"sequence\" || doc.type === \"solidity\") {\n target.lanes = target.lanes.filter((l) => {\n // 明示 lane mapping (a.lane) 先は part の張替え先なので保持する。\n if (a.lane !== undefined && l.id === a.lane) return true;\n if (l.label === a.name) return false;\n if (l.id === aliasSlug) return false;\n return true;\n });\n }\n // 削除された node / edge を activate 参照している既存 phase の cleanup (node 削除と同じ判定経路\n // = 取りこぼすと存在しない id が activate に残り dangling 参照になる、 #873)\n for (const phase of target.phases) {\n phase.activate = phase.activate.filter((id) => !relatedToActor(id) && !removedEdgeIds.has(id));\n }\n}\n\n/**\n * CAR-1657 = doc.actors 中の partId set actor を検出、 partsCatalog から CdlDiagram を lookup、\n * mergePartIntoDiagram で target に prefix 付き統合する。 partsCatalog 未渡し or 該当 partId\n * 未登録なら warn を残して skip、 diagram render は継続 (壊さない設計)。\n */\nfunction mergePartsFromActors(\n target: CdlDiagram,\n doc: DslDocument,\n partsCatalog?: Record<string, CdlDiagram>,\n onNotice?: (notice: CompileNotice) => void,\n): CdlDiagram {\n const partsActors = doc.actors.filter((a) => a.partId !== undefined);\n if (partsActors.length === 0) return target;\n if (!partsCatalog) {\n if (typeof console !== \"undefined\" && console.warn) {\n const names = partsActors.map((a) => `${a.name} (kind: ${a.partId ?? \"?\"})`).join(\", \");\n console.warn(`[dragon] parts kind actors detected but no partsCatalog provided: ${names}`);\n }\n return target;\n }\n // 位置を書かなかったパーツの置き場所は `partGridCenters` が決める。\n //\n // 以前はここで格子を組んでいたが、 相対指定を解く側も同じ位置を知る必要がある。\n // 別々に計算すると、 解決側が想定した位置と実際の置き場所がずれる。 規則を共有する。\n // 取り込んでよい合計を先に決める (#1015)。 1 件ずつ上限以下でも、同じ見本を別名で何度も\n // 参照すれば合計は上限を超える (実測 = 1,001 要素の見本を 3 名で参照して 3,005 要素になった)。\n // 本体の分を引いた残りを予算として、順に配って超えた分を落とす。\n //\n // 格子より先に決める。 後にすると、落とす見本が格子の枠を消費して後続がずれる\n const budget = partsBudget(target, partsActors, partsCatalog);\n const gridCenters = partGridCenters(target, doc, partsCatalog, budget, partsActors);\n\n for (const [actorIndex, actor] of partsActors.entries()) {\n const partId = actor.partId;\n // codex-review CAR-1657 MAJOR fix (§ security) = partsCatalog は untrusted、 Object.hasOwn で\n // inherited property (`__proto__` 等) を除外する prototype pollution 対策。 `parts-` prefix 経路も\n // Object.hasOwn 経由で確認する。\n if (typeof partId !== \"string\" || partId.length === 0) continue;\n const found = lookupPartRaw(partsCatalog, partId);\n // 見つかっても大きすぎる図は取り込まない (#1015)。 黙って落とすと「書いたのに出ない」 に\n // なるため、見つからなかった時と分けて知らせる。\n // 1 件では収まっても合計で超える分も同じく落とす\n if (found !== undefined && !budget.has(actorIndex)) {\n const overOne = !partIsMeasurable(found);\n onNotice?.({\n kind: \"part-not-drawn\",\n actor: actor.name,\n line: 0,\n message: `\"${actor.name}\" (${partId}) は大きすぎるため取り込みません。`,\n hint: overOne\n ? `要素数が上限 (${MAX_INPUT_ELEMENTS}) を超えています`\n : `図全体の要素数が上限 (${MAX_INPUT_ELEMENTS}) を超えます`,\n });\n // 落とす時も仮の箱を掃除する。 残すと格子から外した後続の見本と重なる\n cleanupPlaceholderActor(target, doc, actor);\n continue;\n }\n const part = found;\n if (!part) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(`[dragon] parts kind \"${partId}\" not found in partsCatalog (actor: ${actor.name})`);\n }\n continue;\n }\n // codex-review MAJOR fix (§ sequence header/footer/spacer 削除) = preset (sequence 等) が生成した\n // parts actor 由来の node/edge を alias 経由で全削除する。 sequence は `{slug}-header / -spacer /\n // -footer / s{N}-{slug}` を生成、 slug prefix match で全 sweep。\n //\n // sweep に使う slug は 2 系統ある (#873)。 dragon の slugify は `_` / 全角を保持するが、 非 animate\n // sequence / solidity の node は cdl preset 側の slugify (`_` → `-` 置換、 NFKC なし) で生成される\n // ため、 dragon slug だけで sweep すると `arc_one` → 実 id `arc-one-header` を取りこぼし、 header /\n // footer (title = actor 名) が残って actor 名が多重表示される。\n //\n // seq-like preset は「actor 専用 lane に属する node」 を exact set で特定する経路を使う。\n // lane.label === actor.name で lane を引き当て (label は両 slug 経路とも actor.name 生値)、 その\n // lane に属する node (header / spacer / footer / step anchor は全て actor lane 所属) を node.lane で\n // 厳密収集する。 slug の prefix 推測を挟まないため、 slug 実装差の取りこぼしと、 別 actor を巻き込む\n // 誤削除 (parts actor `a_b` の lane id `a-b` が actor `a-b-c` の `a-b-c-header` に prefix match する)\n // の両方を同時に排除する。\n cleanupPlaceholderActor(target, doc, actor);\n const merged = applyColorHex(part, actor.colorHex, actor.stateOverride ?? {});\n // 位置を書いていないパーツは格子に並べる。 書いてあればその位置を使う\n let placeX = actor.posX;\n let placeY = actor.posY;\n // 格子に落とすのは縦横どちらも書かなかった時だけ。 片方だけ書いた時に残りを格子で\n // 埋めると、 書いた値と格子が混ざった位置になる (従来の条件をそのまま保つ)\n if (placeX === undefined && placeY === undefined) {\n const center = gridCenters.get(actor.name);\n placeX = center?.cx;\n placeY = center?.cy;\n }\n // `倍率` / `scale` は図形の倍率として予約した (#1026)。 同じ名前の状態を持つ見本では、\n // 予約する前は状態の上書きとして効いていた。 黙って意味が変わると気付けないので知らせる\n // 判定は **書かれた名前** で行う。 読めた値で判定すると `scale: x` のように値が\n // 読めない形で知らせが消え、逆に `scale` を書いて見本が `倍率` の状態を持つだけの\n // 組合せ (元から衝突していない) にも知らせてしまう\n const written = new Set(actor.scaleKeys ?? []);\n if (written.size > 0) {\n const clashed = (part.states ?? []).find((st) => written.has(String(st.id ?? \"\")));\n if (clashed) {\n onNotice?.({\n kind: \"scale-reserved\",\n actor: actor.name,\n line: actor.pos?.line ?? 0,\n message: `\"${clashed.id}\" は見本の大きさを変える項目として扱いました (${clashed.id} という名前の状態は変えていません)`,\n hint: `状態を変えたい時は \\`state: { ${clashed.id}: ... }\\` と書く`,\n });\n }\n }\n const t = partTargetSize(part, actor.posW, actor.posH, actor.scale);\n mergePartIntoDiagram(target, part, actor.name, merged, actor.lane, placeX, placeY, t.w, t.h, onNotice, actor.pos?.line ?? 0);\n }\n return target;\n}\n\n/**\n * 状態の初期値に上書きを当てた結果と、 色として読めないため捨てたかどうか。\n *\n * **元の値が色の状態は、 上書きも色に限る** (#1004)。 状態の値は `fill` に入るため、\n * `url(https://example.invalid/x)` のような外部を指す値を通すと、 図を開いた人の環境から\n * その URL へ要求が飛ぶ。 書き出した SVG を配布しても同じことが起きる。\n * 色として読めない上書きは捨てて元の色を残す = 図は出るが外部は指さない。\n *\n * 元の値が色でない状態 (数値 / 文字列) は制限しない。 色として描かれないため、\n * 一律に弾くとゲージの値や説明文の差し替えという正当な用途を壊す。\n *\n * 捨てたことは呼出側が知らせる。 黙って捨てると、 書いた人は色が変わらない理由\n * (書き間違い / 拒否 / 描画不具合) を区別できない。\n */\nfunction resolveStateOverride(\n original: number | string,\n override: number | string | boolean | undefined,\n): { initial: number | string; rejected: boolean } {\n if (override === undefined) return { initial: original, rejected: false };\n if (isColorValue(original) && !isColorValue(override)) return { initial: original, rejected: true };\n return { initial: override as number | string, rejected: false };\n}\n\n/**\n * `色:` に書かれた色番号を、 パーツが持つ色の状態に入れる。\n *\n * 色を保持する状態の名前はパーツごとに違う (`bg` / `stFill` / `gFill` / `hue` など)。 名前を\n * 決め打ちすると、 別の名前を使うパーツで色を書いても何も起きない。\n *\n * パーツの状態のうち初期値が色番号のものを探して、 そこに入れる。 複数あれば全部に入れる\n * (`cpuC` / `memC` / `netC` のように系統ごとに分かれている場合、 1 つだけ変えるとちぐはぐになる)。\n */\nfunction applyColorHex(\n part: CdlDiagram,\n colorHex: string | undefined,\n stateOverride: Record<string, number | string | boolean>,\n): Record<string, number | string | boolean> {\n if (!colorHex) return stateOverride;\n const colorStates = part.states.filter((st) => isColorValue(st.initial));\n if (colorStates.length === 0) return stateOverride;\n const out = { ...stateOverride };\n for (const st of colorStates) {\n // 名前を指定して書いた値が優先。 `色:` はまとめて塗る指定\n if (out[st.id] === undefined) out[st.id] = colorHex;\n }\n return out;\n}\n\n/**\n * CAR-1657 = parts CdlDiagram (単一 part 内容) を target CdlDiagram に prefix 付きで merge する。\n * alias = user が書く actor 名 ('arc1')、 全 id を '{alias}__{origId}' で prefix、 lane 参照 rename、\n * state initial は stateOverride で上書き可、 shape / subtitle / value 内の '{stateName}' template も\n * '{alias__stateName}' に rewrite する。 phase parallel merge (activate / tweens / sets の id 参照 rename)。\n */\nfunction mergePartIntoDiagram(\n target: CdlDiagram,\n part: CdlDiagram,\n alias: string,\n stateOverride: Record<string, number | string | boolean>,\n laneMapping: string | undefined,\n /**\n * parts drop 位置 (drag-and-drop or click 追加時に呼出側が SVG viewBox 座標を書出す)。\n * 未指定 = 従来 (lane.x = 0 baked-in で canvas 左端に描画)、 指定時 = parts 内部 lane の\n * x / y に加算して drop 座標付近に描画。 D1 forensic (drop 座標乖離) の core fix。\n */\n offsetX?: number,\n offsetY?: number,\n /**\n * parts 全体 resize 対応 (I2 forensic) = parts を Miro 相当の「1 unit」 として扱い、\n * user が SE handle drag で拡大すると actor.posW/posH が書出される。 compile で受け取り、\n * parts 全 sub-node の w / h と cx / cy 相対位置に scale 係数を適用して等比拡大する。\n * 未指定 = 従来の parts 原寸 で描画 (scale なし)。\n */\n targetW?: number,\n targetH?: number,\n /** 書いたのに使わなかった上書きを知らせる口。 黙って捨てると理由を追えない (#1004) */\n onNotice?: (notice: CompileNotice) => void,\n /** 知らせに載せる行。 パーツを書いた行を指す。 行が取れない経路 (JSON) では 0 */\n noticeLine = 0,\n): void {\n const prefix = (id: string): string => `${alias}__${id}`;\n const stateIdSet = new Set(part.states.map((s) => s.id));\n const rewriteTemplate = (s: string | undefined): string | undefined => {\n if (!s) return s;\n return s.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (m, name: string) => {\n return stateIdSet.has(name) ? `{${prefix(name)}}` : m;\n });\n };\n\n // 決定的 lane 参照 = user が書いた lane 指定を優先、 なければ parts 内部 lane を prefix 付きで作る\n const targetLaneId = laneMapping;\n const laneIdMap = new Map<string, string>();\n // parts lane の横位置。\n // offset (drop / click 座標) 指定時 = part 中心を offsetX に合わせる = user が置いた位置に\n // parts の中心が来る。 node は lane 中心 (lane.x + laneW/2) に描画されるため、 lane 左端を\n // offsetX - laneW/2 に置くと node 中心 = offsetX となり cursor / viewport 中央に一致する\n // (縦方向 offsetY と対称、 offsetY 側は partCenterStack で既に中心合わせ済)。\n // 従来の auto-adjust (max(offsetX, existingMax + gap) で既存 lane 右端へ強制右寄せ) は user\n // directive で廃止 (2026-07-21)。 重なりは user の意図位置を優先し、 手動移動で回避する経路。\n // 未指定 (座標なし fallback) 時のみ existingMax + gap で右外配置 (通常経路は drop/click で座標を渡す)。\n const PARTS_LANE_GAP = 300;\n const existingLaneMaxX = target.lanes.length > 0\n ? Math.max(...target.lanes.map((l) => (l.x ?? 0) + l.width))\n : 0;\n // parts 全体 resize (I2 forensic): user が SE handle drag で targetW/H 指定 = actor.posW/H。\n // scale 基準は part 全体の bbox 幅 (全 lane の最左端〜最右端) にする。 lane[0] 幅だけを基準にすると\n // multi-lane part (複数 lane を横に並べた part) で全体幅を過小評価し、 非先頭 lane の node が自 lane\n // 中心からずれる (#880)。\n // 縦列の位置と幅を先に正す。 catalog は呼出側が渡す値で、 生値のまま bbox を出すと\n // 拡大の基準が 1 に落ちて箱が桁違いに大きくなる (実測 = 指定間隔 200 が -31800 になった)\n const partLaneGeom = new Map<string, { x: number; w: number }>();\n for (const l of part.lanes) {\n partLaneGeom.set(l.id, {\n x: typeof l.x === \"number\" && Number.isFinite(l.x) ? l.x : 0,\n w: positiveOr(l.width, 400),\n });\n }\n const laneXs = [...partLaneGeom.values()].map((g) => g.x);\n const laneRights = [...partLaneGeom.values()].map((g) => g.x + g.w);\n const partMinLaneX = minOf(laneXs, 0);\n const partMaxLaneRight = maxOf(laneRights, 400);\n // 幅は max >= min で常に非負。 正の幅 (極小 sub-pixel 含む) はそのまま scale 基準に使い、\n // 0 (全 lane が同一 x + 幅 0 の退化ケース) の時だけ除算保護で 1 に fallback する。\n // Math.max(1, w) だと 0 < w < 1 の正当な幅まで 1 に floor して over-scale するため使わない。\n const rawBboxW = partMaxLaneRight - partMinLaneX;\n const partsBboxW = rawBboxW > 0 ? rawBboxW : 1;\n // 非有限は 1 に倒す。 桁が溢れた `大きさ:` (`Number()` が Infinity を返す長さ) を\n // そのまま掛けると描けない座標になり、 大きさを見積る側 (`partTargetScale`) だけが\n // 1 に倒していたため経路で食い違っていた (#1018)\n const rawLaneScaleX = targetW !== undefined && targetW > 0 ? targetW / partsBboxW : 1;\n const laneScaleX = Number.isFinite(rawLaneScaleX) && rawLaneScaleX > 0 ? rawLaneScaleX : 1;\n // part 全体を「元 bbox 中心 → drop 座標」 の scale 変換で写す単一式 mapLaneX。 lane も node も同じ式で\n // 変換し、 lane.x = mapLaneX(元 lane 左端) にすることで全 lane / 全 node が一貫して drop 座標を中心に\n // scale 配置される (cc-codex #879 の mapPartX と同じ発想を lane push まで前倒し、 #880 root fix)。\n const partOrigBboxCenterX = partMinLaneX + partsBboxW / 2;\n const dropCenterX = offsetX !== undefined\n ? offsetX\n : existingLaneMaxX + PARTS_LANE_GAP + (partsBboxW * laneScaleX) / 2;\n const mapLaneX = (x: number): number => (x - partOrigBboxCenterX) * laneScaleX + dropCenterX;\n\n for (const laneOrig of part.lanes) {\n if (targetLaneId) {\n laneIdMap.set(laneOrig.id, targetLaneId);\n } else {\n const newLaneId = prefix(laneOrig.id);\n laneIdMap.set(laneOrig.id, newLaneId);\n // lane の左端を mapLaneX で変換 = 元 lane 左端 (x) を scale 変換後の位置に置く。 lane 幅も\n // scale して lane 中心が mapLaneX(元 lane 中心) に一致する。 これで multi-lane でも各 lane が\n // part 全体の scale 変換に沿って配置される。\n const geom = partLaneGeom.get(laneOrig.id) ?? { x: 0, w: 400 };\n target.lanes.push({\n ...laneOrig,\n id: newLaneId,\n label: laneOrig.label ?? alias,\n x: mapLaneX(geom.x),\n width: geom.w * laneScaleX,\n });\n }\n }\n\n // parts drop 位置 fix (D1 + D2 root fix):\n // D2 = parts の stack 番号 (0/1/2/…) が target sequence の stack と衝突すると\n // CDL layout の rowH 計算で全 lane の同 row cy が拡張、 sequence footer 等が縦 shift。\n // → 2 段防御 で分離する:\n // (1) 全 parts node に posX/posY 明示 set (CDL layout の絶対配置経路 = stack 計算 skip)\n // (2) parts の stack 番号を target 側 max stack + STACK_ISOLATION_OFFSET (1000) に shift\n // = 万一 layout が rowH で参照しても sequence stack と重ならず影響 0 化\n // D1 = drop 座標尊重の縦方向 = parts の元 stack (0..N) から近似 pitch で cy を組み立て、\n // offsetY を加算して drop 座標付近に描画。 lane.x + lane.width/2 + offsetX で横位置。\n //\n const STACK_ISOLATION_OFFSET = 1000;\n const shouldForcePos = offsetX !== undefined || offsetY !== undefined;\n // target 側の現在 max stack + isolation offset で parts node の stack を shift、\n // sequence の rowH 計算と完全分離 (D2 fix、 posX/posY 明示との 2 段防御)。\n const targetMaxStack = shouldForcePos && target.nodes.length > 0\n ? Math.max(...target.nodes.map((n) => n.stack ?? 0))\n : 0;\n const stackShiftBase = shouldForcePos ? targetMaxStack + STACK_ISOLATION_OFFSET : 0;\n // parts 全体 resize scale (I2 forensic 対応): targetW / targetH 指定時、 parts の元 total size\n // に対する比率 = scale 係数、 全 sub-node の w / h + cx / cy 相対位置に scale 反映。\n // scaleX は lane push と同じ part bbox 幅基準 (laneScaleX) を使う = multi-lane で lane と node の\n // scale 係数が一致する (#880、 lane[0] 幅基準だと非先頭 lane の node がずれる)。\n // parts 内部 stack 別の垂直 pitch (world unit)。 CDL layout の実 stackGap (~100) +\n // 標準 node h (~140-200) の合計相当。 parts の cy を厳密に再現しないが、 渡した座標付近に\n // parts が中心配置される見た目に十分な近似。\n //\n // 実配置に置き換える案を試したが、 拡大の基準 (縦列基準 → 箱基準) まで変わって既存の\n // 期待 14 件が崩れた。 段を持つパーツ (実 catalog で 80 件中 7 件) の内部比率が実配置と\n // 3% ずれるが、 見た目の大きさは呼出側が揃えるため観測される差は無い\n const STACK_PITCH_APPROX = 220;\n // 数でない段は 0 として扱う。 大きさを見積る側 (`partTargetScale`) が同じ判定をしており、\n // ここだけ NaN を通すと段の数が NaN になって倍率が経路で食い違う (#1018)\n const partStacks = part.nodes.map((n) =>\n typeof n.stack === \"number\" && Number.isFinite(n.stack) ? n.stack : 0,\n );\n const minStack = partStacks.length > 0 ? Math.min(...partStacks) : 0;\n const maxStack = partStacks.length > 0 ? Math.max(...partStacks) : 0;\n const partCenterStack = (minStack + maxStack) / 2;\n const partOrigH = Math.max(1, (maxStack - minStack + 1) * STACK_PITCH_APPROX);\n const scaleX = laneScaleX;\n const rawScaleY = targetH !== undefined && targetH > 0 ? targetH / partOrigH : 1;\n const scaleY = Number.isFinite(rawScaleY) && rawScaleY > 0 ? rawScaleY : 1;\n\n // node merge = id prefix + lane 参照 rewrite + shape / subtitle / value 内 template rewrite\n for (const nodeOrig of part.nodes) {\n const mappedLane = laneIdMap.get(nodeOrig.lane) ?? nodeOrig.lane;\n // codex-review MAJOR fix (§ nested shape template) = recursive walk で shape 内 nested object /\n // array の string leaf 全対象、 前実装は 1 depth のみで `fill: { gradient: \"{v}\" }` 等 miss。\n let newShape = nodeOrig.shape\n ? deepRewriteStrings(nodeOrig.shape as unknown, rewriteTemplate)\n : undefined;\n // parts 全体 resize (I2 forensic): shape 内 radius / outerRadius / innerRadius / thickness に\n // scale 反映 = user が SE handle drag で拡大すると shape の見た目も比例拡大される。 scaleX を採用\n // (等比 scale 相当、 縦方向 scaleY と乖離する場合は近似)、 shape 内数値 field のうち幾何寸法系\n // のみ scale 適用 (fill / stroke 色 field 等 non-numeric は影響なし)。\n if (newShape && (scaleX !== 1 || scaleY !== 1)) {\n const shapeScale = Math.min(scaleX, scaleY); // 等比 scale で circle 崩れ回避\n const geomKeys = new Set([\"radius\", \"outerRadius\", \"innerRadius\", \"thickness\"]);\n const scaleGeom = (obj: unknown): unknown => {\n if (obj === null || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(scaleGeom);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n if (geomKeys.has(k) && typeof v === \"number\") {\n out[k] = v * shapeScale;\n } else if (typeof v === \"object\" && v !== null) {\n out[k] = scaleGeom(v);\n } else {\n out[k] = v;\n }\n }\n return out;\n };\n newShape = scaleGeom(newShape) as typeof newShape;\n }\n // parts drop 位置 offset 反映:\n // - node.posX set 済 (parts が絶対座標を持つ) = その posX を part 中心基準で scale 変換\n // - offsetX 指定時 (drop 経路) で posX 未設定 = node が属する lane 中央を同じ式で変換\n // - offset なし (従来経路) は auto layout 継続 (posX undefined)\n //\n // 明示 posX と auto-layout の両経路を、 lane push と同じ単一式 mapLaneX で変換する\n // (cc-codex #879 Round 2/3 MAJOR + #880)。 mapLaneX は part bbox 中心 → drop 座標の scale 変換で、\n // lane / node / 明示 posX / auto-layout の全経路がこの 1 式を共有するため、 lane.x != 0 でも\n // multi-lane でも node 中心と自 lane 中心が一致する。\n let nodePosX: number | undefined = nodeOrig.posX !== undefined ? mapLaneX(nodeOrig.posX) : undefined;\n let nodePosY: number | undefined = nodeOrig.posY !== undefined ? nodeOrig.posY + (offsetY ?? 0) : undefined;\n if (shouldForcePos && nodePosX === undefined) {\n // posX を持たない node は所属 lane の中央 (auto layout の cx 相当) を同じ mapLaneX で変換する。\n const geom = partLaneGeom.get(nodeOrig.lane) ?? { x: 0, w: 320 };\n nodePosX = mapLaneX(geom.x + geom.w / 2);\n }\n if (shouldForcePos && nodePosY === undefined) {\n // parts の元 stack から近似 pitch で cy を組み立て、 全 parts の中心が offsetY に来るよう調整\n const stack = nodeOrig.stack ?? 0;\n nodePosY = (stack - partCenterStack) * STACK_PITCH_APPROX * scaleY + (offsetY ?? 0);\n }\n // parts sub-node の w / h に scale 適用 (I2 forensic 対応、 targetW/H 指定時のみ)\n // catalog の値は呼出側が渡すので、 拡大しない時も数として通るか確かめる。 通さないと\n // 座標が非有限になって図が描けない (実測 = 箱の中心が NaN になった)\n const rawNodeW = nodeOrig.w !== undefined ? positiveOr(nodeOrig.w, 200) : undefined;\n const rawNodeH = nodeOrig.h !== undefined ? positiveOr(nodeOrig.h, 200) : undefined;\n const nodeW = rawNodeW !== undefined && (scaleX !== 1 || scaleY !== 1)\n ? rawNodeW * scaleX\n : rawNodeW;\n const nodeH = rawNodeH !== undefined && (scaleX !== 1 || scaleY !== 1)\n ? rawNodeH * scaleY\n : rawNodeH;\n target.nodes.push({\n ...nodeOrig,\n id: prefix(nodeOrig.id),\n lane: mappedLane,\n title: rewriteTemplate(nodeOrig.title) ?? nodeOrig.title,\n subtitle: rewriteTemplate(nodeOrig.subtitle),\n value: rewriteTemplate(nodeOrig.value),\n // parts stack を target 側と分離 (D2 fix、 posX/posY 明示との 2 段防御)\n stack: (nodeOrig.stack ?? 0) + stackShiftBase,\n ...(newShape ? { shape: newShape as CdlDiagram[\"nodes\"][number][\"shape\"] } : {}),\n ...(nodePosX !== undefined ? { posX: nodePosX } : {}),\n ...(nodePosY !== undefined ? { posY: nodePosY } : {}),\n ...(nodeW !== undefined ? { w: nodeW } : {}),\n ...(nodeH !== undefined ? { h: nodeH } : {}),\n });\n }\n\n // state merge = id prefix + initial override\n for (const stateOrig of part.states) {\n const { initial, rejected } = resolveStateOverride(stateOrig.initial, stateOverride[stateOrig.id]);\n if (rejected) {\n onNotice?.({\n kind: \"state-override-rejected\",\n actor: alias,\n line: noticeLine,\n message: `\"${alias}\" の ${stateOrig.id} に書いた値は色として読めないため使いません`,\n hint: \"色は `#ff0000` のような色番号か、 `red` のような色名で書く\",\n });\n }\n target.states.push({ id: prefix(stateOrig.id), initial });\n }\n\n // edge merge = id / from / to prefix (parts 内 edge は稀だが対応)\n for (const edgeOrig of part.edges) {\n target.edges.push({\n ...edgeOrig,\n id: prefix(edgeOrig.id),\n from: prefix(edgeOrig.from),\n to: prefix(edgeOrig.to),\n });\n }\n\n // codex-review CRITICAL fix (§ readouts merge) = readout 系 parts (percent-ring / sparkline /\n // donut / KPI 等) は node/state だけでは render されず、 readouts field が必須。 全 readout の\n // id prefix + source / historySource / *Source field の state template rewrite で対応。\n if (part.readouts && part.readouts.length > 0) {\n if (!target.readouts) target.readouts = [];\n for (const readoutOrig of part.readouts) {\n const rewritten = deepRewriteStrings(readoutOrig as unknown, rewriteTemplate) as CdlDiagram[\"readouts\"] extends readonly (infer R)[] ? R : never;\n // id は shape 全 walk で rewrite されないので個別に prefix\n target.readouts.push({\n ...(rewritten as { id: string }),\n id: prefix((rewritten as { id: string }).id),\n } as CdlDiagram[\"readouts\"] extends readonly (infer R)[] ? R : never);\n }\n }\n\n // codex-review MAJOR fix (§ phase parallel merge) = 前実装は append (sequential)、 spec は parallel\n // default = parts phase を target 側 phase 個別に merge、 duration は max、 activate / tweens / sets\n // は union。 stateOverride.phase === false 時は parts phase 破棄 (opt-out)。\n const phaseOptOut = stateOverride[\"phase\"] === false;\n if (phaseOptOut) {\n return; // parts phase を破棄、 activate / tweens / sets の rewrite 不要\n }\n if (target.phases.length === 0) {\n // target に phase なし = parts phase をそのまま追加 (prefix 付き)\n for (const phaseOrig of part.phases) {\n target.phases.push({\n ...phaseOrig,\n id: prefix(phaseOrig.id),\n activate: phaseOrig.activate.map(prefix),\n tweens: phaseOrig.tweens.map((t) => ({ ...t, stateId: prefix(t.stateId) })),\n sets: phaseOrig.sets.map((s) => ({ ...s, stateId: prefix(s.stateId) })),\n });\n }\n } else {\n // parallel merge = 各 target phase に対応する parts phase を index-wise で合成 (min の phase 数まで)、\n // 残 parts phase は追加 append (target より parts phase 数が多い場合)\n const targetLen = target.phases.length;\n const partsLen = part.phases.length;\n const commonLen = Math.min(targetLen, partsLen);\n for (let i = 0; i < commonLen; i++) {\n const targetPhase = target.phases[i]!;\n const partPhase = part.phases[i]!;\n targetPhase.duration = Math.max(targetPhase.duration, partPhase.duration);\n targetPhase.activate = [...targetPhase.activate, ...partPhase.activate.map(prefix)];\n targetPhase.tweens = [...targetPhase.tweens, ...partPhase.tweens.map((t) => ({ ...t, stateId: prefix(t.stateId) }))];\n targetPhase.sets = [...targetPhase.sets, ...partPhase.sets.map((s) => ({ ...s, stateId: prefix(s.stateId) }))];\n }\n // parts phase 余剰は append (target より parts が長い場合)\n for (let i = commonLen; i < partsLen; i++) {\n const phaseOrig = part.phases[i]!;\n target.phases.push({\n ...phaseOrig,\n id: prefix(phaseOrig.id),\n activate: phaseOrig.activate.map(prefix),\n tweens: phaseOrig.tweens.map((t) => ({ ...t, stateId: prefix(t.stateId) })),\n sets: phaseOrig.sets.map((s) => ({ ...s, stateId: prefix(s.stateId) })),\n });\n }\n }\n}\n\n/**\n * codex-review MAJOR fix = shape / readout の nested object / array 内 string leaf を全て\n * rewrite 関数に通す再帰 walk。 非 string leaf (number / boolean / null) は保持、\n * 循環参照は Set で防御 (現状 shape / readout は tree 構造で cycle なし想定、 defensive)。\n */\nfunction deepRewriteStrings(\n value: unknown,\n rewrite: (s: string | undefined) => string | undefined,\n seen: WeakSet<object> = new WeakSet(),\n): unknown {\n if (typeof value === \"string\") return rewrite(value) ?? value;\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value as object)) return value;\n seen.add(value as object);\n if (Array.isArray(value)) {\n return value.map((v) => deepRewriteStrings(v, rewrite, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = deepRewriteStrings(v, rewrite, seen);\n }\n return out;\n}\n\n/**\n * v0.5+ flow inline option (guard / cardinality / labelOffsetX / labelOffsetY) を\n * 既存 preset 経由で生成された CdlEdge に対し、 doc.flow の (from, to) 一致順マッチングで反映する。\n *\n * 設計:\n * - preset 経路ごとに edge id 命名規則が異なる (sequence: e{idx}-..、 ER: rel-{idx}-..、 FSM: t{idx}-..、\n * topology: c{idx}-..、 flow preset: e-{prev}-{node}、 swimlane: e{idx}-..) ため、 id 直接マッチは脆い。\n * - 代わりに doc.flow の 1 step に対し、 同じ (slugified-from, slugified-to) を持つ未マッチ edge を\n * 順に 1 つ消費する double-pointer 走査で対応付ける。 同 from-to の重複は出現順で順番に対応。\n * - ER preset で cardinality が author 明示なら、 既存の label \"places (1:N)\" に \"(1:N)\" を再付与せず、\n * 既に label に含まれている場合はスキップ (`label.includes(cardinality)` で判定)。\n */\nfunction applyEdgeInlineOptions(\n diagram: CdlDiagram,\n doc: DslDocument,\n /** 対応が取れた edge を記録する表。 callback は呼ばない (1 edge = 1 回にするため)。 */\n sourceLines?: Map<string, number>,\n): void {\n const used = new Set<string>();\n // sequence preset では actor 名 が lane id、 edge.from は `s{stepIdx}-{laneId}` 形式。\n // solidity は sorted-actor を sequence preset 経由するため sequence と同形。\n // それ以外 (flow / swimlane / er / state / topology / gantt / class / pie / c4 / mind) は\n // edge.from / edge.to が plain slug (slugify(actor 名))。\n const isSeqLike = doc.type === \"sequence\" || doc.type === \"solidity\";\n doc.flow.forEach((s, stepIdx) => {\n const fromId = slugify(s.from);\n const toId = slugify(s.to);\n const target = diagram.edges.find((e) => {\n if (used.has(e.id)) return false;\n if (isSeqLike) {\n // edge.from / edge.to は `s{stepIdx}-{laneId}` 命名規則\n return (\n (e.from === `s${stepIdx}-${fromId}` || e.from === fromId) &&\n (e.to === `s${stepIdx}-${toId}` || e.from === e.to)\n );\n }\n return e.from === fromId && e.to === toId;\n });\n if (!target) return;\n used.add(target.id);\n sourceLines?.set(target.id, s.pos.line);\n if (s.guard !== undefined) {\n target.guard = s.guard;\n // FSM preset では sub が guard 同期、 author 明示 guard を sub に反映 (sub 既存なら上書きしない)\n if (doc.type === \"state\" && target.sub === undefined) target.sub = s.guard;\n }\n if (s.cardinality !== undefined) {\n target.cardinality = s.cardinality;\n // ER preset の場合 label に \"(1:N)\" 形式で併記 (既に含まれていればスキップ)\n if (doc.type === \"er\" && !target.label.includes(s.cardinality)) {\n target.label = target.label\n ? `${target.label} (${s.cardinality})`\n : `(${s.cardinality})`;\n }\n }\n if (s.labelOffsetX !== undefined) target.labelOffsetX = s.labelOffsetX;\n if (s.labelOffsetY !== undefined) target.labelOffsetY = s.labelOffsetY;\n });\n}\n\n/**\n * 描画側が大きさを持つ種別。\n *\n * 記法の `kind` は描画の種別より広い。 そのまま渡すと大きさを引けずに描画が落ちる\n * (実測 = solidity の golden 4 件が `Cannot read properties of undefined`)。\n */\nconst DRAWABLE_KINDS: ReadonlySet<string> = new Set(NODE_KINDS);\n\n/**\n * 描画側に無い記法の種別を、 意味の近い描画の種別に読み替える。\n *\n * Solidity の記法は `eoa` / `contract` のように領域固有の語を使う。 描画側に同じ名前は無いが、\n * 意味の対応する形はある (`shape-wallet` / `shape-smart-contract`)。 読み替えないと名札が\n * 一律 `card` になり、 「書いたとおりの形になる」 が Solidity の図だけ成立しない。\n *\n * 並び順 (`compileSolidity` の `kindOrder`) はこの読み替えの前の値で決まる = 読み替えても\n * 縦線の並びは変わらない。\n */\nconst KIND_ALIAS: Readonly<Record<string, string>> = {\n eoa: \"shape-wallet\",\n wallet: \"shape-wallet\",\n multisig: \"signer\",\n contract: \"shape-smart-contract\",\n proxy: \"shape-smart-contract\",\n library: \"shape-code-block\",\n interface: \"shape-code-block\",\n};\n\n/**\n * 図全体を 1 つの箱で描く種別。\n *\n * これらは中身 (扇 / 帯 / 枝) を payload で受け取り、 1 node で図全体を描く。 登場人物ごとの箱を\n * 持たないので、 段の `focus:` で名前を指しても引く先が無い。 `injectPhasesFallback` が\n * この一覧を使って「実在する名前ならその箱を光らせる」 に読み替える (#1076 / #1077)。\n */\nconst SINGLE_BOX_KINDS: ReadonlySet<string> = new Set([\n \"chart-pie\", \"chart-line\", \"chart-bar\",\n \"gantt-timeline\", \"mind-map\", \"mind-radial\",\n \"funnel-stages\", \"quadrant-matrix\", \"tree-hierarchy\", \"journey-map\",\n]);\n\n/** 記法の種別を描画の種別に直す。 描けない種別のままなら `undefined`。 */\nfunction drawableKind(kind: string | undefined): string | undefined {\n if (kind === undefined) return undefined;\n const mapped = KIND_ALIAS[kind] ?? kind;\n return DRAWABLE_KINDS.has(mapped) ? mapped : undefined;\n}\n\n/**\n * 順序図の名札 (lifeline 上端 / 下端) の高さを揃える。\n *\n * `kind` を書いたとおりに載せると、 種別ごとに要る高さが変わる (行を持つ storage は 206、\n * card は 72)。 揃えないと縦線の始まる位置がばらけ、 「同じ高さから下りる」 読み方が崩れる。\n *\n * 上端は最も高いものに合わせる。 下端も同じ値にする = 上下で形が違うと、 同じ登場人物が\n * 別物に見える。\n */\nfunction alignSeqHeaderHeights(diagram: CdlDiagram, doc: DslDocument): void {\n if (doc.type !== \"sequence\" && doc.type !== \"solidity\") return;\n // 名札の id は `{laneId}-header` / `{laneId}-footer` の構造。 末尾の一致だけで見ると、\n // 登場人物名が `Auth Header` の時に step の目印 `s0-auth-header` を拾い、 見えない 2px の\n // 箱を名札の高さまで広げてしまう (#883 と同根)。\n const isEnd = (n: CdlDiagram[\"nodes\"][number]): boolean =>\n n.id === `${n.lane}-header` || n.id === `${n.lane}-footer`;\n const ends = diagram.nodes.filter(isEnd);\n if (ends.length === 0) return;\n // `posH` を書いた名札は揃えの外に置く。 「その名札だけを指定の大きさにし、 他には影響させない」\n // という指定なので (`types.ts` の `nodes` override)、 値を変えるのも、 他の名札を引きずるのも\n // 契約に反する (実測 = `posH: 400` を 1 つ書くと、 無関係な名札まで 72 → 400 になった)。\n const auto = ends.filter((n) => n.posH === undefined);\n if (auto.length === 0) return;\n const tallest = Math.max(...auto.map((n) => n.h ?? 0));\n if (tallest <= 0) return;\n for (const n of auto) n.h = tallest;\n}\n\n/**\n * 名札に載せるのに要る高さ (world 単位)。\n *\n * 絵が箱の外に出る `shape-` のうち、 **高さを上げれば下のはみ出しが消える** 4 種だけを持つ。\n *\n * `actor` / `function` / `storage` / `event` の 4 種は `#1066` までここに載っていた。 描画側が\n * 名前を箱の高さに関係なく固定の位置に置いていたため、 名札 (高さ 72) に載せると名前が下端を\n * またいだ。 `cardene777/cdl#416` が小型用の配置を足して収まるようになったので外した\n * (実測 = 名札の高さで下へ 52.3 から 63.8 の余裕、 目印がある場合でも 9.5 以上)。\n *\n * 値は実測 = 高さを 1 ずつ変えて描き、 絵の下端が箱の下端を越えなくなる最小の整数を取った\n * (`type: flow` で `大きさ:` を書いて掃いた)。 **絵を変えたら測り直す**。\n * 表が実際の描画と合っているかは `apps/playground-spa/tests/node-label-fit.spec.ts` が\n * 両側 (この高さで収まる / 2 低いとはみ出す) を実 render で測って見る。\n */\nconst LABEL_MIN_H: Readonly<Record<string, number>> = {\n // `shape-` のうち、 高さを上げれば下のはみ出しが消える 4 種 (#1067)。 値は「収まる最小の高さ」\n // で、 1 手前 (値 - 1) では 0.9-1 はみ出すことを実測した\n \"shape-person\": 228, // 名札 72 で下へ 155.9\n \"shape-server-rack\": 166, // 94\n \"shape-website\": 98, // 26\n \"shape-warehouse\": 79, // 7\n};\n\n/**\n * 名札の高さをどれだけ上げても収まらない種別 (#1067)。\n *\n * `shape-` を名札に書くと絵が箱の外に描かれる。 49 種すべてを実測したところ、 完全に収まるのは\n * 5 種 (`shape-cloud` / `shape-window` / `shape-message-bubble` / `shape-token` /\n * `shape-online-shop`) だけだった。\n *\n * ## 分ける基準は「名前が読めるか」 (#1106 で変わった)\n *\n * | 向き | 実害 | 扱い |\n * |---|---|---|\n * | 下 | 縦線が絵を貫く | 落とす |\n * | 左右 | 隣の本とぶつかる (`shape-code-block` は右へ 132) | 落とす |\n * | 上のみ | 何ともぶつからず図の外にも出ない | **原則残すが例外あり** |\n *\n * `#1067` は向きだけで分け、 上だけのはみ出しは 10 種すべて残した。 実測で viewBox の内側に\n * 収まることを確かめており (最大の `shape-robot-arm` は上へ 129 だが余裕が 23)、 箱から出ても\n * 読み手には壊れて見えないと判断したため。\n *\n * **その判断が実機で崩れた**。 `shape-wallet` は上へ 12.1 しか出ないのに、 絵が小さく潰れて\n * 名前と重なり `EOA` が読めない状態だった。 はみ出し量では説明できない = 12.1 の\n * `shape-wallet` を落とし、 129 の `shape-robot-arm` を残す。\n *\n * したがって **基準は「名前が読めるか」** で、 向きは目安にすぎない。 上だけに出る 10 種のうち\n * 残るのは 9 種で、 分ける根拠は目視のみ (機械的な基準は無い)。\n *\n * ## ここに載るのは「高さで直らない」 種別だけ\n *\n * 下のはみ出しは高さで直ることがある。 4 種は `LABEL_MIN_H` に最小の高さを持たせ、 `rows` 等で\n * 名札が高くなった図では書いたとおりの形で載る (`#1061` の「収まる高さがある時は書いたとおりに\n * 載せる」 と同じ扱い)。\n *\n * こちらに載るのは 3 種類。 **左右にはみ出す 24 種** は横幅が高さで変わらないため直らない\n * (実測 = `shape-smart-contract` は h=72 でも h=430 でも右へ 15.2)。 **下のはみ出しが高さに\n * 依らない 6 種** は h を 72 から 600 まで上げても値が変わらない (実測 = `shape-stack` は\n * 常に 36、 `shape-cylinder` は 150 以上で常に 1)。 **`shape-wallet`** は上のはみ出しが\n * 高さで変わらず、 絵が潰れて名前と重なる (#1106)。\n *\n * ## 失うもの\n *\n * Solidity の読み替え (`#975`) 4 組のうち 3 組がここに入るため、 名札では `card` になる\n * (`contract` / `proxy` → `shape-smart-contract`、 `library` / `interface` →\n * `shape-code-block`、 `eoa` / `wallet` → `shape-wallet`)。 名札で形が残るのは\n * `multisig` → `signer` だけ。\n */\nconst LABEL_NEVER_FITS: ReadonlySet<string> = new Set([\n // 左右にはみ出す 24 種。 横幅は高さで変わらないため直らない\n \"shape-api-gateway\", \"shape-atm\", \"shape-auditor\", \"shape-bank\", \"shape-bitcoin-chain\",\n \"shape-blockchain\", \"shape-blockchain-block\", \"shape-blockchain-node\", \"shape-brokerage\",\n \"shape-code-block\", \"shape-customer-service\", \"shape-ethereum-chain\", \"shape-hexagon\",\n \"shape-kanban-card\", \"shape-lawyer\", \"shape-network-node\", \"shape-nft\", \"shape-notary\",\n \"shape-regulator\", \"shape-satellite\", \"shape-smart-contract\", \"shape-terminal\",\n \"shape-trader\", \"shape-trust-bank\",\n // 下のはみ出しが高さに依らない 6 種\n \"shape-cylinder\", \"shape-diamond\", \"shape-file\", \"shape-folder\", \"shape-mobile-device\",\n \"shape-stack\",\n // 上へ出る絵が名札の大きさでは読めない。 `#1067` では「上は何ともぶつからない」 として残したが、\n // 実際には絵が小さく潰れて名前と重なり、 横に並べた時も 1 本だけ頭が浮く (user 実機確認)\n \"shape-wallet\",\n]);\n\n/**\n * 名札が、 小型の `card` では描かれない文字を持つか。\n *\n * 小型の `card` (`h < 100`) が描くのは名前だけ。 `subtitle` と `eyebrow` は分岐で外れ、\n * `value` は `card` が元から描かない。 `rows` を描くのは種別が限られる。\n * どれか 1 つでも持つ名札を `card` に落とすと、 著者が書いた文字が画面から消える。\n */\nfunction hasAuthoredText(n: CdlDiagram[\"nodes\"][number]): boolean {\n if (n.subtitle !== undefined || n.eyebrow !== undefined || n.value !== undefined) return true;\n return rendersRows(n.kind) && (n.rows?.length ?? 0) > 0;\n}\n\n/**\n * 絵が箱に収まらない `shape-` を名札から外す (#1061 / #1067)。\n *\n * `#975` が「書いた種別を名札に載せる」 挙動を入れ、 `#1058` が「書かなかった時は載せない」\n * を直した。 残っていたのは **書いた時にはみ出す** 側で、 名札は小型の箱 (`h: 72`) なのに\n * `shape-` は絵を自分の大きさで描くため、 絵が箱の外に出て縦線に貫かれる。\n *\n * `actor` / `function` / `storage` / `event` は `#1066` まで対象だった (名前を固定位置に置く\n * ため名前が下端をまたいだ = actor 21.6 / function 21.6 / storage 13.6 / event 24.2 world px)。\n * 描画側 (`cardene777/cdl#416`) が小さい箱で名前を中央に置くようになったので外した。\n * **いま落とす理由は絵のはみ出しだけ**。\n *\n * **収まる高さがある時は書いたとおりに載せる**。 `rows` を書いた名札は\n * `requiredRowsHeight` で 206 以上になり、 揃え (`alignSeqHeaderHeights`) がその高さを\n * 全本に配る。 判定を揃えの後に置くのはこのため。\n *\n * ただし **揃えで届くのは表の値が 206 以下の種別だけ**。 `shape-warehouse` (79) /\n * `shape-website` (98) / `shape-server-rack` (166) は収まるが、 `shape-person` (228) は\n * 届かず `card` に落ちる (`rows` 1 件では 206 まで)。\n *\n * **著者が書いた文字を持つ名札は落とさない**。 小型の `card` は名前しか描かない\n * (`subtitle` / `eyebrow` は `h < 100` の分岐で外れ、 `value` は元から描かない)。 落とすと\n * 書いた文字が画面から消える = 絵がはみ出すより悪い。 `rows` と同じ扱いにする。\n *\n * 落とす時に失うものは、 種別ごとの絵と、 既定の配色での枠線の色。 本 app の配色は枠線の色を\n * 上書きするため見た目は変わらないが、 既定の配色で使う利用者には差が出る。\n * それでも落とすのは、 絵が箱の外に出る方が読み手に与える誤りが大きいため。\n *\n * 高さを上げる方向は採らない。 名札の高さは全本で揃える規約があるため 1 本の指定が全体に\n * 伝播し、 全名札が 2-3 倍になる (`#1058` で実測、 golden 25 件が変化)。\n *\n * **判定は上下 1 組でする**。 `nodes` override で上端だけ大きさを書くと (`posH: 120`)、\n * 上端は収まり下端 (72) は収まらないため、 1 つずつ見ると同じ登場人物の上下で形が変わる。\n * 上下で形が違うと別物に見えるので、 どちらかが収まらなければ両方落とす。\n *\n * ## `shape-` も対象に含める (#1067)\n *\n * 当初は対象外にしていた。 これらは名前を箱ではなく自分の絵に対して置くため、 箱を基準に測ると\n * 収まっていないように見えるだけだと考えたため。 49 種を実測すると **絵そのものが箱の外に出て\n * 縦線に貫かれ、 隣の本ともぶつかって** いた。 どの種別をどう扱うかは `LABEL_NEVER_FITS` の\n * 説明が SSOT。\n *\n * ## 覆っていない範囲\n *\n * **上だけにはみ出す `shape-` は 9 種を残す**。 何ともぶつからず図の外にも出ないため\n * (`LABEL_NEVER_FITS` の説明を参照)。 箱の外に絵があること自体は直っておらず、 縦線が絵を貫く。\n * 縦線の終点は描画側が箱の下端で決めており、 組み立て側からは変えられない。\n *\n * 10 種のうち `shape-wallet` だけは落とす (#1106)。 上へ 12.1 しか出ないのに絵が潰れて名前と\n * 重なるため = 分ける基準ははみ出し量ではなく「名前が読めるか」。\n *\n * **著者が文字を書いた名札は落とさない**。 小型の `card` は名前しか描かないため、 落とすと\n * 書いた文字が画面から消える。 この保護によって `shape-` は落ちずに残るが、 描画側が絵を箱に\n * 収めるようになったので **下と左右には出ない** (`#1105`、 49 種を実測して 0)。 残るのは上だけで、\n * 上の扱いはこの節の 1 つ目と同じ。\n *\n * `actor` / `function` / `storage` / `event` は `#1066` まで落とす対象だった。 描画側\n * (`cardene777/cdl#416`) が小さい箱で名前を中央に置くようになったので外した = 名前がはみ出す\n * 理由で落とす経路はもう無い。 いま落とすのは `shape-` だけで、 理由は絵のはみ出し。\n */\nfunction dropUnfittableEndKinds(diagram: CdlDiagram, doc: DslDocument): void {\n if (doc.type !== \"sequence\" && doc.type !== \"solidity\") return;\n const ends = new Map<string, CdlDiagram[\"nodes\"]>();\n for (const n of diagram.nodes) {\n if (n.id !== `${n.lane}-header` && n.id !== `${n.lane}-footer`) continue;\n const pair = ends.get(n.lane);\n if (pair === undefined) ends.set(n.lane, [n]);\n else pair.push(n);\n }\n for (const pair of ends.values()) {\n // 著者が書いた文字を持つ名札は落とさない。 小型の `card` は名前しか描かないため、\n // 落とすと書いた文字が画面から消える (`#387` と同じ壊れ方になる)。 これらは上端にしか\n // 載らないため 1 組で見る。\n if (pair.some(hasAuthoredText)) continue;\n const 収まらない = pair.some((n) => {\n // 高さを上げても直らない種別 (#1067)。 高さを見ずに落とす\n if (LABEL_NEVER_FITS.has(n.kind)) return true;\n const need = LABEL_MIN_H[n.kind];\n if (need === undefined) return false;\n // 描画で使う高さを見る。 `posH` が効くのは `posX` と `posY` が揃った node だけ\n // (`layout/nodes.ts`)。 揃っていない node の `posH` を見ると、 描画では使われない値で\n // 判定することになる。\n const h = (n.posX !== undefined && n.posY !== undefined ? n.posH : undefined) ?? n.h;\n // 高さを書いていない名札は描画側の既定 (`NODE_SIZE`、 4 種とも 170 以上) で描かれるので\n // 収まる。 名札は必ず高さを持つため通常ここには来ない。\n return h !== undefined && h < need;\n });\n if (!収まらない) continue;\n for (const n of pair) {\n if (LABEL_NEVER_FITS.has(n.kind) || LABEL_MIN_H[n.kind] !== undefined) n.kind = \"card\";\n }\n }\n}\n\n/**\n * `(from, to)` の一致では取れない preset について、 edge と DSL の行の対応を埋める。\n *\n * `type: flow` は **actor を宣言順に一直線に並べ、 隣り合う actor の間に edge を引く**。\n * n 本目の edge は `actors[n]` から `actors[n+1]` へ向かい、 その label は\n * `doc.flow.find((s) => s.to === actors[n+1].name)` で選ばれる (`compileFlow`)。 そのため\n * `a -> c` / `c -> b` と書いても edge は `a -> b` / `b -> c` になり、 `(from, to)` の一致では\n * 1 件も取れない。\n *\n * **label を選ぶのと同じ規則で引く**。 `slugify` を挟んだ照合にすると、 別の名前が同じ slug に\n * なる形 (`API Gateway` と `api-gateway`) で label の出どころと違う step を返す。\n *\n * **汎用の `(from, to)` 照合が入れた値は上書きする**。 `type: flow` では label の出どころが\n * この規則で決まるので、 こちらが正しい。 上書きしないと、 たまたま `(from, to)` が一致した\n * 別の step の行が残る (実測 = `c -> b: いち` / `a -> b: に` の順で書くと、 edge の label は\n * `いち` なのに `に` の行を返した)。\n *\n * 対応が取れない edge には何も入れない (呼出側が「対応が無い」 と「行 0」 を区別できるように\n * するため、 #998)。\n */\nfunction fillFlowEdgeSources(diagram: CdlDiagram, doc: DslDocument, sourceLines: Map<string, number>): void {\n if (doc.type !== \"flow\") return;\n // animation ありは別経路 (`compileGenericWithAnimate`) で、 鎖の規則が当てはまらない。\n if (doc.animate && doc.animate.phases.length > 0) return;\n diagram.edges.forEach((e, idx) => {\n const to = doc.actors[idx + 1];\n if (to === undefined) return;\n const step = doc.flow.find((s) => s.to === to.name);\n if (step === undefined) return;\n sourceLines.set(e.id, step.pos.line);\n });\n}\n\n/**\n * v0.5+ groups section を topology preset 経由の diagram に container lane として反映。\n * group.lanes に含まれる lane id 集合に対し、 wrap する `group-{id}` lane を contain: true で生成。\n *\n * 簡易実装 ... group container lane を独立 lane として並べ、 lane label に group.label を採用。\n * lane の物理的内包 (子 lane を group container の x 内に再配置) は engine layout に委ねる範囲外なので、\n * 本実装は CdlDiagram 上に「contain: true な group container lane」 を追加する最小骨格に留める。\n */\nfunction applyGroupContainers(diagram: CdlDiagram, doc: DslDocument): void {\n if (!doc.groups || Object.keys(doc.groups).length === 0) return;\n for (const [id, g] of Object.entries(doc.groups)) {\n const containerId = `group-${id}`;\n if (diagram.lanes.some((l) => l.id === containerId)) continue;\n diagram.lanes.push({\n id: containerId,\n width: 800,\n label: g.label ?? id,\n contain: true,\n // 束ねる lane 群に重ねて描く枠。 横に並べる lane ではないので、 engine の間隔調整\n // (lane を詰めた分を幅で埋め合わせる処理) の対象から外す。\n role: \"overlay\",\n });\n }\n}\n\n/**\n * Solidity 専用 preset。\n *\n * 設計:\n * - actors を kind=contract / eoa / multisig 等で配置 (EOA は左、 contract は中央、 storage は右など layered layout)\n * - flow は function call の sequence (msg.sender → contract.fn() → internal call → emit event)\n * - storage 更新は state + rows binding で自動 (kind: storage の actor に rows: [\"bal[A]: {balA}\", ...])\n * - event は kind: event の actor を右端に並べ、 emit edge で発火を表現\n * - revert は tone: error の edge で表現\n *\n * sequence preset を base に使い、 Solidity 文脈に最適化した default を載せる:\n * - default tone: accent (call) / success (emit) / error (revert)\n * - default style: solid (call) / dotted-flow (state-change)\n */\nfunction compileSolidity(doc: DslDocument): CdlDiagram {\n // sequence preset と同等構造で組み立てる、 lane 順は eoa / contract / storage / event の優先順で sort\n const kindOrder: Record<string, number> = {\n eoa: 0,\n actor: 0,\n multisig: 0,\n signer: 0,\n wallet: 0,\n contract: 1,\n proxy: 1,\n library: 1,\n interface: 1,\n storage: 2,\n event: 3,\n };\n const sorted = [...doc.actors].sort(\n (a, b) => (kindOrder[a.kind] ?? 5) - (kindOrder[b.kind] ?? 5),\n );\n // sorted を doc.actors に上書きしてから sequence preset 経由で compile\n const sortedDoc: DslDocument = { ...doc, actors: sorted };\n return compileSequence(sortedDoc);\n}\n\n/**\n * Gantt preset (横棒 timeline 専用 layout)\n *\n * 設計 ... 各 actor = 1 行 (= 1 task) として、 actor.subtitle (\"Q1\" / \"Q2\" / \"Q3\" / \"Q4\") を\n * 横軸 (時間軸) 上の位置にマッピングし、 actor を上下に縦 stack する形で「横棒 timeline」 を\n * 視覚的に作る。\n *\n * 寸法 ... 全体 timeline 幅 1400px / 各 task 横棒 w=280 h=64 / 中央 cx は Q1=200 / Q2=600 /\n * Q3=900 / Q4=1200。\n *\n * 実装 ... 背景 container lane (gantt-timeline) を 1 本 + 各 actor 用個別 lane (lane.x 明示) を\n * 1 本ずつ。 actor の stack は row index で、 全 lane 共通の row cy が layout で計算される。\n * kind: card 強制、 w / h を明示することで Gantt bar の視覚 size を担保。\n *\n * flow は依存関係を edge で表現 (横棒間の矢印)。\n */\nfunction compileGantt(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const CHART_W = 720;\n b.lane(\"gantt\", { width: CHART_W, label: doc.title });\n\n // 目盛りは **書かれた順** に並べる。 以前は `Q1=200 / Q2=600 / ...` の決め打ちで、 Q1-Q4 以外は\n // 全て同じ位置に落ちていた。 順に並べれば月名でも週番号でも同じ規則で置ける\n const 目盛り: string[] = [];\n const 目盛りなし: string[] = [];\n const タスク: { name: string; label: string; tone?: DslDocument[\"actors\"][number][\"tone\"] }[] = [];\n for (const a of doc.actors) {\n const label = (a.value ?? a.subtitle ?? \"\").trim();\n if (label === \"\") {\n 目盛りなし.push(a.name);\n continue;\n }\n if (!目盛り.includes(label)) 目盛り.push(label);\n // 色は帯にそのまま渡す。 箱が 1 つになっても、 書いた色が消えないようにする\n タスク.push({ name: a.name, label, ...(a.tone !== undefined ? { tone: a.tone } : {}) });\n }\n if (目盛りなし.length > 0 && typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[dragon] type: gantt で時期を読めない項目があります (帯に載せません): ${目盛りなし.join(\", \")}。` +\n ` \\`- 設計: \"Q1\"\\` の形で書いてください`,\n );\n }\n\n // 矢印は依存として読む (`- 設計 -> 実装` = 実装は設計の後)。 帯どうしを結ぶ線は描画側が\n // 依存として描くので、 書いた矢印を捨てずに使う。 居ない名前を指した矢印は伝える\n const タスク名 = new Set(タスク.map((t) => t.name));\n const 依存元 = new Map<string, string>();\n const 居ない: string[] = [];\n const 装飾つき: string[] = [];\n for (const s of doc.flow) {\n if (!タスク名.has(s.from) || !タスク名.has(s.to)) {\n 居ない.push(`${s.from} -> ${s.to}`);\n continue;\n }\n 依存元.set(s.to, s.from);\n // 帯の依存は「どちらが先か」 だけを持つ。 矢印に書いた文字や色は描けないので伝える\n if ((s.label ?? \"\") !== \"\" || (s.sub ?? \"\") !== \"\" || s.tone !== undefined || s.style !== undefined) {\n 装飾つき.push(`${s.from} -> ${s.to}`);\n }\n }\n if (居ない.length > 0 && typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[dragon] type: gantt で依存を結べない矢印があります (居ない項目か時期なし): ${居ない.join(\", \")}`,\n );\n }\n if (装飾つき.length > 0 && typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[dragon] type: gantt の矢印は前後の関係だけを使います (文字 / 色 / 線種は描けません): ${装飾つき.join(\", \")}`,\n );\n }\n\n // 高さは件数から決める。 描画側は 1 行 28 以上 + 行間 20 で積み、 上下に 32 / 44 の余白を取る\n // (`kinds/gantt.tsx`)。 360 の固定だと 8 件目から最後の帯が枠の外に出る (実測 = 8 件で 56 はみ出す)\n const CHART_H = Math.max(360, 48 * タスク.length + 96);\n\n b.node(`${slugify(doc.title) || \"gantt\"}-chart`, {\n lane: \"gantt\",\n stack: 0,\n kind: \"gantt-timeline\",\n title: doc.title,\n w: CHART_W,\n h: CHART_H,\n ganttData: タスク.map((t) => {\n const idx = 目盛り.indexOf(t.label);\n const from = 依存元.get(t.name);\n return {\n id: slugify(t.name) || t.name,\n title: t.name,\n startIdx: idx,\n endIdx: idx,\n startLabel: t.label,\n endLabel: t.label,\n ...(from !== undefined ? { dependsOn: slugify(from) || from } : {}),\n ...(t.tone !== undefined ? { tone: t.tone } : {}),\n };\n }),\n });\n\n return b.build();\n}\n\n/**\n * Class preset (UML class diagram 専用 layout)\n *\n * 設計 ... 各 class を 1 storage node として配置、 縦に stack する。 storage node renderer は\n * title (class 名) + divider + rows (fields / methods) を UML class box 風に表示する。\n *\n * 実装 ... 全 class を 1 lane に縦 stack 配置。 actor の kind を強制 storage、 rows / subtitle は\n * applyV05Extensions で node に merge される。\n *\n * flow ... 継承 / 関連を edge で表現 (label に \"extends\" / \"implements\" 等を author が指定)。\n */\nfunction compileClass(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const CLASS_W = 400;\n // 登場人物が 0 人なら枠も作らない。 先に作ると中身の無い枠が 1 つ残る (#1096)\n if (doc.actors.length === 0) return b.build();\n b.lane(\"class-stack\", { width: CLASS_W, label: doc.title });\n\n doc.actors.forEach((a, idx) => {\n const nodeId = slugify(a.name) || `c${idx}`;\n b.node(nodeId, {\n lane: \"class-stack\",\n stack: idx,\n kind: \"storage\",\n title: a.name,\n w: CLASS_W,\n });\n });\n\n for (const s of doc.flow) {\n const fromId = slugify(s.from);\n const toId = slugify(s.to);\n b.edge(fromId, toId, {\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n });\n }\n\n return b.build();\n}\n\n/**\n * Pie preset (円グラフ風 slice list 専用 layout)\n *\n * 設計 ... 円グラフの SVG arc 描画は engine 改修が大きいため、 簡易版として「slice list + value (%) 表示」\n * で代替する。 1 lane に slice を縦並びにし、 value 属性 (例 \"30%\") は applyV05Extensions が\n * node.value に merge することで「[Slice A] 30%」 「[Slice B] 25%」 のような pie chart 意図を伝える。\n *\n * 実装 ... 全 slice を 1 lane に縦 stack。 kind: card 強制、 w=480 h=120。\n *\n * flow は通常なし (slice 間に依存関係はない)、 author 明示時のみ edge を描く。\n */\n/**\n * 割合の書き方から数値を読む。 読めなければ `null`。\n *\n * 受けるのは `\"45%\"` / `\"45\"` / `\"45.5%\"` と、 前後の空白。 `\"四割\"` や `\"0.45\"` のような\n * 別の言い方は読まない = **黙って 0 にすると、 その分だけ欠けた円が「正しい図」 として出る**。\n * 読めなかったことは呼出側が警告に出す。\n */\nfunction parseShareValue(raw: string | undefined): number | null {\n if (raw === undefined) return null;\n const m = raw.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*%?$/);\n if (m === null) return null;\n const v = Number(m[1]);\n return Number.isFinite(v) ? v : null;\n}\n\n/**\n * Pie preset (円グラフ)。\n *\n * 描画側の `chart-pie` に 1 node で渡す。 以前は `card` を縦に積むだけで、 `type: pie` と\n * 書いても円が出ず、 割合が箱の説明文として枠からはみ出していた (実機報告)。\n *\n * 大きさは cdl の `chart()` preset と同じ 640x320 (どちらも格子 16 の倍数)。 lane 幅は\n * `chart()` が使う `gridAlignedLaneW` と同じ計算 = 中身 + 左右の余白 32 ずつ。\n *\n * 値は actor の説明文から読む (`- TypeScript: \"45%\"`)。 読めない actor は円に載せず、\n * まとめて警告に出す。 合計が 100 にならなくても描画側が比で割るので、 こちらでは正規化しない。\n */\nfunction compilePie(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const CHART_W = 640;\n const CHART_H = 320;\n b.lane(\"chart\", { width: CHART_W + 64, label: doc.title });\n\n const data: NonNullable<CdlDiagram[\"nodes\"][number][\"chartData\"]> = [];\n const 読めない: string[] = [];\n for (const a of doc.actors) {\n // 割合の置き場所は記法で 2 通りある。 略記 (`- TypeScript: \"45%\"`) は説明文に、\n // 縦書きの map (`- SliceA: { kind: card, value: \"30%\" }`) は値に入る。 両方を読む\n const value = parseShareValue(a.value ?? a.subtitle);\n if (value === null) {\n 読めない.push(a.name);\n continue;\n }\n // 色は扇にそのまま渡す。 箱が 1 つになっても、 書いた色が消えないようにする\n data.push({ label: a.name, value, ...(a.tone !== undefined ? { tone: a.tone } : {}) });\n }\n if (読めない.length > 0 && typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[dragon] type: pie で割合を読めない項目があります (円に載せません): ${読めない.join(\", \")}。` +\n ` \\`- 名前: \"45%\"\\` の形で書いてください`,\n );\n }\n // 円グラフは扇 1 枚が 1 項目で、 項目どうしを結ぶ線が無い。 書いた矢印は描けないので、\n // 黙って捨てずに伝える (「書いたのに効かない」 を残さない)\n if (doc.flow.length > 0 && typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[dragon] type: pie では矢印を描けません (${doc.flow.length} 本を無視しました)。` +\n ` 関係を描くなら type: flow を使ってください`,\n );\n }\n\n b.node(`${slugify(doc.title) || \"pie\"}-chart`, {\n lane: \"chart\",\n stack: 0,\n kind: \"chart-pie\",\n title: doc.title,\n w: CHART_W,\n h: CHART_H,\n chartData: data,\n });\n\n return b.build();\n}\n\n/**\n * 段の目印を読み取る。 目印と、 それを落とした残りの説明を返す (#1098)。\n *\n * 目印 (`L1` / `L2` / `L3`) は「どの段に置くか」 を組み立てに伝えるためのもので、 読む人には\n * 意味を持たない。 段の名前は枠のラベル (`System Context` 等) が出すので二重でもある。\n * 読み取ったら説明から落とす = 書いた人が説明として書いた部分だけが箱に出る。\n *\n * | 書いた文字 | 段 | 残る説明 |\n * |---|---|---|\n * | `\"L1\"` | 1 | (無し) |\n * | `\"L2: container\"` | 2 | `container` |\n * | `\"L1 利用者\"` | 1 | `利用者` |\n * | `\"利用者\"` | 1 (既定) | `利用者` |\n *\n * 目印の直後の区切り (`:` と空白) も落とす。 残さないと `: container` のように区切りだけが\n * 先頭に残る。 `L2X` のような別の語を目印と読み違えないよう、 数字の直後が英数字でないことを\n * 条件にする。\n */\nfunction 段を読み取る(subtitle: string | undefined): { 段: number; 説明: string | undefined } {\n const 元 = (subtitle ?? \"\").trim();\n const m = 元.match(/^L([123])(?![0-9A-Za-z])/i);\n if (m === null) return { 段: 1, 説明: subtitle };\n // 目印と、 その直後の区切り (`:` / 全角コロン / 空白) を落とす\n const 残り = 元.slice(m[0].length).replace(/^[::\\s]+/, \"\").trim();\n return { 段: Number(m[1]), 説明: 残り === \"\" ? undefined : 残り };\n}\n\n/**\n * C4 preset (C4 model 階層 system context 専用 layout)\n *\n * 設計 ... actor.subtitle の先頭に \"L1\" / \"L2\" / \"L3\" を置き、 階層 lane を生成。\n * - L1 = System Context\n * - L2 = Container\n * - L3 = Component\n *\n * 実装 ... **中身のある段だけ** lane を作り、 使う段を左から順に詰めて横並び (contain: true で\n * 囲む) 配置する。 3 lane を常に作ると中身のない枠が画面に残り、 描かれ損ねたように見える (#1078)。\n * 同 lane 内の actor は内部 stack で縦並びになる (横並びは layout 制約上不可、\n * 段の区別が視覚的に最重要)。 subtitle marker 未指定なら L1 fallback。\n *\n * flow ... actor 間の関係を edge で表現。\n */\nfunction compileC4(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const LANE_W = 400;\n const LANE_GAP = 80;\n const 段の名前: Record<number, string> = { 1: \"System Context\", 2: \"Container\", 3: \"Component\" };\n\n // 段は **先頭一致** で読み、 読んだ目印は説明から落とす (`段を読み取る` の説明を参照)\n const 割当 = doc.actors.map((a, idx) => {\n const { 段, 説明 } = 段を読み取る(a.subtitle);\n return { 段, 説明, id: slugify(a.name) || `n${idx}`, actor: a };\n });\n\n // **中身のある段だけ枠を作る**。 3 段を必ず作ると、 書いていない段が空の点線枠として残り、\n // 見た人には「何かが描かれ損ねた」 ようにしか見えない\n const 使う段 = [1, 2, 3].filter((lv) => 割当.some((x) => x.段 === lv));\n 使う段.forEach((lv, i) => {\n b.lane(`c4-l${lv}`, {\n // 空の段を飛ばした分だけ左に詰める。 飛ばした位置に隙間を残すと、 やはり\n // 「何かが抜けている」 ように見える\n x: i * (LANE_W + LANE_GAP),\n width: LANE_W,\n label: 段の名前[lv]!,\n contain: true,\n });\n });\n\n const stackPerLane: Record<string, number> = { \"c4-l1\": 0, \"c4-l2\": 0, \"c4-l3\": 0 };\n for (const x of 割当) {\n const lid = `c4-l${x.段}`;\n const stack = stackPerLane[lid]!;\n stackPerLane[lid] = stack + 1;\n b.node(x.id, {\n lane: lid,\n stack,\n kind: x.actor.kind,\n title: x.actor.name,\n });\n }\n\n for (const s of doc.flow) {\n const fromId = slugify(s.from);\n const toId = slugify(s.to);\n b.edge(fromId, toId, {\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n });\n }\n\n return b.build();\n}\n\n/**\n * Mind map preset (中央 root + leaf 専用 layout)\n *\n * 設計 ... 1 つ目の actor を root として中央 lane に配置、 残りを leaf として root の左右の\n * lane に交互配置する。 完全な放射状 (8 方向) は実装が大きいので、 簡略実装 layer 1 として\n * left / center (root) / right の 3 lane に leaf を交互配置する。\n *\n * 実装 ... 3 lane (mind-left / mind-center / mind-right)。 root を center に stack=中央 で配置\n * (leaf 数の半分相当の stack で root を中央化)、 leaf を奇数番 → left、 偶数番 → right に分配。\n * kind: card 強制。\n *\n * flow ... 宣言なしなら root → 各 leaf の暗黙 edge を自動生成、 宣言ありならそれを採用。\n */\nfunction compileMind(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const LEAF_W = 280;\n const ROOT_W = 320;\n const GAP = 80;\n\n // 枝は左右に交互に置く。 中身のある枠だけ作る (#1096)。\n //\n // 3 枠を固定で作ると、 枝が 1 本の図で右の枠が中身なしで残る (実測 = 登場人物 2 人で\n // `mind-right` が空)。 見る人には「何かが描かれ損ねた」 ようにしか見えない (`#1078` で\n // `c4` を直したのと同じ欠陥)。\n const 枝の数 = Math.max(0, doc.actors.length - 1);\n const 左に置く数 = Math.ceil(枝の数 / 2);\n const 右に置く数 = 枝の数 - 左に置く数;\n const 左を使う = 左に置く数 > 0;\n const 右を使う = 右に置く数 > 0;\n\n // 登場人物が 0 人なら枠も作らない。 中央の枠を先に作ると、 中身の無い枠が 1 つ残る\n // (実測 = `title` と `type` だけの本文で `mind-center` が空、 Round 1 review の指摘)\n if (doc.actors.length === 0) return b.build();\n\n // 使う枠だけ左から詰める。 飛ばした位置に隙間を残すと、 やはり「抜けている」 ように見える\n let x = 0;\n if (左を使う) {\n b.lane(\"mind-left\", { x, width: LEAF_W, label: \"\" });\n x += LEAF_W + GAP;\n }\n b.lane(\"mind-center\", { x, width: ROOT_W, label: doc.title });\n x += ROOT_W + GAP;\n if (右を使う) {\n b.lane(\"mind-right\", { x, width: LEAF_W, label: \"\" });\n }\n\n const root = doc.actors[0]!;\n const rootId = slugify(root.name) || \"root\";\n const leafCount = doc.actors.length - 1;\n const rootStack = Math.floor(leafCount / 2);\n b.node(rootId, {\n lane: \"mind-center\",\n stack: rootStack,\n kind: \"card\",\n title: root.name,\n w: ROOT_W,\n });\n\n const stackLeft = { v: 0 };\n const stackRight = { v: 0 };\n doc.actors.slice(1).forEach((a, i) => {\n const isLeft = i % 2 === 0;\n const lid = isLeft ? \"mind-left\" : \"mind-right\";\n const counter = isLeft ? stackLeft : stackRight;\n const nodeId = slugify(a.name) || `leaf-${i}`;\n b.node(nodeId, {\n lane: lid,\n stack: counter.v,\n kind: \"card\",\n title: a.name,\n w: LEAF_W,\n });\n counter.v += 1;\n });\n\n if (doc.flow.length === 0 && doc.actors.length > 1) {\n doc.actors.slice(1).forEach((a) => {\n const leafId = slugify(a.name);\n b.edge(rootId, leafId, { label: \"\" });\n });\n } else {\n for (const s of doc.flow) {\n const fromId = slugify(s.from);\n const toId = slugify(s.to);\n b.edge(fromId, toId, {\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n });\n }\n }\n\n return b.build();\n}\n\n/**\n * v0.5+ inline option (subtitle / eyebrow / value / rows / stack / lane) +\n * top-level lanes / viewport / groups を post-process で反映。\n *\n * 設計: preset compile が既に基本 layout を作るので、 後付けで\n * - actor の inline option を該当 node に merge\n * - top-level lanes section の x / width / contain / lifeline / label を該当 lane に merge\n * - viewport の laneWidth (default lane width override) を全 lane に適用\n *\n * これにより v0.5 syntax で 19 機能のうち以下が動く:\n * subtitle / eyebrow / value / rows / contain / lifeline / label / lane.x / lane.width / laneWidth\n */\nfunction applyV05Extensions(diagram: CdlDiagram, doc: DslDocument): CdlDiagram {\n // actor の主要 node を preset 種別で回収する。 sequence / solidity は header/footer を対で生成する\n // preset で主要 node は header、 それ以外の preset は actor 名 slug がそのまま node id になる。\n //\n // seq-like の非 animate 経路は実 node id を CDL preset 側 slugify (`_` → `-` 置換 + 全角正規化) で\n // 生成する。 dragon slugify (`_` / 全角 保持) で `{slug}-header` を決め打つと、 actor `A_B` の\n // primaryNodeId `a_b-header` が実 node `a-b-header` と食い違い、 inline option (subtitle / eyebrow /\n // value / rows) が drop する (#881、 #873 / #877 と同根の dragon⇔CDL slug 不一致)。 lane.label は\n // 両 slug 経路とも actor.name の生値なので (#877)、 actor 専用 lane を label 一致で引き当て、 その\n // lane 内の `-header` node を権威 primary として回収する。 slug 決め打ちを廃して実装差を構造的に吸収。\n //\n // 経路を preset 種別 (isSeqLike) で分け、 かつ lane.label / node id を actor.name の exact 一致で\n // 引くことで、 actor 名 \"A Header\" の slug `a-header` が actor \"A\" の node に漏れる cross-actor leak\n // (#879) も同時に断つ。\n const isSeqLike = doc.type === \"sequence\" || doc.type === \"solidity\";\n // actor inline option → node merge\n for (const a of doc.actors) {\n const dragonSlug = slugify(a.name);\n let primaryNodes: CdlDiagram[\"nodes\"];\n if (isSeqLike) {\n const ownedLaneIds = new Set(\n diagram.lanes.filter((l) => l.label === a.name).map((l) => l.id),\n );\n // lane.label で actor 専用 lane を引けた場合はその lane の header node を回収する。 引けない\n // (label 未設定等の) preset は従来どおり dragon slug の `{slug}-header` 決め打ちに fallback する。\n //\n // header node id は `{laneId}-header` の構造。 `endsWith(\"-header\")` で判定すると step box\n // `s{idx}-{laneId}` が actor 名末尾 \"Header\" (slug `...-header`) で誤マッチし、 option が invisible\n // な step anchor にも copy される (cc-codex #883 MAJOR)。 lane id との構造 exact 一致で header だけを\n // 引くことで step box / spacer / footer を排除する。\n primaryNodes = ownedLaneIds.size > 0\n ? diagram.nodes.filter((n) => ownedLaneIds.has(n.lane) && n.id === `${n.lane}-header`)\n : diagram.nodes.filter((n) => n.id === `${dragonSlug}-header`);\n } else {\n // 非 seq preset は 1 actor = 1 node (id = dragon slug) で node id と dragon slug が一致する。\n primaryNodes = diagram.nodes.filter((n) => n.id === dragonSlug);\n }\n for (const node of primaryNodes) {\n // `type: c4` では説明の先頭に段の目印 (`L1` / `L2` / `L3`) を書く。 目印は組み立てに\n // 段を伝えるためのもので読む人に意味を持たず、 段の名前は枠のラベルが既に出している。\n // ここで落とさないと、 組み立てが読み取った目印がそのまま箱の説明として出る (#1098)\n const 説明 = doc.type === \"c4\" ? 段を読み取る(a.subtitle).説明 : a.subtitle;\n if (説明 !== undefined) node.subtitle = 説明;\n if (a.eyebrow !== undefined) node.eyebrow = a.eyebrow;\n if (a.value !== undefined) node.value = a.value;\n if (a.rows !== undefined) node.rows = a.rows;\n // seq-like preset の header / footer は kind を card 固定で作る。 書いた kind を載せる\n // (#975)。 載せないと「書いたのに効かない項目」 が残り、 `rows` を書いた時は行が card に\n // 付いて画面から消える (#387、 cdl 側 Axis 67 rows-not-rendered が検知する)。\n //\n // 以前は「行を描く kind かつ rows あり」 に絞っていた。 header の見た目を kind ごとに\n // 変えると読み方が変わることを懸念したためだが、 **書いたとおりにならない方が読み手を\n // 惑わせる**。 見本 412 図で影響を受けるのは 1 図 (4 actor) だけと実測した。\n // 書いた種別を名札に載せる。 描画側に無い語は意味の近い形に読み替える (#975)。\n //\n // **書いた時だけ載せる** (#1058)。 `kind` は書かなくても既定の `actor` が入るため、\n // 値だけを見ると「書かなかった」 が「`actor` と書いた」 に化ける。 名札は小型の箱\n // (`h: 72`) で作られ、 描画側は `card` に小型用の分岐を持つが `actor` には無い。\n // 既定値で上書きすると小型の分岐が外れ、 名前の文字が箱の下端をはみ出す。\n //\n // 判定は `!== false` で行う。 記法の parse は書かなかった時に `false` を明示するので\n // これで区別できる。 `=== true` にすると、 **記法を通さず `DslActor` を直接組み立てて\n // `compileToCdl()` を呼ぶ経路** (公開 API) が既定の `undefined` で全て「書かなかった」\n // に倒れ、 書いた種類が消える (#975 の挙動が壊れる)。\n const drawn = isSeqLike && a.kindWritten !== false ? drawableKind(a.kind) : undefined;\n if (drawn !== undefined) {\n node.kind = drawn as typeof node.kind;\n // 下端の名札も同じ形にする。 上下で形が違うと、 同じ登場人物が別物に見える。\n // `rows` は上端にだけ載る (`primaryNodes` が上端しか拾わない) ので、 行は 2 度出ない。\n const footer = diagram.nodes.find((n) => n.id === `${node.lane}-footer`);\n if (footer) footer.kind = drawn as typeof node.kind;\n }\n // 行を書いた時は枠に収まる高さと幅にする。 header は w / h を固定値で作られ、 cdl 側は\n // `n.w` / `n.h` を明示した node の自動拡張を尊重する (著者指定を壊さない) 設計なので、\n // preset が置いた固定値がそのまま残る。\n //\n // 必要な寸法は cdl の SSOT (`requiredRowsHeight` / `requiredRowsWidth`) から引く。\n // 式を dragon 側に写すと、 描画を変えた時に片方だけ古くなる。\n if (isSeqLike && a.rows !== undefined && a.rows.length > 0 && rendersRows(a.kind)) {\n node.h = Math.max(node.h ?? 0, requiredRowsHeight(a.kind, a.rows.length) ?? 0);\n // **種別も渡す**。 省くと cdl 側は「どちらで描かれるか分からない」 として広い方を返す\n // ため、 実際に描かれる書式より名札が広くなる。 高さと同じく種別を渡す。\n //\n // 差が出るのは比例の書式の方が広くなる行 = 比例は 1 字の最大が字の大きさの 1.038 倍\n // (`W`) で 18 なら 18.7、 等幅の 26 は 1 字 15.6。 実測 = `W` を 10 個並べた行を持つ\n // `storage` の名札が、 種別なしで 268 / 種別あり で 256。\n node.w = Math.max(node.w ?? 0, requiredRowsWidth(a.rows, a.kind));\n }\n // 名札の大きさも書いたとおりにする (#975)。 縦線の位置は `位置:` の x が lane に効く\n // (実測) が、 大きさはどこにも載っていなかった。\n //\n // 高さは指定をそのまま使わず、 揃える側 (`alignSeqHeaderHeights`) に渡す候補にする。\n // 1 本だけ高い名札を作ると、 縦線の始まる位置がばらける。\n if (isSeqLike) {\n // 書いた値をそのまま使う。 大きい方を採ると、 縮める指定 (`大きさ: 80,60`) が効かない。\n if (a.posW !== undefined) node.w = a.posW;\n if (a.posH !== undefined) node.h = a.posH;\n const footer = diagram.nodes.find((n) => n.id === `${node.lane}-footer`);\n if (footer && a.posW !== undefined) footer.w = a.posW;\n }\n }\n }\n // 名札の高さを揃える。 kind ごとに高さが変わると縦線の始まる位置がばらけ、 順序図の\n // 「同じ高さから下りる」 読み方が崩れる (実測 = 行を持つ名札だけ 134px 下にずれた)。\n alignSeqHeaderHeights(diagram, doc);\n // 揃えた後の高さで、 絵が箱に収まらない `shape-` を名札から外す (#1061 / #1067、 #1066 で\n // 4 種を対象から外した)。 揃えは高さを上げる方向にしか動かないので、 ここで見れば\n // 「行を書いた図では書いた種別が残る」 が成立する。\n dropUnfittableEndKinds(diagram, doc);\n // v0.5+ animation phase 後段注入 (CAR-1657 fix、 元 dragon PR #413 report user)。\n // preset (class / pie / c4 / mind / gantt) が doc.animate を無視して build するケースを補償。\n // 既に preset が phase を生成済 (sequence / flow / swimlane / er / state / topology 経由 = compileGenericWithAnimate) なら skip。\n // doc に phase 指定があって diagram.phases が空なら、 preset 由来 lane/node/edge に対して generic phase を注入する。\n if (doc.animate && doc.animate.phases.length > 0 && diagram.phases.length === 0) {\n injectPhasesFallback(diagram, doc);\n }\n // top-level lanes section → lane merge\n if (doc.lanes) {\n for (const [id, laneOpt] of Object.entries(doc.lanes)) {\n const lane = diagram.lanes.find((l) => l.id === id);\n if (lane) {\n if (laneOpt.x !== undefined) lane.x = laneOpt.x;\n if (laneOpt.width !== undefined) lane.width = laneOpt.width;\n if (laneOpt.label !== undefined) lane.label = laneOpt.label;\n if (laneOpt.contain !== undefined) lane.contain = laneOpt.contain;\n if (laneOpt.lifeline !== undefined) lane.lifeline = laneOpt.lifeline;\n } else {\n // lane が preset で作られていなければ新規追加\n diagram.lanes.push({\n id,\n x: laneOpt.x ?? 0,\n width: laneOpt.width ?? 320,\n label: laneOpt.label,\n contain: laneOpt.contain,\n lifeline: laneOpt.lifeline,\n });\n }\n }\n }\n // viewport.laneWidth → 全 lane width に override\n if (doc.viewport?.laneWidth !== undefined) {\n for (const lane of diagram.lanes) {\n lane.width = doc.viewport.laneWidth;\n }\n }\n // viewport.width / height / gap / laneGap / nodeGap / scale / labelMargin → CdlDiagram.viewport に集約\n if (doc.viewport) {\n diagram.viewport = {\n ...(diagram.viewport ?? {}),\n ...(doc.viewport.width !== undefined ? { width: doc.viewport.width } : {}),\n ...(doc.viewport.height !== undefined ? { height: doc.viewport.height } : {}),\n ...(doc.viewport.gap !== undefined ? { gap: doc.viewport.gap } : {}),\n ...(doc.viewport.laneGap !== undefined ? { laneGap: doc.viewport.laneGap } : {}),\n ...(doc.viewport.nodeGap !== undefined ? { nodeGap: doc.viewport.nodeGap } : {}),\n ...(doc.viewport.scale !== undefined ? { scale: doc.viewport.scale } : {}),\n ...(doc.viewport.labelMargin !== undefined ? { labelMargin: doc.viewport.labelMargin } : {}),\n };\n }\n return diagram;\n}\n\n/**\n * v0.5+ animation phase 後段 fallback 注入 (CAR-1657)。\n *\n * class / pie / c4 / mind / gantt preset は独自 layout を持ち、 compileGenericWithAnimate 経路に\n * 乗らないため、 doc.animate.phases があっても diagram.phases が空になる。\n * 本 helper が applyV05Extensions から呼ばれて post-hoc に phase を差込む、 lane/node/edge は\n * 既存 preset 出力を保持したまま animation だけ追加する。\n *\n * highlight resolution = actor 名 = slugify → diagram.nodes.id 対応、 edge の \"A -> B\" は\n * from/to の slug で 1:1 対応する edge を検索。 preset 由来 edge id は各種 (`e-{from}-{to}` /\n * `e{idx}-{fromId}-{toId}` 等) 揺れがあるため、 (edge.from === slug(A) && edge.to === slug(B))\n * で辞書 lookup せず走査で解決する。\n */\nfunction injectPhasesFallback(diagram: CdlDiagram, doc: DslDocument): void {\n if (!doc.animate) return;\n\n // states 反映 (未登録なら追加、 既存は上書きしない)。 CdlState は id field (name ではない)。\n const existingStateIds = new Set(diagram.states.map((s) => s.id));\n for (const st of doc.animate.states) {\n if (!existingStateIds.has(st.name)) {\n diagram.states.push({ id: st.name, initial: st.initial });\n }\n }\n\n // highlight 解決関数 = actor 名 or \"A -> B\" / \"A → B\" を node.id / edge.id に変換。\n // codex-review CAR-1659 MAJOR fix = 全角矢印 `→` を対応 (generic 経路との互換)、\n // 同 from/to で複数 edge がある場合は全件 activate (`.find` → filter loop)。\n // 実在する名前。 矢印を含む名前 (`\"A -> B\"`) を矢印と読み違えないために渡す\n const knownNames = new Set(doc.actors.map((a) => a.name));\n // 図全体を 1 つの箱で描く種類は、 登場人物ごとの箱を持たない。\n // 箱が 1 つの時だけ対象にする = 2 つ以上あるとどれを指したのか決められない\n const singleBoxNodes = diagram.nodes.filter((n) => SINGLE_BOX_KINDS.has(String(n.kind)));\n const singleBoxNode = singleBoxNodes.length === 1 ? singleBoxNodes[0] : undefined;\n const resolveIds = (highlight: readonly string[]): string[] => {\n const out: string[] = [];\n for (const h of highlight) {\n const entry = parseFocusEntry(h, knownNames);\n if (entry.kind === \"edge\") {\n const fromSlug = slugify(entry.from);\n const toSlug = slugify(entry.to);\n let 見つかった = false;\n for (const e of diagram.edges) {\n if (e.from === fromSlug && e.to === toSlug) {\n out.push(e.id);\n 見つかった = true;\n }\n }\n // 線を持たない種類 (帯の依存等) では矢印が edge にならない。 両端が実在するなら\n // その箱を光らせる = 矢印を指した段で何も光らないより意図に近い (#1077)\n if (!見つかった && singleBoxNode !== undefined && knownNames.has(entry.from) && knownNames.has(entry.to)) {\n out.push(singleBoxNode.id);\n }\n continue;\n }\n const nodeSlug = slugify(entry.name);\n const node = diagram.nodes.find((n) => n.id === nodeSlug || n.id === `${nodeSlug}-header`);\n if (node) {\n out.push(node.id);\n continue;\n }\n // 図全体が 1 つの箱になる種類 (円グラフ等) では、 登場人物ごとの箱が無い。 名前で\n // 指しても解決できず、 書いた `focus:` が丸ごと消える (#1076 で pie を 1 箱にした時に\n // 発生)。 **書いた名前が実在するなら、 その箱を光らせる** = 何も光らないより意図に近い。\n // 実在しない名前は従来どおり無視する (綴り誤りを黙って光らせない)\n if (knownNames.has(entry.name) && singleBoxNode !== undefined) out.push(singleBoxNode.id);\n }\n // 同じ箱を複数回指した時に重複させない (円グラフで 4 人を指すと 4 回入る)\n return [...new Set(out)];\n };\n\n // phase 注入。 CdlPhase.tweens[].stateId / sets[].stateId で state 参照 (state ではない)。\n for (const p of doc.animate.phases) {\n const activateIds: string[] = [...resolveIds(p.highlight ?? [])];\n diagram.phases.push({\n id: slugify(p.name) || p.name,\n duration: p.durationMs,\n title: p.name,\n body: p.body ?? \"\",\n activate: activateIds,\n tweens: (p.tweens ?? []).map((t) => ({ stateId: t.state, from: t.from, to: t.to })),\n sets: (p.sets ?? []).map((s) => ({ stateId: s.state, value: s.value })),\n ...(p.badge ? { badge: p.badge } : {}),\n });\n }\n}\n\nfunction compileSequence(doc: DslDocument): CdlDiagram {\n // v0.3 ... アニメーション 有無で経路を分岐。\n // 有り = builder 直接経路で state / 複数 phase を注入。\n // 無し = v0.2 と同じく sequence preset の標準 phase を採用。\n if (doc.animate && doc.animate.phases.length > 0) {\n return compileSequenceWithAnimate(doc);\n }\n const seqBuilder = sequence({\n id: slugify(doc.title),\n topic: doc.title,\n actors: doc.actors.map((a) => a.name),\n });\n for (const s of doc.flow) {\n seqBuilder.step({\n from: s.from,\n to: s.to,\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n });\n }\n return seqBuilder.build();\n}\n\n/**\n * v0.3 ... アニメーション full compile (sequence 向け)。\n * sequence preset と同じ構造 (lane / header / spacer / step box / footer) を builder 直接で組み立て、\n * 標準の 1 phase を DSL の複数 phase に置き換える。\n *\n * 標準 phase 1 個 → DSL phases N 個に展開。\n * state / tween / set / badge / body / highlight 全反映。\n */\nfunction compileSequenceWithAnimate(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const laneW = 340;\n\n // actor 名 → lane id / header / footer / spacer の slug 生成 (sequence preset と整合)\n const actorIds = new Map<string, string>();\n const headerNodeIds: string[] = [];\n doc.actors.forEach((a, i) => {\n const id = slugify(a.name) || `actor-${i}`;\n actorIds.set(a.name, id);\n actorIds.set(id, id);\n // canvas pivot 新 spec = actor.posX/posY set 済なら CDL layout skip 経路に流す。\n // sequence preset の lane はここで生成、 posW/posH は lane 全体の rect を上書き。\n const laneOpts: Parameters<typeof b.lane>[1] = { width: laneW, label: a.name, lifeline: true };\n if (a.posX !== undefined && a.posY !== undefined) {\n laneOpts.posX = a.posX;\n laneOpts.posY = a.posY;\n if (a.posW !== undefined) laneOpts.posW = a.posW;\n if (a.posH !== undefined) laneOpts.posH = a.posH;\n }\n b.lane(id, laneOpts);\n const headerId = `${id}-header`;\n // header/footer 幅を title 長に応じて auto-size (text-readability warning 解消)。\n // formula = 22px/char + 52px padding (visualValidate text-readability と完全一致)、 min 140 で従来 sample 互換維持。\n const actorW = Math.max(140, a.name.length * 22 + 52);\n b.node(headerId, { lane: id, stack: 0, kind: \"card\", title: a.name, w: actorW, h: 72 });\n headerNodeIds.push(headerId);\n const spacerId = `${id}-spacer`;\n b.node(spacerId, { lane: id, stack: 1, kind: \"card\", title: \"\", w: 2, h: 40 });\n });\n\n // step boxes (sequence preset と同じ命名 ... `s${idx}-${laneId}` / `e${idx}-${from}-${to}`)\n // step ごとに DSL flow item に対応、 actor 名 → lane id の slugify を活用。\n const stepEdgeIds: string[] = [];\n doc.flow.forEach((s, idx) => {\n const fromLaneId = actorIds.get(s.from) ?? s.from;\n const toLaneId = actorIds.get(s.to) ?? s.to;\n const stack = idx + 2;\n const fromBoxId = `s${idx}-${fromLaneId}`;\n const toBoxId = `s${idx}-${toLaneId}`;\n b.node(fromBoxId, { lane: fromLaneId, stack, kind: \"card\", title: \"\", w: 2, h: 2 });\n if (fromLaneId !== toLaneId) {\n b.node(toBoxId, { lane: toLaneId, stack, kind: \"card\", title: \"\", w: 2, h: 2 });\n }\n const edgeId = `e${idx}-${fromLaneId}-${toLaneId}`;\n b.edge(fromBoxId, fromLaneId === toLaneId ? fromBoxId : toBoxId, {\n id: edgeId,\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n ...(s.guard ? { guard: s.guard } : {}),\n ...(s.cardinality ? { cardinality: s.cardinality } : {}),\n ...(s.labelOffsetX !== undefined ? { labelOffsetX: s.labelOffsetX } : {}),\n ...(s.labelOffsetY !== undefined ? { labelOffsetY: s.labelOffsetY } : {}),\n });\n stepEdgeIds.push(edgeId);\n });\n\n // footer (sequence preset と整合)\n const footerStack = doc.flow.length + 2;\n doc.actors.forEach((a) => {\n const laneId = actorIds.get(a.name) ?? slugify(a.name);\n const footerId = `${laneId}-footer`;\n const actorW = Math.max(140, a.name.length * 22 + 52);\n b.node(footerId, { lane: laneId, stack: footerStack, kind: \"card\", title: a.name, w: actorW, h: 72 });\n });\n\n // state を builder に登録\n for (const st of doc.animate!.states) {\n b.state(st.name, { initial: st.initial });\n }\n\n // phase を順次注入 ... highlight / tween / set / badge / body 全反映\n for (const p of doc.animate!.phases) {\n b.phase(\n slugify(p.name) || p.name,\n {\n duration: p.durationMs,\n title: p.name,\n body: p.body ?? \"\",\n },\n (pb) => {\n // highlight ... DSL の name (actor 名 or \"from→to\") を実 id に解決\n const activateIds = resolveHighlight(p, doc, actorIds, stepEdgeIds);\n if (activateIds.length > 0) {\n pb.activate(...activateIds);\n }\n // tween\n for (const t of p.tweens ?? []) {\n pb.tween(t.state, t.from, t.to);\n }\n // set\n for (const s of p.sets ?? []) {\n pb.set(s.state, s.value);\n }\n // badge\n if (p.badge) {\n pb.badge(p.badge);\n }\n return pb;\n },\n );\n }\n\n return b.build();\n}\n\n/**\n * DSL の highlight item (actor 名 or \"A→B\" or \"A-B\" 等) を実 node/edge id に解決する。\n */\nfunction resolveHighlight(\n phase: DslPhase,\n doc: DslDocument,\n actorIds: Map<string, string>,\n _stepEdgeIds: string[],\n): string[] {\n const out: string[] = [];\n const knownNames = new Set(actorIds.keys());\n for (const raw of phase.highlight ?? []) {\n const entry = parseFocusEntry(raw, knownNames);\n // 矢印つき → 該当 step edge を全部探して active\n if (entry.kind === \"edge\") {\n const fromLaneId = actorIds.get(entry.from) ?? slugify(entry.from);\n const toLaneId = actorIds.get(entry.to) ?? slugify(entry.to);\n // 該当 edge を flow から検索\n doc.flow.forEach((s, idx) => {\n const sFromId = actorIds.get(s.from) ?? slugify(s.from);\n const sToId = actorIds.get(s.to) ?? slugify(s.to);\n if (sFromId === fromLaneId && sToId === toLaneId) {\n out.push(`e${idx}-${fromLaneId}-${toLaneId}`);\n }\n });\n // 関連する step box も active 化\n const stackIdx = doc.flow.findIndex((s) => {\n const sFromId = actorIds.get(s.from) ?? slugify(s.from);\n const sToId = actorIds.get(s.to) ?? slugify(s.to);\n return sFromId === fromLaneId && sToId === toLaneId;\n });\n if (stackIdx >= 0) {\n out.push(`s${stackIdx}-${fromLaneId}`);\n if (fromLaneId !== toLaneId) out.push(`s${stackIdx}-${toLaneId}`);\n }\n continue;\n }\n // actor 名 → header + footer + 全 step box を active\n const laneId = actorIds.get(entry.name) ?? slugLookup(actorIds, entry.name);\n if (laneId) {\n out.push(`${laneId}-header`);\n out.push(`${laneId}-footer`);\n // この lane の全 step box\n doc.flow.forEach((s, idx) => {\n const sFromId = actorIds.get(s.from) ?? slugify(s.from);\n const sToId = actorIds.get(s.to) ?? slugify(s.to);\n if (sFromId === laneId || sToId === laneId) {\n out.push(`s${idx}-${laneId}`);\n }\n });\n }\n }\n return out;\n}\n\n/**\n * 名前が見つからない時に、 slug の形でも探す。\n *\n * 記法は表示名で書くが、 書く人は id の形 (`api-gateway`) で書くこともある。 図種によって\n * 受理する / しないが分かれると、 同じ記述が別の意味になる。\n *\n * 2 つ以上の名前が同じ slug になる時は解決しない。 どちらを指したか決められないため、\n * 黙ってどちらかを選ぶより光らせない方が書いた人が気付ける。\n */\nfunction slugLookup(byName: ReadonlyMap<string, string>, wanted: string): string | undefined {\n let hit: string | undefined;\n for (const [name, id] of byName) {\n if (slugify(name) !== wanted) continue;\n if (hit !== undefined) return undefined;\n hit = id;\n }\n return hit;\n}\n\nfunction compileFlow(doc: DslDocument): CdlDiagram {\n // v0.4 ... animation あり時 builder 直接経路で複数 phase 注入\n if (doc.animate && doc.animate.phases.length > 0) {\n return compileGenericWithAnimate(doc, { kind: \"flow\", laneId: \"main\", laneWidth: 400 });\n }\n // 登場人物が 0 人なら枠も作らない。 描画側の `flow()` は枠を必ず 1 つ作るため、 そのまま\n // 通すと中身の無い枠が残る (実測 = `title` と `type` だけの本文で枠 `flow` が空)。\n // 枠を持たない図として返す = `swimlane` / `c4` が 0 人で枠 0 になるのと揃う\n if (doc.actors.length === 0) {\n return diagram(slugify(doc.title), { topic: doc.title }).build();\n }\n // flow preset は actors を順に step として配置、 step 間に edge auto\n const flowBuilder = flow({\n id: slugify(doc.title),\n topic: doc.title,\n });\n // 各 actor を step として登録、 edge label は流れ から拾う\n for (let i = 0; i < doc.actors.length; i++) {\n const a = doc.actors[i]!;\n // 直前の step との edge label = この actor を to に持つ flow から拾う\n const incomingEdge = doc.flow.find((s) => s.to === a.name);\n const edgeLabel = incomingEdge?.label;\n flowBuilder.step(\n {\n id: slugify(a.name) || `n${i}`,\n kind: a.kind,\n title: a.name,\n },\n edgeLabel,\n );\n }\n return flowBuilder.build();\n}\n\nfunction compileSwimlane(doc: DslDocument): CdlDiagram {\n // v0.4 ... animation あり時 builder 直接経路 (各 actor 別 lane で配置)\n if (doc.animate && doc.animate.phases.length > 0) {\n return compileGenericWithAnimate(doc, { kind: \"swimlane\", laneWidth: 400 });\n }\n // swimlane preset は lane 配置 + 自由 node/edge。\n // v0.2 では actors を lane 化、 流れ の各 step から node を生成、 edge を引く。\n const swim = swimlane({\n id: slugify(doc.title),\n topic: doc.title,\n lanes: doc.actors.map((a) => a.name),\n });\n\n // 各 step で from / to の node を lane 内 stack 配置\n const placedNodes = new Set<string>();\n const laneStackCount = new Map<string, number>();\n let edgeIdx = 0;\n\n for (const s of doc.flow) {\n for (const actorName of [s.from, s.to]) {\n if (placedNodes.has(actorName)) continue;\n const laneId = swim.laneId(actorName);\n const actor = doc.actors.find((a) => a.name === actorName);\n const stack = laneStackCount.get(laneId) ?? 0;\n const nodeId = slugify(actorName) || `n${placedNodes.size}`;\n swim.node(nodeId, {\n lane: laneId,\n stack,\n kind: actor?.kind ?? \"actor\",\n title: actorName,\n });\n laneStackCount.set(laneId, stack + 1);\n placedNodes.add(actorName);\n }\n const fromId = slugify(s.from);\n const toId = slugify(s.to);\n swim.edge(fromId, toId, {\n id: `e${edgeIdx++}-${fromId}-${toId}`,\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n ...(s.guard ? { guard: s.guard } : {}),\n ...(s.cardinality ? { cardinality: s.cardinality } : {}),\n ...(s.labelOffsetX !== undefined ? { labelOffsetX: s.labelOffsetX } : {}),\n ...(s.labelOffsetY !== undefined ? { labelOffsetY: s.labelOffsetY } : {}),\n });\n }\n return swim.build();\n}\n\nfunction compileEr(doc: DslDocument): CdlDiagram {\n // v0.4 ... animation あり時 builder 直接経路 (entity を box として配置)\n if (doc.animate && doc.animate.phases.length > 0) {\n // 460 は preset 側の旧既定に合わせた値だった。 preset が箱 400 + 余白 25 × 2 = 450 を\n // 宣言するようになった (cardene777/cdl#359) ので、 同じ図が animate の有無で 10 world\n // ずれないようここも 450 にする。\n return compileGenericWithAnimate(doc, { kind: \"er\", laneWidth: 450 });\n }\n // er preset ... actors を entity に、 流れ を relation に\n const erBuilder = er({\n id: slugify(doc.title),\n topic: doc.title,\n });\n for (const a of doc.actors) {\n // entity rows は DSL では宣言できないので、 actor 名のみ entity 化\n // v0.3 で「列定義」 ブロックを追加検討\n erBuilder.entity({\n id: slugify(a.name) || a.name,\n title: a.name,\n rows: [], // v0.2 では rows なし\n });\n }\n for (const s of doc.flow) {\n erBuilder.relation({\n from: slugify(s.from),\n to: slugify(s.to),\n cardinality: parseCardinalityFromLabel(s.label) ?? \"1:N\",\n label: stripCardinality(s.label),\n ...(s.tone ? { tone: s.tone } : {}),\n });\n }\n return erBuilder.build();\n}\n\nfunction compileState(doc: DslDocument): CdlDiagram {\n // v0.4 ... animation あり時 builder 直接経路 (各 state を lane で配置、 transition を edge)\n if (doc.animate && doc.animate.phases.length > 0) {\n return compileGenericWithAnimate(doc, { kind: \"state\", laneWidth: 360 });\n }\n // stateMachine preset ... actors を state に、 流れ を transition に\n const fsm = stateMachine({\n id: slugify(doc.title),\n topic: doc.title,\n });\n for (let i = 0; i < doc.actors.length; i++) {\n const a = doc.actors[i]!;\n // 初期 / 最終 は (initial) / (final) を kind 部分に書く慣習、 もしくは順序で決め打ち\n const initial = i === 0;\n const final = i === doc.actors.length - 1 && doc.actors.length > 1;\n fsm.state({\n id: slugify(a.name) || `s${i}`,\n title: a.name,\n ...(initial ? { initial: true } : {}),\n ...(final ? { final: true } : {}),\n });\n }\n for (const s of doc.flow) {\n fsm.transition({\n from: slugify(s.from),\n to: slugify(s.to),\n trigger: s.label,\n ...(s.sub ? { guard: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n });\n }\n return fsm.build();\n}\n\nfunction compileTopology(doc: DslDocument): CdlDiagram {\n // v0.4 ... animation あり時 builder 直接経路 (各 actor を別 lane に)\n if (doc.animate && doc.animate.phases.length > 0) {\n return compileGenericWithAnimate(doc, { kind: \"topology\", laneWidth: 460 });\n }\n // 登場人物が 0 人なら枠も作らない。 描画側の `topology()` は枠を必ず 1 つ作るため、 そのまま\n // 通すと中身の無い枠が残る (#1096)\n if (doc.actors.length === 0) {\n return diagram(slugify(doc.title), { topic: doc.title }).build();\n }\n // topology preset ... actors を 1 つの group 内 container として配置\n // v0.3 で「group」 ブロックを追加して複数 group 対応検討\n const topo = topology({\n id: slugify(doc.title),\n topic: doc.title,\n });\n const groupId = \"main\";\n const groupBuilder = topo.group(groupId, { label: doc.title });\n for (const a of doc.actors) {\n groupBuilder.add({\n id: slugify(a.name) || a.name,\n kind: a.kind,\n title: a.name,\n });\n }\n for (const s of doc.flow) {\n topo.connect(slugify(s.from), slugify(s.to), {\n label: s.label,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n });\n }\n return topo.build();\n}\n\n/**\n * v0.4 ... 5 preset (flow / swimlane / er / state / topology) 共通 animation compile。\n * sequence preset と異なり header / footer / step box 構造はない、 シンプルな lane + node + edge 構造。\n * preset kind ごとに lane 配置と layout を切替。\n */\ntype GenericKind = \"flow\" | \"swimlane\" | \"er\" | \"state\" | \"topology\";\n\ntype GenericOpts = {\n kind: GenericKind;\n /** flow / topology は 1 lane に全 actor、 swimlane / state は actor ごと lane */\n laneId?: string;\n laneWidth: number;\n};\n\nfunction compileGenericWithAnimate(doc: DslDocument, opts: GenericOpts): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { kind, laneWidth } = opts;\n\n // lane / node 配置 ... preset kind に応じて切替\n const actorToNodeId = new Map<string, string>();\n if (kind === \"flow\" || kind === \"topology\") {\n // 1 lane に全 actor を縦 stack\n const lid = opts.laneId ?? \"main\";\n b.lane(lid, { width: laneWidth, label: doc.title, ...(kind === \"topology\" ? { contain: true } : {}) });\n doc.actors.forEach((a, idx) => {\n const id = slugify(a.name) || `n${idx}`;\n actorToNodeId.set(a.name, id);\n b.node(id, { lane: lid, stack: idx, kind: a.kind, title: a.name });\n });\n } else {\n // swimlane / er / state ... actor ごとに 1 lane (横並び)\n doc.actors.forEach((a, idx) => {\n const lid = `lane-${slugify(a.name) || idx}`;\n b.lane(lid, { width: laneWidth, label: a.name });\n const id = slugify(a.name) || `n${idx}`;\n actorToNodeId.set(a.name, id);\n // er は entity、 state は initial/final marker、 swimlane はそのまま actor\n const isInitial = kind === \"state\" && idx === 0;\n const isFinal = kind === \"state\" && idx === doc.actors.length - 1 && doc.actors.length > 1;\n b.node(id, {\n lane: lid,\n stack: 0,\n kind: a.kind,\n title: a.name,\n ...(isInitial ? { eyebrow: \"初期\" } : {}),\n ...(isFinal ? { eyebrow: \"最終\" } : {}),\n });\n });\n }\n\n // edge ... flow の各 step を edge として登録\n const edgeIds: string[] = [];\n doc.flow.forEach((s, idx) => {\n const fromId = actorToNodeId.get(s.from) ?? slugify(s.from);\n const toId = actorToNodeId.get(s.to) ?? slugify(s.to);\n const edgeId = `e${idx}-${fromId}-${toId}`;\n // ER preset では cardinality を label に \"(1:N)\" 形式で併記、 他 preset は label そのまま。\n const labelWithCard =\n kind === \"er\" && s.cardinality && !s.label.includes(s.cardinality)\n ? s.label\n ? `${s.label} (${s.cardinality})`\n : `(${s.cardinality})`\n : s.label;\n b.edge(fromId, toId, {\n id: edgeId,\n label: labelWithCard,\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\n ...(s.guard ? { guard: s.guard } : {}),\n ...(s.cardinality ? { cardinality: s.cardinality } : {}),\n ...(s.labelOffsetX !== undefined ? { labelOffsetX: s.labelOffsetX } : {}),\n ...(s.labelOffsetY !== undefined ? { labelOffsetY: s.labelOffsetY } : {}),\n });\n edgeIds.push(edgeId);\n });\n\n // state 登録\n for (const st of doc.animate!.states) {\n b.state(st.name, { initial: st.initial });\n }\n\n // phase 注入\n for (const p of doc.animate!.phases) {\n b.phase(\n slugify(p.name) || p.name,\n {\n duration: p.durationMs,\n title: p.name,\n body: p.body ?? \"\",\n },\n (pb) => {\n const activateIds = resolveHighlightGeneric(p, doc, actorToNodeId, edgeIds);\n if (activateIds.length > 0) {\n pb.activate(...activateIds);\n }\n for (const t of p.tweens ?? []) {\n pb.tween(t.state, t.from, t.to);\n }\n for (const s of p.sets ?? []) {\n pb.set(s.state, s.value);\n }\n if (p.badge) {\n pb.badge(p.badge);\n }\n return pb;\n },\n );\n }\n\n return b.build();\n}\n\n/**\n * 5 preset 共通 ... highlight item (actor 名 or \"A→B\") を node/edge id に解決。\n * sequence と異なり header/footer/step box はないのでシンプル。\n */\nfunction resolveHighlightGeneric(\n phase: DslPhase,\n doc: DslDocument,\n actorToNodeId: Map<string, string>,\n edgeIds: string[],\n): string[] {\n const out: string[] = [];\n const knownNames = new Set(actorToNodeId.keys());\n for (const raw of phase.highlight ?? []) {\n const entry = parseFocusEntry(raw, knownNames);\n // 矢印あり → edge を特定\n if (entry.kind === \"edge\") {\n const fromId = actorToNodeId.get(entry.from) ?? slugify(entry.from);\n const toId = actorToNodeId.get(entry.to) ?? slugify(entry.to);\n // edge id は `e{idx}-{fromId}-{toId}` の形。 末尾一致で見る。\n // 部分一致で見ると、 名前に `-` を含む箱 (`api-gateway`) の id が別の矢印の id に\n // 混ざって当たる (実測 = 箱を光らせたい指定で矢印が光った)\n for (const edgeId of edgeIds) {\n if (edgeId.endsWith(`-${fromId}-${toId}`)) {\n out.push(edgeId);\n }\n }\n continue;\n }\n // actor 名 → node id。 見つからなければ slug の形でも探す。\n // 順序図だけが slug を受理する状態にすると、 同じ記述が図種で別の意味になる\n // (実測 = `api-gateway` が順序図では光り、 流れ図では何も光らなかった)\n const nodeId = actorToNodeId.get(entry.name) ?? slugLookup(actorToNodeId, entry.name);\n if (nodeId) {\n out.push(nodeId);\n }\n }\n return out;\n}\n\n// ─── helpers ──────────────────────────────────────────────────\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .normalize(\"NFKC\")\n .replace(/[^a-z0-9ぁ-んァ-ヶ一-龯\\-_]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64) || \"n\"\n );\n}\n\nconst CARDINALITY_PATTERNS: Array<[RegExp, ErRelationCardinality]> = [\n [/1:1/, \"1:1\"],\n [/1:N/i, \"1:N\"],\n [/N:1/i, \"N:1\"],\n [/N:M/i, \"N:M\"],\n [/0\\.\\.1/, \"0..1\"],\n [/1\\.\\.\\*/, \"1..*\"],\n];\n\n// cardinality token を「単語の途中でない」 境界で囲んだ RegExp を作る (parse / strip で共有する SSOT)。\n// 前後が identifier 文字 (英数字 + アンダースコア) なら token とみなさない = `column:Metadata` の `n:M` /\n// `10:11:12` の `1:1` / `field_1:N` の `1:N` を cardinality と誤認して壊すのを防ぐ\n// (cc-codex #879 Round 9/10/11)。 `_` を含むのは ER label が DB schema 由来で snake_case 命名が多く、\n// `_` 直後に cardinality 様の部分列が来る label が現実的に起こるため (`field_1:N` / `parent_N:M_child`)。\n// strip と parse で別々に pattern.test / replace すると境界規則が drift するため、 この 1 関数を両経路で使う。\nfunction boundedCardinalityRegExp(pattern: RegExp, extraFlags = \"\"): RegExp {\n const base = pattern.flags.includes(\"i\") ? \"i\" : \"\";\n return new RegExp(`(?<![A-Za-z0-9_])(?:${pattern.source})(?![A-Za-z0-9_])`, base + extraFlags);\n}\n\nfunction parseCardinalityFromLabel(label: string): ErRelationCardinality | null {\n for (const [pattern, card] of CARDINALITY_PATTERNS) {\n if (boundedCardinalityRegExp(pattern).test(label)) return card;\n }\n return null;\n}\n\n// stripCardinality が「水平空白」 として畳んでよい文字を明示列挙する (space / tab / 全角空白 U+3000)。\n// 改行系 (LF / CR / U+2028 line separator / U+2029 paragraph separator / vertical tab / form feed) は\n// 含めない = これらは label の行構造として保持する (cc-codex #879 Round 5/6 指摘 = `\\s` / `[^\\S\\r\\n]`\n// では Unicode 行区切りや CRLF を誤って畳んでしまう)。 括弧除去側と正規化側で同じ class を共有する。\nconst HORIZONTAL_WS = \" \\\\t\\\\u3000\";\nconst HWS = `[${HORIZONTAL_WS}]`;\n\nfunction stripCardinality(label: string): string {\n let r = label;\n let removed = false;\n for (const [pattern] of CARDINALITY_PATTERNS) {\n // cardinality token を「それを囲む括弧ごと 1 単位」 で除去する。\n // まず `(1:N)` のように token を直接包む括弧つき形を除去し、 次に裸の token を除去する。\n // 括弧を token 単位で消すことで、 label 中の cardinality と無関係な正当な括弧 (例\n // `fn() now` の `()`) を壊さない (cc-codex #879 Round 4 指摘 = 空括弧の全域除去は過剰)。\n // 括弧と token の間は水平空白のみ許容し、 改行を挟む形 (`(\\n1:N\\n)`) は括弧除去の対象外にする\n // (改行を消費して行構造を壊すのを防ぐ、 Round 6 Finding 2)。\n const src = pattern.source;\n const flags = pattern.flags.includes(\"i\") ? \"gi\" : \"g\";\n const before = r;\n r = r.replace(new RegExp(`\\\\(${HWS}*${src}${HWS}*\\\\)`, flags), \"\");\n // 裸 token 除去 = parse と同じ単語境界付き matcher (boundedCardinalityRegExp) を global で適用する。\n // 前後が英数字なら token とみなさないため、 timestamp (`10:11:12`) / 比率 (`10:11`) / alphabet 埋め込み\n // (`column:Metadata`) を壊さず、 同一 token の複数出現 (`1:N and 1:N`) は全て消す。 parse 側と境界規則を\n // 単一 SSOT にすることで strip/parse の乖離 (strip は消すが parse は残す等) を構造的に防ぐ\n // (cc-codex #879 Round 9/10 = 数字境界だけ / strip 側だけの修正では 2 経路 drift + alphabet 埋め込み穴)。\n r = r.replace(boundedCardinalityRegExp(pattern, \"g\"), \"\");\n if (r !== before) removed = true;\n }\n // token を除去していない label は空白を一切いじらない (無条件適用でも改行 / 複数空白を保持する、\n // cc-codex #879 Round 5 指摘 = 無条件正規化は改行を含む label を破壊した)。\n if (!removed) return label;\n // 除去で生じた水平空白 (space / tab / 全角空白) のみ単一化する (例 \"A 1:N B\" → \"A B\" → \"A B\")。\n // 改行系は HWS に含めないため保持される。\n // - 各行内の連続水平空白を単一化\n // - 改行 (LF / CR) の前後の水平空白を除去 (改行直前の trailing 空白も落とす)\n r = r\n .replace(new RegExp(`${HWS}{2,}`, \"g\"), \" \")\n .replace(new RegExp(`${HWS}*([\\\\r\\\\n])${HWS}*`, \"g\"), \"$1\")\n .replace(new RegExp(`^${HWS}+|${HWS}+$`, \"g\"), \"\");\n // fallback = cardinality 除去後に「視覚的に意味のある文字」 が残らない場合は元 label を返す\n // (Round 6 Finding 1 = 除去後に空白/不可視文字だけ残ると不可視 label になるのを防ぐ)。\n //\n // 「意味のある文字」 の判定は個別の空白/不可視文字を列挙 (denylist) すると際限が無く、\n // Round 7 で `\\s` → `\\p{White_Space}` に変えたら NEL は拾えたが BOM を落とす等のいたちごっこに\n // なった (cc-codex #879 Round 7/8/9)。 そこで Unicode の「見えない文字」 を 4 カテゴリで構造的に\n // 判定する = 以下のいずれでもない可視文字が 1 つでもあれば意味あり。\n // - White_Space ... 全空白 (space / tab / NBSP / NEL / 全角空白 / 各種 Unicode space / 改行系)\n // - Cf (Format) ... BOM / ZWSP / ZWNJ / ZWJ / WORD JOINER / soft hyphen 等\n // - Cc (Control) ... 制御文字\n // - Default_Ignorable_Code_Point ... variation selector (Mn) / Hangul filler (Lo) 等、 Cf に\n // 入らない不可視文字 (Cf/Cc/White_Space だけでは取りこぼすと Round 9 で判明)\n // 4 カテゴリで Unicode の非表示文字を網羅する (Braille blank U+2800 や通常文字は content 維持)。\n const hasVisible = /[^\\p{White_Space}\\p{Cf}\\p{Cc}\\p{Default_Ignorable_Code_Point}]/u.test(r);\n return hasVisible ? r : label;\n}\n","/**\n * Text DSL v0.5 parser\n *\n * 設計方針:\n * - keyword は英語のみ (title / type / actors / flow / states / animation / step / focus / tween / set / badge)\n * - 値の日本語は quote 必須 (`title: \"API call\"` / `step: \"request\" 1.5s`)\n * - YAML 風 + 短縮 keyword + 箇条書き構造\n * - Mermaid 知ってる人にもゼロ学習、 非エンジニアにも直感的\n *\n * syntax 例:\n *\n * title: \"API call\"\n * type: sequence\n *\n * actors:\n * - Client\n * - API: function\n * - DB\n *\n * flow:\n * - Client -> API: \"GET /items\"\n * - API -> DB: \"SELECT\" (success)\n *\n * states:\n * request_count: 0\n * row_count: 0\n *\n * animation:\n * - step: \"request\" 1.5s\n * focus: [Client, API]\n * tween:\n * request_count: 0 -> 1\n * badge: \"request\"\n *\n * - step: \"query\" 1.5s\n * focus: [API, DB]\n * tween:\n * row_count: 0 -> 20\n * badge: \"query\"\n *\n * 出力は v0.4 と同じ DslDocument。 既存 compile.ts で CdlDiagram に変換できる。\n */\n\nimport type { NodeKind, Tone, EdgeStyle } from \"@cardenelabs/cdl\";\nimport { TONES, NODE_KINDS } from \"@cardenelabs/cdl\";\nimport { TONE_ALIAS } from \"../keywords\";\nimport { parseRelativePos, orderByDependency } from \"../relative-pos\";\nimport type {\n DslDocument,\n DslActor,\n DslActorNodeOverride,\n DslStep,\n DslAnimate,\n DslState,\n DslPhase,\n DslTween,\n DslSet,\n DslError,\n PresetType,\n DslLane,\n DslGroup,\n DslViewport,\n} from \"../types\";\n\nexport type V05ParseResult =\n | { ok: true; doc: DslDocument }\n | { ok: false; errors: DslError[] };\n\n/** 受け付ける図種。 記法一覧はここを見る。 */\nexport const PRESET_TYPES: ReadonlySet<PresetType> = new Set([\n \"sequence\",\n \"flow\",\n \"swimlane\",\n \"er\",\n \"state\",\n \"topology\",\n \"solidity\",\n \"gantt\",\n \"class\",\n \"pie\",\n \"c4\",\n \"mind\",\n]);\n\nconst NODE_KIND_DEFAULT: NodeKind = \"actor\";\n\n/**\n * 記法だけが持つ種類。 描画側には無いが、 図種ごとの組み立てで意味を持つ。\n *\n * `contract` / `eoa` / `multisig` / `proxy` / `library` / `interface` は Solidity 図の\n * 役割分けに、 `entity` / `state` は ER 図と状態遷移図に使う。 組み立ての段階で描画できる\n * 種類に置き換わるため、 そのまま描画側に渡ることはない。\n */\nconst DSL_ONLY_KINDS = [\n \"entity\", \"state\",\n \"contract\", \"eoa\", \"multisig\", \"proxy\", \"library\", \"interface\",\n] as const;\n\n/**\n * AWS などの固有名を、 同じ役割を表す汎用の種類に読み替える表。\n *\n * これらは記法が受け付けるのに描画側に無く、 書くと「kind \"alb\" は未対応」 とエラーになって\n * いた。 受け付けるのをやめると今度は部品名として扱われ「そんな部品はない」 と出る。 どちらも\n * 書いた人が困るだけなので、 意味の近い種類に読み替えて実際に図が出るようにする。\n *\n * 読み替え先が重なるものがある (`iam` と `kms` は権限と鍵を守る役、 `s3` と `secret` は\n * 保管する役)。 見た目が同じになるが、 役割が同じなので嘘にはならない。\n */\nconst INFRA_KIND_ALIAS: Record<string, NodeKind> = {\n alb: \"shape-api-gateway\", // 入口で振り分ける\n browser: \"frontend\", // 画面側\n ecs: \"microservice\", // コンテナ群\n iam: \"admin\", // 権限を守る\n kms: \"admin\", // 鍵を守る\n lambda: \"function\", // 呼ぶと動く\n rds: \"database\", // 表を持つ\n s3: \"storage\", // 置き場\n secret: \"storage\", // 機密の置き場\n user: \"person\", // 人\n container: \"service\", // 動かす単位 (C4 の container)\n};\n\n/**\n * 受け付ける箱の種類。 描画できる種類 (cdl の `NODE_KINDS`) に、 記法だけが持つ種類を足す。\n *\n * 以前は手書きの 31 種だった。 描画できる 90 種のうち 78 種が記法から書けず、 部品名として\n * 扱われて「そんな部品は無い」 と警告が出るだけだった。 描画側を出所に加えることで\n * 「描画できるものは書ける」 が成立する。\n */\n/**\n * 記法が受理する種類の全体。 これに載っていない種類は見本 (パーツ) の候補になる。\n *\n * 画面側が「本文が見本を使っているか」 を判定するのに使う (#1022)。 手書きの一覧を\n * 別に持つと、種類が増えた時にそちらだけ取り残されて余分な読み込みが起きる。\n */\nexport const NODE_KIND_VALID: ReadonlySet<string> = new Set<string>([\n ...NODE_KINDS,\n ...DSL_ONLY_KINDS,\n ...Object.keys(INFRA_KIND_ALIAS),\n]);\n\n// 受理する色名は cdl 側の一覧をそのまま使う。 手書きすると cdl に色が増えた時に取り残される。\nconst TONE_VALID: ReadonlySet<string> = new Set<string>(TONES);\n\nconst STYLE_VALID: ReadonlySet<string> = new Set<string>([\"solid\", \"dotted-flow\"]);\n\ntype Line = {\n raw: string;\n trimmed: string;\n indent: number;\n no: number;\n};\n\nexport function parseTextDslV05(src: string): V05ParseResult {\n const errors: DslError[] = [];\n const lines = tokenize(src);\n\n let title: string | null = null;\n let type: PresetType | null = null;\n let actors: DslActor[] = [];\n const flow: DslStep[] = [];\n let animate: DslAnimate | undefined = undefined;\n let viewport: DslViewport | undefined = undefined;\n let lanesMap: Record<string, DslLane> | undefined = undefined;\n let groupsMap: Record<string, DslGroup> | undefined = undefined;\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n if (!line.trimmed || line.trimmed.startsWith(\"#\")) {\n i += 1;\n continue;\n }\n const head = matchTopHeader(line.trimmed);\n if (!head) {\n errors.push({\n line: line.no,\n message: `unknown top-level key: \"${line.trimmed}\"`,\n hint: \"expected one of: title, type, actors, flow, states, animation, viewport, lanes, groups\",\n });\n i += 1;\n continue;\n }\n if (head.key === \"title\") {\n title = head.value ?? null;\n if (!title) {\n errors.push({ line: line.no, message: \"title is required\", hint: 'use `title: \"...\"`' });\n }\n i += 1;\n continue;\n }\n if (head.key === \"type\") {\n const v = (head.value ?? \"\").trim().toLowerCase();\n if (!PRESET_TYPES.has(v as PresetType)) {\n errors.push({\n line: line.no,\n message: `unknown type: \"${v}\"`,\n hint: `expected: ${Array.from(PRESET_TYPES).join(\", \")}`,\n });\n } else {\n type = v as PresetType;\n }\n i += 1;\n continue;\n }\n if (head.key === \"actors\") {\n // 1 行で書いた形と、 続く字下げ行に項目を並べた形の両方を受け付ける\n const { items, next } = collectActorEntries(lines, i + 1, line.indent);\n actors = [];\n for (const entry of items) {\n const base = parseActor(entry[0]!, errors);\n if (base === null) {\n errors.push({\n line: entry[0]!.no,\n message: `invalid actor entry: \"${entry[0]!.trimmed}\"`,\n hint: 'use `- Client` or `- Client: storage`',\n });\n continue;\n }\n actors.push(applyContinuationLines(base, entry.slice(1), errors));\n }\n validateRelativePositions(actors, errors);\n i = next;\n continue;\n }\n if (head.key === \"flow\") {\n const { items, next } = collectIndentedList(lines, i + 1, line.indent);\n let stepNo = 1;\n for (const it of items) {\n const step = parseFlowStep(it, stepNo);\n if (step) {\n flow.push(step);\n stepNo += 1;\n } else {\n errors.push({\n line: it.no,\n message: `invalid flow entry: \"${it.trimmed}\"`,\n hint: 'use `- A -> B: \"label\"` or `- A -> B: \"label\" (success)`',\n });\n }\n }\n i = next;\n continue;\n }\n if (head.key === \"states\") {\n // states は inline (states: { a: 1, b: 2 }) もしくは block (states:\\n a: 1\\n b: 2)\n const inlineMatch = head.value?.trim();\n if (inlineMatch && inlineMatch.startsWith(\"{\") && inlineMatch.endsWith(\"}\")) {\n const inner = inlineMatch.slice(1, -1).trim();\n animate = ensureAnimate(animate, line.no);\n for (const pair of splitTopLevelCommas(inner)) {\n const st = parseStateEntry(pair, line.no);\n if (st) animate.states.push(st);\n }\n i += 1;\n continue;\n }\n const { items, next } = collectIndentedList(lines, i + 1, line.indent);\n animate = ensureAnimate(animate, line.no);\n for (const it of items) {\n const st = parseStateEntry(it.trimmed.replace(/^-\\s*/, \"\"), it.no);\n if (st) animate.states.push(st);\n else errors.push({ line: it.no, message: `invalid state entry: \"${it.trimmed}\"`, hint: \"use `name: initial`\" });\n }\n i = next;\n continue;\n }\n if (head.key === \"animation\") {\n // animation: は step を list で並べる\n const { items: stepBlocks, next } = collectAnimationSteps(lines, i + 1, line.indent);\n animate = ensureAnimate(animate, line.no);\n for (const block of stepBlocks) {\n const ph = parsePhase(block, errors);\n if (ph) animate.phases.push(ph);\n }\n i = next;\n continue;\n }\n if (head.key === \"viewport\") {\n // inline mapping: viewport: { width: 1400, height: 900, laneWidth: 480, gap: 80, laneGap: 100, nodeGap: 32, labelMargin: 12 }\n const inline = head.value?.trim();\n if (inline && inline.startsWith(\"{\") && inline.endsWith(\"}\")) {\n const opts = parseInlineMapping(inline.slice(1, -1));\n viewport = {\n width: numberOrUndef(opts.width),\n height: numberOrUndef(opts.height),\n laneWidth: numberOrUndef(opts.laneWidth),\n gap: numberOrUndef(opts.gap),\n laneGap: numberOrUndef(opts.laneGap),\n nodeGap: numberOrUndef(opts.nodeGap),\n scale: numberOrUndef(opts.scale),\n labelMargin: numberOrUndef(opts.labelMargin),\n pos: { line: line.no },\n };\n i += 1;\n continue;\n }\n // block: viewport:\\n width: 1400\\n height: 900\\n ...\n const { items, next } = collectIndentedList(lines, i + 1, line.indent);\n const opts: Record<string, string> = {};\n for (const it of items) {\n const m = it.trimmed.match(/^([a-zA-Z][a-zA-Z0-9_]*)\\s*:\\s*(.+)$/);\n if (m) opts[m[1]!] = stripQuotes(m[2]!.trim());\n }\n viewport = {\n width: numberOrUndef(opts.width),\n height: numberOrUndef(opts.height),\n laneWidth: numberOrUndef(opts.laneWidth),\n gap: numberOrUndef(opts.gap),\n laneGap: numberOrUndef(opts.laneGap),\n nodeGap: numberOrUndef(opts.nodeGap),\n scale: numberOrUndef(opts.scale),\n labelMargin: numberOrUndef(opts.labelMargin),\n pos: { line: line.no },\n };\n i = next;\n continue;\n }\n if (head.key === \"lanes\") {\n // lanes:\\n l1: { x: 0, width: 320, label: \"...\" }\\n l2: { ... }\n const { items, next } = collectIndentedList(lines, i + 1, line.indent);\n lanesMap = {};\n for (const it of items) {\n const m = it.trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*\\{([^}]*)\\}\\s*$/);\n if (m) {\n const id = m[1]!;\n const opts = parseInlineMapping(m[2]!);\n lanesMap[id] = {\n id,\n x: numberOrUndef(opts.x),\n width: numberOrUndef(opts.width),\n label: opts.label,\n contain: boolOrUndef(opts.contain),\n lifeline: boolOrUndef(opts.lifeline),\n pos: { line: it.no },\n };\n } else {\n errors.push({\n line: it.no,\n message: `invalid lane entry: \"${it.trimmed}\"`,\n hint: 'use `id: { x: 0, width: 320, label: \"...\" }`',\n });\n }\n }\n i = next;\n continue;\n }\n if (head.key === \"groups\") {\n // groups:\\n aws: { label: \"AWS\", lanes: [ecs, rds] }\n const { items, next } = collectIndentedList(lines, i + 1, line.indent);\n groupsMap = {};\n for (const it of items) {\n const m = it.trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*\\{([^}]*)\\}\\s*$/);\n if (m) {\n const id = m[1]!;\n const opts = parseInlineMapping(m[2]!);\n const lanesList = (opts.lanes ?? \"\")\n .replace(/^\\[|\\]$/g, \"\")\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n groupsMap[id] = {\n id,\n label: opts.label,\n lanes: lanesList,\n pos: { line: it.no },\n };\n } else {\n errors.push({\n line: it.no,\n message: `invalid group entry: \"${it.trimmed}\"`,\n hint: 'use `id: { label: \"...\", lanes: [a, b] }`',\n });\n }\n }\n i = next;\n continue;\n }\n i += 1;\n }\n\n if (!title) errors.push({ line: 1, message: \"title is required\", hint: 'add `title: \"...\"` at top' });\n if (!type) errors.push({ line: 1, message: \"type is required\", hint: \"add `type: sequence|flow|swimlane|er|state|topology|solidity|gantt|class|pie|c4|mind`\" });\n\n if (errors.length > 0) return { ok: false, errors };\n\n return {\n ok: true,\n doc: {\n title: title!,\n type: type!,\n actors,\n flow,\n animate,\n viewport,\n lanes: lanesMap,\n groups: groupsMap,\n pos: { line: 1 },\n },\n };\n}\n\nfunction tokenize(src: string): Line[] {\n const out: Line[] = [];\n const raw = src.split(\"\\n\");\n for (let i = 0; i < raw.length; i += 1) {\n const r = raw[i] ?? \"\";\n const trimmed = r.trim();\n const indent = r.length - r.trimStart().length;\n out.push({ raw: r, trimmed, indent, no: i + 1 });\n }\n return out;\n}\n\ntype TopHeader = { key: string; value: string | null };\n\nfunction matchTopHeader(trimmed: string): TopHeader | null {\n // 形式: `key:` or `key: value`\n const m = trimmed.match(/^([a-zA-Z][a-zA-Z0-9_]*)\\s*:\\s*(.*)$/);\n if (!m) return null;\n const value = (m[2] ?? \"\").trim();\n return { key: (m[1] ?? \"\").toLowerCase(), value: value.length ? stripQuotes(value) : null };\n}\n\n/**\n * 対応する引用符だけを外す。\n *\n * 先頭と末尾を別々に外すと、対応しない形 (`'300,200\"`) が中身だけ取り出せてしまう。\n * 画面側も同じ関数を使う (#1028) = 別々に持つと、片方だけが読める本文ができる。\n */\nexport function stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n\n/**\n * 引用符と角括弧の外にある最後の `:` の位置。 見つからなければ -1。\n *\n * 名前に `:` を含められるので後ろから探すが、 `[\"id: PK\"]` のように値の中にも `:` が入る。\n * 深さを数えて、 値の中の `:` を数えない。\n */\nfunction lastTopLevelColon(s: string): number {\n let depth = 0;\n let quote = \"\";\n let last = -1;\n for (let i = 0; i < s.length; i += 1) {\n const c = s[i]!;\n if (quote) {\n if (c === quote) quote = \"\";\n continue;\n }\n if (c === '\"' || c === \"'\") { quote = c; continue; }\n if (c === \"[\" || c === \"{\") depth += 1;\n else if (c === \"]\" || c === \"}\") depth -= 1;\n else if (c === \":\" && depth === 0) last = i;\n }\n return last;\n}\n\n/**\n * 空白区切りの値を切り出す。 引用符と角括弧の中の空白では切らない。\n *\n * `service \"API サーバー\" 幅400` → `[\"service\", '\"API サーバー\"', \"幅400\"]`\n */\nfunction splitValues(s: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n let quote = \"\";\n for (let i = 0; i < s.length; i += 1) {\n const c = s[i]!;\n if (quote) {\n buf += c;\n if (c === quote) quote = \"\";\n continue;\n }\n if (c === '\"' || c === \"'\") { quote = c; buf += c; continue; }\n if (c === \"[\" || c === \"{\") { depth += 1; buf += c; continue; }\n if (c === \"]\" || c === \"}\") { depth -= 1; buf += c; continue; }\n if (/\\s/.test(c) && depth === 0) {\n if (buf) { out.push(buf); buf = \"\"; }\n continue;\n }\n buf += c;\n }\n if (buf) out.push(buf);\n return out;\n}\n\ntype ActorValues = {\n kind: string;\n tone?: Tone;\n subtitle?: string;\n rows?: string[];\n value?: string;\n posX?: number;\n posY?: number;\n /** parts の状態の上書き (`v=50` の形)。 状態名は自由なので等号で示す。 */\n state?: Record<string, number | string | boolean>;\n /** 図形の倍率 (`倍率=2` / `scale=2` の形、 #1026)。 状態とは別枠で持つ。 */\n scale?: number;\n /** 書かれた倍率の名前。 値が読めない形 (`scale=x`) と書いていない形を見分ける。 */\n scaleKeys?: string[];\n};\n\n/**\n * 空白区切りで書かれた値を、 項目ごとに振り分ける。\n *\n * 振り分けは値の形で決まる。 引用符付きは補足 (2 つ目は値)、 角括弧は行、 色名は色、\n * 残りが種類。 形が違うので取り違えない。\n */\nfunction classifyValues(values: string[]): ActorValues {\n const out: ActorValues = { kind: \"\" };\n /** 書かれた倍率。 同じ名前が 2 度出たら後の値で上書きする */\n const scaleWritten = new Map<string, string>();\n const kindWords: string[] = [];\n for (const v of values) {\n if ((v.startsWith('\"') && v.endsWith('\"') && v.length > 1) || (v.startsWith(\"'\") && v.endsWith(\"'\") && v.length > 1)) {\n // 1 つ目の引用符は補足、 2 つ目は値 (`storage` の右側に出る数値等)\n if (out.subtitle === undefined) out.subtitle = stripQuotes(v);\n else if (out.value === undefined) out.value = stripQuotes(v);\n continue;\n }\n if (v.startsWith(\"[\") && v.endsWith(\"]\")) {\n out.rows = v\n .slice(1, -1)\n .split(/,(?![^[]*\\])/)\n .map((x) => stripQuotes(x.trim()))\n .filter(Boolean);\n continue;\n }\n // `@300,200` は位置。 2 つ揃わないと効かないので、 1 つの値としてまとめて書く\n const at = v.match(/^@(-?\\d+(?:\\.\\d+)?)\\s*[,、]\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (at) { out.posX = Number(at[1]); out.posY = Number(at[2]); continue; }\n // `名前=値` は parts の状態の上書き。 状態名は自由なので、 形では見分けられない。\n // 等号を書いてもらう。\n const eq = v.indexOf(\"=\");\n if (eq > 0) {\n const key = v.slice(0, eq);\n const raw = stripQuotes(v.slice(eq + 1));\n // `倍率` だけは状態ではなく図形の倍率 (#1026)。 書かれた名前をそのまま貯めて、\n // どれが効くかは `resolveScale` が 1 箇所で決める (3 つの書き方で規則を揃えるため)\n if (SCALE_KEYS.has(key)) {\n scaleWritten.set(key, raw);\n continue;\n }\n if (/^[A-Za-z_][\\w-]*$/.test(key)) {\n out.state = { ...(out.state ?? {}), [key]: coerceStateValue(raw) };\n continue;\n }\n }\n const tone = toneOrUndef(v);\n if (tone) { out.tone = tone; continue; }\n kindWords.push(v);\n }\n out.kind = kindWords.join(\" \").toLowerCase();\n const s = resolveScale(scaleWritten);\n out.scale = s.scale;\n out.scaleKeys = s.keys;\n return out;\n}\n\n/**\n * 書かれた種類名を、 描画できる種類に解決する。\n *\n * 固有名 (`lambda` / `rds` 等) は読み替え表を通す。 それ以外はそのまま返す。\n */\nfunction resolveKind(raw: string): NodeKind {\n if (raw === \"\") return NODE_KIND_DEFAULT;\n // `Object.hasOwn` で引く。 素の添字だと `toString` 等の既定の持ち物が引けてしまい、\n // 種類として関数が返る。 呼ぶ前に受理集合で弾いてはいるが、 表を引く側でも閉じておく。\n return Object.hasOwn(INFRA_KIND_ALIAS, raw) ? INFRA_KIND_ALIAS[raw]! : (raw as NodeKind);\n}\n\nfunction numberOrUndef(s: string | undefined): number | undefined {\n if (s === undefined || s === \"\") return undefined;\n const n = Number(s);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction boolOrUndef(s: string | undefined): boolean | undefined {\n if (s === undefined) return undefined;\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n return undefined;\n}\n\n/**\n * 色名を解決する。 別名 (`成功` / `neutral` 等) も受け付ける。\n *\n * 未知の値は `undefined` にして既定色に落とす。 箱と矢印で同じ関数を通す。\n *\n * 別名表の参照には `Object.hasOwn` を使う。 素の添字だと `toString` / `constructor` /\n * `valueOf` / `__proto__` が JavaScript の既定の持ち物として引けてしまい、 色名として\n * 関数やオブジェクトが通る (実測)。 最後に解決結果が正規の色名かも確かめる。\n */\nfunction toneOrUndef(s: string | undefined): Tone | undefined {\n if (s === undefined) return undefined;\n const raw = stripQuotes(s.trim());\n const lower = raw.toLowerCase();\n const resolved = Object.hasOwn(TONE_ALIAS, raw)\n ? TONE_ALIAS[raw]\n : Object.hasOwn(TONE_ALIAS, lower)\n ? TONE_ALIAS[lower]\n : undefined;\n if (resolved !== undefined && TONE_VALID.has(resolved)) return resolved;\n return TONE_VALID.has(lower) ? (lower as Tone) : undefined;\n}\n\n/**\n * actor 行から `name: { inner }` を depth count で抽出。 inner 内の `{ }` (例: `value: \"{count}\"`) を尊重。\n */\nfunction matchActorInlineMapping(raw: string): { name: string; inner: string } | null {\n // colon 位置を探して name と rest に分ける\n const colonIdx = raw.indexOf(\":\");\n if (colonIdx < 0) return null;\n const name = raw.slice(0, colonIdx);\n const rest = raw.slice(colonIdx + 1).trim();\n if (!rest.startsWith(\"{\")) return null;\n // depth count で対応 brace 探す\n let depth = 0;\n let endIdx = -1;\n for (let i = 0; i < rest.length; i += 1) {\n const c = rest[i]!;\n if (c === \"{\") depth += 1;\n else if (c === \"}\") {\n depth -= 1;\n if (depth === 0) {\n endIdx = i;\n break;\n }\n }\n }\n if (endIdx < 0) return null;\n const inner = rest.slice(1, endIdx);\n return { name, inner };\n}\n\n/**\n * inline mapping を parse: `subtitle: \"送信元\", kind: actor, stack: 0`\n * brace 内は { } で wrap してから渡す、 本関数は内部だけ受ける\n * 値が `[a, b]` 配列は文字列のまま返す (caller で split)\n */\nfunction parseInlineMapping(inner: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const p of splitInlineFields(inner)) {\n // 項目名は英字だけでなく日本語も受ける (#1026)。 受けないと `{ kind: x, 倍率: 2 }` の\n // 倍率が消え、同じ意味を書いたのに中括弧の形だけ効かない (実測)。\n //\n // 読める名前を広げても、**知っている名前しか使われない**。 パーツの状態の上書きに\n // 流れるのは `ACTOR_RESERVED_FIELDS` に無い名前だけで、日本語の項目名 (`位置` / `大きさ`\n // 等) はそこに載せてあるため、これまでどおり落ちる\n const m = p.match(/^\\s*([^\\s:,{}[\\]\"']+)\\s*:\\s*(.+?)\\s*$/);\n if (m) {\n const key = m[1]!;\n out[key] = stripQuotes(m[2]!.trim());\n }\n }\n return out;\n}\n\n/**\n * 中括弧の中身から、倍率として書かれた名前と値を拾う (#1026)。\n *\n * `parseInlineMapping` は値が 1 文字以上ある項目しか拾わない。 それをそのまま使うと、\n * 値を書かなかった形 (`{ kind: x, scale: }`) で「書いた」 ことすら残らず、\n * 予約の知らせが消える。 倍率だけは値が空でも名前を残す。\n */\nfunction writtenScaleFields(inner: string): Map<string, string> {\n const out = new Map<string, string>();\n for (const field of splitInlineFields(inner)) {\n const idx = field.indexOf(\":\");\n if (idx < 0) continue;\n const key = field.slice(0, idx).trim();\n if (!SCALE_KEYS.has(key)) continue;\n // 同じ名前を 2 度書いたら後の値を採る\n out.set(key, stripQuotes(field.slice(idx + 1).trim()));\n }\n return out;\n}\n\n/**\n * 中括弧の中身を、入れ子と引用符を保ったまま項目ごとに割る。\n *\n * `parseInlineMapping` と、倍率の「書かれた名前」 を拾う経路 (#1026) で共用する。\n * 割り方を 2 つ持つと、片方だけが拾える項目という食い違いが生まれる。\n */\nfunction splitInlineFields(inner: string): string[] {\n let depth = 0;\n let buf = \"\";\n const parts: string[] = [];\n for (let i = 0; i < inner.length; i += 1) {\n const c = inner[i]!;\n if (c === \"[\" || c === \"{\") depth += 1;\n else if (c === \"]\" || c === \"}\") depth -= 1;\n if (c === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n buf += c;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n\nfunction collectIndentedList(lines: Line[], start: number, parentIndent: number): { items: Line[]; next: number } {\n const items: Line[] = [];\n let i = start;\n while (i < lines.length) {\n const ln = lines[i]!;\n if (!ln.trimmed) {\n i += 1;\n continue;\n }\n if (ln.indent <= parentIndent) break;\n if (ln.trimmed.startsWith(\"- \")) {\n items.push({ ...ln, trimmed: ln.trimmed.slice(2).trim() });\n } else if (ln.trimmed.includes(\":\")) {\n // YAML 風 inline (key: value) は state 用 block で許容\n items.push(ln);\n }\n i += 1;\n }\n return { items, next: i };\n}\n\n/**\n * 登場人物を 1 件ずつ集める。 続く字下げ行は同じ 1 件にまとめる。\n *\n * 項目が少なければ 1 行で書け、 多ければ縦に並べられる。 縦に並べた方が、 何を指定できるかが\n * 見える。\n *\n * ```\n * - Client\n * - API: service\n * - Web:\n * kind: service\n * 色: 失敗\n * ```\n */\n/**\n * 色の指定を振り分ける。\n *\n * 書く人は「色を変えたい」 としか思わないので、 項目は `色:` 1 つにまとめる。 意味の色\n * (`失敗`) と色番号 (`#f59e0b`) は形で見分ける。 前者は箱の色、 後者はパーツの塗りになる。\n */\nfunction splitColorValue(raw: string): { tone?: Tone; hex?: string } {\n const v = stripQuotes(raw.trim());\n if (v.startsWith(\"#\")) return { hex: v };\n const tone = toneOrUndef(v);\n return tone ? { tone } : {};\n}\n\n/** `色` / `color` のどちらでも書ける。 */\nconst COLOR_KEYS = new Set([\"色\", \"color\", \"tone\"]);\n\n/**\n * 見本の倍率として予約する項目名 (#1026)。\n *\n * 予約しないと状態の名前として読まれる。 画面側は同じ語を図形の倍率として読むため、\n * 予約しない限り同じ本文が 2 経路で別の絵になる。 3 つの書き方すべてで同じ扱いにする。\n */\nconst SCALE_KEYS: ReadonlySet<string> = new Set([\"scale\", \"倍率\"]);\n\n/** 別名を 2 つ書いた時に優先する順。 画面側 (`SCALE_KEYS`) と同じ並びにする。 */\nconst SCALE_ORDER = [\"scale\", \"倍率\"] as const;\n\n/**\n * 書かれた倍率から、実際に効く値と書かれた名前を決める (#1026)。\n *\n * 規則は 3 つの書き方と画面側で共通にする。\n *\n * - 別名は `scale` を先に見る (両方書いた時に書き方で効く名前が変わらないようにする)\n * - 同じ名前を 2 度書いた時は後に書いた方を採る (前を採ると書き直した値が効かない)\n * - 書いた名前の値が読めなくても、もう一方の名前に降りない (綴りを誤った時だけ\n * 別の値が効く、という追いにくい形を作らない)\n *\n * `keys` は書かれた名前そのもの。 値が読めたかに関わらず入る。 見本が同じ名前の状態を\n * 持つ時の知らせ (`scale-reserved`) が、値の読めなさに左右されないようにするため。\n */\nfunction resolveScale(written: Map<string, string>): { scale?: number; keys: string[] } {\n const keys = [...written.keys()];\n for (const key of SCALE_ORDER) {\n const raw = written.get(key);\n if (raw !== undefined) return { scale: numberOrUndef(raw), keys };\n }\n return { keys };\n}\n\n/**\n * 続く字下げ行 (`kind: service` の形) を読んで 1 件にまとめる。\n *\n * 1 行で書いた時と同じ結果になるよう、 同じ振り分けを通す。\n */\nfunction applyContinuationLines(actor: DslActor, rest: Line[], errors: DslError[]): DslActor {\n if (rest.length === 0) return actor;\n const out: DslActor = { ...actor };\n const state: Record<string, number | string | boolean> = { ...(actor.stateOverride ?? {}) };\n let touchedState = false;\n /** 縦に並べて書かれた倍率。 同じ名前が 2 度出たら後の値で上書きする */\n const scaleWritten = new Map<string, string>();\n // パーツでなければどこにも入らない項目。 パーツかどうかは block を読み終わるまで決まらない\n const unknownKeys: Array<{ key: string; line: number }> = [];\n\n for (const ln of rest) {\n const idx = ln.trimmed.indexOf(\":\");\n if (idx < 0) continue;\n const key = ln.trimmed.slice(0, idx).trim();\n const raw = ln.trimmed.slice(idx + 1).trim();\n if (!key) continue;\n // 倍率だけは値が空でも名前を残す (#1026)。 捨てると、値を書かなかった形で\n // 予約の知らせが消え、別名 (`倍率`) に降りて別の値が効いてしまう\n if (SCALE_KEYS.has(key)) {\n scaleWritten.set(key, stripQuotes(raw));\n unknownKeys.push({ key, line: ln.no });\n continue;\n }\n if (!raw) continue;\n\n if (COLOR_KEYS.has(key)) {\n const { tone, hex } = splitColorValue(raw);\n if (tone) out.tone = tone;\n // 色番号を入れる状態の名前はパーツごとに違う。 組み立て時に解決する\n if (hex) out.colorHex = hex;\n continue;\n }\n switch (key) {\n case \"kind\":\n case \"種類\": {\n const k = stripQuotes(raw).toLowerCase();\n const isPart = k !== \"\" && !NODE_KIND_VALID.has(k);\n out.kind = isPart ? NODE_KIND_DEFAULT : resolveKind(k);\n // parts 候補は `kind` を既定に倒して `partId` へ退避するため、 名札に載せる種類としては\n // 「書かなかった」 と同じ扱いにする (#1058)\n out.kindWritten = k !== \"\" && !isPart;\n out.partId = isPart ? k : undefined;\n break;\n }\n case \"subtitle\":\n case \"補足\":\n out.subtitle = stripQuotes(raw);\n break;\n case \"value\":\n case \"値\":\n out.value = stripQuotes(raw);\n break;\n case \"rows\":\n case \"行\":\n out.rows = raw.replace(/^\\[|\\]$/g, \"\").split(/,(?![^[]*\\])/).map((x) => stripQuotes(x.trim())).filter(Boolean);\n break;\n case \"位置\":\n case \"pos\": {\n // `位置: 300,200` の形。 posX と posY は両方揃わないと効かないので、 1 つの項目に\n // まとめて書き分けられないようにする\n const value = stripQuotes(raw);\n const m = value.match(/^(-?\\d+(?:\\.\\d+)?)\\s*[,、]\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (m) {\n out.posX = Number(m[1]);\n out.posY = Number(m[2]);\n // 座標を後から書いた時は相対の指定を捨てる。 両方残すと、 どちらが効くかが\n // 書いた順に依存して読めなくなる\n out.posRel = undefined;\n break;\n }\n // `位置: Web の右 200` の形。 座標を知らなくても位置を決められるようにする\n const rel = parseRelativePos(value);\n if (rel) {\n out.posRel = rel;\n out.posX = undefined;\n out.posY = undefined;\n break;\n }\n // どちらの形でもない値は黙って捨てない。 捨てると「書いたのに図が変わらない」 が\n // 手掛かりなしで起きる\n //\n // 負の間隔 (`Web の右 -200`) もここに来る。 向きを書いた上で裏返す指定は、\n // 書いた人の意図と図が食い違うので誤りとして返す\n const negative = /^(.+?)\\s*(?:の\\s*(?:右|左|上|下)|\\s(?:right|left|above|below))\\s*-\\s*[\\d.]/i.test(value);\n errors.push({\n line: ln.no,\n message: negative\n ? `間隔に負の数は書けません: \"${value}\"`\n : `位置の書き方が読めません: \"${value}\"`,\n hint: negative\n ? \"向きを変えたい時は `右` / `左` / `上` / `下` を書き換える\"\n : \"`位置: 300,200` (座標) か `位置: Web の右 200` (他の登場人物からの相対)\",\n });\n break;\n }\n case \"posX\":\n out.posX = numberOrUndef(raw);\n break;\n case \"posY\":\n out.posY = numberOrUndef(raw);\n break;\n case \"大きさ\":\n case \"size\": {\n // `大きさ: 400,200` の形。 位置と揃える\n const value = stripQuotes(raw);\n const m = value.match(/^(-?\\d+(?:\\.\\d+)?)\\s*[,、]\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (m) {\n out.posW = Number(m[1]);\n out.posH = Number(m[2]);\n break;\n }\n // 読めない値を黙って捨てると「書いたのに大きさが変わらない」 が手掛かりなしで起きる。\n // 位置と同じく行番号付きで知らせる (#1028)\n errors.push({\n line: ln.no,\n message: `大きさの書き方が読めません: \"${value}\"`,\n hint: \"`大きさ: 400,200` (幅, 高さ) の形で書く\",\n });\n break;\n }\n case \"lane\":\n out.lane = stripQuotes(raw);\n break;\n case \"stack\":\n out.stack = numberOrUndef(raw);\n break;\n default:\n // 残りはパーツの状態の上書き\n state[key] = coerceStateValue(stripQuotes(raw));\n touchedState = true;\n unknownKeys.push({ key, line: ln.no });\n break;\n }\n }\n // 名前の行と縦に並べた行の両方に倍率がある形では、後に書いた縦の行を採る。\n // 知らせ (`scale-reserved`) は書かれた名前をすべて見るので、名前だけは足し合わせる\n if (scaleWritten.size > 0) {\n const s = resolveScale(scaleWritten);\n out.scale = s.scale;\n out.scaleKeys = [...new Set([...(actor.scaleKeys ?? []), ...s.keys])];\n }\n // 状態も倍率も parts でだけ意味を持つ。 パーツなら知らせずに返す\n if (out.partId !== undefined) {\n if (touchedState) out.stateOverride = state;\n return out;\n }\n // パーツでない箱に書かれた見知らぬ項目は、 どこにも入らずに消える。 黙って捨てると\n // 「書いたのに図が変わらない」 が手掛かりなしで起きるので、 綴りの誤りとして知らせる\n for (const u of unknownKeys) {\n errors.push({\n line: u.line,\n message: `項目名が読めません: \"${u.key}\"`,\n hint: `使える項目 = ${[...ACTOR_ITEM_KEYS].join(\", \")}`,\n });\n }\n return out;\n}\n\n/**\n * 縦に並べて書ける項目名。\n *\n * 綴りを誤った時の知らせに使う。 `applyContinuationLines` の分岐と揃える。\n */\nexport const ACTOR_ITEM_KEYS: ReadonlySet<string> = new Set([\n ...COLOR_KEYS,\n \"kind\", \"種類\",\n \"subtitle\", \"補足\",\n \"value\", \"値\",\n \"rows\", \"行\",\n \"位置\", \"pos\", \"posX\", \"posY\",\n \"大きさ\", \"size\",\n \"倍率\", \"scale\",\n \"lane\", \"stack\",\n]);\n\n/**\n * 相対で書かれた位置が解けるかを確かめる。\n *\n * 解けない書き方は 3 通りある。 相手が居ない / 自分を基準にした / 基準が輪になっている。\n * どれも「書いたのに図が変わらない」 形で表に出るため、 図を出す前に行番号付きで知らせる。\n *\n * 誤りを見つけた actor からは相対の指定を外す。 残したままだと、 誤りを直さずに読み込んだ\n * 経路 (error を無視する呼出) で解決できない指定が組み立てまで届く。\n */\nfunction validateRelativePositions(actors: DslActor[], errors: DslError[]): void {\n const named = new Set(actors.map((a) => a.name));\n const broken = new Set<string>();\n\n for (const a of actors) {\n const rel = a.posRel;\n if (!rel) continue;\n if (rel.anchor === a.name) {\n errors.push({\n line: a.pos.line,\n message: `位置の基準が自分自身です: \"${a.name}\"`,\n hint: \"別の登場人物の名前を書く\",\n });\n broken.add(a.name);\n continue;\n }\n if (!named.has(rel.anchor)) {\n errors.push({\n line: a.pos.line,\n message: `位置の基準が見つかりません: \"${rel.anchor}\"`,\n hint:\n named.size > 0\n ? `actors: に書かれている名前 = ${[...named].join(\", \")}`\n : \"actors: に基準にする登場人物を書く\",\n });\n broken.add(a.name);\n }\n }\n\n const { cyclic } = orderByDependency(\n actors.map((a) => ({ name: a.name, rel: broken.has(a.name) ? undefined : a.posRel })),\n );\n for (const name of cyclic) {\n const a = actors.find((x) => x.name === name);\n errors.push({\n line: a?.pos.line ?? 1,\n message: `位置の基準が互いを指しています: \"${name}\"`,\n hint: \"どれか 1 つは座標 (`位置: 300,200`) か自動配置にする\",\n });\n broken.add(name);\n }\n\n for (const a of actors) {\n if (broken.has(a.name)) a.posRel = undefined;\n }\n}\n\nfunction collectActorEntries(lines: Line[], start: number, parentIndent: number): { items: Line[][]; next: number } {\n const items: Line[][] = [];\n let cur: Line[] | null = null;\n let headIndent = -1;\n let i = start;\n while (i < lines.length) {\n const ln = lines[i]!;\n if (!ln.trimmed) { i += 1; continue; }\n if (ln.indent <= parentIndent) break;\n if (ln.trimmed.startsWith(\"- \")) {\n if (cur) items.push(cur);\n cur = [{ ...ln, trimmed: ln.trimmed.slice(2).trim() }];\n headIndent = ln.indent;\n } else if (cur && ln.indent > headIndent) {\n // 頭より深い字下げは、 直前の 1 件の続き\n cur.push(ln);\n }\n i += 1;\n }\n if (cur) items.push(cur);\n return { items, next: i };\n}\n\nfunction collectAnimationSteps(lines: Line[], start: number, parentIndent: number): { items: Line[][]; next: number } {\n // 各 `- step: \"...\"` 開始を 1 block の頭として識別、 後続の同 indent 以下を block 本文として吸収\n const out: Line[][] = [];\n let i = start;\n let cur: Line[] | null = null;\n while (i < lines.length) {\n const ln = lines[i]!;\n if (!ln.trimmed) {\n i += 1;\n continue;\n }\n if (ln.indent <= parentIndent) break;\n if (ln.trimmed.startsWith(\"- step\")) {\n if (cur) out.push(cur);\n cur = [{ ...ln, trimmed: ln.trimmed.slice(2).trim() }];\n } else if (cur) {\n // 続く property line (focus / tween / set / badge / description)\n cur.push(ln);\n }\n i += 1;\n }\n if (cur) out.push(cur);\n return { items: out, next: i };\n}\n\n/**\n * inline option の残 field (kind + 既存 reserved 除外後) を parts state override として抽出する。\n * CAR-1657 unified syntax = `- arc1: { kind: arc-gauge, v: 50, count: 100 }` の `v` / `count` を\n * `{ v: 50, count: 100 }` state override map に集約する経路。\n * 予約語衝突時は `state: { v: 50 }` 明示 fallback を使う (別 field で処理)。\n */\nconst ACTOR_RESERVED_FIELDS: ReadonlySet<string> = new Set([\n \"kind\",\n \"subtitle\",\n \"eyebrow\",\n \"value\",\n \"rows\",\n \"lane\",\n \"stack\",\n \"initial\",\n \"final\",\n \"state\",\n // canvas pivot 新 spec = 絶対座標 4 field (dragon canvas pivot spec §layout-role-conversion)\n \"posX\",\n \"posY\",\n \"posW\",\n \"posH\",\n // canvas pivot UX 修正 (B1) = sub-node 単位 override map (nested `nodes: { header: {...} }`)\n \"nodes\",\n // 図形の倍率 (#1026)。 状態の名前としては読まない\n \"scale\",\n \"倍率\",\n // 日本語の項目名 (#1026)。 中括弧の形が日本語の項目名を読めるようになったため、\n // ここに載せないと状態の名前として拾われる。 縦に並べた形での意味 (位置 / 大きさ 等) は\n // 中括弧の形では未対応なので、これまでどおり落とす方に揃える\n \"種類\",\n \"補足\",\n \"値\",\n \"行\",\n \"位置\",\n \"大きさ\",\n \"色\",\n]);\n\nfunction extractStateOverride(opts: Record<string, string>): Record<string, number | string | boolean> | undefined {\n const out: Record<string, number | string | boolean> = {};\n let count = 0;\n // 明示 `state: {...}` fallback がある場合はそちらを優先 (nested map parse)\n const explicit = opts.state;\n if (explicit && explicit.startsWith(\"{\") && explicit.endsWith(\"}\")) {\n const inner = parseInlineMapping(explicit.slice(1, -1));\n for (const [k, v] of Object.entries(inner)) {\n out[k] = coerceStateValue(v);\n count += 1;\n }\n }\n // inline 拡散 = 予約語以外を state override として拾う (explicit と併用時は明示 wins)\n for (const [k, v] of Object.entries(opts)) {\n if (ACTOR_RESERVED_FIELDS.has(k)) continue;\n if (k in out) continue; // explicit で set 済 skip\n out[k] = coerceStateValue(v);\n count += 1;\n }\n return count > 0 ? out : undefined;\n}\n\n/**\n * canvas pivot UX 修正 (B1) = actor entry の inline map から `nodes: { header: { posX: ..., ... }, ... }`\n * 形式の nested override を抽出する。 outer parseInlineMapping が opts.nodes を string としてそのまま\n * 保持 (value 内 nested `{ }` は depth-aware で保護済) しているので、 本 fn で「outer `{...}` を剥がして\n * key: sub-map ペアに再 split → 各 sub-map を parseInlineMapping で解いて posX/Y/W/H に coerce」 する。\n * 未 field or 空 object なら undefined 返し (caller は actor.nodes を set しない)。\n */\nfunction parseActorNodesField(raw: string | undefined): Record<string, DslActorNodeOverride> | undefined {\n if (!raw) return undefined;\n const trimmed = raw.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) return undefined;\n const inner = trimmed.slice(1, -1).trim();\n if (!inner) return undefined;\n // depth-aware split (parseInlineMapping と同じ logic を local reuse、 nested `{ }` / `[ ]` 保護)\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n for (let i = 0; i < inner.length; i += 1) {\n const c = inner[i]!;\n if (c === \"[\" || c === \"{\") depth += 1;\n else if (c === \"]\" || c === \"}\") depth -= 1;\n if (c === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n buf += c;\n }\n if (buf.trim()) parts.push(buf);\n const out: Record<string, DslActorNodeOverride> = {};\n for (const p of parts) {\n const colonIdx = p.indexOf(\":\");\n if (colonIdx < 0) continue;\n const key = p.slice(0, colonIdx).trim();\n const val = p.slice(colonIdx + 1).trim();\n if (!key || !val.startsWith(\"{\") || !val.endsWith(\"}\")) continue;\n const nodeOpts = parseInlineMapping(val.slice(1, -1));\n out[key] = {\n posX: numberOrUndef(nodeOpts.posX),\n posY: numberOrUndef(nodeOpts.posY),\n posW: numberOrUndef(nodeOpts.posW),\n posH: numberOrUndef(nodeOpts.posH),\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction coerceStateValue(raw: string): number | string | boolean {\n const stripped = stripQuotes(raw);\n if (stripped === \"true\") return true;\n if (stripped === \"false\") return false;\n const n = Number(stripped);\n if (Number.isFinite(n) && stripped !== \"\" && !isNaN(n)) return n;\n return stripped;\n}\n\n/**\n * パーツでない箱に倍率を書いた時に知らせる (#1026)。\n *\n * 倍率はパーツにしか効かない。 黙って捨てると「書いたのに大きさが変わらない」 が手掛かり\n * なしで起きる。 3 つの書き方すべてで同じ知らせを出す (縦に並べた形だけ知らせて他が黙る、\n * という状態を作らない)。\n */\nfunction reportScaleOnNonPart(\n isPart: boolean,\n key: string | undefined,\n line: number,\n errors: DslError[],\n): void {\n if (isPart || key === undefined) return;\n errors.push({\n line,\n message: `項目名が読めません: \"${key}\"`,\n hint: `使える項目 = ${[...ACTOR_ITEM_KEYS].join(\", \")}`,\n });\n}\n\n/**\n * 中括弧の形で読める項目名。\n *\n * ここに無い名前は、 パーツでない箱ではどこにも入らずに消える。 `ACTOR_ITEM_KEYS` (縦に\n * 並べた形) とは別に持つ = 中括弧の形は位置や大きさを未対応にしてあり、 同じ集合にすると\n * 「知らせない」 側がずれる。\n */\nconst INLINE_ACTOR_KEYS: ReadonlySet<string> = new Set([\n \"kind\", \"subtitle\", \"eyebrow\", \"value\", \"rows\", \"lane\", \"stack\",\n \"initial\", \"final\", \"tone\", \"nodes\",\n \"posX\", \"posY\", \"posW\", \"posH\",\n // 倍率は別経路 (`reportScaleOnNonPart`) が知らせる。 ここでも読める扱いにしないと\n // 同じ名前で 2 度知らせることになる\n \"scale\", \"倍率\",\n]);\n// `state` はパーツでだけ意味を持つ (`extractStateOverride` がパーツの時しか作らない)。\n// 通常の箱で読める扱いにすると `- A: { state: { foo: 1 } }` が黙って消え、 本 file が塞ごうと\n// している経路が予約語で残る (Round 1 review の指摘、 実測で確認)。 パーツ側は `isPart` の\n// 早期 return が先に効くのでここに載せる必要が無い\n\n/**\n * 中括弧に書かれた読めない項目名を知らせる (#1090)。\n *\n * 縦に並べた形は `applyContinuationLines` が既に知らせている。 中括弧の形だけが黙って\n * 捨てていた = 同じ意味を書いても、 書き方によって知らされたりされなかったりする。\n *\n * 実測 = 見本「プロジェクト構想」 は `- root: { title: \"新プロジェクト\" }` と書かれており、\n * 5 つの箱すべてで題が捨てられて識別子 (`root` 等) が出ていた。 知らせも出ないため、 書いた\n * 人には「書いたのに図が変わらない」 としか見えない。\n *\n * パーツでは知らせない。 中括弧に書いた名前は状態の上書きとして意味を持つ (`extractStateOverride`)。\n */\nfunction reportUnknownInlineKeys(\n isPart: boolean,\n inner: string,\n line: number,\n errors: DslError[],\n): void {\n if (isPart) return;\n // 値が空の形 (`{ title: }`) も見る。 `parseInlineMapping` は値が 1 文字以上ある項目しか\n // 拾わないため、 その結果を走査すると空白の有無で知らせが消える (実測 = `{title:}` と\n // `{ title:}` は黙って通り、 `{ title: }` だけ知らせが出た)。 契約が入力の整形に依存する\n // (Round 1 review の指摘)。 倍率が `writtenScaleFields` で同じ境界を持つのと揃える\n for (const field of splitInlineFields(inner)) {\n const idx = field.indexOf(\":\");\n if (idx < 0) continue;\n const key = field.slice(0, idx).trim();\n if (!key) continue;\n if (INLINE_ACTOR_KEYS.has(key)) continue;\n errors.push({\n line,\n message: `項目名が読めません: \"${key}\"`,\n hint: `使える項目 = ${[...INLINE_ACTOR_KEYS].join(\", \")}`,\n });\n }\n}\n\nfunction parseActor(line: Line, errors: DslError[]): DslActor | null {\n // 5 形式 サポート:\n // 1. `Client` ... name のみ、 kind=actor default\n // 2. `Client: storage` ... name + kind 略記\n // 3. `Client: { kind: actor, subtitle: \"...\" }` ... name + inline option mapping\n // 4. `\"画面\"` / `\"画面\": event` ... 日本語 quote\n // 5. `arc1: { kind: arc-gauge, v: 50 }` ... CAR-1657 parts kind (partId + stateOverride)\n const raw = line.trimmed.trim();\n if (!raw) return null;\n // 3 / 5. inline mapping check (`Client: { ... }`)、 nested { } を depth count で正しく抽出\n const mapMatch = matchActorInlineMapping(raw);\n if (mapMatch) {\n const namePart = stripQuotes(mapMatch.name.trim());\n if (!namePart) return null;\n const opts = parseInlineMapping(mapMatch.inner);\n const kindRaw = (opts.kind ?? \"\").toLowerCase();\n // CAR-1657 = kind が既存 NODE_KIND_VALID に無い場合 parts identifier 候補として partId に格納、\n // kind は actor default fallback。 compile 側 partsCatalog lookup で解決する。\n const isPart = kindRaw !== \"\" && !NODE_KIND_VALID.has(kindRaw);\n // 倍率はパーツにしか効かない。 書いたのに効かない状態を黙って作らない (#1026)。\n // 値が空の形でも名前を残すため、`opts` ではなく中身から直接拾う\n const inlineScale = resolveScale(writtenScaleFields(mapMatch.inner));\n reportScaleOnNonPart(isPart, inlineScale.keys[0], line.no, errors);\n // 中括弧に書いた読めない項目名も知らせる (#1090)。 縦に並べた形だけが知らせていた\n reportUnknownInlineKeys(isPart, mapMatch.inner, line.no, errors);\n const kind = isPart ? NODE_KIND_DEFAULT : resolveKind(NODE_KIND_VALID.has(kindRaw) ? kindRaw : \"\");\n return {\n name: namePart,\n kind,\n // parts 候補は `kind` を既定に倒して `partId` へ退避するため、 名札に載せる種類としては\n // 「書かなかった」 と同じ扱いにする (#1058)\n kindWritten: kindRaw !== \"\" && !isPart,\n subtitle: opts.subtitle,\n eyebrow: opts.eyebrow,\n value: opts.value,\n rows: opts.rows\n ? opts.rows\n .replace(/^\\[|\\]$/g, \"\")\n .split(/,(?![^[]*\\])/)\n .map((x) => stripQuotes(x.trim()))\n .filter(Boolean)\n : undefined,\n lane: opts.lane,\n stack: numberOrUndef(opts.stack),\n initial: boolOrUndef(opts.initial),\n final: boolOrUndef(opts.final),\n // parts では `tone` を状態の上書きとして従来から使えるため、 色として横取りしない\n tone: isPart ? undefined : toneOrUndef(opts.tone),\n partId: isPart ? kindRaw : undefined,\n stateOverride: isPart ? extractStateOverride(opts) : undefined,\n // canvas pivot 新 spec = 絶対座標 field を actor に格納、 compile 経由で CDL に受け渡す\n posX: numberOrUndef(opts.posX),\n posY: numberOrUndef(opts.posY),\n posW: numberOrUndef(opts.posW),\n posH: numberOrUndef(opts.posH),\n // 図形の倍率 (#1026)。 どれが効くかは `resolveScale` が 1 箇所で決める\n scale: inlineScale.scale,\n scaleKeys: inlineScale.keys.length ? inlineScale.keys : undefined,\n // canvas pivot UX 修正 (B1) = sub-node 単位 override map (`nodes: { header: {posX:..., ...}, ...}`)\n nodes: parseActorNodesField(opts.nodes),\n pos: { line: line.no },\n };\n }\n // 1 / 2 / 4\n if (lastTopLevelColon(raw) >= 0) {\n const idx = lastTopLevelColon(raw);\n const namePart = stripQuotes(raw.slice(0, idx).trim());\n const rest = raw.slice(idx + 1).trim();\n if (!namePart) return null;\n\n // `名前: 種類 \"補足\" [行, 行] 色` の形。 `{ }` を書かせない。\n //\n // 値は形で見分ける。 引用符付きは補足、 角括弧は行、 色名は色、 残りが種類。\n // 種類と色は語の集合が閉じているので取り違えない。\n const v = classifyValues(splitValues(rest));\n\n // CAR-1657 = short form (`arc1: arc-gauge`) でも parts kind 対応、 未知 kind は partId 経路\n const isPart = v.kind !== \"\" && !NODE_KIND_VALID.has(v.kind);\n // 倍率はパーツにしか効かない (#1026)\n reportScaleOnNonPart(isPart, v.scaleKeys?.[0], line.no, errors);\n const kind = isPart ? NODE_KIND_DEFAULT : resolveKind(NODE_KIND_VALID.has(v.kind) ? v.kind : \"\");\n return {\n name: namePart,\n kind,\n // parts 候補は `kind` を既定に倒して `partId` へ退避するため、 名札に載せる種類としては\n // 「書かなかった」 と同じ扱いにする (#1058)\n kindWritten: v.kind !== \"\" && !isPart,\n // parts では `tone` を状態の上書きとして扱うため、 色として渡さない\n tone: isPart ? undefined : v.tone,\n subtitle: v.subtitle,\n rows: v.rows,\n value: v.value,\n posX: v.posX,\n posY: v.posY,\n scale: v.scale,\n scaleKeys: v.scaleKeys?.length ? v.scaleKeys : undefined,\n partId: isPart ? v.kind : undefined,\n stateOverride: isPart ? v.state : undefined,\n pos: { line: line.no },\n };\n }\n const namePart = stripQuotes(raw);\n if (!namePart) return null;\n return { name: namePart, kind: NODE_KIND_DEFAULT, kindWritten: false, pos: { line: line.no } };\n}\n\nfunction parseFlowStep(line: Line, no: number): DslStep | null {\n // 形式 (順序自由、 部分省略可):\n // 1. `Client -> API` ... label / option なし\n // 2. `Client -> API: \"deposit\"` ... label\n // 3. `Client -> API: \"deposit\" (success)` ... label + tone tuple\n // 4. `Client -> API: \"deposit\" { sub: \"...\", guard: \"...\", cardinality: \"1:N\", labelOffsetY: -8 }` ... inline option\n // 5. `Client -> API: \"deposit\" (success) { guard: \"...\" }` ... 両方\n const raw = line.trimmed;\n const arrowIdx = raw.indexOf(\"->\");\n if (arrowIdx < 0) return null;\n const from = raw.slice(0, arrowIdx).trim();\n let rest = raw.slice(arrowIdx + 2).trim();\n let label = \"\";\n let tone: Tone | undefined;\n let style: EdgeStyle | undefined;\n let sub: string | undefined;\n let guard: string | undefined;\n let cardinality: string | undefined;\n let labelOffsetX: number | undefined;\n let labelOffsetY: number | undefined;\n // inline option (`{ ... }`) を末尾から抽出\n const mapMatch = rest.match(/\\s*\\{([^}]*)\\}\\s*$/);\n if (mapMatch) {\n const opts = parseInlineMapping(mapMatch[1]!);\n sub = opts.sub;\n guard = opts.guard;\n cardinality = opts.cardinality;\n labelOffsetX = numberOrUndef(opts.labelOffsetX);\n labelOffsetY = numberOrUndef(opts.labelOffsetY);\n rest = rest.slice(0, mapMatch.index ?? 0).trim();\n }\n // 色と線種を末尾から取る。 括弧 (`(成功)`) と空白区切り (`成功`) の両方を受け付ける。\n //\n // 括弧は従来の書き方で、 catalog が使っている。 空白区切りは登場人物と揃えた形。\n const optMatch = rest.match(/\\s*\\(([^)]*)\\)\\s*$/);\n if (optMatch) {\n const opts = (optMatch[1] ?? \"\").split(\",\").map((s) => s.trim());\n for (const opt of opts) {\n const resolvedTone = toneOrUndef(opt);\n if (resolvedTone !== undefined) tone = resolvedTone;\n else if (STYLE_VALID.has(opt.toLowerCase())) style = opt.toLowerCase() as EdgeStyle;\n }\n rest = rest.slice(0, optMatch.index ?? 0).trim();\n } else {\n // 末尾から順に、 色か線種として読める語を取る。 語の集合が閉じているので、 説明文の\n // 一部を誤って取ることはない。 読めない語に当たった時点で止める。\n const words = splitValues(rest);\n while (words.length > 1) {\n const last = words[words.length - 1]!;\n // 引用符付きは説明文なので取らない\n if (last.startsWith('\"') || last.startsWith(\"'\")) break;\n const resolvedTone = toneOrUndef(last);\n if (resolvedTone !== undefined) { tone = resolvedTone; words.pop(); continue; }\n if (STYLE_VALID.has(last.toLowerCase())) { style = last.toLowerCase() as EdgeStyle; words.pop(); continue; }\n break;\n }\n rest = words.join(\" \");\n }\n let to = rest;\n const labelMatch = rest.match(/^(.+?):\\s*(.+)$/);\n if (labelMatch) {\n to = (labelMatch[1] ?? \"\").trim();\n label = stripQuotes((labelMatch[2] ?? \"\").trim());\n }\n if (!from || !to) return null;\n return {\n no,\n from: stripQuotes(from),\n to: stripQuotes(to),\n label,\n tone,\n style,\n sub,\n guard,\n cardinality,\n labelOffsetX,\n labelOffsetY,\n pos: { line: line.no },\n };\n}\n\nfunction parseStateEntry(text: string, lineNo: number): DslState | null {\n // `client_bal: 100` / `status: \"idle\"`\n const m = text.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*(.+)$/);\n if (!m) return null;\n const name = m[1] ?? \"\";\n const raw = (m[2] ?? \"\").trim();\n const stripped = stripQuotes(raw);\n const asNum = Number(stripped);\n const initial: number | string = Number.isFinite(asNum) && stripped !== \"\" && !isNaN(asNum) ? asNum : stripped;\n return { name, initial, pos: { line: lineNo } };\n}\n\nfunction splitTopLevelCommas(s: string): string[] {\n // brace 内を考慮 ... 今回は単純 split (動作する範囲)\n return s.split(\",\").map((x) => x.trim()).filter(Boolean);\n}\n\nfunction ensureAnimate(a: DslAnimate | undefined, lineNo: number): DslAnimate {\n if (a) return a;\n return { states: [], phases: [], pos: { line: lineNo } };\n}\n\nfunction parsePhase(block: Line[], errors: DslError[]): DslPhase | null {\n // block[0]!: `step: \"request\" 1.5s`\n const head = block[0]!;\n const m = head.trimmed.match(/^step\\s*:\\s*(.+)$/);\n if (!m) {\n errors.push({ line: head.no, message: `invalid step header: \"${head.trimmed}\"`, hint: 'use `- step: \"name\" 1.5s`' });\n return null;\n }\n const headRest = (m[1] ?? \"\").trim();\n // `\"request\" 1.5s` 形式 ... quote 後の duration 抽出\n const headParse = parseStepHead(headRest);\n if (!headParse) {\n errors.push({ line: head.no, message: `invalid step value: \"${headRest}\"`, hint: 'use `\"name\" 1.5s` (duration in s)' });\n return null;\n }\n const phase: DslPhase = {\n name: headParse.name,\n durationMs: headParse.durationMs,\n pos: { line: head.no },\n highlight: [],\n tweens: [],\n sets: [],\n };\n // 後続 property を順次 parse\n let i = 1;\n while (i < block.length) {\n const ln = block[i]!;\n const t = ln.trimmed;\n const propMatch = t.match(/^([a-zA-Z][a-zA-Z0-9_]*)\\s*:\\s*(.*)$/);\n if (!propMatch) {\n i += 1;\n continue;\n }\n const key = (propMatch[1] ?? \"\").toLowerCase();\n const value = (propMatch[2] ?? \"\").trim();\n if (key === \"focus\") {\n phase.highlight = parseFocusList(value);\n i += 1;\n continue;\n }\n if (key === \"badge\") {\n phase.badge = stripQuotes(value);\n i += 1;\n continue;\n }\n if (key === \"description\" || key === \"body\") {\n phase.body = stripQuotes(value);\n i += 1;\n continue;\n }\n if (key === \"tween\") {\n // inline (tween: client_bal 100 -> 90) or block\n if (value) {\n const tw = parseTweenLine(value, ln.no);\n if (tw) phase.tweens!.push(tw);\n else errors.push({ line: ln.no, message: `invalid tween: \"${value}\"`, hint: \"use `tween: name 100 -> 90`\" });\n i += 1;\n continue;\n }\n // block ... 後続の同 indent + 1 以上の行を取り込む\n const baseIndent = ln.indent;\n let j = i + 1;\n while (j < block.length) {\n const nx = block[j]!;\n if (nx.indent <= baseIndent) break;\n const tw = parseTweenLine(nx.trimmed, nx.no);\n if (tw) phase.tweens!.push(tw);\n else errors.push({ line: nx.no, message: `invalid tween entry: \"${nx.trimmed}\"`, hint: \"use `name: 100 -> 90`\" });\n j += 1;\n }\n i = j;\n continue;\n }\n if (key === \"set\") {\n if (value) {\n const st = parseSetLine(value, ln.no);\n if (st) phase.sets!.push(st);\n i += 1;\n continue;\n }\n const baseIndent = ln.indent;\n let j = i + 1;\n while (j < block.length) {\n const nx = block[j]!;\n if (nx.indent <= baseIndent) break;\n const st = parseSetLine(nx.trimmed, nx.no);\n if (st) phase.sets!.push(st);\n j += 1;\n }\n i = j;\n continue;\n }\n i += 1;\n }\n return phase;\n}\n\nfunction parseStepHead(s: string): { name: string; durationMs: number } | null {\n // 例: `\"request\" 1.5s` / `\"step1\" 1500ms` / `step1 2s`\n let rest = s.trim();\n let name = \"\";\n if (rest.startsWith('\"') || rest.startsWith(\"'\")) {\n const q = rest[0] ?? '\"';\n const end = rest.indexOf(q, 1);\n if (end < 0) return null;\n name = rest.slice(1, end);\n rest = rest.slice(end + 1).trim();\n } else {\n const spaceIdx = rest.indexOf(\" \");\n if (spaceIdx < 0) return null;\n name = rest.slice(0, spaceIdx);\n rest = rest.slice(spaceIdx + 1).trim();\n }\n const dm = rest.match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s)?$/);\n if (!dm) return null;\n const n = parseFloat(dm[1] ?? \"0\");\n const unit = dm[2] ?? \"s\";\n const durationMs = unit === \"ms\" ? Math.round(n) : Math.round(n * 1000);\n return { name, durationMs };\n}\n\nfunction parseFocusList(s: string): string[] {\n // `[Client, API]` / `Client, API` / `Client API` / `[Client, API, \"Client -> API\"]`\n // quote 内の space / comma / arrow は保護し、 quote 外の comma でのみ split する。\n let body = s.trim();\n if (body.startsWith(\"[\") && body.endsWith(\"]\")) body = body.slice(1, -1);\n const parts: string[] = [];\n let buf = \"\";\n let quote: string | null = null;\n for (const ch of body) {\n if (quote) {\n if (ch === quote) {\n quote = null;\n continue;\n }\n buf += ch;\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \",\") {\n const t = buf.trim();\n if (t) parts.push(t);\n buf = \"\";\n continue;\n }\n buf += ch;\n }\n const tail = buf.trim();\n if (tail) parts.push(tail);\n // \"User -> API\" のような quote 済 item は「1 item」 として parts に入る。\n // quote 外 item は依然として space split (旧挙動、 「Client API」 が 2 item として解釈される互換維持)。\n const out: string[] = [];\n for (const p of parts) {\n if (/[-→][>]?/.test(p) && /\\s/.test(p)) {\n // arrow を含む item は「A -> B」 パターン、 分割せず 1 item として保持\n out.push(p);\n continue;\n }\n if (/\\s/.test(p)) {\n // space 含み + arrow なし = 旧挙動の「Client API」 → 2 item\n for (const x of p.split(/\\s+/)) {\n if (x) out.push(x);\n }\n continue;\n }\n out.push(p);\n }\n return out;\n}\n\nfunction parseTweenLine(s: string, lineNo: number): DslTween | null {\n // `client_bal 100 -> 90` / `client_bal: 100 -> 90`\n const cleaned = s.replace(/^-\\s*/, \"\").trim();\n const m = cleaned.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*[:\\s]\\s*(-?\\d+(?:\\.\\d+)?)\\s*->\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (!m) return null;\n return {\n state: m[1] ?? \"\",\n from: parseFloat(m[2] ?? \"0\"),\n to: parseFloat(m[3] ?? \"0\"),\n pos: { line: lineNo },\n };\n}\n\nfunction parseSetLine(s: string, lineNo: number): DslSet | null {\n // `status: \"loading\"` / `status loading`\n const cleaned = s.replace(/^-\\s*/, \"\").trim();\n const m = cleaned.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*[:\\s]\\s*(.+)$/);\n if (!m) return null;\n const raw = (m[2] ?? \"\").trim();\n const stripped = stripQuotes(raw);\n const asNum = Number(stripped);\n const value: number | string = Number.isFinite(asNum) && stripped !== \"\" && !isNaN(asNum) ? asNum : stripped;\n return { state: m[1] ?? \"\", value, pos: { line: lineNo } };\n}\n","/**\n * Notation lint (author 向け修正システム)。\n *\n * cdl / dragon 記法で書かれた CdlDiagram を rule-based に検査し、\n * 「もっと良い書き方」 を suggestion として返す純粋関数。 LLM 不要、 rule のみ。\n *\n * 検知システム (`check:cdl` / `check:dragon` / `check:kind`) は開発陣向けで\n * 「実装バグ」 を検出するが、 本 notation-lint は **author 向け** で\n * 「書き方の癖 / 冗長表現 / 未定義参照 / 空 payload」 等を検出する。\n *\n * 使い方:\n * import { lintDiagram } from \"@cardenelabs/dragon\";\n * const report = lintDiagram(diagram);\n * // report.issues[] = LintIssue[]\n * // report.fixed = LintIssue[] のうち自動修正で解消される件\n * // report.autoFix(diagram) = 修正済 CdlDiagram\n *\n * CLI:\n * pnpm dragon-lint apps/playground-spa/src/topics/catalog/presets.cdl.ts\n */\nimport type { CdlDiagram, CdlNode } from \"@cardenelabs/cdl\";\n\nexport type LintSeverity = \"warn\" | \"info\";\n\nexport type LintIssue = {\n /** rule 識別子 */\n rule: string;\n severity: LintSeverity;\n /** 該当対象 (node id / edge id / diagram id) */\n target: string;\n /** 人間向けメッセージ */\n message: string;\n /** 修正案 (自動修正可能なら適用後の値、 手動修正必要なら null) */\n suggestion?: string;\n /** autoFix() が本 issue を自動解消できるか */\n autoFixable: boolean;\n};\n\nexport type LintReport = {\n diagramId: string;\n issues: LintIssue[];\n /** autoFix() が実際に解消できる issue の数 */\n autoFixableCount: number;\n};\n\nconst REDUNDANT_TOPIC_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [\n { pattern: /\\bpreset\\s*\\(/i, hint: \"「〜 preset (詳細)」 は実装表現、 「〜 を示す図」 のように読者向け説明に\" },\n { pattern: /render\\s*未実装/, hint: \"「render 未実装」 は開発者向け内部メモ、 catalog 表示では省く\" },\n { pattern: /SVG\\s+(polyline|arc|rect|path)/i, hint: \"「SVG polyline / arc / rect / path」 は実装詳細、 「〜 を示す図」 に置換\" },\n { pattern: /\\bpolygon\\b/i, hint: \"「polygon」 は実装用語、 図の意味を説明する自然文に置換\" },\n];\n\n/**\n * 検査対象 diagram の全 rule を実行し LintReport を返す。\n * 全 rule は純粋 (副作用なし / LLM 呼び出しなし)。\n */\nexport function lintDiagram(d: CdlDiagram): LintReport {\n const issues: LintIssue[] = [];\n\n issues.push(...ruleTopicRedundancy(d));\n issues.push(...ruleEmptyChartData(d));\n issues.push(...ruleGanttUnknownDependsOn(d));\n issues.push(...ruleMindMapParentReference(d));\n issues.push(...ruleTreeParentReference(d));\n issues.push(...ruleQuadrantMissingItems(d));\n issues.push(...ruleFunnelMonotonicCount(d));\n\n return {\n diagramId: d.id,\n issues,\n autoFixableCount: issues.filter((i) => i.autoFixable).length,\n };\n}\n\n/**\n * lintDiagram で detected な issue のうち autoFixable=true のものを機械的に適用して\n * 修正済 CdlDiagram を返す。 手動修正必要な issue は残る (次回 lint 時に再検出)。\n */\nexport function autoFix(d: CdlDiagram): CdlDiagram {\n const patched: CdlDiagram = {\n ...d,\n topic: applyTopicAutoFix(d.topic),\n nodes: d.nodes.map((n) => ({ ...n })),\n };\n return patched;\n}\n\nconst KIND_TO_JA: Record<string, string> = {\n chart: \"統計チャート\",\n \"line chart\": \"折れ線グラフ\",\n \"pie chart\": \"円グラフ\",\n \"bar chart\": \"棒グラフ\",\n flow: \"処理の流れ\",\n swimlane: \"スイムレーン (役割別レーン)\",\n sequence: \"時系列のやり取り\",\n topology: \"システム構成\",\n er: \"テーブル関係 (ER 図)\",\n stateMachine: \"状態遷移 (ステート図)\",\n stateMachine2: \"拡張ステート図 (階層状態)\",\n infrastructure: \"クラウド構成\",\n classDiagram: \"UML クラス図\",\n tree: \"階層ツリー\",\n userJourney: \"ユーザージャーニー\",\n mindMap: \"マインドマップ\",\n mindMapRadial: \"放射状マインドマップ\",\n funnel: \"ファネル (段階別離脱)\",\n quadrant: \"四象限マトリクス\",\n gantt: \"ガントチャート\",\n flowchart: \"分岐フローチャート\",\n network: \"ネットワーク構成\",\n};\n\nfunction applyTopicAutoFix(topic: string): string {\n // 1. 先頭の kind name を検出、 マッチしたら JA description に置換\n const kindMatch = topic.match(\n /^\\s*(chart|flow|swimlane|sequence|topology|er|stateMachine2?|infrastructure|classDiagram|tree|userJourney|mindMap(?:Radial)?|funnel|quadrant|gantt|flowchart|network|line chart|pie chart|bar chart)\\b/i,\n );\n if (kindMatch) {\n const kind = kindMatch[1]!.toLowerCase();\n const canonical = Object.keys(KIND_TO_JA).find((k) => k.toLowerCase() === kind);\n if (canonical) {\n return `${KIND_TO_JA[canonical]} を示す図`;\n }\n }\n\n // 2. kind 名で始まらない場合は括弧内実装詳細のみ除去\n let out = topic;\n out = out.replace(/\\s*\\([^)]*(preset|render|SVG|polygon|polyline|arc|rect|path)[^)]*\\)/gi, \"\");\n out = out.replace(/\\b(preset|render)\\b/gi, \"\");\n out = out.replace(/\\s+/g, \" \").trim();\n if (out.length < 3) return \"図の説明\";\n return out;\n}\n\nfunction ruleTopicRedundancy(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const { pattern, hint } of REDUNDANT_TOPIC_PATTERNS) {\n if (pattern.test(d.topic)) {\n out.push({\n rule: \"topic-redundant-implementation-detail\",\n severity: \"warn\",\n target: d.id,\n message: `topic に実装詳細が含まれる: \"${d.topic}\"`,\n suggestion: hint,\n autoFixable: true,\n });\n }\n }\n return out;\n}\n\nfunction ruleEmptyChartData(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"chart-line\" || n.kind === \"chart-pie\" || n.kind === \"chart-bar\") {\n const data = n.chartData ?? [];\n if (data.length === 0) {\n out.push({\n rule: \"chart-empty-datum\",\n severity: \"warn\",\n target: n.id,\n message: `chart node \"${n.id}\" が datum 0 件、 chart は非表示になる`,\n suggestion: `.datum({ id: ..., label: ..., value: ... }) を 1 件以上追加`,\n autoFixable: false,\n });\n }\n if (data.length === 1) {\n out.push({\n rule: \"chart-single-datum\",\n severity: \"info\",\n target: n.id,\n message: `chart node \"${n.id}\" が datum 1 件、 比較 / 推移として意味が薄い`,\n suggestion: `2 件以上の datum を推奨 (line 系は 3 件以上で trend が見える)`,\n autoFixable: false,\n });\n }\n }\n }\n return out;\n}\n\nfunction ruleGanttUnknownDependsOn(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"gantt-timeline\") {\n const tasks = n.ganttData ?? [];\n const ids = new Set(tasks.map((t) => t.id));\n for (const t of tasks) {\n if (t.dependsOn && !ids.has(t.dependsOn)) {\n out.push({\n rule: \"gantt-unknown-depends-on\",\n severity: \"warn\",\n target: t.id,\n message: `task \"${t.id}\" が未定義 task \"${t.dependsOn}\" に dependsOn 参照`,\n suggestion: `参照先 id を修正 or dependsOn を除去`,\n autoFixable: false,\n });\n }\n }\n }\n }\n return out;\n}\n\nfunction ruleMindMapParentReference(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if ((n.kind === \"mind-map\" || n.kind === \"mind-radial\") && n.mindData) {\n const known = new Set<string>([n.mindData.rootId]);\n for (const b of n.mindData.branches) known.add(b.id);\n for (const b of n.mindData.branches) {\n if (!known.has(b.parent)) {\n out.push({\n rule: \"mindmap-unknown-parent\",\n severity: \"warn\",\n target: b.id,\n message: `branch \"${b.id}\" が未定義 parent \"${b.parent}\" を参照`,\n suggestion: `parent を rootId (\"${n.mindData.rootId}\") または既存 branch id に修正`,\n autoFixable: false,\n });\n }\n }\n }\n }\n return out;\n}\n\nfunction ruleTreeParentReference(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"tree-hierarchy\" && n.treeData) {\n const ids = new Set(n.treeData.map((t) => t.id));\n for (const t of n.treeData) {\n if (t.parent && !ids.has(t.parent)) {\n out.push({\n rule: \"tree-unknown-parent\",\n severity: \"warn\",\n target: t.id,\n message: `tree node \"${t.id}\" が未定義 parent \"${t.parent}\" を参照`,\n suggestion: `parent id を既存 tree node に修正 or parent 除去 (root にする)`,\n autoFixable: false,\n });\n }\n }\n }\n }\n return out;\n}\n\nfunction ruleQuadrantMissingItems(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"quadrant-matrix\" && n.quadrantData) {\n const items = n.quadrantData.items;\n if (items.length === 0) {\n out.push({\n rule: \"quadrant-empty\",\n severity: \"warn\",\n target: n.id,\n message: `quadrant \"${n.id}\" が item 0 件、 軸のみ表示される`,\n suggestion: `.item({ id: ..., title: ..., quadrant: \"topLeft\" | ... }) を 1 件以上追加`,\n autoFixable: false,\n });\n }\n const bySlot = new Set(items.map((it) => it.quadrant));\n if (items.length >= 4 && bySlot.size === 1) {\n out.push({\n rule: \"quadrant-single-quadrant\",\n severity: \"info\",\n target: n.id,\n message: `quadrant \"${n.id}\" の item が 1 象限に集中、 マトリクスの意味が薄い`,\n suggestion: `2 象限以上に item を分散 (SWOT / Priority matrix 等は 4 象限 balanced を推奨)`,\n autoFixable: false,\n });\n }\n }\n }\n return out;\n}\n\nfunction ruleFunnelMonotonicCount(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"funnel-stages\" && n.funnelData) {\n const stages = n.funnelData;\n for (let i = 1; i < stages.length; i++) {\n if (stages[i]!.count > stages[i - 1]!.count) {\n out.push({\n rule: \"funnel-increasing-count\",\n severity: \"warn\",\n target: stages[i]!.id,\n message: `stage \"${stages[i]!.id}\" (${stages[i]!.count}) が前段 (${stages[i - 1]!.count}) より増加、 funnel は単調減少が期待される`,\n suggestion: `stage 順を再確認、 増加 pattern なら別 preset (chart-line 等) を検討`,\n autoFixable: false,\n });\n }\n }\n }\n }\n return out;\n}\n\n// dev-only import bridging (unused var lint prevention)\nexport type { CdlDiagram, CdlNode };\n","/**\n * canvas pivot 新 spec 図境界計算 helper (dragon canvas pivot spec §diagram-boundary)。\n *\n * 図の bounding box (点線四角) を「構成パーツの外接矩形 + 余白」 で計算する SSOT。\n * CDL の layout() を呼んで LaidDiagram.viewBox から外接矩形を取得し、 spec 準拠の 20px 余白を加える。\n *\n * 用途:\n * - dragon editor で drag 中の overlay が「図の中」 に入ったか判定 (spec §4 自動調整発動)\n * - dragon renderer で図 hover 時に dashed rect を描画 (spec 項目 4 の視覚 UI)\n * - PR-B 以降で drag / resize / snap 判定の base rect として参照\n */\n\nimport type { CdlDiagram, LaidDiagram } from \"@cardenelabs/cdl\";\nimport { layout } from \"@cardenelabs/cdl\";\n\n/** 図境界の padding (SVG unit)、 spec §diagram-boundary で 20 と定めた */\nexport const DIAGRAM_BOUNDARY_PADDING = 20;\n\nexport type DiagramBoundingBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\n/**\n * CdlDiagram の外接矩形 + 20px 余白を計算する。\n * layout() が返す LaidDiagram.viewBox は既に全 element を包む rect (右端 +80 / 下端 +80 の CDL 既定余白付き)。\n * それにさらに spec 準拠の 20px を加えて figure 判定 buffer とする。\n */\nexport function computeDiagramBoundingBox(diag: CdlDiagram): DiagramBoundingBox {\n const laid: LaidDiagram = layout(diag);\n const vb = laid.viewBox;\n return {\n x: vb.x - DIAGRAM_BOUNDARY_PADDING,\n y: vb.y - DIAGRAM_BOUNDARY_PADDING,\n width: vb.w + DIAGRAM_BOUNDARY_PADDING * 2,\n height: vb.h + DIAGRAM_BOUNDARY_PADDING * 2,\n };\n}\n\n/**\n * bbox 同士の重なり判定 (dragon canvas pivot spec §4 図内 drag 判定 SSOT)。\n * user 明示 「1 部でも重なれば中」 = 交差面積 > 0 を判定。\n */\nexport function rectsOverlap(a: DiagramBoundingBox, b: DiagramBoundingBox): boolean {\n const aRight = a.x + a.width;\n const aBottom = a.y + a.height;\n const bRight = b.x + b.width;\n const bBottom = b.y + b.height;\n return a.x < bRight && aRight > b.x && a.y < bBottom && aBottom > b.y;\n}\n","/**\n * 登場人物 1 人の位置を DSL 本文に書き込む。\n *\n * editor の画面で見えている座標を、 そのまま記法に落とすために使う。 書く人は図を見ながら\n * 数値を決められないので、 今の位置を出発点として渡す経路が要る。\n *\n * 記法を知っているのは本 package なので、 本文の書き換えもここに置く。 画面側に置くと\n * 記法が増えた時に画面側だけが取り残される。\n *\n * 書き方は 4 通りあり、 元の形を保ったまま位置だけを差し替える。 形を勝手に揃えると、\n * 書いた人の見た目が変わって差分が読めなくなる。\n */\n\n/** 位置の書き込み結果。 対象が見つからなければ null。 */\nexport function writeActorPosition(\n src: string,\n actorName: string,\n posX: number,\n posY: number,\n): string | null {\n if (!Number.isFinite(posX) || !Number.isFinite(posY)) return null;\n const x = Math.round(posX);\n const y = Math.round(posY);\n\n // 改行コードは行ごとに元のまま残す。 buffer 全体で一括判定すると、 混在した本文で\n // 無関係な行の改行まで書き換わって差分が変更箇所の外に広がる\n const seg = src.split(/(\\r\\n|\\n)/);\n const lineAt = (i: number): string => seg[i * 2] ?? \"\";\n const lineCount = Math.ceil(seg.length / 2);\n\n // 探すのは `actors:` の中だけ。 全文を走ると、 別の項目に同じ名前で並ぶ行\n // (`notes:` の下の `- API: service` 等) を先に掴んで書き換える (実測)\n const span = actorsSpan(lineAt, lineCount);\n if (!span) return null;\n\n for (let i = span.from; i < span.to; i += 1) {\n const head = matchActorHead(lineAt(i));\n if (!head || head.name !== actorName) continue;\n\n // 1. `- API: { kind: service }` = 中括弧の中に座標を入れる\n if (head.rest.startsWith(\"{\") && head.rest.endsWith(\"}\")) {\n seg[i * 2] = `${head.prefix}{ ${upsertInlineFields(head.rest.slice(1, -1), x, y)} }`;\n return seg.join(\"\");\n }\n\n // 2. `- API:` だけの行 = 続く字下げ行に `位置:` を入れる\n if (head.hasColon && head.rest === \"\") {\n return writeVerticalForm(seg, i, span.to, head.indent, x, y);\n }\n\n // 3. `- API: service` = 値の並びに `@x,y` を入れる\n if (head.hasColon) {\n seg[i * 2] = `${head.prefix}${upsertAtToken(head.rest, x, y)}`;\n return seg.join(\"\");\n }\n\n // 4. `- API` = 名前だけ。 値を書ける形にしてから座標を足す\n seg[i * 2] = `${head.indentText}- ${head.rawName}: @${x},${y}`;\n return seg.join(\"\");\n }\n return null;\n}\n\n/**\n * `actors:` block の行範囲。 見つからなければ null。\n *\n * 開始は行頭の `actors:` に限る。 終わりは次の行頭項目 (字下げなしの `key:`) の直前。\n *\n * `actors:` が複数ある本文では最後のものを返す。 記法側は同じ項目が 2 度現れると後の方で\n * 上書きするため、 最初のものを見ると parser が採らない箱を書き換えることになる\n * (実測 = 後の block に居る箱の書き戻しが `null` になった)。\n */\nfunction actorsSpan(\n lineAt: (i: number) => string,\n lineCount: number,\n): { from: number; to: number } | null {\n let from = -1;\n let to = lineCount;\n for (let i = 0; i < lineCount; i += 1) {\n const line = lineAt(i);\n if (/^actors[ \\t]*:[ \\t]*$/.test(line)) {\n from = i + 1;\n to = lineCount;\n continue;\n }\n // 字下げのない `key:` は次の項目の始まり。 直前の block はそこで閉じる\n if (from >= 0 && to === lineCount && /^[^\\s#][^:]*:/.test(line)) to = i;\n }\n return from < 0 ? null : { from, to };\n}\n\ntype ActorHead = {\n /** 行頭から `:` までをそのまま保つ。 元の空白の入れ方を壊さないために持つ */\n prefix: string;\n indentText: string;\n indent: number;\n rawName: string;\n name: string;\n hasColon: boolean;\n rest: string;\n};\n\n/**\n * ` - API: service` の形を、 前置き / 名前 / 残りに分ける。\n *\n * `:` を任意にした 1 本の正規表現では書けない。 名前の部分を控えめに取ると `A` で切って\n * 残りを `PI: service` と読んでしまう (実測)。 `:` のある形を先に当てる。\n */\nfunction matchActorHead(line: string): ActorHead | null {\n const NAME = String.raw`\"(?:[^\"\\\\]|\\\\.)*\"|[^:\\s][^:]*?`;\n const withColon = line.match(new RegExp(String.raw`^(\\s*)-[ \\t]+(${NAME})[ \\t]*:[ \\t]*(.*)$`));\n if (withColon) {\n const [, indentText = \"\", rawName = \"\", rest = \"\"] = withColon;\n return {\n // 元の空白の入れ方を壊さないよう、 行頭から値の直前までをそのまま持つ\n prefix: line.slice(0, line.length - rest.length),\n indentText,\n indent: indentText.length,\n rawName,\n name: unquote(rawName),\n hasColon: true,\n rest: rest.trimEnd(),\n };\n }\n const nameOnly = line.match(new RegExp(String.raw`^(\\s*)-[ \\t]+(\"(?:[^\"\\\\]|\\\\.)*\"|\\S+)[ \\t]*$`));\n if (!nameOnly) return null;\n const [, indentText = \"\", rawName = \"\"] = nameOnly;\n return {\n prefix: line,\n indentText,\n indent: indentText.length,\n rawName,\n name: unquote(rawName),\n hasColon: false,\n rest: \"\",\n };\n}\n\nfunction unquote(raw: string): string {\n if (!raw.startsWith('\"') || !raw.endsWith('\"') || raw.length < 2) return raw;\n return raw.slice(1, -1).replace(/\\\\(.)/g, \"$1\");\n}\n\n/**\n * 空白区切りの値の並びに `@x,y` を差し込む。 既に書かれていれば差し替える。\n *\n * 引用符の中は触らない。 補足 (`\"@1,2 の話\"`) を座標と取り違えないため。\n */\nfunction upsertAtToken(rest: string, x: number, y: number): string {\n const kept = splitOutsideQuotes(rest).filter((t) => !/^@-?\\d+(\\.\\d+)?\\s*[,、]\\s*-?\\d+(\\.\\d+)?$/.test(t));\n kept.push(`@${x},${y}`);\n return kept.join(\" \");\n}\n\n/** 引用符と角括弧の外の空白で区切る。 */\nfunction splitOutsideQuotes(s: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let quote: '\"' | \"'\" | null = null;\n let depth = 0;\n for (let i = 0; i < s.length; i += 1) {\n const c = s[i]!;\n if (quote) {\n buf += c;\n if (quote === '\"' && c === \"\\\\\") {\n buf += s[i + 1] ?? \"\";\n i += 1;\n continue;\n }\n if (c === quote) quote = null;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n buf += c;\n continue;\n }\n if (c === \"[\") depth += 1;\n if (c === \"]\") depth -= 1;\n if (/\\s/.test(c) && depth === 0) {\n if (buf) out.push(buf);\n buf = \"\";\n continue;\n }\n buf += c;\n }\n if (buf) out.push(buf);\n return out;\n}\n\n/** 中括弧の中の `posX` / `posY` を差し替える。 他の項目は順番ごと残す。 */\nfunction upsertInlineFields(inner: string, x: number, y: number): string {\n const kept = splitTopLevel(inner).filter((f) => {\n const key = f.slice(0, f.indexOf(\":\")).trim();\n return key !== \"posX\" && key !== \"posY\";\n });\n kept.push(`posX: ${x}`, `posY: ${y}`);\n return kept.join(\", \");\n}\n\n/** 中括弧と角括弧の深さ 0 の `,` で区切る。 入れ子の中の項目を top-level と取り違えない。 */\nfunction splitTopLevel(inner: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let start = 0;\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < inner.length; i += 1) {\n const c = inner[i]!;\n if (quote) {\n if (quote === '\"' && c === \"\\\\\") {\n i += 1;\n continue;\n }\n if (c === quote) quote = null;\n continue;\n }\n if (c === '\"' || c === \"'\") quote = c;\n else if (c === \"{\" || c === \"[\") depth += 1;\n else if (c === \"}\" || c === \"]\") depth -= 1;\n else if (c === \",\" && depth === 0) {\n out.push(inner.slice(start, i));\n start = i + 1;\n }\n }\n out.push(inner.slice(start));\n return out.map((f) => f.trim()).filter((f) => f.length > 0);\n}\n\n/**\n * 縦に並べた形に `位置:` を入れる。\n *\n * 既にあれば値だけ差し替える。 無ければ最後の項目の次に足す。 字下げは既にある項目に\n * 合わせ、 項目が 1 つも無ければ頭の字下げに 4 を足す。\n *\n * 差し替える対象は登場人物の直下の項目だけ。 深さを見ないと、 入れ子の中の `位置:`\n * (`nodes: → header: → 位置:`) を掴んで書き換える (実測)。\n */\nfunction writeVerticalForm(\n seg: string[],\n headIdx: number,\n lineCount: number,\n headIndent: number,\n x: number,\n y: number,\n): string {\n let lastChild = -1;\n let childIndent = -1;\n for (let j = headIdx + 1; j < lineCount; j += 1) {\n const line = seg[j * 2] ?? \"\";\n if (line.trim() === \"\") continue;\n const indent = line.length - line.trimStart().length;\n if (indent <= headIndent) break;\n if (childIndent < 0) childIndent = indent;\n lastChild = j;\n // 位置 / pos の行が既にあれば、 その行の値だけ差し替える。 直下の深さのものだけを見る\n const key = indent === childIndent ? line.trim().match(/^(位置|pos)\\s*:/) : null;\n if (key) {\n seg[j * 2] = `${\" \".repeat(indent)}${key[1]}: ${x},${y}`;\n return seg.join(\"\");\n }\n }\n const indent = childIndent >= 0 ? childIndent : headIndent + 4;\n const newLine = `${\" \".repeat(indent)}位置: ${x},${y}`;\n const insertAt = (lastChild >= 0 ? lastChild : headIdx) + 1;\n // 挿入位置の直前で実際に使われている改行に合わせる。 末尾に足す時は最後の区切りを見る\n const sep = seg[insertAt * 2 - 1] ?? seg[seg.length - 2] ?? \"\\n\";\n if (insertAt * 2 >= seg.length) seg.push(sep, newLine);\n else seg.splice(insertAt * 2, 0, newLine, sep);\n return seg.join(\"\");\n}\n","/**\n * LLM 向け JSON DSL parser。\n *\n * dragon の YAML DSL と 1:1 対応する JSON 記法を提供する。\n * LLM (Anthropic Claude / OpenAI GPT) が structured output (tool call / response_format)\n * で確実に生成できるよう、 flat な object array を優先した shape になっている。\n *\n * 使い方 (LLM):\n * 1. `packages/dragon/schemas/diagram.json` の JSON Schema を LLM の tool schema に注入\n * 2. LLM が JSON を返す\n * 3. `jsonToDiagram(json)` で CdlDiagram に変換\n * 4. validation error は throw、 retry loop で LLM に修正させる\n *\n * YAML との対応:\n * YAML `title: \"...\"` ⇔ JSON `{title: \"...\"}`\n * YAML `actors: [A, B: kind]` ⇔ JSON `{actors: [{name: \"A\"}, {name: \"B\", kind: \"storage\"}]}`\n * YAML `flow: [- A -> B: \"label\"]` ⇔ JSON `{flow: [{from: \"A\", to: \"B\", label: \"label\"}]}`\n * YAML `animation: [step: \"...\"]` ⇔ JSON `{animation: [{step: \"...\", duration: 1.4, focus: [...]}]}`\n */\n\nimport type { CdlDiagram, NodeKind, Tone, EdgeStyle } from \"@cardenelabs/cdl\";\nimport type { DslDocument, DslActor, DslStep, DslAnimate, DslPhase, PresetType, LayoutMode, LayoutPos } from \"./types\";\nimport { compileToCdl } from \"./compile\";\n\n/**\n * LLM 向け JSON DSL の入力 shape。 YAML DSL と 1:1 対応、 top-level は flat な object。\n */\nexport interface DragonJson {\n /** 図の title (必須) */\n title: string;\n /** preset type (必須): sequence / flow / swimlane / er / state / topology / solidity / gantt / class / pie / c4 / mind */\n type: PresetType;\n /** 登場人物 (必須): 文字列 or { name, kind, ... } object */\n actors: (string | JsonActor)[];\n /** flow step 配列 (必須): { from, to, label, ... } */\n flow: JsonStep[];\n /** animation phase 配列 (optional) */\n animation?: JsonPhase[];\n /** viewport (optional): 全体 canvas size / gap */\n viewport?: {\n width?: number;\n height?: number;\n laneWidth?: number;\n gap?: number;\n laneGap?: number;\n nodeGap?: number;\n labelMargin?: number;\n };\n /** lanes (optional): topology / swimlane preset で使う lane 宣言 */\n lanes?: Record<string, {\n x?: number;\n width?: number;\n label?: string;\n contain?: boolean;\n lifeline?: boolean;\n /**\n * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は\n * backward compat、 set 済は Phase 2 の applyPosOffset で lane 位置を shift する。\n */\n pos?: LayoutPos;\n }>;\n /** groups (optional): topology preset で使う group 宣言 */\n groups?: Record<string, {\n label?: string;\n lanes: string[];\n }>;\n /**\n * canvas pivot (CAR-1693 Phase 1) diagram-level layout mode。 \"auto\" (default) は catalog 100+\n * backward compat、 \"manual\" は Phase 4 で drag → pos: 保存の完全 manual mode として使う予定。\n */\n layout?: LayoutMode;\n}\n\nexport interface JsonActor {\n name: string;\n /**\n * CAR-1657 unified syntax = 既存 NodeKind (28 個) に加えて parts identifier (arc-gauge 等) を\n * accept する。 未知 kind 値は parts 候補として partId に格納、 compile 側 partsCatalog で解決。\n * LLM structured output の typing 制約を緩めるため union に string 追加。\n * `string & {}` = NodeKind の候補を IDE 補完で提示しつつ任意 string も許容する idiom。\n * 素の `NodeKind | string` は no-redundant-type-constituents に抵触し補完も潰れる (#865)。\n */\n kind?: NodeKind | (string & {});\n subtitle?: string;\n eyebrow?: string;\n value?: string;\n rows?: string[];\n lane?: string;\n stack?: number;\n initial?: boolean;\n final?: boolean;\n /**\n * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は\n * backward compat、 set 済は Phase 2 の applyPosOffset で actor 由来 lane / node の位置を shift。\n */\n pos?: LayoutPos;\n /**\n * CAR-1657 parts state override (kind = parts identifier 時のみ有効)。\n * LLM JSON DSL では nested 明示 = `{ \"state\": { \"v\": 50 } }` が natural、 human 側の\n * inline 拡散 pattern (`- arc1: { kind: arc-gauge, v: 50 }`) とは記述形式が分岐する\n * (spec § 2.3 分岐設計、 human = YAML 手書き最適 / LLM = JSON structured 最適)。\n */\n state?: Record<string, number | string | boolean>;\n}\n\nexport interface JsonStep {\n from: string;\n to: string;\n label: string;\n sub?: string;\n tone?: Tone;\n style?: EdgeStyle;\n guard?: string;\n cardinality?: string;\n labelOffsetX?: number;\n labelOffsetY?: number;\n /**\n * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = edge label offset。 未指定は\n * backward compat、 set 済は Phase 2 の applyPosOffset で edge label 位置を shift する。\n */\n pos?: LayoutPos;\n}\n\nexport interface JsonPhase {\n /** phase name (必須) */\n step: string;\n /** duration in seconds (default 1.4) */\n duration?: number;\n /** highlight 対象 (actor name / edge \"A -> B\") */\n focus?: string[];\n /** body 説明文 */\n body?: string;\n /** badge label */\n badge?: string;\n}\n\n/**\n * JSON DSL error。 line 概念がないため、 field path (JSON pointer style) で位置を示す。\n */\nexport interface JsonDslError {\n path: string;\n message: string;\n hint?: string;\n}\n\n/**\n * CAR-1657 = 既存 NodeKind list (v05/parser.ts の NODE_KIND_VALID と揃える必要あり)。\n * 未知 kind 値は parts identifier 候補として partId に格納する経路の判定基準。\n * v05 parser との drift 防止のため、 別 PR で共通化検討 (`packages/dragon/src/kinds.ts` etc)。\n */\nconst VALID_KIND_SET: ReadonlySet<string> = new Set([\n \"actor\", \"function\", \"storage\", \"event\", \"cdn\", \"service\", \"database\",\n \"cache\", \"queue\", \"api\", \"person\", \"entity\", \"state\", \"container\", \"card\",\n \"lambda\", \"kms\", \"secret\", \"alb\", \"ecs\", \"rds\", \"s3\", \"iam\", \"user\", \"browser\",\n \"contract\", \"eoa\", \"multisig\", \"proxy\", \"library\", \"interface\",\n]);\n\nconst VALID_PRESETS: readonly PresetType[] = [\n \"sequence\",\n \"flow\",\n \"swimlane\",\n \"er\",\n \"state\",\n \"topology\",\n \"solidity\",\n \"gantt\",\n \"class\",\n \"pie\",\n \"c4\",\n \"mind\",\n] as const;\n\n/**\n * shape validation。 layer 1 = 必須 field + 型 check、 layer 2 は compile 側の validation に委譲。\n * fail-fast ではなく全 error 収集して返す (LLM に一括で修正させるため)。\n */\n/**\n * CAR-1693 Phase 1: DSL 表面 `pos: {x, y}` の型 check helper。 finite number pair を必須にし、\n * `NaN` / `Infinity` / non-number は reject する (Phase 2 の applyPosOffset で数値演算するため)。\n */\nfunction validateLayoutPos(v: unknown, path: string, errors: JsonDslError[]): void {\n if (v === undefined) return;\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push({ path, message: \"pos must be an object with x and y numbers\" });\n return;\n }\n const p = v as Record<string, unknown>;\n if (typeof p.x !== \"number\" || !Number.isFinite(p.x)) {\n errors.push({ path: `${path}.x`, message: \"pos.x must be a finite number\" });\n }\n if (typeof p.y !== \"number\" || !Number.isFinite(p.y)) {\n errors.push({ path: `${path}.y`, message: \"pos.y must be a finite number\" });\n }\n}\n\nfunction validateJson(json: unknown): { ok: true; data: DragonJson } | { ok: false; errors: JsonDslError[] } {\n const errors: JsonDslError[] = [];\n if (!json || typeof json !== \"object\" || Array.isArray(json)) {\n return { ok: false, errors: [{ path: \"$\", message: \"root must be a JSON object\" }] };\n }\n const j = json as Record<string, unknown>;\n\n if (typeof j.title !== \"string\" || j.title.length === 0) {\n errors.push({ path: \"$.title\", message: \"title must be a non-empty string\" });\n }\n // CAR-1693 Phase 1: diagram-level layout mode の validation (未指定 = auto default で backward compat)\n if (j.layout !== undefined && j.layout !== \"auto\" && j.layout !== \"manual\") {\n errors.push({ path: \"$.layout\", message: 'layout must be \"auto\" or \"manual\" if present' });\n }\n if (typeof j.type !== \"string\" || !VALID_PRESETS.includes(j.type as PresetType)) {\n errors.push({\n path: \"$.type\",\n message: `type must be one of: ${VALID_PRESETS.join(\", \")}`,\n hint: typeof j.type === \"string\" ? `got \"${j.type}\"` : undefined,\n });\n }\n if (!Array.isArray(j.actors) || j.actors.length === 0) {\n errors.push({ path: \"$.actors\", message: \"actors must be a non-empty array\" });\n } else {\n j.actors.forEach((a, i) => {\n if (typeof a === \"string\") return;\n if (!a || typeof a !== \"object\" || Array.isArray(a)) {\n errors.push({ path: `$.actors[${i}]`, message: \"actor must be string or object\" });\n return;\n }\n const ao = a as Record<string, unknown>;\n if (typeof ao.name !== \"string\" || ao.name.length === 0) {\n errors.push({ path: `$.actors[${i}].name`, message: \"actor.name must be a non-empty string\" });\n }\n // CAR-1657 (+ codex-review MAJOR fix) = kind の validation、 non-empty string 必須。\n // parts identifier or existing NodeKind のどちらかを想定、 空文字 or 非 string は reject。\n if (ao.kind !== undefined && (typeof ao.kind !== \"string\" || ao.kind.length === 0)) {\n errors.push({ path: `$.actors[${i}].kind`, message: \"actor.kind must be a non-empty string\" });\n }\n // codex-review MAJOR fix = state override は plain object + 値は primitive (number / string / boolean) 限定、\n // `{ v: {} }` 等 nested object や null が流入すると CdlState.initial に不正な型が入り compile 崩れる。\n if (ao.state !== undefined) {\n if (!ao.state || typeof ao.state !== \"object\" || Array.isArray(ao.state)) {\n errors.push({ path: `$.actors[${i}].state`, message: \"actor.state must be a plain object\" });\n } else {\n for (const [sk, sv] of Object.entries(ao.state as Record<string, unknown>)) {\n const svType = typeof sv;\n if (svType !== \"number\" && svType !== \"string\" && svType !== \"boolean\") {\n errors.push({\n path: `$.actors[${i}].state.${sk}`,\n message: `actor.state.${sk} must be number / string / boolean (got ${sv === null ? \"null\" : svType})`,\n });\n }\n }\n }\n }\n // CAR-1693 Phase 1: actor DSL 表面 pos の validation\n validateLayoutPos(ao.pos, `$.actors[${i}].pos`, errors);\n });\n }\n if (!Array.isArray(j.flow)) {\n errors.push({ path: \"$.flow\", message: \"flow must be an array\" });\n } else {\n j.flow.forEach((s, i) => {\n if (!s || typeof s !== \"object\" || Array.isArray(s)) {\n errors.push({ path: `$.flow[${i}]`, message: \"step must be an object\" });\n return;\n }\n const so = s as Record<string, unknown>;\n if (typeof so.from !== \"string\") errors.push({ path: `$.flow[${i}].from`, message: \"step.from must be a string\" });\n if (typeof so.to !== \"string\") errors.push({ path: `$.flow[${i}].to`, message: \"step.to must be a string\" });\n if (typeof so.label !== \"string\") errors.push({ path: `$.flow[${i}].label`, message: \"step.label must be a string\" });\n // CAR-1693 Phase 1: step DSL 表面 pos の validation\n validateLayoutPos(so.pos, `$.flow[${i}].pos`, errors);\n });\n }\n // CAR-1693 Phase 1: lane DSL 表面 pos の validation\n if (j.lanes !== undefined && j.lanes && typeof j.lanes === \"object\" && !Array.isArray(j.lanes)) {\n for (const [laneId, lane] of Object.entries(j.lanes as Record<string, unknown>)) {\n if (lane && typeof lane === \"object\" && !Array.isArray(lane)) {\n validateLayoutPos((lane as Record<string, unknown>).pos, `$.lanes.${laneId}.pos`, errors);\n }\n }\n }\n if (j.animation !== undefined) {\n if (!Array.isArray(j.animation)) {\n errors.push({ path: \"$.animation\", message: \"animation must be an array if present\" });\n } else {\n j.animation.forEach((p, i) => {\n if (!p || typeof p !== \"object\" || Array.isArray(p)) {\n errors.push({ path: `$.animation[${i}]`, message: \"phase must be an object\" });\n return;\n }\n const po = p as Record<string, unknown>;\n if (typeof po.step !== \"string\" || po.step.length === 0) {\n errors.push({ path: `$.animation[${i}].step`, message: \"phase.step must be a non-empty string\" });\n }\n });\n }\n }\n if (errors.length > 0) return { ok: false, errors };\n return { ok: true, data: j as unknown as DragonJson };\n}\n\n/**\n * JSON DSL → DslDocument (AST) 変換。 pos は JSON なので line 情報なし、 全て line 0。\n *\n * CAR-1693 Phase 1: DSL 表面 `pos: {x, y}` → 内部 AST `layoutPos:` の 2 層 mapping の実装 core。\n * test で mapping logic を実 execute するため export する (pos-field.test.ts の regression guard)。\n */\nexport function jsonToDoc(json: DragonJson): DslDocument {\n const p0 = { line: 0 };\n const actors: DslActor[] = json.actors.map((a) => {\n if (typeof a === \"string\") {\n return { name: a, kind: \"actor\" as NodeKind, kindWritten: false, pos: p0 };\n }\n // CAR-1657 = kind が既存 NodeKind に無い値なら parts identifier 候補、 partId に格納\n const kindStr = (a.kind ?? \"actor\") as string;\n const isPart = kindStr !== \"actor\" && !VALID_KIND_SET.has(kindStr);\n return {\n name: a.name,\n kind: isPart ? \"actor\" as NodeKind : (a.kind ?? \"actor\") as NodeKind,\n // parts 候補は `kind` を `actor` に倒して `partId` へ退避するため、 名札に載せる種類としては\n // 「書かなかった」 と同じ扱いにする (#1058)\n kindWritten: a.kind !== undefined && !isPart,\n subtitle: a.subtitle,\n eyebrow: a.eyebrow,\n value: a.value,\n rows: a.rows,\n lane: a.lane,\n stack: a.stack,\n initial: a.initial,\n final: a.final,\n partId: isPart ? kindStr : undefined,\n stateOverride: isPart ? a.state : undefined,\n // CAR-1693 Phase 1: DSL 表面 pos → 内部 AST layoutPos の 2 層 mapping (naming collision 回避)\n layoutPos: a.pos,\n pos: p0,\n };\n });\n const flow: DslStep[] = json.flow.map((s, i) => ({\n no: i + 1,\n from: s.from,\n to: s.to,\n label: s.label,\n sub: s.sub,\n tone: s.tone,\n style: s.style,\n guard: s.guard,\n cardinality: s.cardinality,\n labelOffsetX: s.labelOffsetX,\n labelOffsetY: s.labelOffsetY,\n // CAR-1693 Phase 1: DSL 表面 pos → 内部 AST layoutPos\n layoutPos: s.pos,\n pos: p0,\n }));\n let animate: DslAnimate | undefined;\n if (json.animation && json.animation.length > 0) {\n const phases: DslPhase[] = json.animation.map((p) => ({\n name: p.step,\n durationMs: Math.round((p.duration ?? 1.4) * 1000),\n highlight: p.focus,\n body: p.body,\n badge: p.badge,\n pos: p0,\n }));\n animate = { states: [], phases, pos: p0 };\n }\n return {\n title: json.title,\n type: json.type,\n actors,\n flow,\n animate,\n viewport: json.viewport ? { ...json.viewport, pos: p0 } : undefined,\n lanes: json.lanes\n ? Object.fromEntries(\n Object.entries(json.lanes).map(([id, l]) => {\n // CAR-1693 Phase 1: DSL 表面 pos → 内部 AST layoutPos の 2 層 mapping。\n // JSON input の { pos, x, width, ... } を分離し、 pos のみ layoutPos に rename する。\n const { pos: layoutPos, ...laneRest } = l;\n return [id, { id, ...laneRest, layoutPos, pos: p0 }];\n }),\n )\n : undefined,\n groups: json.groups\n ? Object.fromEntries(\n Object.entries(json.groups).map(([id, g]) => [id, { id, label: g.label, lanes: g.lanes, pos: p0 }]),\n )\n : undefined,\n // CAR-1693 Phase 1: diagram-level layout mode (auto|manual)、 未指定は undefined = auto default\n layout: json.layout,\n pos: p0,\n };\n}\n\n/**\n * LLM 向け JSON DSL の parse + compile 一発変換。\n *\n * @param json - DragonJson shape の object (parsed JSON、 not string)\n * @returns CdlDiagram (@cardenelabs/cdl の CdlDiagramView 等に渡せる)\n * @throws Error - validation error + hint 付きの詳細メッセージ、 LLM に retry させるための情報を含む\n *\n * @example\n * const diagram = jsonToDiagram({\n * title: \"ログインAPI\",\n * type: \"sequence\",\n * actors: [\"User\", \"API\", { name: \"DB\", kind: \"storage\" }],\n * flow: [\n * { from: \"User\", to: \"API\", label: \"login\" },\n * { from: \"API\", to: \"DB\", label: \"SELECT\" },\n * ],\n * animation: [\n * { step: \"call\", duration: 1.4, focus: [\"User\", \"API\"] },\n * ],\n * });\n */\nexport function jsonToDiagram(\n json: unknown,\n opts?: { partsCatalog?: Record<string, CdlDiagram> },\n): CdlDiagram {\n const v = validateJson(json);\n if (!v.ok) {\n const msg = v.errors.map((e) => ` ${e.path}: ${e.message}${e.hint ? ` (${e.hint})` : \"\"}`).join(\"\\n\");\n throw new Error(`Dragon JSON DSL validation error:\\n${msg}`);\n }\n const doc = jsonToDoc(v.data);\n return compileToCdl(doc, opts);\n}\n\n/**\n * JSON DSL を validate だけ実施 (compile しない)。 error 詳細を配列で取得したい場合に使う。\n * LLM の structured output の retry loop で、 error path を prompt に注入する用途。\n */\nexport function validateDragonJson(\n json: unknown,\n): { ok: true; data: DragonJson } | { ok: false; errors: JsonDslError[] } {\n return validateJson(json);\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://github.com/cardene777/dragon/schemas/diagram.json\",\n \"title\": \"Dragon DSL Diagram\",\n \"description\": \"LLM 向け Dragon DSL の JSON Schema。 Anthropic Claude tool use / OpenAI GPT structured output の schema field に注入して使う。 生成された JSON は jsonToDiagram() に渡して CdlDiagram に変換する。\",\n \"type\": \"object\",\n \"required\": [\"title\", \"type\", \"actors\", \"flow\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"図の title (画面上部に表示される見出し)\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"sequence\", \"flow\", \"swimlane\", \"er\", \"state\", \"topology\", \"solidity\", \"gantt\", \"class\", \"pie\", \"c4\", \"mind\"],\n \"description\": \"preset type = 図の種類。 sequence (時系列 API 呼び出し) / flow (処理 flow) / swimlane (責務分担 flow) / er (DB schema) / state (状態遷移) / topology (network) / solidity (contract) / gantt (schedule) / class (UML class) / pie (円グラフ) / c4 (architecture) / mind (mind map)\"\n },\n \"actors\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"description\": \"登場人物 (node) の配列。 文字列で name のみ、 または object で kind / subtitle 等を指定。\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"actor 名のみ (kind は default 'actor')\"\n },\n {\n \"type\": \"object\",\n \"required\": [\"name\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\"type\": \"string\", \"minLength\": 1, \"description\": \"actor 名 (flow の from / to で参照される)\"},\n \"kind\": {\n \"type\": \"string\",\n \"description\": \"node kind。 shape-* を指定して 49 shape 中から選ぶ。 例: 'shape-wallet' / 'shape-smart-contract' / 'shape-cloud' / 'shape-file' / 'actor' (default) / 'function' / 'storage' / 'event' 等\"\n },\n \"subtitle\": {\"type\": \"string\", \"description\": \"node 下部の補足テキスト\"},\n \"eyebrow\": {\"type\": \"string\", \"description\": \"node 上部の分類ラベル (accent 色)\"},\n \"value\": {\"type\": \"string\", \"description\": \"actor 数値表示 (kind: actor 用)\"},\n \"rows\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"description\": \"storage 内の column 列 (kind: storage 用)\"},\n \"lane\": {\"type\": \"string\", \"description\": \"swimlane / topology で属する lane id\"},\n \"stack\": {\"type\": \"integer\", \"minimum\": 0, \"description\": \"lane 内の縦位置 (0-based)\"},\n \"initial\": {\"type\": \"boolean\", \"description\": \"state 開始点 (kind: state 用)\"},\n \"final\": {\"type\": \"boolean\", \"description\": \"state 終了点 (kind: state 用)\"}\n }\n }\n ]\n }\n },\n \"flow\": {\n \"type\": \"array\",\n \"description\": \"step の配列 (矢印で actor 間を繋ぐ)。 sequence では順序が意味を持つ。\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"from\", \"to\", \"label\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"from\": {\"type\": \"string\", \"description\": \"起点 actor 名\"},\n \"to\": {\"type\": \"string\", \"description\": \"終点 actor 名\"},\n \"label\": {\"type\": \"string\", \"description\": \"矢印上のラベル (関数呼出し名 / メッセージ等)\"},\n \"sub\": {\"type\": \"string\", \"description\": \"ラベル下の補足\"},\n \"tone\": {\"type\": \"string\", \"enum\": [\"accent\", \"success\", \"warning\", \"danger\"], \"description\": \"矢印の色調\"},\n \"style\": {\"type\": \"string\", \"enum\": [\"solid\", \"dashed\", \"dotted\", \"dotted-flow\"], \"description\": \"矢印の線種\"},\n \"guard\": {\"type\": \"string\", \"description\": \"state 遷移の条件 (kind: state 用)\"},\n \"cardinality\": {\"type\": \"string\", \"description\": \"ER の多重度 (1..N 等、 kind: er 用)\"},\n \"labelOffsetX\": {\"type\": \"number\", \"description\": \"ラベル位置 x 調整\"},\n \"labelOffsetY\": {\"type\": \"number\", \"description\": \"ラベル位置 y 調整\"}\n }\n }\n },\n \"animation\": {\n \"type\": \"array\",\n \"description\": \"アニメーション phase 配列。 各 phase で focus 対象を highlight する。 optional。\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"step\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"step\": {\"type\": \"string\", \"minLength\": 1, \"description\": \"phase 名\"},\n \"duration\": {\"type\": \"number\", \"minimum\": 0.1, \"description\": \"phase 時間 (秒、 default 1.4)\"},\n \"focus\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"description\": \"この phase で active 化する actor 名 or edge 'A -> B' の配列\"},\n \"body\": {\"type\": \"string\", \"description\": \"phase 説明文\"},\n \"badge\": {\"type\": \"string\", \"description\": \"phase 中に表示する badge label\"}\n }\n }\n },\n \"viewport\": {\n \"type\": \"object\",\n \"description\": \"全体 canvas サイズ + gap の調整。 optional。\",\n \"additionalProperties\": false,\n \"properties\": {\n \"width\": {\"type\": \"number\", \"minimum\": 100},\n \"height\": {\"type\": \"number\", \"minimum\": 100},\n \"laneWidth\": {\"type\": \"number\", \"minimum\": 100},\n \"gap\": {\"type\": \"number\", \"minimum\": 0},\n \"laneGap\": {\"type\": \"number\", \"minimum\": 0},\n \"nodeGap\": {\"type\": \"number\", \"minimum\": 0},\n \"labelMargin\": {\"type\": \"number\", \"minimum\": 0}\n }\n },\n \"lanes\": {\n \"type\": \"object\",\n \"description\": \"swimlane / topology で使う lane 宣言。 key = lane id、 value = lane 定義。\",\n \"additionalProperties\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\"type\": \"number\"},\n \"width\": {\"type\": \"number\", \"minimum\": 50},\n \"label\": {\"type\": \"string\"},\n \"contain\": {\"type\": \"boolean\"},\n \"lifeline\": {\"type\": \"boolean\"}\n }\n }\n },\n \"groups\": {\n \"type\": \"object\",\n \"description\": \"topology で使う group 宣言。 key = group id、 value = { label, lanes }。\",\n \"additionalProperties\": {\n \"type\": \"object\",\n \"required\": [\"lanes\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"label\": {\"type\": \"string\"},\n \"lanes\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"minItems\": 1}\n }\n }\n }\n }\n}\n","/**\n * JSON Schema を TypeScript から使えるように export。\n *\n * 使い方 (LLM 呼出):\n * import Anthropic from \"@anthropic-ai/sdk\";\n * import { diagramJsonSchema, jsonToDiagram } from \"@cardenelabs/dragon\";\n * const client = new Anthropic();\n * const res = await client.messages.create({\n * model: \"claude-sonnet-5\",\n * max_tokens: 4096,\n * tools: [{ name: \"create_diagram\", description: \"...\", input_schema: diagramJsonSchema }],\n * messages: [{ role: \"user\", content: \"...\" }],\n * });\n * const diagram = jsonToDiagram(res.content[0].input);\n *\n * schema JSON は `packages/dragon/schemas/diagram.json` が SSOT、 本 file は import して再 export するだけ。\n */\n\nimport schemaJson from \"./schemas/diagram.json\" with { type: \"json\" };\n\n/**\n * Dragon DSL JSON Schema (Draft 7)。 Anthropic / OpenAI の tool schema にそのまま注入可能。\n */\nexport const diagramJsonSchema = schemaJson;\n","/**\n * Dragon — Text DSL public API\n *\n * Mermaid 感覚で animated SVG を生成する Text DSL。 cdl engine を呼出して CdlDiagram を返す。\n *\n * 使い方:\n * const diagram = textDslToDiagram(source);\n * // diagram は @cardenelabs/cdl の CdlDiagram、 そのまま CdlDiagramView 等に渡せる\n */\n\nexport { parseTextDsl } from \"./parser\";\nexport { compileToCdl } from \"./compile\";\nexport type { CompileNotice } from \"./compile\";\nexport { parseTextDslV05 } from \"./v05\";\n// 記法一覧が「実際に受け付ける値」 を実装から引くための公開。 手書きすると説明と実装がずれる。\nexport { PRESET_TYPES } from \"./v05/parser\";\nexport { TONE_ALIAS, NODE_KIND_ALIAS } from \"./keywords\";\nexport { lintDiagram, autoFix } from \"./notation-lint\";\nexport type { LintIssue, LintReport, LintSeverity } from \"./notation-lint\";\n// canvas pivot 新 spec 図境界計算 helper (§diagram-boundary SSOT)\nexport {\n computeDiagramBoundingBox,\n rectsOverlap,\n DIAGRAM_BOUNDARY_PADDING,\n} from \"./canvas-bounds\";\nexport type { DiagramBoundingBox } from \"./canvas-bounds\";\n// 位置を相対で書くための解決。 組み立て側と画面側の両方が同じ規則を使うために公開する。\nexport {\n parseRelativePos,\n resolveRelativePos,\n orderByDependency,\n RELATIVE_GAP_DEFAULT,\n} from \"./relative-pos\";\nexport type { RelativePos, RelativeDirection, AnchorBox } from \"./relative-pos\";\n// 光らせる相手の書き方の読み取り。 図種ごとの解決経路が同じ規則を共有する。\nexport { parseFocusEntry } from \"./focus\";\nexport type { FocusEntry } from \"./focus\";\n// 画面で見えている座標を記法に落とすための書込み。 記法を知る側に置く。\nexport { writeActorPosition } from \"./write-position\";\n// 図の上での位置を測る。 editor が現在位置を出すのと、 相対指定を解くので同じ規則を使う。\nexport { measureActorBoxes } from \"./compile\";\n// パーツの見た目の大きさと、 位置を書かなかった時の格子。 画面側と組み立て側で同じ規則を使う。\n// 記法が受理する種類の全体。 画面側が「本文が見本を使っているか」 を判定するのに使う (#1022)。\nexport { NODE_KIND_VALID } from \"./v05/parser\";\n\n// パーツの大きさを測る 3 つ。 用途で使い分ける (取り違えると経路ごとに絵が変わる)。\n//\n// - `partRenderSize` = 図枠。 画面が描く大きさと、 格子が確保する場所に使う\n// - `partBoxInFrame` = 図枠の中の箱 (パーツ自身の座標)。 画面が書いた座標と相対指定を解くのに使う\n// - `partVisualSize` = 箱の外接矩形 (merge の座標)。 組み立て側が取り込んだ後の大きさに使う\n//\n// 格子だけ図枠なのは、 隣と重ならない幅を確保するのが目的で描く大きさそのものが要るため。\n// 座標と間隔は見えている箱で測る (#937 / #1014)。\n// `大きさ:` の倍率は `partTargetScale` が持つ。 画面側も同じ規則で拡大しないと、\n// 書いた見本だけ経路で大きさが変わる (#1018)。\n// `partDrawsInDiagram` = その見本が図の中に描かれる部品を持つか。 実体が操作パネルの\n// 部品だけの見本 (catalog 80 件中 17 件) は重ねても図に出ないため、画面側が知らせる (#1017)。\n// `倍率:` (`scale`) は図形の倍率として予約する (#1026)。 画面と組み立てで意味が違うと、\n// 同じ本文が経路で別の絵になる。 正規化 (`normalizePartScale`) と `大きさ:` との掛け合わせ\n// (`partTargetSize`) を engine 側に置き、画面側も同じ関数を呼ぶ。\nexport {\n partRenderSize,\n partVisualSize,\n partBoxInFrame,\n partTargetScale,\n partTargetSize,\n partScaleFactor,\n normalizePartScale,\n MAX_PART_SCALE,\n partDrawsInDiagram,\n partIsMeasurable,\n partsGridCenters,\n} from \"./compile\";\n// 色として読めるかの判定と、 図の外を指す値かの判定。 状態の上書きを受け取る側 / 画面が色欄を\n// 作る側 / 画面が背景色を直接書く側で同じ物差しを使う (別々に持つと、 片方だけ直した時に片方が通す)。\nexport { isColorValue, pointsOutside, stripExternalPaint } from \"./color\";\n// 引用符の外し方 (#1028)。 画面側が本文から見本を抜く時に同じ判定を使う。\n// 別々に持つと、片方だけが読める本文ができる (実測 = `位置: '300,200\"` が\n// 画面側では座標 300 として通り、組み立て側では読めない値として知らせが出た)\nexport { stripQuotes } from \"./v05/parser\";\n// 大きすぎる入力を組み立てる前に止める上限 (#1005)。 画面側も同じ物差しで事前に知らせられるよう公開する。\nexport {\n MAX_INPUT_ELEMENTS,\n MAX_INPUT_BYTES,\n countDocElements,\n countDiagramElements,\n countBytes,\n describeOversize,\n describeOversizeSource,\n} from \"./input-size\";\nexport type { InputSize } from \"./input-size\";\n\n// LLM 向け JSON DSL (Issue #208)\nexport { jsonToDiagram, validateDragonJson } from \"./json-parser\";\nexport { diagramJsonSchema } from \"./schema\";\nexport type {\n DragonJson,\n JsonActor,\n JsonStep,\n JsonPhase,\n JsonDslError,\n} from \"./json-parser\";\nexport type {\n DslDocument,\n DslActor,\n DslStep,\n DslAnimate,\n DslState,\n DslPhase,\n DslTween,\n DslSet,\n DslError,\n PresetType,\n DslLane,\n DslGroup,\n DslViewport,\n // CAR-1693 Phase 1: canvas pivot DSL 表面 pos + layout mode の public 型\n LayoutPos,\n LayoutMode,\n} from \"./types\";\n\nimport { parseTextDsl } from \"./parser\";\nimport { parseTextDslV05 } from \"./v05\";\nimport { compileToCdl } from \"./compile\";\nimport { describeOversizeSource } from \"./input-size\";\nimport type { CompileNotice } from \"./compile\";\nimport type { CdlDiagram } from \"@cardenelabs/cdl\";\n\n/**\n * CAR-1657 = compile 時 parts identifier lookup 用 catalog。\n * caller (CdlEditor 等) が loadPartsItems() の結果を Record<partId, CdlDiagram> で inject。\n * 未渡し時 partId set actor は「未解決」 として skip + console.warn (diagram render は継続)。\n */\nexport interface CompileOpts {\n partsCatalog?: Record<string, CdlDiagram>;\n /**\n * 図は出せるが書いた通りにならなかったことの受け取り口 (`位置: Web の下` が順序図で\n * 効かない等)。 判定は組み立て側が持ち、 呼出側は受け取って表示するだけにする。\n */\n onNotice?: (notice: CompileNotice) => void;\n /**\n * edge が DSL のどの行から来たかの受け取り口 (#998)。\n *\n * preset によっては書いた step と生成される edge が一致しない (`type: flow` は actor を鎖状に\n * 繋ぐため `a -> c` と書いても `a -> b` になる)。 edge を起点に本文の行を直す機能 (自動修正の\n * 書き戻し等) は、 この対応が無いと別の行を書き換える。\n *\n * **対応が取れない edge については呼ばれない**。 「対応が無い」 と「行 0」 を区別するため。\n */\n onEdgeSource?: (edgeId: string, line: number) => void;\n}\n\n/**\n * Dragon DSL から CdlDiagram に一発変換。 v0.5 (英語 keyword) / v0.4 (日本語 keyword) を auto-detect。\n *\n * 判定 ... src 内に v0.5 専用 syntax (`animation:` block / `- A -> B` flow / `step: \"...\"` ) を含むなら v0.5、\n * 含まなければ v0.4 (deprecated、 console.warn を出す)。\n *\n * エラー時は throw、 詳細を取りたい場合は parseTextDslV05 / parseTextDsl を直接呼ぶ。\n * opts.partsCatalog を渡すと CAR-1657 parts kind (arc-gauge 等) の actor が merge 展開される。\n */\nexport function textDslToDiagram(src: string, opts?: CompileOpts): CdlDiagram {\n // 読み取る前に大きさを見る (#1005)。 要素数の上限は読み取った後にしか分からないため、\n // 巨大な本文そのものによる待ちと記憶の消費はここでしか防げない\n const oversize = describeOversizeSource(src);\n if (oversize) throw new Error(oversize);\n\n if (isV05Source(src)) {\n const r = parseTextDslV05(src);\n if (!r.ok) {\n const msg = r.errors\n .map((e) => ` L${e.line}: ${e.message}${e.hint ? `\\n hint: ${e.hint}` : \"\"}`)\n .join(\"\\n\");\n throw new Error(`Dragon DSL v0.5 parse error:\\n${msg}`);\n }\n return compileToCdl(r.doc, opts);\n }\n // v0.4 fallback (deprecated)\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n \"[dragon] v0.4 syntax (Japanese keywords) is deprecated. Please migrate to v0.5 (English keywords) by 2026-12-31.\",\n );\n }\n const r = parseTextDsl(src);\n if (!r.ok) {\n const msg = r.errors\n .map((e) => ` L${e.line}: ${e.message}${e.hint ? `\\n ヒント: ${e.hint}` : \"\"}`)\n .join(\"\\n\");\n throw new Error(`Dragon DSL parse error:\\n${msg}`);\n }\n return compileToCdl(r.doc, opts);\n}\n\nfunction isV05Source(src: string): boolean {\n // CAR-1657 (+ codex-review MAJOR fix) = v0.5 default + v0.4 marker detect。\n //\n // v0.4 は 2026-12-31 廃止予定、 新規 source は v0.5 前提で default を v0.5 に倒す。\n // v0.4 marker (Japanese header + v0.4-specific English syntax) を 1 個でも検出したら v0.4 route。\n //\n // codex 指摘 = v0.4 も英語 alias `animate:` / `animation:` を受理するため、 header 名だけでは\n // 判定不足。 v0.4-specific syntax (`step \"...\" Xs` = colon なし step / `^\\d+\\.\\s+` = 番号 flow) を\n // negative marker に追加。\n const V04_KEYWORDS = [\n // Japanese v0.4 専用 keyword (v0.5 は英語のみ)\n /^\\s*タイトル\\s*[::]/, // title (JA)\n /^\\s*種類\\s*[::]/, // type (JA)\n /^\\s*登場人物\\s*[::]/, // actors (JA)\n /^\\s*流れ\\s*[::]/, // flow (JA)\n /^\\s*アニメーション\\s*[::]/, // animation (JA)\n /^\\s*動作\\s*[::]/, // step (JA)\n /^\\s*状態\\s*[::]/, // state (JA)\n /^\\s*ステップ\\s*[「『]/, // step (JA)\n // v0.4 English-specific syntax = colon なし step (v0.5 は step: 必須)\n /^\\s*step\\s+\"[^\"]+\"\\s+[\\d.]+\\s*s\\b/,\n /^\\s*step\\s+'[^']+'\\s+[\\d.]+\\s*s\\b/,\n // v0.4 numbered flow (`1. A → B`、 v0.5 は `- A -> B`)\n /^\\s*\\d+\\.\\s+\\S+\\s*(?:→|->)\\s*\\S+/,\n ];\n const lines = src.split(\"\\n\");\n for (const ln of lines) {\n for (const kw of V04_KEYWORDS) {\n if (kw.test(ln)) return false; // v0.4 detected → false\n }\n }\n return true; // no v0.4 marker → v0.5 default\n}\n"]}