Files
dashfront/automat-graph.svg
2026-10-29 17:32:39 +01:00

1677 lines
199 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 16.1.0 (0)
-->
<!-- Title: automats Pages: 1 -->
<svg width="6453pt" height="2360pt"
viewBox="0.00 0.00 6453.00 2360.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="background-color:#1e2430;">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 2323.9)">
<title>automats</title>
<polygon fill="#1e2430" stroke="none" points="-36,36 -36,-2323.9 6416.78,-2323.9 6416.78,36 -36,36"/>
<g id="clust1" class="cluster">
<title>cluster_session_realtime</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M1200.78,-1611C1200.78,-1611 2347.78,-1611 2347.78,-1611 2353.78,-1611 2359.78,-1617 2359.78,-1623 2359.78,-1623 2359.78,-1960 2359.78,-1960 2359.78,-1966 2353.78,-1972 2347.78,-1972 2347.78,-1972 1200.78,-1972 1200.78,-1972 1194.78,-1972 1188.78,-1966 1188.78,-1960 1188.78,-1960 1188.78,-1623 1188.78,-1623 1188.78,-1617 1194.78,-1611 1200.78,-1611"/>
<text xml:space="preserve" text-anchor="middle" x="1283.06" y="-1954.5" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Session &amp; Real&#45;Time Hub</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_company_basedata</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M2605.78,-1554C2605.78,-1554 2943.78,-1554 2943.78,-1554 2949.78,-1554 2955.78,-1560 2955.78,-1566 2955.78,-1566 2955.78,-2017 2955.78,-2017 2955.78,-2023 2949.78,-2029 2943.78,-2029 2943.78,-2029 2605.78,-2029 2605.78,-2029 2599.78,-2029 2593.78,-2023 2593.78,-2017 2593.78,-2017 2593.78,-1566 2593.78,-1566 2593.78,-1560 2599.78,-1554 2605.78,-1554"/>
<text xml:space="preserve" text-anchor="middle" x="2723.93" y="-2011.5" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Company &amp; Consolidated Base Data</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_catalog_products</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M509.78,-561.6C509.78,-561.6 928.78,-561.6 928.78,-561.6 934.78,-561.6 940.78,-567.6 940.78,-573.6 940.78,-573.6 940.78,-1907 940.78,-1907 940.78,-1913 934.78,-1919 928.78,-1919 928.78,-1919 509.78,-1919 509.78,-1919 503.78,-1919 497.78,-1913 497.78,-1907 497.78,-1907 497.78,-573.6 497.78,-573.6 497.78,-567.6 503.78,-561.6 509.78,-561.6"/>
<text xml:space="preserve" text-anchor="middle" x="570.4" y="-1901.5" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Catalog &amp; Products</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_search_indexing</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M762.78,-8C762.78,-8 1074.78,-8 1074.78,-8 1080.78,-8 1086.78,-14 1086.78,-20 1086.78,-20 1086.78,-508.8 1086.78,-508.8 1086.78,-514.8 1080.78,-520.8 1074.78,-520.8 1074.78,-520.8 762.78,-520.8 762.78,-520.8 756.78,-520.8 750.78,-514.8 750.78,-508.8 750.78,-508.8 750.78,-20 750.78,-20 750.78,-14 756.78,-8 762.78,-8"/>
<text xml:space="preserve" text-anchor="middle" x="820.07" y="-503.3" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Search &amp; Indexing</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_purchasing_logistics</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M4614.78,-583.6C4614.78,-583.6 4906.78,-583.6 4906.78,-583.6 4912.78,-583.6 4918.78,-589.6 4918.78,-595.6 4918.78,-595.6 4918.78,-1139.4 4918.78,-1139.4 4918.78,-1145.4 4912.78,-1151.4 4906.78,-1151.4 4906.78,-1151.4 4614.78,-1151.4 4614.78,-1151.4 4608.78,-1151.4 4602.78,-1145.4 4602.78,-1139.4 4602.78,-1139.4 4602.78,-595.6 4602.78,-595.6 4602.78,-589.6 4608.78,-583.6 4614.78,-583.6"/>
<text xml:space="preserve" text-anchor="middle" x="4679.99" y="-1133.9" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Deliveries &amp; Inbound</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_sales_crm</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M3097.78,-896.4C3097.78,-896.4 3383.78,-896.4 3383.78,-896.4 3389.78,-896.4 3395.78,-902.4 3395.78,-908.4 3395.78,-908.4 3395.78,-1885 3395.78,-1885 3395.78,-1891 3389.78,-1897 3383.78,-1897 3383.78,-1897 3097.78,-1897 3097.78,-1897 3091.78,-1897 3085.78,-1891 3085.78,-1885 3085.78,-1885 3085.78,-908.4 3085.78,-908.4 3085.78,-902.4 3091.78,-896.4 3097.78,-896.4"/>
<text xml:space="preserve" text-anchor="middle" x="3138.79" y="-1879.5" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Sales &amp; CRM</text>
</g>
<g id="clust7" class="cluster">
<title>cluster_ai_workspace</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M1839.78,-1192.2C1839.78,-1192.2 2581.78,-1192.2 2581.78,-1192.2 2587.78,-1192.2 2593.78,-1198.2 2593.78,-1204.2 2593.78,-1204.2 2593.78,-1501.2 2593.78,-1501.2 2593.78,-1507.2 2587.78,-1513.2 2581.78,-1513.2 2581.78,-1513.2 1839.78,-1513.2 1839.78,-1513.2 1833.78,-1513.2 1827.78,-1507.2 1827.78,-1501.2 1827.78,-1501.2 1827.78,-1204.2 1827.78,-1204.2 1827.78,-1198.2 1833.78,-1192.2 1839.78,-1192.2"/>
<text xml:space="preserve" text-anchor="middle" x="1922.06" y="-1495.7" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">AI Assistant &amp; Workspace</text>
</g>
<g id="clust8" class="cluster">
<title>cluster_audit_grids</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M5410.78,-1686C5410.78,-1686 6360.78,-1686 6360.78,-1686 6366.78,-1686 6372.78,-1692 6372.78,-1698 6372.78,-1698 6372.78,-1885 6372.78,-1885 6372.78,-1891 6366.78,-1897 6360.78,-1897 6360.78,-1897 5410.78,-1897 5410.78,-1897 5404.78,-1897 5398.78,-1891 5398.78,-1885 5398.78,-1885 5398.78,-1698 5398.78,-1698 5398.78,-1692 5404.78,-1686 5410.78,-1686"/>
<text xml:space="preserve" text-anchor="middle" x="5474.3" y="-1879.5" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">Audit &amp; Virtual Grids</text>
</g>
<g id="clust9" class="cluster">
<title>cluster_system_ui</title>
<path fill="#202a3a" stroke="#3f4c5f" d="M4404.78,-1214.2C4404.78,-1214.2 5346.78,-1214.2 5346.78,-1214.2 5352.78,-1214.2 5358.78,-1220.2 5358.78,-1226.2 5358.78,-1226.2 5358.78,-1920.3 5358.78,-1920.3 5358.78,-1926.3 5352.78,-1932.3 5346.78,-1932.3 5346.78,-1932.3 4404.78,-1932.3 4404.78,-1932.3 4398.78,-1932.3 4392.78,-1926.3 4392.78,-1920.3 4392.78,-1920.3 4392.78,-1226.2 4392.78,-1226.2 4392.78,-1220.2 4398.78,-1214.2 4404.78,-1214.2"/>
<text xml:space="preserve" text-anchor="middle" x="4482.06" y="-1914.8" font-family="Helvetica,sans-Serif" font-size="15.00" fill="#e2e8f0">UI, Navigation &amp; System</text>
</g>
<!-- authAutomat -->
<g id="node1" class="node">
<title>authAutomat</title>
<polygon fill="#33415c" stroke="none" points="1210.95,-1871 1210.95,-1902 1530.61,-1902 1530.61,-1871 1210.95,-1871"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1871 1210.95,-1902 1530.61,-1902 1530.61,-1871 1210.95,-1871"/>
<text xml:space="preserve" text-anchor="start" x="1333.78" y="-1887.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">authAutomat</text>
<text xml:space="preserve" text-anchor="start" x="1282.24" y="-1877.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Always&#45;On Session &amp; Multi&#45;Tenant Gateway</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1849 1210.95,-1871 1530.61,-1871 1530.61,-1849 1210.95,-1849"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1849 1210.95,-1871 1530.61,-1871 1530.61,-1849 1210.95,-1849"/>
<polygon fill="#2b1a42" stroke="none" points="1211.95,-1850 1211.95,-1870 1286.71,-1870 1286.71,-1850 1211.95,-1850"/>
<text xml:space="preserve" text-anchor="start" x="1236.22" y="-1858.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1290.71" y="-1858" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">hasAuth: boolean</text>
<text xml:space="preserve" text-anchor="start" x="1436.66" y="-1856.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Authenticated session bit</text>
<polygon fill="#272e3d" stroke="none" points="1210.95,-1827 1210.95,-1849 1530.61,-1849 1530.61,-1827 1210.95,-1827"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1827 1210.95,-1849 1530.61,-1849 1530.61,-1827 1210.95,-1827"/>
<polygon fill="#2b1a42" stroke="none" points="1211.95,-1828 1211.95,-1848 1270.36,-1848 1270.36,-1828 1211.95,-1828"/>
<text xml:space="preserve" text-anchor="start" x="1228.05" y="-1836.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1274.36" y="-1836" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">hasCompany: boolean</text>
<text xml:space="preserve" text-anchor="start" x="1410.43" y="-1834.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">hasAuth &amp;&amp; selectedCompanyId</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1805 1210.95,-1827 1530.61,-1827 1530.61,-1805 1210.95,-1805"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1805 1210.95,-1827 1530.61,-1827 1530.61,-1805 1210.95,-1805"/>
<polygon fill="#2b1a42" stroke="none" points="1211.95,-1806 1211.95,-1826 1291.52,-1826 1291.52,-1806 1211.95,-1806"/>
<text xml:space="preserve" text-anchor="start" x="1238.63" y="-1814.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1295.52" y="-1814" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">user: AuthUser</text>
<text xml:space="preserve" text-anchor="start" x="1438.9" y="-1812.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Current user &amp; company</text>
<polygon fill="#272e3d" stroke="none" points="1210.95,-1783 1210.95,-1805 1530.61,-1805 1530.61,-1783 1210.95,-1783"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1783 1210.95,-1805 1530.61,-1805 1530.61,-1783 1210.95,-1783"/>
<polygon fill="#2b1a42" stroke="none" points="1211.95,-1784 1211.95,-1804 1264.51,-1804 1264.51,-1784 1211.95,-1784"/>
<text xml:space="preserve" text-anchor="start" x="1225.12" y="-1792.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1268.51" y="-1792" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">schemaVersion: number|null</text>
<text xml:space="preserve" text-anchor="start" x="1422.89" y="-1790.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Backend DB schema version</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1761 1210.95,-1783 1530.61,-1783 1530.61,-1761 1210.95,-1761"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1761 1210.95,-1783 1530.61,-1783 1530.61,-1761 1210.95,-1761"/>
<polygon fill="#2b1a42" stroke="none" points="1211.95,-1762 1211.95,-1782 1304.59,-1782 1304.59,-1762 1211.95,-1762"/>
<text xml:space="preserve" text-anchor="start" x="1245.16" y="-1770.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1308.59" y="-1770" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">status</text>
<text xml:space="preserve" text-anchor="start" x="1435.33" y="-1768.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">&#39;anon&#39; | &#39;authed&#39; | &#39;loading&#39;</text>
<polygon fill="#272e3d" stroke="none" points="1210.95,-1739 1210.95,-1761 1530.61,-1761 1530.61,-1739 1210.95,-1739"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1739 1210.95,-1761 1530.61,-1761 1530.61,-1739 1210.95,-1739"/>
<polygon fill="#143826" stroke="none" points="1211.95,-1740 1211.95,-1760 1285.38,-1760 1285.38,-1740 1211.95,-1740"/>
<text xml:space="preserve" text-anchor="start" x="1233.33" y="-1748.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="1289.38" y="-1748" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">bootstrapSession()</text>
<text xml:space="preserve" text-anchor="start" x="1439.35" y="-1746.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Restore or fetch session</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1717 1210.95,-1739 1530.61,-1739 1530.61,-1717 1210.95,-1717"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1717 1210.95,-1739 1530.61,-1739 1530.61,-1717 1210.95,-1717"/>
<polygon fill="#143826" stroke="none" points="1211.95,-1718 1211.95,-1738 1291.68,-1738 1291.68,-1718 1211.95,-1718"/>
<text xml:space="preserve" text-anchor="start" x="1236.48" y="-1726.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="1295.68" y="-1726" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">switchCompany(id)</text>
<text xml:space="preserve" text-anchor="start" x="1459.36" y="-1724.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Multi&#45;tenant switch</text>
<polygon fill="#272e3d" stroke="none" points="1210.95,-1695 1210.95,-1717 1530.61,-1717 1530.61,-1695 1210.95,-1695"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1695 1210.95,-1717 1530.61,-1717 1530.61,-1695 1210.95,-1695"/>
<polygon fill="#143826" stroke="none" points="1211.95,-1696 1211.95,-1716 1307.5,-1716 1307.5,-1696 1211.95,-1696"/>
<text xml:space="preserve" text-anchor="start" x="1244.39" y="-1704.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="1311.5" y="-1704" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">logout()</text>
<text xml:space="preserve" text-anchor="start" x="1451.8" y="-1702.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Clear session cookie</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1673 1210.95,-1695 1530.61,-1695 1530.61,-1673 1210.95,-1673"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1673 1210.95,-1695 1530.61,-1695 1530.61,-1673 1210.95,-1673"/>
<polygon fill="#182b40" stroke="none" points="1211.95,-1674 1211.95,-1694 1259.95,-1694 1259.95,-1674 1211.95,-1674"/>
<text xml:space="preserve" text-anchor="start" x="1220.17" y="-1682.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="1263.95" y="-1682" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectHasAuth() / selectHasCompany()</text>
<text xml:space="preserve" text-anchor="start" x="1455.33" y="-1680.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Auth &amp; tenant gates</text>
<polygon fill="#272e3d" stroke="none" points="1210.95,-1651 1210.95,-1673 1530.61,-1673 1530.61,-1651 1210.95,-1651"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1651 1210.95,-1673 1530.61,-1673 1530.61,-1651 1210.95,-1651"/>
<polygon fill="#182b40" stroke="none" points="1211.95,-1652 1211.95,-1672 1276.7,-1672 1276.7,-1652 1211.95,-1652"/>
<text xml:space="preserve" text-anchor="start" x="1228.54" y="-1660.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="1280.7" y="-1660" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectSchemaVersion()</text>
<text xml:space="preserve" text-anchor="start" x="1432.24" y="-1658.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active DB schema version</text>
<polygon fill="#2a3242" stroke="none" points="1210.95,-1629 1210.95,-1651 1530.61,-1651 1530.61,-1629 1210.95,-1629"/>
<polygon fill="none" stroke="#3f4c5f" points="1210.95,-1629 1210.95,-1651 1530.61,-1651 1530.61,-1629 1210.95,-1629"/>
<polygon fill="#3b2c12" stroke="none" points="1211.95,-1630 1211.95,-1650 1283.89,-1650 1283.89,-1630 1211.95,-1630"/>
<text xml:space="preserve" text-anchor="start" x="1241.25" y="-1638.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="1287.89" y="-1638" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/auth/session</text>
<text xml:space="preserve" text-anchor="start" x="1448.24" y="-1636.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Cookie session check</text>
</g>
<!-- sseAutomat -->
<g id="node2" class="node">
<title>sseAutomat</title>
<polygon fill="#33415c" stroke="none" points="2099.86,-1847 2099.86,-1882 2337.7,-1882 2337.7,-1847 2099.86,-1847"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1847 2099.86,-1882 2337.7,-1882 2337.7,-1847 2099.86,-1847"/>
<polygon fill="#33415c" stroke="none" points="2101.86,-1876 2101.86,-1880 2218.78,-1880 2218.78,-1876 2101.86,-1876"/>
<polygon fill="#33415c" stroke="none" points="2218.78,-1876 2218.78,-1880 2335.7,-1880 2335.7,-1876 2218.78,-1876"/>
<text xml:space="preserve" text-anchor="start" x="2184.44" y="-1863.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">sseAutomat</text>
<text xml:space="preserve" text-anchor="start" x="2150.74" y="-1853.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Single Persistent SSE Connection</text>
<polygon fill="#2a3242" stroke="none" points="2099.86,-1825 2099.86,-1847 2337.7,-1847 2337.7,-1825 2099.86,-1825"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1825 2099.86,-1847 2337.7,-1847 2337.7,-1825 2099.86,-1825"/>
<polygon fill="#2b1a42" stroke="none" points="2100.86,-1826 2100.86,-1846 2174.17,-1846 2174.17,-1826 2100.86,-1826"/>
<text xml:space="preserve" text-anchor="start" x="2124.4" y="-1834.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2178.17" y="-1834" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">status</text>
<text xml:space="preserve" text-anchor="start" x="2266.26" y="-1832.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">&#39;connected&#39; | &#39;error&#39;</text>
<polygon fill="#272e3d" stroke="none" points="2099.86,-1803 2099.86,-1825 2337.7,-1825 2337.7,-1803 2099.86,-1803"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1803 2099.86,-1825 2337.7,-1825 2337.7,-1803 2099.86,-1803"/>
<polygon fill="#2b1a42" stroke="none" points="2100.86,-1804 2100.86,-1824 2152.57,-1824 2152.57,-1804 2100.86,-1804"/>
<text xml:space="preserve" text-anchor="start" x="2113.6" y="-1812.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2156.57" y="-1812" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">clientId (cid)</text>
<text xml:space="preserve" text-anchor="start" x="2230.88" y="-1810.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Tab&#45;scoped UUID in session</text>
<polygon fill="#2a3242" stroke="none" points="2099.86,-1781 2099.86,-1803 2337.7,-1803 2337.7,-1781 2099.86,-1781"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1781 2099.86,-1803 2337.7,-1803 2337.7,-1781 2099.86,-1781"/>
<polygon fill="#143826" stroke="none" points="2100.86,-1782 2100.86,-1802 2157.9,-1802 2157.9,-1782 2100.86,-1782"/>
<text xml:space="preserve" text-anchor="start" x="2114.05" y="-1790.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2161.9" y="-1790" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reconnect()</text>
<text xml:space="preserve" text-anchor="start" x="2242.44" y="-1788.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Cycle on company switch</text>
<polygon fill="#272e3d" stroke="none" points="2099.86,-1759 2099.86,-1781 2337.7,-1781 2337.7,-1759 2099.86,-1759"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1759 2099.86,-1781 2337.7,-1781 2337.7,-1759 2099.86,-1759"/>
<polygon fill="#143826" stroke="none" points="2100.86,-1760 2100.86,-1780 2150.27,-1780 2150.27,-1760 2100.86,-1760"/>
<text xml:space="preserve" text-anchor="start" x="2110.23" y="-1768.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2154.27" y="-1768" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">on(event, handler)</text>
<text xml:space="preserve" text-anchor="start" x="2251.78" y="-1766.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Register signal listener</text>
<polygon fill="#2a3242" stroke="none" points="2099.86,-1737 2099.86,-1759 2337.7,-1759 2337.7,-1737 2099.86,-1737"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1737 2099.86,-1759 2337.7,-1759 2337.7,-1737 2099.86,-1737"/>
<polygon fill="#143826" stroke="none" points="2100.86,-1738 2100.86,-1758 2154.79,-1758 2154.79,-1738 2100.86,-1738"/>
<text xml:space="preserve" text-anchor="start" x="2112.49" y="-1746.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2158.79" y="-1746" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">watchArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="2262" y="-1744.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Attach article&#45;&lt;sku&gt;</text>
<polygon fill="#272e3d" stroke="none" points="2099.86,-1715 2099.86,-1737 2337.7,-1737 2337.7,-1715 2099.86,-1715"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1715 2099.86,-1737 2337.7,-1737 2337.7,-1715 2099.86,-1715"/>
<polygon fill="#182b40" stroke="none" points="2100.86,-1716 2100.86,-1736 2148.86,-1736 2148.86,-1716 2100.86,-1716"/>
<text xml:space="preserve" text-anchor="start" x="2109.08" y="-1724.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="2152.86" y="-1724" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">invalidateArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="2262" y="-1722.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Silent cache refresh</text>
<polygon fill="#2a3242" stroke="none" points="2099.86,-1693 2099.86,-1715 2337.7,-1715 2337.7,-1693 2099.86,-1693"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1693 2099.86,-1715 2337.7,-1715 2337.7,-1693 2099.86,-1693"/>
<polygon fill="#3a181e" stroke="none" points="2100.86,-1694 2100.86,-1714 2149.03,-1714 2149.03,-1694 2100.86,-1694"/>
<text xml:space="preserve" text-anchor="start" x="2116.94" y="-1702.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#f87171">SSE</text>
<text xml:space="preserve" text-anchor="start" x="2153.03" y="-1702" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">category / articles</text>
<text xml:space="preserve" text-anchor="start" x="2246.43" y="-1700.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Catalog mutation events</text>
<polygon fill="#272e3d" stroke="none" points="2099.86,-1671 2099.86,-1693 2337.7,-1693 2337.7,-1671 2099.86,-1671"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1671 2099.86,-1693 2337.7,-1693 2337.7,-1671 2099.86,-1671"/>
<polygon fill="#3a181e" stroke="none" points="2100.86,-1672 2100.86,-1692 2159.27,-1692 2159.27,-1672 2100.86,-1672"/>
<text xml:space="preserve" text-anchor="start" x="2122.06" y="-1680.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#f87171">SSE</text>
<text xml:space="preserve" text-anchor="start" x="2163.27" y="-1680" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">order / shipment</text>
<text xml:space="preserve" text-anchor="start" x="2270.46" y="-1678.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fulfillment events</text>
<polygon fill="#2a3242" stroke="none" points="2099.86,-1649 2099.86,-1671 2337.7,-1671 2337.7,-1649 2099.86,-1649"/>
<polygon fill="none" stroke="#3f4c5f" points="2099.86,-1649 2099.86,-1671 2337.7,-1671 2337.7,-1649 2099.86,-1649"/>
<polygon fill="#3b2c12" stroke="none" points="2100.86,-1650 2100.86,-1670 2160.38,-1670 2160.38,-1650 2100.86,-1650"/>
<text xml:space="preserve" text-anchor="start" x="2123.95" y="-1658.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="2164.38" y="-1658" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/events</text>
<text xml:space="preserve" text-anchor="start" x="2270.46" y="-1656.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Persistent stream</text>
</g>
<!-- authAutomat&#45;&gt;sseAutomat -->
<g id="edge1" class="edge">
<title>authAutomat:e&#45;&gt;sseAutomat:n</title>
<g id="a_edge1"><a xlink:title="authAutomat → sseAutomat (hasAuth &#45;&gt; connect SSE)">
<path fill="none" stroke="#5aa7ff" stroke-width="1.4" d="M1531.61,-1860C1667.44,-1860 2132.91,-2011.81 2159.16,-1892.16"/>
<polygon fill="#5aa7ff" stroke="#5aa7ff" stroke-width="1.4" points="2161.81,-1890.32 2160.1,-1883.11 2156.94,-1889.82 2161.81,-1890.32"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1815.23" y="-1919.86" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#5aa7ff"> &#160;hasAuth &#45;&gt; connect SSE &#160;</text>
</g>
<!-- companyAutomat -->
<g id="node3" class="node">
<title>companyAutomat</title>
<polygon fill="#33415c" stroke="none" points="2615.63,-1924 2615.63,-1959 2933.92,-1959 2933.92,-1924 2615.63,-1924"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1924 2615.63,-1959 2933.92,-1959 2933.92,-1924 2615.63,-1924"/>
<polygon fill="#33415c" stroke="none" points="2617.63,-1953 2617.63,-1957 2722.4,-1957 2722.4,-1953 2617.63,-1953"/>
<polygon fill="#33415c" stroke="none" points="2722.4,-1953 2722.4,-1957 2827.16,-1957 2827.16,-1953 2722.4,-1953"/>
<polygon fill="#33415c" stroke="none" points="2827.16,-1953 2827.16,-1957 2931.92,-1957 2931.92,-1953 2827.16,-1953"/>
<text xml:space="preserve" text-anchor="start" x="2724.11" y="-1940.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">companyAutomat</text>
<text xml:space="preserve" text-anchor="start" x="2691.98" y="-1930.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Consolidated Company &amp; Base Data Hub</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1902 2615.63,-1924 2933.92,-1924 2933.92,-1902 2615.63,-1902"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1902 2615.63,-1924 2933.92,-1924 2933.92,-1902 2615.63,-1902"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1903 2616.63,-1923 2689.64,-1923 2689.64,-1903 2616.63,-1903"/>
<text xml:space="preserve" text-anchor="start" x="2640.02" y="-1911.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2693.64" y="-1911" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">current: Company</text>
<text xml:space="preserve" text-anchor="start" x="2837.77" y="-1909.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Tax rates, legal &amp; root cat</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1880 2615.63,-1902 2933.92,-1902 2933.92,-1880 2615.63,-1880"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1880 2615.63,-1902 2933.92,-1902 2933.92,-1880 2615.63,-1880"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1881 2616.63,-1901 2676.11,-1901 2676.11,-1881 2616.63,-1881"/>
<text xml:space="preserve" text-anchor="start" x="2633.26" y="-1889.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2680.11" y="-1889" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">numbers: NumberSeq[]</text>
<text xml:space="preserve" text-anchor="start" x="2822.2" y="-1887.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Document number sequences</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1858 2615.63,-1880 2933.92,-1880 2933.92,-1858 2615.63,-1858"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1858 2615.63,-1880 2933.92,-1880 2933.92,-1858 2615.63,-1858"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1859 2616.63,-1879 2677.52,-1879 2677.52,-1859 2616.63,-1859"/>
<text xml:space="preserve" text-anchor="start" x="2633.97" y="-1867.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2681.52" y="-1867" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">terminals: Posterminal[]</text>
<text xml:space="preserve" text-anchor="start" x="2829.76" y="-1865.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">POS hardware &amp; categories</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1836 2615.63,-1858 2933.92,-1858 2933.92,-1836 2615.63,-1836"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1836 2615.63,-1858 2933.92,-1858 2933.92,-1836 2615.63,-1836"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1837 2616.63,-1857 2684.6,-1857 2684.6,-1837 2616.63,-1837"/>
<text xml:space="preserve" text-anchor="start" x="2637.51" y="-1845.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2688.6" y="-1845" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">suppliers: Supplier[]</text>
<text xml:space="preserve" text-anchor="start" x="2833.77" y="-1843.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Vendors &amp; supplier articles</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1814 2615.63,-1836 2933.92,-1836 2933.92,-1814 2615.63,-1814"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1814 2615.63,-1836 2933.92,-1836 2933.92,-1814 2615.63,-1814"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1815 2616.63,-1835 2701.57,-1835 2701.57,-1815 2616.63,-1815"/>
<text xml:space="preserve" text-anchor="start" x="2645.99" y="-1823.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2705.57" y="-1823" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">units: Unit[]</text>
<text xml:space="preserve" text-anchor="start" x="2843.55" y="-1821.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Allowed SI &amp; sales units</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1792 2615.63,-1814 2933.92,-1814 2933.92,-1792 2615.63,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1792 2615.63,-1814 2933.92,-1814 2933.92,-1792 2615.63,-1792"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1793 2616.63,-1813 2664.63,-1813 2664.63,-1793 2616.63,-1793"/>
<text xml:space="preserve" text-anchor="start" x="2627.52" y="-1801.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2668.63" y="-1801" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">viewerPosition / chatDrawerWidth</text>
<text xml:space="preserve" text-anchor="start" x="2837.78" y="-1799.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Persisted user UI settings</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1770 2615.63,-1792 2933.92,-1792 2933.92,-1770 2615.63,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1770 2615.63,-1792 2933.92,-1792 2933.92,-1770 2615.63,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1771 2616.63,-1791 2677.15,-1791 2677.15,-1771 2616.63,-1771"/>
<text xml:space="preserve" text-anchor="start" x="2633.78" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2681.15" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">warehouses: Warehouse[]</text>
<text xml:space="preserve" text-anchor="start" x="2838.66" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Storage locations &amp; stock</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1748 2615.63,-1770 2933.92,-1770 2933.92,-1748 2615.63,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1748 2615.63,-1770 2933.92,-1770 2933.92,-1748 2615.63,-1748"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1749 2616.63,-1769 2678.56,-1769 2678.56,-1749 2616.63,-1749"/>
<text xml:space="preserve" text-anchor="start" x="2634.49" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2682.56" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">properties: PropertyName[]</text>
<text xml:space="preserve" text-anchor="start" x="2848.45" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Custom text properties</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1726 2615.63,-1748 2933.92,-1748 2933.92,-1726 2615.63,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1726 2615.63,-1748 2933.92,-1748 2933.92,-1726 2615.63,-1726"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1727 2616.63,-1747 2683.57,-1747 2683.57,-1727 2616.63,-1727"/>
<text xml:space="preserve" text-anchor="start" x="2636.99" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2687.57" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">customergroups: Group[]</text>
<text xml:space="preserve" text-anchor="start" x="2855.12" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Pricing discount tiers</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1704 2615.63,-1726 2933.92,-1726 2933.92,-1704 2615.63,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1704 2615.63,-1726 2933.92,-1726 2933.92,-1704 2615.63,-1704"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1705 2616.63,-1725 2687.81,-1725 2687.81,-1705 2616.63,-1705"/>
<text xml:space="preserve" text-anchor="start" x="2639.11" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2691.81" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">carriers: Carrier[]</text>
<text xml:space="preserve" text-anchor="start" x="2828.43" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Shipping methods &amp; carriers</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1682 2615.63,-1704 2933.92,-1704 2933.92,-1682 2615.63,-1682"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1682 2615.63,-1704 2933.92,-1704 2933.92,-1682 2615.63,-1682"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1683 2616.63,-1703 2696.01,-1703 2696.01,-1683 2616.63,-1683"/>
<text xml:space="preserve" text-anchor="start" x="2643.21" y="-1691.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2700.01" y="-1691" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">brands: Brand[]</text>
<text xml:space="preserve" text-anchor="start" x="2845.76" y="-1689.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Catalog brands &amp; logos</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1660 2615.63,-1682 2933.92,-1682 2933.92,-1660 2615.63,-1660"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1660 2615.63,-1682 2933.92,-1682 2933.92,-1660 2615.63,-1660"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1661 2616.63,-1681 2674.01,-1681 2674.01,-1661 2616.63,-1661"/>
<text xml:space="preserve" text-anchor="start" x="2632.21" y="-1669.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2678.01" y="-1669" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">attributes: AttributeName[]</text>
<text xml:space="preserve" text-anchor="start" x="2831.99" y="-1667.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Attributes &amp; discrete values</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1638 2615.63,-1660 2933.92,-1660 2933.92,-1638 2615.63,-1638"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1638 2615.63,-1660 2933.92,-1660 2933.92,-1638 2615.63,-1638"/>
<polygon fill="#2b1a42" stroke="none" points="2616.63,-1639 2616.63,-1659 2687.45,-1659 2687.45,-1639 2616.63,-1639"/>
<text xml:space="preserve" text-anchor="start" x="2638.93" y="-1647.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2691.45" y="-1647" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">accounts: Account[]</text>
<text xml:space="preserve" text-anchor="start" x="2841.76" y="-1645.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Bank &amp; payment ledgers</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1616 2615.63,-1638 2933.92,-1638 2933.92,-1616 2615.63,-1616"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1616 2615.63,-1638 2933.92,-1638 2933.92,-1616 2615.63,-1616"/>
<polygon fill="#143826" stroke="none" points="2616.63,-1617 2616.63,-1637 2690.12,-1637 2690.12,-1617 2616.63,-1617"/>
<text xml:space="preserve" text-anchor="start" x="2638.04" y="-1625.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2694.12" y="-1625" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">loadAll() / reset()</text>
<text xml:space="preserve" text-anchor="start" x="2831.98" y="-1623.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fetch or reset all base data</text>
<polygon fill="#2a3242" stroke="none" points="2615.63,-1594 2615.63,-1616 2933.92,-1616 2933.92,-1594 2615.63,-1594"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1594 2615.63,-1616 2933.92,-1616 2933.92,-1594 2615.63,-1594"/>
<polygon fill="#182b40" stroke="none" points="2616.63,-1595 2616.63,-1615 2671.38,-1615 2671.38,-1595 2616.63,-1595"/>
<text xml:space="preserve" text-anchor="start" x="2628.23" y="-1603.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="2675.38" y="-1603" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectCompanyRootCategoryId()</text>
<text xml:space="preserve" text-anchor="start" x="2852.44" y="-1601.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Root category pointer</text>
<polygon fill="#272e3d" stroke="none" points="2615.63,-1572 2615.63,-1594 2933.92,-1594 2933.92,-1572 2615.63,-1572"/>
<polygon fill="none" stroke="#3f4c5f" points="2615.63,-1572 2615.63,-1594 2933.92,-1594 2933.92,-1572 2615.63,-1572"/>
<polygon fill="#3b2c12" stroke="none" points="2616.63,-1573 2616.63,-1593 2674.03,-1593 2674.03,-1573 2616.63,-1573"/>
<text xml:space="preserve" text-anchor="start" x="2638.66" y="-1581.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="2678.03" y="-1581" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">/api/company, /api/brand, …</text>
<text xml:space="preserve" text-anchor="start" x="2835.96" y="-1579.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">13 consolidated endpoints</text>
</g>
<!-- authAutomat&#45;&gt;companyAutomat -->
<g id="edge2" class="edge">
<title>authAutomat:e&#45;&gt;companyAutomat:n</title>
<g id="a_edge2"><a xlink:title="authAutomat → companyAutomat (hasCompany &#45;&gt; loadAll())">
<path fill="none" stroke="#6bdf9a" stroke-width="1.4" d="M1531.61,-1838C1775.4,-1838 1816.49,-1958.19 2057.78,-1992.98 2198.11,-2013.22 2235.25,-2001.4 2376.78,-1992.98 2504.73,-1985.38 2662.43,-2084.44 2669.75,-1966.85"/>
<polygon fill="#6bdf9a" stroke="#6bdf9a" stroke-width="1.4" points="2672.19,-1967.19 2669.95,-1960.12 2667.29,-1967.04 2672.19,-1967.19"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1871.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#6bdf9a"> &#160;hasCompany &#45;&gt; loadAll() &#160;</text>
</g>
<!-- categoryAutomat -->
<g id="node4" class="node">
<title>categoryAutomat</title>
<polygon fill="#33415c" stroke="none" points="526.03,-1057.4 526.03,-1092.4 801.53,-1092.4 801.53,-1057.4 526.03,-1057.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-1057.4 526.03,-1092.4 801.53,-1092.4 801.53,-1057.4 526.03,-1057.4"/>
<polygon fill="#33415c" stroke="none" points="528.03,-1086.4 528.03,-1090.4 573.28,-1090.4 573.28,-1086.4 528.03,-1086.4"/>
<polygon fill="#33415c" stroke="none" points="573.28,-1086.4 573.28,-1090.4 618.53,-1090.4 618.53,-1086.4 573.28,-1086.4"/>
<polygon fill="#33415c" stroke="none" points="618.53,-1086.4 618.53,-1090.4 663.78,-1090.4 663.78,-1086.4 618.53,-1086.4"/>
<polygon fill="#33415c" stroke="none" points="663.78,-1086.4 663.78,-1090.4 709.03,-1090.4 709.03,-1086.4 663.78,-1086.4"/>
<polygon fill="#33415c" stroke="none" points="709.03,-1086.4 709.03,-1090.4 754.28,-1090.4 754.28,-1086.4 709.03,-1086.4"/>
<polygon fill="#33415c" stroke="none" points="754.28,-1086.4 754.28,-1090.4 799.53,-1090.4 799.53,-1086.4 754.28,-1086.4"/>
<text xml:space="preserve" text-anchor="start" x="614.44" y="-1073.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">categoryAutomat</text>
<text xml:space="preserve" text-anchor="start" x="610.01" y="-1064.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Hierarchical Category Tree</text>
<polygon fill="#2a3242" stroke="none" points="526.03,-1035.4 526.03,-1057.4 801.53,-1057.4 801.53,-1035.4 526.03,-1035.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-1035.4 526.03,-1057.4 801.53,-1057.4 801.53,-1035.4 526.03,-1035.4"/>
<polygon fill="#2b1a42" stroke="none" points="527.03,-1036.4 527.03,-1056.4 589.03,-1056.4 589.03,-1036.4 527.03,-1036.4"/>
<text xml:space="preserve" text-anchor="start" x="544.91" y="-1045" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="593.03" y="-1044.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">categories: Map</text>
<text xml:space="preserve" text-anchor="start" x="705.16" y="-1043.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">ID &#45;&gt; Category Node Map</text>
<polygon fill="#272e3d" stroke="none" points="526.03,-1013.4 526.03,-1035.4 801.53,-1035.4 801.53,-1013.4 526.03,-1013.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-1013.4 526.03,-1035.4 801.53,-1035.4 801.53,-1013.4 526.03,-1013.4"/>
<polygon fill="#2b1a42" stroke="none" points="527.03,-1014.4 527.03,-1034.4 594.14,-1034.4 594.14,-1014.4 527.03,-1014.4"/>
<text xml:space="preserve" text-anchor="start" x="547.47" y="-1023" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="598.14" y="-1022.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">rootCategoryId</text>
<text xml:space="preserve" text-anchor="start" x="716.04" y="-1021.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Company root node ID</text>
<polygon fill="#2a3242" stroke="none" points="526.03,-991.4 526.03,-1013.4 801.53,-1013.4 801.53,-991.4 526.03,-991.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-991.4 526.03,-1013.4 801.53,-1013.4 801.53,-991.4 526.03,-991.4"/>
<polygon fill="#2b1a42" stroke="none" points="527.03,-992.4 527.03,-1012.4 604.07,-1012.4 604.07,-992.4 527.03,-992.4"/>
<text xml:space="preserve" text-anchor="start" x="552.44" y="-1001" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="608.07" y="-1000.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articleCount</text>
<text xml:space="preserve" text-anchor="start" x="732.51" y="-999.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Total parent items</text>
<polygon fill="#272e3d" stroke="none" points="526.03,-969.4 526.03,-991.4 801.53,-991.4 801.53,-969.4 526.03,-969.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-969.4 526.03,-991.4 801.53,-991.4 801.53,-969.4 526.03,-969.4"/>
<polygon fill="#143826" stroke="none" points="527.03,-970.4 527.03,-990.4 599.56,-990.4 599.56,-970.4 527.03,-970.4"/>
<text xml:space="preserve" text-anchor="start" x="547.96" y="-979" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="603.56" y="-978.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">loadTree()</text>
<text xml:space="preserve" text-anchor="start" x="708.95" y="-977.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fetch tree &amp; warm views</text>
<polygon fill="#2a3242" stroke="none" points="526.03,-947.4 526.03,-969.4 801.53,-969.4 801.53,-947.4 526.03,-947.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-947.4 526.03,-969.4 801.53,-969.4 801.53,-947.4 526.03,-947.4"/>
<polygon fill="#143826" stroke="none" points="527.03,-948.4 527.03,-968.4 598.8,-968.4 598.8,-948.4 527.03,-948.4"/>
<text xml:space="preserve" text-anchor="start" x="547.58" y="-957" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="602.8" y="-956.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">createCategory()</text>
<text xml:space="preserve" text-anchor="start" x="737.83" y="-955.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Insert child node</text>
<polygon fill="#272e3d" stroke="none" points="526.03,-925.4 526.03,-947.4 801.53,-947.4 801.53,-925.4 526.03,-925.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-925.4 526.03,-947.4 801.53,-947.4 801.53,-925.4 526.03,-925.4"/>
<polygon fill="#143826" stroke="none" points="527.03,-926.4 527.03,-946.4 597.4,-946.4 597.4,-926.4 527.03,-926.4"/>
<text xml:space="preserve" text-anchor="start" x="546.88" y="-935" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="601.4" y="-934.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">moveCategory()</text>
<text xml:space="preserve" text-anchor="start" x="730.27" y="-933.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Parent reparenting</text>
<polygon fill="#2a3242" stroke="none" points="526.03,-903.4 526.03,-925.4 801.53,-925.4 801.53,-903.4 526.03,-903.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-903.4 526.03,-925.4 801.53,-925.4 801.53,-903.4 526.03,-903.4"/>
<polygon fill="#143826" stroke="none" points="527.03,-904.4 527.03,-924.4 601.81,-924.4 601.81,-904.4 527.03,-904.4"/>
<text xml:space="preserve" text-anchor="start" x="549.08" y="-913" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="605.81" y="-912.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">deleteCategory()</text>
<text xml:space="preserve" text-anchor="start" x="746.28" y="-911.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Prune subtree</text>
<polygon fill="#272e3d" stroke="none" points="526.03,-881.4 526.03,-903.4 801.53,-903.4 801.53,-881.4 526.03,-881.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-881.4 526.03,-903.4 801.53,-903.4 801.53,-881.4 526.03,-881.4"/>
<polygon fill="#182b40" stroke="none" points="527.03,-882.4 527.03,-902.4 575.03,-902.4 575.03,-882.4 527.03,-882.4"/>
<text xml:space="preserve" text-anchor="start" x="535.25" y="-891" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="579.03" y="-890.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">getCategoryBreadcrumbs()</text>
<text xml:space="preserve" text-anchor="start" x="716.5" y="-889.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Hierarchical path trace</text>
<polygon fill="#2a3242" stroke="none" points="526.03,-859.4 526.03,-881.4 801.53,-881.4 801.53,-859.4 526.03,-859.4"/>
<polygon fill="none" stroke="#3f4c5f" points="526.03,-859.4 526.03,-881.4 801.53,-881.4 801.53,-859.4 526.03,-859.4"/>
<polygon fill="#3b2c12" stroke="none" points="527.03,-860.4 527.03,-880.4 593.55,-880.4 593.55,-860.4 527.03,-860.4"/>
<text xml:space="preserve" text-anchor="start" x="553.62" y="-869" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="597.55" y="-868.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/category</text>
<text xml:space="preserve" text-anchor="start" x="727.61" y="-867.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Recursive tree load</text>
</g>
<!-- authAutomat&#45;&gt;categoryAutomat -->
<g id="edge3" class="edge">
<title>authAutomat:w&#45;&gt;categoryAutomat:n</title>
<g id="a_edge3"><a xlink:title="authAutomat → categoryAutomat (sync tree on hasCompany)">
<path fill="none" stroke="#f5c15c" stroke-width="1.4" d="M1209.95,-1838C1041.15,-1838 1110.79,-1625.28 957.78,-1554 868.39,-1512.36 132.3,-1590.62 71.22,-1513.2 -17.14,-1401.19 -29.32,-1293.41 71.22,-1192.2 136.5,-1126.49 3340.5,-1235.91 3405.78,-1170.2 3409.16,-1166.79 3409.13,-1162.83 3405.78,-1159.4 3399.24,-1152.7 3078.14,-1151.63 3068.78,-1151.4 3003.45,-1149.82 786.43,-1158.3 647.93,-1097.5"/>
<polygon fill="#f5c15c" stroke="#f5c15c" stroke-width="1.4" points="649.57,-1095.68 642.73,-1092.82 646.29,-1099.32 649.57,-1095.68"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="128.5" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#f5c15c"> &#160;sync tree on hasCompany &#160;</text>
</g>
<!-- deliveryAutomat -->
<g id="node10" class="node">
<title>deliveryAutomat</title>
<polygon fill="#33415c" stroke="none" points="4625.74,-711.6 4625.74,-746.6 4863.81,-746.6 4863.81,-711.6 4625.74,-711.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-711.6 4625.74,-746.6 4863.81,-746.6 4863.81,-711.6 4625.74,-711.6"/>
<polygon fill="#33415c" stroke="none" points="4627.74,-740.6 4627.74,-744.6 4744.78,-744.6 4744.78,-740.6 4627.74,-740.6"/>
<polygon fill="#33415c" stroke="none" points="4744.78,-740.6 4744.78,-744.6 4861.81,-744.6 4861.81,-740.6 4744.78,-740.6"/>
<text xml:space="preserve" text-anchor="start" x="4697.77" y="-727.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">deliveryAutomat</text>
<text xml:space="preserve" text-anchor="start" x="4689" y="-718.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Chunk&#45;Paginated Deliveries</text>
<polygon fill="#2a3242" stroke="none" points="4625.74,-689.6 4625.74,-711.6 4863.81,-711.6 4863.81,-689.6 4625.74,-689.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-689.6 4625.74,-711.6 4863.81,-711.6 4863.81,-689.6 4625.74,-689.6"/>
<polygon fill="#2b1a42" stroke="none" points="4626.74,-690.6 4626.74,-710.6 4674.74,-710.6 4674.74,-690.6 4626.74,-690.6"/>
<text xml:space="preserve" text-anchor="start" x="4637.63" y="-699.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4678.74" y="-698.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">items: Delivery[]</text>
<text xml:space="preserve" text-anchor="start" x="4764.55" y="-697.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Company delivery receipts</text>
<polygon fill="#272e3d" stroke="none" points="4625.74,-667.6 4625.74,-689.6 4863.81,-689.6 4863.81,-667.6 4625.74,-667.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-667.6 4625.74,-689.6 4863.81,-689.6 4863.81,-667.6 4625.74,-667.6"/>
<polygon fill="#2b1a42" stroke="none" points="4626.74,-668.6 4626.74,-688.6 4688.87,-688.6 4688.87,-668.6 4626.74,-668.6"/>
<text xml:space="preserve" text-anchor="start" x="4644.7" y="-677.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4692.87" y="-676.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">status: &#39;ready&#39;</text>
<text xml:space="preserve" text-anchor="start" x="4796.12" y="-675.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">List lifecycle state</text>
<polygon fill="#2a3242" stroke="none" points="4625.74,-645.6 4625.74,-667.6 4863.81,-667.6 4863.81,-645.6 4625.74,-645.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-645.6 4625.74,-667.6 4863.81,-667.6 4863.81,-645.6 4625.74,-645.6"/>
<polygon fill="#143826" stroke="none" points="4626.74,-646.6 4626.74,-666.6 4677.2,-666.6 4677.2,-646.6 4626.74,-646.6"/>
<text xml:space="preserve" text-anchor="start" x="4636.64" y="-655.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4681.2" y="-654.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">load() / reload()</text>
<text xml:space="preserve" text-anchor="start" x="4766.32" y="-653.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Deduplicated fetch &amp; sync</text>
<polygon fill="#272e3d" stroke="none" points="4625.74,-623.6 4625.74,-645.6 4863.81,-645.6 4863.81,-623.6 4625.74,-623.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-623.6 4625.74,-645.6 4863.81,-645.6 4863.81,-623.6 4625.74,-623.6"/>
<polygon fill="#143826" stroke="none" points="4626.74,-624.6 4626.74,-644.6 4693.9,-644.6 4693.9,-624.6 4626.74,-624.6"/>
<text xml:space="preserve" text-anchor="start" x="4644.99" y="-633.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4697.9" y="-632.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reset()</text>
<text xml:space="preserve" text-anchor="start" x="4774.78" y="-631.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Clear on session switch</text>
<polygon fill="#2a3242" stroke="none" points="4625.74,-601.6 4625.74,-623.6 4863.81,-623.6 4863.81,-601.6 4625.74,-601.6"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.74,-601.6 4625.74,-623.6 4863.81,-623.6 4863.81,-601.6 4625.74,-601.6"/>
<polygon fill="#3b2c12" stroke="none" points="4626.74,-602.6 4626.74,-622.6 4681.18,-622.6 4681.18,-602.6 4626.74,-602.6"/>
<text xml:space="preserve" text-anchor="start" x="4647.3" y="-611.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="4685.18" y="-610.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/delivery</text>
<text xml:space="preserve" text-anchor="start" x="4787.21" y="-609.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Inbound delivery log</text>
</g>
<!-- authAutomat&#45;&gt;deliveryAutomat -->
<g id="edge4" class="edge">
<title>authAutomat:e&#45;&gt;deliveryAutomat:n</title>
<g id="a_edge4"><a xlink:title="authAutomat → deliveryAutomat (sync deliveries on authed)">
<path fill="none" stroke="#ff7fc2" stroke-width="1.4" d="M1531.61,-1772C1596.94,-1772 1574.04,-1673.81 1530.61,-1625 1445.34,-1529.17 1085.64,-1564.26 957.78,-1554 924.75,-1551.35 384.77,-1555.86 361.78,-1532 250.74,-1416.78 350.13,-1284.6 480.78,-1192.2 514.55,-1168.32 3418.71,-1180.47 3458.78,-1170.2 3744.41,-1097 3758.45,-933.49 4042.78,-855.4 4135.32,-829.98 4839.35,-888.66 4905.78,-819.4 4974.8,-747.44 4704.08,-842.24 4687.09,-754.66"/>
<polygon fill="#ff7fc2" stroke="#ff7fc2" stroke-width="1.4" points="4689.54,-754.46 4686.46,-747.71 4684.66,-754.9 4689.54,-754.46"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3549.83" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff7fc2"> &#160;sync deliveries on authed &#160;</text>
</g>
<!-- quoteAutomat -->
<g id="node12" class="node">
<title>quoteAutomat</title>
<polygon fill="#33415c" stroke="none" points="3107.3,-1792 3107.3,-1827 3328.26,-1827 3328.26,-1792 3107.3,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="3107.3,-1792 3107.3,-1827 3328.26,-1827 3328.26,-1792 3107.3,-1792"/>
<polygon fill="#33415c" stroke="none" points="3109.3,-1821 3109.3,-1825 3326.26,-1825 3326.26,-1821 3109.3,-1821"/>
<text xml:space="preserve" text-anchor="start" x="3177.12" y="-1808.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">quoteAutomat</text>
<text xml:space="preserve" text-anchor="start" x="3167.25" y="-1798.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Chunk&#45;Paginated Quotes</text>
<polygon fill="#2a3242" stroke="none" points="3107.3,-1770 3107.3,-1792 3328.26,-1792 3328.26,-1770 3107.3,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="3107.3,-1770 3107.3,-1792 3328.26,-1792 3328.26,-1770 3107.3,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="3108.3,-1771 3108.3,-1791 3156.3,-1791 3156.3,-1771 3108.3,-1771"/>
<text xml:space="preserve" text-anchor="start" x="3119.19" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="3160.3" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">items: Quote[]</text>
<text xml:space="preserve" text-anchor="start" x="3236.08" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Sales quotes / Angebote</text>
<polygon fill="#272e3d" stroke="none" points="3107.3,-1748 3107.3,-1770 3328.26,-1770 3328.26,-1748 3107.3,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="3107.3,-1748 3107.3,-1770 3328.26,-1770 3328.26,-1748 3107.3,-1748"/>
<polygon fill="#143826" stroke="none" points="3108.3,-1749 3108.3,-1769 3161.79,-1769 3161.79,-1749 3108.3,-1749"/>
<text xml:space="preserve" text-anchor="start" x="3119.71" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3165.79" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">load() / reload()</text>
<text xml:space="preserve" text-anchor="start" x="3256.99" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Deduplicated fetch</text>
<polygon fill="#2a3242" stroke="none" points="3107.3,-1726 3107.3,-1748 3328.26,-1748 3328.26,-1726 3107.3,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="3107.3,-1726 3107.3,-1748 3328.26,-1748 3328.26,-1726 3107.3,-1726"/>
<polygon fill="#143826" stroke="none" points="3108.3,-1727 3108.3,-1747 3179.09,-1747 3179.09,-1727 3108.3,-1727"/>
<text xml:space="preserve" text-anchor="start" x="3128.36" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3183.09" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reset()</text>
<text xml:space="preserve" text-anchor="start" x="3267.22" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reset on logout</text>
<polygon fill="#272e3d" stroke="none" points="3107.3,-1704 3107.3,-1726 3328.26,-1726 3328.26,-1704 3107.3,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="3107.3,-1704 3107.3,-1726 3328.26,-1726 3328.26,-1704 3107.3,-1704"/>
<polygon fill="#3b2c12" stroke="none" points="3108.3,-1705 3108.3,-1725 3161.61,-1725 3161.61,-1705 3108.3,-1705"/>
<text xml:space="preserve" text-anchor="start" x="3128.29" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="3165.61" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/quote</text>
<text xml:space="preserve" text-anchor="start" x="3254.78" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Company quote list</text>
</g>
<!-- authAutomat&#45;&gt;quoteAutomat -->
<g id="edge5" class="edge">
<title>authAutomat:e&#45;&gt;quoteAutomat:n</title>
<g id="a_edge5"><a xlink:title="authAutomat → quoteAutomat (sync quotes on authed)">
<path fill="none" stroke="#c79bff" stroke-width="1.4" d="M1531.61,-1772C1785.25,-1772 1809.13,-1942.89 2057.78,-1992.98 2310.09,-2043.82 3196.66,-2085.45 3217.41,-1835.03"/>
<polygon fill="#c79bff" stroke="#c79bff" stroke-width="1.4" points="3219.85,-1835.21 3217.69,-1828.12 3214.96,-1835.01 3219.85,-1835.21"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1761.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#c79bff"> &#160;sync quotes on authed &#160;</text>
</g>
<!-- orderAutomat -->
<g id="node13" class="node">
<title>orderAutomat</title>
<polygon fill="#33415c" stroke="none" points="3108.02,-1397.2 3108.02,-1432.2 3373.54,-1432.2 3373.54,-1397.2 3108.02,-1397.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1397.2 3108.02,-1432.2 3373.54,-1432.2 3373.54,-1397.2 3108.02,-1397.2"/>
<polygon fill="#33415c" stroke="none" points="3110.02,-1426.2 3110.02,-1430.2 3197.19,-1430.2 3197.19,-1426.2 3110.02,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="3197.19,-1426.2 3197.19,-1430.2 3284.36,-1430.2 3284.36,-1426.2 3197.19,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="3284.36,-1426.2 3284.36,-1430.2 3371.54,-1430.2 3371.54,-1426.2 3284.36,-1426.2"/>
<text xml:space="preserve" text-anchor="start" x="3201.11" y="-1413.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">orderAutomat</text>
<text xml:space="preserve" text-anchor="start" x="3177.99" y="-1404.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Chunk&#45;Paginated Order Engine</text>
<polygon fill="#2a3242" stroke="none" points="3108.02,-1375.2 3108.02,-1397.2 3373.54,-1397.2 3373.54,-1375.2 3108.02,-1375.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1375.2 3108.02,-1397.2 3373.54,-1397.2 3373.54,-1375.2 3108.02,-1375.2"/>
<polygon fill="#2b1a42" stroke="none" points="3109.02,-1376.2 3109.02,-1396.2 3177.77,-1396.2 3177.77,-1376.2 3109.02,-1376.2"/>
<text xml:space="preserve" text-anchor="start" x="3130.29" y="-1384.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="3181.77" y="-1384.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">items: Order[]</text>
<text xml:space="preserve" text-anchor="start" x="3297.39" y="-1383" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Sales orders &amp; lines</text>
<polygon fill="#272e3d" stroke="none" points="3108.02,-1353.2 3108.02,-1375.2 3373.54,-1375.2 3373.54,-1353.2 3108.02,-1353.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1353.2 3108.02,-1375.2 3373.54,-1375.2 3373.54,-1353.2 3108.02,-1353.2"/>
<polygon fill="#2b1a42" stroke="none" points="3109.02,-1354.2 3109.02,-1374.2 3176.59,-1374.2 3176.59,-1354.2 3109.02,-1354.2"/>
<text xml:space="preserve" text-anchor="start" x="3129.69" y="-1362.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="3180.59" y="-1362.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">total: number</text>
<text xml:space="preserve" text-anchor="start" x="3291.61" y="-1361" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Unfiltered order count</text>
<polygon fill="#2a3242" stroke="none" points="3108.02,-1331.2 3108.02,-1353.2 3373.54,-1353.2 3373.54,-1331.2 3108.02,-1331.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1331.2 3108.02,-1353.2 3373.54,-1353.2 3373.54,-1331.2 3108.02,-1331.2"/>
<polygon fill="#2b1a42" stroke="none" points="3109.02,-1332.2 3109.02,-1352.2 3157.41,-1352.2 3157.41,-1332.2 3109.02,-1332.2"/>
<text xml:space="preserve" text-anchor="start" x="3120.1" y="-1340.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="3161.41" y="-1340.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">onlyUnpaid / onlyUndelivered</text>
<text xml:space="preserve" text-anchor="start" x="3310.75" y="-1339" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fulfillment filters</text>
<polygon fill="#272e3d" stroke="none" points="3108.02,-1309.2 3108.02,-1331.2 3373.54,-1331.2 3373.54,-1309.2 3108.02,-1309.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1309.2 3108.02,-1331.2 3373.54,-1331.2 3373.54,-1309.2 3108.02,-1309.2"/>
<polygon fill="#143826" stroke="none" points="3109.02,-1310.2 3109.02,-1330.2 3168.1,-1330.2 3168.1,-1310.2 3109.02,-1310.2"/>
<text xml:space="preserve" text-anchor="start" x="3123.23" y="-1318.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3172.1" y="-1318.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">loadChunk(index)</text>
<text xml:space="preserve" text-anchor="start" x="3286.71" y="-1317" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Chunk size 50 prefetch</text>
<polygon fill="#2a3242" stroke="none" points="3108.02,-1287.2 3108.02,-1309.2 3373.54,-1309.2 3373.54,-1287.2 3108.02,-1287.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1287.2 3108.02,-1309.2 3373.54,-1309.2 3373.54,-1287.2 3108.02,-1287.2"/>
<polygon fill="#143826" stroke="none" points="3109.02,-1288.2 3109.02,-1308.2 3186.55,-1308.2 3186.55,-1288.2 3109.02,-1288.2"/>
<text xml:space="preserve" text-anchor="start" x="3132.46" y="-1296.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3190.55" y="-1296.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reload()</text>
<text xml:space="preserve" text-anchor="start" x="3294.28" y="-1295" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Silent orders re&#45;fetch</text>
<polygon fill="#272e3d" stroke="none" points="3108.02,-1265.2 3108.02,-1287.2 3373.54,-1287.2 3373.54,-1265.2 3108.02,-1265.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1265.2 3108.02,-1287.2 3373.54,-1287.2 3373.54,-1265.2 3108.02,-1265.2"/>
<polygon fill="#182b40" stroke="none" points="3109.02,-1266.2 3109.02,-1286.2 3157.02,-1286.2 3157.02,-1266.2 3109.02,-1266.2"/>
<text xml:space="preserve" text-anchor="start" x="3117.24" y="-1274.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="3161.02" y="-1274.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectOrders() / selectTotal()</text>
<text xml:space="preserve" text-anchor="start" x="3304.07" y="-1273" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Filter&#45;applied slice</text>
<polygon fill="#2a3242" stroke="none" points="3108.02,-1243.2 3108.02,-1265.2 3373.54,-1265.2 3373.54,-1243.2 3108.02,-1243.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1243.2 3108.02,-1265.2 3373.54,-1265.2 3373.54,-1243.2 3108.02,-1243.2"/>
<polygon fill="#3b2c12" stroke="none" points="3109.02,-1244.2 3109.02,-1264.2 3176.99,-1264.2 3176.99,-1244.2 3109.02,-1244.2"/>
<text xml:space="preserve" text-anchor="start" x="3136.34" y="-1252.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="3180.99" y="-1252.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/order</text>
<text xml:space="preserve" text-anchor="start" x="3297.83" y="-1251" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Paged order stream</text>
<polygon fill="#272e3d" stroke="none" points="3108.02,-1221.2 3108.02,-1243.2 3373.54,-1243.2 3373.54,-1221.2 3108.02,-1221.2"/>
<polygon fill="none" stroke="#3f4c5f" points="3108.02,-1221.2 3108.02,-1243.2 3373.54,-1243.2 3373.54,-1221.2 3108.02,-1221.2"/>
<polygon fill="#3a181e" stroke="none" points="3109.02,-1222.2 3109.02,-1242.2 3172.96,-1242.2 3172.96,-1222.2 3109.02,-1222.2"/>
<text xml:space="preserve" text-anchor="start" x="3132.99" y="-1230.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#f87171">SSE</text>
<text xml:space="preserve" text-anchor="start" x="3176.96" y="-1230.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">order / shipment</text>
<text xml:space="preserve" text-anchor="start" x="3295.18" y="-1229" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fulfillment mutations</text>
</g>
<!-- authAutomat&#45;&gt;orderAutomat -->
<g id="edge6" class="edge">
<title>authAutomat:e&#45;&gt;orderAutomat:n</title>
<g id="a_edge6"><a xlink:title="authAutomat → orderAutomat (sync orders on authed)">
<path fill="none" stroke="#5cd6d6" stroke-width="1.4" d="M1531.61,-1772C1873.92,-1772 2250.85,-1658.64 957.78,-1554 925.86,-1551.42 403.93,-1555.07 381.72,-1532 378.39,-1528.54 378.33,-1524.6 381.72,-1521.2 393.82,-1509.06 2832.79,-1515.48 2849.78,-1513.2 2985.29,-1495.01 3146.2,-1567.68 3153.36,-1440.3"/>
<polygon fill="#5cd6d6" stroke="#5cd6d6" stroke-width="1.4" points="3155.81,-1440.38 3153.55,-1433.32 3150.91,-1440.25 3155.81,-1440.38"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="431.25" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#5cd6d6"> &#160;sync orders on authed &#160;</text>
</g>
<!-- entityAutomat -->
<g id="node14" class="node">
<title>entityAutomat</title>
<polygon fill="#33415c" stroke="none" points="3140.21,-1002.4 3140.21,-1037.4 3363.35,-1037.4 3363.35,-1002.4 3140.21,-1002.4"/>
<polygon fill="none" stroke="#3f4c5f" points="3140.21,-1002.4 3140.21,-1037.4 3363.35,-1037.4 3363.35,-1002.4 3140.21,-1002.4"/>
<polygon fill="#33415c" stroke="none" points="3142.21,-1031.4 3142.21,-1035.4 3251.78,-1035.4 3251.78,-1031.4 3142.21,-1031.4"/>
<polygon fill="#33415c" stroke="none" points="3251.78,-1031.4 3251.78,-1035.4 3361.35,-1035.4 3361.35,-1031.4 3251.78,-1031.4"/>
<text xml:space="preserve" text-anchor="start" x="3211.45" y="-1018.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">entityAutomat</text>
<text xml:space="preserve" text-anchor="start" x="3192.76" y="-1009.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Customer &amp; Partner Directory</text>
<polygon fill="#2a3242" stroke="none" points="3140.21,-980.4 3140.21,-1002.4 3363.35,-1002.4 3363.35,-980.4 3140.21,-980.4"/>
<polygon fill="none" stroke="#3f4c5f" points="3140.21,-980.4 3140.21,-1002.4 3363.35,-1002.4 3363.35,-980.4 3140.21,-980.4"/>
<polygon fill="#2b1a42" stroke="none" points="3141.21,-981.4 3141.21,-1001.4 3193.43,-1001.4 3193.43,-981.4 3141.21,-981.4"/>
<text xml:space="preserve" text-anchor="start" x="3154.21" y="-990" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="3197.43" y="-989.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">items: Entity[]</text>
<text xml:space="preserve" text-anchor="start" x="3280.55" y="-988.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Customers &amp; partners</text>
<polygon fill="#272e3d" stroke="none" points="3140.21,-958.4 3140.21,-980.4 3363.35,-980.4 3363.35,-958.4 3140.21,-958.4"/>
<polygon fill="none" stroke="#3f4c5f" points="3140.21,-958.4 3140.21,-980.4 3363.35,-980.4 3363.35,-958.4 3140.21,-958.4"/>
<polygon fill="#143826" stroke="none" points="3141.21,-959.4 3141.21,-979.4 3189.21,-979.4 3189.21,-959.4 3141.21,-959.4"/>
<text xml:space="preserve" text-anchor="start" x="3149.88" y="-968" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3193.21" y="-967.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">load() / reload()</text>
<text xml:space="preserve" text-anchor="start" x="3273.43" y="-966.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Customer directory load</text>
<polygon fill="#2a3242" stroke="none" points="3140.21,-936.4 3140.21,-958.4 3363.35,-958.4 3363.35,-936.4 3140.21,-936.4"/>
<polygon fill="none" stroke="#3f4c5f" points="3140.21,-936.4 3140.21,-958.4 3363.35,-958.4 3363.35,-936.4 3140.21,-936.4"/>
<polygon fill="#143826" stroke="none" points="3141.21,-937.4 3141.21,-957.4 3202.79,-957.4 3202.79,-937.4 3141.21,-937.4"/>
<text xml:space="preserve" text-anchor="start" x="3156.67" y="-946" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="3206.79" y="-945.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reset()</text>
<text xml:space="preserve" text-anchor="start" x="3272.53" y="-944.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reset on session switch</text>
<polygon fill="#272e3d" stroke="none" points="3140.21,-914.4 3140.21,-936.4 3363.35,-936.4 3363.35,-914.4 3140.21,-914.4"/>
<polygon fill="none" stroke="#3f4c5f" points="3140.21,-914.4 3140.21,-936.4 3363.35,-936.4 3363.35,-914.4 3140.21,-914.4"/>
<polygon fill="#3b2c12" stroke="none" points="3141.21,-915.4 3141.21,-935.4 3197.95,-935.4 3197.95,-915.4 3141.21,-915.4"/>
<text xml:space="preserve" text-anchor="start" x="3162.91" y="-924" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="3201.95" y="-923.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/entity</text>
<text xml:space="preserve" text-anchor="start" x="3297.45" y="-922.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Directory records</text>
</g>
<!-- authAutomat&#45;&gt;entityAutomat -->
<g id="edge7" class="edge">
<title>authAutomat:e&#45;&gt;entityAutomat:n</title>
<g id="a_edge7"><a xlink:title="authAutomat → entityAutomat (sync entities on authed)">
<path fill="none" stroke="#ff9f5a" stroke-width="1.4" d="M1531.61,-1772C1596.94,-1772 1574.04,-1673.81 1530.61,-1625 1445.34,-1529.17 1085.58,-1564.9 957.78,-1554 931.73,-1551.78 505.83,-1550.91 487.78,-1532 484.47,-1528.53 484.41,-1524.62 487.78,-1521.2 496.93,-1511.89 945.01,-1515.93 957.78,-1513.2 1312.73,-1437.36 1353.55,-1267.01 1708.72,-1192.2 1761.92,-1180.99 3627.55,-1208.86 3665.78,-1170.2 3815.97,-1018.31 3214.43,-1246.44 3197.36,-1045.33"/>
<polygon fill="#ff9f5a" stroke="#ff9f5a" stroke-width="1.4" points="3199.82,-1045.41 3197.08,-1038.52 3194.92,-1045.61 3199.82,-1045.41"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1759.75" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff9f5a"> &#160;sync entities on authed &#160;</text>
</g>
<!-- chatAutomat -->
<g id="node15" class="node">
<title>chatAutomat</title>
<polygon fill="#33415c" stroke="none" points="1849.69,-1408.2 1849.69,-1443.2 2141.87,-1443.2 2141.87,-1408.2 1849.69,-1408.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1408.2 1849.69,-1443.2 2141.87,-1443.2 2141.87,-1408.2 1849.69,-1408.2"/>
<polygon fill="#33415c" stroke="none" points="1851.69,-1437.2 1851.69,-1441.2 1947.75,-1441.2 1947.75,-1437.2 1851.69,-1437.2"/>
<polygon fill="#33415c" stroke="none" points="1947.75,-1437.2 1947.75,-1441.2 2043.81,-1441.2 2043.81,-1437.2 1947.75,-1437.2"/>
<polygon fill="#33415c" stroke="none" points="2043.81,-1437.2 2043.81,-1441.2 2139.87,-1441.2 2139.87,-1437.2 2043.81,-1437.2"/>
<text xml:space="preserve" text-anchor="start" x="1959.11" y="-1424.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">chatAutomat</text>
<text xml:space="preserve" text-anchor="start" x="1941.76" y="-1415.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">AI Assistant Drawer &amp; SSE</text>
<polygon fill="#2a3242" stroke="none" points="1849.69,-1386.2 1849.69,-1408.2 2141.87,-1408.2 2141.87,-1386.2 1849.69,-1386.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1386.2 1849.69,-1408.2 2141.87,-1408.2 2141.87,-1386.2 1849.69,-1386.2"/>
<polygon fill="#2b1a42" stroke="none" points="1850.69,-1387.2 1850.69,-1407.2 1916.25,-1407.2 1916.25,-1387.2 1850.69,-1387.2"/>
<text xml:space="preserve" text-anchor="start" x="1870.35" y="-1395.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1920.25" y="-1395.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">isOpen: boolean</text>
<text xml:space="preserve" text-anchor="start" x="2041.71" y="-1394" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Docked chat drawer toggle</text>
<polygon fill="#272e3d" stroke="none" points="1849.69,-1364.2 1849.69,-1386.2 2141.87,-1386.2 2141.87,-1364.2 1849.69,-1364.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1364.2 1849.69,-1386.2 2141.87,-1386.2 2141.87,-1364.2 1849.69,-1364.2"/>
<polygon fill="#2b1a42" stroke="none" points="1850.69,-1365.2 1850.69,-1385.2 1920.4,-1385.2 1920.4,-1365.2 1850.69,-1365.2"/>
<text xml:space="preserve" text-anchor="start" x="1872.43" y="-1373.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1924.4" y="-1373.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">conversations: []</text>
<text xml:space="preserve" text-anchor="start" x="2056.39" y="-1372" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Conversation sessions</text>
<polygon fill="#2a3242" stroke="none" points="1849.69,-1342.2 1849.69,-1364.2 2141.87,-1364.2 2141.87,-1342.2 1849.69,-1342.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1342.2 1849.69,-1364.2 2141.87,-1364.2 2141.87,-1342.2 1849.69,-1342.2"/>
<polygon fill="#2b1a42" stroke="none" points="1850.69,-1343.2 1850.69,-1363.2 1901.83,-1363.2 1901.83,-1343.2 1850.69,-1343.2"/>
<text xml:space="preserve" text-anchor="start" x="1863.15" y="-1351.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1905.83" y="-1351.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">messages: ModelMessage[]</text>
<text xml:space="preserve" text-anchor="start" x="2052.39" y="-1350" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Live message transcript</text>
<polygon fill="#272e3d" stroke="none" points="1849.69,-1320.2 1849.69,-1342.2 2141.87,-1342.2 2141.87,-1320.2 1849.69,-1320.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1320.2 1849.69,-1342.2 2141.87,-1342.2 2141.87,-1320.2 1849.69,-1320.2"/>
<polygon fill="#2b1a42" stroke="none" points="1850.69,-1321.2 1850.69,-1341.2 1909.29,-1341.2 1909.29,-1321.2 1850.69,-1321.2"/>
<text xml:space="preserve" text-anchor="start" x="1866.88" y="-1329.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="1913.29" y="-1329.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">sseStatus: &#39;connected&#39;</text>
<text xml:space="preserve" text-anchor="start" x="2050.62" y="-1328" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Token streaming stream</text>
<polygon fill="#2a3242" stroke="none" points="1849.69,-1298.2 1849.69,-1320.2 2141.87,-1320.2 2141.87,-1298.2 1849.69,-1298.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1298.2 1849.69,-1320.2 2141.87,-1320.2 2141.87,-1298.2 1849.69,-1298.2"/>
<polygon fill="#143826" stroke="none" points="1850.69,-1299.2 1850.69,-1319.2 1915.62,-1319.2 1915.62,-1299.2 1850.69,-1299.2"/>
<text xml:space="preserve" text-anchor="start" x="1867.82" y="-1307.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="1919.62" y="-1307.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">sendMessage(text)</text>
<text xml:space="preserve" text-anchor="start" x="2051.51" y="-1306" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Prompt model with tools</text>
<polygon fill="#272e3d" stroke="none" points="1849.69,-1276.2 1849.69,-1298.2 2141.87,-1298.2 2141.87,-1276.2 1849.69,-1276.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1276.2 1849.69,-1298.2 2141.87,-1298.2 2141.87,-1276.2 1849.69,-1276.2"/>
<polygon fill="#143826" stroke="none" points="1850.69,-1277.2 1850.69,-1297.2 1921.5,-1297.2 1921.5,-1277.2 1850.69,-1277.2"/>
<text xml:space="preserve" text-anchor="start" x="1870.76" y="-1285.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="1925.5" y="-1285.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">answerAskUser()</text>
<text xml:space="preserve" text-anchor="start" x="2060.83" y="-1284" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Interactive tool modal</text>
<polygon fill="#2a3242" stroke="none" points="1849.69,-1254.2 1849.69,-1276.2 2141.87,-1276.2 2141.87,-1254.2 1849.69,-1254.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1254.2 1849.69,-1276.2 2141.87,-1276.2 2141.87,-1254.2 1849.69,-1254.2"/>
<polygon fill="#182b40" stroke="none" points="1850.69,-1255.2 1850.69,-1275.2 1916.17,-1275.2 1916.17,-1255.2 1850.69,-1255.2"/>
<text xml:space="preserve" text-anchor="start" x="1867.65" y="-1263.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="1920.17" y="-1263.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">userEnv / routeTools</text>
<text xml:space="preserve" text-anchor="start" x="2062.6" y="-1262" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Client navigation tool</text>
<polygon fill="#272e3d" stroke="none" points="1849.69,-1232.2 1849.69,-1254.2 2141.87,-1254.2 2141.87,-1232.2 1849.69,-1232.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1232.2 1849.69,-1254.2 2141.87,-1254.2 2141.87,-1232.2 1849.69,-1232.2"/>
<polygon fill="#3b2c12" stroke="none" points="1850.69,-1233.2 1850.69,-1253.2 1898.69,-1253.2 1898.69,-1233.2 1850.69,-1233.2"/>
<text xml:space="preserve" text-anchor="start" x="1868.02" y="-1241.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="1902.69" y="-1241.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">POST /api/modelconversation</text>
<text xml:space="preserve" text-anchor="start" x="2052.38" y="-1240" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">AI conversation session</text>
<polygon fill="#2a3242" stroke="none" points="1849.69,-1210.2 1849.69,-1232.2 2141.87,-1232.2 2141.87,-1210.2 1849.69,-1210.2"/>
<polygon fill="none" stroke="#3f4c5f" points="1849.69,-1210.2 1849.69,-1232.2 2141.87,-1232.2 2141.87,-1210.2 1849.69,-1210.2"/>
<polygon fill="#3a181e" stroke="none" points="1850.69,-1211.2 1850.69,-1231.2 1910.98,-1231.2 1910.98,-1211.2 1850.69,-1211.2"/>
<text xml:space="preserve" text-anchor="start" x="1872.83" y="-1219.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#f87171">SSE</text>
<text xml:space="preserve" text-anchor="start" x="1914.98" y="-1219.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">modelconversation/events</text>
<text xml:space="preserve" text-anchor="start" x="2073.73" y="-1218" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Live token stream</text>
</g>
<!-- authAutomat&#45;&gt;chatAutomat -->
<g id="edge8" class="edge">
<title>authAutomat:e&#45;&gt;chatAutomat:n</title>
<g id="a_edge8"><a xlink:title="authAutomat → chatAutomat (auth chat &amp; reload)">
<path fill="none" stroke="#8f95ff" stroke-width="1.4" d="M1531.61,-1772C1748.27,-1772 1895.64,-1664.85 1899.63,-1451.15"/>
<polygon fill="#8f95ff" stroke="#8f95ff" stroke-width="1.4" points="1902.08,-1451.34 1899.7,-1444.32 1897.18,-1451.3 1902.08,-1451.34"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1933.51" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8f95ff"> &#160;auth chat &amp; reload &#160;</text>
</g>
<!-- vfsAutomat -->
<g id="node16" class="node">
<title>vfsAutomat</title>
<polygon fill="#33415c" stroke="none" points="2317.87,-1386.2 2317.87,-1421.2 2571.69,-1421.2 2571.69,-1386.2 2317.87,-1386.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1386.2 2317.87,-1421.2 2571.69,-1421.2 2571.69,-1386.2 2317.87,-1386.2"/>
<polygon fill="#33415c" stroke="none" points="2319.87,-1415.2 2319.87,-1419.2 2403.14,-1419.2 2403.14,-1415.2 2319.87,-1415.2"/>
<polygon fill="#33415c" stroke="none" points="2403.14,-1415.2 2403.14,-1419.2 2486.42,-1419.2 2486.42,-1415.2 2403.14,-1415.2"/>
<polygon fill="#33415c" stroke="none" points="2486.42,-1415.2 2486.42,-1419.2 2569.69,-1419.2 2569.69,-1415.2 2486.42,-1415.2"/>
<text xml:space="preserve" text-anchor="start" x="2411.78" y="-1402.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">vfsAutomat</text>
<text xml:space="preserve" text-anchor="start" x="2391.26" y="-1393.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Virtual Filesystem Explorer</text>
<polygon fill="#2a3242" stroke="none" points="2317.87,-1364.2 2317.87,-1386.2 2571.69,-1386.2 2571.69,-1364.2 2317.87,-1364.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1364.2 2317.87,-1386.2 2571.69,-1386.2 2571.69,-1364.2 2317.87,-1364.2"/>
<polygon fill="#2b1a42" stroke="none" points="2318.87,-1365.2 2318.87,-1385.2 2376.79,-1385.2 2376.79,-1365.2 2318.87,-1365.2"/>
<text xml:space="preserve" text-anchor="start" x="2334.72" y="-1373.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2380.79" y="-1373.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">files: VfsFile[]</text>
<text xml:space="preserve" text-anchor="start" x="2474.21" y="-1372" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Company VFS workspace</text>
<polygon fill="#272e3d" stroke="none" points="2317.87,-1342.2 2317.87,-1364.2 2571.69,-1364.2 2571.69,-1342.2 2317.87,-1342.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1342.2 2317.87,-1364.2 2571.69,-1364.2 2571.69,-1342.2 2317.87,-1342.2"/>
<polygon fill="#2b1a42" stroke="none" points="2318.87,-1343.2 2318.87,-1363.2 2380.56,-1363.2 2380.56,-1343.2 2318.87,-1343.2"/>
<text xml:space="preserve" text-anchor="start" x="2336.61" y="-1351.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2384.56" y="-1351.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectedFileName</text>
<text xml:space="preserve" text-anchor="start" x="2504.44" y="-1350" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Current active file</text>
<polygon fill="#2a3242" stroke="none" points="2317.87,-1320.2 2317.87,-1342.2 2571.69,-1342.2 2571.69,-1320.2 2317.87,-1320.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1320.2 2317.87,-1342.2 2571.69,-1342.2 2571.69,-1320.2 2317.87,-1320.2"/>
<polygon fill="#2b1a42" stroke="none" points="2318.87,-1321.2 2318.87,-1341.2 2377.57,-1341.2 2377.57,-1321.2 2318.87,-1321.2"/>
<text xml:space="preserve" text-anchor="start" x="2335.11" y="-1329.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="2381.57" y="-1329.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">fileContent / isDirty</text>
<text xml:space="preserve" text-anchor="start" x="2502.66" y="-1328" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Editor buffer &amp; diff</text>
<polygon fill="#272e3d" stroke="none" points="2317.87,-1298.2 2317.87,-1320.2 2571.69,-1320.2 2571.69,-1298.2 2317.87,-1298.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1298.2 2317.87,-1320.2 2571.69,-1320.2 2571.69,-1298.2 2317.87,-1298.2"/>
<polygon fill="#143826" stroke="none" points="2318.87,-1299.2 2318.87,-1319.2 2371.37,-1319.2 2371.37,-1299.2 2318.87,-1299.2"/>
<text xml:space="preserve" text-anchor="start" x="2329.79" y="-1307.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2375.37" y="-1307.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectFile() / saveFile()</text>
<text xml:space="preserve" text-anchor="start" x="2499.09" y="-1306" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Applet editor buffer</text>
<polygon fill="#2a3242" stroke="none" points="2317.87,-1276.2 2317.87,-1298.2 2571.69,-1298.2 2571.69,-1276.2 2317.87,-1276.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1276.2 2317.87,-1298.2 2571.69,-1298.2 2571.69,-1276.2 2317.87,-1276.2"/>
<polygon fill="#143826" stroke="none" points="2318.87,-1277.2 2318.87,-1297.2 2366.87,-1297.2 2366.87,-1277.2 2318.87,-1277.2"/>
<text xml:space="preserve" text-anchor="start" x="2327.54" y="-1285.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="2370.87" y="-1285.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">uploadFiles() / deleteFile()</text>
<text xml:space="preserve" text-anchor="start" x="2502.21" y="-1284" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">File manipulations</text>
<polygon fill="#272e3d" stroke="none" points="2317.87,-1254.2 2317.87,-1276.2 2571.69,-1276.2 2571.69,-1254.2 2317.87,-1254.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1254.2 2317.87,-1276.2 2571.69,-1276.2 2571.69,-1254.2 2317.87,-1254.2"/>
<polygon fill="#3b2c12" stroke="none" points="2318.87,-1255.2 2318.87,-1275.2 2386.94,-1275.2 2386.94,-1255.2 2318.87,-1255.2"/>
<text xml:space="preserve" text-anchor="start" x="2346.24" y="-1263.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="2390.94" y="-1263.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/vfs</text>
<text xml:space="preserve" text-anchor="start" x="2496.89" y="-1262" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">VFS directory index</text>
<polygon fill="#2a3242" stroke="none" points="2317.87,-1232.2 2317.87,-1254.2 2571.69,-1254.2 2571.69,-1232.2 2317.87,-1232.2"/>
<polygon fill="none" stroke="#3f4c5f" points="2317.87,-1232.2 2317.87,-1254.2 2571.69,-1254.2 2571.69,-1232.2 2317.87,-1232.2"/>
<polygon fill="#3a181e" stroke="none" points="2318.87,-1233.2 2318.87,-1253.2 2400.79,-1253.2 2400.79,-1233.2 2318.87,-1233.2"/>
<text xml:space="preserve" text-anchor="start" x="2351.83" y="-1241.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#f87171">SSE</text>
<text xml:space="preserve" text-anchor="start" x="2404.79" y="-1241.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">vfs</text>
<text xml:space="preserve" text-anchor="start" x="2495.1" y="-1240" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">VFS mutation signal</text>
</g>
<!-- authAutomat&#45;&gt;vfsAutomat -->
<g id="edge9" class="edge">
<title>authAutomat:e&#45;&gt;vfsAutomat:n</title>
<g id="a_edge9"><a xlink:title="authAutomat → vfsAutomat (load company vfs)">
<path fill="none" stroke="#ff6b6b" stroke-width="1.4" d="M1531.61,-1772C1596.94,-1772 1572.71,-1674.96 1530.61,-1625 1378.77,-1444.84 844.71,-1688.37 1010.74,-1521.2 1022.22,-1509.64 2167.97,-1517.14 2183.78,-1513.2 2267.24,-1492.38 2355.1,-1508.15 2361.17,-1429.21"/>
<polygon fill="#ff6b6b" stroke="#ff6b6b" stroke-width="1.4" points="2363.62,-1429.4 2361.43,-1422.32 2358.72,-1429.22 2363.62,-1429.4"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1050.76" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff6b6b"> &#160;load company vfs &#160;</text>
</g>
<!-- articleHistoryGridAutomat -->
<g id="node17" class="node">
<title>articleHistoryGridAutomat</title>
<polygon fill="#33415c" stroke="none" points="5420.76,-1792 5420.76,-1827 5668.79,-1827 5668.79,-1792 5420.76,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="5420.76,-1792 5420.76,-1827 5668.79,-1827 5668.79,-1792 5420.76,-1792"/>
<polygon fill="#33415c" stroke="none" points="5422.76,-1821 5422.76,-1825 5666.79,-1825 5666.79,-1821 5422.76,-1821"/>
<text xml:space="preserve" text-anchor="start" x="5469.76" y="-1808.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">articleHistoryGridAutomat</text>
<text xml:space="preserve" text-anchor="start" x="5490.26" y="-1798.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">createGridAutomat (Article)</text>
<polygon fill="#2a3242" stroke="none" points="5420.76,-1770 5420.76,-1792 5668.79,-1792 5668.79,-1770 5420.76,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="5420.76,-1770 5420.76,-1792 5668.79,-1792 5668.79,-1770 5420.76,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="5421.76,-1771 5421.76,-1791 5469.76,-1791 5469.76,-1771 5421.76,-1771"/>
<text xml:space="preserve" text-anchor="start" x="5432.65" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="5473.76" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">rows: [] / totalRows</text>
<text xml:space="preserve" text-anchor="start" x="5573.99" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Block size 50 virtual rows</text>
<polygon fill="#272e3d" stroke="none" points="5420.76,-1748 5420.76,-1770 5668.79,-1770 5668.79,-1748 5420.76,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="5420.76,-1748 5420.76,-1770 5668.79,-1770 5668.79,-1748 5420.76,-1748"/>
<polygon fill="#143826" stroke="none" points="5421.76,-1749 5421.76,-1769 5475.43,-1769 5475.43,-1749 5421.76,-1749"/>
<text xml:space="preserve" text-anchor="start" x="5433.26" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="5479.43" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">fetchRows(viewport)</text>
<text xml:space="preserve" text-anchor="start" x="5597.1" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Infinite scroll query</text>
<polygon fill="#2a3242" stroke="none" points="5420.76,-1726 5420.76,-1748 5668.79,-1748 5668.79,-1726 5420.76,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="5420.76,-1726 5420.76,-1748 5668.79,-1748 5668.79,-1726 5420.76,-1726"/>
<polygon fill="#143826" stroke="none" points="5421.76,-1727 5421.76,-1747 5486.35,-1747 5486.35,-1727 5421.76,-1727"/>
<text xml:space="preserve" text-anchor="start" x="5438.72" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="5490.35" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reload()</text>
<text xml:space="preserve" text-anchor="start" x="5568.19" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reload on company switch</text>
<polygon fill="#272e3d" stroke="none" points="5420.76,-1704 5420.76,-1726 5668.79,-1726 5668.79,-1704 5420.76,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="5420.76,-1704 5420.76,-1726 5668.79,-1726 5668.79,-1704 5420.76,-1704"/>
<polygon fill="#3b2c12" stroke="none" points="5421.76,-1705 5421.76,-1725 5470.12,-1725 5470.12,-1705 5421.76,-1705"/>
<text xml:space="preserve" text-anchor="start" x="5439.27" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="5474.12" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/article/history</text>
<text xml:space="preserve" text-anchor="start" x="5591.75" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Infinite audit window</text>
</g>
<!-- authAutomat&#45;&gt;articleHistoryGridAutomat -->
<g id="edge10" class="edge">
<title>authAutomat:e&#45;&gt;articleHistoryGridAutomat:n</title>
<g id="a_edge10"><a xlink:title="authAutomat → articleHistoryGridAutomat (reload history on authed)">
<path fill="none" stroke="#58d18a" stroke-width="1.4" d="M1531.61,-1772C1785.25,-1772 1809.13,-1942.89 2057.78,-1992.98 2238.48,-2029.39 5205.27,-2063.01 5375.78,-1992.98 5470.59,-1954.04 5540.58,-1932.85 5544.6,-1835.07"/>
<polygon fill="#58d18a" stroke="#58d18a" stroke-width="1.4" points="5547.05,-1835.17 5544.74,-1828.12 5542.15,-1835.07 5547.05,-1835.17"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3616.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#58d18a"> &#160;reload history on authed &#160;</text>
</g>
<!-- globalHistoryGridAutomat -->
<g id="node18" class="node">
<title>globalHistoryGridAutomat</title>
<polygon fill="#33415c" stroke="none" points="5753.03,-1792 5753.03,-1827 6002.53,-1827 6002.53,-1792 5753.03,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="5753.03,-1792 5753.03,-1827 6002.53,-1827 6002.53,-1792 5753.03,-1792"/>
<polygon fill="#33415c" stroke="none" points="5755.03,-1821 5755.03,-1825 6000.53,-1825 6000.53,-1821 5755.03,-1821"/>
<text xml:space="preserve" text-anchor="start" x="5802.78" y="-1808.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">globalHistoryGridAutomat</text>
<text xml:space="preserve" text-anchor="start" x="5822.76" y="-1798.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">createGridAutomat (Global)</text>
<polygon fill="#2a3242" stroke="none" points="5753.03,-1770 5753.03,-1792 6002.53,-1792 6002.53,-1770 5753.03,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="5753.03,-1770 5753.03,-1792 6002.53,-1792 6002.53,-1770 5753.03,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="5754.03,-1771 5754.03,-1791 5802.52,-1791 5802.52,-1771 5754.03,-1771"/>
<text xml:space="preserve" text-anchor="start" x="5765.16" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="5806.52" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">rows: [] / totalRows</text>
<text xml:space="preserve" text-anchor="start" x="5907.72" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Block size 50 virtual rows</text>
<polygon fill="#272e3d" stroke="none" points="5753.03,-1748 5753.03,-1770 6002.53,-1770 6002.53,-1748 5753.03,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="5753.03,-1748 5753.03,-1770 6002.53,-1770 6002.53,-1748 5753.03,-1748"/>
<polygon fill="#143826" stroke="none" points="5754.03,-1749 5754.03,-1769 5808.18,-1769 5808.18,-1749 5754.03,-1749"/>
<text xml:space="preserve" text-anchor="start" x="5765.77" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="5812.18" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">fetchRows(viewport)</text>
<text xml:space="preserve" text-anchor="start" x="5930.84" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Infinite scroll query</text>
<polygon fill="#2a3242" stroke="none" points="5753.03,-1726 5753.03,-1748 6002.53,-1748 6002.53,-1726 5753.03,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="5753.03,-1726 5753.03,-1748 6002.53,-1748 6002.53,-1726 5753.03,-1726"/>
<polygon fill="#143826" stroke="none" points="5754.03,-1727 5754.03,-1747 5819.1,-1747 5819.1,-1727 5754.03,-1727"/>
<text xml:space="preserve" text-anchor="start" x="5771.23" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="5823.1" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reload()</text>
<text xml:space="preserve" text-anchor="start" x="5901.93" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reload on company switch</text>
<polygon fill="#272e3d" stroke="none" points="5753.03,-1704 5753.03,-1726 6002.53,-1726 6002.53,-1704 5753.03,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="5753.03,-1704 5753.03,-1726 6002.53,-1726 6002.53,-1704 5753.03,-1704"/>
<polygon fill="#3b2c12" stroke="none" points="5754.03,-1705 5754.03,-1725 5802.03,-1725 5802.03,-1705 5754.03,-1705"/>
<text xml:space="preserve" text-anchor="start" x="5771.36" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="5806.03" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/globalhistory</text>
<text xml:space="preserve" text-anchor="start" x="5920.15" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Company global audit</text>
</g>
<!-- authAutomat&#45;&gt;globalHistoryGridAutomat -->
<g id="edge11" class="edge">
<title>authAutomat:e&#45;&gt;globalHistoryGridAutomat:n</title>
<g id="a_edge11"><a xlink:title="authAutomat → globalHistoryGridAutomat (reload audit on authed)">
<path fill="none" stroke="#4fc4e8" stroke-width="1.4" d="M1531.61,-1772C1785.25,-1772 1809.13,-1942.89 2057.78,-1992.98 2256.73,-2033.06 5523.28,-2070.64 5710.78,-1992.98 5804.91,-1954 5873.65,-1932.26 5877.6,-1835.01"/>
<polygon fill="#4fc4e8" stroke="#4fc4e8" stroke-width="1.4" points="5880.05,-1835.17 5877.74,-1828.12 5875.15,-1835.07 5880.05,-1835.17"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1656.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#4fc4e8"> &#160;reload audit on authed &#160;</text>
</g>
<!-- ledgerHistoryGridAutomat -->
<g id="node19" class="node">
<title>ledgerHistoryGridAutomat</title>
<polygon fill="#33415c" stroke="none" points="6086.57,-1792 6086.57,-1827 6350.99,-1827 6350.99,-1792 6086.57,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="6086.57,-1792 6086.57,-1827 6350.99,-1827 6350.99,-1792 6086.57,-1792"/>
<polygon fill="#33415c" stroke="none" points="6088.57,-1821 6088.57,-1825 6348.99,-1825 6348.99,-1821 6088.57,-1821"/>
<text xml:space="preserve" text-anchor="start" x="6143.44" y="-1808.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">ledgerHistoryGridAutomat</text>
<text xml:space="preserve" text-anchor="start" x="6162.75" y="-1798.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">createGridAutomat (Ledger)</text>
<polygon fill="#2a3242" stroke="none" points="6086.57,-1770 6086.57,-1792 6350.99,-1792 6350.99,-1770 6086.57,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="6086.57,-1770 6086.57,-1792 6350.99,-1792 6350.99,-1770 6086.57,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="6087.57,-1771 6087.57,-1791 6141.03,-1791 6141.03,-1771 6087.57,-1771"/>
<text xml:space="preserve" text-anchor="start" x="6101.19" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="6145.03" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">rows: [] / totalRows</text>
<text xml:space="preserve" text-anchor="start" x="6256.18" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Block size 50 virtual rows</text>
<polygon fill="#272e3d" stroke="none" points="6086.57,-1748 6086.57,-1770 6350.99,-1770 6350.99,-1748 6086.57,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="6086.57,-1748 6086.57,-1770 6350.99,-1770 6350.99,-1748 6086.57,-1748"/>
<polygon fill="#143826" stroke="none" points="6087.57,-1749 6087.57,-1769 6146.7,-1769 6146.7,-1749 6087.57,-1749"/>
<text xml:space="preserve" text-anchor="start" x="6101.8" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="6150.7" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">fetchRows(viewport)</text>
<text xml:space="preserve" text-anchor="start" x="6279.29" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Infinite scroll query</text>
<polygon fill="#2a3242" stroke="none" points="6086.57,-1726 6086.57,-1748 6350.99,-1748 6350.99,-1726 6086.57,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="6086.57,-1726 6086.57,-1748 6350.99,-1748 6350.99,-1726 6086.57,-1726"/>
<polygon fill="#143826" stroke="none" points="6087.57,-1727 6087.57,-1747 6157.62,-1747 6157.62,-1727 6087.57,-1727"/>
<text xml:space="preserve" text-anchor="start" x="6107.26" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="6161.62" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reload()</text>
<text xml:space="preserve" text-anchor="start" x="6250.38" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reload on company switch</text>
<polygon fill="#272e3d" stroke="none" points="6086.57,-1704 6086.57,-1726 6350.99,-1726 6350.99,-1704 6086.57,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="6086.57,-1704 6086.57,-1726 6350.99,-1726 6350.99,-1704 6086.57,-1704"/>
<polygon fill="#3b2c12" stroke="none" points="6087.57,-1705 6087.57,-1725 6135.57,-1725 6135.57,-1705 6087.57,-1705"/>
<text xml:space="preserve" text-anchor="start" x="6104.9" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="6139.57" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/ledger/history</text>
<text xml:space="preserve" text-anchor="start" x="6257.04" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Append&#45;only ledger audit</text>
</g>
<!-- authAutomat&#45;&gt;ledgerHistoryGridAutomat -->
<g id="edge12" class="edge">
<title>authAutomat:e&#45;&gt;ledgerHistoryGridAutomat:n</title>
<g id="a_edge12"><a xlink:title="authAutomat → ledgerHistoryGridAutomat (reload ledger on authed)">
<path fill="none" stroke="#a98cff" stroke-width="1.4" d="M1531.61,-1772C1785.25,-1772 1809.13,-1942.89 2057.78,-1992.98 2274.92,-2036.73 5839.28,-2075.64 6044.78,-1992.98 6141.4,-1954.12 6214.54,-1934.32 6218.6,-1834.9"/>
<polygon fill="#a98cff" stroke="#a98cff" stroke-width="1.4" points="6221.05,-1835.17 6218.74,-1828.12 6216.15,-1835.07 6221.05,-1835.17"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4772.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a98cff"> &#160;reload ledger on authed &#160;</text>
</g>
<!-- sseAutomat&#45;&gt;companyAutomat -->
<g id="edge18" class="edge">
<title>sseAutomat:e&#45;&gt;companyAutomat:n</title>
<g id="a_edge18"><a xlink:title="sseAutomat → companyAutomat (warehouse/supplier/brand/attr/prop/carrier sse)">
<path fill="none" stroke="#ff5f9e" stroke-width="1.4" d="M2338.7,-1704C2443.17,-1704 2495.69,-1639.23 2573.71,-1708.7 2656.9,-1782.77 2523.93,-1883.51 2607.63,-1957 2619.52,-1967.43 2732.37,-1974.29 2765.61,-1964.63"/>
<polygon fill="#ff5f9e" stroke="#ff5f9e" stroke-width="1.4" points="2768.82,-1965.33 2773.06,-1959.24 2765.95,-1961.36 2768.82,-1965.33"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2476.67" y="-1711.4" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff5f9e"> &#160;warehouse/supplier/brand/attr/prop/carrier sse &#160;</text>
</g>
<!-- sseAutomat&#45;&gt;categoryAutomat -->
<g id="edge13" class="edge">
<title>sseAutomat:w&#45;&gt;categoryAutomat:n</title>
<g id="a_edge13"><a xlink:title="sseAutomat → categoryAutomat (&#39;category&#39; sse trigger)">
<path fill="none" stroke="#ff8f66" stroke-width="1.4" d="M2098.86,-1704C1855.73,-1704 1812.53,-1594.41 1572.78,-1554 1529.87,-1546.77 1211.67,-1563.62 1181.78,-1532 1178.48,-1528.51 1178.39,-1524.6 1181.78,-1521.2 1195.77,-1507.13 2593.54,-1523.03 2610.78,-1513.2 2755.31,-1430.82 2659.58,-1275.98 2803.31,-1192.2 2887.69,-1143.01 3750.39,-1228.92 3681.78,-1159.4 3675.8,-1153.34 3077.29,-1151.56 3068.78,-1151.4 3004.66,-1150.17 828.97,-1157.14 693.05,-1097.39"/>
<polygon fill="#ff8f66" stroke="#ff8f66" stroke-width="1.4" points="694.82,-1095.69 687.98,-1092.82 691.54,-1099.33 694.82,-1095.69"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2849.54" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff8f66"> &#160;&#39;category&#39; sse trigger &#160;</text>
</g>
<!-- categoryViewAutomat -->
<g id="node5" class="node">
<title>categoryViewAutomat</title>
<polygon fill="#33415c" stroke="none" points="624.59,-733.6 624.59,-768.6 918.97,-768.6 918.97,-733.6 624.59,-733.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-733.6 624.59,-768.6 918.97,-768.6 918.97,-733.6 624.59,-733.6"/>
<polygon fill="#33415c" stroke="none" points="626.59,-762.6 626.59,-766.6 771.78,-766.6 771.78,-762.6 626.59,-762.6"/>
<polygon fill="#33415c" stroke="none" points="771.78,-762.6 771.78,-766.6 916.97,-766.6 916.97,-762.6 771.78,-762.6"/>
<text xml:space="preserve" text-anchor="start" x="708.76" y="-749.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">categoryViewAutomat</text>
<text xml:space="preserve" text-anchor="start" x="718.5" y="-740.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">KeyedAutomat (Slug Path)</text>
<polygon fill="#2a3242" stroke="none" points="624.59,-711.6 624.59,-733.6 918.97,-733.6 918.97,-711.6 624.59,-711.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-711.6 624.59,-733.6 918.97,-733.6 918.97,-711.6 624.59,-711.6"/>
<polygon fill="#2b1a42" stroke="none" points="625.59,-712.6 625.59,-732.6 683.51,-732.6 683.51,-712.6 625.59,-712.6"/>
<text xml:space="preserve" text-anchor="start" x="641.43" y="-721.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="687.51" y="-720.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">views: Map&lt;slug, Data&gt;</text>
<text xml:space="preserve" text-anchor="start" x="828.16" y="-719.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Articles &amp; direct children</text>
<polygon fill="#272e3d" stroke="none" points="624.59,-689.6 624.59,-711.6 918.97,-711.6 918.97,-689.6 624.59,-689.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-689.6 624.59,-711.6 918.97,-711.6 918.97,-689.6 624.59,-689.6"/>
<polygon fill="#143826" stroke="none" points="625.59,-690.6 625.59,-710.6 686.11,-710.6 686.11,-690.6 625.59,-690.6"/>
<text xml:space="preserve" text-anchor="start" x="640.51" y="-699.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="690.11" y="-698.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">loadAllCategoryViews()</text>
<text xml:space="preserve" text-anchor="start" x="834.84" y="-697.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Prewarm all tree slugs</text>
<polygon fill="#2a3242" stroke="none" points="624.59,-667.6 624.59,-689.6 918.97,-689.6 918.97,-667.6 624.59,-667.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-667.6 624.59,-689.6 918.97,-689.6 918.97,-667.6 624.59,-667.6"/>
<polygon fill="#143826" stroke="none" points="625.59,-668.6 625.59,-688.6 675.66,-688.6 675.66,-668.6 625.59,-668.6"/>
<text xml:space="preserve" text-anchor="start" x="635.29" y="-677.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="679.66" y="-676.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reloadLoadedCategoryViews()</text>
<text xml:space="preserve" text-anchor="start" x="835.71" y="-675.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Refresh cached views</text>
<polygon fill="#272e3d" stroke="none" points="624.59,-645.6 624.59,-667.6 918.97,-667.6 918.97,-645.6 624.59,-645.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-645.6 624.59,-667.6 918.97,-667.6 918.97,-645.6 624.59,-645.6"/>
<polygon fill="#143826" stroke="none" points="625.59,-646.6 625.59,-666.6 680.1,-666.6 680.1,-646.6 625.59,-646.6"/>
<text xml:space="preserve" text-anchor="start" x="637.51" y="-655.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="684.1" y="-654.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">invalidateAllCategoryViews()</text>
<text xml:space="preserve" text-anchor="start" x="842.38" y="-653.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Clear on SSE signal</text>
<polygon fill="#2a3242" stroke="none" points="624.59,-623.6 624.59,-645.6 918.97,-645.6 918.97,-623.6 624.59,-623.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-623.6 624.59,-645.6 918.97,-645.6 918.97,-623.6 624.59,-623.6"/>
<polygon fill="#182b40" stroke="none" points="625.59,-624.6 625.59,-644.6 674.32,-644.6 674.32,-624.6 625.59,-624.6"/>
<text xml:space="preserve" text-anchor="start" x="634.17" y="-633.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="678.32" y="-632.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">collectLoadedCategoryViewData()</text>
<text xml:space="preserve" text-anchor="start" x="849.49" y="-631.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Extract union data</text>
<polygon fill="#272e3d" stroke="none" points="624.59,-601.6 624.59,-623.6 918.97,-623.6 918.97,-601.6 624.59,-601.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-601.6 624.59,-623.6 918.97,-623.6 918.97,-601.6 624.59,-601.6"/>
<polygon fill="#182b40" stroke="none" points="625.59,-602.6 625.59,-622.6 673.59,-622.6 673.59,-602.6 625.59,-602.6"/>
<text xml:space="preserve" text-anchor="start" x="633.81" y="-611.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="677.59" y="-610.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">getOrCreateCategoryAutomat()</text>
<text xml:space="preserve" text-anchor="start" x="833.94" y="-609.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Per&#45;slug reactive store</text>
<polygon fill="#2a3242" stroke="none" points="624.59,-579.6 624.59,-601.6 918.97,-601.6 918.97,-579.6 624.59,-579.6"/>
<polygon fill="none" stroke="#3f4c5f" points="624.59,-579.6 624.59,-601.6 918.97,-601.6 918.97,-579.6 624.59,-579.6"/>
<polygon fill="#3b2c12" stroke="none" points="625.59,-580.6 625.59,-600.6 677.84,-600.6 677.84,-580.6 625.59,-580.6"/>
<text xml:space="preserve" text-anchor="start" x="645.04" y="-589.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="681.84" y="-588.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/category/:id/articles</text>
<text xml:space="preserve" text-anchor="start" x="836.16" y="-587.4" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Category article batch</text>
</g>
<!-- sseAutomat&#45;&gt;categoryViewAutomat -->
<g id="edge14" class="edge">
<title>sseAutomat:w&#45;&gt;categoryViewAutomat:n</title>
<g id="a_edge14"><a xlink:title="sseAutomat → categoryViewAutomat (invalidate views on sse)">
<path fill="none" stroke="#4ecb8f" stroke-width="1.4" d="M2098.86,-1704C1855.73,-1704 1812.25,-1596 1572.78,-1554 1503.24,-1541.8 1206.98,-1571.24 1256.78,-1521.2 1272.96,-1504.94 2889.3,-1525.32 2908.78,-1513.2 3044.12,-1428.98 2934.63,-1278.31 3068.78,-1192.2 3131.18,-1152.14 3663.02,-1184.48 3735.78,-1170.2 4131.09,-1092.6 4193.41,-946.69 4585.78,-855.4 4662.21,-837.62 4990.99,-864.36 4935.78,-808.6 4896.83,-769.26 1051.38,-821.58 852.38,-771.79"/>
<polygon fill="#4ecb8f" stroke="#4ecb8f" stroke-width="1.4" points="853.59,-769.66 846.25,-768.58 851.32,-774 853.59,-769.66"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3835.85" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#4ecb8f"> &#160;invalidate views on sse &#160;</text>
</g>
<!-- artikelAutomat -->
<g id="node6" class="node">
<title>artikelAutomat</title>
<polygon fill="#33415c" stroke="none" points="519.95,-1397.2 519.95,-1432.2 801.61,-1432.2 801.61,-1397.2 519.95,-1397.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1397.2 519.95,-1432.2 801.61,-1432.2 801.61,-1397.2 519.95,-1397.2"/>
<polygon fill="#33415c" stroke="none" points="521.95,-1426.2 521.95,-1430.2 577.48,-1430.2 577.48,-1426.2 521.95,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="577.48,-1426.2 577.48,-1430.2 633.01,-1430.2 633.01,-1426.2 577.48,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="633.01,-1426.2 633.01,-1430.2 688.55,-1430.2 688.55,-1426.2 633.01,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="688.55,-1426.2 688.55,-1430.2 744.08,-1430.2 744.08,-1426.2 688.55,-1426.2"/>
<polygon fill="#33415c" stroke="none" points="744.08,-1426.2 744.08,-1430.2 799.61,-1430.2 799.61,-1426.2 744.08,-1426.2"/>
<text xml:space="preserve" text-anchor="start" x="618.77" y="-1413.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">artikelAutomat</text>
<text xml:space="preserve" text-anchor="start" x="595.51" y="-1404.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">In&#45;Memory Article Record Cache</text>
<polygon fill="#2a3242" stroke="none" points="519.95,-1375.2 519.95,-1397.2 801.61,-1397.2 801.61,-1375.2 519.95,-1375.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1375.2 519.95,-1397.2 801.61,-1397.2 801.61,-1375.2 519.95,-1375.2"/>
<polygon fill="#2b1a42" stroke="none" points="520.95,-1376.2 520.95,-1396.2 568.95,-1396.2 568.95,-1376.2 520.95,-1376.2"/>
<text xml:space="preserve" text-anchor="start" x="531.84" y="-1384.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="572.95" y="-1384.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articles: Map&lt;sku, Object&gt;</text>
<text xml:space="preserve" text-anchor="start" x="707.67" y="-1383" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Deduplicated SKU cache</text>
<polygon fill="#272e3d" stroke="none" points="519.95,-1353.2 519.95,-1375.2 801.61,-1375.2 801.61,-1353.2 519.95,-1353.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1353.2 519.95,-1375.2 801.61,-1375.2 801.61,-1353.2 519.95,-1353.2"/>
<polygon fill="#143826" stroke="none" points="520.95,-1354.2 520.95,-1374.2 586.3,-1374.2 586.3,-1354.2 520.95,-1354.2"/>
<text xml:space="preserve" text-anchor="start" x="538.29" y="-1362.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="590.3" y="-1362.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">loadArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="708.57" y="-1361" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fetch or cached promise</text>
<polygon fill="#2a3242" stroke="none" points="519.95,-1331.2 519.95,-1353.2 801.61,-1353.2 801.61,-1331.2 519.95,-1331.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1331.2 519.95,-1353.2 801.61,-1353.2 801.61,-1331.2 519.95,-1331.2"/>
<polygon fill="#143826" stroke="none" points="520.95,-1332.2 520.95,-1352.2 584.92,-1352.2 584.92,-1332.2 520.95,-1332.2"/>
<text xml:space="preserve" text-anchor="start" x="537.6" y="-1340.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="588.92" y="-1340.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reloadArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="713.89" y="-1339" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Silent background sync</text>
<polygon fill="#272e3d" stroke="none" points="519.95,-1309.2 519.95,-1331.2 801.61,-1331.2 801.61,-1309.2 519.95,-1309.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1309.2 519.95,-1331.2 801.61,-1331.2 801.61,-1309.2 519.95,-1309.2"/>
<polygon fill="#143826" stroke="none" points="520.95,-1310.2 520.95,-1330.2 576.55,-1330.2 576.55,-1310.2 520.95,-1310.2"/>
<text xml:space="preserve" text-anchor="start" x="533.42" y="-1318.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="580.55" y="-1318.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">setArticleName(sku, name)</text>
<text xml:space="preserve" text-anchor="start" x="732.15" y="-1317" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Optimistic rename</text>
<polygon fill="#2a3242" stroke="none" points="519.95,-1287.2 519.95,-1309.2 801.61,-1309.2 801.61,-1287.2 519.95,-1287.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1287.2 519.95,-1309.2 801.61,-1309.2 801.61,-1287.2 519.95,-1287.2"/>
<polygon fill="#143826" stroke="none" points="520.95,-1288.2 520.95,-1308.2 588.78,-1308.2 588.78,-1288.2 520.95,-1288.2"/>
<text xml:space="preserve" text-anchor="start" x="539.53" y="-1296.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="592.78" y="-1296.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">clearArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="718.81" y="-1295" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Evict SKU from cache</text>
<polygon fill="#272e3d" stroke="none" points="519.95,-1265.2 519.95,-1287.2 801.61,-1287.2 801.61,-1265.2 519.95,-1265.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1265.2 519.95,-1287.2 801.61,-1287.2 801.61,-1265.2 519.95,-1265.2"/>
<polygon fill="#182b40" stroke="none" points="520.95,-1266.2 520.95,-1286.2 591.56,-1286.2 591.56,-1266.2 520.95,-1266.2"/>
<text xml:space="preserve" text-anchor="start" x="540.48" y="-1274.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="595.56" y="-1274.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">getArticle(sku)</text>
<text xml:space="preserve" text-anchor="start" x="718.8" y="-1273" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Sync constructor read</text>
<polygon fill="#2a3242" stroke="none" points="519.95,-1243.2 519.95,-1265.2 801.61,-1265.2 801.61,-1243.2 519.95,-1243.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1243.2 519.95,-1265.2 801.61,-1265.2 801.61,-1243.2 519.95,-1243.2"/>
<polygon fill="#182b40" stroke="none" points="520.95,-1244.2 520.95,-1264.2 574.47,-1264.2 574.47,-1244.2 520.95,-1244.2"/>
<text xml:space="preserve" text-anchor="start" x="531.93" y="-1252.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="578.47" y="-1252.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">createArticleSelector(sku)</text>
<text xml:space="preserve" text-anchor="start" x="721.46" y="-1251" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fine&#45;grained selector</text>
<polygon fill="#272e3d" stroke="none" points="519.95,-1221.2 519.95,-1243.2 801.61,-1243.2 801.61,-1221.2 519.95,-1221.2"/>
<polygon fill="none" stroke="#3f4c5f" points="519.95,-1221.2 519.95,-1243.2 801.61,-1243.2 801.61,-1221.2 519.95,-1221.2"/>
<polygon fill="#3b2c12" stroke="none" points="520.95,-1222.2 520.95,-1242.2 584.19,-1242.2 584.19,-1222.2 520.95,-1222.2"/>
<text xml:space="preserve" text-anchor="start" x="545.9" y="-1230.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="588.19" y="-1230.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/article/:sku</text>
<text xml:space="preserve" text-anchor="start" x="722.8" y="-1229" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Full article document</text>
</g>
<!-- sseAutomat&#45;&gt;artikelAutomat -->
<g id="edge16" class="edge">
<title>sseAutomat:w&#45;&gt;artikelAutomat:n</title>
<g id="a_edge16"><a xlink:title="sseAutomat → artikelAutomat (&#39;article&#45;&lt;sku&gt;&#39; sse reload)">
<path fill="none" stroke="#e0b25a" stroke-width="1.4" d="M2098.86,-1704C1855.73,-1704 1811.93,-1597.83 1572.78,-1554 1459.15,-1533.18 1428.5,-1545.71 1313.79,-1532 1243.74,-1523.63 705.33,-1506.06 663.37,-1439.56"/>
<polygon fill="#e0b25a" stroke="#e0b25a" stroke-width="1.4" points="665.82,-1439.18 661.41,-1433.22 661.14,-1440.64 665.82,-1439.18"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1368.29" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#e0b25a"> &#160;&#39;article&#45;&lt;sku&gt;&#39; sse reload &#160;</text>
</g>
<!-- articleDetailAutomat -->
<g id="node7" class="node">
<title>articleDetailAutomat</title>
<polygon fill="#33415c" stroke="none" points="605.64,-1814 605.64,-1849 889.92,-1849 889.92,-1814 605.64,-1814"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1814 605.64,-1849 889.92,-1849 889.92,-1814 605.64,-1814"/>
<polygon fill="#33415c" stroke="none" points="607.64,-1843 607.64,-1847 887.92,-1847 887.92,-1843 607.64,-1843"/>
<text xml:space="preserve" text-anchor="start" x="689.43" y="-1830.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">articleDetailAutomat</text>
<text xml:space="preserve" text-anchor="start" x="704.76" y="-1820.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">KeyedAutomat (SKU)</text>
<polygon fill="#2a3242" stroke="none" points="605.64,-1792 605.64,-1814 889.92,-1814 889.92,-1792 605.64,-1792"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1792 605.64,-1814 889.92,-1814 889.92,-1792 605.64,-1792"/>
<polygon fill="#2b1a42" stroke="none" points="606.64,-1793 606.64,-1813 665.52,-1813 665.52,-1793 606.64,-1793"/>
<text xml:space="preserve" text-anchor="start" x="622.97" y="-1801.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="669.52" y="-1801" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articleHistory: Map&lt;sku&gt;</text>
<text xml:space="preserve" text-anchor="start" x="818.21" y="-1799.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Change history log</text>
<polygon fill="#272e3d" stroke="none" points="605.64,-1770 605.64,-1792 889.92,-1792 889.92,-1770 605.64,-1770"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1770 605.64,-1792 889.92,-1792 889.92,-1770 605.64,-1770"/>
<polygon fill="#2b1a42" stroke="none" points="606.64,-1771 606.64,-1791 660.85,-1791 660.85,-1771 606.64,-1771"/>
<text xml:space="preserve" text-anchor="start" x="620.64" y="-1779.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="664.85" y="-1779" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articleSupplier: Map&lt;sku&gt;</text>
<text xml:space="preserve" text-anchor="start" x="809.77" y="-1777.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Assigned supplier list</text>
<polygon fill="#2a3242" stroke="none" points="605.64,-1748 605.64,-1770 889.92,-1770 889.92,-1748 605.64,-1748"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1748 605.64,-1770 889.92,-1770 889.92,-1748 605.64,-1748"/>
<polygon fill="#143826" stroke="none" points="606.64,-1749 606.64,-1769 658.12,-1769 658.12,-1749 606.64,-1749"/>
<text xml:space="preserve" text-anchor="start" x="617.05" y="-1757.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="662.12" y="-1757" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articleHistoryAutomat.load()</text>
<text xml:space="preserve" text-anchor="start" x="811.56" y="-1755.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fetch SKU audit trail</text>
<polygon fill="#272e3d" stroke="none" points="605.64,-1726 605.64,-1748 889.92,-1748 889.92,-1726 605.64,-1726"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1726 605.64,-1748 889.92,-1748 889.92,-1726 605.64,-1726"/>
<polygon fill="#143826" stroke="none" points="606.64,-1727 606.64,-1747 654.64,-1747 654.64,-1727 606.64,-1727"/>
<text xml:space="preserve" text-anchor="start" x="615.31" y="-1735.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="658.64" y="-1735" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">articleSupplierAutomat.load()</text>
<text xml:space="preserve" text-anchor="start" x="806.65" y="-1733.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fetch supplier catalog</text>
<polygon fill="#2a3242" stroke="none" points="605.64,-1704 605.64,-1726 889.92,-1726 889.92,-1704 605.64,-1704"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1704 605.64,-1726 889.92,-1726 889.92,-1704 605.64,-1704"/>
<polygon fill="#3b2c12" stroke="none" points="606.64,-1705 606.64,-1725 659,-1725 659,-1705 606.64,-1705"/>
<text xml:space="preserve" text-anchor="start" x="626.15" y="-1713.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="663" y="-1713" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/article/:sku/history</text>
<text xml:space="preserve" text-anchor="start" x="811.98" y="-1711.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Audit change entries</text>
<polygon fill="#272e3d" stroke="none" points="605.64,-1682 605.64,-1704 889.92,-1704 889.92,-1682 605.64,-1682"/>
<polygon fill="none" stroke="#3f4c5f" points="605.64,-1682 605.64,-1704 889.92,-1704 889.92,-1682 605.64,-1682"/>
<polygon fill="#3b2c12" stroke="none" points="606.64,-1683 606.64,-1703 656.41,-1703 656.41,-1683 606.64,-1683"/>
<text xml:space="preserve" text-anchor="start" x="624.86" y="-1691.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="660.41" y="-1691" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">GET /api/article/:sku/supplier</text>
<text xml:space="preserve" text-anchor="start" x="809.77" y="-1689.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Vendor links &amp; prices</text>
</g>
<!-- sseAutomat&#45;&gt;articleDetailAutomat -->
<g id="edge17" class="edge">
<title>sseAutomat:w&#45;&gt;articleDetailAutomat:n</title>
<g id="a_edge17"><a xlink:title="sseAutomat → articleDetailAutomat (invalidateArticle(sku))">
<path fill="none" stroke="#56c8c8" stroke-width="1.4" d="M2098.86,-1704C1832.09,-1704 1831.18,-1926.68 1572.78,-1992.98 1395.38,-2038.5 768.44,-2034.29 748.28,-1856.86"/>
<polygon fill="#56c8c8" stroke="#56c8c8" stroke-width="1.4" points="750.74,-1856.97 747.9,-1850.12 745.84,-1857.24 750.74,-1856.97"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1977.78" y="-2039.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#56c8c8"> &#160;invalidateArticle(sku) &#160;</text>
</g>
<!-- articleIndexAutomat -->
<g id="node8" class="node">
<title>articleIndexAutomat</title>
<polygon fill="#33415c" stroke="none" points="773.12,-415.8 773.12,-450.8 1064.43,-450.8 1064.43,-415.8 773.12,-415.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-415.8 773.12,-450.8 1064.43,-450.8 1064.43,-415.8 773.12,-415.8"/>
<polygon fill="#33415c" stroke="none" points="775.12,-444.8 775.12,-448.8 870.89,-448.8 870.89,-444.8 775.12,-444.8"/>
<polygon fill="#33415c" stroke="none" points="870.89,-444.8 870.89,-448.8 966.66,-448.8 966.66,-444.8 870.89,-444.8"/>
<polygon fill="#33415c" stroke="none" points="966.66,-444.8 966.66,-448.8 1062.43,-448.8 1062.43,-444.8 966.66,-444.8"/>
<text xml:space="preserve" text-anchor="start" x="861.1" y="-432" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">articleIndexAutomat</text>
<text xml:space="preserve" text-anchor="start" x="862.75" y="-422.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Derived Client Search Index</text>
<polygon fill="#2a3242" stroke="none" points="773.12,-393.8 773.12,-415.8 1064.43,-415.8 1064.43,-393.8 773.12,-393.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-393.8 773.12,-415.8 1064.43,-415.8 1064.43,-393.8 773.12,-393.8"/>
<polygon fill="#2b1a42" stroke="none" points="774.12,-394.8 774.12,-414.8 822.12,-414.8 822.12,-394.8 774.12,-394.8"/>
<text xml:space="preserve" text-anchor="start" x="785.01" y="-403.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="826.12" y="-402.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">items: ArticleIndexRecord[]</text>
<text xml:space="preserve" text-anchor="start" x="964.71" y="-401.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">De&#45;duplicated article union</text>
<polygon fill="#272e3d" stroke="none" points="773.12,-371.8 773.12,-393.8 1064.43,-393.8 1064.43,-371.8 773.12,-371.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-371.8 773.12,-393.8 1064.43,-393.8 1064.43,-371.8 773.12,-371.8"/>
<polygon fill="#2b1a42" stroke="none" points="774.12,-372.8 774.12,-392.8 853.1,-392.8 853.1,-372.8 774.12,-372.8"/>
<text xml:space="preserve" text-anchor="start" x="800.5" y="-381.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="857.1" y="-380.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">status: &#39;ready&#39;</text>
<text xml:space="preserve" text-anchor="start" x="994.07" y="-379.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Index lifecycle flag</text>
<polygon fill="#2a3242" stroke="none" points="773.12,-349.8 773.12,-371.8 1064.43,-371.8 1064.43,-349.8 773.12,-349.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-349.8 773.12,-371.8 1064.43,-371.8 1064.43,-349.8 773.12,-349.8"/>
<polygon fill="#143826" stroke="none" points="774.12,-350.8 774.12,-370.8 835.81,-370.8 835.81,-350.8 774.12,-350.8"/>
<text xml:space="preserve" text-anchor="start" x="789.64" y="-359.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="839.81" y="-358.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">buildArticleIndex()</text>
<text xml:space="preserve" text-anchor="start" x="962.96" y="-357.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Derive from category views</text>
<polygon fill="#272e3d" stroke="none" points="773.12,-327.8 773.12,-349.8 1064.43,-349.8 1064.43,-327.8 773.12,-327.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-327.8 773.12,-349.8 1064.43,-349.8 1064.43,-327.8 773.12,-327.8"/>
<polygon fill="#143826" stroke="none" points="774.12,-328.8 774.12,-348.8 841.72,-348.8 841.72,-328.8 774.12,-328.8"/>
<text xml:space="preserve" text-anchor="start" x="792.59" y="-337.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="845.72" y="-336.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">setArticleIndexName()</text>
<text xml:space="preserve" text-anchor="start" x="998.51" y="-335.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Patch on rename</text>
<polygon fill="#2a3242" stroke="none" points="773.12,-305.8 773.12,-327.8 1064.43,-327.8 1064.43,-305.8 773.12,-305.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-305.8 773.12,-327.8 1064.43,-327.8 1064.43,-305.8 773.12,-305.8"/>
<polygon fill="#143826" stroke="none" points="774.12,-306.8 774.12,-326.8 859.96,-326.8 859.96,-306.8 774.12,-306.8"/>
<text xml:space="preserve" text-anchor="start" x="801.71" y="-315.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="863.96" y="-314.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">reload()</text>
<text xml:space="preserve" text-anchor="start" x="984.3" y="-313.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Re&#45;derive from views</text>
<polygon fill="#272e3d" stroke="none" points="773.12,-283.8 773.12,-305.8 1064.43,-305.8 1064.43,-283.8 773.12,-283.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-283.8 773.12,-305.8 1064.43,-305.8 1064.43,-283.8 773.12,-283.8"/>
<polygon fill="#182b40" stroke="none" points="774.12,-284.8 774.12,-304.8 831.98,-304.8 831.98,-284.8 774.12,-284.8"/>
<text xml:space="preserve" text-anchor="start" x="787.27" y="-293.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="835.98" y="-292.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectArticleIndexItems()</text>
<text xml:space="preserve" text-anchor="start" x="982.07" y="-291.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Fast record projection</text>
<polygon fill="#2a3242" stroke="none" points="773.12,-261.8 773.12,-283.8 1064.43,-283.8 1064.43,-261.8 773.12,-261.8"/>
<polygon fill="none" stroke="#3f4c5f" points="773.12,-261.8 773.12,-283.8 1064.43,-283.8 1064.43,-261.8 773.12,-261.8"/>
<polygon fill="#182b40" stroke="none" points="774.12,-262.8 774.12,-282.8 851.04,-282.8 851.04,-262.8 774.12,-262.8"/>
<text xml:space="preserve" text-anchor="start" x="796.8" y="-271.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="855.04" y="-270.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">ensureLoaded()</text>
<text xml:space="preserve" text-anchor="start" x="995.87" y="-269.6" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Await warm views</text>
</g>
<!-- sseAutomat&#45;&gt;articleIndexAutomat -->
<g id="edge15" class="edge">
<title>sseAutomat:w&#45;&gt;articleIndexAutomat:n</title>
<g id="a_edge15"><a xlink:title="sseAutomat → articleIndexAutomat (&#39;articles&#39; sse trigger)">
<path fill="none" stroke="#ff7aa8" stroke-width="1.4" d="M2098.86,-1704C1980.95,-1704 1517.59,-1604.75 1600.78,-1521.2 1618.54,-1503.37 3391.56,-1526.73 3412.78,-1513.2 3545.71,-1428.42 3432.04,-1278.82 3563.78,-1192.2 3595.5,-1171.34 4208.87,-1172.17 4246.78,-1170.2 4313.53,-1166.72 4330,-1162.3 4396.78,-1159.4 4411.74,-1158.75 4922.26,-1157.84 4935.78,-1151.4 5112.9,-1067.09 5272.01,-995.92 5213.78,-808.6 5050.18,-282.34 4556.65,-544.78 4005.78,-528.8 3924.89,-526.45 1165.94,-532.58 1020.51,-456.19"/>
<polygon fill="#ff7aa8" stroke="#ff7aa8" stroke-width="1.4" points="1022.56,-454.8 1015.99,-451.35 1018.98,-458.14 1022.56,-454.8"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="5269.24" y="-973.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff7aa8"> &#160;&#39;articles&#39; sse trigger &#160;</text>
</g>
<!-- sseAutomat&#45;&gt;orderAutomat -->
<g id="edge19" class="edge">
<title>sseAutomat:e&#45;&gt;orderAutomat:n</title>
<g id="a_edge19"><a xlink:title="sseAutomat → orderAutomat (&#39;order&#39;/&#39;shipment&#39; sse)">
<path fill="none" stroke="#ffb25a" stroke-width="1.4" d="M2338.7,-1704C2364.93,-1704 2354.92,-1664.78 2337.7,-1645 2124.47,-1399.94 1388.34,-1751.56 1617.37,-1521.2 1630.91,-1507.58 2980.85,-1516.39 2999.78,-1513.2 3108.3,-1494.92 3233.71,-1541.66 3240.49,-1440.12"/>
<polygon fill="#ffb25a" stroke="#ffb25a" stroke-width="1.4" points="3242.93,-1440.39 3240.71,-1433.32 3238.04,-1440.24 3242.93,-1440.39"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1664.07" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ffb25a"> &#160;&#39;order&#39;/&#39;shipment&#39; sse &#160;</text>
</g>
<!-- sseAutomat&#45;&gt;vfsAutomat -->
<g id="edge20" class="edge">
<title>sseAutomat:e&#45;&gt;vfsAutomat:n</title>
<g id="a_edge20"><a xlink:title="sseAutomat → vfsAutomat (&#39;vfs&#39; sse mutation)">
<path fill="none" stroke="#66b3ff" stroke-width="1.4" d="M2338.7,-1704C2364.93,-1704 2354.62,-1665.04 2337.7,-1645 2161.69,-1436.46 1545.09,-1715.88 1736.31,-1521.2 1745.03,-1512.33 2171.47,-1514.95 2183.78,-1513.2 2337.64,-1491.38 2520.75,-1575.31 2527.84,-1429.21"/>
<polygon fill="#66b3ff" stroke="#66b3ff" stroke-width="1.4" points="2530.29,-1429.37 2528,-1422.32 2525.39,-1429.26 2530.29,-1429.37"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1775.55" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#66b3ff"> &#160;&#39;vfs&#39; sse mutation &#160;</text>
</g>
<!-- companyAutomat&#45;&gt;categoryAutomat -->
<g id="edge21" class="edge">
<title>companyAutomat:w&#45;&gt;categoryAutomat:n</title>
<g id="a_edge21"><a xlink:title="companyAutomat → categoryAutomat (rootCategoryId &amp; terminals)">
<path fill="none" stroke="#5aa7ff" stroke-width="1.4" d="M2614.63,-1605C2598.18,-1605 2604.45,-1580.07 2615.63,-1568 2684.45,-1493.75 2967.75,-1527.58 3068.78,-1521.2 3087.86,-1519.99 3394.98,-1520.17 3412.78,-1513.2 3613.63,-1434.6 3576.82,-1273.16 3776.73,-1192.2 3825.19,-1172.58 4210.68,-1208.03 4246.78,-1170.2 4250.09,-1166.73 4250.16,-1162.81 4246.78,-1159.4 4241.01,-1153.6 3076.96,-1151.53 3068.78,-1151.4 3005.88,-1150.38 871.51,-1155.97 738.18,-1097.28"/>
<polygon fill="#5aa7ff" stroke="#5aa7ff" stroke-width="1.4" points="740.07,-1095.69 733.23,-1092.82 736.79,-1099.33 740.07,-1095.69"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3835.26" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#5aa7ff"> &#160;rootCategoryId &amp; terminals &#160;</text>
</g>
<!-- companyAutomat&#45;&gt;chatAutomat -->
<g id="edge40" class="edge">
<title>companyAutomat:w&#45;&gt;chatAutomat:n</title>
<g id="a_edge40"><a xlink:title="companyAutomat → chatAutomat (chatDrawerWidth)">
<path fill="none" stroke="#66b3ff" stroke-width="1.4" d="M2614.63,-1803C2459.27,-1803 2544.19,-1595.56 2407.78,-1521.2 2381.98,-1507.14 2304.49,-1519.45 2275.78,-1513.2 2193.17,-1495.21 2098.74,-1527.42 2092.2,-1450.99"/>
<polygon fill="#66b3ff" stroke="#66b3ff" stroke-width="1.4" points="2094.66,-1451.21 2091.93,-1444.32 2089.77,-1451.41 2094.66,-1451.21"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2460.21" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#66b3ff"> &#160;chatDrawerWidth &#160;</text>
</g>
<!-- categoryAutomat&#45;&gt;categoryAutomat -->
<g id="edge42" class="edge">
<title>categoryAutomat:ne&#45;&gt;categoryAutomat:n</title>
<g id="a_edge42"><a xlink:title="categoryAutomat → categoryAutomat (nested tree hierarchy)">
<path fill="none" stroke="#6bdf9a" stroke-width="1.4" d="M801.53,-1057.4C832.2,-1016.93 877.53,-1016.93 877.53,-1073.9 877.53,-1128.87 681.69,-1130.8 603.92,-1094.52"/>
<polygon fill="#6bdf9a" stroke="#6bdf9a" stroke-width="1.4" points="605.13,-1092.39 597.79,-1091.37 602.89,-1096.75 605.13,-1092.39"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="924.81" y="-973.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#6bdf9a"> &#160;nested tree hierarchy &#160;</text>
</g>
<!-- categoryAutomat&#45;&gt;categoryViewAutomat -->
<g id="edge22" class="edge">
<title>categoryAutomat:e&#45;&gt;categoryViewAutomat:n</title>
<g id="a_edge22"><a xlink:title="categoryAutomat → categoryViewAutomat (attachTree &amp; warm slugs)">
<path fill="none" stroke="#6bdf9a" stroke-width="1.4" d="M802.53,-980.4C858.09,-980.4 824.94,-905.79 801.53,-855.4 777.66,-804.02 707.46,-824.88 699.85,-776.68"/>
<polygon fill="#6bdf9a" stroke="#6bdf9a" stroke-width="1.4" points="702.3,-776.51 699.34,-769.71 697.41,-776.87 702.3,-776.51"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="812.13" y="-811.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#6bdf9a"> &#160;attachTree &amp; warm slugs &#160;</text>
</g>
<!-- articleSearchAutomat -->
<g id="node9" class="node">
<title>articleSearchAutomat</title>
<polygon fill="#33415c" stroke="none" points="782.68,-136 782.68,-171 1062.88,-171 1062.88,-136 782.68,-136"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-136 782.68,-171 1062.88,-171 1062.88,-136 782.68,-136"/>
<polygon fill="#33415c" stroke="none" points="784.68,-165 784.68,-169 922.78,-169 922.78,-165 784.68,-165"/>
<polygon fill="#33415c" stroke="none" points="922.78,-165 922.78,-169 1060.88,-169 1060.88,-165 922.78,-165"/>
<text xml:space="preserve" text-anchor="start" x="860.76" y="-152.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">articleSearchAutomat</text>
<text xml:space="preserve" text-anchor="start" x="862.01" y="-142.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">In&#45;Memory FlexSearch Engine</text>
<polygon fill="#2a3242" stroke="none" points="782.68,-114 782.68,-136 1062.88,-136 1062.88,-114 782.68,-114"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-114 782.68,-136 1062.88,-136 1062.88,-114 782.68,-114"/>
<polygon fill="#2b1a42" stroke="none" points="783.68,-115 783.68,-135 859.11,-135 859.11,-115 783.68,-115"/>
<text xml:space="preserve" text-anchor="start" x="808.28" y="-123.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="863.11" y="-123" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">target: string</text>
<text xml:space="preserve" text-anchor="start" x="987.62" y="-121.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active search query</text>
<polygon fill="#272e3d" stroke="none" points="782.68,-92 782.68,-114 1062.88,-114 1062.88,-92 782.68,-92"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-92 782.68,-114 1062.88,-114 1062.88,-92 782.68,-92"/>
<polygon fill="#2b1a42" stroke="none" points="783.68,-93 783.68,-113 860.55,-113 860.55,-93 783.68,-93"/>
<text xml:space="preserve" text-anchor="start" x="809.01" y="-101.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="864.55" y="-101" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">filter: string</text>
<text xml:space="preserve" text-anchor="start" x="985.85" y="-99.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active category filter</text>
<polygon fill="#2a3242" stroke="none" points="782.68,-70 782.68,-92 1062.88,-92 1062.88,-70 782.68,-70"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-70 782.68,-92 1062.88,-92 1062.88,-70 782.68,-70"/>
<polygon fill="#2b1a42" stroke="none" points="783.68,-71 783.68,-91 831.68,-91 831.68,-71 783.68,-71"/>
<text xml:space="preserve" text-anchor="start" x="794.57" y="-79.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="835.68" y="-79" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">result: ArticleSearchResult</text>
<text xml:space="preserve" text-anchor="start" x="972.06" y="-77.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Facets, recordset, count</text>
<polygon fill="#272e3d" stroke="none" points="782.68,-48 782.68,-70 1062.88,-70 1062.88,-48 782.68,-48"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-48 782.68,-70 1062.88,-70 1062.88,-48 782.68,-48"/>
<polygon fill="#143826" stroke="none" points="783.68,-49 783.68,-69 838.72,-69 838.72,-49 783.68,-49"/>
<text xml:space="preserve" text-anchor="start" x="795.87" y="-57.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="842.72" y="-57" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">search(target, filter)</text>
<text xml:space="preserve" text-anchor="start" x="958.7" y="-55.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Synchronous indexed query</text>
<polygon fill="#2a3242" stroke="none" points="782.68,-26 782.68,-48 1062.88,-48 1062.88,-26 782.68,-26"/>
<polygon fill="none" stroke="#3f4c5f" points="782.68,-26 782.68,-48 1062.88,-48 1062.88,-26 782.68,-26"/>
<polygon fill="#182b40" stroke="none" points="783.68,-27 783.68,-47 840.01,-47 840.01,-27 783.68,-27"/>
<text xml:space="preserve" text-anchor="start" x="796.07" y="-35.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="844.01" y="-35" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">selectSearchResult()</text>
<text xml:space="preserve" text-anchor="start" x="967.61" y="-33.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reactive search outcome</text>
</g>
<!-- categoryAutomat&#45;&gt;articleSearchAutomat -->
<g id="edge25" class="edge">
<title>categoryAutomat:e&#45;&gt;articleSearchAutomat:n</title>
<g id="a_edge25"><a xlink:title="categoryAutomat → articleSearchAutomat (categoryFacets)">
<path fill="none" stroke="#c79bff" stroke-width="1.4" d="M802.53,-1046.4C1813.32,-1046.4 2060.07,-920.25 3068.78,-855.4 3120.58,-852.07 4899.89,-810.11 4935.78,-772.6 5000.6,-704.84 4998.84,-631 4935.78,-561.6 4898.45,-520.52 1056.49,-241.65 861.42,-174.79"/>
<polygon fill="#c79bff" stroke="#c79bff" stroke-width="1.4" points="862.77,-172.74 855.53,-171.12 860.18,-176.9 862.77,-172.74"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4810.67" y="-531.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#c79bff"> &#160;categoryFacets &#160;</text>
</g>
<!-- categoryViewAutomat&#45;&gt;articleIndexAutomat -->
<g id="edge23" class="edge">
<title>categoryViewAutomat:e&#45;&gt;articleIndexAutomat:n</title>
<g id="a_edge23"><a xlink:title="categoryViewAutomat → articleIndexAutomat (derived union index)">
<path fill="none" stroke="#f5c15c" stroke-width="1.4" d="M919.97,-634.6C999.22,-634.6 924.43,-539.03 919.08,-458.53"/>
<polygon fill="#f5c15c" stroke="#f5c15c" stroke-width="1.4" points="921.54,-458.83 918.85,-451.92 916.64,-459 921.54,-458.83"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="982.76" y="-531.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#f5c15c"> &#160;derived union index &#160;</text>
</g>
<!-- artikelAutomat&#45;&gt;categoryAutomat -->
<g id="edge27" class="edge">
<title>artikelAutomat:e&#45;&gt;categoryAutomat:n</title>
<g id="a_edge27"><a xlink:title="artikelAutomat → categoryAutomat (articleCount updates)">
<path fill="none" stroke="#ff9f5a" stroke-width="1.4" d="M802.61,-1386.2C877.72,-1386.2 841.25,-1281 801.61,-1217.2 737.43,-1113.92 559.97,-1210.97 551,-1100.47"/>
<polygon fill="#ff9f5a" stroke="#ff9f5a" stroke-width="1.4" points="553.45,-1100.42 550.73,-1093.52 548.56,-1100.61 553.45,-1100.42"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="775.53" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff9f5a"> &#160;articleCount updates &#160;</text>
</g>
<!-- artikelAutomat&#45;&gt;artikelAutomat -->
<g id="edge43" class="edge">
<title>artikelAutomat:ne&#45;&gt;artikelAutomat:n</title>
<g id="a_edge43"><a xlink:title="artikelAutomat → artikelAutomat (variants &amp; parent SKU)">
<path fill="none" stroke="#f5c15c" stroke-width="1.4" d="M801.61,-1397.2C832.28,-1356.72 877.61,-1356.72 877.61,-1413.7 877.61,-1468.78 638.68,-1470.61 557.5,-1434.1"/>
<polygon fill="#f5c15c" stroke="#f5c15c" stroke-width="1.4" points="558.97,-1432.09 551.61,-1431.15 556.77,-1436.47 558.97,-1432.09"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="927.13" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#f5c15c"> &#160;variants &amp; parent SKU &#160;</text>
</g>
<!-- artikelAutomat&#45;&gt;articleIndexAutomat -->
<g id="edge26" class="edge">
<title>artikelAutomat:e&#45;&gt;articleIndexAutomat:n</title>
<g id="a_edge26"><a xlink:title="artikelAutomat → articleIndexAutomat (setArticleIndexName (optimistic))">
<path fill="none" stroke="#5cd6d6" stroke-width="1.4" d="M802.61,-1320.2C886.32,-1320.2 862.95,-1223.03 940.78,-1192.2 1019.55,-1160.99 3908.62,-1190.91 3990.78,-1170.2 4280.88,-1097.07 4298.38,-938.52 4585.78,-855.4 4636.09,-840.85 5020.19,-857.82 5055.78,-819.4 5059.04,-815.88 5056.86,-813.28 5055.78,-808.6 5028.42,-689.66 5038.34,-627.75 4935.78,-561.6 4912.41,-546.53 1039.69,-481.97 831.7,-452.18"/>
<polygon fill="#5cd6d6" stroke="#5cd6d6" stroke-width="1.4" points="832.45,-449.85 825.05,-450.36 831.15,-454.58 832.45,-449.85"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="5127.02" y="-811.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#5cd6d6"> &#160;setArticleIndexName (optimistic) &#160;</text>
</g>
<!-- articleDetailAutomat&#45;&gt;artikelAutomat -->
<g id="edge28" class="edge">
<title>articleDetailAutomat:w&#45;&gt;artikelAutomat:n</title>
<g id="a_edge28"><a xlink:title="articleDetailAutomat → artikelAutomat (watch SKU details)">
<path fill="none" stroke="#8f95ff" stroke-width="1.4" d="M604.64,-1803C442.3,-1803 599.52,-1603.64 605.1,-1439.95"/>
<polygon fill="#8f95ff" stroke="#8f95ff" stroke-width="1.4" points="607.54,-1440.36 605.21,-1433.32 602.64,-1440.28 607.54,-1440.36"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="633.1" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8f95ff"> &#160;watch SKU details &#160;</text>
</g>
<!-- articleIndexAutomat&#45;&gt;articleSearchAutomat -->
<g id="edge24" class="edge">
<title>articleIndexAutomat:e&#45;&gt;articleSearchAutomat:n</title>
<g id="a_edge24"><a xlink:title="articleIndexAutomat → articleSearchAutomat (query index items)">
<path fill="none" stroke="#ff7fc2" stroke-width="1.4" d="M1065.43,-404.8C1130.77,-404.8 1095.26,-315.41 1064.43,-257.8 1050.97,-232.63 1028.91,-244.22 1011.25,-221.8 998.05,-205.05 993.14,-196.89 992.07,-178.98"/>
<polygon fill="#ff7fc2" stroke="#ff7fc2" stroke-width="1.4" points="994.52,-179.05 991.88,-172.12 989.62,-179.18 994.52,-179.05"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1051.51" y="-213.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff7fc2"> &#160;query index items &#160;</text>
</g>
<!-- deliveryEditorAutomat -->
<g id="node11" class="node">
<title>deliveryEditorAutomat</title>
<polygon fill="#33415c" stroke="none" points="4625.04,-1046.4 4625.04,-1081.4 4896.52,-1081.4 4896.52,-1046.4 4625.04,-1046.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-1046.4 4625.04,-1081.4 4896.52,-1081.4 4896.52,-1046.4 4625.04,-1046.4"/>
<polygon fill="#33415c" stroke="none" points="4627.04,-1075.4 4627.04,-1079.4 4894.52,-1079.4 4894.52,-1075.4 4627.04,-1075.4"/>
<text xml:space="preserve" text-anchor="start" x="4696.43" y="-1062.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">deliveryEditorAutomat</text>
<text xml:space="preserve" text-anchor="start" x="4694.24" y="-1053.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Inbound Receipt &amp; OCR Machine</text>
<polygon fill="#2a3242" stroke="none" points="4625.04,-1024.4 4625.04,-1046.4 4896.52,-1046.4 4896.52,-1024.4 4625.04,-1024.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-1024.4 4625.04,-1046.4 4896.52,-1046.4 4896.52,-1024.4 4625.04,-1024.4"/>
<polygon fill="#2b1a42" stroke="none" points="4626.04,-1025.4 4626.04,-1045.4 4682.85,-1045.4 4682.85,-1025.4 4626.04,-1025.4"/>
<text xml:space="preserve" text-anchor="start" x="4641.33" y="-1034" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4686.85" y="-1033.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">lines: DeliveryLine[]</text>
<text xml:space="preserve" text-anchor="start" x="4807.49" y="-1032.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Uncommitted draft lines</text>
<polygon fill="#272e3d" stroke="none" points="4625.04,-1002.4 4625.04,-1024.4 4896.52,-1024.4 4896.52,-1002.4 4625.04,-1002.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-1002.4 4625.04,-1024.4 4896.52,-1024.4 4896.52,-1002.4 4625.04,-1002.4"/>
<polygon fill="#2b1a42" stroke="none" points="4626.04,-1003.4 4626.04,-1023.4 4696.81,-1023.4 4696.81,-1003.4 4626.04,-1003.4"/>
<text xml:space="preserve" text-anchor="start" x="4648.31" y="-1012" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4700.81" y="-1011.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">deliveryEntity</text>
<text xml:space="preserve" text-anchor="start" x="4819.93" y="-1010.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Selected supplier ID</text>
<polygon fill="#2a3242" stroke="none" points="4625.04,-980.4 4625.04,-1002.4 4896.52,-1002.4 4896.52,-980.4 4625.04,-980.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-980.4 4625.04,-1002.4 4896.52,-1002.4 4896.52,-980.4 4625.04,-980.4"/>
<polygon fill="#2b1a42" stroke="none" points="4626.04,-981.4 4626.04,-1001.4 4679.26,-1001.4 4679.26,-981.4 4626.04,-981.4"/>
<text xml:space="preserve" text-anchor="start" x="4639.54" y="-990" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4683.26" y="-989.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">attachments: File[]</text>
<text xml:space="preserve" text-anchor="start" x="4790.61" y="-988.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Invoice PDFs &amp; OCR results</text>
<polygon fill="#272e3d" stroke="none" points="4625.04,-958.4 4625.04,-980.4 4896.52,-980.4 4896.52,-958.4 4625.04,-958.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-958.4 4625.04,-980.4 4896.52,-980.4 4896.52,-958.4 4625.04,-958.4"/>
<polygon fill="#2b1a42" stroke="none" points="4626.04,-959.4 4626.04,-979.4 4677.3,-979.4 4677.3,-959.4 4626.04,-959.4"/>
<text xml:space="preserve" text-anchor="start" x="4638.56" y="-968" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4681.3" y="-967.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">draftCount: number</text>
<text xml:space="preserve" text-anchor="start" x="4789.69" y="-966.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Uncommitted lines for badge</text>
<polygon fill="#2a3242" stroke="none" points="4625.04,-936.4 4625.04,-958.4 4896.52,-958.4 4896.52,-936.4 4625.04,-936.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-936.4 4625.04,-958.4 4896.52,-958.4 4896.52,-936.4 4625.04,-936.4"/>
<polygon fill="#143826" stroke="none" points="4626.04,-937.4 4626.04,-957.4 4678.08,-957.4 4678.08,-937.4 4626.04,-937.4"/>
<text xml:space="preserve" text-anchor="start" x="4636.73" y="-946" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4682.08" y="-945.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">addLine() / updateLine()</text>
<text xml:space="preserve" text-anchor="start" x="4811.48" y="-944.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Interactive item editing</text>
<polygon fill="#272e3d" stroke="none" points="4625.04,-914.4 4625.04,-936.4 4896.52,-936.4 4896.52,-914.4 4625.04,-914.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-914.4 4625.04,-936.4 4896.52,-936.4 4896.52,-914.4 4625.04,-914.4"/>
<polygon fill="#143826" stroke="none" points="4626.04,-915.4 4626.04,-935.4 4690.59,-935.4 4690.59,-915.4 4626.04,-915.4"/>
<text xml:space="preserve" text-anchor="start" x="4642.98" y="-924" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4694.59" y="-923.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">commitDelivery()</text>
<text xml:space="preserve" text-anchor="start" x="4816.82" y="-922.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Persist goods receipt</text>
<polygon fill="#2a3242" stroke="none" points="4625.04,-892.4 4625.04,-914.4 4896.52,-914.4 4896.52,-892.4 4625.04,-892.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-892.4 4625.04,-914.4 4896.52,-914.4 4896.52,-892.4 4625.04,-892.4"/>
<polygon fill="#182b40" stroke="none" points="4626.04,-893.4 4626.04,-913.4 4674.04,-913.4 4674.04,-893.4 4626.04,-893.4"/>
<text xml:space="preserve" text-anchor="start" x="4634.26" y="-902" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#38bdf8">SELECT</text>
<text xml:space="preserve" text-anchor="start" x="4678.04" y="-901.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">buildSupplierArticlesMap()</text>
<text xml:space="preserve" text-anchor="start" x="4813.27" y="-900.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Auto&#45;match SKU/EAN</text>
<polygon fill="#272e3d" stroke="none" points="4625.04,-870.4 4625.04,-892.4 4896.52,-892.4 4896.52,-870.4 4625.04,-870.4"/>
<polygon fill="none" stroke="#3f4c5f" points="4625.04,-870.4 4625.04,-892.4 4896.52,-892.4 4896.52,-870.4 4625.04,-870.4"/>
<polygon fill="#3b2c12" stroke="none" points="4626.04,-871.4 4626.04,-891.4 4688.51,-891.4 4688.51,-871.4 4626.04,-871.4"/>
<text xml:space="preserve" text-anchor="start" x="4650.6" y="-880" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fbbf24">API</text>
<text xml:space="preserve" text-anchor="start" x="4692.51" y="-879.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">POST /api/delivery</text>
<text xml:space="preserve" text-anchor="start" x="4817.25" y="-878.2" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Create goods receipt</text>
</g>
<!-- deliveryEditorAutomat&#45;&gt;companyAutomat -->
<g id="edge29" class="edge">
<title>deliveryEditorAutomat:w&#45;&gt;companyAutomat:n</title>
<g id="a_edge29"><a xlink:title="deliveryEditorAutomat → companyAutomat (match vendor catalog)">
<path fill="none" stroke="#ff6b6b" stroke-width="1.4" d="M4624.04,-1013.4C4501.69,-1013.4 4510.7,-1123.1 4397.78,-1170.2 4348.52,-1190.74 4327.78,-1168.98 4279.73,-1192.2 4084.03,-1286.77 4112.45,-1432.13 3910.78,-1513.2 3889.05,-1521.93 3087.32,-1539.7 3068.78,-1554 2920.11,-1668.7 3092.43,-1844.72 2941.92,-1957 2922.48,-1971.51 2889.3,-1982.62 2881.31,-1966.6"/>
<polygon fill="#ff6b6b" stroke="#ff6b6b" stroke-width="1.4" points="2883.78,-1966.44 2879.97,-1960.08 2878.98,-1967.43 2883.78,-1966.44"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4327.75" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff6b6b"> &#160;match vendor catalog &#160;</text>
</g>
<!-- deliveryEditorAutomat&#45;&gt;artikelAutomat -->
<g id="edge30" class="edge">
<title>deliveryEditorAutomat:w&#45;&gt;artikelAutomat:n</title>
<g id="a_edge30"><a xlink:title="deliveryEditorAutomat → artikelAutomat (lookup SKU &amp; pack units)">
<path fill="none" stroke="#58d18a" stroke-width="1.4" d="M4624.04,-1035.4C4496.42,-1035.4 4192.61,-1155.99 4065.78,-1170.2 3912.12,-1187.41 1433.07,-1155.9 1282.78,-1192.2 1053.96,-1247.46 1037.91,-1372.82 809.61,-1430.2 797.9,-1433.14 783.52,-1441.05 776.35,-1439.02"/>
<polygon fill="#58d18a" stroke="#58d18a" stroke-width="1.4" points="778.52,-1437.88 772.9,-1433.04 774.27,-1440.33 778.52,-1437.88"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4175.47" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#58d18a"> &#160;lookup SKU &amp; pack units &#160;</text>
</g>
<!-- deliveryEditorAutomat&#45;&gt;deliveryAutomat -->
<g id="edge31" class="edge">
<title>deliveryEditorAutomat:e&#45;&gt;deliveryAutomat:n</title>
<g id="a_edge31"><a xlink:title="deliveryEditorAutomat → deliveryAutomat (commit delivery receipt)">
<path fill="none" stroke="#4fc4e8" stroke-width="1.4" d="M4897.52,-925.4C4923.75,-925.4 4905.19,-891.15 4896.52,-866.4 4875.14,-805.4 4809.83,-812.55 4803.75,-754.63"/>
<polygon fill="#4fc4e8" stroke="#4fc4e8" stroke-width="1.4" points="4806.2,-754.58 4803.4,-747.72 4801.31,-754.83 4806.2,-754.58"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4909.23" y="-811.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#4fc4e8"> &#160;commit delivery receipt &#160;</text>
</g>
<!-- quoteAutomat&#45;&gt;orderAutomat -->
<g id="edge32" class="edge">
<title>quoteAutomat:e&#45;&gt;orderAutomat:n</title>
<g id="a_edge32"><a xlink:title="quoteAutomat → orderAutomat (convert quote to order)">
<path fill="none" stroke="#a98cff" stroke-width="1.4" d="M3329.26,-1781C3481.84,-1781 3333.66,-1593.81 3328.11,-1439.89"/>
<polygon fill="#a98cff" stroke="#a98cff" stroke-width="1.4" points="3330.57,-1440.27 3327.99,-1433.32 3325.67,-1440.36 3330.57,-1440.27"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3392.04" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a98cff"> &#160;convert quote to order &#160;</text>
</g>
<!-- orderAutomat&#45;&gt;entityAutomat -->
<g id="edge33" class="edge">
<title>orderAutomat:e&#45;&gt;entityAutomat:n</title>
<g id="a_edge33"><a xlink:title="orderAutomat → entityAutomat (customer lookup)">
<path fill="none" stroke="#ff8f66" stroke-width="1.4" d="M3374.54,-1386.2C3468.6,-1386.2 3323.47,-1111.2 3307.9,-1045.37"/>
<polygon fill="#ff8f66" stroke="#ff8f66" stroke-width="1.4" points="3310.33,-1045.06 3306.88,-1038.5 3305.48,-1045.78 3310.33,-1045.06"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="3393.88" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff8f66"> &#160;customer lookup &#160;</text>
</g>
<!-- chatAutomat&#45;&gt;sseAutomat -->
<g id="edge36" class="edge">
<title>chatAutomat:e&#45;&gt;sseAutomat:n</title>
<g id="a_edge36"><a xlink:title="chatAutomat → sseAutomat (getSseClientId())">
<path fill="none" stroke="#e0b25a" stroke-width="1.4" d="M2142.87,-1331.2C2243.03,-1331.2 2192.9,-1456.95 2275.78,-1513.2 2287.55,-1521.19 2296.46,-1511.4 2306.78,-1521.2 2348.61,-1560.91 2336.95,-1587.99 2345.7,-1645 2361.55,-1748.24 2419.01,-1805.61 2345.7,-1880 2326.76,-1899.22 2287.58,-1909.07 2278.95,-1889.84"/>
<polygon fill="#e0b25a" stroke="#e0b25a" stroke-width="1.4" points="2281.38,-1889.49 2277.64,-1883.08 2276.57,-1890.42 2281.38,-1889.49"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2353.85" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#e0b25a"> &#160;getSseClientId() &#160;</text>
</g>
<!-- chatAutomat&#45;&gt;chatAutomat -->
<g id="edge44" class="edge">
<title>chatAutomat:nw&#45;&gt;chatAutomat:n</title>
<g id="a_edge44"><a xlink:title="chatAutomat → chatAutomat (stream delta appends)">
<path fill="none" stroke="#ff7fc2" stroke-width="1.4" d="M1849.69,-1364.2C1819.02,-1323.72 1773.69,-1323.72 1773.69,-1402.7 1773.69,-1478.9 1911.52,-1481.58 1987.71,-1445.32"/>
<polygon fill="#ff7fc2" stroke="#ff7fc2" stroke-width="1.4" points="1988.77,-1447.53 1993.89,-1442.16 1986.54,-1443.16 1988.77,-1447.53"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1725.41" y="-1324" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff7fc2"> &#160;stream delta appends &#160;</text>
</g>
<!-- chatAutomat&#45;&gt;vfsAutomat -->
<g id="edge34" class="edge">
<title>chatAutomat:e&#45;&gt;vfsAutomat:n</title>
<g id="a_edge34"><a xlink:title="chatAutomat → vfsAutomat (inspect / edit applets)">
<path fill="none" stroke="#4ecb8f" stroke-width="1.4" d="M2142.87,-1353.2C2182.78,-1353.2 2270.7,-1411.59 2309.87,-1419.2 2364.48,-1429.81 2433.88,-1473.2 2443.62,-1431.54"/>
<polygon fill="#4ecb8f" stroke="#4ecb8f" stroke-width="1.4" points="2446.29,-1429.52 2444.56,-1422.31 2441.42,-1429.02 2446.29,-1429.52"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2229.87" y="-1409.16" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#4ecb8f"> &#160;inspect / edit applets &#160;</text>
</g>
<!-- navigationAutomat -->
<g id="node20" class="node">
<title>navigationAutomat</title>
<polygon fill="#33415c" stroke="none" points="4492.3,-1386.2 4492.3,-1421.2 4761.26,-1421.2 4761.26,-1386.2 4492.3,-1386.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1386.2 4492.3,-1421.2 4761.26,-1421.2 4761.26,-1386.2 4492.3,-1386.2"/>
<polygon fill="#33415c" stroke="none" points="4494.3,-1415.2 4494.3,-1419.2 4626.78,-1419.2 4626.78,-1415.2 4494.3,-1415.2"/>
<polygon fill="#33415c" stroke="none" points="4626.78,-1415.2 4626.78,-1419.2 4759.26,-1419.2 4759.26,-1415.2 4626.78,-1415.2"/>
<text xml:space="preserve" text-anchor="start" x="4572.45" y="-1402.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">navigationAutomat</text>
<text xml:space="preserve" text-anchor="start" x="4558.51" y="-1393.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Cross&#45;Section Navigation Memory</text>
<polygon fill="#2a3242" stroke="none" points="4492.3,-1364.2 4492.3,-1386.2 4761.26,-1386.2 4761.26,-1364.2 4492.3,-1364.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1364.2 4492.3,-1386.2 4761.26,-1386.2 4761.26,-1364.2 4492.3,-1364.2"/>
<polygon fill="#2b1a42" stroke="none" points="4493.3,-1365.2 4493.3,-1385.2 4556.78,-1385.2 4556.78,-1365.2 4493.3,-1365.2"/>
<text xml:space="preserve" text-anchor="start" x="4511.92" y="-1373.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4560.78" y="-1373.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">lastDeliveryPath</text>
<text xml:space="preserve" text-anchor="start" x="4677.55" y="-1372" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active receipt subpath</text>
<polygon fill="#272e3d" stroke="none" points="4492.3,-1342.2 4492.3,-1364.2 4761.26,-1364.2 4761.26,-1342.2 4492.3,-1342.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1342.2 4492.3,-1364.2 4761.26,-1364.2 4761.26,-1342.2 4492.3,-1342.2"/>
<polygon fill="#2b1a42" stroke="none" points="4493.3,-1343.2 4493.3,-1363.2 4561.97,-1363.2 4561.97,-1343.2 4493.3,-1343.2"/>
<text xml:space="preserve" text-anchor="start" x="4514.52" y="-1351.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4565.97" y="-1351.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">lastArticleSku</text>
<text xml:space="preserve" text-anchor="start" x="4682.01" y="-1350" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active SKU selection</text>
<polygon fill="#2a3242" stroke="none" points="4492.3,-1320.2 4492.3,-1342.2 4761.26,-1342.2 4761.26,-1320.2 4492.3,-1320.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1320.2 4492.3,-1342.2 4761.26,-1342.2 4761.26,-1320.2 4492.3,-1320.2"/>
<polygon fill="#2b1a42" stroke="none" points="4493.3,-1321.2 4493.3,-1341.2 4541.3,-1341.2 4541.3,-1321.2 4493.3,-1321.2"/>
<text xml:space="preserve" text-anchor="start" x="4504.19" y="-1329.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4545.3" y="-1329.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">lastCategorySlug / Path</text>
<text xml:space="preserve" text-anchor="start" x="4665.54" y="-1328" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active category tree node</text>
<polygon fill="#272e3d" stroke="none" points="4492.3,-1298.2 4492.3,-1320.2 4761.26,-1320.2 4761.26,-1298.2 4492.3,-1298.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1298.2 4492.3,-1320.2 4761.26,-1320.2 4761.26,-1298.2 4492.3,-1298.2"/>
<polygon fill="#2b1a42" stroke="none" points="4493.3,-1299.2 4493.3,-1319.2 4545.63,-1319.2 4545.63,-1299.2 4493.3,-1299.2"/>
<text xml:space="preserve" text-anchor="start" x="4506.35" y="-1307.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4549.63" y="-1307.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">lastSearchTerm / Path</text>
<text xml:space="preserve" text-anchor="start" x="4671.33" y="-1306" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Preserved search query</text>
<polygon fill="#2a3242" stroke="none" points="4492.3,-1276.2 4492.3,-1298.2 4761.26,-1298.2 4761.26,-1276.2 4492.3,-1276.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1276.2 4492.3,-1298.2 4761.26,-1298.2 4761.26,-1276.2 4492.3,-1276.2"/>
<polygon fill="#143826" stroke="none" points="4493.3,-1277.2 4493.3,-1297.2 4546.41,-1297.2 4546.41,-1277.2 4493.3,-1277.2"/>
<text xml:space="preserve" text-anchor="start" x="4504.52" y="-1285.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4550.41" y="-1285.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">setLastDeliveryPath()</text>
<text xml:space="preserve" text-anchor="start" x="4670.89" y="-1284" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Restore on sidebar click</text>
<polygon fill="#272e3d" stroke="none" points="4492.3,-1254.2 4492.3,-1276.2 4761.26,-1276.2 4761.26,-1254.2 4492.3,-1254.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1254.2 4492.3,-1276.2 4761.26,-1276.2 4761.26,-1254.2 4492.3,-1254.2"/>
<polygon fill="#143826" stroke="none" points="4493.3,-1255.2 4493.3,-1275.2 4544.19,-1275.2 4544.19,-1255.2 4493.3,-1255.2"/>
<text xml:space="preserve" text-anchor="start" x="4503.41" y="-1263.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4548.19" y="-1263.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">setLastArticleSku()</text>
<text xml:space="preserve" text-anchor="start" x="4653.11" y="-1262" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Restore SKU on section click</text>
<polygon fill="#2a3242" stroke="none" points="4492.3,-1232.2 4492.3,-1254.2 4761.26,-1254.2 4761.26,-1232.2 4492.3,-1232.2"/>
<polygon fill="none" stroke="#3f4c5f" points="4492.3,-1232.2 4492.3,-1254.2 4761.26,-1254.2 4761.26,-1232.2 4492.3,-1232.2"/>
<polygon fill="#143826" stroke="none" points="4493.3,-1233.2 4493.3,-1253.2 4551.52,-1253.2 4551.52,-1233.2 4493.3,-1233.2"/>
<text xml:space="preserve" text-anchor="start" x="4507.08" y="-1241.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4555.52" y="-1241.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">clearNavigation()</text>
<text xml:space="preserve" text-anchor="start" x="4665.11" y="-1240" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Reset on company switch</text>
</g>
<!-- chatAutomat&#45;&gt;navigationAutomat -->
<g id="edge35" class="edge">
<title>chatAutomat:e&#45;&gt;navigationAutomat:n</title>
<g id="a_edge35"><a xlink:title="chatAutomat → navigationAutomat (set_user_route tool)">
<path fill="none" stroke="#ff7aa8" stroke-width="1.4" d="M2142.87,-1265.2C2258.95,-1265.2 2174.96,-1432.5 2275.78,-1490.02 2373.64,-1545.85 4192.1,-1504.93 4303.78,-1490.02 4417.91,-1474.78 4553.19,-1535.13 4560.25,-1429.18"/>
<polygon fill="#ff7aa8" stroke="#ff7aa8" stroke-width="1.4" points="4562.69,-1429.39 4560.47,-1422.32 4557.8,-1429.24 4562.69,-1429.39"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2261.78" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff7aa8"> &#160;set_user_route tool &#160;</text>
</g>
<!-- navigationAutomat&#45;&gt;categoryAutomat -->
<g id="edge38" class="edge">
<title>navigationAutomat:w&#45;&gt;categoryAutomat:n</title>
<g id="a_edge38"><a xlink:title="navigationAutomat → categoryAutomat (restore last category)">
<path fill="none" stroke="#ff5f9e" stroke-width="1.4" d="M4491.3,-1331.2C4407.53,-1331.2 4484.01,-1205.06 4413.78,-1159.4 4405.95,-1154.31 3078.12,-1151.55 3068.78,-1151.4 3007.15,-1150.41 918.27,-1154.79 783.7,-1097.35"/>
<polygon fill="#ff5f9e" stroke="#ff5f9e" stroke-width="1.4" points="785.38,-1095.56 778.5,-1092.8 782.16,-1099.25 785.38,-1095.56"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4471.73" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ff5f9e"> &#160;restore last category &#160;</text>
</g>
<!-- navigationAutomat&#45;&gt;artikelAutomat -->
<g id="edge37" class="edge">
<title>navigationAutomat:w&#45;&gt;artikelAutomat:n</title>
<g id="a_edge37"><a xlink:title="navigationAutomat → artikelAutomat (restore last SKU)">
<path fill="none" stroke="#56c8c8" stroke-width="1.4" d="M4491.3,-1353.2C4388.13,-1353.2 4401.86,-1458.04 4303.78,-1490.02 4144.21,-1542.04 1450.39,-1498.69 1282.78,-1490.02 1159.48,-1483.63 737.61,-1554.18 717.09,-1440.11"/>
<polygon fill="#56c8c8" stroke="#56c8c8" stroke-width="1.4" points="719.54,-1440.07 716.5,-1433.31 714.66,-1440.5 719.54,-1440.07"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2100.78" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#56c8c8"> &#160;restore last SKU &#160;</text>
</g>
<!-- navigationAutomat&#45;&gt;deliveryEditorAutomat -->
<g id="edge39" class="edge">
<title>navigationAutomat:e&#45;&gt;deliveryEditorAutomat:n</title>
<g id="a_edge39"><a xlink:title="navigationAutomat → deliveryEditorAutomat (restore draft path)">
<path fill="none" stroke="#ffb25a" stroke-width="1.4" d="M4762.26,-1375.2C4890.34,-1375.2 4766.6,-1218.7 4760.98,-1089.28"/>
<polygon fill="#ffb25a" stroke="#ffb25a" stroke-width="1.4" points="4763.43,-1089.46 4760.83,-1082.52 4758.53,-1089.57 4763.43,-1089.46"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4814.68" y="-1162.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ffb25a"> &#160;restore draft path &#160;</text>
</g>
<!-- helpAutomat -->
<g id="node21" class="node">
<title>helpAutomat</title>
<polygon fill="#33415c" stroke="none" points="4414.53,-1805 4414.53,-1836 4693.03,-1836 4693.03,-1805 4414.53,-1805"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1805 4414.53,-1836 4693.03,-1836 4693.03,-1805 4414.53,-1805"/>
<text xml:space="preserve" text-anchor="start" x="4517.11" y="-1821.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">helpAutomat</text>
<text xml:space="preserve" text-anchor="start" x="4498.25" y="-1811.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">IndexedDB Contextual Help</text>
<polygon fill="#2a3242" stroke="none" points="4414.53,-1783 4414.53,-1805 4693.03,-1805 4693.03,-1783 4414.53,-1783"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1783 4414.53,-1805 4693.03,-1805 4693.03,-1783 4414.53,-1783"/>
<polygon fill="#2b1a42" stroke="none" points="4415.53,-1784 4415.53,-1804 4479.38,-1804 4479.38,-1784 4415.53,-1784"/>
<text xml:space="preserve" text-anchor="start" x="4434.34" y="-1792.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4483.38" y="-1792" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">enabled: boolean</text>
<text xml:space="preserve" text-anchor="start" x="4605.31" y="-1790.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Interactive help badges</text>
<polygon fill="#272e3d" stroke="none" points="4414.53,-1761 4414.53,-1783 4693.03,-1783 4693.03,-1761 4414.53,-1761"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1761 4414.53,-1783 4693.03,-1783 4693.03,-1761 4414.53,-1761"/>
<polygon fill="#2b1a42" stroke="none" points="4415.53,-1762 4415.53,-1782 4476.86,-1782 4476.86,-1762 4415.53,-1762"/>
<text xml:space="preserve" text-anchor="start" x="4433.08" y="-1770.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4480.86" y="-1770" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">activeHelpId: string|null</text>
<text xml:space="preserve" text-anchor="start" x="4628.89" y="-1768.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Active popper ID</text>
<polygon fill="#2a3242" stroke="none" points="4414.53,-1739 4414.53,-1761 4693.03,-1761 4693.03,-1739 4414.53,-1739"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1739 4414.53,-1761 4693.03,-1761 4693.03,-1739 4414.53,-1739"/>
<polygon fill="#143826" stroke="none" points="4415.53,-1740 4415.53,-1760 4475.64,-1760 4475.64,-1740 4415.53,-1740"/>
<text xml:space="preserve" text-anchor="start" x="4430.25" y="-1748.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4479.64" y="-1748" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">toggle() / setEnabled()</text>
<text xml:space="preserve" text-anchor="start" x="4616.87" y="-1746.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Toggle badge mode</text>
<polygon fill="#272e3d" stroke="none" points="4414.53,-1717 4414.53,-1739 4693.03,-1739 4693.03,-1717 4414.53,-1717"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1717 4414.53,-1739 4693.03,-1739 4693.03,-1717 4414.53,-1717"/>
<polygon fill="#143826" stroke="none" points="4415.53,-1718 4415.53,-1738 4463.53,-1738 4463.53,-1718 4415.53,-1718"/>
<text xml:space="preserve" text-anchor="start" x="4424.2" y="-1726.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4467.53" y="-1726" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">openPopper() / closePopper()</text>
<text xml:space="preserve" text-anchor="start" x="4615.54" y="-1724.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Single active popper</text>
<polygon fill="#2a3242" stroke="none" points="4414.53,-1695 4414.53,-1717 4693.03,-1717 4693.03,-1695 4414.53,-1695"/>
<polygon fill="none" stroke="#3f4c5f" points="4414.53,-1695 4414.53,-1717 4693.03,-1717 4693.03,-1695 4414.53,-1695"/>
<polygon fill="#382414" stroke="none" points="4415.53,-1696 4415.53,-1716 4488.71,-1716 4488.71,-1696 4415.53,-1696"/>
<text xml:space="preserve" text-anchor="start" x="4440.12" y="-1704.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#fb923c">HOOK</text>
<text xml:space="preserve" text-anchor="start" x="4492.71" y="-1704" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">persist: true</text>
<text xml:space="preserve" text-anchor="start" x="4608.87" y="-1702.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Survives page reloads</text>
</g>
<!-- helpAutomat&#45;&gt;navigationAutomat -->
<g id="edge41" class="edge">
<title>helpAutomat:e&#45;&gt;navigationAutomat:n</title>
<g id="a_edge41"><a xlink:title="helpAutomat → navigationAutomat (route&#45;contextual help)">
<path fill="none" stroke="#5aa7ff" stroke-width="1.4" d="M4694.03,-1772C4769.46,-1772 4698.39,-1517.28 4693.3,-1429.15"/>
<polygon fill="#5aa7ff" stroke="#5aa7ff" stroke-width="1.4" points="4695.76,-1429.24 4693.09,-1422.32 4690.86,-1429.39 4695.76,-1429.24"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="4755.04" y="-1523.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#5aa7ff"> &#160;route&#45;contextual help &#160;</text>
</g>
<!-- pwaAutomat -->
<g id="node22" class="node">
<title>pwaAutomat</title>
<polygon fill="#33415c" stroke="none" points="4777.13,-1805 4777.13,-1836 5038.42,-1836 5038.42,-1805 4777.13,-1805"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1805 4777.13,-1836 5038.42,-1836 5038.42,-1805 4777.13,-1805"/>
<text xml:space="preserve" text-anchor="start" x="4871.78" y="-1821.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="12.00" fill="#e2e8f0">pwaAutomat</text>
<text xml:space="preserve" text-anchor="start" x="4839.76" y="-1811.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#8b95a7">Service Worker &amp; Offline Lifecycle</text>
<polygon fill="#2a3242" stroke="none" points="4777.13,-1783 4777.13,-1805 5038.42,-1805 5038.42,-1783 4777.13,-1783"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1783 4777.13,-1805 5038.42,-1805 5038.42,-1783 4777.13,-1783"/>
<polygon fill="#2b1a42" stroke="none" points="4778.13,-1784 4778.13,-1804 4826.13,-1804 4826.13,-1784 4778.13,-1784"/>
<text xml:space="preserve" text-anchor="start" x="4789.02" y="-1792.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4830.13" y="-1792" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">needRefresh: boolean</text>
<text xml:space="preserve" text-anchor="start" x="4943.15" y="-1790.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">New SW release pending</text>
<polygon fill="#272e3d" stroke="none" points="4777.13,-1761 4777.13,-1783 5038.42,-1783 5038.42,-1761 4777.13,-1761"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1761 4777.13,-1783 5038.42,-1783 5038.42,-1761 4777.13,-1761"/>
<polygon fill="#2b1a42" stroke="none" points="4778.13,-1762 4778.13,-1782 4830.92,-1782 4830.92,-1762 4778.13,-1762"/>
<text xml:space="preserve" text-anchor="start" x="4791.42" y="-1770.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4834.92" y="-1770" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">offlineReady: boolean</text>
<text xml:space="preserve" text-anchor="start" x="4956.94" y="-1768.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Offline assets cached</text>
<polygon fill="#2a3242" stroke="none" points="4777.13,-1739 4777.13,-1761 5038.42,-1761 5038.42,-1739 4777.13,-1739"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1739 4777.13,-1761 5038.42,-1761 5038.42,-1739 4777.13,-1739"/>
<polygon fill="#2b1a42" stroke="none" points="4778.13,-1740 4778.13,-1760 4832.93,-1760 4832.93,-1740 4778.13,-1740"/>
<text xml:space="preserve" text-anchor="start" x="4792.42" y="-1748.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#c084fc">STATE</text>
<text xml:space="preserve" text-anchor="start" x="4836.93" y="-1748" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">dialogOpen / updating</text>
<text xml:space="preserve" text-anchor="start" x="4964.06" y="-1746.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Prompt modal state</text>
<polygon fill="#272e3d" stroke="none" points="4777.13,-1717 4777.13,-1739 5038.42,-1739 5038.42,-1717 4777.13,-1717"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1717 4777.13,-1739 5038.42,-1739 5038.42,-1717 4777.13,-1717"/>
<polygon fill="#143826" stroke="none" points="4778.13,-1718 4778.13,-1738 4844.11,-1738 4844.11,-1718 4778.13,-1718"/>
<text xml:space="preserve" text-anchor="start" x="4795.79" y="-1726.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4848.11" y="-1726" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">applyUpdate()</text>
<text xml:space="preserve" text-anchor="start" x="4958.72" y="-1724.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Skip waiting &amp; reload</text>
<polygon fill="#2a3242" stroke="none" points="4777.13,-1695 4777.13,-1717 5038.42,-1717 5038.42,-1695 4777.13,-1695"/>
<polygon fill="none" stroke="#3f4c5f" points="4777.13,-1695 4777.13,-1717 5038.42,-1717 5038.42,-1695 4777.13,-1695"/>
<polygon fill="#143826" stroke="none" points="4778.13,-1696 4778.13,-1716 4829.81,-1716 4829.81,-1696 4778.13,-1696"/>
<text xml:space="preserve" text-anchor="start" x="4788.64" y="-1704.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="8.00" fill="#4ade80">ACTION</text>
<text xml:space="preserve" text-anchor="start" x="4833.81" y="-1704" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#d8dee9">openDialog() / closeDialog()</text>
<text xml:space="preserve" text-anchor="start" x="4981.4" y="-1702.8" font-family="Helvetica,sans-Serif" font-size="8.00" fill="#8b95a7">Modal controls</text>
</g>
<!-- Legend -->
<g id="node23" class="node">
<title>Legend</title>
<polygon fill="#2a3242" stroke="none" points="5122.48,-1668.7 5122.48,-1862.3 5337.08,-1862.3 5337.08,-1668.7 5122.48,-1668.7"/>
<polygon fill="#33415c" stroke="none" points="5122.48,-1839.1 5122.48,-1862.3 5337.08,-1862.3 5337.08,-1839.1 5122.48,-1839.1"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1839.1 5122.48,-1862.3 5337.08,-1862.3 5337.08,-1839.1 5122.48,-1839.1"/>
<text xml:space="preserve" text-anchor="start" x="5168.67" y="-1848.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00" fill="#e2e8f0">Automat Graph Legend</text>
<polygon fill="#2b1a42" stroke="none" points="5122.48,-1818.3 5122.48,-1839.1 5170.48,-1839.1 5170.48,-1818.3 5122.48,-1818.3"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1818.3 5122.48,-1839.1 5170.48,-1839.1 5170.48,-1818.3 5122.48,-1818.3"/>
<text xml:space="preserve" text-anchor="start" x="5131.73" y="-1827" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#c084fc">STATE</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1818.3 5170.48,-1839.1 5337.08,-1839.1 5337.08,-1818.3 5170.48,-1818.3"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1825.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Reactive store state property</text>
<polygon fill="#143826" stroke="none" points="5122.48,-1797.5 5122.48,-1818.3 5170.48,-1818.3 5170.48,-1797.5 5122.48,-1797.5"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1797.5 5122.48,-1818.3 5170.48,-1818.3 5170.48,-1797.5 5122.48,-1797.5"/>
<text xml:space="preserve" text-anchor="start" x="5129.23" y="-1806.2" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#4ade80">ACTION</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1797.5 5170.48,-1818.3 5337.08,-1818.3 5337.08,-1797.5 5170.48,-1797.5"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1804.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">State mutation action</text>
<polygon fill="#182b40" stroke="none" points="5122.48,-1776.7 5122.48,-1797.5 5170.48,-1797.5 5170.48,-1776.7 5122.48,-1776.7"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1776.7 5122.48,-1797.5 5170.48,-1797.5 5170.48,-1776.7 5122.48,-1776.7"/>
<text xml:space="preserve" text-anchor="start" x="5128.73" y="-1785.4" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#38bdf8">SELECT</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1776.7 5170.48,-1797.5 5337.08,-1797.5 5337.08,-1776.7 5170.48,-1776.7"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1783.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Reactive PureComponent selector</text>
<polygon fill="#3b2c12" stroke="none" points="5122.48,-1755.9 5122.48,-1776.7 5170.48,-1776.7 5170.48,-1755.9 5122.48,-1755.9"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1755.9 5122.48,-1776.7 5170.48,-1776.7 5170.48,-1755.9 5122.48,-1755.9"/>
<text xml:space="preserve" text-anchor="start" x="5138.98" y="-1764.6" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#fbbf24">API</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1755.9 5170.48,-1776.7 5337.08,-1776.7 5337.08,-1755.9 5170.48,-1755.9"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1762.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Backend REST/Fetch endpoint</text>
<polygon fill="#3a181e" stroke="none" points="5122.48,-1735.1 5122.48,-1755.9 5170.48,-1755.9 5170.48,-1735.1 5122.48,-1735.1"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1735.1 5122.48,-1755.9 5170.48,-1755.9 5170.48,-1735.1 5122.48,-1735.1"/>
<text xml:space="preserve" text-anchor="start" x="5137.48" y="-1743.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#f87171">SSE</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1735.1 5170.48,-1755.9 5337.08,-1755.9 5337.08,-1735.1 5170.48,-1735.1"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1741.9" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Inbound Server&#45;Sent Event trigger</text>
<polygon fill="#382414" stroke="none" points="5122.48,-1714.3 5122.48,-1735.1 5170.48,-1735.1 5170.48,-1714.3 5122.48,-1714.3"/>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1714.3 5122.48,-1735.1 5170.48,-1735.1 5170.48,-1714.3 5122.48,-1714.3"/>
<text xml:space="preserve" text-anchor="start" x="5132.98" y="-1723" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00" fill="#fb923c">HOOK</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1714.3 5170.48,-1735.1 5337.08,-1735.1 5337.08,-1714.3 5170.48,-1714.3"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1721.1" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Auth / persistence lifecycle hook</text>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1691.5 5122.48,-1714.3 5170.48,-1714.3 5170.48,-1691.5 5122.48,-1691.5"/>
<text xml:space="preserve" text-anchor="start" x="5136.37" y="-1699.7" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="14.00" fill="#e2e8f0">in#</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1691.5 5170.48,-1714.3 5337.08,-1714.3 5337.08,-1691.5 5170.48,-1691.5"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1699.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Inbound arrival port on Automat header</text>
<polygon fill="none" stroke="#3f4c5f" points="5122.48,-1668.7 5122.48,-1691.5 5170.48,-1691.5 5170.48,-1668.7 5122.48,-1668.7"/>
<text xml:space="preserve" text-anchor="start" x="5128.98" y="-1674.5" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#5aa7ff">▪—▶</text>
<polygon fill="none" stroke="#3f4c5f" points="5170.48,-1668.7 5170.48,-1691.5 5337.08,-1691.5 5337.08,-1668.7 5170.48,-1668.7"/>
<text xml:space="preserve" text-anchor="start" x="5175.48" y="-1676.5" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d8dee9">Reactive dataflow / upstream trigger</text>
</g>
</g>
</svg>