update architecture docs for split MCP files, new clusters, Langfuse, and EC2 deploy

This commit is contained in:
2026-04-16 13:04:44 -03:00
parent 69441fa180
commit a8e55a4a8d
5 changed files with 530 additions and 469 deletions

View File

@@ -4,339 +4,334 @@
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: repo_structure Pages: 1 -->
<svg style="background:#0a0e17" width="4414pt" height="498pt"
viewBox="0.00 0.00 4414.00 498.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(2 2) rotate(0) translate(4 245)">
<svg width="2239pt" height="236pt"
viewBox="0.00 0.00 2239.00 236.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 232.25)">
<title>repo_structure</title>
<polygon fill="#0a0e17" stroke="none" points="-4,4 -4,-245 2203,-245 2203,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="1099.5" y="-223.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#0066ff">Repository Structure</text>
<polygon fill="#0a0e17" stroke="none" points="-4,4 -4,-232.25 2235.25,-232.25 2235.25,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="1115.62" y="-210.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#0066ff">Repository Structure</text>
<!-- root -->
<g id="node1" class="node">
<title>root</title>
<polygon fill="#0066ff" stroke="#1e2a4a" points="1454.75,-215.75 1451.75,-219.75 1430.75,-219.75 1427.75,-215.75 1384,-215.75 1384,-179.75 1454.75,-179.75 1454.75,-215.75"/>
<text xml:space="preserve" text-anchor="middle" x="1419.38" y="-194.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">stellar&#45;ops/</text>
<polygon fill="#0066ff" stroke="#1e2a4a" points="1794.75,-203 1791.75,-207 1770.75,-207 1767.75,-203 1724,-203 1724,-167 1794.75,-167 1794.75,-203"/>
<text xml:space="preserve" text-anchor="middle" x="1759.38" y="-181.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">stellar&#45;ops/</text>
</g>
<!-- mcp -->
<g id="node2" class="node">
<title>mcp</title>
<polygon fill="#121829" stroke="#1e2a4a" points="434,-143.75 431,-147.75 410,-147.75 407,-143.75 352.75,-143.75 352.75,-107.75 434,-107.75 434,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="393.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mcp_servers/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="636,-131 633,-135 612,-135 609,-131 554.75,-131 554.75,-95 636,-95 636,-131"/>
<text xml:space="preserve" text-anchor="middle" x="595.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mcp_servers/</text>
</g>
<!-- root&#45;&gt;mcp -->
<g id="edge1" class="edge">
<title>root&#45;&gt;mcp</title>
<path fill="none" stroke="#1e2a4a" d="M1383.76,-194.32C1229.15,-183.77 616.05,-141.94 440.54,-129.97"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="440.85,-128.24 435.75,-129.64 440.62,-131.73 440.85,-128.24"/>
<path fill="none" stroke="#1e2a4a" d="M1723.58,-181.85C1554.39,-171.67 835.03,-128.41 642.78,-116.85"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="643.04,-115.11 637.94,-116.56 642.83,-118.61 643.04,-115.11"/>
</g>
<!-- agents -->
<g id="node3" class="node">
<title>agents</title>
<polygon fill="#121829" stroke="#1e2a4a" points="843.38,-143.75 840.38,-147.75 819.38,-147.75 816.38,-143.75 789.38,-143.75 789.38,-107.75 843.38,-107.75 843.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="816.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">agents/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="1119.38,-131 1116.38,-135 1095.38,-135 1092.38,-131 1065.38,-131 1065.38,-95 1119.38,-95 1119.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1092.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">agents/</text>
</g>
<!-- root&#45;&gt;agents -->
<g id="edge2" class="edge">
<title>root&#45;&gt;agents</title>
<path fill="none" stroke="#1e2a4a" d="M1383.91,-192.63C1276.34,-180.15 954.77,-142.82 849.87,-130.64"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="850.24,-128.92 845.07,-130.08 849.84,-132.4 850.24,-128.92"/>
</g>
<!-- irrop -->
<g id="node4" class="node">
<title>irrop</title>
<polygon fill="#121829" stroke="#1e2a4a" points="1177.38,-143.75 1174.38,-147.75 1153.38,-147.75 1150.38,-143.75 1123.38,-143.75 1123.38,-107.75 1177.38,-107.75 1177.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="1150.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">irrop/</text>
</g>
<!-- root&#45;&gt;irrop -->
<g id="edge3" class="edge">
<title>root&#45;&gt;irrop</title>
<path fill="none" stroke="#1e2a4a" d="M1383.65,-187.45C1331.44,-173.87 1234.95,-148.76 1183.97,-135.49"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1184.43,-133.8 1179.15,-134.24 1183.54,-137.19 1184.43,-133.8"/>
<path fill="none" stroke="#1e2a4a" d="M1723.51,-180.24C1606.91,-168 1239.52,-129.44 1126.08,-117.54"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1126.26,-115.8 1121.11,-117.02 1125.9,-119.28 1126.26,-115.8"/>
</g>
<!-- api -->
<g id="node5" class="node">
<g id="node4" class="node">
<title>api</title>
<polygon fill="#121829" stroke="#1e2a4a" points="1446.38,-143.75 1443.38,-147.75 1422.38,-147.75 1419.38,-143.75 1392.38,-143.75 1392.38,-107.75 1446.38,-107.75 1446.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="1419.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">api/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="1473.38,-131 1470.38,-135 1449.38,-135 1446.38,-131 1419.38,-131 1419.38,-95 1473.38,-95 1473.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1446.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">api/</text>
</g>
<!-- root&#45;&gt;api -->
<g id="edge4" class="edge">
<g id="edge3" class="edge">
<title>root&#45;&gt;api</title>
<path fill="none" stroke="#1e2a4a" d="M1419.38,-179.45C1419.38,-170.63 1419.38,-159.78 1419.38,-150.22"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1421.13,-150.37 1419.38,-145.37 1417.63,-150.37 1421.13,-150.37"/>
<path fill="none" stroke="#1e2a4a" d="M1723.77,-176.04C1662.86,-162.42 1539.48,-134.82 1479.97,-121.51"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1480.47,-119.83 1475.2,-120.45 1479.7,-123.25 1480.47,-119.83"/>
</g>
<!-- ui_root -->
<g id="node6" class="node">
<g id="node5" class="node">
<title>ui_root</title>
<polygon fill="#121829" stroke="#1e2a4a" points="1658.38,-143.75 1655.38,-147.75 1634.38,-147.75 1631.38,-143.75 1604.38,-143.75 1604.38,-107.75 1658.38,-107.75 1658.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="1631.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ui/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="1750.38,-131 1747.38,-135 1726.38,-135 1723.38,-131 1696.38,-131 1696.38,-95 1750.38,-95 1750.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1723.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ui/</text>
</g>
<!-- root&#45;&gt;ui_root -->
<g id="edge5" class="edge">
<g id="edge4" class="edge">
<title>root&#45;&gt;ui_root</title>
<path fill="none" stroke="#1e2a4a" d="M1454.86,-185.03C1494.69,-171.88 1558.84,-150.7 1597.85,-137.82"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1598.25,-139.53 1602.45,-136.3 1597.15,-136.21 1598.25,-139.53"/>
<path fill="none" stroke="#1e2a4a" d="M1750.48,-166.7C1745.81,-157.63 1740.04,-146.4 1735.02,-136.65"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1736.71,-136.1 1732.86,-132.45 1733.59,-137.7 1736.71,-136.1"/>
</g>
<!-- ctrl -->
<g id="node7" class="node">
<g id="node6" class="node">
<title>ctrl</title>
<polygon fill="#121829" stroke="#1e2a4a" points="1932.38,-143.75 1929.38,-147.75 1908.38,-147.75 1905.38,-143.75 1878.38,-143.75 1878.38,-107.75 1932.38,-107.75 1932.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="1905.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ctrl/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="1846.38,-131 1843.38,-135 1822.38,-135 1819.38,-131 1792.38,-131 1792.38,-95 1846.38,-95 1846.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1819.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ctrl/</text>
</g>
<!-- root&#45;&gt;ctrl -->
<g id="edge6" class="edge">
<g id="edge5" class="edge">
<title>root&#45;&gt;ctrl</title>
<path fill="none" stroke="#1e2a4a" d="M1455.11,-191.6C1545.68,-178.56 1783.28,-144.34 1871.64,-131.61"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1871.79,-133.36 1876.49,-130.91 1871.29,-129.89 1871.79,-133.36"/>
<path fill="none" stroke="#1e2a4a" d="M1774.21,-166.7C1782.2,-157.37 1792.14,-145.77 1800.66,-135.83"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1801.8,-137.19 1803.73,-132.25 1799.15,-134.91 1801.8,-137.19"/>
</g>
<!-- tests -->
<g id="node7" class="node">
<title>tests</title>
<polygon fill="#121829" stroke="#1e2a4a" points="1918.38,-131 1915.38,-135 1894.38,-135 1891.38,-131 1864.38,-131 1864.38,-95 1918.38,-95 1918.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1891.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tests/</text>
</g>
<!-- root&#45;&gt;tests -->
<g id="edge6" class="edge">
<title>root&#45;&gt;tests</title>
<path fill="none" stroke="#1e2a4a" d="M1792.34,-166.52C1812.59,-155.78 1838.41,-142.09 1858.62,-131.37"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1859.22,-133.03 1862.82,-129.14 1857.58,-129.94 1859.22,-133.03"/>
</g>
<!-- woodpecker -->
<g id="node8" class="node">
<title>woodpecker</title>
<polygon fill="#121829" stroke="#1e2a4a" points="2016.62,-131 2013.62,-135 1992.62,-135 1989.62,-131 1936.12,-131 1936.12,-95 2016.62,-95 2016.62,-131"/>
<text xml:space="preserve" text-anchor="middle" x="1976.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">.woodpecker/</text>
</g>
<!-- root&#45;&gt;woodpecker -->
<g id="edge7" class="edge">
<title>root&#45;&gt;woodpecker</title>
<path fill="none" stroke="#1e2a4a" d="M1795.19,-173.02C1829.27,-162.5 1881.94,-146.05 1927.38,-131 1928.14,-130.75 1928.92,-130.49 1929.7,-130.23"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1930.15,-131.92 1934.33,-128.67 1929.03,-128.61 1930.15,-131.92"/>
</g>
<!-- docs -->
<g id="node8" class="node">
<g id="node9" class="node">
<title>docs</title>
<polygon fill="#121829" stroke="#1e2a4a" points="2004.38,-143.75 2001.38,-147.75 1980.38,-147.75 1977.38,-143.75 1950.38,-143.75 1950.38,-107.75 2004.38,-107.75 2004.38,-143.75"/>
<text xml:space="preserve" text-anchor="middle" x="1977.38" y="-122.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">docs/</text>
<polygon fill="#121829" stroke="#1e2a4a" points="2088.38,-131 2085.38,-135 2064.38,-135 2061.38,-131 2034.38,-131 2034.38,-95 2088.38,-95 2088.38,-131"/>
<text xml:space="preserve" text-anchor="middle" x="2061.38" y="-109.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">docs/</text>
</g>
<!-- root&#45;&gt;docs -->
<g id="edge7" class="edge">
<g id="edge8" class="edge">
<title>root&#45;&gt;docs</title>
<path fill="none" stroke="#1e2a4a" d="M1454.96,-197.25C1540.48,-197.56 1763.66,-193.16 1941.38,-143.75 1942.29,-143.5 1943.21,-143.22 1944.14,-142.92"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1944.69,-144.59 1948.8,-141.25 1943.51,-141.29 1944.69,-144.59"/>
<path fill="none" stroke="#1e2a4a" d="M1794.94,-179.73C1846.63,-172.9 1945.11,-157.5 2025.38,-131 2026.28,-130.7 2027.19,-130.39 2028.1,-130.06"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="2028.71,-131.7 2032.73,-128.25 2027.44,-128.44 2028.71,-131.7"/>
</g>
<!-- mcp_shared -->
<g id="node9" class="node">
<g id="node10" class="node">
<title>mcp_shared</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="142.75,-59 0,-59 0,-12.75 142.75,-12.75 142.75,-59"/>
<text xml:space="preserve" text-anchor="middle" x="71.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">shared/</text>
<text xml:space="preserve" text-anchor="middle" x="71.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="71.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools/ resources/ prompts/</text>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="190.75,-52.62 0,-52.62 0,-6.38 190.75,-6.38 190.75,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="95.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">shared/</text>
<text xml:space="preserve" text-anchor="middle" x="95.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="95.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools.py · resources.py · prompts.py</text>
</g>
<!-- mcp&#45;&gt;mcp_shared -->
<g id="edge8" class="edge">
<g id="edge9" class="edge">
<title>mcp&#45;&gt;mcp_shared</title>
<path fill="none" stroke="#1e2a4a" d="M352.67,-118.24C304.25,-109.93 221.29,-93.94 152.38,-71.75 143.53,-68.9 134.32,-65.44 125.43,-61.82"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="126.32,-60.3 121.03,-60.01 124.98,-63.53 126.32,-60.3"/>
<path fill="none" stroke="#1e2a4a" d="M554.42,-108.3C482.36,-101.39 328.39,-84.84 200.38,-59 193.85,-57.68 187.14,-56.19 180.41,-54.59"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="180.97,-52.93 175.7,-53.45 180.15,-56.33 180.97,-52.93"/>
</g>
<!-- mcp_ops -->
<g id="node10" class="node">
<g id="node11" class="node">
<title>mcp_ops</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="303.75,-59 161,-59 161,-12.75 303.75,-12.75 303.75,-59"/>
<text xml:space="preserve" text-anchor="middle" x="232.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ops/</text>
<text xml:space="preserve" text-anchor="middle" x="232.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="232.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools/ resources/ prompts/</text>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="399.75,-52.62 209,-52.62 209,-6.38 399.75,-6.38 399.75,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="304.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ops/</text>
<text xml:space="preserve" text-anchor="middle" x="304.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="304.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools.py · resources.py · prompts.py</text>
</g>
<!-- mcp&#45;&gt;mcp_ops -->
<g id="edge9" class="edge">
<g id="edge10" class="edge">
<title>mcp&#45;&gt;mcp_ops</title>
<path fill="none" stroke="#1e2a4a" d="M361.57,-107.39C338.04,-94.55 305.62,-76.85 279.15,-62.4"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="280.15,-60.96 274.92,-60.1 278.47,-64.03 280.15,-60.96"/>
<path fill="none" stroke="#1e2a4a" d="M554.3,-100.5C512.14,-88.69 445.24,-69.95 391.27,-54.84"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="391.83,-53.18 386.55,-53.51 390.89,-56.55 391.83,-53.18"/>
</g>
<!-- mcp_pax -->
<g id="node11" class="node">
<g id="node12" class="node">
<title>mcp_pax</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="464.75,-59 322,-59 322,-12.75 464.75,-12.75 464.75,-59"/>
<text xml:space="preserve" text-anchor="middle" x="393.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">passenger/</text>
<text xml:space="preserve" text-anchor="middle" x="393.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="393.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools/ resources/ prompts/</text>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="608.75,-52.62 418,-52.62 418,-6.38 608.75,-6.38 608.75,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="513.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">passenger/</text>
<text xml:space="preserve" text-anchor="middle" x="513.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">server.py</text>
<text xml:space="preserve" text-anchor="middle" x="513.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tools.py · resources.py · prompts.py</text>
</g>
<!-- mcp&#45;&gt;mcp_pax -->
<g id="edge10" class="edge">
<g id="edge11" class="edge">
<title>mcp&#45;&gt;mcp_pax</title>
<path fill="none" stroke="#1e2a4a" d="M393.38,-107.39C393.38,-95.42 393.38,-79.23 393.38,-65.38"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="395.13,-65.72 393.38,-60.72 391.63,-65.72 395.13,-65.72"/>
<path fill="none" stroke="#1e2a4a" d="M577.98,-94.72C567.1,-83.9 552.84,-69.73 540.49,-57.45"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="541.89,-56.38 537.11,-54.09 539.43,-58.86 541.89,-56.38"/>
</g>
<!-- mcp_llm -->
<g id="node13" class="node">
<title>mcp_llm</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="726.38,-52.62 626.38,-52.62 626.38,-6.38 726.38,-6.38 726.38,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="676.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">shared_llm.py</text>
<text xml:space="preserve" text-anchor="middle" x="676.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Groq · Anthropic</text>
<text xml:space="preserve" text-anchor="middle" x="676.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Bedrock · OpenAI</text>
</g>
<!-- mcp&#45;&gt;mcp_llm -->
<g id="edge12" class="edge">
<title>mcp&#45;&gt;mcp_llm</title>
<path fill="none" stroke="#1e2a4a" d="M612.55,-94.72C623.31,-83.9 637.39,-69.73 649.59,-57.45"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="650.64,-58.88 652.92,-54.1 648.15,-56.41 650.64,-58.88"/>
</g>
<!-- mcp_data -->
<g id="node12" class="node">
<g id="node14" class="node">
<title>mcp_data</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="614.12,-71.75 482.62,-71.75 482.62,0 614.12,0 614.12,-71.75"/>
<text xml:space="preserve" text-anchor="middle" x="548.38" y="-58.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">data/</text>
<text xml:space="preserve" text-anchor="middle" x="548.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">models.py</text>
<text xml:space="preserve" text-anchor="middle" x="548.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">real/ (openmeteo, faa)</text>
<text xml:space="preserve" text-anchor="middle" x="548.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mock/</text>
<text xml:space="preserve" text-anchor="middle" x="548.38" y="-7.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">scenarios/ (4 scenarios)</text>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="876.12,-59 744.62,-59 744.62,0 876.12,0 876.12,-59"/>
<text xml:space="preserve" text-anchor="middle" x="810.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">data/</text>
<text xml:space="preserve" text-anchor="middle" x="810.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">models.py</text>
<text xml:space="preserve" text-anchor="middle" x="810.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">real/ (openmeteo, faa)</text>
<text xml:space="preserve" text-anchor="middle" x="810.38" y="-7.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">scenarios/ (4 scenarios)</text>
</g>
<!-- mcp&#45;&gt;mcp_data -->
<g id="edge11" class="edge">
<g id="edge13" class="edge">
<title>mcp&#45;&gt;mcp_data</title>
<path fill="none" stroke="#1e2a4a" d="M424,-107.39C440.21,-98.2 460.8,-86.52 480.54,-75.33"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="481.28,-76.93 484.77,-72.94 479.55,-73.88 481.28,-76.93"/>
<path fill="none" stroke="#1e2a4a" d="M636.42,-96.48C664.33,-85.92 702.08,-71.63 735.38,-59 736.4,-58.61 737.44,-58.22 738.49,-57.82"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="739.06,-59.47 743.11,-56.06 737.82,-56.2 739.06,-59.47"/>
</g>
<!-- ag_efhas -->
<g id="node13" class="node">
<title>ag_efhas</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="698.12,-53.88 632.62,-53.88 632.62,-17.88 698.12,-17.88 698.12,-53.88"/>
<text xml:space="preserve" text-anchor="middle" x="665.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">fce.py</text>
<text xml:space="preserve" text-anchor="middle" x="665.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">FCE agent</text>
<!-- ag_fce -->
<g id="node15" class="node">
<title>ag_fce</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="960.12,-47.5 894.62,-47.5 894.62,-11.5 960.12,-11.5 960.12,-47.5"/>
<text xml:space="preserve" text-anchor="middle" x="927.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">fce.py</text>
<text xml:space="preserve" text-anchor="middle" x="927.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">FCE agent</text>
</g>
<!-- agents&#45;&gt;ag_efhas -->
<g id="edge12" class="edge">
<title>agents&#45;&gt;ag_efhas</title>
<path fill="none" stroke="#1e2a4a" d="M788.98,-113.62C766.33,-103.91 733.72,-88.74 707.38,-71.75 701.15,-67.74 694.82,-62.93 689.02,-58.18"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="690.4,-57.06 685.44,-55.19 688.16,-59.74 690.4,-57.06"/>
<!-- agents&#45;&gt;ag_fce -->
<g id="edge14" class="edge">
<title>agents&#45;&gt;ag_fce</title>
<path fill="none" stroke="#1e2a4a" d="M1065.29,-102.04C1039.9,-92.31 1001.18,-76.44 969.38,-59 965.14,-56.68 960.79,-54.04 956.57,-51.33"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="957.72,-49.99 952.58,-48.71 955.8,-52.92 957.72,-49.99"/>
</g>
<!-- ag_handover -->
<g id="node14" class="node">
<g id="node16" class="node">
<title>ag_handover</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="810.38,-53.88 716.38,-53.88 716.38,-17.88 810.38,-17.88 810.38,-53.88"/>
<text xml:space="preserve" text-anchor="middle" x="763.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">handover.py</text>
<text xml:space="preserve" text-anchor="middle" x="763.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Handover agent</text>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="1072.38,-47.5 978.38,-47.5 978.38,-11.5 1072.38,-11.5 1072.38,-47.5"/>
<text xml:space="preserve" text-anchor="middle" x="1025.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">handover.py</text>
<text xml:space="preserve" text-anchor="middle" x="1025.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Handover agent</text>
</g>
<!-- agents&#45;&gt;ag_handover -->
<g id="edge13" class="edge">
<g id="edge15" class="edge">
<title>agents&#45;&gt;ag_handover</title>
<path fill="none" stroke="#1e2a4a" d="M805.9,-107.39C797.63,-93.67 786.01,-74.41 777.01,-59.48"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="778.69,-58.87 774.61,-55.5 775.69,-60.68 778.69,-58.87"/>
<path fill="none" stroke="#1e2a4a" d="M1078.17,-94.72C1068.04,-82.4 1054.35,-65.74 1043.44,-52.48"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1045.05,-51.68 1040.52,-48.93 1042.35,-53.9 1045.05,-51.68"/>
</g>
<!-- ag_shared -->
<g id="node15" class="node">
<g id="node17" class="node">
<title>ag_shared</title>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="912.5,-59 828.25,-59 828.25,-12.75 912.5,-12.75 912.5,-59"/>
<text xml:space="preserve" text-anchor="middle" x="870.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">shared/</text>
<text xml:space="preserve" text-anchor="middle" x="870.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mcp_client.py</text>
<text xml:space="preserve" text-anchor="middle" x="870.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">llm.py</text>
<polygon fill="#1a1a3a" stroke="#1e2a4a" points="1230.25,-52.62 1090.5,-52.62 1090.5,-6.38 1230.25,-6.38 1230.25,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1160.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">shared/</text>
<text xml:space="preserve" text-anchor="middle" x="1160.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mcp_client.py</text>
<text xml:space="preserve" text-anchor="middle" x="1160.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">parser.py · tool_runner.py</text>
</g>
<!-- agents&#45;&gt;ag_shared -->
<g id="edge14" class="edge">
<title>agents&#45;&gt;ag_shared</title>
<path fill="none" stroke="#1e2a4a" d="M827.04,-107.39C834.53,-95.2 844.71,-78.64 853.32,-64.64"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="854.73,-65.68 855.86,-60.5 851.75,-63.84 854.73,-65.68"/>
</g>
<!-- ir_models -->
<g id="node16" class="node">
<title>ir_models</title>
<polygon fill="#1a2a1a" stroke="#1e2a4a" points="1027.88,-59 930.88,-59 930.88,-12.75 1027.88,-12.75 1027.88,-59"/>
<text xml:space="preserve" text-anchor="middle" x="979.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">models/</text>
<text xml:space="preserve" text-anchor="middle" x="979.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">flight, passenger</text>
<text xml:space="preserve" text-anchor="middle" x="979.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">crew, recovery</text>
</g>
<!-- irrop&#45;&gt;ir_models -->
<g id="edge15" class="edge">
<title>irrop&#45;&gt;ir_models</title>
<path fill="none" stroke="#1e2a4a" d="M1123.23,-113.17C1099.86,-102.96 1065.42,-87.32 1036.38,-71.75 1031.08,-68.91 1025.6,-65.8 1020.22,-62.63"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1021.38,-61.29 1016.19,-60.23 1019.59,-64.29 1021.38,-61.29"/>
</g>
<!-- ir_rules -->
<g id="node17" class="node">
<title>ir_rules</title>
<polygon fill="#1a2a1a" stroke="#1e2a4a" points="1130.88,-65.38 1045.88,-65.38 1045.88,-6.38 1130.88,-6.38 1130.88,-65.38"/>
<text xml:space="preserve" text-anchor="middle" x="1088.38" y="-51.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">rules/</text>
<text xml:space="preserve" text-anchor="middle" x="1088.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">faa_part117</text>
<text xml:space="preserve" text-anchor="middle" x="1088.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">rebooking</text>
<text xml:space="preserve" text-anchor="middle" x="1088.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">compensation</text>
</g>
<!-- irrop&#45;&gt;ir_rules -->
<g id="edge16" class="edge">
<title>irrop&#45;&gt;ir_rules</title>
<path fill="none" stroke="#1e2a4a" d="M1138.13,-107.39C1130.78,-96.97 1121.18,-83.36 1112.37,-70.88"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1113.84,-69.93 1109.53,-66.85 1110.98,-71.95 1113.84,-69.93"/>
</g>
<!-- ir_pipeline -->
<g id="node18" class="node">
<title>ir_pipeline</title>
<polygon fill="#1a2a1a" stroke="#1e2a4a" points="1273.38,-59 1149.38,-59 1149.38,-12.75 1273.38,-12.75 1273.38,-59"/>
<text xml:space="preserve" text-anchor="middle" x="1211.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">pipeline/</text>
<text xml:space="preserve" text-anchor="middle" x="1211.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">ingest → triage →</text>
<text xml:space="preserve" text-anchor="middle" x="1211.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">rebook → compensate</text>
</g>
<!-- irrop&#45;&gt;ir_pipeline -->
<g id="edge17" class="edge">
<title>irrop&#45;&gt;ir_pipeline</title>
<path fill="none" stroke="#1e2a4a" d="M1162.43,-107.39C1170.96,-95.09 1182.58,-78.35 1192.36,-64.27"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1193.59,-65.56 1195.01,-60.45 1190.72,-63.56 1193.59,-65.56"/>
<title>agents&#45;&gt;ag_shared</title>
<path fill="none" stroke="#1e2a4a" d="M1106.8,-94.72C1115.74,-83.99 1127.44,-69.98 1137.62,-57.78"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1138.75,-59.15 1140.61,-54.19 1136.06,-56.91 1138.75,-59.15"/>
</g>
<!-- api_main -->
<g id="node19" class="node">
<g id="node18" class="node">
<title>api_main</title>
<polygon fill="#2a1a1a" stroke="#1e2a4a" points="1409.75,-53.88 1291,-53.88 1291,-17.88 1409.75,-17.88 1409.75,-53.88"/>
<text xml:space="preserve" text-anchor="middle" x="1350.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">main.py</text>
<text xml:space="preserve" text-anchor="middle" x="1350.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">FastAPI + WebSocket</text>
<polygon fill="#2a1a1a" stroke="#1e2a4a" points="1378.38,-52.62 1248.38,-52.62 1248.38,-6.38 1378.38,-6.38 1378.38,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1313.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">main.py</text>
<text xml:space="preserve" text-anchor="middle" x="1313.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">FastAPI + WebSocket</text>
<text xml:space="preserve" text-anchor="middle" x="1313.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">health · runs · Langfuse</text>
</g>
<!-- api&#45;&gt;api_main -->
<g id="edge18" class="edge">
<g id="edge17" class="edge">
<title>api&#45;&gt;api_main</title>
<path fill="none" stroke="#1e2a4a" d="M1405.74,-107.39C1394.87,-93.55 1379.58,-74.07 1367.82,-59.09"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1369.38,-58.24 1364.91,-55.39 1366.63,-60.4 1369.38,-58.24"/>
<path fill="none" stroke="#1e2a4a" d="M1419.14,-95.31C1400.86,-84.11 1376.42,-69.13 1355.63,-56.4"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1356.62,-54.95 1351.45,-53.83 1354.8,-57.93 1356.62,-54.95"/>
</g>
<!-- api_routes -->
<g id="node20" class="node">
<title>api_routes</title>
<polygon fill="#2a1a1a" stroke="#1e2a4a" points="1548.88,-53.88 1427.88,-53.88 1427.88,-17.88 1548.88,-17.88 1548.88,-53.88"/>
<text xml:space="preserve" text-anchor="middle" x="1488.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">routes/</text>
<text xml:space="preserve" text-anchor="middle" x="1488.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">agents, scenarios, ws</text>
<!-- api_config -->
<g id="node19" class="node">
<title>api_config</title>
<polygon fill="#2a1a1a" stroke="#1e2a4a" points="1496.75,-47.5 1396,-47.5 1396,-11.5 1496.75,-11.5 1496.75,-47.5"/>
<text xml:space="preserve" text-anchor="middle" x="1446.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">config.py</text>
<text xml:space="preserve" text-anchor="middle" x="1446.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Pydantic Settings</text>
</g>
<!-- api&#45;&gt;api_routes -->
<g id="edge19" class="edge">
<title>api&#45;&gt;api_routes</title>
<path fill="none" stroke="#1e2a4a" d="M1433.01,-107.39C1443.88,-93.55 1459.17,-74.07 1470.93,-59.09"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1472.12,-60.4 1473.84,-55.39 1469.37,-58.24 1472.12,-60.4"/>
<!-- api&#45;&gt;api_config -->
<g id="edge18" class="edge">
<title>api&#45;&gt;api_config</title>
<path fill="none" stroke="#1e2a4a" d="M1446.38,-94.72C1446.38,-82.94 1446.38,-67.19 1446.38,-54.24"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1448.13,-54.27 1446.38,-49.27 1444.63,-54.27 1448.13,-54.27"/>
</g>
<!-- ui_fw -->
<g id="node21" class="node">
<g id="node20" class="node">
<title>ui_fw</title>
<polygon fill="#2a2a0d" stroke="#1e2a4a" points="1696,-59 1566.75,-59 1566.75,-12.75 1696,-12.75 1696,-59"/>
<text xml:space="preserve" text-anchor="middle" x="1631.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">framework/</text>
<text xml:space="preserve" text-anchor="middle" x="1631.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">soleprint&#45;ui</text>
<text xml:space="preserve" text-anchor="middle" x="1631.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">(shared component lib)</text>
<polygon fill="#2a2a0d" stroke="#1e2a4a" points="1644,-52.62 1514.75,-52.62 1514.75,-6.38 1644,-6.38 1644,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1579.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">framework/</text>
<text xml:space="preserve" text-anchor="middle" x="1579.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">soleprint&#45;ui</text>
<text xml:space="preserve" text-anchor="middle" x="1579.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">(shared component lib)</text>
</g>
<!-- ui_root&#45;&gt;ui_fw -->
<g id="edge20" class="edge">
<g id="edge19" class="edge">
<title>ui_root&#45;&gt;ui_fw</title>
<path fill="none" stroke="#1e2a4a" d="M1631.38,-107.39C1631.38,-95.42 1631.38,-79.23 1631.38,-65.38"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1633.13,-65.72 1631.38,-60.72 1629.63,-65.72 1633.13,-65.72"/>
<path fill="none" stroke="#1e2a4a" d="M1695.95,-96.48C1675.86,-85.11 1648.12,-69.41 1624.75,-56.18"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1625.75,-54.73 1620.53,-53.79 1624.02,-57.78 1625.75,-54.73"/>
</g>
<!-- ui_app -->
<g id="node22" class="node">
<g id="node21" class="node">
<title>ui_app</title>
<polygon fill="#2a2a0d" stroke="#1e2a4a" points="1828.5,-65.38 1714.25,-65.38 1714.25,-6.38 1828.5,-6.38 1828.5,-65.38"/>
<text xml:space="preserve" text-anchor="middle" x="1771.38" y="-51.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">app/</text>
<text xml:space="preserve" text-anchor="middle" x="1771.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Vue 3 SPA</text>
<text xml:space="preserve" text-anchor="middle" x="1771.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">pages/ components/</text>
<text xml:space="preserve" text-anchor="middle" x="1771.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">mars&#45;tokens.css</text>
<polygon fill="#2a2a0d" stroke="#1e2a4a" points="1784.62,-52.62 1662.12,-52.62 1662.12,-6.38 1784.62,-6.38 1784.62,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1723.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">app/</text>
<text xml:space="preserve" text-anchor="middle" x="1723.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Vue 3 SPA</text>
<text xml:space="preserve" text-anchor="middle" x="1723.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">config.ts (Kong proxy)</text>
</g>
<!-- ui_root&#45;&gt;ui_app -->
<g id="edge21" class="edge">
<g id="edge20" class="edge">
<title>ui_root&#45;&gt;ui_app</title>
<path fill="none" stroke="#1e2a4a" d="M1658.7,-107.6C1676.09,-96.69 1699.15,-82.21 1719.88,-69.2"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1720.79,-70.69 1724.1,-66.55 1718.93,-67.73 1720.79,-70.69"/>
<path fill="none" stroke="#1e2a4a" d="M1723.38,-94.72C1723.38,-84.47 1723.38,-71.21 1723.38,-59.41"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1725.13,-59.54 1723.38,-54.54 1721.63,-59.54 1725.13,-59.54"/>
</g>
<!-- ctrl_docker -->
<g id="node23" class="node">
<g id="node22" class="node">
<title>ctrl_docker</title>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="1964.38,-65.38 1846.38,-65.38 1846.38,-6.38 1964.38,-6.38 1964.38,-65.38"/>
<text xml:space="preserve" text-anchor="middle" x="1905.38" y="-51.88" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Dockerfile.api</text>
<text xml:space="preserve" text-anchor="middle" x="1905.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Dockerfile.ui</text>
<text xml:space="preserve" text-anchor="middle" x="1905.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">nginx.conf</text>
<text xml:space="preserve" text-anchor="middle" x="1905.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">docker&#45;compose.yml</text>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="1885.75,-52.62 1803,-52.62 1803,-6.38 1885.75,-6.38 1885.75,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1844.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Dockerfile.api</text>
<text xml:space="preserve" text-anchor="middle" x="1844.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Dockerfile.ui</text>
<text xml:space="preserve" text-anchor="middle" x="1844.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">nginx.conf</text>
</g>
<!-- ctrl&#45;&gt;ctrl_docker -->
<g id="edge22" class="edge">
<g id="edge21" class="edge">
<title>ctrl&#45;&gt;ctrl_docker</title>
<path fill="none" stroke="#1e2a4a" d="M1905.38,-107.39C1905.38,-97.25 1905.38,-84.09 1905.38,-71.89"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1907.13,-72.13 1905.38,-67.13 1903.63,-72.13 1907.13,-72.13"/>
<path fill="none" stroke="#1e2a4a" d="M1824.68,-94.72C1827.85,-84.37 1831.96,-70.96 1835.61,-59.08"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1837.23,-59.77 1837.02,-54.47 1833.88,-58.74 1837.23,-59.77"/>
</g>
<!-- ctrl_k8s -->
<g id="node24" class="node">
<g id="node23" class="node">
<title>ctrl_k8s</title>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="2094,-59 1982.75,-59 1982.75,-12.75 2094,-12.75 2094,-59"/>
<text xml:space="preserve" text-anchor="middle" x="2038.38" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">k8s/</text>
<text xml:space="preserve" text-anchor="middle" x="2038.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">base/ overlays/dev/</text>
<text xml:space="preserve" text-anchor="middle" x="2038.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">kind&#45;config.yaml</text>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="2015,-52.62 1903.75,-52.62 1903.75,-6.38 2015,-6.38 2015,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="1959.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">k8s/</text>
<text xml:space="preserve" text-anchor="middle" x="1959.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">base/ overlays/dev/</text>
<text xml:space="preserve" text-anchor="middle" x="1959.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">kind&#45;config.yaml</text>
</g>
<!-- ctrl&#45;&gt;ctrl_k8s -->
<g id="edge23" class="edge">
<g id="edge22" class="edge">
<title>ctrl&#45;&gt;ctrl_k8s</title>
<path fill="none" stroke="#1e2a4a" d="M1931.65,-107.39C1950.91,-94.66 1977.39,-77.17 1999.15,-62.79"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="2000.1,-64.26 2003.31,-60.04 1998.17,-61.34 2000.1,-64.26"/>
<path fill="none" stroke="#1e2a4a" d="M1846.7,-96.09C1866.14,-84.78 1892.68,-69.33 1915.12,-56.26"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="1915.98,-57.79 1919.42,-53.76 1914.22,-54.76 1915.98,-57.79"/>
</g>
<!-- ctrl_edge -->
<g id="node24" class="node">
<title>ctrl_edge</title>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="2151.38,-52.62 2033.38,-52.62 2033.38,-6.38 2151.38,-6.38 2151.38,-52.62"/>
<text xml:space="preserve" text-anchor="middle" x="2092.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">edge/</text>
<text xml:space="preserve" text-anchor="middle" x="2092.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">docker&#45;compose.yml</text>
<text xml:space="preserve" text-anchor="middle" x="2092.38" y="-13.62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">(production)</text>
</g>
<!-- ctrl&#45;&gt;ctrl_edge -->
<g id="edge23" class="edge">
<title>ctrl&#45;&gt;ctrl_edge</title>
<path fill="none" stroke="#1e2a4a" d="M1846.62,-98.33C1849.54,-97.11 1852.49,-95.97 1855.38,-95 1928.14,-70.44 1951.09,-81.94 2024.38,-59 2028.06,-57.85 2031.83,-56.57 2035.6,-55.21"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="2036.02,-56.92 2040.1,-53.54 2034.8,-53.64 2036.02,-56.92"/>
</g>
<!-- ctrl_tilt -->
<g id="node25" class="node">
<title>ctrl_tilt</title>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="2199,-53.88 2111.75,-53.88 2111.75,-17.88 2199,-17.88 2199,-53.88"/>
<text xml:space="preserve" text-anchor="middle" x="2155.38" y="-39.12" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Tiltfile</text>
<text xml:space="preserve" text-anchor="middle" x="2155.38" y="-26.38" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">tilt_config.json</text>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="2231.25,-47.5 2169.5,-47.5 2169.5,-11.5 2231.25,-11.5 2231.25,-47.5"/>
<text xml:space="preserve" text-anchor="middle" x="2200.38" y="-32.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Tiltfile</text>
<text xml:space="preserve" text-anchor="middle" x="2200.38" y="-20" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">deploy.sh</text>
</g>
<!-- ctrl&#45;&gt;ctrl_tilt -->
<g id="edge24" class="edge">
<title>ctrl&#45;&gt;ctrl_tilt</title>
<path fill="none" stroke="#1e2a4a" d="M1932.63,-111.11C1935.55,-109.88 1938.5,-108.74 1941.38,-107.75 2011.15,-83.86 2035.58,-100.79 2103.38,-71.75 2111.9,-68.1 2120.52,-63.01 2128.22,-57.84"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="2129.03,-59.41 2132.15,-55.13 2127.04,-56.53 2129.03,-59.41"/>
<path fill="none" stroke="#1e2a4a" d="M1846.54,-98.06C1849.47,-96.89 1852.45,-95.84 1855.38,-95 1986.58,-57.37 2033.03,-108.14 2160.38,-59 2165.41,-57.06 2170.39,-54.34 2175.05,-51.34"/>
<polygon fill="#1e2a4a" stroke="#1e2a4a" points="2175.96,-52.84 2179.1,-48.58 2173.98,-49.95 2175.96,-52.84"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 22 KiB