Files
nova/docs/graphs/repo_structure.svg

338 lines
22 KiB
XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: repo_structure Pages: 1 -->
<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,-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="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="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="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="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="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="node4" class="node">
<title>api</title>
<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="edge3" class="edge">
<title>root&#45;&gt;api</title>
<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="node5" class="node">
<title>ui_root</title>
<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="edge4" class="edge">
<title>root&#45;&gt;ui_root</title>
<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="node6" class="node">
<title>ctrl</title>
<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="edge5" class="edge">
<title>root&#45;&gt;ctrl</title>
<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="node9" class="node">
<title>docs</title>
<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="edge8" class="edge">
<title>root&#45;&gt;docs</title>
<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="node10" class="node">
<title>mcp_shared</title>
<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="edge9" class="edge">
<title>mcp&#45;&gt;mcp_shared</title>
<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="node11" class="node">
<title>mcp_ops</title>
<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="edge10" class="edge">
<title>mcp&#45;&gt;mcp_ops</title>
<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="node12" class="node">
<title>mcp_pax</title>
<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="edge11" class="edge">
<title>mcp&#45;&gt;mcp_pax</title>
<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="node14" class="node">
<title>mcp_data</title>
<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="edge13" class="edge">
<title>mcp&#45;&gt;mcp_data</title>
<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_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_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="node16" class="node">
<title>ag_handover</title>
<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="edge15" class="edge">
<title>agents&#45;&gt;ag_handover</title>
<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="node17" class="node">
<title>ag_shared</title>
<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="edge16" class="edge">
<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="node18" class="node">
<title>api_main</title>
<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="edge17" class="edge">
<title>api&#45;&gt;api_main</title>
<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_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_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="node20" class="node">
<title>ui_fw</title>
<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="edge19" class="edge">
<title>ui_root&#45;&gt;ui_fw</title>
<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="node21" class="node">
<title>ui_app</title>
<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="edge20" class="edge">
<title>ui_root&#45;&gt;ui_app</title>
<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="node22" class="node">
<title>ctrl_docker</title>
<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="edge21" class="edge">
<title>ctrl&#45;&gt;ctrl_docker</title>
<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="node23" class="node">
<title>ctrl_k8s</title>
<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="edge22" class="edge">
<title>ctrl&#45;&gt;ctrl_k8s</title>
<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="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="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>