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=<
authAutomat Always-On Session & Multi-Tenant Gateway |
| STATE | hasAuth: boolean | Authenticated session bit |
|
| STATE | hasCompany: boolean | hasAuth && selectedCompanyId |
|
| STATE | user: AuthUser | Current user & company |
|
| STATE | status | 'anon' | 'authed' | 'loading' |
|
| ACTION | bootstrapSession() | Restore or fetch session |
|
| ACTION | switchCompany(id) | Multi-tenant switch |
|
| ACTION | logout() | Clear session cookie |
|
| SELECT | selectHasAuth() / selectHasCompany() | Auth & tenant gates |
|
| API | GET /api/auth/session | Cookie session check |
|
>];
sseAutomat [label=< | | sseAutomat Single Persistent SSE Connection |
|
| STATE | status | 'connected' | 'error' |
|
| STATE | clientId (cid) | Tab-scoped UUID in session |
|
| ACTION | reconnect() | Cycle on company switch |
|
| ACTION | on(event, handler) | Register signal listener |
|
| ACTION | watchArticle(sku) | Attach article-<sku> |
|
| SELECT | invalidateArticle(sku) | Silent cache refresh |
|
| SSE | category / articles | Catalog mutation events |
|
| SSE | order / shipment | Fulfillment events |
|
| API | GET /api/events | Persistent stream |
|
>];
}
subgraph cluster_company_basedata {
label="Company & Consolidated Base Data"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
companyAutomat [label=< | | | companyAutomat Consolidated Company & Base Data Hub |
|
| STATE | current: Company | Tax rates, legal & root cat |
|
| STATE | numbers: NumberSeq[] | Document number sequences |
|
| STATE | terminals: Posterminal[] | POS hardware & categories |
|
| STATE | suppliers: Supplier[] | Vendors & supplier articles |
|
| STATE | units: Unit[] | Allowed SI & sales units |
|
| STATE | viewerPosition / chatDrawerWidth | Persisted user UI settings |
|
| STATE | warehouses: Warehouse[] | Storage locations & stock |
|
| STATE | properties: PropertyName[] | Custom text properties |
|
| STATE | customergroups: Group[] | Pricing discount tiers |
|
| STATE | carriers: Carrier[] | Shipping methods & carriers |
|
| STATE | brands: Brand[] | Catalog brands & logos |
|
| STATE | attributes: AttributeName[] | Attributes & discrete values |
|
| STATE | accounts: Account[] | Bank & payment ledgers |
|
| ACTION | loadAll() / reset() | Fetch or reset all base data |
|
| SELECT | selectCompanyRootCategoryId() | Root category pointer |
|
| API | /api/company, /api/brand, … | 13 consolidated endpoints |
|
>];
}
subgraph cluster_catalog_products {
label="Catalog & Products"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
categoryAutomat [label=< | | | | | | categoryAutomat Hierarchical Category Tree |
|
| STATE | categories: Map | ID -> Category Node Map |
|
| STATE | rootCategoryId | Company root node ID |
|
| STATE | articleCount | Total parent items |
|
| ACTION | loadTree() | Fetch tree & warm views |
|
| ACTION | createCategory() | Insert child node |
|
| ACTION | moveCategory() | Parent reparenting |
|
| ACTION | deleteCategory() | Prune subtree |
|
| SELECT | getCategoryBreadcrumbs() | Hierarchical path trace |
|
| API | GET /api/category | Recursive tree load |
|
>];
categoryViewAutomat [label=< | | categoryViewAutomat KeyedAutomat (Slug Path) |
|
| STATE | views: Map<slug, Data> | Articles & direct children |
|
| ACTION | loadAllCategoryViews() | Prewarm all tree slugs |
|
| ACTION | reloadLoadedCategoryViews() | Refresh cached views |
|
| ACTION | invalidateAllCategoryViews() | Clear on SSE signal |
|
| SELECT | collectLoadedCategoryViewData() | Extract union data |
|
| SELECT | getOrCreateCategoryAutomat() | Per-slug reactive store |
|
| API | GET /api/category/:id/articles | Category article batch |
|
>];
artikelAutomat [label=< | | | | | artikelAutomat In-Memory Article Record Cache |
|
| STATE | articles: Map<sku, Object> | Deduplicated SKU cache |
|
| ACTION | loadArticle(sku) | Fetch or cached promise |
|
| ACTION | reloadArticle(sku) | Silent background sync |
|
| ACTION | setArticleName(sku, name) | Optimistic rename |
|
| ACTION | clearArticle(sku) | Evict SKU from cache |
|
| SELECT | getArticle(sku) | Sync constructor read |
|
| SELECT | createArticleSelector(sku) | Fine-grained selector |
|
| API | GET /api/article/:sku | Full article document |
|
>];
articleDetailAutomat [label=< | articleDetailAutomat KeyedAutomat (SKU) |
|
| STATE | articleHistory: Map<sku> | Change history log |
|
| STATE | articleSupplier: Map<sku> | Assigned supplier list |
|
| ACTION | articleHistoryAutomat.load() | Fetch SKU audit trail |
|
| ACTION | articleSupplierAutomat.load() | Fetch supplier catalog |
|
| API | GET /api/article/:sku/history | Audit change entries |
|
| API | GET /api/article/:sku/supplier | Vendor links & prices |
|
>];
}
subgraph cluster_search_indexing {
label="Search & Indexing"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleIndexAutomat [label=< | | | articleIndexAutomat Derived Client Search Index |
|
| STATE | items: ArticleIndexRecord[] | De-duplicated article union |
|
| STATE | status: 'ready' | Index lifecycle flag |
|
| ACTION | buildArticleIndex() | Derive from category views |
|
| ACTION | setArticleIndexName() | Patch on rename |
|
| ACTION | reload() | Re-derive from views |
|
| SELECT | selectArticleIndexItems() | Fast record projection |
|
| SELECT | ensureLoaded() | Await warm views |
|
>];
articleSearchAutomat [label=< | | articleSearchAutomat In-Memory FlexSearch Engine |
|
| STATE | target: string | Active search query |
|
| STATE | filter: string | Active category filter |
|
| STATE | result: ArticleSearchResult | Facets, recordset, count |
|
| ACTION | search(target, filter) | Synchronous indexed query |
|
| SELECT | selectSearchResult() | Reactive search outcome |
|
>];
}
subgraph cluster_purchasing_logistics {
label="Deliveries & Inbound"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
deliveryAutomat [label=< | | deliveryAutomat Chunk-Paginated Deliveries |
|
| STATE | items: Delivery[] | Company delivery receipts |
|
| STATE | status: 'ready' | List lifecycle state |
|
| ACTION | load() / reload() | Deduplicated fetch & sync |
|
| ACTION | reset() | Clear on session switch |
|
| API | GET /api/delivery | Inbound delivery log |
|
>];
deliveryEditorAutomat [label=< | deliveryEditorAutomat Inbound Receipt & OCR Machine |
|
| STATE | lines: DeliveryLine[] | Uncommitted draft lines |
|
| STATE | deliveryEntity | Selected supplier ID |
|
| STATE | attachments: File[] | Invoice PDFs & OCR results |
|
| STATE | draftCount: number | Uncommitted lines for badge |
|
| ACTION | addLine() / updateLine() | Interactive item editing |
|
| ACTION | commitDelivery() | Persist goods receipt |
|
| SELECT | buildSupplierArticlesMap() | Auto-match SKU/EAN |
|
| API | POST /api/delivery | Create goods receipt |
|
>];
}
subgraph cluster_sales_crm {
label="Sales & CRM"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
quoteAutomat [label=< | quoteAutomat Chunk-Paginated Quotes |
|
| STATE | items: Quote[] | Sales quotes / Angebote |
|
| ACTION | load() / reload() | Deduplicated fetch |
|
| ACTION | reset() | Reset on logout |
|
| API | GET /api/quote | Company quote list |
|
>];
orderAutomat [label=< | | | orderAutomat Chunk-Paginated Order Engine |
|
| STATE | items: Order[] | Sales orders & lines |
|
| STATE | total: number | Unfiltered order count |
|
| STATE | onlyUnpaid / onlyUndelivered | Fulfillment filters |
|
| ACTION | loadChunk(index) | Chunk size 50 prefetch |
|
| ACTION | reload() | Silent orders re-fetch |
|
| SELECT | selectOrders() / selectTotal() | Filter-applied slice |
|
| API | GET /api/order | Paged order stream |
|
| SSE | order / shipment | Fulfillment mutations |
|
>];
entityAutomat [label=< | | entityAutomat Customer & Partner Directory |
|
| STATE | items: Entity[] | Customers & partners |
|
| ACTION | load() / reload() | Customer directory load |
|
| ACTION | reset() | Reset on session switch |
|
| API | GET /api/entity | Directory records |
|
>];
}
subgraph cluster_ai_workspace {
label="AI Assistant & Workspace"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
chatAutomat [label=< | | | chatAutomat AI Assistant Drawer & SSE |
|
| STATE | isOpen: boolean | Docked chat drawer toggle |
|
| STATE | conversations: [] | Conversation sessions |
|
| STATE | messages: ModelMessage[] | Live message transcript |
|
| STATE | sseStatus: 'connected' | Token streaming stream |
|
| ACTION | sendMessage(text) | Prompt model with tools |
|
| ACTION | answerAskUser() | Interactive tool modal |
|
| SELECT | userEnv / routeTools | Client navigation tool |
|
| API | POST /api/modelconversation | AI conversation session |
|
| SSE | modelconversation/events | Live token stream |
|
>];
vfsAutomat [label=< | | | vfsAutomat Virtual Filesystem Explorer |
|
| STATE | files: VfsFile[] | Company VFS workspace |
|
| STATE | selectedFileName | Current active file |
|
| STATE | fileContent / isDirty | Editor buffer & diff |
|
| ACTION | selectFile() / saveFile() | Applet editor buffer |
|
| ACTION | uploadFiles() / deleteFile() | File manipulations |
|
| API | GET /api/vfs | VFS directory index |
|
| SSE | vfs | VFS mutation signal |
|
>];
}
subgraph cluster_audit_grids {
label="Audit & Virtual Grids"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleHistoryGridAutomat [label=< | articleHistoryGridAutomat createGridAutomat (Article) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/article/history | Infinite audit window |
|
>];
globalHistoryGridAutomat [label=< | globalHistoryGridAutomat createGridAutomat (Global) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/globalhistory | Company global audit |
|
>];
ledgerHistoryGridAutomat [label=< | ledgerHistoryGridAutomat createGridAutomat (Ledger) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/ledger/history | Append-only ledger audit |
|
>];
}
subgraph cluster_system_ui {
label="UI, Navigation & System"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
navigationAutomat [label=< | | navigationAutomat Cross-Section Navigation Memory |
|
| STATE | lastDeliveryPath | Active receipt subpath |
|
| STATE | lastArticleSku | Active SKU selection |
|
| STATE | lastCategorySlug / Path | Active category tree node |
|
| STATE | lastSearchTerm / Path | Preserved search query |
|
| ACTION | setLastDeliveryPath() | Restore on sidebar click |
|
| ACTION | setLastArticleSku() | Restore SKU on section click |
|
| ACTION | clearNavigation() | Reset on company switch |
|
>];
helpAutomat [label=<helpAutomat IndexedDB Contextual Help |
| STATE | enabled: boolean | Interactive help badges |
|
| STATE | activeHelpId: string|null | Active popper ID |
|
| ACTION | toggle() / setEnabled() | Toggle badge mode |
|
| ACTION | openPopper() / closePopper() | Single active popper |
|
| HOOK | persist: true | Survives page reloads |
|
>];
pwaAutomat [label=<pwaAutomat Service Worker & Offline Lifecycle |
| STATE | needRefresh: boolean | New SW release pending |
|
| STATE | offlineReady: boolean | Offline assets cached |
|
| STATE | dialogOpen / updating | Prompt modal state |
|
| ACTION | applyUpdate() | Skip waiting & reload |
|
| ACTION | openDialog() / closeDialog() | Modal controls |
|
>];
Legend [label=<| Automat Graph Legend |
| STATE | Reactive store state property |
| ACTION | State mutation action |
| SELECT | Reactive PureComponent selector |
| API | Backend REST/Fetch endpoint |
| SSE | Inbound Server-Sent Event trigger |
| HOOK | Auth / persistence lifecycle hook |
| in# | Inbound arrival port on Automat header |
| ▪—▶ | Reactive dataflow / upstream trigger |
>];
}
authAutomat:p_auth_hasAuth:e -> sseAutomat:in0:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="authAutomat → sseAutomat (hasAuth -> connect SSE)", label=" hasAuth -> connect SSE ", constraint=false, weight=1];
authAutomat:p_auth_hasCompany:e -> companyAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="authAutomat → companyAutomat (hasCompany -> loadAll())", label=" hasCompany -> 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 & reload)", label=" auth chat & 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-<sku>' sse reload)", label=" 'article-<sku>' 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 & terminals)", label=" rootCategoryId & terminals ", constraint=false, weight=1];
categoryAutomat:p_cat_loadTree:e -> categoryViewAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="categoryAutomat → categoryViewAutomat (attachTree & warm slugs)", label=" attachTree & 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 & pack units)", label=" lookup SKU & 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 & parent SKU)", label=" variants & 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];
}