Files
dashfront/automat-graph.dot
2026-10-28 00:08:45 +01:00

121 lines
102 KiB
Plaintext

digraph automats {
graph [rankdir=TB, splines=spline, overlap=false, bgcolor="#1e2430",
nodesep=0.95, ranksep=1.0, pad=0.5, fontname="Helvetica",
compound=true, mclimit=1.0];
node [shape=plaintext, fontname="Helvetica"];
edge [fontname="Helvetica", fontsize=9, penwidth=1.4, arrowsize=0.7];
subgraph cluster_session_realtime {
label="Session & Real-Time Hub"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
authAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="4" BORDER="1"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>authAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Always-On Session &amp; Multi-Tenant Gateway</FONT></TD></TR><TR><TD PORT="p_auth_hasAuth" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>hasAuth: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Authenticated session bit</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_auth_hasCompany" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>hasCompany: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">hasAuth &amp;&amp; selectedCompanyId</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_auth_user" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>user: AuthUser</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Current user &amp; company</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_auth_status" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>status</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">'anon' | 'authed' | 'loading'</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>bootstrapSession()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Restore or fetch session</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_auth_switchCompany" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>switchCompany(id)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Multi-tenant switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>logout()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Clear session cookie</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectHasAuth() / selectHasCompany()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Auth &amp; tenant gates</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/auth/session</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Cookie session check</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
sseAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>sseAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Single Persistent SSE Connection</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>status</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">'connected' | 'error'</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>clientId (cid)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Tab-scoped UUID in session</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reconnect()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Cycle on company switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>on(event, handler)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Register signal listener</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>watchArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Attach article-&lt;sku&gt;</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>invalidateArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Silent cache refresh</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_sse_events" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="8"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>category / articles</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Catalog mutation events</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="8"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>order / shipment</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fulfillment events</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/events</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Persistent stream</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_company_basedata {
label="Company &amp; Consolidated Base Data"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
companyAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="3" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>companyAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Consolidated Company &amp; Base Data Hub</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_curr" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>current: Company</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Tax rates, legal &amp; root cat</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_num" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>numbers: NumberSeq[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Document number sequences</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_pos" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>terminals: Posterminal[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">POS hardware &amp; categories</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_sup" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>suppliers: Supplier[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Vendors &amp; supplier articles</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_unit" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>units: Unit[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Allowed SI &amp; sales units</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_usr" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>viewerPosition / chatDrawerWidth</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Persisted user UI settings</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_wh" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>warehouses: Warehouse[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Storage locations &amp; stock</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_prop" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>properties: PropertyName[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Custom text properties</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_cgrp" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>customergroups: Group[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Pricing discount tiers</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_car" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>carriers: Carrier[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Shipping methods &amp; carriers</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_brand" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>brands: Brand[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Catalog brands &amp; logos</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_attr" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>attributes: AttributeName[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Attributes &amp; discrete values</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_acc" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>accounts: Account[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Bank &amp; payment ledgers</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>loadAll() / reset()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fetch or reset all base data</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_comp_root" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectCompanyRootCategoryId()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Root category pointer</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>/api/company, /api/brand, …</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">13 consolidated endpoints</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_catalog_products {
label="Catalog &amp; Products"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
categoryAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in3" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in4" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in5" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="6" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>categoryAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Hierarchical Category Tree</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_cat_categories" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>categories: Map</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">ID -&gt; Category Node Map</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>rootCategoryId</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Company root node ID</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articleCount</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Total parent items</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_cat_loadTree" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>loadTree()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fetch tree &amp; warm views</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>createCategory()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Insert child node</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>moveCategory()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Parent reparenting</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>deleteCategory()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Prune subtree</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>getCategoryBreadcrumbs()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Hierarchical path trace</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/category</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Recursive tree load</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
categoryViewAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>categoryViewAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">KeyedAutomat (Slug Path)</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>views: Map&lt;slug, Data&gt;</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Articles &amp; direct children</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>loadAllCategoryViews()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Prewarm all tree slugs</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reloadLoadedCategoryViews()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Refresh cached views</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>invalidateAllCategoryViews()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Clear on SSE signal</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_catview_collect" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>collectLoadedCategoryViewData()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Extract union data</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>getOrCreateCategoryAutomat()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Per-slug reactive store</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/category/:id/articles</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Category article batch</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
artikelAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in3" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in4" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="5" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>artikelAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">In-Memory Article Record Cache</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_art_set" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articles: Map&lt;sku, Object&gt;</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Deduplicated SKU cache</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>loadArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fetch or cached promise</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reloadArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Silent background sync</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_art_setName" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>setArticleName(sku, name)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Optimistic rename</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>clearArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Evict SKU from cache</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>getArticle(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Sync constructor read</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>createArticleSelector(sku)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fine-grained selector</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/article/:sku</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Full article document</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
articleDetailAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>articleDetailAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">KeyedAutomat (SKU)</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_artdet_hist" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articleHistory: Map&lt;sku&gt;</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Change history log</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articleSupplier: Map&lt;sku&gt;</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Assigned supplier list</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articleHistoryAutomat.load()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fetch SKU audit trail</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>articleSupplierAutomat.load()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fetch supplier catalog</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/article/:sku/history</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Audit change entries</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/article/:sku/supplier</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Vendor links &amp; prices</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_search_indexing {
label="Search &amp; Indexing"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleIndexAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="3" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>articleIndexAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Derived Client Search Index</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_idx_items" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>items: ArticleIndexRecord[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">De-duplicated article union</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>status: 'ready'</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Index lifecycle flag</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>buildArticleIndex()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Derive from category views</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>setArticleIndexName()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Patch on rename</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Re-derive from views</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectArticleIndexItems()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fast record projection</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>ensureLoaded()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Await warm views</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
articleSearchAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>articleSearchAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">In-Memory FlexSearch Engine</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>target: string</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active search query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>filter: string</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active category filter</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>result: ArticleSearchResult</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Facets, recordset, count</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>search(target, filter)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Synchronous indexed query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectSearchResult()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reactive search outcome</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_purchasing_logistics {
label="Deliveries &amp; Inbound"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
deliveryAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>deliveryAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Chunk-Paginated Deliveries</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>items: Delivery[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Company delivery receipts</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>status: 'ready'</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">List lifecycle state</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>load() / reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Deduplicated fetch &amp; sync</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reset()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Clear on session switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/delivery</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Inbound delivery log</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
deliveryEditorAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>deliveryEditorAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Inbound Receipt &amp; OCR Machine</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_deled_lines" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>lines: DeliveryLine[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Uncommitted draft lines</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_deled_supplier" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>deliveryEntity</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Selected supplier ID</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>attachments: File[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Invoice PDFs &amp; OCR results</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>draftCount: number</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Uncommitted lines for badge</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>addLine() / updateLine()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Interactive item editing</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_deled_commit" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>commitDelivery()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Persist goods receipt</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>buildSupplierArticlesMap()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Auto-match SKU/EAN</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>POST /api/delivery</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Create goods receipt</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_sales_crm {
label="Sales &amp; CRM"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
quoteAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>quoteAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Chunk-Paginated Quotes</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_quote_items" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>items: Quote[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Sales quotes / Angebote</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>load() / reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Deduplicated fetch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reset()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reset on logout</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/quote</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Company quote list</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
orderAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="3" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>orderAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Chunk-Paginated Order Engine</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_order_items" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>items: Order[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Sales orders &amp; lines</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>total: number</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Unfiltered order count</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>onlyUnpaid / onlyUndelivered</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fulfillment filters</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>loadChunk(index)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Chunk size 50 prefetch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Silent orders re-fetch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectOrders() / selectTotal()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Filter-applied slice</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/order</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Paged order stream</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="8"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>order / shipment</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Fulfillment mutations</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
entityAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>entityAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Customer &amp; Partner Directory</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>items: Entity[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Customers &amp; partners</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>load() / reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Customer directory load</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reset()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reset on session switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/entity</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Directory records</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_ai_workspace {
label="AI Assistant &amp; Workspace"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
chatAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="3" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>chatAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">AI Assistant Drawer &amp; SSE</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>isOpen: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Docked chat drawer toggle</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>conversations: []</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Conversation sessions</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_chat_msg" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>messages: ModelMessage[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Live message transcript</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_chat_sse" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>sseStatus: 'connected'</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Token streaming stream</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>sendMessage(text)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Prompt model with tools</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>answerAskUser()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Interactive tool modal</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_chat_tools" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="8"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>userEnv / routeTools</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Client navigation tool</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>POST /api/modelconversation</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">AI conversation session</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="8"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>modelconversation/events</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Live token stream</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
vfsAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in2" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="3" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>vfsAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Virtual Filesystem Explorer</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>files: VfsFile[]</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Company VFS workspace</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectedFileName</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Current active file</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>fileContent / isDirty</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Editor buffer &amp; diff</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>selectFile() / saveFile()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Applet editor buffer</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>uploadFiles() / deleteFile()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">File manipulations</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/vfs</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">VFS directory index</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="8"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>vfs</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">VFS mutation signal</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_audit_grids {
label="Audit &amp; Virtual Grids"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleHistoryGridAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>articleHistoryGridAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">createGridAutomat (Article)</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>rows: [] / totalRows</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Block size 50 virtual rows</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>fetchRows(viewport)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Infinite scroll query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reload on company switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/article/history</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Infinite audit window</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
globalHistoryGridAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>globalHistoryGridAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">createGridAutomat (Global)</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>rows: [] / totalRows</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Block size 50 virtual rows</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>fetchRows(viewport)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Infinite scroll query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reload on company switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/globalhistory</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Company global audit</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
ledgerHistoryGridAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="1" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>ledgerHistoryGridAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">createGridAutomat (Ledger)</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>rows: [] / totalRows</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Block size 50 virtual rows</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>fetchRows(viewport)</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Infinite scroll query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>reload()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reload on company switch</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="8"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>GET /api/ledger/history</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Append-only ledger audit</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
}
subgraph cluster_system_ui {
label="UI, Navigation &amp; System"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
navigationAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="1" BORDER="1"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD PORT="in0" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD><TD PORT="in1" BGCOLOR="#33415c" BORDER="0" WIDTH="10" HEIGHT="4" CELLPADDING="0"></TD></TR><TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="3"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>navigationAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Cross-Section Navigation Memory</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_nav_delpath" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>lastDeliveryPath</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active receipt subpath</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_nav_sku" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>lastArticleSku</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active SKU selection</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_nav_catslug" COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>lastCategorySlug / Path</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active category tree node</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>lastSearchTerm / Path</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Preserved search query</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>setLastDeliveryPath()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Restore on sidebar click</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>setLastArticleSku()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Restore SKU on section click</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>clearNavigation()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Reset on company switch</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
helpAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="4" BORDER="1"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>helpAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">IndexedDB Contextual Help</FONT></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>enabled: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Interactive help badges</FONT></TD></TR></TABLE></TD></TR><TR><TD PORT="p_help_active" COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>activeHelpId: string|null</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Active popper ID</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>toggle() / setEnabled()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Toggle badge mode</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>openPopper() / closePopper()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Single active popper</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#382414" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#fb923c" POINT-SIZE="8"><B>HOOK</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>persist: true</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Survives page reloads</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
pwaAutomat [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f"><TR><TD COLSPAN="3" BGCOLOR="#33415c" ALIGN="CENTER" CELLPADDING="4" BORDER="1"><FONT COLOR="#e2e8f0" POINT-SIZE="12"><B>pwaAutomat</B></FONT><BR/><FONT COLOR="#8b95a7" POINT-SIZE="9">Service Worker &amp; Offline Lifecycle</FONT></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>needRefresh: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">New SW release pending</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>offlineReady: boolean</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Offline assets cached</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="8"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>dialogOpen / updating</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Prompt modal state</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#272e3d" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>applyUpdate()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Skip waiting &amp; reload</FONT></TD></TR></TABLE></TD></TR><TR><TD COLSPAN="3" BGCOLOR="#2a3242" BORDER="1" CELLPADDING="0"><TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" FIXEDSIZE="FALSE"><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="3" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="8"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="10"><B>openDialog() / closeDialog()</B></FONT></TD><TD ALIGN="RIGHT" CELLPADDING="4"><FONT COLOR="#8b95a7" POINT-SIZE="8">Modal controls</FONT></TD></TR></TABLE></TD></TR></TABLE>>];
Legend [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4" COLOR="#3f4c5f" BGCOLOR="#2a3242"><TR><TD COLSPAN="2" BGCOLOR="#33415c" ALIGN="CENTER"><FONT COLOR="#e2e8f0" POINT-SIZE="11"><B>Automat Graph Legend</B></FONT></TD></TR><TR><TD BGCOLOR="#2b1a42" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#c084fc" POINT-SIZE="9"><B>STATE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Reactive store state property</FONT></TD></TR><TR><TD BGCOLOR="#143826" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#4ade80" POINT-SIZE="9"><B>ACTION</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">State mutation action</FONT></TD></TR><TR><TD BGCOLOR="#182b40" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#38bdf8" POINT-SIZE="9"><B>SELECT</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Reactive PureComponent selector</FONT></TD></TR><TR><TD BGCOLOR="#3b2c12" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#fbbf24" POINT-SIZE="9"><B>API</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Backend REST/Fetch endpoint</FONT></TD></TR><TR><TD BGCOLOR="#3a181e" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#f87171" POINT-SIZE="9"><B>SSE</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Inbound Server-Sent Event trigger</FONT></TD></TR><TR><TD BGCOLOR="#382414" ALIGN="CENTER" CELLPADDING="2" WIDTH="48"><FONT COLOR="#fb923c" POINT-SIZE="9"><B>HOOK</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Auth / persistence lifecycle hook</FONT></TD></TR><TR><TD ALIGN="CENTER" CELLPADDING="2"><FONT COLOR="#e2e8f0"><B>in#</B></FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Inbound arrival port on Automat header</FONT></TD></TR><TR><TD ALIGN="CENTER" CELLPADDING="2"><FONT COLOR="#5aa7ff">&#9642;&#8212;&#9654;</FONT></TD><TD ALIGN="LEFT" CELLPADDING="4"><FONT COLOR="#d8dee9" POINT-SIZE="9">Reactive dataflow / upstream trigger</FONT></TD></TR></TABLE>>];
}
authAutomat:p_auth_hasAuth:e -> sseAutomat:in0:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="authAutomat → sseAutomat (hasAuth -&gt; connect SSE)", label=" hasAuth -&gt; connect SSE ", constraint=false, weight=1];
authAutomat:p_auth_hasCompany:e -> companyAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="authAutomat → companyAutomat (hasCompany -&gt; loadAll())", label=" hasCompany -&gt; loadAll() ", constraint=false, weight=1];
authAutomat:p_auth_hasCompany:w -> categoryAutomat:in2:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="authAutomat → categoryAutomat (sync tree on hasCompany)", label=" sync tree on hasCompany ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> deliveryAutomat:in0:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="authAutomat → deliveryAutomat (sync deliveries on authed)", label=" sync deliveries on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> quoteAutomat:in0:n [color="#c79bff", fontcolor="#c79bff", tooltip="authAutomat → quoteAutomat (sync quotes on authed)", label=" sync quotes on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> orderAutomat:in0:n [color="#5cd6d6", fontcolor="#5cd6d6", tooltip="authAutomat → orderAutomat (sync orders on authed)", label=" sync orders on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> entityAutomat:in0:n [color="#ff9f5a", fontcolor="#ff9f5a", tooltip="authAutomat → entityAutomat (sync entities on authed)", label=" sync entities on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> chatAutomat:in0:n [color="#8f95ff", fontcolor="#8f95ff", tooltip="authAutomat → chatAutomat (auth chat &amp; reload)", label=" auth chat &amp; reload ", weight=3];
authAutomat:p_auth_status:e -> vfsAutomat:in0:n [color="#ff6b6b", fontcolor="#ff6b6b", tooltip="authAutomat → vfsAutomat (load company vfs)", label=" load company vfs ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> articleHistoryGridAutomat:in0:n [color="#58d18a", fontcolor="#58d18a", tooltip="authAutomat → articleHistoryGridAutomat (reload history on authed)", label=" reload history on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> globalHistoryGridAutomat:in0:n [color="#4fc4e8", fontcolor="#4fc4e8", tooltip="authAutomat → globalHistoryGridAutomat (reload audit on authed)", label=" reload audit on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> ledgerHistoryGridAutomat:in0:n [color="#a98cff", fontcolor="#a98cff", tooltip="authAutomat → ledgerHistoryGridAutomat (reload ledger on authed)", label=" reload ledger on authed ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> categoryAutomat:in3:n [color="#ff8f66", fontcolor="#ff8f66", tooltip="sseAutomat → categoryAutomat ('category' sse trigger)", label=" 'category' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> categoryViewAutomat:in1:n [color="#4ecb8f", fontcolor="#4ecb8f", tooltip="sseAutomat → categoryViewAutomat (invalidate views on sse)", label=" invalidate views on sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> articleIndexAutomat:in2:n [color="#ff7aa8", fontcolor="#ff7aa8", tooltip="sseAutomat → articleIndexAutomat ('articles' sse trigger)", label=" 'articles' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> artikelAutomat:in2:n [color="#e0b25a", fontcolor="#e0b25a", tooltip="sseAutomat → artikelAutomat ('article-&lt;sku&gt;' sse reload)", label=" 'article-&lt;sku&gt;' sse reload ", weight=3];
sseAutomat:p_sse_events:w -> articleDetailAutomat:in0:n [color="#56c8c8", fontcolor="#56c8c8", tooltip="sseAutomat → articleDetailAutomat (invalidateArticle(sku))", label=" invalidateArticle(sku) ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> companyAutomat:in1:n [color="#ff5f9e", fontcolor="#ff5f9e", tooltip="sseAutomat → companyAutomat (warehouse/supplier/brand/attr/prop/carrier sse)", label=" warehouse/supplier/brand/attr/prop/carrier sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> orderAutomat:in1:n [color="#ffb25a", fontcolor="#ffb25a", tooltip="sseAutomat → orderAutomat ('order'/'shipment' sse)", label=" 'order'/'shipment' sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> vfsAutomat:in2:n [color="#66b3ff", fontcolor="#66b3ff", tooltip="sseAutomat → vfsAutomat ('vfs' sse mutation)", label=" 'vfs' sse mutation ", constraint=false, weight=1];
companyAutomat:p_comp_root:w -> categoryAutomat:in4:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="companyAutomat → categoryAutomat (rootCategoryId &amp; terminals)", label=" rootCategoryId &amp; terminals ", constraint=false, weight=1];
categoryAutomat:p_cat_loadTree:e -> categoryViewAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="categoryAutomat → categoryViewAutomat (attachTree &amp; warm slugs)", label=" attachTree &amp; warm slugs ", weight=3];
categoryViewAutomat:p_catview_collect:e -> articleIndexAutomat:in1:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="categoryViewAutomat → articleIndexAutomat (derived union index)", label=" derived union index ", weight=3];
articleIndexAutomat:p_idx_items:e -> articleSearchAutomat:in1:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="articleIndexAutomat → articleSearchAutomat (query index items)", label=" query index items ", weight=3];
categoryAutomat:p_cat_categories:e -> articleSearchAutomat:in0:n [color="#c79bff", fontcolor="#c79bff", tooltip="categoryAutomat → articleSearchAutomat (categoryFacets)", label=" categoryFacets ", constraint=false, weight=1];
artikelAutomat:p_art_setName:e -> articleIndexAutomat:in0:n [color="#5cd6d6", fontcolor="#5cd6d6", tooltip="artikelAutomat → articleIndexAutomat (setArticleIndexName (optimistic))", label=" setArticleIndexName (optimistic) ", constraint=false, weight=1];
artikelAutomat:p_art_set:e -> categoryAutomat:in0:n [color="#ff9f5a", fontcolor="#ff9f5a", tooltip="artikelAutomat → categoryAutomat (articleCount updates)", label=" articleCount updates ", weight=3];
articleDetailAutomat:p_artdet_hist:w -> artikelAutomat:in1:n [color="#8f95ff", fontcolor="#8f95ff", tooltip="articleDetailAutomat → artikelAutomat (watch SKU details)", label=" watch SKU details ", weight=3];
deliveryEditorAutomat:p_deled_supplier:w -> companyAutomat:in2:n [color="#ff6b6b", fontcolor="#ff6b6b", tooltip="deliveryEditorAutomat → companyAutomat (match vendor catalog)", label=" match vendor catalog ", constraint=false, weight=1];
deliveryEditorAutomat:p_deled_lines:w -> artikelAutomat:in4:n [color="#58d18a", fontcolor="#58d18a", tooltip="deliveryEditorAutomat → artikelAutomat (lookup SKU &amp; pack units)", label=" lookup SKU &amp; pack units ", constraint=false, weight=1];
deliveryEditorAutomat:p_deled_commit:e -> deliveryAutomat:in1:n [color="#4fc4e8", fontcolor="#4fc4e8", tooltip="deliveryEditorAutomat → deliveryAutomat (commit delivery receipt)", label=" commit delivery receipt ", weight=3];
quoteAutomat:p_quote_items:e -> orderAutomat:in2:n [color="#a98cff", fontcolor="#a98cff", tooltip="quoteAutomat → orderAutomat (convert quote to order)", label=" convert quote to order ", weight=3];
orderAutomat:p_order_items:e -> entityAutomat:in1:n [color="#ff8f66", fontcolor="#ff8f66", tooltip="orderAutomat → entityAutomat (customer lookup)", label=" customer lookup ", weight=3];
chatAutomat:p_chat_msg:e -> vfsAutomat:in1:n [color="#4ecb8f", fontcolor="#4ecb8f", tooltip="chatAutomat → vfsAutomat (inspect / edit applets)", label=" inspect / edit applets ", constraint=false, weight=1];
chatAutomat:p_chat_tools:e -> navigationAutomat:in0:n [color="#ff7aa8", fontcolor="#ff7aa8", tooltip="chatAutomat → navigationAutomat (set_user_route tool)", label=" set_user_route tool ", constraint=false, weight=1];
chatAutomat:p_chat_sse:e -> sseAutomat:in1:n [color="#e0b25a", fontcolor="#e0b25a", tooltip="chatAutomat → sseAutomat (getSseClientId())", label=" getSseClientId() ", weight=3];
navigationAutomat:p_nav_sku:w -> artikelAutomat:in3:n [color="#56c8c8", fontcolor="#56c8c8", tooltip="navigationAutomat → artikelAutomat (restore last SKU)", label=" restore last SKU ", constraint=false, weight=1];
navigationAutomat:p_nav_catslug:w -> categoryAutomat:in5:n [color="#ff5f9e", fontcolor="#ff5f9e", tooltip="navigationAutomat → categoryAutomat (restore last category)", label=" restore last category ", constraint=false, weight=1];
navigationAutomat:p_nav_delpath:e -> deliveryEditorAutomat:in0:n [color="#ffb25a", fontcolor="#ffb25a", tooltip="navigationAutomat → deliveryEditorAutomat (restore draft path)", label=" restore draft path ", weight=3];
companyAutomat:p_comp_usr:w -> chatAutomat:in2:n [color="#66b3ff", fontcolor="#66b3ff", tooltip="companyAutomat → chatAutomat (chatDrawerWidth)", label=" chatDrawerWidth ", weight=3];
helpAutomat:p_help_active:e -> navigationAutomat:in1:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="helpAutomat → navigationAutomat (route-contextual help)", label=" route-contextual help ", weight=3];
categoryAutomat:p_cat_categories:ne -> categoryAutomat:in1:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="categoryAutomat → categoryAutomat (nested tree hierarchy)", label=" nested tree hierarchy ", weight=3];
artikelAutomat:p_art_set:ne -> artikelAutomat:in0:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="artikelAutomat → artikelAutomat (variants &amp; parent SKU)", label=" variants &amp; parent SKU ", weight=3];
chatAutomat:p_chat_msg:nw -> chatAutomat:in1:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="chatAutomat → chatAutomat (stream delta appends)", label=" stream delta appends ", weight=3];
}