@cardenelabs/dragon 0.7.0 → 0.8.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.
- package/README.md +111 -0
- package/dist/index.cjs +2365 -277
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +240 -3
- package/dist/index.d.ts +240 -3
- package/dist/index.js +2366 -279
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/compile.ts +2895 -258
- package/src/index.ts +4 -1
- package/src/input-size.ts +8 -1
- package/src/json-parser.ts +480 -30
- package/src/notation-lint.ts +27 -4
- package/src/schemas/diagram.json +56 -5
- package/src/types.ts +125 -0
- package/src/v05/parser.ts +341 -41
- package/src/value-syntax.ts +313 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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/value-syntax.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","flow","NODE_KINDS","parseActor","opts","namePart","issues","layout","indentText","rawName","unquote","splitOutsideQuotes","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 *\n * **他の値から決まる値 (`values:`) も数える** (#1162)。 これらは毎 frame 解かれるので、\n * 数に入れないと上限をすり抜けた本文が描画のたびに重さを持つ。\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.values?.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 derived?: 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 // 他の値から決まる値 (#1162)。 記法側 (`countDocElements`) が数えるので、こちらも揃える\n (diagram.derived?.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 { DslActor, DslDocument, DslLane, DslPhase, DslStep, DslValue, PresetType } from \"./types\";\nimport type { CdlDiagram, CdlEdge, ErRelationCardinality, FormulaAst, LaidDiagram } from \"@cardenelabs/cdl\";\nimport {\n sequence, flow, swimlane, er, stateMachine, topology, diagram, layout,\n rendersRows, requiredRowsHeight, requiredRowsWidth, NODE_KINDS,\n applyDerivedValues, parseFormula,\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 // 値で描く図 (`pie` / `bar` / `line`) で値を読めなかった (#1154)\n | \"chart-value-unreadable\"\n // 同上で矢印を書いた。 これらの図は関係を描けない (#1154)\n | \"chart-edge-dropped\"\n // 同じ名前を `states` と `values` の両方に書いた (#1162)\n | \"value-shadows-state\"\n // 式を解けず、その値を止めた (輪 / 無い名前 / 読めない式 / 数として読めない値、 #1162)\n | \"value-unresolved\"\n // 同じ名前を `values` に 2 度書いた。 先に書いた式を使う (#1162)\n | \"value-duplicate\"\n // 矢印が `actors` に無い名前を指した (#1209)\n | \"flow-actor-missing\"\n // きっかけ形の値を段に畳めなかった (段が無い / 相手が境目を通らない / 段からはみ出す、 #1161)\n | \"value-trigger-unresolved\"\n // 矢印の両端が同じ登場人物だった (#1227)\n | \"flow-self-loop\"\n // 箱に `lane:` を書いたが、 縦列は図種が決めるため効かなかった (#1246)\n | \"lane-not-honored\"\n // `lanes:` に書いた縦列に箱が 1 つも入らなかった (#1241)\n | \"lane-declared-empty\"\n // 最上位に `eyebrow:` を書いたが、 箱ごとに分かれる図種で相手が決まらなかった (#1247)\n | \"eyebrow-not-honored\"\n // 静止した `type: flow` で、書いた矢印の端が使われなかった (#1269)\n | \"flow-endpoint-not-honored\";\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 // 矢印の指す先を `actors` に書いた名前へ揃える (#1209)。 **図種ごとの組み立てより前**。\n //\n // 動きを書いた図は slug に落として引き、 書いていない図は名前の完全一致で引く。 揃えないと\n // 同じ本文が図種ごとに別の相手を指す = 知らせは出ないのに label が消える / 題が slug に\n // 化ける / 依存が切れる (Round 1 で実測)。\n doc = canonicalizeFlowActors(doc);\n\n // 知らせは **落とす前の矢印** を見る (#1219)。 落とした後を渡すと、 図が壊れないように\n // 外した矢印が書いた人に届かなくなる\n const 書いたまま = doc;\n // 解決できない矢印を組み立てから外す (#1219)。 残すと、 存在しない箱や枠を指す図ができて\n // 描画の直前で落ちる (実測 = 8 図種)\n doc = dropUnresolvedFlow(doc);\n // 自分へ戻る矢印を組み立てから外す (#1227)。 残すと描画側の検査が図ごと落とし、\n // 本文のどの行が原因かも出ない\n doc = dropSelfLoopFlow(doc);\n\n // 名前から作る id が重なる分を解く (#1220)。 **矢印を落とした後**に見る = 落とした矢印の\n // 端にしか出てこない名前で id を分けても、 その箱は作られない\n const 分けた = disambiguateActorIds(doc, opts?.onNotice);\n doc = 分けた.doc;\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 = compileValueChart(doc, \"pie\", \"chart-pie\", opts?.onNotice);\n break;\n case \"bar\":\n diagram = compileValueChart(doc, \"bar\", \"chart-bar\", opts?.onNotice);\n break;\n case \"line\":\n diagram = compileValueChart(doc, \"line\", \"chart-line\", opts?.onNotice);\n break;\n case \"funnel\":\n diagram = compileFunnel(doc, opts?.onNotice);\n break;\n case \"tree\":\n diagram = compileTree(doc, opts?.onNotice);\n break;\n case \"journey\":\n diagram = compileJourney(doc, opts?.onNotice);\n break;\n case \"quadrant\":\n diagram = compileQuadrant(doc, opts?.onNotice);\n break;\n case \"c4\":\n diagram = compileC4(doc);\n break;\n case \"mind\":\n diagram = compileMind(doc, opts?.onNotice);\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 // 作り替えた名前を持つ箱と枠を、 **組み立て直後に** 控える (#1220)。 出口で題の文字だけを\n // 見て戻すと、 後から足された見本の中の箱がたまたま同じ題を持っていた時に書き換えてしまう\n const 作り替えた対象 = collectRenamedTargets(diagram, 分けた.元の名前);\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 applyGroupContainers(diagram, doc);\n applyNodeTones(diagram, doc);\n // 光らせる相手が実在するかを確かめる。 id への解決は図種ごとに違うが、 名前が居るか\n // 居ないかは記述だけで決まるので 1 か所で見る\n reportMissingFocusTargets(書いたまま, opts?.onNotice);\n // 矢印が指す名前が actors に居るかを確かめる。 図種ごとの解決より前に、 記述だけで決まる\n reportMissingFlowActors(書いたまま, opts?.onNotice);\n // 両端が同じ矢印を伝える (#1227)。 落とす前の `flow` を見る\n reportSelfLoopFlow(書いたまま, opts?.onNotice);\n // 静止した `type: flow` で書いた矢印の端が使われないことを伝える (#1269)。\n // 自分へ戻る形と居ない名前を指す形は既に落ちた後の `doc` を見る = 上の 2 件と重ねない\n reportFlowEndpointNotHonored(doc, 分けた.元の名前, opts?.onNotice);\n reportLaneNotHonored(書いたまま, opts?.onNotice);\n reportDocEyebrowNotHonored(書いたまま, opts?.onNotice);\n reportChartFieldsNotHonored(書いたまま, opts?.onNotice);\n reportAxesNotHonored(書いたまま, 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 追加した縦列: DslLane[] = [];\n const extended = applyV05Extensions(diagram, placed, 追加した縦列);\n // 値の知らせは、本文なら値を書いた行、見本なら見本を置いた行を指す。 `derived` 自体には\n // source position が無いため、見本を重ねる間だけ別表で宣言元を持ち回る (#1180)。\n const inheritedDerivedSourceLines = opts?.onNotice ? new Map<string, number[]>() : undefined;\n for (const value of extended.derived ?? []) {\n recordDerivedSourceLine(inheritedDerivedSourceLines, value.id, 0);\n }\n const merged = mergePartsFromActors(\n extended,\n placed,\n opts?.partsCatalog,\n opts?.onNotice,\n inheritedDerivedSourceLines,\n );\n // 箱が 1 つも入らなかった縦列を伝える (#1241)。\n //\n // **見本 (parts) を重ねた後に見る**。 見本の箱は `lane` で行き先を選べるため、\n // `lanes:` で作った縦列に後から入る (実測 = 重ねる前に見ると、箱が入っている縦列にまで\n // 知らせが出た)。\n //\n // 字の集合では防げない = 全角 (`lane-A` に対し生成は `lane-a`) でも打ち間違い\n // (`lane-idl`) でも結果は同じで、新しい縦列が増えるだけで書いた幅は元の縦列に届かない。\n // 受け付けを字で絞るのではなく、合わなかったこと自体を伝える\n reportEmptyDeclaredLanes(merged, 追加した縦列, opts?.onNotice);\n\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 // 書いた状態を図に載せる (#1162)。 段を書かない図でも値が届くようにする。\n // **値を載せるより先に呼ぶ**。 状態が空のまま式を解くと、参照が全て「無い名前」 になる。\n materializeStates(merged, doc);\n // 語の欄が状態を読むとき、その状態には記法の語が入っている。 図の語へ直す (#1201)\n 語の状態を図の語へ直す(merged);\n // きっかけ形の値を段の時計を読む式へ畳む (#1161 段 2)。 **値を載せるより先に呼ぶ** =\n // 畳んだ式を `attachDerivedValues` が他の値と同じ経路で載せるため、 順序 / 重なり / 知らせの\n // 扱いが式形と揃う。 時計の状態と段の補間もここで足す\n const 畳んだきっかけ = foldValueTriggers(merged, doc, opts?.onNotice);\n attachDerivedValues(merged, doc, opts?.onNotice, inheritedDerivedSourceLines, 畳んだきっかけ);\n // 図の外を指す値を、 色を塗る位置から落とす (#1004)。\n //\n // 入口ごとに塞ぐ形は採らない。 状態の上書き / phase が入れる値 / 画面が直接書く背景色 /\n // 埋め込んだ JSON / states / values と入口が複数あり、 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 // 作り替えた名前を表示だけ戻す (#1220)。 **図への追加を全て終えた後**に戻す = 途中で戻すと、\n // 後続の処理が名前で引く時に作り替え前と後が混ざる\n restoreActorNames(merged, 分けた.元の名前, 作り替えた対象);\n return merged;\n}\n\n/**\n * 書いた状態 (`states:`) を図に載せる (#1162)。\n *\n * 状態を図に登録するのは `animation:` を書いた経路だけだった (`compileGenericWithAnimate` と\n * `injectPhasesFallback` のどちらも段がある時しか走らない)。 このため `states:` と `values:`\n * だけを書いた図では図の状態が 0 件になり、描画側が組み立てる値が空になる。 書いた値は\n * 1 つも届かず、箱には `{waiting}` の生の形が出ていた (実測)。\n *\n * **出口で 1 度だけ載せる**。 段を作る経路は図の種類ごとにばらけており、経路ごとに書くと\n * どれかを見落とす (`injectStaticPhase` と同じ理由)。\n *\n * 既に載っている名前は触らない。 段の経路が登録した初期値と、見本から引き継いだ状態\n * (`alias__id` の形) の両方を保つ。\n */\nfunction materializeStates(diagram: CdlDiagram, doc: DslDocument): void {\n const 載っている = new Set(diagram.states.map((s) => s.id));\n for (const st of doc.animate?.states ?? []) {\n if (載っている.has(st.name)) continue;\n diagram.states.push({ id: st.name, initial: st.initial });\n 載っている.add(st.name);\n }\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 */\n/**\n * 矢印の指す先を `actors` に書いた **正規の名前** へ解決する表 (#1209)。\n *\n * 名前そのものに加えて **一意な slug も受ける**。 動きを書いた図の組み立ては `slugify` に\n * 落として引くため、 `API Gateway` を `api-gateway` と書いた形が届く。 2 つ以上の名前が\n * 同じ slug になる時は受けない = どちらを指したか決められない。\n *\n * **返すのは正規の名前で、 slug ではない**。 slug を返すと、 動きを書いていない図の組み立て\n * (名前の完全一致で引く) と食い違う = 知らせは出ないのに label が消える / 題が slug に化ける /\n * 依存が切れる、 という形になる (Round 1 で実測)。 中央で名前へ揃えれば全経路が同じ相手を指す。\n */\nfunction actorRefTable(doc: DslDocument): Map<string, string> {\n const 表 = new Map<string, string>();\n const slug数 = new Map<string, number>();\n for (const a of doc.actors) {\n const sl = slugify(a.name);\n slug数.set(sl, (slug数.get(sl) ?? 0) + 1);\n }\n for (const a of doc.actors) {\n 表.set(a.name, a.name);\n const sl = slugify(a.name);\n if ((slug数.get(sl) ?? 0) === 1) 表.set(sl, a.name);\n }\n return 表;\n}\n\n/**\n * 矢印の指す先を正規の名前へ揃えた `flow` を返す (#1209)。\n *\n * 解決できない矢印はそのまま残す = 図種ごとに扱いが違う (木は独自の知らせを出し、 値で描く図は\n * 落とす)。 中央で消すとその扱いが効かなくなる。 残した分は `reportMissingFlowActors` が\n * 知らせ、 動きを書いた図の組み立てが落とす。\n */\nfunction canonicalizeFlowActors(doc: DslDocument): DslDocument {\n const 表 = actorRefTable(doc);\n let 変えた = false;\n const flow = doc.flow.map((s) => {\n const from = 表.get(s.from) ?? s.from;\n const to = 表.get(s.to) ?? s.to;\n if (from === s.from && to === s.to) return s;\n 変えた = true;\n return { ...s, from, to };\n });\n return 変えた ? { ...doc, flow } : doc;\n}\n\n/**\n * 図種ごとの図の作り (#1219 / #1220)。\n *\n * 2 つの判断がここから決まる。 解決できない矢印を中央で落とすか (#1219) と、 名前が同じ id に\n * 潰れる登場人物を作り替えるか (#1220)。 どちらも **登場人物の名前が箱や枠の id になる図種**\n * でだけ要る。\n *\n * `#1209` は動きを書いた 2 経路だけを塞いだ。 残る経路では **知らせは出るのに図まで壊れる**\n * 状態だった (実測 = 8 図種が `compile` の `unknown-ref` で落ちる)。\n *\n * | 作り | 解決できない矢印 | 同じ id に潰れる名前 |\n * |---|---|---|\n * | 登場人物ごとに箱 | 中央で落とす | 名前を作り替えて id を分ける |\n * | 図全体を 1 箱 | 図種に任せる | 触らない |\n *\n * **1 箱で描く図種を中央で落とさない**。 これらは矢印そのものを描かず、 書かれた本数を数えて\n * 独自の知らせを出す (`chart-edge-dropped` / 木の親子の知らせ)。 中央で外すと本数が変わり、\n * 全部が解決できない図では知らせごと消える。 同じ id に潰れる名前も、 中身を payload が\n * 持つため箱の id にならず、 木と放射は独自の知らせを出す。\n *\n * `Record<PresetType, ...>` にしてあるので、 図種を足した時にどちらかを決めないと型検査が\n * 落ちる (`rules/quality.md § 多層 SSOT 経路の全 registration 保証` と同じ形)。\n */\nconst 図種の作り: Record<PresetType, \"登場人物ごとに箱\" | \"図全体を 1 箱\"> = {\n // 矢印の端と登場人物の名前が、 そのまま箱や枠の id になる\n sequence: \"登場人物ごとに箱\",\n flow: \"登場人物ごとに箱\",\n swimlane: \"登場人物ごとに箱\",\n er: \"登場人物ごとに箱\",\n state: \"登場人物ごとに箱\",\n topology: \"登場人物ごとに箱\",\n solidity: \"登場人物ごとに箱\",\n class: \"登場人物ごとに箱\",\n c4: \"登場人物ごとに箱\",\n // 中身は payload が持ち、 図そのものは 1 箱。 矢印は描かず本数を数えて知らせる\n gantt: \"図全体を 1 箱\",\n pie: \"図全体を 1 箱\",\n bar: \"図全体を 1 箱\",\n line: \"図全体を 1 箱\",\n funnel: \"図全体を 1 箱\",\n tree: \"図全体を 1 箱\",\n journey: \"図全体を 1 箱\",\n quadrant: \"図全体を 1 箱\",\n mind: \"図全体を 1 箱\",\n};\n\n/**\n * 解決できない矢印を落とした `flow` を返す (#1219)。\n *\n * 落とすのは **組み立てに渡す分だけ**。 知らせ (`reportMissingFlowActors`) は元の `flow` を\n * 見るので、 落とした矢印も書いた人に届く。\n */\nfunction dropUnresolvedFlow(doc: DslDocument): DslDocument {\n if (図種の作り[doc.type] === \"図全体を 1 箱\") return doc;\n const 表 = actorRefTable(doc);\n const flow = doc.flow.filter((s) => 表.has(s.from) && 表.has(s.to));\n return flow.length === doc.flow.length ? doc : { ...doc, flow };\n}\n\n/**\n * 自分へ戻る矢印を落とした `flow` を返す (#1227)。\n *\n * 描画側は両端が同じ矢印を受けない (`validate` が `self-loop` で落とす)。 記法の側は通すため、\n * 書けてしまって描画の直前で図ごと落ちていた。 本文のどの行が原因かも出ない。\n *\n * `#1219` が「解決できない矢印は組み立てから外し、 知らせは元の `flow` を見る」 という形を\n * 決めているので、 それに揃える。 落とすのは **組み立てに渡す分だけ** で、 書いた人には\n * `reportSelfLoopFlow` が行番号付きで伝える。\n *\n * ## `type: state` の自己遷移をどう扱うか\n *\n * 矢印としては描けない。 描画側に自分へ戻る矢印を足すのは別 repo の判断で、 本 repo の\n * 記法から決められない。 代わりに 2 通りの書き方が残る = 途中の箱を 1 つ足して 2 本の矢印に\n * 分けるか、 段 (`animation`) で状態が変わる様子として見せる。 知らせの `hint` がこの 2 つを\n * 案内する。\n *\n * 図全体を 1 箱で描く種別は矢印を作らないため対象にしない (本数を数えて別に伝えている)。\n */\nfunction dropSelfLoopFlow(doc: DslDocument): DslDocument {\n if (図種の作り[doc.type] === \"図全体を 1 箱\") return doc;\n const flow = doc.flow.filter((s) => s.from !== s.to);\n return flow.length === doc.flow.length ? doc : { ...doc, flow };\n}\n\n/**\n * 自分へ戻る矢印を書いた人に伝える (#1227)。\n *\n * **落とす前の `flow` を見る**。 落とした後を渡すと、 図が壊れないように外した矢印が\n * 書いた人に届かない (`reportMissingFlowActors` と同じ理由)。\n *\n * 同じ登場人物に何本書いても 1 件にまとめる = 本数だけ知らせが並んでも直し方は変わらない。\n */\nfunction reportSelfLoopFlow(doc: DslDocument, onNotice?: (n: CompileNotice) => void): void {\n if (!onNotice) return;\n if (図種の作り[doc.type] === \"図全体を 1 箱\") return;\n const 知らせた = new Set<string>();\n for (const s of doc.flow) {\n if (s.from !== s.to || 知らせた.has(s.from)) continue;\n 知らせた.add(s.from);\n onNotice({\n kind: \"flow-self-loop\",\n actor: s.from,\n line: s.pos.line,\n message: `\"${truncateForMessage(s.from)}\" から自分へ戻る矢印は描けません (組み立てから外しました)`,\n hint: \"途中の箱を 1 つ足して 2 本に分けるか、 段 (animation) で状態が変わる様子として見せる\",\n });\n }\n}\n\n/**\n * 図全体を 1 箱にする図種で、 その箱の上に出す小見出しを渡す (#1247)。\n *\n * 書かなければ何も渡さない = 従来どおり小見出しは付かない。 `undefined` を明示して渡すと、\n * 組立て側が「空の小見出しを書いた」 と区別できなくなるので、 項目ごと落とす。\n */\nfunction 図の小見出し(doc: DslDocument): { eyebrow?: string } {\n return doc.eyebrow === undefined ? {} : { eyebrow: doc.eyebrow };\n}\n\n/**\n * 箱ごとに分かれる図種で最上位の小見出しを書いた時に伝える (#1247)。\n *\n * 小見出しは **箱 1 つに対して 1 つ**。 図全体を 1 箱にする図種 (`pie` / `bar` 等) では\n * 相手が決まるが、 箱ごとに分かれる図種では「どの箱の小見出しか」 が決まらない。\n *\n * 黙って捨てると「書いたのに出ない」 が手掛かりなしで起きる。 箱ごとに書く形\n * (`- A: { eyebrow: \"...\" }`) を案内する = そちらは従来どおり効く。\n */\nfunction reportDocEyebrowNotHonored(doc: DslDocument, onNotice?: (n: CompileNotice) => void): void {\n if (!onNotice) return;\n if (doc.eyebrow === undefined) return;\n if (図種の作り[doc.type] === \"図全体を 1 箱\") return;\n onNotice({\n kind: \"eyebrow-not-honored\",\n actor: doc.title,\n // 図の `pos` は常に 1 行目を指す。 書いた行に辿り着けるよう `eyebrowPos` を優先する\n line: doc.eyebrowPos?.line ?? doc.pos?.line ?? 0,\n message: `最上位に書いた eyebrow は効きません (type: ${doc.type} は箱ごとに分かれるため相手が決まりません)`,\n hint: '箱ごとに書いてください (`- A: { eyebrow: \"...\" }`)',\n });\n}\n\n/**\n * 縦列を選べる図種で、一部の箱だけが縦列を書いた時に伝える (#1263)。\n *\n * 書かなかった箱の行き先を決める規則が要るが、既定の縦列に集めても自分の縦列を作っても\n * 書いた人の意図と一致する保証が無い。 **全部書くか 1 つも書かないか** を求める。\n *\n * 1 つも書いていない形は従来どおりの並びになるだけなので知らせない。\n */\nfunction reportLaneMixed(doc: DslDocument, onNotice: (n: CompileNotice) => void): void {\n const 対象 = doc.actors.filter((a) => a.partId === undefined);\n const 書いた = 対象.filter((a) => a.lane !== undefined);\n if (書いた.length === 0 || 書いた.length === 対象.length) return;\n const 書いていない = 対象.filter((a) => a.lane === undefined);\n onNotice({\n kind: \"lane-not-honored\",\n actor: 書いていない[0]?.name ?? \"\",\n line: 書いていない[0]?.pos?.line ?? 0,\n message: `type: ${doc.type} では縦列を書くなら全ての箱に書きます (書いていない箱: ${書いていない.map((a) => truncateForMessage(a.name)).join(\" / \")})`,\n hint: \"書かなかった箱をどの縦列に置くかを決められないため、全部書くか 1 つも書かないかにしてください\",\n });\n}\n\n/**\n * 静止した `type: flow` で、書いた矢印の端が使われないことを伝える (#1269)。\n *\n * この図種は **登場人物を書いた順に鎖状に繋ぐ**。 矢印の説明文は「その箱を to に持つ行」\n * から拾い、書いた側の端 (from) は使わない (`compileFlow`)。\n *\n * そのため `A -> C` と書いても出来るのは `A -> B` で、書いた形と違う図になる。\n * 実測 = `A -> C` / `C -> B` と書くと `A -> B` に `\"y\"`、`B -> C` に `\"x\"` が載った。\n * 知らせは 1 件も出ていなかった。\n *\n * ## 鎖にすること自体は変えない\n *\n * 線形の流れを描く図種なので、鎖にするのは仕様。 書いた端どおりに繋ぎたい形は\n * 箱に `lane:` を書けば別の経路へ回る (#1266)。 知らせの hint でそれを案内する。\n *\n * ## 偶然一致する形では知らせない\n *\n * `A -> B` / `B -> C` のように書いた端がそのまま鎖になる形は、書いたとおりの図になる。\n * ここで知らせると、正しく書いた人にまで出る。\n *\n * ## 既に落ちた行は見ない\n *\n * 自分へ戻る形 (`flow-self-loop`) と居ない名前を指す形 (`flow-actor-missing`) は\n * 別の知らせが担う。 落とした後の `doc` を見ることで、同じ 1 行に知らせが 2 件並ぶのを避ける。\n */\nfunction reportFlowEndpointNotHonored(\n doc: DslDocument,\n 元の名前: Map<string, string>,\n onNotice?: (n: CompileNotice) => void,\n): void {\n if (!onNotice) return;\n if (!鎖でつなぐ形か(doc)) return;\n // 名前が重なった登場人物は組み立ての間だけ尾を付けて分けている (`disambiguateActorIds`)。\n // **判定は分けた後の名前で行い、伝える時は書いた名前に戻す** = 判定は `compileFlow` の\n // 繋ぎ方と揃える必要があり、伝える先は本文なので書いていない名前を指すと直せない\n // (実測 = `\"A B 546d26\" の端は使われません` と出て、本文にその名前は無い)\n const 書いた名前 = (name: string): string => 元の名前.get(name) ?? name;\n // 鎖が作る組を集める。 登場人物が 1 人以下なら矢印が 1 本も出来ないので、\n // 書いた矢印は全て使われない扱いになる\n const 鎖の組 = new Set<string>();\n doc.actors.forEach((a, i) => {\n const 次 = doc.actors[i + 1];\n if (次 === undefined) return;\n 鎖の組.add(`${a.name}\\u0000${次.name}`);\n });\n for (const s of doc.flow) {\n if (鎖の組.has(`${s.from}\\u0000${s.to}`)) continue;\n onNotice({\n kind: \"flow-endpoint-not-honored\",\n actor: 書いた名前(s.from),\n line: s.pos.line,\n message: `\"${truncateForMessage(書いた名前(s.from))} -> ${truncateForMessage(書いた名前(s.to))}\" の端は使われません (type: flow は登場人物を書いた順に繋ぎます)`,\n hint: \"書いた端どおりに繋ぐには、箱に lane: を書いてください (縦列を書いた形は書いた端がそのまま矢印になります)\",\n });\n }\n}\n\n/**\n * 箱に書いた縦列が効かないことを伝える (#1246)。\n *\n * 縦列は **図種が決める**。 `flow` / `topology` は 1 本にまとめ、 `swimlane` / `er` / `state`\n * は箱ごとに 1 本作り、 `sequence` はそれがそのまま生命線になる。 図全体を 1 箱にする図種\n * (`pie` / `bar` 等) では箱が 1 つしかない。 **どの図種も箱の `lane` を読まない**。\n *\n * 黙って捨てると、 書いた縦列は消え、 `lanes:` で宣言した縦列だけが中身のないまま残る。\n * 実測 = `type: flow` で `lane: ui` / `lane: api` を書くと箱は両方 `flow` に入り、\n * 宣言した `ui` / `api` は空のまま増えた。 知らせは 1 件も出なかった。\n *\n * ## なぜ組み立ての側で伝えるのか\n *\n * 記法の解析は図種を見ずに 1 行ずつ読む。 そこで弾くと **見本 (parts) の張替え先** まで\n * 巻き添えになる = 見本では `lane` が実際に読まれる (`mergePartsFromActors` が唯一の読み手)。\n * 図種を知っているのは組み立ての側なので、 効くかどうかの判断もここに置く。\n *\n * ## 見本と `type: mind` では伝えない\n *\n * 見本は上のとおり実際に効く。 `type: mind` は描けない欄をまとめて 1 件で伝えており\n * (`compileMind` の「名前と副題 / 値、 枝の色しか描けません」)、 そこに `枠の指定` が既に\n * 入っている。 二重に伝えると同じ 1 行について知らせが 2 件並ぶ。\n */\nfunction reportLaneNotHonored(doc: DslDocument, onNotice?: (n: CompileNotice) => void): void {\n if (!onNotice) return;\n if (doc.type === \"mind\") return;\n // 縦列を選べる図種では、全ての箱が書いていれば効く (#1263)。 効く形では知らせない\n const 効く図種 = 縦列を選べる図種.has(doc.type as GenericKind);\n if (効く図種 && 書いた縦列に置く(doc.type as GenericKind, doc)) return;\n if (効く図種) {\n reportLaneMixed(doc, onNotice);\n return;\n }\n for (const a of doc.actors) {\n if (a.partId !== undefined) continue;\n if (a.lane === undefined) continue;\n onNotice({\n kind: \"lane-not-honored\",\n actor: a.name,\n line: a.pos?.line ?? 0,\n message: `\"${truncateForMessage(a.name)}\" に書いた lane は効きません (縦列は type: ${doc.type} が決めます)`,\n hint: \"縦列は図種が決めるため箱からは選べません。 lane を消してください (見本では張替え先として使えます)\",\n });\n }\n}\n\n/**\n * 名前から作る id の重なりを解く (#1220)。\n *\n * 箱と枠の id は登場人物の名前から作る (`slugify`)。 **違う名前が同じ id に潰れる** と、\n * どちらも正しく書いているのに図が組み立たない (実測 = `foo-bar` と `Foo Bar` を書くと\n * 9 図種が `duplicate-id` で落ちる)。 知らせも出ない = どちらの名前も `actors` に在るため。\n *\n * ## なぜ名前を作り替えるのか\n *\n * id を作る所は 90 箇所を超え、 さらに **cdl 側の組み立てが名前から id を作る経路** がある\n * (`swimlane()` / `er()` は渡した名札から lane id を作る)。 dragon 側だけを直しても届かない。\n *\n * そこで **渡す名前を変え、 最後に表示だけ戻す**。 作り替えた名前は組み立ての間だけ使い、\n * 出口で `nodes[].title` と `lanes[].label` を元に戻す (`restoreActorNames`)。\n *\n * ## 尾は名前から作る\n *\n * 書き順で決めると、 登場人物を並べ替えただけで id が入れ替わる。 元の名前だけから決まる\n * 短い値を尾に付ければ、 並べ替えても同じ id になる。\n *\n * ## まったく同じ名前は畳む\n *\n * 名前が 1 文字も違わない登場人物は区別できない。 2 つの箱に同じ題が付くだけなので、\n * 先に書いた方を残して知らせる。\n */\nfunction 名前の尾(name: string): string {\n // FNV-1a。 短くて名前だけから決まればよく、 衝突しても下の検査が拾う\n let h = 0x811c9dc5;\n for (const c of name) {\n h ^= c.codePointAt(0) ?? 0;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\").slice(0, 6);\n}\n\n/**\n * cdl 側が名札から id を作る時の規則 (`presets.ts` の `slugify`)。\n *\n * **dragon の規則と違う**。 dragon は `-` と `_` を残し `NFKC` で揃え 64 字で切るが、 cdl は\n * どちらも `-` に潰し、 長さも切らない。 このため `a_b` と `a-b` は **dragon では別 id、 cdl では\n * 同じ id** になる (実測 = 動きを書かない `sequence` / `solidity` が `duplicate-id` で落ちる)。\n *\n * ここに写している = cdl は `slugify` を公開していない。 **ずれると衝突を見落とす** ので、\n * 下の検査が既知の組で対応を固定する。\n */\nfunction cdl側のslug(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9-ゟ゠-ヿ一-龯]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * cdl 側が「形が空になった名前」 に付ける id の頭 (#1220 Round 2 / 3)。\n *\n * cdl は形が空になった時に並びの位置へ逃げる。 逃げ先を鍵に入れないと、 逃げ先と同じ名前の\n * 登場人物が居る図で重なる (実測 = `sequence` の `😀` と `actor-0`)。\n *\n * **図種ごとに違う** (Round 3 の指摘)。 両方を入れると、 その図種では使われない逃げ先まで\n * 衝突とみなして **重なっていない図の id を変える**。 実測した対応は次のとおり。\n *\n * | 図種 | `😀` だけを書いた時に付く id |\n * |---|---|\n * | `sequence` / `solidity` | 枠 `actor-0` (cdl の `sequence()`) |\n * | `swimlane` | 枠 `lane-0` (cdl の `swimlane()`) |\n * | 残る 6 図種 | 箱 `n` (dragon 側の逃げ先。 cdl の逃げ道を通らない) |\n *\n * 空配列は「cdl の逃げ道を通らない」 を表す。 1 箱で描く図種はここに来ない (作り替え自体を\n * しない) が、 図種を足した時に決め忘れないよう全種を並べる。\n *\n * **この表が効くのは動きを書いていない図だけ** (Round 4 の指摘)。 動きを書くと組み立てが別経路に\n * 切り替わり、 id は dragon 側の規則で作られる = cdl の逃げ道を通らない。 使う側で条件を見る。\n */\nconst 空の形の逃げ先: Record<PresetType, string[]> = {\n sequence: [\"actor-\"],\n solidity: [\"actor-\"],\n swimlane: [\"lane-\"],\n flow: [],\n er: [],\n state: [],\n topology: [],\n class: [],\n c4: [],\n // 図全体を 1 箱で描く群 (作り替えないのでここは使わない)\n gantt: [],\n pie: [],\n bar: [],\n line: [],\n funnel: [],\n tree: [],\n journey: [],\n quadrant: [],\n mind: [],\n};\n\n/**\n * その名前が下流で id になりうる形。 どれか 1 つでも重なれば衝突する。\n *\n * 位置と逃げ先が分からない時 (作り替えた候補を確かめる時) は逃げ先を数えない。 作り替えた\n * 名前は尾が付いて形が空にならないので、 そもそも逃げ道を通らない。\n */\nfunction idになる形(name: string, 位置?: number, 逃げ先の頭: string[] = []): string[] {\n const cdl = cdl側のslug(name);\n const out = [slugify(name), cdl];\n if (cdl === \"\" && 位置 !== undefined) {\n for (const 頭 of 逃げ先の頭) out.push(`${頭}${位置}`);\n }\n return out;\n}\n\nfunction disambiguateActorIds(\n doc: DslDocument,\n onNotice?: (notice: CompileNotice) => void,\n): { doc: DslDocument; 元の名前: Map<string, string> } {\n const 元の名前 = new Map<string, string>();\n if (図種の作り[doc.type] !== \"登場人物ごとに箱\") return { doc, 元の名前 };\n\n // 1. まったく同じ名前を畳む\n const 見た = new Set<string>();\n const 残す: DslActor[] = [];\n for (const a of doc.actors) {\n if (見た.has(a.name)) {\n onNotice?.({\n kind: \"chart-value-unreadable\",\n actor: a.name,\n line: a.pos?.line ?? 0,\n message: `\"${truncateForMessage(a.name)}\" を 2 度書いています (先に書いた方だけ描きます)`,\n hint: \"違う名前にするか、 1 つにまとめる\",\n });\n continue;\n }\n 見た.add(a.name);\n 残す.push(a);\n }\n\n // 2. どの名前が重なるかを見る。 **両方の規則で見る** = 片方だけだと cdl 側の経路で落ちる\n const 形ごとの名前 = new Map<string, Set<string>>();\n const 位置 = new Map<string, number>();\n 残す.forEach((a, i) => 位置.set(a.name, i));\n // **動きを書いた図では cdl の逃げ道を通らない** (Round 4 の指摘)。 動きがあると組み立てが\n // 別経路 (`compileGenericWithAnimate` / `compileSequenceWithAnimate`) に切り替わり、 id は\n // dragon 側の規則で作られる (実測 = `😀` は 枠 `n` / `lane-n` になり、 位置を使わない)。\n //\n // 逃げ先を鍵に入れたままにすると、 その経路で **重なっていない図の id を変える**。\n // dragon 側の規則で作る分は、 1 つ目の鍵 (`slugify`) が既に見ている。\n const 動きを書いた = (doc.animate?.phases.length ?? 0) > 0;\n const 逃げ先の頭 = 動きを書いた ? [] : 空の形の逃げ先[doc.type];\n for (const a of 残す) {\n for (const 形 of idになる形(a.name, 位置.get(a.name), 逃げ先の頭)) {\n const 群 = 形ごとの名前.get(形) ?? new Set<string>();\n 群.add(a.name);\n 形ごとの名前.set(形, 群);\n }\n }\n const 重なる = (name: string): boolean =>\n idになる形(name, 位置.get(name), 逃げ先の頭).some(\n (形) => (形ごとの名前.get(形)?.size ?? 0) > 1,\n );\n\n // **見本 (`parts`) を重ねた登場人物は作り替えない**。 見本の中身は `別名__元の id` の形で\n // 名前空間を持ち、 別名は名前から作るため、 作り替えると見本の id が総入れ替えになる。\n //\n // ただし **重なりの判定には数える** (Round 1 の指摘)。 数えないと、 素の登場人物と見本が\n // 同じ id の仮置きを共有し、 見本を片付ける時に素の登場人物の箱まで消える。\n const 作り替える = 残す.filter((a) => a.partId === undefined && 重なる(a.name));\n\n // 3. 名前から決まる尾を付ける。 **できあがる id が一意になるまで見る**\n //\n // 尾は元の名前だけから決まる = 並べ替えても同じ id になる。 それでも重なる時 (尾そのものが\n // 重なる形) は、 名前を並べ替えた順で番号を足す = ここも書き順に依らない\n const 使う形 = new Set<string>();\n for (const a of 残す) {\n if (作り替える.some((b) => b.name === a.name)) continue;\n for (const 形 of idになる形(a.name)) 使う形.add(形);\n }\n const 新しい名前 = new Map<string, string>();\n // 名前で並べてから配る = 書いた順に依らない\n for (const a of [...作り替える].sort((x, y) => (x.name < y.name ? -1 : x.name > y.name ? 1 : 0))) {\n const 尾 = 名前の尾(a.name);\n // **id の長さの上限のぶん、 元の名前を先に切る** (Round 1 の指摘)。 切らないと尾が\n // 64 字で落ちて、 同じ頭を持つ長い名前どうしが元のまま重なる\n const 余地 = ID_MAX - (尾.length + 1);\n const 基底 = a.name.slice(0, 余地);\n let 候補 = `${基底} ${尾}`;\n let n = 0;\n while (idになる形(候補).some((形) => 使う形.has(形))) {\n n += 1;\n 候補 = `${基底.slice(0, 余地 - String(n).length)} ${尾}${n}`;\n }\n for (const 形 of idになる形(候補)) 使う形.add(形);\n 新しい名前.set(a.name, 候補);\n 元の名前.set(候補, a.name);\n }\n\n if (新しい名前.size === 0 && 残す.length === doc.actors.length) return { doc, 元の名前 };\n\n const 直す = (名: string): string => 新しい名前.get(名) ?? 名;\n const 次: DslDocument = {\n ...doc,\n actors: 残す.map((a) => (新しい名前.has(a.name) ? { ...a, name: 直す(a.name) } : a)),\n flow: doc.flow.map((s) => {\n const from = 直す(s.from);\n const to = 直す(s.to);\n return from === s.from && to === s.to ? s : { ...s, from, to };\n }),\n };\n // 光らせる指定と位置の基準も名前で書くので、 同じ表で直す\n if (次.animate) {\n 次.animate = {\n ...次.animate,\n phases: 次.animate.phases.map((ph) =>\n ph.highlight ? { ...ph, highlight: ph.highlight.map((h) => 直す(h)) } : ph,\n ),\n };\n }\n 次.actors = 次.actors.map((a) =>\n a.posRel ? { ...a, posRel: { ...a.posRel, anchor: 直す(a.posRel.anchor) } } : a,\n );\n return { doc: 次, 元の名前 };\n}\n\n/**\n * 作り替えた名前を持つ箱と枠を控える (#1220)。\n *\n * **組み立て直後に控える** (Round 1 の指摘)。 出口で題の文字だけを見て戻すと、 後から足された\n * 見本の中の箱がたまたま同じ題を持っていた時に、 その表示まで書き換えてしまう。\n */\nfunction collectRenamedTargets(\n diagram: CdlDiagram,\n 元の名前: Map<string, string>,\n): { 箱: Set<string>; 枠: Set<string> } {\n const 箱 = new Set<string>();\n const 枠 = new Set<string>();\n if (元の名前.size === 0) return { 箱, 枠 };\n for (const n of diagram.nodes) if (元の名前.has(n.title)) 箱.add(n.id);\n for (const l of diagram.lanes) if (l.label !== undefined && 元の名前.has(l.label)) 枠.add(l.id);\n return { 箱, 枠 };\n}\n\n/**\n * 作り替えた名前を、 図の表示だけ元に戻す (#1220)。\n *\n * 戻すのは題と名札だけ。 id は作り替えたまま = 分けるために作り替えたので、 戻すと元の\n * 重なりに帰る。\n */\nfunction restoreActorNames(\n diagram: CdlDiagram,\n 元の名前: Map<string, string>,\n 対象: { 箱: Set<string>; 枠: Set<string> },\n): void {\n if (元の名前.size === 0) return;\n for (const n of diagram.nodes) {\n if (!対象.箱.has(n.id)) continue;\n const 元 = 元の名前.get(n.title);\n if (元 !== undefined) n.title = 元;\n }\n for (const l of diagram.lanes) {\n if (!対象.枠.has(l.id) || l.label === undefined) continue;\n const 元 = 元の名前.get(l.label);\n if (元 !== undefined) l.label = 元;\n }\n}\n\n/**\n * 矢印が `actors` に無い名前を指したことを知らせる (#1209)。\n *\n * 知らせずに通すと、 **どちらに転んでも書いた人の意図が消える**。 動きを書いていない図では\n * 種類ごとの組み立てが actors を順に繋ぐため、 書いた矢印そのものが捨てられて label も\n * 消える (実測 = \"変換\" が \"→\" になった)。 動きを書いた図では名前がそのまま下流へ渡り、\n * 存在しない node を指す図ができて描画の直前で落ちる\n * (実測 = `unknown-ref: edge \"e0-v-c\" の from \"v\" が node に存在しません`)。\n *\n * 落ちる場所も消える場所も本文から遠いので、 書いた行で知らせる。\n */\nfunction reportMissingFlowActors(\n doc: DslDocument,\n onNotice?: (notice: CompileNotice) => void,\n): void {\n if (!onNotice) return;\n const 表 = actorRefTable(doc);\n // hint は **1 度だけ作る**。 知らせごとに全 actor 名を並べ直すと、 名前も矢印も上限\n // (各 1,000) まで書いた図で数百 MB になる (Round 1 の指摘)。 並べる数にも上限を置く\n //\n // **1 件ずつの長さも切る**。 件数だけを絞っても、 名前 1 つが 2 万字なら知らせも 2 万字に\n // なる (Round 4 の実測)。 名前も矢印の指定も外から来る文字列なので、 表示に使う所は\n // すべて `truncateForMessage` を通す (光らせる相手の知らせと同じ扱い)。\n const 見せる数 = 8;\n const 名前一覧 = doc.actors\n .slice(0, 見せる数)\n .map((a) => truncateForMessage(a.name))\n .join(\" / \");\n const 残り = doc.actors.length - 見せる数;\n const hint =\n doc.actors.length > 0\n ? `actors に書いた名前で指す (${名前一覧}${残り > 0 ? ` ほか ${残り} 件` : \"\"})`\n : \"actors に登場人物を書く\";\n const 知らせた = new Set<string>();\n for (const s of doc.flow) {\n for (const ref of [s.from, s.to]) {\n if (表.has(ref) || 知らせた.has(ref)) continue;\n 知らせた.add(ref);\n onNotice({\n kind: \"flow-actor-missing\",\n actor: ref,\n line: s.pos.line,\n message: `矢印が \"${truncateForMessage(ref)}\" を指していますが、 actors に書かれていません`,\n hint,\n });\n }\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 // 矢印の両端は **流れと同じ表で名前へ揃えてから** 照合する (#1209 Round 2)。\n //\n // 流れは入口で名前へ揃えている (`canonicalizeFlowActors`) 一方、 光らせる指定は生のまま\n // 来る。 揃えずに比べると、 slug で書いた矢印 (`api-gateway -> db`) が実際は光るのに\n // 「見つかりません」 と誤報する (実測)\n const 名前へ = actorRefTable(doc);\n const 揃える = (ref: string): string => 名前へ.get(ref) ?? ref;\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 derivedSourceLines?: Map<string, number[]>,\n): CdlDiagram {\n const partsActors = doc.actors.filter((a) => a.partId !== undefined);\n if (partsActors.length === 0) return target;\n // 値と状態の名前に使う前置きを **書いた順に 1 度だけ** 決める (#1189)。 見本ごとに作ると\n // 同じ形に潰れた時の番号が揃わず、後から重ねた見本が先の名前空間を踏む\n const 値の前置き = 値の前置きを作る(partsActors.map((a) => a.name));\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(\n target,\n part,\n actor.name,\n merged,\n actor.lane,\n placeX,\n placeY,\n t.w,\n t.h,\n onNotice,\n actor.pos?.line ?? 0,\n derivedSourceLines,\n 値の前置き.get(actor.name),\n );\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 */\n/**\n * 値と状態の名前に使う前置きを、登場人物の名前から作る (#1189)。\n *\n * `{名前}` に書ける字種は engine が 1 箇所で決めており (`template-name.ts`)、英数字と `_` に\n * 限る。 **読む側 (置き換え) と書ける側 (式) の両方がその定義を使う** ため、記法の側だけ\n * 広げることはできない。\n *\n * この記法では日本語の名前が普通なので、名前をそのまま前置きにすると値が 1 つも届かない。\n * 実測 = `受付 1` に見本を重ねると、状態は表に載るのに箱の `{受付 1__v}` が置き換わらず、\n * 見本の中の式は識別子として読めずに止まる (`value-unresolved`)。\n *\n * **箱 / 縦列 / 矢印の id は変えない**。 これらは `{名前}` の対象ではなく、画面側が id から\n * 登場人物の名前を取り出す経路があるため、変えると別の場所が壊れる。\n *\n * ## 同じ形に潰れる名前\n *\n * `受付 1` と `受付-1` はどちらも英数字だけにすると同じ形になる。 潰れたまま使うと 2 つの\n * 見本が同じ名前空間を共有し、片方の値がもう片方を上書きする。\n *\n * そこで **書いた順に番号を足して分ける**。 先に書いた方が番号なしを取り、後から同じ形に\n * なった方が `_2` / `_3` と続く。 英数字の名前しか無い図では 1 つも番号が付かないため、\n * 既存の図の名前は変わらない。\n */\nfunction 値の前置きを作る(名前たち: readonly string[]): Map<string, string> {\n const 出力 = new Map<string, string>();\n const 使用中 = new Set<string>();\n const 次の番号 = new Map<string, number>();\n for (const 名前 of 名前たち) {\n if (出力.has(名前)) continue;\n let 素 = 名前\n .normalize(\"NFKC\")\n .replace(/[^A-Za-z0-9_]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n // 空になる形 (記号だけの名前) と数字始まりは、そのままでは名前として使えない\n if (素 === \"\" || /^[0-9]/.test(素)) 素 = `p${素}`;\n // 接尾辞で分けた名前も使用済みとして扱う。 `p1` / `p1!` / `p1_2` の順では、\n // base ごとの回数だけを見ると後ろ 2 つがどちらも `p1_2` になって再衝突する\n let 候補 = 素;\n let 番号 = 次の番号.get(素) ?? 2;\n while (使用中.has(候補)) {\n 候補 = `${素}_${番号}`;\n 番号 += 1;\n }\n 次の番号.set(素, 番号);\n 使用中.add(候補);\n 出力.set(名前, 候補);\n }\n return 出力;\n}\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 /** 見本から引き継いだ値の宣言元。 notice を見本を書いた行へ戻すために使う */\n derivedSourceLines?: Map<string, number[]>,\n /**\n * 値と状態の名前に使う前置き (#1189)。 `{名前}` は英数字と `_` しか読めないため、\n * 登場人物の名前をそのまま使えない。 渡されない経路では従来どおり名前をそのまま使う\n */\n valueAlias?: string,\n): void {\n const prefix = (id: string): string => `${alias}__${id}`;\n // 値と状態だけ別の前置きを使う (#1189)。 箱 / 縦列 / 矢印の id は `prefix` のまま\n const 値前置き = valueAlias ?? alias;\n const valuePrefix = (id: string): string => `${値前置き}__${id}`;\n // 見本が自分で持つ名前。 **状態と、他の値から決まる値の両方** (#1180)。\n //\n // 値を含めないと、見本の中の `{決まる値}` が名前を付け替えられずに残り、重ねた先の同名の\n // 値を指してしまう (見本どうしが互いの値を読む形になる)。\n const ownIdSet = new Set([\n ...part.states.map((s) => s.id),\n ...(part.derived ?? []).map((d) => d.id),\n ]);\n const rewriteTemplate = (s: string | undefined): string | undefined => {\n if (!s) return s;\n return s.replace(/\\{(\\w+)\\}/g, (m, name: string) => {\n return ownIdSet.has(name) ? `{${valuePrefix(name)}}` : m;\n });\n };\n // 値の式は見本の名前空間の中で閉じる。 見本が持つ名前だけを書き換えると、綴り違いの参照が\n // 取り込み先の同名の値に偶然つながり、単体では止まる見本の意味が置いた場所で変わる。\n //\n // **どれが参照かは engine に決めさせる**。 engine は `{v}` と裸の `v` の両方を参照として\n // 読み、関数名 (`min` / `Math.max` 等) は参照に数えない (実測)。 ここで関数の一覧を持つと\n // 記法側 (`value-syntax.ts`) と engine に続く 3 つ目の写しになり、engine が関数を足した時に\n // 静かにずれる。\n const rewriteDerivedExpression = (expression: string): string => {\n try {\n return writeFormula(renameFormulaIdentifiers(parseFormula(expression), valuePrefix));\n } catch {\n // 読めない式は engine が止めて伝える (`value-unresolved`)。 書き換えられないので\n // そのまま載せる = 名前は前置き無しのままだが、式自体が解けないため値は出ない\n return expression;\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: valuePrefix(stateOrig.id), initial });\n }\n\n // 見本が持つ「他の値から決まる値」 を引き継ぐ (#1180)。\n //\n // 引き継がないと、見本の中で書いた関係が重ねた先で解かれず、その値を読む箱に `{名前}` の\n // 生の形が出る。 名前は状態と同じ規則で前置きを付ける = 見本を 2 つ重ねても互いの値を\n // 読まない。 式の中の参照は、未定義の名前も含めて見本の名前空間へ閉じ込める。\n for (const derivedOrig of part.derived ?? []) {\n if (!target.derived) target.derived = [];\n const id = valuePrefix(derivedOrig.id);\n target.derived.push({\n id,\n expression: rewriteDerivedExpression(derivedOrig.expression),\n });\n recordDerivedSourceLine(derivedSourceLines, id, noticeLine);\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: valuePrefix(t.stateId) })),\n sets: phaseOrig.sets.map((s) => ({ ...s, stateId: valuePrefix(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: valuePrefix(t.stateId) }))];\n targetPhase.sets = [...targetPhase.sets, ...partPhase.sets.map((s) => ({ ...s, stateId: valuePrefix(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: valuePrefix(t.stateId) })),\n sets: phaseOrig.sets.map((s) => ({ ...s, stateId: valuePrefix(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 / overlay) を\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 // **静止した `type: flow` は書いた端で対応が取れない** (#1267)。 鎖の規則で先に埋める\n if (鎖でつなぐ形か(doc)) {\n diagram.edges.forEach((e, idx) => {\n const s = 鎖のどの行から来たか(doc, idx);\n if (s === undefined) return;\n sourceLines?.set(e.id, s.pos.line);\n 矢印へ書き写す(e, s, doc);\n });\n return;\n }\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 矢印へ書き写す(target, s, doc);\n });\n}\n\n/** 本文に書いた矢印の指定を、対応が取れた矢印へ書き写す。 対応の取り方は呼出側が決める。 */\nfunction 矢印へ書き写す(target: CdlEdge, s: DslStep, doc: DslDocument): void {\n // **書いた補足が勝つ** (#1275)。 ここで写さないと 2 つ落ちる。 静止した `type: flow` は\n // 鎖を作る時に説明文しか渡さないため補足が消え、`er` は見本が多重度から作った補足が\n // 残って書いた値が無視される (どちらも実測)\n if (s.sub !== undefined) target.sub = s.sub;\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 if (s.overlay !== undefined) target.overlay = s.overlay;\n}\n\n/**\n * 静止した `type: flow` かどうか。 この形だけ矢印を鎖状に作る (`compileFlow`)。\n *\n * 段を持つ形と縦列を書いた形は generic 経路へ回るため鎖にならない。 判定を 1 か所に\n * 集めるのは、`compileFlow` の分岐と食い違うと対応の取り方だけがずれるため。\n */\nfunction 鎖でつなぐ形か(doc: DslDocument): boolean {\n if (doc.type !== \"flow\") return false;\n if (doc.animate && doc.animate.phases.length > 0) return false;\n return !書いた縦列に置く(\"flow\", doc);\n}\n\n/**\n * 鎖の N 本目の矢印が、本文のどの行から来たかを返す (#1267)。\n *\n * `compileFlow` は登場人物を書いた順に繋ぎ、説明文は **その箱を to に持つ行** から拾う。\n * 書いた側の端 (from) は使わない。 そのため `A -> C` と書いても矢印は `A -> B` になり、\n * (from, to) の一致では対応が取れない (実測 = 説明文だけが載り、指定が黙って落ちていた)。\n *\n * 説明文を決めた規則と同じ規則で指定も決める = 説明文と指定が必ず同じ行から来る。\n */\nfunction 鎖のどの行から来たか(doc: DslDocument, edgeIndex: number): DslStep | undefined {\n const to = doc.actors[edgeIndex + 1];\n if (to === undefined) return undefined;\n return doc.flow.find((s) => s.to === to.name);\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 * 記法の `values:` を図に載せる (#1162)。\n *\n * `values` は「他の値から自動で決まる値」 で、 時間を持たない。 参照した値が動けば常に\n * 追随する。 解くのは描画側 (`@cardenelabs/cdl` の `applyDerivedValues`) で、 段の値を出した\n * 後に参照順で解いて `stateValues` に載せる。 **毎 frame ここを通る**ので、 掛け算や比較の\n * ように端点 2 点では表せない関係も段の補間の途中で正しい値になる。\n *\n * ここは載せるだけで、 式は評価しない。 評価を compile 時に畳むと段の補間中に決まり直せない。\n *\n * **出口で 1 度だけ載せる**。 図の種類は 18 あり、 経路ごとに書くとどれかを見落とす\n * (`injectStaticPhase` と同じ理由)。\n *\n * 名前が `states` と重なった場合は `values` を優先し、 重なったことを伝える。 spec の\n * 4 節で決めた挙動で、 黙って一方を捨てると「書いたのに効かない」 が残る。\n */\n/** 数を式に埋める。 指数表記 (`1e-7`) は engine の式が読めないため十進で書く */\nfunction 式に書く数(n: number): string {\n if (!Number.isFinite(n)) return \"0\";\n const text = String(n);\n if (!/[eE]/.test(text)) return text;\n\n // Number の有効桁を丸めず、指数表記だけを通常の十進表記へ展開する。 `toFixed(6)` では\n // 1e-7 が 0 になり、正しく読める `to` の値が動かなくなる。\n const [coefficient = \"0\", exponentText = \"0\"] = text.toLowerCase().split(\"e\");\n const negative = coefficient.startsWith(\"-\");\n const unsigned = negative ? coefficient.slice(1) : coefficient;\n const [whole = \"0\", fraction = \"\"] = unsigned.split(\".\");\n const digits = `${whole}${fraction}`;\n const decimalAt = whole.length + Number(exponentText);\n let expanded: string;\n if (decimalAt <= 0) expanded = `0.${\"0\".repeat(-decimalAt)}${digits}`;\n else if (decimalAt >= digits.length) expanded = `${digits}${\"0\".repeat(decimalAt - digits.length)}`;\n else expanded = `${digits.slice(0, decimalAt)}.${digits.slice(decimalAt)}`;\n return negative ? `-${expanded}` : expanded;\n}\n\n/** 段の中で 1 本の値が動く区間。 `from` から `to` へ `[start, end]` の間で線形に動く */\ntype 動く区間 = { 段: number; start: number; end: number; dur: number; from: number; to: number };\n\n/**\n * 相手の値が境目を通る時刻を求める。\n *\n * 相手は段の中で線形に動くので、 境目を通る時刻は逆算できる。 始めから成り立っているなら\n * 相手が動き始めた時刻、 終わりまで成り立たないなら「通らない」 とする。\n *\n * `>` と `!=` の厳密な瞬間は境目の直後だが、 1 frame 未満の差なので境目そのものを返す。\n */\nfunction 境目を通る時刻(区間: 動く区間, op: string, 境目: number): number | null {\n const 満たす = (x: number): boolean => {\n switch (op) {\n case \">=\": return x >= 境目;\n case \">\": return x > 境目;\n case \"<=\": return x <= 境目;\n case \"<\": return x < 境目;\n case \"==\": return x === 境目;\n case \"!=\": return x !== 境目;\n default: return false;\n }\n };\n if (満たす(区間.from)) return 区間.start;\n // `==` は終点が一致しなくても、線形補間の途中で境目を通る。 終点だけを見ると\n // 0 → 100 に対する `== 50` を「満たさない」と誤判定する。\n if (op === \"==\") {\n const min = Math.min(区間.from, 区間.to);\n const max = Math.max(区間.from, 区間.to);\n if (境目 < min || 境目 > max) return null;\n } else if (!満たす(区間.to)) {\n return null;\n }\n if (区間.to === 区間.from) return null;\n const t = 区間.start + (区間.dur * (境目 - 区間.from)) / (区間.to - 区間.from);\n if (!Number.isFinite(t)) return null;\n return Math.min(Math.max(t, 区間.start), 区間.end);\n}\n\n/**\n * きっかけ形の値 (`trigger` / `to` / `dur`) を、段の時計を読む式へ畳む (#1161 段 2)。\n *\n * ## なぜ式へ畳むのか\n *\n * 描画側の動きの模型は段と、 段の中の線形補間しか持たない。 条件で動き出す仕組みも、 値ごとの\n * 長さも無い (実測)。 そのままでは `trigger` も `dur` も渡せない。\n *\n * 一方で描画側は `derived` の式を **毎 frame** 解く。 そこで段に時計を 1 本引き\n * (`0` から段の長さまでの補間)、 各値を「時計を読む傾斜」 として書けば、 段を割らずに\n * 値ごとの長さを守れる。\n *\n * ```\n * 値 = from + (to - from) * min(max((時計 - 開始) / 長さ, 0), 1)\n * ```\n *\n * `min` / `max` で挟むのは、 開始前は `from` のまま、 終了後は `to` のまま止めるため。\n *\n * ## 段を割らない\n *\n * 段は見出し / 本文 / 印を持つ表示物なので、 割ると段送りの見え方と件数が変わる。 時計を使えば\n * 段は 1 つのまま値だけが順に動く。 収まらない形 (開始 + 長さ > 段の長さ) は畳まずに知らせる。\n *\n * ## 連鎖の解き方\n *\n * `trigger: <相手> >= <境目>` は、 相手も段の中で線形に動くため境目を通る時刻を逆算できる。\n * 相手が動く値でない (式だけ、 または初期値のまま) 場合は時刻が決まらないので畳まない。\n *\n * 返すのは名前から式への表で、 `attachDerivedValues` がこれを `derived` に載せる。 畳めなかった\n * 値は表に入らないため図に載らない = 半端に止まった値を黙って置かない。\n */\nfunction foldValueTriggers(\n diagram: CdlDiagram,\n doc: DslDocument,\n onNotice?: (n: CompileNotice) => void,\n): Map<string, string> {\n const 出力 = new Map<string, string>();\n const きっかけ付き = (doc.values ?? []).filter((v) => v.trigger !== undefined);\n if (きっかけ付き.length === 0) return 出力;\n\n // 同じ名前を 2 度書いた時は先に書いた方を使う (`values` の既存の扱いと揃える)\n const 宣言 = new Map<string, DslValue>();\n for (const v of きっかけ付き) if (!宣言.has(v.name)) 宣言.set(v.name, v);\n\n const 初期値 = new Map<string, number>();\n for (const s of diagram.states) {\n const n = Number(s.initial);\n if (Number.isFinite(n)) 初期値.set(s.id, n);\n }\n\n // 段は書いた名前でも slug でも指せる。 `focus:` が名前で指せるのと揃える\n const 段の番号 = new Map<string, number>();\n diagram.phases.forEach((p, i) => {\n if (!段の番号.has(p.title)) 段の番号.set(p.title, i);\n if (!段の番号.has(p.id)) 段の番号.set(p.id, i);\n });\n\n const 解けた = new Map<string, 動く区間>();\n const 解けない = new Set<string>();\n const 解決中 = new Set<string>();\n\n const 知らせる = (v: DslValue, message: string, hint: string): void => {\n onNotice?.({ kind: \"value-trigger-unresolved\", actor: v.name, line: v.pos?.line ?? 0, message, hint });\n };\n\n const 解く = (name: string): 動く区間 | null => {\n const 既出 = 解けた.get(name);\n if (既出) return 既出;\n if (解けない.has(name)) return null;\n const v = 宣言.get(name);\n if (!v || !v.trigger) return null;\n if (解決中.has(name)) {\n 解けない.add(name);\n 知らせる(v, `\"${name}\" のきっかけが一周しています`, \"どれか 1 つを `trigger: step ...` に変える\");\n return null;\n }\n 解決中.add(name);\n const 区間 = 組み立てる(v);\n 解決中.delete(name);\n if (!区間) {\n 解けない.add(name);\n return null;\n }\n 解けた.set(name, 区間);\n return 区間;\n };\n\n const 組み立てる = (v: DslValue): 動く区間 | null => {\n const trigger = v.trigger!;\n const from = 初期値.get(v.name) ?? 0;\n const to = v.to ?? 0;\n const dur = v.durationMs ?? 0;\n let 段 = 0;\n let start = 0;\n if (trigger.kind === \"step\") {\n const idx = 段の番号.get(trigger.step);\n if (idx === undefined) {\n 知らせる(v, `\"${trigger.step}\" という段がありません`, \"`animation:` にその名前の段を書くか、 段の名前に合わせる\");\n return null;\n }\n 段 = idx;\n start = 0;\n } else {\n const 相手 = 解く(trigger.source);\n if (!相手) {\n 知らせる(\n v,\n `\"${trigger.source}\" が動く値でないため、 きっかけの時刻を決められません`,\n \"見張る相手も `trigger:` を持つ値にする\",\n );\n return null;\n }\n const at = 境目を通る時刻(相手, trigger.op, trigger.threshold);\n if (at === null) {\n 知らせる(\n v,\n `\"${trigger.source}\" は ${trigger.op} ${trigger.threshold} を満たしません`,\n \"相手が通る値を境目にするか、 相手の `to` を見直す\",\n );\n return null;\n }\n 段 = 相手.段;\n start = at;\n }\n const 段の長さ = diagram.phases[段]?.duration ?? 0;\n if (start + dur > 段の長さ) {\n 知らせる(\n v,\n `段 \"${diagram.phases[段]?.title ?? \"\"}\" (${段の長さ}ms) に収まりません (${Math.round(start + dur)}ms 必要)`,\n \"段を長くするか `dur` を短くする\",\n );\n return null;\n }\n return { 段, start, end: start + dur, dur, from, to };\n };\n\n for (const v of 宣言.values()) 解く(v.name);\n if (解けた.size === 0) return 出力;\n\n // 時計は段ごとに 1 本。 名前が既にある時は末尾に数を足してずらす = 書いた値を上書きしない\n const 使用中 = new Set(diagram.states.map((s) => s.id));\n for (const v of doc.values ?? []) 使用中.add(v.name);\n const 段ごとの時計 = new Map<number, string>();\n const 時計を用意する = (段: number): string => {\n const 既出 = 段ごとの時計.get(段);\n if (既出) return 既出;\n let 名前 = `__step_clock_${段}`;\n let 連番 = 2;\n while (使用中.has(名前)) 名前 = `__step_clock_${段}_${連番++}`;\n 使用中.add(名前);\n 段ごとの時計.set(段, 名前);\n diagram.states.push({ id: 名前, initial: 0 });\n const 段の中身 = diagram.phases[段];\n if (段の中身) 段の中身.tweens = [...段の中身.tweens, { stateId: 名前, from: 0, to: 段の中身.duration }];\n return 名前;\n };\n\n for (const [name, 区間] of 解けた) {\n const 時計 = 時計を用意する(区間.段);\n const 進み = `min(max(({${時計}} - ${式に書く数(区間.start)}) / ${式に書く数(区間.dur)}, 0), 1)`;\n 出力.set(name, `((${進み} * ${式に書く数(区間.to - 区間.from)}) + ${式に書く数(区間.from)})`);\n }\n return 出力;\n}\n\nfunction attachDerivedValues(\n diagram: CdlDiagram,\n doc: DslDocument,\n onNotice?: (n: CompileNotice) => void,\n inheritedSourceLines?: ReadonlyMap<string, readonly number[]>,\n foldedTriggers?: ReadonlyMap<string, string>,\n): void {\n const values = doc.values ?? [];\n // 本文に値を書いていなくても、重ねた見本が値を持つことがある (#1180)。 その場合も\n // 解けなかった分は伝える = 見本の中で止まった値も、画面には `{名前}` の生の形で出る\n if (values.length === 0) {\n if ((diagram.derived?.length ?? 0) > 0) {\n reportUnresolvedValues(diagram, doc, onNotice, inheritedSourceLines);\n }\n return;\n }\n\n // 名前が重なったかは **図に載った状態** で見る。 書いた `states:` だけを見ると、見本から\n // 引き継いだ状態 (`alias__id`) との重なりを見落とす\n const 状態の名前 = new Set(diagram.states.map((s) => s.id));\n for (const v of values) {\n if (!状態の名前.has(v.name)) continue;\n // きっかけ形は `states:` の値を **動き始めの値として使う**。 両方書くのが正しい形なので\n // 重なりとして知らせない (#1161)。 知らせると、 仕様どおりに書いた図が毎回警告を出す\n if (v.trigger !== undefined) continue;\n onNotice?.({\n kind: \"value-shadows-state\",\n actor: v.name,\n line: v.pos?.line ?? 0,\n message: `\"${v.name}\" を states と values の両方に書いています。 values を使います`,\n hint: \"states から外すか、 values の名前を変える\",\n });\n }\n\n // **見本から引き継いだ分に足す** (#1180)。 代入で書くと、重ねた見本が持つ値が消える。\n //\n // 本文に書いた分を先に置く = engine は同じ名前では先に書いた式を使うため、名前が重なった\n // 時に本文が勝つ。 重なったことは engine の知らせ (`duplicate-id`) がそのまま伝える\n // きっかけ形は `foldValueTriggers` が畳んだ式を使う。 畳めなかった値はここに現れないため\n // 図に載らない = 半端に止まった値を黙って置かない (知らせは畳む時点で出している)\n const 載せる: Array<{ id: string; expression: string }> = [];\n for (const v of values) {\n const expression = v.expression ?? foldedTriggers?.get(v.name);\n if (expression === undefined) continue;\n 載せる.push({ id: v.name, expression });\n }\n diagram.derived = [...載せる, ...(diagram.derived ?? [])];\n reportUnresolvedValues(diagram, doc, onNotice, inheritedSourceLines);\n}\n\n/**\n * 式の中の名前を付け替える (#1180)。\n *\n * **字句ではなく木を経由する**。 engine の式は `{v}` / 裸の `v` / 数字始まり / `$` 入りと\n * 参照の書き方が複数あり、正規表現で追うと書き方が 1 つ増えるたびに漏れる (review が 3 round\n * 続けて別の漏れを見つけた)。 木は識別子をそのまま持つので、字句を網羅しなくてよい。\n *\n * 関数呼び出し (`min` / `Math.max`) は木の上で別の種類なので、名前と取り違えない。\n */\nfunction renameFormulaIdentifiers(ast: FormulaAst, rename: (name: string) => string): FormulaAst {\n switch (ast.type) {\n case \"number\":\n return ast;\n case \"identifier\":\n return { type: \"identifier\", name: rename(ast.name) };\n case \"unaryOp\":\n return { ...ast, operand: renameFormulaIdentifiers(ast.operand, rename) };\n case \"binaryOp\":\n return {\n ...ast,\n left: renameFormulaIdentifiers(ast.left, rename),\n right: renameFormulaIdentifiers(ast.right, rename),\n };\n case \"ternary\":\n return {\n type: \"ternary\",\n condition: renameFormulaIdentifiers(ast.condition, rename),\n whenTrue: renameFormulaIdentifiers(ast.whenTrue, rename),\n whenFalse: renameFormulaIdentifiers(ast.whenFalse, rename),\n };\n case \"call\":\n return { ...ast, args: ast.args.map((a) => renameFormulaIdentifiers(a, rename)) };\n }\n}\n\n/**\n * 数を、engine の読み手が受け付ける形で書く (#1180)。\n *\n * **指数表記を出さない**。 `0.0000001` は JavaScript の既定では `\"1e-7\"` になるが、engine の\n * 読み手は指数表記を読めない (実測 = `unexpected token after expression`)。 そのまま書くと、\n * 元は解けていた式が書き換えた後だけ止まる。\n *\n * 展開は桁をずらすだけで、丸めない。 `String` が返す最短の形をそのまま使うため、値は変わらない。\n * 有限でない数は書けないので投げる (呼出側が元の式のまま載せる)。\n */\nfunction writeNumber(value: number): string {\n if (!Number.isFinite(value)) throw new Error(`cannot write non-finite number: ${String(value)}`);\n const s = String(value);\n if (!/[eE]/.test(s)) return s;\n const m = /^(-?)(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(s);\n if (!m) throw new Error(`cannot write number: ${s}`);\n const sign = m[1] ?? \"\";\n const int = m[2] ?? \"\";\n const frac = m[3] ?? \"\";\n const digits = int + frac;\n // 小数点の位置。 元の整数部の桁数を指数のぶんだけずらす\n const point = int.length + Number(m[4] ?? \"0\");\n if (point <= 0) return `${sign}0.${\"0\".repeat(-point)}${digits}`;\n if (point >= digits.length) return `${sign}${digits}${\"0\".repeat(point - digits.length)}`;\n return `${sign}${digits.slice(0, point)}.${digits.slice(point)}`;\n}\n\n/**\n * 式の木を文字列へ戻す (#1180)。\n *\n * **括弧を全て付ける**。 演算子の優先順位を再現しようとすると engine の表を写すことになり、\n * 表がずれた時に式の意味が静かに変わる。 括弧が増えても解いた結果は変わらない。\n */\nfunction writeFormula(ast: FormulaAst): string {\n switch (ast.type) {\n case \"number\":\n return writeNumber(ast.value);\n case \"identifier\":\n // **裸で書ける形とそうでない形がある**。 engine は裸の名前を `[A-Za-z_$][\\w$]*` で読む\n // 一方、波括弧の中は `\\w+` なので数字始まりの名前は波括弧付きでしか書けない。\n // 名前は前置きで変わる (`1p__v` のように数字始まりになりうる) ため、書ける方を選ぶ\n return /^[A-Za-z_$][\\w$]*$/.test(ast.name) ? ast.name : `{${ast.name}}`;\n case \"unaryOp\":\n // 空白は挟まない。 読み手は負の数を字面として持たず (`-5` は単項 `-` と `5` の木になる)、\n // `--5` も単項の 2 段として読む (実測)。 挟んでも挟まなくても意味が同じなので足さない\n return `(${ast.op}${writeFormula(ast.operand)})`;\n case \"binaryOp\":\n return `(${writeFormula(ast.left)} ${ast.op} ${writeFormula(ast.right)})`;\n case \"ternary\":\n return `(${writeFormula(ast.condition)} ? ${writeFormula(ast.whenTrue)} : ${writeFormula(ast.whenFalse)})`;\n case \"call\":\n return `${ast.fn}(${ast.args.map(writeFormula).join(\", \")})`;\n }\n}\n\n/** `derived` の同名宣言を、engine が読む順のまま行番号の列として残す。 */\nfunction recordDerivedSourceLine(\n sourceLines: Map<string, number[]> | undefined,\n id: string,\n line: number,\n): void {\n if (!sourceLines) return;\n const lines = sourceLines.get(id) ?? [];\n lines.push(line);\n sourceLines.set(id, lines);\n}\n\n/**\n * 解けなかった値を書いた人に伝える (#1162)。\n *\n * 描画側は解けない値を黙って飛ばす (`computeStateValues` が engine の知らせを捨てている)。\n * 書き間違えても図は描かれ、箱に `{waiting}` の生の形が出るだけになる。 綴りを疑う以外に\n * 手掛かりが無いので、組み立ての時点で分かる分をここで伝える。\n *\n * **判定は engine にさせる**。 解く順序と、止める条件 (輪 / 無い名前 / 読めない式 / 数として\n * 読めない値) は engine が持つ。 同じ判定を書き直すと、描画は動くのに知らせだけ出る\n * (またはその逆) 状態を作る。\n *\n * 見るのは初期値 1 組だけ。 輪 / 無い名前 / 読めない式 / 二重宣言は値に依らないのでこれで\n * 全て取れる。 段の途中でだけ起きる形 (割る数が段の途中で 0 になる等) は取れない =\n * 毎 frame の知らせは engine 側が返し口を持たないため、ここでは扱わない。\n */\nfunction reportUnresolvedValues(\n diagram: CdlDiagram,\n doc: DslDocument,\n onNotice?: (n: CompileNotice) => void,\n inheritedSourceLines?: ReadonlyMap<string, readonly number[]>,\n): void {\n if (!onNotice) return;\n // 描画側 (`computeStateValues`) が段を進める前に組み立てるのと同じ形。 値を解く手順は\n // engine に渡すので、ここで組み立てるのは初期値の表だけにする\n //\n // **継承を持たない入れ物で作る**。 engine 側 (`computeStateValues` /\n // `applyDerivedValues`) が同じ形で組むため、ここを通常の object にすると\n // `__proto__` のような名前で **組み立てだけが「値が無い」 と知らせる** 状態ができる\n // (実測 = 描画は `a = 5` を出すのに、知らせは `value-unresolved` を出していた)。\n //\n // engine が `{}` で組んでいた頃はここも `{}` で揃えていた。 cdl 側が継承なしに\n // 揃えた (cdl#456 / cdl#490) ので、こちらも合わせる。 **揃っていることが要点**で、\n // どちらの形にするかは engine が決める\n const 初期値: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const s of diagram.states) 初期値[s.id] = String(s.initial);\n\n // engine は同じ名前では先に書いた式を使う。 Map の一括生成で後ろから\n // 上書きすると、先の式の未解決を後の行の問題として伝えてしまう\n const 最初の行 = new Map<string, number>();\n const 重複した行 = new Map<string, number[]>();\n for (const v of doc.values ?? []) {\n if (!最初の行.has(v.name)) {\n 最初の行.set(v.name, v.pos?.line ?? 0);\n continue;\n }\n const 同じ名前の行 = 重複した行.get(v.name) ?? [];\n 同じ名前の行.push(v.pos?.line ?? 0);\n 重複した行.set(v.name, 同じ名前の行);\n }\n // 本文の値は `attachDerivedValues` が先頭へ置き、見本から引き継いだ値はその後ろに残る。\n // 同じ順で行を足すことで、duplicate-id を「後から書かれた宣言」へ正確に戻す。\n for (const [id, lines] of inheritedSourceLines ?? []) {\n for (const line of lines) {\n if (!最初の行.has(id)) {\n 最初の行.set(id, line);\n continue;\n }\n const 同じ名前の行 = 重複した行.get(id) ?? [];\n 同じ名前の行.push(line);\n 重複した行.set(id, 同じ名前の行);\n }\n }\n for (const n of applyDerivedValues(初期値, diagram.derived).notices) {\n onNotice({\n kind: n.kind === \"duplicate-id\" ? \"value-duplicate\" : \"value-unresolved\",\n actor: n.id,\n // 重複は後から書いた宣言そのものを、式の問題は engine が使う最初の宣言を指す\n line:\n n.kind === \"duplicate-id\"\n ? (重複した行.get(n.id)?.shift() ?? 最初の行.get(n.id) ?? 0)\n : (最初の行.get(n.id) ?? 0),\n message: n.message,\n hint: VALUE_NOTICE_HINT[n.kind],\n });\n }\n}\n\n/** 止まった理由ごとの直し方。 engine の知らせは何が起きたかまでで、直し方は記法側が持つ */\nconst VALUE_NOTICE_HINT: Readonly<Record<string, string>> = {\n cycle: \"参照が一周しています。 どれか 1 つを states の初期値に変える\",\n \"unknown-reference\": \"その名前の states / values を足すか、綴りを直す\",\n \"parse-error\": \"式に書けるのは四則 (+ - * /) と括弧、比較、min / max だけ\",\n \"eval-error\": \"初期値で計算できない形です。 割る数や、数として読めない初期値を見直す\",\n \"duplicate-id\": \"同じ名前が 2 度あります。 片方を消すか名前を変える\",\n \"invalid-id\": \"名前に使えるのは英数字と _ だけ\",\n};\n\n/**\n * 図全体を 1 つの箱で描く種別。\n *\n * これらは中身 (扇 / 帯 / 枝) を payload で受け取り、 1 node で図全体を描く。 登場人物ごとの箱を\n * 持たないので、 段の `focus:` で名前を指しても引く先が無い。 `injectPhasesFallback` が\n * この一覧を使って「実在する名前ならその箱を光らせる」 に読み替える (#1076 / #1077)。\n *\n * `mind-map` は一時期 **記法から到達しなかった** (`#1174`)。 この種別を作っていたのは\n * `compileRadial` だけで `#1170` で消え、 記法の `type: mind` は `card` を 3 列に並べる\n * 別実装だった。\n *\n * それでも一覧に残すのは、 ここが「1 箱で図全体を描く種別」 という **性質の一覧** だから。\n * `mind-map` は engine 側でその性質を持ち続けており、 記法が到達しないのは当時の\n * `compileMind` の実装によるものだった。 `#1177` で `compileMind` を `mind-map` に寄せたため、\n * **今は記法からも到達する** (一覧へ戻す作業が要らなかったのはこのため)。\n */\nconst SINGLE_BOX_KINDS: ReadonlySet<string> = new Set([\n \"chart-pie\", \"chart-line\", \"chart-bar\",\n \"gantt-timeline\", \"mind-map\",\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 */\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 */\n/**\n * `{名前}` が指す状態が取りうる値を、記法に書かれた範囲で集める (#1251)。\n *\n * 初期値と、段が動かす先 (`tween:` の両端と `set:` の値) を見る。 数として読めない値は\n * 落とす = 位置として使われないため、下限の判定には関係しない。\n */\nfunction 状態が取る値(参照: string, doc: DslDocument): number[] {\n const 名 = 参照.slice(1, -1);\n const out: number[] = [];\n const 数にする = (v: unknown): void => {\n if (typeof v === \"number\") {\n if (Number.isFinite(v)) out.push(v);\n return;\n }\n // **空文字と空白だけの値を数にしない**。 `Number(\"\")` は 0 を返すため、そのままだと\n // 位置 0 として扱われ、始まりが 1 以降の帯に誤った知らせが出る。 描画側はこの値を\n // 解けず始まりへ倒すので、警告する相手ではない\n const 文字 = String(v).trim();\n if (文字 === \"\") return;\n const n = Number(文字);\n if (Number.isFinite(n)) out.push(n);\n };\n for (const st of doc.animate?.states ?? []) if (st.name === 名) 数にする(st.initial);\n for (const p of doc.animate?.phases ?? []) {\n for (const t of p.tweens ?? []) {\n if (t.state !== 名) continue;\n 数にする(t.from);\n 数にする(t.to);\n }\n for (const v of p.sets ?? []) if (v.state === 名) 数にする(v.value);\n }\n return out;\n}\n\n/**\n * 工程が終わる位置を決める (#1251)。\n *\n * 書かなければ始まりと同じ = 帯が 1 コマ (従来の挙動)。\n *\n * `{名前}` を書いたらそのまま渡す。 描画側が状態を解いて位置に直すため、段で帯が伸び縮みする。\n * その場合 **時期の名前は始まりのものを使う** = 状態が指すのは位置であって時期の名前ではなく、\n * 帯の端に出す字が段ごとに変わるわけではない。\n *\n * 時期の名前を書いたら、その名前の位置に終わる。 書いた名前が目盛りに無い形は始まりと同じに\n * 倒す = 目盛りは書かれた順に作るため、載っていない名前は位置を持たない。\n */\nfunction 終わる位置(\n end: string | undefined,\n 始まり: number,\n 目盛り: readonly string[],\n 名前: string,\n 伝える: (名: string, message: string) => void,\n doc: DslDocument,\n): { idx: number | string; label?: string } {\n if (end === undefined) return { idx: 始まり };\n if (/^\\{\\w+\\}$/.test(end)) {\n // **状態が取る値は記法に全部書いてある**。 初期値と、段が動かす先 (`tween:` の両端と\n // `set:` の値) を集めれば、始まりより前に落ちる値をここで見つけられる。\n //\n // 覆えないのは `values:` の式から決まる値だけ = 他の状態から計算されるため、\n // 段ごとの結果を組み立ての時点では出せない\n const 低い = 状態が取る値(end, doc).filter((v) => v < 始まり);\n if (低い.length > 0) {\n 伝える(\n 名前,\n `type: gantt で ${truncateForMessage(名前)} の終わり (${truncateForMessage(end)}) が始まりより前になる値を取ります (${[...new Set(低い)].join(\", \")})。 始まりは ${始まり} 番目です`,\n );\n }\n return { idx: end };\n }\n const i = 目盛り.indexOf(end);\n if (i < 0) return { idx: 始まり };\n // 始まりより前に終わる帯は描けない。 そのまま渡すと横幅が負になり、帯が始まりの位置から\n // 左へはみ出す。 始まりと同じに倒して伝える (黙って倒すと「書いたのに 1 コマのまま」 になる)\n if (i < 始まり) {\n 伝える(\n 名前,\n `type: gantt で ${truncateForMessage(名前)} の終わり (${truncateForMessage(end)}) が始まりより前です (始まりと同じに倒しました)`,\n );\n return { idx: 始まり };\n }\n return { idx: i, label: end };\n}\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 });\n\n // 目盛りは **書かれた順** に並べる。 以前は `Q1=200 / Q2=600 / ...` の決め打ちで、 Q1-Q4 以外は\n // 全て同じ位置に落ちていた。 順に並べれば月名でも週番号でも同じ規則で置ける\n const 目盛り: string[] = [];\n const 目盛りなし: string[] = [];\n const タスク: {\n name: string;\n label: string;\n tone?: DslDocument[\"actors\"][number][\"tone\"];\n owner?: string;\n end?: string;\n }[] = [];\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({\n name: a.name,\n label,\n ...(a.tone !== undefined ? { tone: a.tone } : {}),\n ...(a.owner !== undefined ? { owner: a.owner } : {}),\n ...(a.end !== undefined ? { end: a.end } : {}),\n });\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 // 帯の向きの誤りは `console.warn` に出す。 この図種の他の知らせ (時期なし / 依存が結べない /\n // 矢印の飾り) が同じ経路を使っており、揃えないとどれが出るかが書き方で変わる\n const 逆向きを伝える = (_名: string, message: string): void => {\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${message}`);\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 ...図の小見出し(doc),\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 const 終わり = 終わる位置(t.end, idx, 目盛り, t.name, 逆向きを伝える, doc);\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: 終わり.label ?? t.label,\n ...(t.owner !== undefined ? { owner: t.owner } : {}),\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 * クラス図の組み立て。\n *\n * 各クラスを 1 つの箱 (`storage`) にする。 描画側は題 (クラス名) と区切り線と行\n * (項目 / 手続き) を UML のクラス箱として描く。\n *\n * **クラスごとに縦列を 1 本作り、横に並べる** (#1263)。 組立て API 側がそう並べており、\n * 1 本にまとめると同じ内容でも横並びが縦並びになる (実測 = 見本は 3 縦列 450 幅)。\n * 縦列に見出しは付けない = クラスの名前は箱が既に描いており、縦列は並べるための入れ物\n * (`er` / `state` と同じ扱い、#1241)。\n *\n * 箱の種類は `storage` に強制する。 行と小見出しは `applyV05Extensions` が後から載せる。\n *\n * 矢印は継承や保有を表す (`extends` / `aggregates` 等を書き手が説明に書く)。\n */\nfunction compileClass(doc: DslDocument): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const CLASS_W = 400;\n // 縦列の幅は箱より広く取る。 組立て API 側の値に揃える (#1263)\n const CLASS_LANE_W = 450;\n // 登場人物が 0 人なら枠も作らない。 先に作ると中身の無い枠が 1 つ残る (#1096)\n if (doc.actors.length === 0) return b.build();\n\n // **クラスごとに縦列を 1 本作る** (#1263)。 組立て API 側がそう並べており、1 本にまとめると\n // 同じ内容でも横並びが縦並びになる (実測 = 見本は 3 縦列 450 幅、記法は 1 縦列に縦積み)。\n //\n // 縦列に見出しは付けない。 クラスの名前は箱が既に描いており、縦列は並べるための入れ物\n // (`er` / `state` と同じ扱い、#1241)\n doc.actors.forEach((a, idx) => {\n const nodeId = slugify(a.name) || `c${idx}`;\n const laneId = `lane-${nodeId}`;\n b.lane(laneId, { width: CLASS_LANE_W });\n b.node(nodeId, {\n lane: laneId,\n stack: 0,\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 * 状態を読む欄かどうか (`{名前}`)。\n *\n * **`{名前}` そのものだけを受ける**。 `{v} 件` のような混ざった形は、描画側が数として\n * 読めず既定値に落ちて印が付くだけになる (`render/payload-binding.ts` は解いた文字列を\n * そのまま数にする)。 書けたのに効かない形を作らない。\n *\n * `%` を付けた形も受けない。 同じ理由で `\"45%\"` は数に直せるが `\"{v}%\"` は直せない。\n *\n * 名前に使えるのは英数字と `_` で、読む側 (cdl の `interpolate`) と同じ範囲に合わせる。\n * 決まった accessor (`.sum` 等) は付けてよい。\n */\nfunction parseBoundValue(raw: string | undefined): string | null {\n if (raw === undefined) return null;\n const t = raw.trim();\n return /^\\{\\w+(?:\\.(?:length|sum|max|min|avg)|\\[\\d+\\])?\\}$/.test(t) ? t : null;\n}\n\n/**\n * 図表の数の欄を読む。 数そのものか、状態を読む `{名前}` を返す。\n *\n * 数として解けない `{名前}` は、そのまま図表の中身に渡して描画側が段ごとに解く。\n * 受け取る側の型 (`BoundNumber`) は元から 2 通りを想定している = 入口だけが塞がっていた。\n */\nfunction parseChartValue(raw: string | undefined): number | string | null {\n const n = parseShareValue(raw);\n if (n !== null) return n;\n return parseBoundValue(raw);\n}\n\n\n/** 状態を読む欄が指している名前 (`{v.sum}` なら `v`)。 欄でなければ null */\nfunction 参照する名前(value: number | string | null): string | null {\n if (typeof value !== \"string\") return null;\n const m = value.match(/^\\{(\\w+)/);\n return m ? m[1]! : null;\n}\n\n/**\n * 棒 / 折れ線の組立て。 円グラフと **入力の形が同じ**なので 1 つにまとめる。\n *\n * 3 種とも `- 名前: \"45\"` の 1 行 1 値で書く。 違うのは描画側の種別と、 値の意味だけ。\n *\n * | 型 | 種別 | 値の意味 |\n * |---|---|---|\n * | `pie` | `chart-pie` | 全体に対する取り分 |\n * | `bar` | `chart-bar` | 棒の高さ (単位は問わない) |\n * | `line` | `chart-line` | 線の高さ。 **書いた順に並ぶ** |\n *\n * 値を読めない項目は載せず、 まとめて警告に出す。 **黙って 0 にしない** = その項目だけ欠けた\n * 図が「正しい図」 として出てしまうため。\n *\n * 矢印は描けない。 書かれていたら警告に出して捨てる (「書いたのに効かない」 を残さない)。\n */\nfunction compileValueChart(\n doc: DslDocument,\n 型: \"pie\" | \"bar\" | \"line\",\n kind: \"chart-pie\" | \"chart-bar\" | \"chart-line\",\n onNotice?: (notice: CompileNotice) => void,\n): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const CHART_W = 640;\n // **高さは型で違い、 格子に載せる**。 描画側 (`cdl` の `chart()` preset) は `pie` を 320、\n // 棒と折れ線を 360 とした上で **16 の倍数へ切り上げる** (360 は 16 で割り切れないので 368)。\n // 切り上げないと下端が格子から外れ、 全図で位置の警告が出る (review 指摘)\n const CHART_H = 型 === \"pie\" ? 320 : 368;\n b.lane(\"chart\", { width: CHART_W + 64 });\n\n const data: NonNullable<CdlDiagram[\"nodes\"][number][\"chartData\"]> = [];\n const 読めない: string[] = [];\n const 未宣言: string[] = [];\n let 未宣言行 = 0;\n const 参照できる = 数の欄から参照できる名前(doc);\n // 最初に読めなかった行を覚える。 画面が案内できるようにする\n let 読めない行 = 0;\n for (const a of doc.actors) {\n // 値の置き場所は記法で 2 通りある。 略記 (`- TypeScript: \"45%\"`) は説明文に、\n // 縦書きの map (`- SliceA: { kind: card, value: \"30%\" }`) は値に入る。 両方を読む\n const value = parseChartValue(a.value ?? a.subtitle);\n // **負を受けるのは折れ線だけ**。 増減を追う図なので気温や損益のように 0 を跨ぐ値が来る。\n // 円は取り分、 棒は高さで、 どちらも負に意味が無い (review 指摘)。\n // 状態を読む欄 (`{名前}`) は書いた時点で符号が決まらないため、この検査を通す\n if (value === null || (typeof value === \"number\" && value < 0 && 型 !== \"line\")) {\n // `pos` を持たない経路がある (JSON 経路で組み立てた actor)。 無ければ 0 のまま\n if (読めない.length === 0) 読めない行 = a.pos?.line ?? 0;\n 読めない.push(a.name);\n continue;\n }\n // 数にならない参照は落とす。 通すと図は出るのに数が入っていない状態になる\n const 名前 = 参照する名前(value);\n if (名前 !== null && !参照できる.has(名前)) {\n if (未宣言.length === 0) 未宣言行 = a.pos?.line ?? 0;\n 未宣言.push(a.name);\n continue;\n }\n // 色はそのまま渡す。 箱が 1 つになっても、 書いた色が消えないようにする\n data.push({ label: a.name, value, ...(a.tone !== undefined ? { tone: a.tone } : {}) });\n }\n // 案内の言葉は型ごとに変える。 共通化した時に `pie` の「割合 / 円 / 45%」 が「値 / 図 / 45」 に\n // 薄まり、 既存の案内が後退した (review 指摘)。 何を書けばよいかは型ごとに違う\n const 語 =\n 型 === \"pie\"\n ? { 量: \"割合\", 図: \"円\", 例: '\"45%\"' }\n : 型 === \"bar\"\n ? { 量: \"値\", 図: \"棒\", 例: '\"420\"' }\n : { 量: \"値\", 図: \"折れ線\", 例: '\"180\"' };\n\n /**\n * 利用者に伝える。 **`console.warn` だけにしない**。 エディタは受け取った notice を画面に\n * 出す経路を持っており、 log だけだと項目が消えた理由が誰にも見えない (review 指摘)。\n */\n const 伝える = (種類: CompileNotice[\"kind\"], 名前: string, message: string, line = 0) => {\n onNotice?.({ kind: 種類, actor: 名前, line, message });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${message}`);\n };\n\n if (読めない.length > 0) {\n 伝える(\n \"chart-value-unreadable\",\n 読めない[0]!,\n `type: ${型} で${語.量}を読めない項目があります (${語.図}に載せません): ${読めない.join(\", \")}。` +\n ` \\`- 名前: ${語.例}\\` の形で書いてください`,\n 読めない行,\n );\n }\n if (未宣言.length > 0) {\n 伝える(\n \"chart-value-unreadable\",\n 未宣言[0]!,\n `type: ${型} で数にならない値を参照した項目があります (${語.図}に載せません): ${未宣言.join(\", \")}。` +\n ` \\`states:\\` にその名前を数で書いてください`,\n 未宣言行,\n );\n }\n if (doc.flow.length > 0) {\n 伝える(\n \"chart-edge-dropped\",\n doc.flow[0]?.from ?? \"\",\n `type: ${型} では矢印を描けません (${doc.flow.length} 本を無視しました)。` +\n ` 関係を描くなら type: flow を使ってください`,\n doc.flow[0]?.pos?.line ?? 0,\n );\n }\n\n b.node(`${slugify(doc.title) || 型}-chart`, {\n lane: \"chart\",\n stack: 0,\n kind,\n title: doc.title,\n ...図の小見出し(doc),\n w: CHART_W,\n h: CHART_H,\n chartData: data,\n });\n\n return b.build();\n}\n\n\n/**\n * 図表 4 種の組立て (#1154 段 2 / 段 3)。\n *\n * 描画側に 1 node で渡す形は値で描く 3 型と同じ。 違うのは **actor から何を読むか**。\n *\n * | 型 | 読むもの | 書き方 |\n * |---|---|---|\n * | `funnel` | 数 | `- 訪問: \"12000\"` |\n * | `tree` | 親子 | `flow` の矢印 (`親 -> 子`) |\n * | `journey` | 気持ち | `- 登録: \"不満\"` |\n * | `quadrant` | どの区画か | `- 重複削除: \"左上\"` |\n\n * `tree` だけ `flow` を読む = 親子は 2 つの名前の関係で、 1 行 1 値では書けないため。\n */\n\n/**\n * 図表の大きさ。 **格子 (16) の倍数にする**。\n *\n * 描画側 (`cdl` の `chart()` preset) は高さを 16 の倍数へ切り上げる。 揃えないと下端が格子から\n * 外れ、 正しい記法でも位置の警告が出る (review 指摘、 360 のまま 5 型が該当していた)。\n */\n/**\n * 図表の箱の大きさ (#1260)。\n *\n * **組立て API と同じ値を使う**。 別の値にすると、同じ内容を書いても描いた図の大きさが変わる\n * (実測 = 記法の `funnel` は 640x368、組立て API は 560x480 で、描いた図の viewBox が\n * 785x488 対 712x600 になっていた)。\n *\n * 組立て API 側は中身の件数で変えない (実測 = 2 / 4 / 8 件のどれでも同じ値)。 そのため\n * こちらも定数で持つ。 `gantt` だけは件数で高さを変える = 8 件目から最後の帯が枠の外に\n * 出るため (`compileGantt` の実測)、組立て API の固定 360 より正しい。\n */\nconst 図表の大きさ = {\n funnel: { w: 560, h: 480 },\n tree: { w: 720, h: 480 },\n mind: { w: 720, h: 480 },\n journey: { w: 720, h: 480 },\n quadrant: { w: 640, h: 480 },\n} as const;\n\n/** 気持ちの言葉。 書きやすさのため日本語で受ける。 */\n//\n// **`Map` で持つ**。 plain object だと `__proto__` / `constructor` が親から引けてしまい、\n// 書ける語の一覧に無い入力が値として通る (review 指摘)。 型は付いていても中身は object や\n// function になり、 描画側へそのまま流れる。\nconst 気持ち = new Map<string, \"delighted\" | \"happy\" | \"neutral\" | \"frustrated\" | \"angry\">([\n [\"最高\", \"delighted\"],\n [\"満足\", \"happy\"],\n [\"普通\", \"neutral\"],\n [\"不満\", \"frustrated\"],\n [\"怒り\", \"angry\"],\n]);\n\n/** 区画の言葉。 縦横の位置をそのまま書く。 */\n// 同上の理由で `Map`。\nconst 区画 = new Map<string, \"topLeft\" | \"topRight\" | \"bottomLeft\" | \"bottomRight\">([\n [\"左上\", \"topLeft\"],\n [\"右上\", \"topRight\"],\n [\"左下\", \"bottomLeft\"],\n [\"右下\", \"bottomRight\"],\n]);\n\n/**\n * 図表の欄が `{名前}` で読む値を、**1 か所で** 確かめる (#1200)。\n *\n * 図表には数の欄 (割合 / 段の人数) と語の欄 (気持ち / 区画) があり、どちらも `{名前}` で\n * 状態を読める。 確かめることは欄の種類で違うが、**土台は同じ** = 同じ名前を 2 回書いた時に\n * 後ろが効くこと、段で状態に入る値 (切り替え / 補間) も見ること、の 2 つ。\n *\n * #1198 と #1201 では欄ごとに検査を書き足しており、同じ土台を 3 度書いていた。 3 度とも\n * review で同じ形の穴を指摘されている (最初の宣言で判定する / 段で入る値を見落とす)。\n * 土台を 1 つにして、欄ごとの違いだけを外から渡す。\n *\n * ## 確かめること\n *\n * | 欄 | 通す値 | 段で入る値 |\n * |---|---|---|\n * | 数 | 数として読める (空文字は弾く、`Number(\"\")` が 0 を返すため) | 切り替え先が数 |\n * | 語 | 語表にある語 | 切り替え先が語表にあり、補間されない (補間の行き先は数) |\n *\n * 自動で決まる値 (`values:`) は式の評価結果で必ず数になるため、数の欄からは参照できて\n * 語の欄からは参照できない。 式そのものの不備 (語を読む / 名前が無い) は\n * `value-unresolved` の警告が別に出る (実測で確認済)。\n *\n * ## 責務境界 (#1198 / #1200)\n *\n * **見るのは組み立ての時点で決まっている範囲だけ**。 記法の値は実行時に決まるため、ここで\n * 全部を判定しようとすると式の評価を組み立て側で再現することになる。 実際に #1199 の review で\n * 4 round 続けて同じ形の指摘が出て収束せず、境界を決めて切り分けた (穴を 1 つ塞ぐと別の形が\n * 出る = 塞ぎ方ではなく責務の置き場所の問題だった)。\n *\n * | 見る | 見ない | 見ない理由 |\n * |---|---|---|\n * | 名前が宣言されているか | 段の行き先が負になる形 | 描画側が問題なく描く (負の大きさも `NaN` も出ないことを実測) |\n * | 宣言の時点で読める値か | 式が実行時に返す値 | 式の不備は `value-unresolved` の警告が別に出る (実測で確認) |\n * | 段で状態に入る値 | | |\n *\n * 見ない範囲は描画側が受け持つ = 解けない値は既定値で描いて `data-cdl-unresolved` を付ける。\n */\nfunction 図表の欄から参照できる名前(\n doc: DslDocument,\n 欄: { 読めるか: (v: number | string) => boolean; 補間で壊れるか: boolean; 自動の値を許すか: boolean },\n): Set<string> {\n // 同じ名前を 2 回宣言した時は後ろが効く。 描画側が後の宣言を有効値として扱うため、\n // 前の宣言で判定すると「読めると判定したのに読めない値が入る」 状態になる (実測)\n const 実効 = new Map<string, number | string>();\n for (const s of doc.animate?.states ?? []) 実効.set(s.name, s.initial);\n\n const 壊れる = new Set<string>();\n for (const p of doc.animate?.phases ?? []) {\n for (const st of p.sets ?? []) if (!欄.読めるか(st.value)) 壊れる.add(st.state);\n if (欄.補間で壊れるか) for (const tw of p.tweens ?? []) 壊れる.add(tw.state);\n }\n\n const out = new Set<string>();\n for (const [名前, 値] of 実効) {\n if (!欄.読めるか(値)) continue;\n if (壊れる.has(名前)) continue;\n out.add(名前);\n }\n if (欄.自動の値を許すか) for (const v of doc.values ?? []) out.add(v.name);\n return out;\n}\n\n/** 数の欄が読める値か。 空文字と空白だけは弾く (`Number(\"\")` は 0 を返す) */\nfunction 数として読めるか(v: number | string): boolean {\n if (typeof v === \"number\") return Number.isFinite(v);\n const t = v.trim();\n if (t === \"\") return false;\n return Number.isFinite(Number(t));\n}\n\nfunction 数の欄から参照できる名前(doc: DslDocument): Set<string> {\n return 図表の欄から参照できる名前(doc, {\n 読めるか: 数として読めるか,\n // 補間の行き先は数なので、数の欄では壊れない\n 補間で壊れるか: false,\n 自動の値を許すか: true,\n });\n}\n\nfunction 語の欄から参照できる名前(doc: DslDocument, 語表: Map<string, string>): Set<string> {\n return 図表の欄から参照できる名前(doc, {\n 読めるか: (v) => 語表.has(String(v).trim()),\n // 補間の行き先は数。 語の欄が読む状態を補間すると、その段で語が数に変わる\n 補間で壊れるか: true,\n // 式の評価結果は数になるため、語の欄からは読めない\n 自動の値を許すか: false,\n });\n}\n\n/**\n * 記法の語で書いた状態を、図の語へ直す (#1201)。\n *\n * 語の欄が `{名前}` を持つとき、その名前が指す状態には記法の語 (「不満」 「左上」) が\n * 入っている。 描画側が知っているのは図の語 (`frustrated` / `topLeft`) なので、ここで直す。\n *\n * **記法の語彙に engine の内部語を混ぜないため**にこの形にしている。 状態にも図の語を\n * 書かせる形なら直す処理は要らないが、記法の語と内部語が同じ file に並ぶことになる。\n *\n * 直すのは語の欄から参照されている名前だけ。 同じ名前を数の欄からも参照している図では\n * 直さない (数として読めなくなるため)。\n *\n * **この「数の欄からも参照している」 分岐は、到達する入力を今は作れない**。 記法の図は\n * 1 つの型しか持たず、語の欄を持つ型 (`journey` / `quadrant`) と数の欄を持つ型\n * (`bar` / `line` / `pie` / `funnel`) は同時に現れないため。 変異試験でもこの行を外して\n * 検査が落ちないことを確かめた = 覆えていない。 見本を重ねる経路で両方の欄を持つ箱が\n * できた時のために残す。\n */\nfunction 語の状態を図の語へ直す(diagram: CdlDiagram): void {\n const 対象 = new Map<string, Map<string, string>>();\n const 数の欄から = new Set<string>();\n const 拾う = (v: unknown, 語表: Map<string, string>) => {\n const m = typeof v === \"string\" ? v.match(/^\\{(\\w+)/) : null;\n if (m) 対象.set(m[1]!, 語表);\n };\n for (const n of diagram.nodes) {\n for (const st of n.journeyData ?? []) 拾う(st.emotion, 気持ち);\n for (const it of n.quadrantData?.items ?? []) 拾う(it.quadrant, 区画);\n for (const d of n.chartData ?? []) {\n const m = typeof d.value === \"string\" ? d.value.match(/^\\{(\\w+)/) : null;\n if (m) 数の欄から.add(m[1]!);\n }\n for (const f of n.funnelData ?? []) {\n const m = typeof f.count === \"string\" ? f.count.match(/^\\{(\\w+)/) : null;\n if (m) 数の欄から.add(m[1]!);\n }\n }\n if (対象.size === 0) return;\n\n const 直す = (名前: string, 値: string | number): string | number => {\n const 語表 = 対象.get(名前);\n if (!語表 || 数の欄から.has(名前)) return 値;\n return 語表.get(String(値).trim()) ?? 値;\n };\n for (const s of diagram.states) s.initial = 直す(s.id, s.initial);\n for (const p of diagram.phases) {\n for (const st of p.sets) st.value = 直す(st.stateId, st.value);\n }\n}\n\nfunction compileFunnel(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { w: W, h: H } = 図表の大きさ.funnel;\n b.lane(\"chart\", { width: W + 64 });\n const data: NonNullable<CdlDiagram[\"nodes\"][number][\"funnelData\"]> = [];\n const 読めない: string[] = [];\n const 未宣言: string[] = [];\n const 参照できる = 数の欄から参照できる名前(doc);\n for (const a of doc.actors) {\n const v = parseChartValue(a.value ?? a.subtitle);\n // 段の数なので負に意味が無い (状態を読む欄は符号が決まらないので通す)\n if (v === null || (typeof v === \"number\" && v < 0)) {\n 読めない.push(a.name);\n continue;\n }\n // 数にならない参照は落とす (棒 / 折れ線 / 円と同じ扱い)\n const 名前 = 参照する名前(v);\n if (名前 !== null && !参照できる.has(名前)) {\n 未宣言.push(a.name);\n continue;\n }\n data.push({ id: slugify(a.name), title: a.name, count: v });\n }\n if (未宣言.length > 0) {\n const m3 = `type: funnel で数にならない値を参照した項目があります (段に載せません): ${未宣言.join(\", \")}。 \\`states:\\` にその名前を数で書いてください`;\n onNotice?.({ kind: \"chart-value-unreadable\", actor: 未宣言[0]!, line: 0, message: m3 });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m3}`);\n }\n if (読めない.length > 0) {\n const m = `type: funnel で数を読めない項目があります (段に載せません): ${読めない.join(\", \")}。 \\`- 訪問: \"12000\"\\` の形で書いてください`;\n onNotice?.({ kind: \"chart-value-unreadable\", actor: 読めない[0]!, line: 0, message: m });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m}`);\n }\n // 矢印は描けない。 書かれていたら伝える (黙って捨てると「書いたのに効かない」 が残る)\n if (doc.flow.length > 0) {\n const m2 = `type: funnel では矢印を描けません (${doc.flow.length} 本を無視しました)。 関係を描くなら type: flow を使ってください`;\n onNotice?.({ kind: \"chart-edge-dropped\", actor: doc.flow[0]?.from ?? \"\", line: doc.flow[0]?.pos?.line ?? 0, message: m2 });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m2}`);\n }\n b.node(`${slugify(doc.title) || \"funnel\"}-chart`, {\n lane: \"chart\", stack: 0, kind: \"funnel-stages\", title: doc.title, ...図の小見出し(doc), w: W, h: H, funnelData: data,\n });\n return b.build();\n}\n\n/**\n * 矢印から親子を決める (#1251)。\n *\n * 矢印の先が子で、 どこからも指されない名前が根になる。 `type: tree` と `type: mind` が\n * 同じ規則を使う = 同じ本文を書いた時に、 図種を変えただけで親子の解釈が変わらないようにする。\n *\n * **黙って上書きしない**。 同じ子に 2 本来たら後勝ちで消えるし、 書いていない名前を指した\n * 矢印は無い親を作る。 どちらも図が静かに変わるので伝える。\n *\n * 親を辿って自分に戻る形は木にならないため、 その枝を切って伝える。\n */\nfunction 矢印から親を決める(\n doc: DslDocument,\n 図種: \"tree\" | \"mind\",\n 名前: ReadonlySet<string>,\n 伝える: (名: string, message: string, line?: number) => void,\n): Map<string, string> {\n const 親 = new Map<string, string>();\n for (const f of doc.flow) {\n const 子 = slugify(f.to);\n const 親名 = slugify(f.from);\n if (!名前.has(親名)) {\n 伝える(f.from, `type: ${図種} で書いていない名前を親にしています: ${f.from} -> ${f.to}`, f.pos?.line ?? 0);\n continue;\n }\n // 子の側も見る。 書いていない名前への矢印は、 黙って捨てると図から関係が消える\n if (!名前.has(子)) {\n 伝える(f.to, `type: ${図種} で書いていない名前を子にしています: ${f.from} -> ${f.to}`, f.pos?.line ?? 0);\n continue;\n }\n if (子 === 親名) {\n 伝える(f.to, `type: ${図種} で自分を親にしています: ${f.to}`, f.pos?.line ?? 0);\n continue;\n }\n const 既存 = 親.get(子);\n if (既存 !== undefined && 既存 !== 親名) {\n 伝える(f.to, `type: ${図種} で ${f.to} に親が 2 つあります (後の ${f.from} は使いません)`, f.pos?.line ?? 0);\n continue;\n }\n 親.set(子, 親名);\n }\n // 親を辿って自分に戻る形は木にならない。 その枝を切って伝える\n for (const 子 of [...親.keys()]) {\n const 見た = new Set<string>([子]);\n let p2 = 親.get(子);\n while (p2 !== undefined) {\n if (見た.has(p2)) {\n 伝える(子, `type: ${図種} で親を辿ると輪になります (${子} の親を外しました)`);\n 親.delete(子);\n break;\n }\n 見た.add(p2);\n p2 = 親.get(p2);\n }\n }\n return 親;\n}\n\nfunction compileTree(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { w: W, h: H } = 図表の大きさ.tree;\n b.lane(\"chart\", { width: W + 64 });\n // **同じ slug になる名前を先に見る**。 違う名前が同じ id に潰れると、 自分を親にしたと\n // 誤判定したり、 同じ id の要素が 2 つできたりする (review 指摘)\n const slug別 = new Map<string, string[]>();\n for (const a of doc.actors) {\n const k = slugify(a.name);\n slug別.set(k, [...(slug別.get(k) ?? []), a.name]);\n }\n const 名前 = new Set(slug別.keys());\n // **行番号を渡す**。 `DslActor` / `DslStep` は `pos.line` を持つので遡れる。 前回「持てない」\n // と書いたのは誤り (review 指摘)。 0 にすると画面が問題の行を案内できない\n const 伝える = (名: string, message: string, line = 0) => {\n onNotice?.({ kind: \"chart-value-unreadable\", actor: 名, line, message });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${message}`);\n };\n for (const [k, 群] of slug別) {\n if (群.length > 1) {\n 伝える(群[0]!, `type: tree で ${群.join(\" / \")} が同じ id (${k}) になります。 名前を変えてください`);\n }\n }\n const 親 = 矢印から親を決める(doc, \"tree\", 名前, 伝える);\n const data: NonNullable<CdlDiagram[\"nodes\"][number][\"treeData\"]> = doc.actors.map((a) => {\n const id = slugify(a.name);\n const p3 = 親.get(id);\n return { id, title: a.name, ...(p3 !== undefined ? { parent: p3 } : {}) };\n });\n b.node(`${slugify(doc.title) || \"tree\"}-chart`, {\n lane: \"chart\", stack: 0, kind: \"tree-hierarchy\", title: doc.title, ...図の小見出し(doc), w: W, h: H, treeData: data,\n });\n return b.build();\n}\n\n/**\n * 体験の道筋の段に添える欄 (#1251)。\n *\n * 書かなければ項目ごと落とす = `undefined` を明示して渡すと、 組立て側が「空を書いた」 と\n * 区別できなくなる (`図の小見出し` と同じ理由)。\n */\nfunction 道筋の欄(a: DslActor): { touchpoint?: string; opportunity?: string } {\n return {\n ...(a.touchpoint !== undefined ? { touchpoint: a.touchpoint } : {}),\n ...(a.opportunity !== undefined ? { opportunity: a.opportunity } : {}),\n };\n}\n\n/**\n * 体験の道筋の欄を、 それを描けない図種で書いた時に伝える (#1251)。\n *\n * `touchpoint` と `opportunity` は `type: journey` の段だけが持つ。 他の図種では相手が無く、\n * 黙って捨てると「書いたのに出ない」 が手掛かりなしで起きる。\n *\n * `type: mind` では伝えない = `compileMind` が描けない欄をまとめて 1 件で伝えており、\n * そこに 2 つとも入っている (`放射で描けない欄`)。 二重に伝えない (#1246 と同じ扱い)。\n */\nfunction reportChartFieldsNotHonored(doc: DslDocument, onNotice?: (n: CompileNotice) => void): void {\n if (!onNotice) return;\n if (doc.type === \"mind\") return;\n for (const a of doc.actors) {\n if (a.partId !== undefined) continue;\n const 道筋 = doc.type === \"journey\" ? [] : [\n ...(a.touchpoint !== undefined ? [\"touchpoint\"] : []),\n ...(a.opportunity !== undefined ? [\"opportunity\"] : []),\n ];\n const 工程 = doc.type === \"gantt\" ? [] : [\n ...(a.owner !== undefined ? [\"owner\"] : []),\n ...(a.end !== undefined ? [\"end\"] : []),\n ];\n if (道筋.length > 0) {\n onNotice({\n kind: \"chart-value-unreadable\",\n actor: a.name,\n line: a.pos?.line ?? 0,\n message: `\"${truncateForMessage(a.name)}\" に書いた ${道筋.join(\" / \")} は効きません (type: ${doc.type} には体験の道筋の欄がありません)`,\n hint: \"体験の道筋を描くなら type: journey を使ってください\",\n });\n }\n if (工程.length > 0) {\n onNotice({\n kind: \"chart-value-unreadable\",\n actor: a.name,\n line: a.pos?.line ?? 0,\n message: `\"${truncateForMessage(a.name)}\" に書いた ${工程.join(\" / \")} は効きません (type: ${doc.type} には工程の並びの欄がありません)`,\n hint: \"工程の並びを描くなら type: gantt を使ってください\",\n });\n }\n }\n}\n\nfunction compileJourney(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { w: W, h: H } = 図表の大きさ.journey;\n b.lane(\"chart\", { width: W + 64 });\n const data: NonNullable<CdlDiagram[\"nodes\"][number][\"journeyData\"]> = [];\n const 読めない: string[] = [];\n const 参照できる = 語の欄から参照できる名前(doc, 気持ち);\n for (const a of doc.actors) {\n const 語 = (a.value ?? a.subtitle ?? \"\").trim();\n // 状態を読む欄はそのまま渡す。 指す先の語は `語の状態を図の語へ直す` が図の語に直す\n const 参照 = 語.match(/^\\{(\\w+)\\}$/);\n if (参照) {\n if (!参照できる.has(参照[1]!)) {\n 読めない.push(a.name);\n continue;\n }\n data.push({ id: slugify(a.name), title: a.name, emotion: 語 as never, ...道筋の欄(a) });\n continue;\n }\n const e = 気持ち.get(語);\n if (e === undefined) {\n 読めない.push(a.name);\n continue;\n }\n data.push({ id: slugify(a.name), title: a.name, emotion: e, ...道筋の欄(a) });\n }\n if (読めない.length > 0) {\n const m = `type: journey で気持ちを読めない項目があります (道筋に載せません): ${読めない.join(\", \")}。 \\`- 登録: \"不満\"\\` の形で、 ${[...気持ち.keys()].join(\" / \")} のどれかを書いてください`;\n onNotice?.({ kind: \"chart-value-unreadable\", actor: 読めない[0]!, line: 0, message: m });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m}`);\n }\n // 矢印は描けない。 書かれていたら伝える (黙って捨てると「書いたのに効かない」 が残る)\n if (doc.flow.length > 0) {\n const m2 = `type: journey では矢印を描けません (${doc.flow.length} 本を無視しました)。 関係を描くなら type: flow を使ってください`;\n onNotice?.({ kind: \"chart-edge-dropped\", actor: doc.flow[0]?.from ?? \"\", line: doc.flow[0]?.pos?.line ?? 0, message: m2 });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m2}`);\n }\n b.node(`${slugify(doc.title) || \"journey\"}-chart`, {\n lane: \"chart\", stack: 0, kind: \"journey-map\", title: doc.title, ...図の小見出し(doc), w: W, h: H, journeyData: data,\n });\n return b.build();\n}\n\n/** 軸を書かなかった時の名前。 何の軸か分からないため、位置をそのまま出す */\nconst 軸の既定 = {\n xAxis: { left: \"小さい\", right: \"大きい\" },\n yAxis: { bottom: \"小さい\", top: \"大きい\" },\n quadrantLabels: { topLeft: \"左上\", topRight: \"右上\", bottomLeft: \"左下\", bottomRight: \"右下\" },\n} as const;\n\n/**\n * 2 軸で仕分ける図の軸と区画の名前を決める (#1251)。\n *\n * `axes:` を書かなければ従来どおり位置の名前 (`左上` 等) を出す = 既に描いてある図が動かない。\n *\n * 書いたら区画の名前は **軸の名前から決める** (`{上} × {右}`)。 組立て API 側が同じ規則で\n * 導いており (実測 = `xAxis: {left: \"L\", right: \"R\"}` / `yAxis: {bottom: \"B\", top: \"T\"}` で\n * `topLeft: \"T × L\"`)、 別の規則にすると同じ内容を書いても図が食い違う。\n *\n * 片側だけ書いた形では、書かなかった側は既定のままにする。 空文字を渡すと名前の無い軸が描かれる。\n */\nfunction 軸と区画の名前(doc: DslDocument): {\n xAxis: { left: string; right: string };\n yAxis: { bottom: string; top: string };\n quadrantLabels: { topLeft: string; topRight: string; bottomLeft: string; bottomRight: string };\n} {\n if (doc.axes === undefined) return 軸の既定;\n const left = doc.axes.x?.left ?? 軸の既定.xAxis.left;\n const right = doc.axes.x?.right ?? 軸の既定.xAxis.right;\n const bottom = doc.axes.y?.bottom ?? 軸の既定.yAxis.bottom;\n const top = doc.axes.y?.top ?? 軸の既定.yAxis.top;\n return {\n xAxis: { left, right },\n yAxis: { bottom, top },\n quadrantLabels: {\n topLeft: `${top} × ${left}`,\n topRight: `${top} × ${right}`,\n bottomLeft: `${bottom} × ${left}`,\n bottomRight: `${bottom} × ${right}`,\n },\n };\n}\n\n/**\n * 軸の名前を、それを持たない図種で書いた時に伝える (#1251)。\n *\n * 軸を持つのは `type: quadrant` だけ。 他の図種では相手が無く、黙って捨てると\n * 「書いたのに出ない」 が手掛かりなしで起きる。\n */\nfunction reportAxesNotHonored(doc: DslDocument, onNotice?: (n: CompileNotice) => void): void {\n if (!onNotice) return;\n if (doc.axes === undefined) return;\n if (doc.type === \"quadrant\") return;\n onNotice({\n kind: \"chart-value-unreadable\",\n actor: doc.title,\n line: doc.axesPos?.line ?? doc.pos?.line ?? 0,\n message: `最上位に書いた axes は効きません (type: ${doc.type} には軸がありません)`,\n hint: \"2 つの軸で仕分ける図を描くなら type: quadrant を使ってください\",\n });\n}\n\nfunction compileQuadrant(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { w: W, h: H } = 図表の大きさ.quadrant;\n b.lane(\"chart\", { width: W + 64 });\n const items: NonNullable<CdlDiagram[\"nodes\"][number][\"quadrantData\"]>[\"items\"] = [];\n const 読めない: string[] = [];\n const 参照できる = 語の欄から参照できる名前(doc, 区画);\n for (const a of doc.actors) {\n const 語 = (a.value ?? a.subtitle ?? \"\").trim();\n const 参照 = 語.match(/^\\{(\\w+)\\}$/);\n if (参照) {\n if (!参照できる.has(参照[1]!)) {\n 読めない.push(a.name);\n continue;\n }\n items.push({ id: slugify(a.name), title: a.name, quadrant: 語 as never });\n continue;\n }\n const q = 区画.get(語);\n if (q === undefined) {\n 読めない.push(a.name);\n continue;\n }\n items.push({ id: slugify(a.name), title: a.name, quadrant: q });\n }\n if (読めない.length > 0) {\n const m = `type: quadrant で区画を読めない項目があります (図に載せません): ${読めない.join(\", \")}。 \\`- 重複削除: \"左上\"\\` の形で、 ${[...区画.keys()].join(\" / \")} のどれかを書いてください`;\n onNotice?.({ kind: \"chart-value-unreadable\", actor: 読めない[0]!, line: 0, message: m });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m}`);\n }\n // 矢印は描けない。 書かれていたら伝える (黙って捨てると「書いたのに効かない」 が残る)\n if (doc.flow.length > 0) {\n const m2 = `type: quadrant では矢印を描けません (${doc.flow.length} 本を無視しました)。 関係を描くなら type: flow を使ってください`;\n onNotice?.({ kind: \"chart-edge-dropped\", actor: doc.flow[0]?.from ?? \"\", line: doc.flow[0]?.pos?.line ?? 0, message: m2 });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${m2}`);\n }\n b.node(`${slugify(doc.title) || \"quadrant\"}-chart`, {\n lane: \"chart\", stack: 0, kind: \"quadrant-matrix\", title: doc.title, ...図の小見出し(doc), w: W, h: H,\n quadrantData: { ...軸と区画の名前(doc), items },\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 */\n/**\n * 記法の `type: mind` を engine の `mind-map` 種別に寄せる (#1177)。\n *\n * 以前は `card` を 3 列 (`mind-left` / `mind-center` / `mind-right`) に並べる別実装で、\n * engine の `mind-map` を使っていなかった。 そのため 2 つの穴があった。\n *\n * | 穴 | 中身 |\n * |---|---|\n * | 枝の親を見る規則が届かない | `ruleMindMapParentReference` は `kind === \"mind-map\"` かつ `mindData` を持つ node にしか当たらない |\n * | `SINGLE_BOX_KINDS` の `mind-map` が到達しない | 一覧に載っているのに記法から辿り着けない項目として残る |\n *\n * **枝の親は書けない**。 記法の `actors` は「1 つ目が根、 残りが枝」 の並びで、 `parent` を\n * 書く場所が無い。 全ての枝を根の直下に置く。 親子を矢印で書く形は `type: tree` が持っており、\n * `mind` は簡便形として別に残す (Issue の 実装しない条件)。\n *\n * したがって **矢印は描けない**。 書かれていたら伝える = 黙って捨てると「書いたのに効かない」\n * が残る (`type: journey` / `type: quadrant` と同じ扱い)。\n *\n * 絵は変わる (3 列の箱 → 中心から放射)。 破壊的変更として `CHANGELOG` に記録している。\n */\n/**\n * 1 箱で描く放射が **描ける欄**。 これ以外は書いても出ない (#1177 Round 3)。\n *\n * 数え上げは 3 度直した。 副題 / 値 / 行 → 位置 / 大きさ → 種類 / 枠 / 積む順 …と、 見落とした\n * 欄が review のたびに出た。 数え漏らしても検査は通ってしまう = 「書いたのに出ない」 が黙って\n * 残る形が繰り返し発生した。\n *\n * そこで **`DslActor` の全ての欄を、 描ける側か描けない側のどちらかに必ず割り当てる**。\n * 欄が増えた時に両方へ入れ忘れると型検査が落ちるので、 「描けるのか描けないのか」 を必ず\n * 判断することになる (`rules/quality.md § 多層 SSOT 経路の全 registration 保証` と同じ形)。\n */\ntype 放射で描ける欄 =\n /** 中心の名前 / 枝の名前になる */\n | \"name\"\n /**\n * 名前の後ろに続けて出す 2 欄。\n *\n * `- 描く量を減らす: \"{draw} ms\"` の形は副題として解析されるため、 値の欄だけを見ると\n * 記法で最も普通な書き方が届かない (#1230 で実測)。 明示的に書いた値の欄も同じ場所へ出す。\n *\n * 描画側が描くのは枝と中心の `title` だけで (`mind-map.tsx` は型にある `subtitle` を\n * 1 度も描かない)、 状態を読み替えるのも `title` と `rootTitle` に限る\n * (`resolveMindData`)。 届ける先が他に無いため名前と同じ欄へ載せる。\n */\n | \"subtitle\"\n | \"value\"\n /** 枝の色 (`MindBranchNode.tone`)。 中心は持てないので `描けない欄` が別に見る */\n | \"tone\"\n /** 見本は放射に載せず、 見本の中身だけを描く (別経路で伝える) */\n | \"partId\"\n /** 種類を書いたかどうかの印。 `kind` と対で見るので単独では扱わない */\n | \"kindWritten\"\n /** 本文の行番号。 知らせに載せるために使う */\n | \"pos\";\n\n/** 放射では描けない欄。 書かれていたら伝える */\ntype 放射で描けない欄 =\n | \"kind\"\n | \"eyebrow\"\n | \"touchpoint\"\n | \"opportunity\"\n | \"owner\"\n | \"end\"\n | \"rows\"\n | \"lane\"\n | \"stack\"\n | \"initial\"\n | \"final\"\n | \"colorHex\"\n | \"stateOverride\"\n | \"posX\"\n | \"posY\"\n | \"posW\"\n | \"posH\"\n | \"scale\"\n | \"scaleKeys\"\n | \"posRel\"\n | \"nodes\"\n | \"layoutPos\";\n\n/** 引数が `never` でなければ型検査が落ちる */\ntype 空であること<T extends never> = T;\n\n/** `DslActor` に割り当て漏れの欄があると落ちる */\nexport type _放射の欄を覆えている = 空であること<\n Exclude<keyof DslActor, 放射で描ける欄 | 放射で描けない欄>\n>;\n\n/** `DslActor` に無い欄を割り当てていると落ちる */\nexport type _放射の欄に余りがない = 空であること<\n Exclude<放射で描ける欄 | 放射で描けない欄, keyof DslActor>\n>;\n\n/** 描ける側と描けない側が重なっていると落ちる */\nexport type _放射の欄が重なっていない = 空であること<Extract<放射で描ける欄, 放射で描けない欄>>;\n\n/**\n * 描けない欄と、 知らせに出す名前。\n *\n * **欄ごとに式を持たせない** (Round 5 の指摘)。 `{ 説明, 書いたか }` の形にすると、 項目名と式が\n * 型で結ばれず `scale: { 書いたか: () => false }` のように **判定を骨抜きにしても型検査が通る**。\n * 名前だけを持ち、 書かれていたかは下の 1 つの式で見る。\n *\n * `Record<放射で描けない欄, string>` なので、 欄を足すと項目も要る。 判定の側は欄ごとに書く所が\n * 無いため、 書き忘れも骨抜きも起きない。\n *\n * 表示の名前は複数の欄で同じでよい (`posX` と `posY` はどちらも「位置 (座標)」)。 出す時に\n * 重複を除く。\n */\nconst 放射で描けない欄の名前: Record<放射で描けない欄, string> = {\n kind: \"種類\",\n eyebrow: \"上の小見出し\",\n touchpoint: \"場所 (体験の道筋の欄)\",\n opportunity: \"改善の余地 (体験の道筋の欄)\",\n owner: \"担当 (工程の並びの欄)\",\n end: \"終わる時期 (工程の並びの欄)\",\n rows: \"行\",\n lane: \"枠の指定\",\n stack: \"積む順\",\n initial: \"始まり / 終わり の印\",\n final: \"始まり / 終わり の印\",\n colorHex: \"色番号\",\n stateOverride: \"状態の上書き\",\n // 位置は「登場人物ごとの箱をどこに置くか」 の指定で、 箱が 1 つの図では置く先が無い\n posX: \"位置 (座標)\",\n posY: \"位置 (座標)\",\n posW: \"大きさ\",\n posH: \"大きさ\",\n scale: \"倍率\",\n scaleKeys: \"倍率\",\n posRel: \"位置 (相対)\",\n nodes: \"中の箱ごとの指定\",\n layoutPos: \"配置のずらし\",\n};\n\n/**\n * その欄が書かれていたか。 **全ての欄をこの 1 つの式で見る**。\n *\n * 欄ごとに式を持たせると、 1 つだけ骨抜きにしても型検査が通る (Round 5 の指摘)。 1 つにすれば\n * 骨抜きにした時点で全ての欄の検査が落ちる。\n *\n * 例外は種類だけ。 既定値 (`actor`) が必ず入るので、 書いたかどうかの印 (`kindWritten`) で見る。\n * 真偽を持つ欄 (`initial` / `final`) は `false` を「書いていない」 として扱う = 既定と同じ意味で、\n * 伝えると書いていない人にも出る。\n */\nfunction 放射で描けない欄を書いたか(a: DslActor, 欄: 放射で描けない欄): boolean {\n if (欄 === \"kind\") return a.kindWritten === true;\n const v = a[欄];\n if (typeof v === \"boolean\") return v;\n return v !== undefined;\n}\n\n/**\n * 放射の枝と中心に出す文字を組む (#1230)。\n *\n * 値の欄を書いた登場人物は名前の後ろに空白 1 つで続ける。 書いていない図は名前だけになり、\n * 変更前と同じ文字列になる。\n *\n * **名前と同じ欄に載せるしかない**。 描画側が描くのは枝と中心の `title` だけで\n * (`mind-map.tsx` は型にある `subtitle` を 1 度も描かない)、 状態を読み替えるのも\n * `title` と `rootTitle` に限る (`resolveMindData`)。 値を別の欄へ渡しても絵に出ない。\n */\nfunction 放射に出す文字(a: DslActor): string {\n const 続き = [a.subtitle, a.value].map((x) => x?.trim()).filter((x): x is string => !!x);\n return 続き.length > 0 ? `${a.name} ${続き.join(\" \")}` : a.name;\n}\n\nfunction compileMind(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {\n const b = diagram(slugify(doc.title), { topic: doc.title });\n const { w: W, h: H } = 図表の大きさ.mind;\n\n const 伝える = (kind: CompileNotice[\"kind\"], 名: string, message: string, line = 0): void => {\n onNotice?.({ kind, actor: 名, line, message });\n if (typeof console !== \"undefined\" && console.warn) console.warn(`[dragon] ${message}`);\n };\n\n // **見本 (`parts`) を重ねた登場人物は中心にも枝にもしない** (review 指摘)。 後段の\n // `mergePartsFromActors` が見本の中身を別の箱として足すため、 こちらにも載せると同じ\n // 登場人物が 2 箇所に描かれる。 中心だけ外し忘れると、 中心が見本の記法で二重になる\n const 見本でない: DslActor[] = [];\n for (const a of doc.actors) {\n if (a.partId !== undefined) {\n 伝える(\n \"part-not-drawn\",\n a.name,\n `type: mind では見本 (${a.partId}) を中心にも枝にもできません。 見本はそのまま描き、 放射には載せません`,\n a.pos?.line ?? 0,\n );\n continue;\n }\n 見本でない.push(a);\n }\n // 枝の親は矢印で決まる (#1251)。 書かなければ全て中心の直下 = 従来と同じ図になる。\n // 規則は `type: tree` と共有する = 同じ本文で図種だけ変えた時に親子の解釈が割れない。\n //\n // **早期 return より前に置く** = 見本しか居ない記法で矢印を書いた時、 枝が 1 本も無いため\n // どの矢印も親にできない。 後ろに置くと、その形で矢印が黙って消える (Round 3 の指摘と同じ理由)\n const 枝の名前 = new Set(見本でない.map((a) => slugify(a.name)));\n const 親 = 矢印から親を決める(doc, \"mind\", 枝の名前, (名, message, line) =>\n // 親にできなかった矢印は描かれない。 知らせの種別も「矢印を落とした」 にする\n 伝える(\"chart-edge-dropped\", 名, message, line ?? 0),\n );\n\n // 放射に載る登場人物が 0 人なら枠も作らない。 中身の無い枠が 1 つ残るのを避ける (#1096)。\n // **枠を作る前に見る** = 見本しか居ない記法で作ると、 見本だけが描かれた図に空の枠が残る\n if (見本でない.length === 0) return b.build();\n\n b.lane(\"chart\", { width: W + 64 });\n\n // **同じ slug になる名前を先に見る** (`type: tree` と同じ理由)。 違う名前が同じ id に潰れると、\n // 枝が 1 本消えたり、 枝の親を見る規則が別の枝を指したりする\n const slug別 = new Map<string, string[]>();\n for (const a of 見本でない) {\n const k = slugify(a.name);\n slug別.set(k, [...(slug別.get(k) ?? []), a.name]);\n }\n for (const [k, 群] of slug別) {\n if (群.length > 1) {\n 伝える(\n \"chart-value-unreadable\",\n 群[0]!,\n `type: mind で ${群.join(\" / \")} が同じ id (${k}) になります。 名前を変えてください`,\n );\n }\n }\n\n const root = 見本でない[0]!;\n const rootId = slugify(root.name) || \"root\";\n\n // **中心を子にする矢印は表せない** (#1251 Round 1 の指摘)。 中心は枝の並びに居ないため\n // 親を持てず、 解決はできても誰にも読まれずに消える。 黙って捨てると「書いたのに\n // 図が変わらない」 が手掛かりなしで起きるので、 行番号付きで伝える\n for (const f of doc.flow) {\n if (slugify(f.to) !== rootId) continue;\n 伝える(\n \"chart-edge-dropped\",\n f.to,\n `type: mind で中心 (${truncateForMessage(f.to)}) を子にはできません (${truncateForMessage(f.from)} -> ${truncateForMessage(f.to)} を使いません)。 中心は放射の真ん中に置く 1 つだけです`,\n f.pos?.line ?? 0,\n );\n }\n\n // **1 箱で描く種別が持てる欄は限られる**。 枝は名前と色、 中心は名前だけ。 書いても描けない\n // 欄は伝える = 箱ごとに描いていた頃は載っていた欄で、 黙って消すと「書いたのに出ない」 が残る\n const 描けない欄 = (a: DslActor): string[] => {\n const out: string[] = [];\n for (const 欄 of Object.keys(放射で描けない欄の名前) as 放射で描けない欄[]) {\n if (!放射で描けない欄を書いたか(a, 欄)) continue;\n const 名前 = 放射で描けない欄の名前[欄];\n // 同じ名前を持つ欄 (`posX` と `posY`) は 1 度だけ出す\n if (!out.includes(名前)) out.push(名前);\n }\n return out;\n };\n const 消えた欄 = new Map<string, string[]>();\n const 記録する = (a: DslActor): void => {\n const 欄 = 描けない欄(a);\n if (欄.length > 0) 消えた欄.set(a.name, 欄);\n };\n\n const branches: NonNullable<CdlDiagram[\"nodes\"][number][\"mindData\"]>[\"branches\"] = [];\n const 使った = new Set<string>([rootId]);\n 記録する(root);\n // 中心は色の欄を持たない (`MindBranchPayload` に `tone` が無い)\n if (root.tone) 消えた欄.set(root.name, [...(消えた欄.get(root.name) ?? []), \"色 (中心は持てない)\"]);\n\n 見本でない.slice(1).forEach((a, i) => {\n const id = slugify(a.name) || `leaf-${i}`;\n if (使った.has(id)) {\n 伝える(\n \"chart-value-unreadable\",\n a.name,\n `type: mind で ${a.name} が既にある id (${id}) と重なります (枝に載せません)`,\n a.pos?.line ?? 0,\n );\n return;\n }\n 使った.add(id);\n 記録する(a);\n // 矢印を書かなかった枝は中心の直下。 中心を親に指した矢印も同じ値になる\n // (中心は `見本でない` の先頭なので、 その名前の slug が `rootId` そのもの)\n // 枝は色を持てる (`MindBranchNode.tone`)\n branches.push({\n id,\n title: 放射に出す文字(a),\n parent: 親.get(id) ?? rootId,\n ...(a.tone ? { tone: a.tone } : {}),\n });\n });\n\n if (消えた欄.size > 0) {\n const 一覧 = [...消えた欄].map(([名, 欄]) => `${名} の${欄.join(\" / \")}`).join(\"、 \");\n 伝える(\n \"chart-value-unreadable\",\n [...消えた欄.keys()][0]!,\n `type: mind は名前と副題 / 値、 枝の色しか描けません (描かない欄: ${一覧})。 これらを描くなら type: tree か type: flow を使ってください`,\n );\n }\n\n b.node(`${slugify(doc.title) || \"mind\"}-chart`, {\n lane: \"chart\",\n stack: 0,\n kind: \"mind-map\",\n title: doc.title,\n ...図の小見出し(doc),\n w: W,\n h: H,\n mindData: { rootId, rootTitle: 放射に出す文字(root), branches },\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 */\n/**\n * `lanes:` で作った縦列と、見本 (parts) が作った同一idの縦列を 1 つに重ねる (#1241)。\n *\n * `lanes:` の中身を読むのは見本を重ねるより前で、その時点では見本の縦列がまだ無い。\n * そのため同じ id を書くと **縦列が 2 つできて、書いた幅は箱の入っていない方に付く**\n * (実測 = `g__l` が 777 と 400 の 2 本になり、箱は 400 の方に入った)。\n *\n * 後から来た見本の縦列に書いた値を移し、先に作った空の方を外す。 書いた人から見れば\n * 「id を書けば効く」 が成り立つ。\n */\nfunction mergeDuplicateDeclaredLanes(\n diagram: CdlDiagram,\n 追加した縦列: readonly DslLane[],\n): void {\n for (const 宣言 of 追加した縦列) {\n const { id } = 宣言;\n const 同一idの縦列 = diagram.lanes.filter((l) => l.id === id);\n if (同一idの縦列.length < 2) continue;\n // 宣言 lane は parts より先に追加されるため、後から作った parts lane を残す。\n const 残す = 同一idの縦列.at(-1);\n if (残す === undefined) continue;\n const 元の中心X = (残す.x ?? 0) + 残す.width / 2;\n // 新規 lane に入れた既定値ではなく、DSL に明示された値だけを parts lane へ重ねる。\n if (宣言.x !== undefined) 残す.x = 宣言.x;\n if (宣言.width !== undefined) 残す.width = 宣言.width;\n if (宣言.label !== undefined) 残す.label = 宣言.label;\n if (宣言.contain !== undefined) 残す.contain = 宣言.contain;\n if (宣言.lifeline !== undefined) 残す.lifeline = 宣言.lifeline;\n const 移動X = (残す.x ?? 0) + 残す.width / 2 - 元の中心X;\n // parts node は絶対座標を持つため、lane だけ動かすと箱が元の場所に残る。\n for (const node of diagram.nodes) {\n if (node.lane === id && node.posX !== undefined) node.posX += 移動X;\n }\n for (let i = diagram.lanes.length - 1; i >= 0; i -= 1) {\n if (diagram.lanes[i]?.id === id && diagram.lanes[i] !== 残す) diagram.lanes.splice(i, 1);\n }\n }\n}\n\n/**\n * `lanes:` で作った縦列に箱が 1 つも入らなかったら伝える (#1241)。\n *\n * 意図して空の縦列を置くことはあるが、その場合も「置いた」 と分かる形で知らせる方が、\n * 書き間違いを黙って捨てるより良い。\n */\nfunction reportEmptyDeclaredLanes(\n diagram: CdlDiagram,\n 追加した縦列: readonly DslLane[],\n onNotice?: (n: CompileNotice) => void,\n): void {\n if (追加した縦列.length === 0) return;\n mergeDuplicateDeclaredLanes(diagram, 追加した縦列);\n if (!onNotice) return;\n const 使われている = new Set(diagram.nodes.map((n) => n.lane));\n const ある縦列 = diagram.lanes.map((l) => l.id).filter((x) => 使われている.has(x));\n for (const { id, pos } of 追加した縦列) {\n if (使われている.has(id)) continue;\n onNotice({\n kind: \"lane-declared-empty\",\n actor: id,\n line: pos?.line ?? 0,\n message: `lanes に書いた ${truncateForMessage(id)} はどの箱も入らない縦列です (新しく作りました)`,\n hint:\n ある縦列.length > 0\n ? `この図が持つ縦列 = ${ある縦列.join(\" / \")}`\n : \"この図は箱の入った縦列を持ちません\",\n });\n }\n}\n\nfunction applyV05Extensions(\n diagram: CdlDiagram,\n doc: DslDocument,\n /** `lanes:` が新しく作った縦列。 箱が入ったかは見本を重ねた後でないと分からない (#1241) */\n 追加した縦列out?: DslLane[],\n): 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 // 箱の大きさを反映する (#1259)。 **animation の有無に関係なく** = 動く図専用の\n // 組み立てだけで渡すと、同じ記法でも静止図では指定が消える。\n //\n // 順序図は名札 / 余白 / 足を組で作り、大きさが縦線の並びと結びつくため対象外。\n //\n // **幅が図に出るかは縦列との大小で決まる**。 縦列に収まれば箱だけが変わり、\n // 縦列より広ければ縦列ごと押し広げる (実測 = ステート図の 320 は縦列 370 に収まって\n // 図が変わらないが、拡張ステート図の 280 に対し既定 640 は縦列 330 を押し広げた)。\n // #1260 で 1 件だけ見て「見た目に出ない」 と判断し配線を外した = 同じ誤りを繰り返さない\n if (!isSeqLike) {\n if (a.posW !== undefined) node.w = a.posW;\n if (a.posH !== undefined) node.h = a.posH;\n }\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 //\n // **書いた id がどの縦列とも合わない形を後で伝える** (#1241)。 合わない id は新しい縦列を\n // 作るだけで、書いた幅や見出しは元の縦列に届かない。 書き間違い (`lane-idl` / 全角の\n // `lane-A`) がこの形になり、黙って捨てられていた (実測 = 幅 999 を持つ空の縦列が増え、\n // 元の縦列は 360 のままだった)\n const 追加した縦列: DslLane[] = 追加した縦列out ?? [];\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 追加した縦列.push(laneOpt);\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 // 解決できない名前の矢印は落とす (#1209)。 以前は名前をそのまま lane id として使い、\n // 存在しない lane に箱を置いた図ができていた\n const fromLaneId = actorIds.get(s.from);\n const toLaneId = actorIds.get(s.to);\n if (fromLaneId === undefined || toLaneId === undefined) return;\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 });\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 // `role` を付ける (#1273)。 付けないと生命線の終わりが footer より 100 下まで伸びる\n // (実測 = 組立て API は `y2=848`、記法は `y2=948`)。 枠の大きさは同じなので\n // 描いた図の大きさの比較では捕まらない\n b.node(footerId, {\n lane: laneId,\n stack: footerStack,\n kind: \"card\",\n title: a.name,\n w: actorW,\n h: 72,\n role: \"lifeline-footer\",\n });\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 // **縦列を書いた形は動きの有無に関わらず generic 経路へ** (#1263)。 動く図だけで効かせると、\n // 同じ記法でも静止図では指定が黙って消える (実測 = 縦列 3 本のはずが 1 本になり知らせも出ない)\n if ((doc.animate && doc.animate.phases.length > 0) || 書いた縦列に置く(\"flow\", doc)) {\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 // **縦列を書いた形は動きの有無に関わらず generic 経路へ** (#1263)。 動く図だけで効かせると、\n // 同じ記法でも静止図では指定が黙って消える (実測 = 縦列 3 本のはずが 1 本になり知らせも出ない)\n if ((doc.animate && doc.animate.phases.length > 0) || 書いた縦列に置く(\"swimlane\", doc)) {\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 });\n }\n\n // **箱が 1 つも置けなかった時は、 登場人物をそのまま置く** (#1219)。\n //\n // この図種は矢印の端から箱を作るため、 矢印が 1 本も無いと箱が 0 件になり `compile` が\n // 落ちる (実測 = 矢印を書かない図は本 Issue の前から落ちていた)。 解決できない矢印を\n // 外すと同じ形になるので、 受け皿を置く。\n //\n // **1 つでも置けた時は触らない**。 矢印に出てこない登場人物にも箱を置くと、 今まで枠だけ\n // だった所に箱が増えて既存の図の見た目が変わる (それを変えるかは別の判断)。\n if (placedNodes.size === 0) {\n doc.actors.forEach((a, i) => {\n swim.node(slugify(a.name) || `n${i}`, {\n lane: swim.laneId(a.name),\n stack: 0,\n kind: a.kind ?? \"actor\",\n title: a.name,\n });\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\n/**\n * 状態遷移図で、どの箱を始まり / 終わりとみなすか (#1275)。\n *\n * **書いた値が勝つ**。 `initial:` / `final:` は記法で書けるのに 1 度も読まれておらず、\n * 位置だけで決まっていた (実測 = 中央の箱に `final: true` を書いても、最後に書いた箱が\n * 「最終」 になった)。\n *\n * 1 つも書いていなければ従来どおり位置で決める = 書かない記法の図は変わらない。\n * 片方だけ書いた形も、書いた側だけが切り替わる。\n */\nfunction 始まりと終わりの決め方(doc: DslDocument): {\n 始まり: (a: DslActor, idx: number) => boolean;\n 終わり: (a: DslActor, idx: number) => boolean;\n} {\n const 書いた始まり = doc.actors.some((a) => a.initial === true);\n const 書いた終わり = doc.actors.some((a) => a.final === true);\n return {\n 始まり: (a, idx) => (書いた始まり ? a.initial === true : idx === 0),\n 終わり: (a, idx) =>\n 書いた終わり ? a.final === true : idx === doc.actors.length - 1 && doc.actors.length > 1,\n };\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 const 決め方 = 始まりと終わりの決め方(doc);\n for (let i = 0; i < doc.actors.length; i++) {\n const a = doc.actors[i]!;\n // 書いた `initial:` / `final:` が勝つ。 1 つも書いていなければ順序で決める\n const initial = 決め方.始まり(a, i);\n const final = 決め方.終わり(a, i);\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 // **縦列を書いた形は動きの有無に関わらず generic 経路へ** (#1263)。 動く図だけで効かせると、\n // 同じ記法でも静止図では指定が黙って消える (実測 = 縦列 3 本のはずが 1 本になり知らせも出ない)\n if ((doc.animate && doc.animate.phases.length > 0) || 書いた縦列に置く(\"topology\", doc)) {\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\n/**\n * 後ろへ戻る矢印か (#1260)。\n *\n * 状態の図は、後ろの状態へ戻る矢印を **箱の上を回して** 描く (`routing: \"back-detour\"`)。\n * 組立て API 側がそうしており、記法側で付けないと **描いた図の高さが変わる**\n * (実測 = viewBox が 404 対 486 で、戻る矢印が箱の右横を回っていた)。\n *\n * 判定は並び順。 指す先が指す元より前にあれば戻る矢印\n * (実測 = `stateMachine()` は c -> a と c -> b の 2 本だけに付け、a -> b と b -> c には付けない)。\n *\n * **状態の図だけに付ける**。 他の図種の組立て API は付けない (実測 = `er()` は付けなかった)。\n */\nfunction 後ろへ戻る矢印か(\n kind: GenericKind,\n fromId: string,\n toId: string,\n 箱の並び: ReadonlyMap<string, number>,\n): boolean {\n if (kind !== \"state\") return false;\n const 元 = 箱の並び.get(fromId);\n const 先 = 箱の並び.get(toId);\n if (元 === undefined || 先 === undefined) return false;\n return 先 < 元;\n}\n\n/**\n * 縦列を選べる図種 (#1263)。\n *\n * 縦列を **箱を並べるための入れ物** として使う図種だけを許す。 順序図と solidity は\n * 縦列がそのまま生命線として描かれる骨格なので許さない (#1248 の判断はこちらに当たる)。\n *\n * `er` / `state` / `class` は「1 縦列 1 箱」 が図の読み方そのもの (表 / 状態 / クラスが\n * 横に並ぶ) なので、2 つの箱を同じ縦列へ入れられる形にはしない。\n */\nconst 縦列を選べる図種: ReadonlySet<GenericKind> = new Set([\"flow\", \"topology\", \"swimlane\"]);\n\n/**\n * 書いた縦列に箱を置く形か (#1263)。\n *\n * **全ての箱が縦列を書いた時だけ** この形にする。 一部だけ書いた形は、書かなかった箱の\n * 行き先を決める規則が要る (既定の縦列に集める / 自分の縦列を作る) が、どちらも\n * 書いた人の意図と一致する保証が無い。 混ざった形は `reportLaneMixed` が知らせる。\n *\n * 見本 (parts) は縦列を張替え先として使うため、この判定からは外す。\n */\nfunction 書いた縦列に置く(kind: GenericKind, doc: DslDocument): boolean {\n if (!縦列を選べる図種.has(kind)) return false;\n const 対象 = doc.actors.filter((a) => a.partId === undefined);\n return 対象.length > 0 && 対象.every((a) => a.lane !== undefined);\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, doc)) {\n // **書いた縦列に置く** (#1263)。 縦列を並べるための入れ物として使う図種でだけ効く。\n // 縦列は書かれた順に作り、同じ縦列の箱は書かれた順に積む\n const 並び: string[] = [];\n for (const a of doc.actors) {\n const lid = a.lane;\n if (lid !== undefined && !並び.includes(lid)) 並び.push(lid);\n }\n for (const lid of 並び) {\n b.lane(lid, { width: laneWidth, ...(kind === \"topology\" ? { contain: true } : {}) });\n }\n const 積んだ数 = new Map<string, number>();\n doc.actors.forEach((a, idx) => {\n const id = slugify(a.name) || `n${idx}`;\n actorToNodeId.set(a.name, id);\n const lid = a.lane!;\n const stack = 積んだ数.get(lid) ?? 0;\n 積んだ数.set(lid, stack + 1);\n b.node(id, { lane: lid, stack, kind: a.kind, title: a.name });\n });\n } else 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 //\n // **見出しを付けるのは `swimlane` だけ** (#1241)。 3 図種とも箱を 1 つずつ持ち、\n // その箱が既に名前を描く。 縦列にも同じ名前を渡すと **同じ字が縦に 2 つ並ぶ**\n // (実測 = 描いた絵に `Alpha` `Beta` が 2 度出る)。\n //\n // `swimlane` は縦列そのものが「誰の担当か」 を読ませる図なので見出しが要る。\n // `er` の縦列は表を並べるための入れ物、 `state` の縦列は状態を並べるための入れ物で、\n // どちらも読む人に見せる意味を持たない (組立て API 側も見出しを空のまま置く)。\n const 見出しを付ける = kind === \"swimlane\";\n const 決め方2 = 始まりと終わりの決め方(doc);\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\" && 決め方2.始まり(a, idx);\n const isFinal = kind === \"state\" && 決め方2.終わり(a, idx);\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 //\n // 解決できない名前の矢印は **落とす** (#1209)。 以前は名前をそのまま id として使っており、\n // 存在しない node を指す図ができて描画の直前で落ちていた\n // (実測 = `unknown-ref: edge \"e0-v-c\" の from \"v\" が node に存在しません`)。\n // 書いた人には `flow-actor-missing` の知らせが届く。\n // 箱の並び。 後ろへ戻る矢印を見分けるために使う (#1260)\n const 箱の並び = new Map([...actorToNodeId.values()].map((id, i) => [id, i]));\n const edgeIds: string[] = [];\n doc.flow.forEach((s, idx) => {\n // 名前は入口で正規化済 (`canonicalizeFlowActors`)。 ここで slug を受け直すと、\n // 動きを書いていない図の組み立てと扱いが割れる\n const fromId = actorToNodeId.get(s.from);\n const toId = actorToNodeId.get(s.to);\n if (fromId === undefined || toId === undefined) return;\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 ...後ろへ戻る矢印か(kind, fromId, toId, 箱の並び) ? { routing: \"back-detour\" as const } : {},\n ...(s.sub ? { sub: s.sub } : {}),\n ...(s.tone ? { tone: s.tone } : {}),\n ...(s.style ? { style: s.style } : {}),\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\n/** id の長さの上限。 `slugify` が切る幅で、 尾を付ける側もこの値から余地を決める (#1220) */\nconst ID_MAX = 64;\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, ID_MAX) || \"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 * 値 (`values`) と状態 (`states`) の名前と式が、記法として書ける範囲に収まっているかの判定。\n *\n * **入口が 2 つあるので 1 か所に置く** (#1181)。 記法 (`v05/parser.ts`) と JSON\n * (`json-parser.ts`) が同じ判定を使う。 別々に持つと片方だけが受け付ける形ができ、\n * 「YAML では弾かれるのに JSON では通る」 (またはその逆) が生まれる。\n *\n * 位置の付け方だけが入口で違う (記法は行番号、JSON は field の path)。 そのため本 file は\n * 位置を持たない指摘だけを返し、呼出側が自分の形に包む。\n */\n\n/** 値と状態の名前。 描画側が `{名前}` を置き換える時に見る範囲と揃える (英数字と `_` のみ) */\nconst VALUE_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/** 式に書ける関数。 spec が「関数呼び出しは入れない」 としつつ例外にしている 2 つだけ */\nconst VALUE_FNS: ReadonlySet<string> = new Set([\"min\", \"max\"]);\n\n/** 位置を持たない指摘。 呼出側が行番号 (記法) か path (JSON) を付けて報告する */\nexport type ValueSyntaxIssue = {\n message: string;\n hint?: string;\n};\n\n/** 値 / 状態の名前として使えるか */\nexport function isValueName(name: string): boolean {\n return VALUE_NAME_RE.test(name);\n}\n\n/** 名前が使えない時の指摘 */\nexport function valueNameIssue(name: string): ValueSyntaxIssue {\n return {\n message: `invalid value name: \"${name}\"`,\n hint: \"英字か _ で始め、 英数字と _ だけを使う (states と同じ規則)\",\n };\n}\n\n/** きっかけ形の読み取り結果。 位置は呼出側が付ける (本 file の方針) */\nexport type ParsedValueTrigger = {\n trigger:\n | { kind: \"step\"; step: string }\n | { kind: \"reaches\"; source: string; op: TriggerOp; threshold: number };\n to: number;\n durationMs: number;\n};\n\nexport type TriggerOp = \">=\" | \">\" | \"<=\" | \"<\" | \"==\" | \"!=\";\n\n/** 比較の記号。 **2 文字を先に見る** = `>=` を `>` と読むと境目が 1 つずれる */\nconst TRIGGER_OPS: readonly TriggerOp[] = [\">=\", \"<=\", \"==\", \"!=\", \">\", \"<\"];\n\n/**\n * 動く長さを ms に直す。 段の頭 (`\"取込み\" 2s`) と同じ書き方を受ける。\n *\n * 単位を書かない形は秒として読む (段の頭と揃える)。 0 以下は動かないので受けない。\n */\nexport function parseDurationMs(text: string): number | null {\n const m = text.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s)?$/);\n if (!m) return null;\n const n = parseFloat(m[1] ?? \"0\");\n if (!Number.isFinite(n) || n <= 0) return null;\n const unit = m[2] ?? \"s\";\n const durationMs = unit === \"ms\" ? Math.round(n) : Math.round(n * 1000);\n // 描画側の時計は ms の整数。 正の小数でも丸めた結果が 0ms なら、 後段で傾斜の式が\n // 0 除算になるため、この入口で「動く長さではない」として弾く。\n return durationMs > 0 ? durationMs : null;\n}\n\n/**\n * 引用の外にある `,` だけで切る。\n *\n * 素朴な `split(\",\")` を使えない。 段の名前に `,` を書ける (`step \"取込み, 検証\"`) ため、\n * 引用の中で切ると名前が 2 つに割れる。\n */\nfunction splitOutsideQuotes(body: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let quote: string | null = null;\n for (const ch of body) {\n if (quote) {\n if (ch === quote) quote = null;\n cur += ch;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n cur += ch;\n continue;\n }\n if (ch === \",\") {\n out.push(cur);\n cur = \"\";\n continue;\n }\n cur += ch;\n }\n out.push(cur);\n return out.map((s) => s.trim()).filter((s) => s !== \"\");\n}\n\n/** 引用を外す。 引用の中の `,` を守るために引用を残したまま切っているので、 ここで落とす */\nfunction unquote(s: string): string {\n const t = s.trim();\n if (t.length >= 2 && (t[0] === '\"' || t[0] === \"'\") && t[t.length - 1] === t[0]) {\n return t.slice(1, -1);\n }\n return t;\n}\n\n/**\n * きっかけの本体を読む (`step \"取込み\"` / `vDone >= 100`)。\n *\n * **`step` を先に見る**。 後に回すと `step \"x\"` が比較の記号を含まない形として\n * 「相手の値の名前」 に落ち、 名前として不正という別の理由で弾かれる = 直し方が伝わらない。\n */\nfunction parseTriggerExpression(raw: string, name: string): ParsedValueTrigger[\"trigger\"] | ValueSyntaxIssue {\n const text = raw.trim();\n const stepMatch = text.match(/^step\\s+(.+)$/);\n if (stepMatch) {\n const step = unquote(stepMatch[1] ?? \"\");\n if (step === \"\") {\n return { message: `trigger の段名が空です (\"${name}\")`, hint: '`trigger: step \"取込み\"` の形で段の名前を書く' };\n }\n return { kind: \"step\", step };\n }\n for (const op of TRIGGER_OPS) {\n const at = text.indexOf(op);\n if (at < 0) continue;\n const source = text.slice(0, at).trim();\n const rhs = text.slice(at + op.length).trim();\n if (!isValueName(source)) {\n return {\n message: `trigger が見張る値の名前が使えません: \"${source}\" (\"${name}\")`,\n hint: \"英字か _ で始め、 英数字と _ だけを使う\",\n };\n }\n const threshold = Number(rhs);\n if (rhs === \"\" || !Number.isFinite(threshold)) {\n return {\n message: `trigger の境目が数ではありません: \"${rhs}\" (\"${name}\")`,\n hint: \"`trigger: vDone >= 100` のように数で書く\",\n };\n }\n return { kind: \"reaches\", source, op, threshold };\n }\n return {\n message: `trigger の形が読めません: \"${text}\" (\"${name}\")`,\n hint: '`step \"取込み\"` か `vDone >= 100` の形で書く',\n };\n}\n\n/**\n * 中括弧で囲まれた本体が「きっかけ形」 かを見分ける。\n *\n * 式も中括弧で始まり中括弧で終わることがある (`{a} + {b}` / `{a}`)。 見分けるのは\n * **引用の外に `:` があるか**で、 式の中括弧は値の名前しか包まないため `:` を持たない。\n *\n * 名前で見分けない (`trigger` を含むか等)。 `{trigger} + 1` のように `trigger` という名前の値を\n * 読む式が書けるため、 名前で見ると式をきっかけ形と読み違える。\n */\nexport function isTriggerBody(raw: string): boolean {\n const t = raw.trim();\n if (!t.startsWith(\"{\") || !t.endsWith(\"}\") || t.length < 2) return false;\n const inner = t.slice(1, -1);\n let quote: string | null = null;\n for (const ch of inner) {\n if (quote) {\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \":\") return true;\n }\n return false;\n}\n\n/**\n * きっかけ形の中身を読む (`{ trigger: step \"取込み\", to: 100, dur: 2s }`)。\n *\n * 3 つとも必須にする。 既定値を置くと「書かなかった」 と「その値を書いた」 が同じになり、\n * 動かない時に何を直せばよいか分からなくなる。\n */\nexport function parseValueTriggerBody(\n body: string,\n name: string,\n): { spec: ParsedValueTrigger; issues: [] } | { spec: null; issues: ValueSyntaxIssue[] } {\n const issues: ValueSyntaxIssue[] = [];\n const seen = new Map<string, string>();\n for (const part of splitOutsideQuotes(body)) {\n const at = part.indexOf(\":\");\n if (at < 0) {\n issues.push({ message: `\"${part}\" は key: value の形ではありません (\"${name}\")`, hint: \"`trigger: ... , to: 100, dur: 2s` の形で書く\" });\n continue;\n }\n const key = part.slice(0, at).trim().toLowerCase();\n const value = part.slice(at + 1).trim();\n if (seen.has(key)) {\n issues.push({ message: `\"${key}\" を 2 度書いています (\"${name}\")`, hint: \"同じ項目は 1 度だけ書く\" });\n continue;\n }\n seen.set(key, value);\n }\n\n const known = new Set([\"trigger\", \"to\", \"dur\"]);\n for (const key of seen.keys()) {\n if (known.has(key)) continue;\n issues.push({\n message: `\"${key}\" は values に書けません (\"${name}\")`,\n hint: `書けるのは ${[...known].join(\" / \")} だけ`,\n });\n }\n\n const triggerRaw = seen.get(\"trigger\");\n let trigger: ParsedValueTrigger[\"trigger\"] | null = null;\n if (triggerRaw === undefined) {\n issues.push({ message: `trigger がありません (\"${name}\")`, hint: '`trigger: step \"取込み\"` か `trigger: vDone >= 100` を書く' });\n } else {\n const parsed = parseTriggerExpression(triggerRaw, name);\n if (\"message\" in parsed) issues.push(parsed);\n else trigger = parsed;\n }\n\n const toRaw = seen.get(\"to\");\n let to = 0;\n if (toRaw === undefined) {\n issues.push({ message: `to がありません (\"${name}\")`, hint: \"`to: 100` のように動いた先の値を書く\" });\n } else {\n to = Number(unquote(toRaw));\n if (!Number.isFinite(to)) {\n issues.push({ message: `to が数ではありません: \"${toRaw}\" (\"${name}\")`, hint: \"`to: 100` のように数で書く\" });\n }\n }\n\n const durRaw = seen.get(\"dur\");\n let durationMs = 0;\n if (durRaw === undefined) {\n issues.push({ message: `dur がありません (\"${name}\")`, hint: \"`dur: 2s` のように動く長さを書く\" });\n } else {\n const parsedDur = parseDurationMs(unquote(durRaw));\n if (parsedDur === null) {\n issues.push({ message: `dur が読めません: \"${durRaw}\" (\"${name}\")`, hint: \"`2s` / `1.5s` / `500ms` の形で、 0 より大きい長さを書く\" });\n } else {\n durationMs = parsedDur;\n }\n }\n\n if (issues.length > 0 || trigger === null) return { spec: null, issues };\n return { spec: { trigger, to, durationMs }, issues: [] };\n}\n\n/**\n * 式が記法として書ける範囲に収まっているかを見る。\n *\n * 式が文法として正しいかは見ない。 そこは描画側が評価する時に判定して、その値だけを止める\n * (spec § 4.2 = 1 箇所の壊れで図全体を止めない)。 ここで見るのは **記法として書ける範囲に\n * 収まっているか**で、描画側が受け付けるが記法としては認めない書き方 (余り / 条件分岐 /\n * `min` `max` 以外の関数) を弾く。\n *\n * `{名前}` の中身と外側を分けて見る。 分けないと、名前に紛れた記号を式の記号と読み違える。\n */\nexport function checkValueExpression(expression: string, name: string): ValueSyntaxIssue[] {\n const issues: ValueSyntaxIssue[] = [];\n\n // `{名前}` の中身は名前の規則で見る\n const refRe = /\\{([^}]*)\\}/g;\n let m: RegExpExecArray | null;\n while ((m = refRe.exec(expression)) !== null) {\n const ref = (m[1] ?? \"\").trim();\n if (!VALUE_NAME_RE.test(ref)) {\n issues.push({\n message: `invalid reference \"{${ref}}\" in \"${name}\"`,\n hint: \"英字か _ で始め、 英数字と _ だけを使う\",\n });\n }\n }\n if (expression.includes(\"{\") && !expression.includes(\"}\")) {\n issues.push({ message: `unclosed \"{\" in \"${name}\"`, hint: \"`{名前}` の形で閉じる\" });\n }\n\n // 名前を外した残りが式の骨格。 ここに記法外の記号や関数が無いかを見る\n const outside = expression.replace(/\\{[^}]*\\}/g, \" \");\n if (outside.includes(\"%\")) {\n issues.push({ message: `\"%\" は式に書けない (\"${name}\")`, hint: \"四則 (+ - * /) だけを使う\" });\n }\n if (outside.includes(\"?\")) {\n issues.push({\n message: `条件分岐 (?:) は式に書けない (\"${name}\")`,\n hint: \"比較の結果は真 = 1 / 偽 = 0 の数になるので、 掛け算で切り替える\",\n });\n }\n for (const fn of outside.matchAll(/[a-zA-Z_][a-zA-Z0-9_.]*/g)) {\n const word = fn[0];\n if (VALUE_FNS.has(word)) continue;\n issues.push({\n message: `\"${word}\" は式に書けない (\"${name}\")`,\n hint:\n word.startsWith(\"Math.\")\n ? \"min / max は Math. を付けずに書く\"\n : `使えるのは ${[...VALUE_FNS].join(\" / \")} だけ。 値は {名前} で読む`,\n });\n }\n const stray = outside.replace(/[a-zA-Z_][a-zA-Z0-9_.]*/g, \" \").match(/[^0-9.,+\\-*/()<>=!\\s]/g);\n if (stray) {\n issues.push({\n message: `\"${[...new Set(stray)].join(\"\")}\" は式に書けない (\"${name}\")`,\n hint: \"四則 (+ - * /) / 括弧 / 比較 (> >= < <= == !=) / min / max だけを使う\",\n });\n }\n\n return issues;\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 {\n checkValueExpression,\n isTriggerBody,\n isValueName,\n parseValueTriggerBody,\n valueNameIssue,\n} from \"../value-syntax\";\nimport type {\n DslAxes,\n DslDocument,\n DslActor,\n DslActorNodeOverride,\n DslStep,\n DslAnimate,\n DslState,\n DslValue,\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/**\n * 記法が受ける top-level の項目 (#1190)。\n *\n * 読めない行の案内と、記法一覧が全て載せているかの検査が、どちらもここを見る。 一覧に手で\n * 書くと、項目を足した時に案内か一覧のどちらかが取り残される (実際に `states` / `values` が\n * 一覧に 1 件も無い状態で放置されていた)。\n */\nexport const TOP_LEVEL_KEYS = [\n \"title\", \"type\", \"actors\", \"flow\", \"states\", \"values\", \"animation\", \"viewport\", \"lanes\", \"groups\",\n // 図全体を 1 箱にする図種で、 その箱の上に出す小見出し (#1247)\n \"eyebrow\",\n // 2 軸で仕分ける図の軸の名前 (#1251)\n \"axes\",\n] as const;\n\n/**\n * `lanes:` / `groups:` の 1 行を読む形 (#1241)。\n *\n * **id は英数字と下線に限らない**。 組み立て側は登場人物の名前から縦列 id を作るため、\n * hyphen と日本語が入る (実測 = `type: state` で `lane-idle` / `lane-待機`、\n * `type: swimlane` で `lane-sign-up`)。 英数字と下線だけを受けていた間、\n * **自動で作られた縦列の幅や見出しを書き直す手段が無かった**。\n *\n * 受けるのは **組み立て側が作りうる字だけ** に絞る。 字と数と下線と hyphen。\n *\n * 「読み取りを壊す字以外は何でも」 にすると、`lane-idle,` のような書き間違いが\n * **別の縦列として通り**、書いた幅が黙って効かなくなる (Round 1 の指摘、実測)。\n *\n * **非 ASCII をまとめて許すのも広すぎる** (Round 2 の指摘)。 全角の読点や感嘆符、絵文字まで\n * 通ってしまう (実測 = `lane-idle、` / `lane-idle!` / `lane-idle🙂` が受かった)。\n * 字 (`\\p{L}`) と数 (`\\p{N}`) だけを許せば、日本語の縦列 id は通しつつ句読点は外せる。\n */\nconst LANE_ID_ENTRY = /^([\\p{L}\\p{N}_-]+)\\s*:\\s*\\{([^}]*)\\}\\s*$/u;\n\nfunction isTopLevelKey(key: string): key is (typeof TOP_LEVEL_KEYS)[number] {\n return (TOP_LEVEL_KEYS as readonly string[]).includes(key);\n}\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 \"bar\",\n \"line\",\n \"funnel\",\n \"tree\",\n \"journey\",\n \"quadrant\",\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 eyebrow: string | null = null;\n let eyebrowLine = 0;\n let axes: DslAxes | undefined = undefined;\n let axesLine = 0;\n let actors: DslActor[] = [];\n const flow: DslStep[] = [];\n let animate: DslAnimate | undefined = undefined;\n const values: DslValue[] = [];\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 || !isTopLevelKey(head.key)) {\n errors.push({\n line: line.no,\n message: `unknown top-level key: \"${line.trimmed}\"`,\n hint: `expected one of: ${TOP_LEVEL_KEYS.join(\", \")}`,\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 === \"eyebrow\") {\n // 空で書いた形 (`eyebrow:`) は「書かなかった」 と同じにする。 空文字を残すと\n // 描画側が中身のない帯を出す\n const v = (head.value ?? \"\").trim();\n eyebrow = v.length > 0 ? v : null;\n eyebrowLine = line.no;\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 === \"values\") {\n // 1 行に詰める形 (`values: { a: \"...\" }` / `values: a: \"...\"`) は受けない。 式に `,` が\n // 入る (`min({a}, {b})`) ため、 `states` が使う素朴な `,` 分割では式が壊れる。\n //\n // **`{` で始まるかを見てはいけない** (#1169)。 `values: a: \"{b} + 1\"` は `{` で始まらない\n // ため判定を通り抜け、 その後 `collectIndentedRaw` が次行以降しか見ないので **値が\n // 1 件も読まれずに黙って消える**。 書き間違いを黙って捨てないという `collectIndentedRaw`\n // を自前で持った理由と矛盾する。\n //\n // 同じ行に何か書いてあれば形を問わず弾く = 1 行形は全て受けないという規則そのもの。\n const inline = head.value?.trim();\n if (inline) {\n errors.push({\n line: line.no,\n message: \"values は 1 行にまとめて書けない\",\n hint: '式に `,` が入るため。 次の行から字下げして `waiting: \"{inflow} - {done}\"` の形で並べる',\n });\n i += 1;\n continue;\n }\n // `collectIndentedList` は `:` を含まない行を黙って捨てる。 捨てられると\n // 書き間違えた行が「書かなかった」 と同じになり、 値が 1 つ消えたことに気付けない\n const { items, next } = collectIndentedRaw(lines, i + 1, line.indent);\n for (const it of items) {\n const v = parseValueEntry(it.trimmed.replace(/^-\\s*/, \"\"), it.no, errors);\n if (v) values.push(v);\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 === \"axes\") {\n // axes:\\n x: { left: \"...\", right: \"...\" }\\n y: { bottom: \"...\", top: \"...\" }\n //\n // **1 行にまとめて書く形は受けない** (Round 1 の指摘)。 受けないなら黙って捨てず、\n // その場で伝える = 捨てると軸を書いたつもりの本文が既定のまま描かれる (`values:` と同じ)\n if (head.value !== null && head.value.trim() !== \"\") {\n errors.push({\n line: line.no,\n message: \"axes は 1 行にまとめて書けない\",\n hint: '次の行から字下げして `x: { left: \"...\", right: \"...\" }` の形で並べる',\n });\n i += 1;\n continue;\n }\n // **`collectIndentedList` を使わない** (Round 1 の指摘)。 あちらは `:` を含まない行を\n // 黙って捨てるため、書き間違えた行が「書かなかった」 と同じになる\n const { items, next } = collectIndentedRaw(lines, i + 1, line.indent);\n axesLine = line.no;\n const 組み立て: DslAxes = {};\n for (const it of items) {\n const m = it.trimmed.match(/^(x|y)\\s*:\\s*\\{([^}]*)\\}\\s*$/);\n if (!m) {\n errors.push({\n line: it.no,\n message: `invalid axes entry: \"${it.trimmed}\"`,\n hint: 'use `x: { left: \"...\", right: \"...\" }` or `y: { bottom: \"...\", top: \"...\" }`',\n });\n continue;\n }\n const opts = parseInlineMapping(m[2] ?? \"\");\n if (m[1] === \"x\") 組み立て.x = { left: opts.left, right: opts.right };\n else 組み立て.y = { bottom: opts.bottom, top: opts.top };\n }\n // 1 本も読めなかった形は「書かなかった」 と同じにする。 空の軸を渡すと、\n // 書いていない側の名前が空文字で描かれる\n axes = 組み立て.x !== undefined || 組み立て.y !== undefined ? 組み立て : undefined;\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(LANE_ID_ENTRY);\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(LANE_ID_ENTRY);\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 ...(eyebrow !== null ? { eyebrow, eyebrowPos: { line: eyebrowLine } } : {}),\n ...(axes !== undefined ? { axes, axesPos: { line: axesLine } } : {}),\n actors,\n flow,\n animate,\n ...(values.length > 0 ? { values } : {}),\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 /**\n * 縦に並べて書かれた体験の道筋の欄 (#1251)。\n *\n * パーツでは状態の上書きとして意味を持つため、どちらに入れるかは block を読み終わってから\n * 決める。 `kind:` の行が後ろに書かれることもあり、読んだ時点ではパーツか分からない。\n */\n const 図種ごとの欄 = 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 \"touchpoint\":\n case \"opportunity\":\n case \"owner\":\n case \"end\":\n // **どちらに入れるかは block を読み終わるまで決まらない** (#1251 Round 1 の指摘)。\n // パーツかどうかは `kind:` の行で決まり、それが後ろに書かれることもある。\n // 倍率 (`scaleWritten`) と読めない項目名 (`unknownKeys`) が同じ理由で後回しにしている\n 図種ごとの欄.set(key, stripQuotes(raw));\n break;\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 // 体験の道筋の欄は、パーツなら状態の上書き、そうでなければ道筋の欄として入れる\n for (const [key, v] of 図種ごとの欄) {\n if (out.partId !== undefined) {\n state[key] = coerceStateValue(v);\n touchedState = true;\n continue;\n }\n if (key === \"touchpoint\") out.touchpoint = v;\n else if (key === \"opportunity\") out.opportunity = v;\n else if (key === \"owner\") out.owner = v;\n else out.end = v;\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 // 体験の道筋の欄 (#1251)\n \"touchpoint\", \"opportunity\",\n // 工程の並びの欄 (#1251)\n \"owner\", \"end\",\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 // 体験の道筋の欄 (`touchpoint` / `opportunity`) はここに載せない (#1251 Round 1 の指摘)。\n // 載せるとパーツで同じ名前の状態を書いた時に横取りされる = 既に動いている見本が静かに変わる。\n // パーツでない箱でだけ道筋の欄として読む (`parseActor` / `applyContinuationLines` が分岐する)\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 */\nexport const INLINE_ACTOR_KEYS: ReadonlySet<string> = new Set([\n \"kind\", \"subtitle\", \"eyebrow\", \"value\", \"rows\", \"lane\", \"stack\",\n \"initial\", \"final\", \"tone\", \"nodes\",\n // 体験の道筋の欄 (#1251)。 他の図種では組み立て側が知らせる\n \"touchpoint\", \"opportunity\",\n // 工程の並びの欄 (#1251)\n \"owner\", \"end\",\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 * 矢印の中括弧に書ける欄と、その読み方 (#1275)。\n *\n * **parser がこの表を回して読む**。 欄ごとに `opts.xxx` を並べる形だと、README や検査が\n * 持つ一覧が実装と drift する = 欄を足しても誰も気付けない。 表を唯一の出どころにして、\n * `FLOW_INLINE_KEYS` から一覧を導けるようにする。\n */\nconst FLOW_INLINE_READERS = {\n sub: (v: string | undefined) => v,\n guard: (v: string | undefined) => v,\n cardinality: (v: string | undefined) => v,\n labelOffsetX: (v: string | undefined) => numberOrUndef(v),\n labelOffsetY: (v: string | undefined) => numberOrUndef(v),\n overlay: (v: string | undefined) => boolOrUndef(v),\n} as const;\n\n/** 矢印の中括弧に書ける欄の名前。 README の一覧と突き合わせる (#1275) */\nexport const FLOW_INLINE_KEYS = Object.keys(FLOW_INLINE_READERS) as readonly (keyof typeof FLOW_INLINE_READERS)[];\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 // パーツでは状態の上書きとして意味を持つため、道筋の欄として横取りしない (#1251)\n touchpoint: isPart ? undefined : opts.touchpoint,\n opportunity: isPart ? undefined : opts.opportunity,\n // 見本では状態の上書きとして意味を持つため横取りしない (#1251)\n owner: isPart ? undefined : opts.owner,\n end: isPart ? undefined : opts.end,\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, overlay: true }` ... 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 // 欄は `FLOW_INLINE_READERS` の表から読む。 個別に並べると一覧が実装と drift する\n const 中括弧: Partial<Record<keyof typeof FLOW_INLINE_READERS, unknown>> = {};\n // inline option (`{ ... }`) を末尾から抽出\n const mapMatch = rest.match(/\\s*\\{([^}]*)\\}\\s*$/);\n if (mapMatch) {\n const opts = parseInlineMapping(mapMatch[1]!);\n for (const k of FLOW_INLINE_KEYS) 中括弧[k] = FLOW_INLINE_READERS[k](opts[k]);\n rest = rest.slice(0, mapMatch.index ?? 0).trim();\n }\n const sub = 中括弧.sub as string | undefined;\n const guard = 中括弧.guard as string | undefined;\n const cardinality = 中括弧.cardinality as string | undefined;\n const labelOffsetX = 中括弧.labelOffsetX as number | undefined;\n const labelOffsetY = 中括弧.labelOffsetY as number | undefined;\n const overlay = 中括弧.overlay as boolean | undefined;\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 overlay,\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(/^([^:]+?)\\s*:\\s*(.+)$/);\n if (!m) return null;\n const name = (m[1] ?? \"\").trim();\n if (!isValueName(name)) return null;\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\n/**\n * 字下げした行を 1 行も落とさずに集める。\n *\n * `collectIndentedList` は形が合わない行を黙って捨てるが、 `values` では捨てずに\n * 読み手 (`parseValueEntry`) へ渡して書き間違いとして報告させる。\n */\nfunction collectIndentedRaw(\n lines: Line[],\n start: number,\n parentIndent: number,\n): { 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 || !ln.trimmed || ln.trimmed.startsWith(\"#\")) {\n i += 1;\n continue;\n }\n if (ln.indent <= parentIndent) break;\n items.push(ln);\n i += 1;\n }\n return { items, next: i };\n}\n\n/**\n * `waiting: \"{inflow} - {done}\"` を 1 件の値として読む。\n *\n * 名前と式の判定は `value-syntax.ts` が持つ (#1181)。 JSON 経路も同じ判定を使うため、\n * ここでは行番号を付けて報告する形にだけ責任を持つ。\n */\nfunction parseValueEntry(text: string, lineNo: number, errors: DslError[]): DslValue | null {\n const m = text.match(/^([^:]+?)\\s*:\\s*(.+)$/);\n if (!m) {\n errors.push({\n line: lineNo,\n message: `invalid value entry: \"${text}\"`,\n hint: '`waiting: \"{inflow} - {done}\"` の形で書く',\n });\n return null;\n }\n const name = (m[1] ?? \"\").trim();\n if (!isValueName(name)) {\n errors.push({ line: lineNo, ...valueNameIssue(name) });\n return null;\n }\n const rest = (m[2] ?? \"\").trim();\n // きっかけ形 (`{ trigger: ..., to: ..., dur: ... }`) を先に見る。 式として読むと中括弧の中身が\n // 値の名前として検査され、 「trigger は名前に使えない」 のような直し方の伝わらない誤りになる\n if (isTriggerBody(rest)) {\n const { spec, issues } = parseValueTriggerBody(rest.slice(1, -1), name);\n if (spec === null) {\n for (const issue of issues) errors.push({ line: lineNo, ...issue });\n return null;\n }\n return { name, trigger: spec.trigger, to: spec.to, durationMs: spec.durationMs, pos: { line: lineNo } };\n }\n const expression = stripQuotes(rest);\n if (expression === \"\") {\n errors.push({ line: lineNo, message: `empty expression for \"${name}\"`, hint: '`\"{a} + {b}\"` のように式を書く' });\n return null;\n }\n const issues = checkValueExpression(expression, name);\n if (issues.length > 0) {\n for (const issue of issues) errors.push({ line: lineNo, ...issue });\n return null;\n }\n return { name, expression, 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 // **引用部分を非引用部分と分けて覚えておく** (#1192)。 区間全体に quoted flag を\n // 付けるだけだと `Client \"Aave v3\"` まで 1 item になり、従来の空白区切りと混在できない。\n type FocusFragment = { text: string; quoted: boolean };\n const groups: FocusFragment[][] = [];\n let group: FocusFragment[] = [];\n let buf = \"\";\n let quote: string | null = null;\n const pushFragment = (quoted: boolean): void => {\n if (buf.trim()) group.push({ text: buf, quoted });\n buf = \"\";\n };\n const pushGroup = (): void => {\n pushFragment(false);\n if (group.length > 0) groups.push(group);\n group = [];\n };\n for (const ch of body) {\n if (quote) {\n if (ch === quote) {\n pushFragment(true);\n quote = null;\n continue;\n }\n buf += ch;\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n // item の途中にある引用符は名前の一部。 空白または区切りの直後だけ囲みを開始する。\n if (!buf || /\\s$/.test(buf)) {\n pushFragment(false);\n quote = ch;\n continue;\n }\n }\n if (ch === \",\") {\n pushGroup();\n continue;\n }\n buf += ch;\n }\n pushFragment(quote !== null);\n if (group.length > 0) groups.push(group);\n // \"User -> API\" のような quote 済 item は「1 item」 として groups に入る。\n // quote 外 item は依然として space split (旧挙動、 「Client API」 が 2 item として解釈される互換維持)。\n const out: string[] = [];\n for (const fragments of groups) {\n const whole = fragments.map(({ text }) => text).join(\"\").trim();\n if (fragments.every(({ quoted }) => !quoted) && /[-→][>]?/.test(whole) && /\\s/.test(whole)) {\n // arrow を含む非引用区間は「A -> B」パターン。 空白で分割しない。\n out.push(whole);\n continue;\n }\n for (const { text, quoted } of fragments) {\n const p = text.trim();\n if (!p) continue;\n // 引用符で囲んだ item は空白があっても切らず、非引用部分だけを従来どおり空白で切る。\n if (quoted) {\n out.push(p);\n } else {\n for (const x of p.split(/\\s+/)) {\n if (x) out.push(x);\n }\n }\n }\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(/^([^:\\s]+)\\s*[:\\s]\\s*(-?\\d+(?:\\.\\d+)?)\\s*->\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (!m) return null;\n const state = m[1] ?? \"\";\n if (!isValueName(state)) return null;\n return {\n state,\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(/^([^:\\s]+)\\s*[:\\s]\\s*(.+)$/);\n if (!m) return null;\n const state = m[1] ?? \"\";\n if (!isValueName(state)) 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, 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 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|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\n/**\n * 枝の親が実在するかを見る。\n *\n * **記法からも届く** (`#1177`)。 一時期は組立て API (`mindMap()` builder) で組んだ図にしか\n * 当たらなかった = 記法の `type: mind` が `card` を 3 列に並べる別実装で、 `mind-map` 種別を\n * 作っていなかったため (`#1170` で `type: radial` が消えて唯一の作り手が無くなった)。\n * `#1177` で `compileMind` を `mind-map` 種別に寄せたので、 前提が揃うようになった。\n *\n * ただし **記法から違反が出ることは無い**。 記法の `actors` は「1 つ目が中心、 残りが枝」 の\n * 並びで親を書く場所が無く、 全ての枝が中心の直下 (必ず実在する) になるため。 違反が出るのは\n * 組立て API で親を書き間違えた図になる。\n */\nfunction ruleMindMapParentReference(d: CdlDiagram): LintIssue[] {\n const out: LintIssue[] = [];\n for (const n of d.nodes) {\n if (n.kind === \"mind-map\" && 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\n/**\n * 段の人数が減っていくことを見る。\n *\n * 人数の欄は `{名前}` を書ける (状態から取る形、 cdl の `render/payload-binding.ts` が解く)。\n * その場合ここでは値が決まらないので、**数どうしの組だけを比べる** (#1194)。\n *\n * 素通しで比べると文字列の大小比較になり、`{trial}` が `{signup}` より大きいという理由で\n * 発火する。 実際に見本帳の funnel を状態から取る形にした時、その偽発火が出た。\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 const 今 = stages[i]!.count;\n const 前 = stages[i - 1]!.count;\n if (typeof 今 !== \"number\" || typeof 前 !== \"number\") continue;\n if (今 > 前) {\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 { PRESET_TYPES } from \"./v05/parser\";\nimport type { CompileToCdlOpts } from \"./compile\";\nimport type { CdlDiagram, NodeKind, Tone, EdgeStyle } from \"@cardenelabs/cdl\";\nimport type { DslDocument, DslActor, DslStep, DslAnimate, DslPhase, DslState, PresetType, LayoutMode, LayoutPos } from \"./types\";\nimport { checkValueExpression, isValueName, valueNameIssue } from \"./value-syntax\";\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 /**\n * 図表の箱の上に出す小見出し (optional)。 記法の最上位 `eyebrow:` と同じ (#1247)。\n *\n * 効くのは図全体を 1 箱にする図種 (`pie` / `bar` / `line` / `funnel` / `tree` / `journey` /\n * `quadrant` / `mind` / `gantt`) だけ。 箱ごとに分かれる図種では相手が決まらないため、\n * 組み立て側が知らせを出す。 そちらは `actors[].eyebrow` に書く。\n */\n eyebrow?: string;\n /** 登場人物 (必須): 文字列 or { name, kind, ... } object */\n actors: (string | JsonActor)[];\n /** flow step 配列 (必須): { from, to, label, ... } */\n flow: JsonStep[];\n /**\n * 状態の初期値 (optional)。 記法の `states:` と同じ (#1181)。\n *\n * `{名前}` を箱の文字に置くと、ここに書いた値が描画側で置き換わる。 名前は英数字と `_`\n * だけ (描画側が置き換える時に見る範囲と揃える)。\n *\n * ここに書けるのは初期値まで。 段で動かすのは `animation[].tween` / `animation[].set`\n * (`#1186` で追加、記法の `tween:` / `set:` と同じ)。\n */\n states?: Record<string, number | string>;\n /**\n * 他の値から自動で決まる値 (optional)。 記法の `values:` と同じ (#1181)。\n *\n * 式には四則 (`+ - * /`) と括弧、比較 (`> >= < <= == !=`)、`min` / `max` が書ける。\n * 他の値は `{名前}` で読む。 解くのは描画側で、毎 frame 参照から順に決まる。\n */\n values?: Record<string, string>;\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 /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */\n overlay?: boolean;\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 * 段の中で値を動かす (#1186)。 記法の `tween: name 100 -> 90` と同じ。\n *\n * 足すまで JSON の入口は `states:` で初期値を書けても **動かす手段が無かった** ため、\n * 同じ図を記法で書くと動き JSON で書くと静止する状態だった (#1181 で状態を足した時の残り)。\n */\n tween?: Record<string, readonly [number, number]>;\n /**\n * 段の切替で値を差し替える (#1186)。 記法の `set: name value` と同じ。\n *\n * `tween` が段の中を補間するのに対し、こちらは段の切替時に 1 度だけ変える。\n */\n set?: Record<string, number | 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\n/**\n * 受け付ける図種。 **記法側と同じ集合を使う** (`v05/parser.ts` の `PRESET_TYPES`)。\n *\n * 以前はここに一覧を写していたため、 記法に型を足しても JSON 経路が古い一覧のまま弾いた\n * (`bar` / `line` で実際に起きた)。 型が 3 箇所に散らばると、 必ずどれかが古くなる。\n */\nconst VALID_PRESETS: readonly PresetType[] = [...PRESET_TYPES];\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\n/**\n * 写しを作る時の入れ子の深さの上限。\n *\n * 枠の並びの長さが入れ子の深さで決まる。 図の入れ子は深くても数段で、 64 に届く形は書けない。\n */\nconst 写しの最大の深さ = 64;\n\n/**\n * 写しを作る時に触る値の数の上限。\n *\n * **書式の規則ではなく、 資源を使い切らないための歯止め**。 図の書式は値の数を制限していないので、\n * ここで拒むのは「構造としては正しいが大きすぎる」 入力になる。 だから **正当な入力が届かない\n * 高さ** に置く。\n *\n * 500 万は、 記法の入力の大きさの上限 (`input-size.ts` の 512KB) を全て 2 文字の値で埋めても\n * 届かない数になる。 JSON でも同じ規模の図が 500 万個の値を持つことはない。\n *\n * **数を数えないと守れない** (Round 4 の指摘)。 一度は「写しの大きさは元の入力の大きさで決まる\n * から数える意味が無い」 として外したが、 これは誤りだった。 Proxy は読まれるたびに新しい object\n * を返せるため、 **小さな入力から枝を生やせる** (実測 = 1 個の Proxy が深さ 6 / 6 分岐で\n * 55,987 個の object に膨らんだ)。 深さの上限だけでは横の広がりを止められない。\n */\nconst 写しの最大の項目数 = 5_000_000;\n\n/** 写しを作れなかった理由 (path 付き) */\nclass 写せない extends Error {\n constructor(\n readonly path: string,\n readonly 理由: string,\n ) {\n super(`${path}: ${理由}`);\n }\n}\n\n/**\n * 検査の前に 1 度だけ読んで作る、 素のデータの複製 (#1217)。\n *\n * 入口は検査する時と図に写す時で同じ項目を 2 度読んでいた。 渡された object が値を返す関数\n * (getter) を持っていると、 2 度目の読み取りで別の値を返せる = **検査を通った値と図に届く値が\n * 別物になり、 検査が意味を持たない** (実測 = `animation[0].tween` を 6 回目から\n * `[NaN, Infinity]` を返す getter にすると、 検査を通って図に `from: null` が届いた)。\n *\n * ここで 1 度だけ読んで写しを作り、 以降は写しだけを読む。 各項目の読み取りは 1 回で、\n * 項目の名前も添字も同じ値を 2 度取りに行かない。\n *\n * **`structuredClone` は使わない**。 関数や symbol を含む入力で `DataCloneError` を投げるため、\n * `validateDragonJson` が約束している「誤りは `{ ok: false, errors }` で返す」 が破れる。\n * 自前で写せば、 写せない値もそのまま持ち越して検査側の型の判定に落とせる。\n *\n * **再帰では書かない** (Round 1 の指摘)。 検査が見ない項目も含めて写すため、 深い入れ子を渡すと\n * 呼び出しの積み上げが溢れる (実測 = 使わない項目に 20,000 段の入れ子を付けると\n * `RangeError: Maximum call stack size exceeded`)。 枠を自前で積んで回す。\n *\n * **読む順は書いた順のまま、 深さ優先で降りる** (Round 2 / 3 の指摘)。 値を返す関数が副作用を\n * 持つ入力では読む順が結果に出るため、 再帰で書いた時と同じ順を保つ。 幅優先で回すと、 先に\n * 書いた兄弟の深い所より後の兄弟の浅い所を先に読む。\n *\n * **読み取りの例外も外に出さない** (Round 1 の指摘)。 項目の名前を数える所も値を読む所も、\n * getter や Proxy が投げれば `validateDragonJson` 自体が throw して約束が破れる。 投げた場所を\n * path として拾い、 検査の誤りに変える。\n *\n * 書き込みは `Object.defineProperty` で行う = `__proto__` を項目名に持つ入力で代入が\n * prototype の setter に落ちるのを避ける (`JSON.parse` と同じく普通の項目として持つ)。\n * `__proto__` を書いた時の扱いそのものは `#1184` が持つ。\n *\n * 輪 (自分を指す入れ子) は同じ写しを返して止める。 JSON からは作れないが、 object を直接\n * 渡す経路では作れる。\n *\n * ## 守る範囲 (Round 6 で線を引いた)\n *\n * この関数が守るのは **自分が確保する量** = 写しの入れ物と、 名前の一覧と、 枠の並び。 いずれも\n * 上限 (深さ / 数) を見てから作る。\n *\n * **渡された側が自分で確保する量は守れない**。 Proxy の `ownKeys` は「名前の並びを返す」 のが\n * 仕事で、 その並びは trap の中で作られる。 こちらが受け取った時点で既に在るため、 長さを見て\n * 拒んでも確保そのものは起きた後になる。 これは呼ぶ側の code が確保するもので、 同じ process に\n * 任意の object を渡せる相手は、 この関数を通さずに同じことができる。\n *\n * 線を引くのは、 5 round にわたって「読む前に量を作れる経路」 を潰し続けた末に、 残りが\n * 呼ぶ側の code の中に移ったため。 潰す対象が自分の外に出た時点で、 この関数の責務ではない。\n */\nfunction 素のデータに写す(\n root: unknown,\n): { ok: true; value: unknown } | { ok: false; error: JsonDslError } {\n const 写し済 = new WeakMap<object, unknown[] | Record<string, unknown>>();\n let 項目数 = 0;\n // 例外を拾った時に「どこを読んでいたか」 を言うために持つ。 投げるのは値を読む所と名前を\n // 数える所の両方で、 どちらも path を持たないまま外へ出ると `$` としか言えない\n let 読んでいる場所 = \"$\";\n\n /**\n * まだ中身を埋めていない入れ物と、 その進み具合。\n *\n * 配列は名前の並びを持たず長さだけを持つ (Round 6 の指摘)。 添字を文字の並びとして実体化すると、\n * **上限を見る前にその並びを作ってしまう** (実測 = `new Array(5_000_001)` で 500 万個の添字を\n * 作ろうとした)。 添字は数から導けるので持つ必要がない。\n */\n type 枠 = {\n 元: object;\n 器: unknown[] | Record<string, unknown>;\n /** object の時だけ持つ。 配列は `長さ` を使う */\n 名前の並び: string[] | null;\n 長さ: number;\n 次: number;\n 深さ: number;\n path: string;\n };\n\n /** 入れ物だけ作る (ここでは降りない)。 新しく作った時だけ枠を返す */\n const 器を作る = (\n v: unknown,\n 深さ: number,\n path: string,\n ): { 値: unknown; 枠: 枠 | null } => {\n 項目数 += 1;\n if (項目数 > 写しの最大の項目数) {\n throw new 写せない(path, `項目が多すぎる (上限 ${写しの最大の項目数})`);\n }\n if (v === null || typeof v !== \"object\") return { 値: v, 枠: null };\n\n const 既にある = 写し済.get(v);\n if (既にある !== undefined) return { 値: 既にある, 枠: null };\n\n if (深さ >= 写しの最大の深さ) {\n throw new 写せない(path, `入れ子が深すぎる (上限 ${写しの最大の深さ})`);\n }\n 読んでいる場所 = path;\n const 並びか = Array.isArray(v);\n const 器: unknown[] | Record<string, unknown> = 並びか ? [] : {};\n 写し済.set(v, 器);\n\n if (並びか) {\n // **長さを先に見てから降りる** (Round 6 の指摘)。 添字を文字の並びとして作ると、 上限を\n // 見る前にその並びを作ってしまう。 長さは数を読むだけなので何も作らない。\n //\n // **長さは正規化してから使う** (Round 7 の指摘)。 `Array.from({ length })` は仕様の\n // `ToLength` を通しており、 生の値をそのまま使うと 2 つの形で壊れる。\n //\n // | `length` が返す値 | 正規化しないと |\n // |---|---|\n // | `2.5` | 3 回読む (`Array.from` は 2 要素) |\n // | `NaN` | 数の合計が `NaN` になり、 上限も終わりも判定できず読み続ける |\n //\n // `ToLength` と同じく 0 へ丸め、 0 以上 2^53-1 以下に収める。\n //\n // **数に直すのは単項 `+`** (Round 8 の指摘)。 `Number()` は `BigInt` を通してしまうが、\n // 仕様の `ToNumber` は `TypeError` を投げる = `Array.from({ length: 2n })` は投げる。\n // 単項 `+` は `ToNumber` そのものなので、 投げる形も含めて元の挙動と揃う (投げた分は\n // 下の `catch` が検査の誤りに変える)。\n const 生の長さ = +(v as unknown[]).length;\n const 長さ = Number.isNaN(生の長さ)\n ? 0\n : Math.min(Math.max(Math.trunc(生の長さ), 0), Number.MAX_SAFE_INTEGER);\n 項目数 += 長さ;\n if (項目数 > 写しの最大の項目数) {\n throw new 写せない(path, `項目が多すぎる (上限 ${写しの最大の項目数})`);\n }\n return { 値: 器, 枠: { 元: v, 器, 名前の並び: null, 長さ, 次: 0, 深さ, path } };\n }\n\n // **名前も数に入れる** (Round 5 の指摘)。 値を読む前に名前の一覧を作るため、 値だけを\n // 数えると「名前が 20,000 個ある段を 63 回降りる」 形で 126 万個を並べられる = 上限を\n // 見る前に資源を使い切れる\n const 名前の並び = Object.keys(v as Record<string, unknown>);\n 項目数 += 名前の並び.length;\n if (項目数 > 写しの最大の項目数) {\n throw new 写せない(path, `項目が多すぎる (上限 ${写しの最大の項目数})`);\n }\n return { 値: 器, 枠: { 元: v, 器, 名前の並び, 長さ: 名前の並び.length, 次: 0, 深さ, path } };\n };\n\n try {\n const 先頭 = 器を作る(root, 0, \"$\");\n const 積み: 枠[] = 先頭.枠 ? [先頭.枠] : [];\n\n while (積み.length > 0) {\n const 今 = 積み[積み.length - 1]!;\n if (今.次 >= 今.長さ) {\n 積み.pop();\n continue;\n }\n // 配列は添字をその場で作る (並びとして持たない)\n const key = 今.名前の並び === null ? String(今.次) : 今.名前の並び[今.次]!;\n 今.次 += 1;\n const 子のpath = 今.名前の並び === null ? `${今.path}[${key}]` : `${今.path}.${key}`;\n\n // 読む直前に場所を控える = 値の読み取りそのものが投げるため、 読んだ後では遅い\n 読んでいる場所 = 子のpath;\n const 生の値 = (今.元 as Record<string, unknown>)[key];\n\n const 子 = 器を作る(生の値, 今.深さ + 1, 子のpath);\n if (Array.isArray(今.器)) 今.器.push(子.値);\n else {\n Object.defineProperty(今.器, key, {\n value: 子.値,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n // 深さ優先で降りる = 次の兄弟を読む前に、 この子の中身を全部読む\n if (子.枠) 積み.push(子.枠);\n }\n return { ok: true, value: 先頭.値 };\n } catch (e) {\n if (e instanceof 写せない) {\n return { ok: false, error: { path: e.path, message: e.理由 } };\n }\n // getter / Proxy が投げた形。 約束どおり誤りとして返す (throw しない)\n return {\n ok: false,\n error: {\n path: 読んでいる場所,\n message: \"入力を読み取れない\",\n hint: e instanceof Error ? e.message : String(e),\n },\n };\n }\n}\n\nfunction validateJson(json: unknown): { ok: true; data: DragonJson } | { ok: false; errors: JsonDslError[] } {\n const errors: JsonDslError[] = [];\n // root の形は写しより先に見る = 形が違う入力には従来どおり `root must be a JSON object` を\n // 返すため。 写した後に見ると、 root が配列の入力で中の getter が先に動き、 別の誤りに化ける\n // (Round 3 の指摘)。\n //\n // ただし `Array.isArray` は失効した Proxy で `TypeError` を投げる (Round 2 の指摘)。 判定\n // そのものを受けて、 投げた形は「読み取れない」 として返す。\n let rootがobjectか: boolean;\n try {\n rootがobjectか = !!json && typeof json === \"object\" && !Array.isArray(json);\n } catch (e) {\n return {\n ok: false,\n errors: [\n {\n path: \"$\",\n message: \"入力を読み取れない\",\n hint: e instanceof Error ? e.message : String(e),\n },\n ],\n };\n }\n if (!rootがobjectか) {\n return { ok: false, errors: [{ path: \"$\", message: \"root must be a JSON object\" }] };\n }\n\n // 以降は写しだけを読む。 元の object には二度と触らない (#1217)\n const 写し = 素のデータに写す(json);\n if (!写し.ok) return { ok: false, errors: [写し.error] };\n const j = 写し.value 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 // 図表の箱の上の小見出し (#1247)。 空文字は「書かなかった」 と同じ扱いにするため通す\n // (記法側の `eyebrow:` と揃える。 落とすのは `jsonToDoc`)\n if (j.eyebrow !== undefined && typeof j.eyebrow !== \"string\") {\n errors.push({ path: \"$.eyebrow\", message: \"eyebrow must be a string if present\" });\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 validatePhaseMotion(po, i, errors);\n });\n }\n }\n validateStates(j.states, errors);\n validateValues(j.values, errors);\n if (errors.length > 0) return { ok: false, errors };\n return { ok: true, data: j as unknown as DragonJson };\n}\n\n/**\n * 段の中で値を動かす指定を見る (#1186)。\n *\n * 状態名の記法は `states:` と同じ判定を使う。 参照先はこの JSON の `states` だけでは決めない。\n * 見本や preset が持つ状態を動かす指定もあるためで、記法側と同じく compile 後の図で解決する。\n */\nfunction validatePhaseMotion(\n po: Record<string, unknown>,\n i: number,\n errors: JsonDslError[],\n): void {\n if (po.tween !== undefined) {\n if (!po.tween || typeof po.tween !== \"object\" || Array.isArray(po.tween)) {\n errors.push({\n path: `$.animation[${i}].tween`,\n message: \"tween must be a plain object of state -> [from, to]\",\n });\n } else {\n for (const [name, range] of Object.entries(po.tween as Record<string, unknown>)) {\n const path = `$.animation[${i}].tween.${name}`;\n if (!isValueName(name)) errors.push({ path, ...valueNameIssue(name) });\n if (!Array.isArray(range) || range.length !== 2) {\n errors.push({ path, message: \"tween value must be [from, to]\" });\n continue;\n }\n // 補間は数どうしでしか成り立たない。 文字列を通すと描画側が数として読めず\n // 段の途中が壊れる (記法側も数だけを受ける)\n for (const v of range) {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n errors.push({ path, message: \"tween value must be finite numbers\", hint: `got ${typeof v}` });\n break;\n }\n }\n }\n }\n }\n\n if (po.set !== undefined) {\n if (!po.set || typeof po.set !== \"object\" || Array.isArray(po.set)) {\n errors.push({\n path: `$.animation[${i}].set`,\n message: \"set must be a plain object of state -> value\",\n });\n } else {\n for (const [name, value] of Object.entries(po.set as Record<string, unknown>)) {\n const path = `$.animation[${i}].set.${name}`;\n if (!isValueName(name)) errors.push({ path, ...valueNameIssue(name) });\n const t = typeof value;\n if (t !== \"number\" && t !== \"string\") {\n errors.push({ path, message: \"set value must be a number or string\", hint: `got ${t}` });\n } else if (t === \"number\" && !Number.isFinite(value as number)) {\n errors.push({ path, message: \"set value must be a finite number\" });\n }\n }\n }\n }\n}\n\n/**\n * 状態の初期値を見る (#1181)。\n *\n * 名前の判定は記法と同じものを使う (`value-syntax.ts`)。 別々に持つと、YAML では弾かれる\n * 名前が JSON では通る形ができ、描画側が `{名前}` を置き換えられない図が生まれる。\n */\nfunction validateStates(v: unknown, errors: JsonDslError[]): void {\n if (v === undefined) return;\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push({ path: \"$.states\", message: \"states must be a plain object of name -> initial value\" });\n return;\n }\n for (const [name, initial] of Object.entries(v as Record<string, unknown>)) {\n if (!isValueName(name)) {\n errors.push({ path: `$.states.${name}`, ...valueNameIssue(name) });\n }\n const t = typeof initial;\n if (t !== \"number\" && t !== \"string\") {\n errors.push({\n path: `$.states.${name}`,\n message: \"state initial must be a number or string\",\n hint: `got ${t}`,\n });\n } else if (t === \"number\" && !Number.isFinite(initial as number)) {\n // `NaN` / `Infinity` は JSON には書けないが、object を直接渡す経路では届く。\n // 描画側は文字列に直して式に流すため、そのまま通すと計算が全て壊れる\n errors.push({ path: `$.states.${name}`, message: \"state initial must be a finite number\" });\n }\n }\n}\n\n/**\n * 他の値から決まる値を見る (#1181)。\n *\n * 名前と式の判定は記法と同じものを使う。 式が文法として正しいかまでは見ない (描画側が\n * 評価する時に判定して、その値だけを止める = spec § 4.2)。\n */\nfunction validateValues(v: unknown, errors: JsonDslError[]): void {\n if (v === undefined) return;\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push({ path: \"$.values\", message: \"values must be a plain object of name -> expression\" });\n return;\n }\n for (const [name, expression] of Object.entries(v as Record<string, unknown>)) {\n if (!isValueName(name)) {\n errors.push({ path: `$.values.${name}`, ...valueNameIssue(name) });\n }\n if (typeof expression !== \"string\" || expression.trim() === \"\") {\n errors.push({\n path: `$.values.${name}`,\n message: \"value expression must be a non-empty string\",\n hint: '`\"{inflow} - {done}\"` の形で書く',\n });\n continue;\n }\n for (const issue of checkValueExpression(expression, name)) {\n errors.push({ path: `$.values.${name}`, ...issue });\n }\n }\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 */\n/**\n * 図表の箱の上の小見出しを、 記法側と同じ形に整える (#1247)。\n *\n * 記法は値を `trim()` してから空かどうかを見る。 JSON でも同じ順で見ないと、 空白だけの値が\n * 入口によって別の意味になる (記法は書かなかった扱い、 JSON は中身のない帯)。\n */\nfunction 整えた小見出し(v: string | undefined): string | undefined {\n if (v === undefined) return undefined;\n const t = v.trim();\n return t.length > 0 ? t : undefined;\n}\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 overlay: s.overlay,\n // CAR-1693 Phase 1: DSL 表面 pos → 内部 AST layoutPos\n layoutPos: s.pos,\n pos: p0,\n }));\n // 状態は段が無くても図に載る (#1162 で組み立ての出口が載せる)。 **段の有無で分けない** =\n // 分けると `states` だけを書いた JSON で値が 1 つも届かない (記法側で起きていた形、 #1181)\n const states: DslState[] = Object.entries(json.states ?? {}).map(([name, initial]) => ({\n name,\n initial,\n pos: p0,\n }));\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 // 段の中で動かす分 (#1186)。 記法側の `tweens` / `sets` と同じ形に写す。\n // 空の配列を置かないのは、記法側が「無ければ field ごと持たない」 形だから\n ...(p.tween && Object.keys(p.tween).length > 0\n ? {\n tweens: Object.entries(p.tween).map(([state, [from, to]]) => ({ state, from, to, pos: p0 })),\n }\n : {}),\n ...(p.set && Object.keys(p.set).length > 0\n ? { sets: Object.entries(p.set).map(([state, value]) => ({ state, value, pos: p0 })) }\n : {}),\n pos: p0,\n }));\n const animate: DslAnimate | undefined =\n states.length > 0 || phases.length > 0 ? { states, phases, pos: p0 } : undefined;\n return {\n title: json.title,\n type: json.type,\n // 前後の空白を落としてから見る。 記法側 (`v05/parser.ts`) が `trim()` してから\n // 空かどうかを判定するため、 揃えないと **空白だけの値で入口ごとに図が変わる**\n // (記法は書かなかった扱い、 JSON は中身のない帯を描く。 Round 2 の指摘で実測)\n ...(整えた小見出し(json.eyebrow) !== undefined\n ? { eyebrow: 整えた小見出し(json.eyebrow), eyebrowPos: p0 }\n : {}),\n actors,\n flow,\n animate,\n // 他の値から決まる値 (#1181)。 書いた順に並べる = 解く順は参照から決まるので順序に\n // 意味は無いが、知らせの並びが書いた順になる\n values: json.values\n ? Object.entries(json.values).map(([name, expression]) => ({ name, expression, pos: p0 }))\n : undefined,\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 // **`onNotice` も通す**。 記法経路だけに通知を付けていたため、 同じ型を受ける JSON / YAML\n // 経路では読めない値や捨てた矢印が利用者へ届かなかった (review 指摘)。 エディタの YAML タブは\n // ここを通る\n opts?: { partsCatalog?: Record<string, CdlDiagram>; onNotice?: CompileToCdlOpts[\"onNotice\"] },\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\", \"bar\", \"line\", \"funnel\", \"tree\", \"journey\", \"quadrant\", \"c4\", \"mind\"],\n \"description\": \"図の種類。 型ごとに actors の書き方が違う。 [関係を描く] sequence (時系列の呼び出し) / flow (処理の流れ) / swimlane (責務ごとの流れ) / er (DB の schema) / state (状態の遷移) / topology (network) / solidity (contract) / class (UML の class) / c4 (architecture) / mind (発想の枝分かれ) は actors に名前を並べ flow に矢印を書く。 [値を描く] pie (割合) / bar (棒の高さ) / line (線の高さ、 書いた順に並ぶ) は actors に `- 名前: \\\"45\\\"` の形で数を書く。 funnel (段ごとに減る数) も同じ形。 [語を描く] journey (体験の起伏) は `- 登録: \\\"不満\\\"` の形で 最高 / 満足 / 普通 / 不満 / 怒り のどれかを書く。 quadrant (2 軸の仕分け) は `- 重複削除: \\\"左上\\\"` の形で 左上 / 右上 / 左下 / 右下 のどれかを書く。 [時期を描く] gantt (工程の並び) は `- 設計: \\\"1月\\\"` の形で始まりの時期を書き、 flow の矢印で前後関係を書く。 [親子を描く] tree (親子の入れ子) は actors に名前を並べ flow の矢印で親子を書く (矢印の先が子)\"\n },\n \"eyebrow\": {\n \"type\": \"string\",\n \"description\": \"図表の箱の上に出す小見出し (省略可)。 効くのは図全体を 1 箱にする型 (pie / bar / line / funnel / tree / journey / quadrant / mind / gantt) だけ。 箱ごとに分かれる型では相手が決まらないため、 actors[].eyebrow に書く\"\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 \"overlay\": {\"type\": \"boolean\", \"description\": \"true で説明文を矢印の線の上に重ねる (分岐図の条件ラベル用)\"}\n }\n }\n },\n \"states\": {\n \"type\": \"object\",\n \"description\": \"状態の初期値。 名前 -> 初期値 の object。 optional。 箱の文字に `{名前}` を置くと、 ここに書いた値が描画時に置き換わる。 段で動かすには animation[].tween / animation[].set を使う。\",\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^[a-zA-Z_][a-zA-Z0-9_]*$\": {\n \"type\": [\"number\", \"string\"],\n \"description\": \"初期値。 数か文字列。 名前は英字か _ で始め、 英数字と _ だけを使う\"\n }\n },\n \"examples\": [{ \"inflow\": 0, \"done\": 0 }]\n },\n \"values\": {\n \"type\": \"object\",\n \"description\": \"他の値から自動で決まる値。 名前 -> 式 の object。 optional。 式には四則 (+ - * /) と括弧、 比較 (> >= < <= == !=)、 min / max が書ける。 他の値は {名前} で読む。 解くのは描画側で、 参照した値が動けば追随する。\",\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^[a-zA-Z_][a-zA-Z0-9_]*$\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"式。 例 `{inflow} - {done}`\"\n }\n },\n \"examples\": [{ \"waiting\": \"{inflow} - {done}\", \"busy\": \"{waiting} > 80\" }]\n },\n \"animation\": {\n \"type\": \"array\",\n \"description\": \"アニメーション phase 配列。 各 phase で focus 対象を highlight し、 tween / set で states の値を動かす。 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 \"tween\": {\n \"type\": \"object\",\n \"description\": \"この phase で補間する状態。 状態名 -> [開始値, 終了値]。 名前は英字か _ で始め、 英数字と _ だけを使う\",\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^[a-zA-Z_][a-zA-Z0-9_]*$\": {\n \"type\": \"array\",\n \"items\": {\"type\": \"number\"},\n \"minItems\": 2,\n \"maxItems\": 2\n }\n }\n },\n \"set\": {\n \"type\": \"object\",\n \"description\": \"この phase の切替で差し替える状態。 状態名 -> 値。 名前は英字か _ で始め、 英数字と _ だけを使う\",\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^[a-zA-Z_][a-zA-Z0-9_]*$\": {\"type\": [\"number\", \"string\"]}\n }\n }\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, TOP_LEVEL_KEYS } 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 // `DslDocument.values` を触る利用者が型を import できるようにする (#1169)。\n // 兄弟の `DslState` / `DslTween` / `DslSet` は公開されており、これだけ漏れていた\n DslValue,\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"]}
|