[{"data":1,"prerenderedAt":2666},["ShallowReactive",2],{"navigation_docs":3,"-docs-guides-observability":968,"-docs-guides-observability-surround":2661},[4,27,63,129,287,311,893,902,950,964],{"title":5,"path":6,"stem":7,"children":8,"order":10,"icon":11},"Overview","\u002Fdocs\u002Foverview","docs\u002F1.overview\u002Findex",[9,12,18,24],{"title":5,"path":6,"stem":7,"order":10,"icon":11},1,"i-lucide-info",{"title":13,"path":14,"stem":15,"order":16,"icon":17},"Getting Started","\u002Fdocs\u002Foverview\u002Fgetting-started","docs\u002F1.overview\u002F2.getting-started",2,"i-lucide-rocket",{"title":19,"path":20,"stem":21,"order":22,"icon":23},"Contributing","\u002Fdocs\u002Foverview\u002Fcontributing","docs\u002F1.overview\u002F3.contributing",3,"i-lucide-heart",{"title":5,"path":25,"stem":26,"order":10},"\u002Fdocs\u002Foverview\u002F_dir","docs\u002F1.overview\u002F_dir",{"title":28,"path":29,"stem":30,"children":31,"page":62},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[32,37,42,47,53,59],{"title":33,"path":34,"stem":35,"order":10,"icon":36},"Events","\u002Fdocs\u002Fconcepts\u002Fevents","docs\u002F2.concepts\u002F1.events","i-lucide-zap",{"title":38,"path":39,"stem":40,"order":16,"icon":41},"Transports","\u002Fdocs\u002Fconcepts\u002Ftransports","docs\u002F2.concepts\u002F2.transports","i-lucide-network",{"title":43,"path":44,"stem":45,"order":22,"icon":46},"Module System","\u002Fdocs\u002Fconcepts\u002Fmodules","docs\u002F2.concepts\u002F3.modules","i-lucide-puzzle",{"title":48,"path":49,"stem":50,"order":51,"icon":52},"Flows","\u002Fdocs\u002Fconcepts\u002Fflows","docs\u002F2.concepts\u002F4.flows",4,"i-lucide-workflow",{"title":54,"path":55,"stem":56,"order":57,"icon":58},"Scheduler","\u002Fdocs\u002Fconcepts\u002Fscheduler","docs\u002F2.concepts\u002F5.scheduler",5,"i-lucide-clock",{"title":28,"path":60,"stem":61,"order":16},"\u002Fdocs\u002Fconcepts\u002F_dir","docs\u002F2.concepts\u002F_dir",false,{"title":64,"path":65,"stem":66,"children":67,"page":62},"Guides","\u002Fdocs\u002Fguides","docs\u002F3.guides",[68,73,77,81,85,89,93,98,104,110,116,122,126],{"title":69,"path":70,"stem":71,"order":10,"icon":72},"Creating a Go App","\u002Fdocs\u002Fguides\u002Fcreating-go-app","docs\u002F3.guides\u002F1.creating-go-app","i-lucide-terminal",{"title":74,"path":75,"stem":76},"E2E tests & demo videos","\u002Fdocs\u002Fguides\u002Fe2e-and-demo-videos","docs\u002F3.guides\u002F10.e2e-and-demo-videos",{"title":78,"path":79,"stem":80,"icon":17},"Deploying to production","\u002Fdocs\u002Fguides\u002Fdeploying-to-production","docs\u002F3.guides\u002F11.deploying-to-production",{"title":82,"path":83,"stem":84,"order":16,"icon":46},"Creating a Go Module","\u002Fdocs\u002Fguides\u002Fcreating-go-module","docs\u002F3.guides\u002F2.creating-go-module",{"title":86,"path":87,"stem":88,"order":22,"icon":36},"Adding Events","\u002Fdocs\u002Fguides\u002Fadding-events-to-go-module","docs\u002F3.guides\u002F3.adding-events-to-go-module",{"title":90,"path":91,"stem":92,"order":51,"icon":52},"FlowDSL to Service","\u002Fdocs\u002Fguides\u002Fflowdsl-to-redelay","docs\u002F3.guides\u002F4.flowdsl-to-redelay",{"title":94,"path":95,"stem":96,"order":57,"icon":97},"Choosing a Transport","\u002Fdocs\u002Fguides\u002Fchoosing-a-transport","docs\u002F3.guides\u002F5.choosing-a-transport","i-lucide-git-branch",{"title":99,"path":100,"stem":101,"order":102,"icon":103},"Module Browser (\u002Fmodules)","\u002Fdocs\u002Fguides\u002Fmodules-browser","docs\u002F3.guides\u002F6.modules-browser",6,"i-lucide-layout-dashboard",{"title":105,"path":106,"stem":107,"order":108,"icon":109},"Running Flows","\u002Fdocs\u002Fguides\u002Frunning-flows","docs\u002F3.guides\u002F7.running-flows",7,"i-lucide-play-circle",{"title":111,"path":112,"stem":113,"order":114,"icon":115},"Trace + Live Observability","\u002Fdocs\u002Fguides\u002Fobservability","docs\u002F3.guides\u002F8.observability",8,"i-lucide-activity",{"title":117,"path":118,"stem":119,"order":120,"icon":121},"Project AI Assistant","\u002Fdocs\u002Fguides\u002Fai-assistant","docs\u002F3.guides\u002F9.ai-assistant",9,"i-lucide-sparkles",{"title":123,"path":124,"stem":125},"Debug taps — trace live data through any node","\u002Fdocs\u002Fguides\u002Fdebug-taps","docs\u002F3.guides\u002F9.debug-taps",{"title":64,"path":127,"stem":128,"order":22},"\u002Fdocs\u002Fguides\u002F_dir","docs\u002F3.guides\u002F_dir",{"title":130,"path":131,"stem":132,"children":133,"page":62},"Reference","\u002Fdocs\u002Freference","docs\u002F4.reference",[134,139,143,148,153,158,163,168,172,177,182,187,193,199,205,210,215,219,225,230,236,242,247,253,259,263,267,273,278,284],{"title":135,"path":136,"stem":137,"order":10,"icon":138},"Go Framework","\u002Fdocs\u002Freference\u002Fgo-framework","docs\u002F4.reference\u002F01.go-framework","i-simple-icons-go",{"title":140,"path":141,"stem":142,"order":16,"icon":46},"Built-in Modules","\u002Fdocs\u002Freference\u002Fgo-modules","docs\u002F4.reference\u002F02.go-modules",{"title":144,"path":145,"stem":146,"order":22,"icon":147},"Domain Addon Modules","\u002Fdocs\u002Freference\u002Fgo-modules-addons","docs\u002F4.reference\u002F03.go-modules-addons","i-lucide-blocks",{"title":149,"path":150,"stem":151,"order":51,"icon":152},"Go Events","\u002Fdocs\u002Freference\u002Fgo-events","docs\u002F4.reference\u002F04.go-events","i-lucide-radio",{"title":154,"path":155,"stem":156,"order":57,"icon":157},"Email Module","\u002Fdocs\u002Freference\u002Fgo-module-email","docs\u002F4.reference\u002F05.go-module-email","i-lucide-mail",{"title":159,"path":160,"stem":161,"order":102,"icon":162},"Go Core & IR","\u002Fdocs\u002Freference\u002Fgo-core","docs\u002F4.reference\u002F06.go-core","i-lucide-cpu",{"title":164,"path":165,"stem":166,"order":108,"icon":167},"Module Definition Files","\u002Fdocs\u002Freference\u002Fgo-module-files","docs\u002F4.reference\u002F07.go-module-files","i-lucide-file-code",{"title":169,"path":170,"stem":171,"order":114,"icon":72},"CLI Reference","\u002Fdocs\u002Freference\u002Fgo-cli","docs\u002F4.reference\u002F08.go-cli",{"title":173,"path":174,"stem":175,"order":120,"icon":176},"Go Formats","\u002Fdocs\u002Freference\u002Fgo-formats","docs\u002F4.reference\u002F09.go-formats","i-lucide-file-json",{"title":178,"path":179,"stem":180,"order":181,"icon":152},"AsyncAPI Module","\u002Fdocs\u002Freference\u002Fgo-asyncapi","docs\u002F4.reference\u002F10.go-asyncapi",10,{"title":183,"path":184,"stem":185,"order":186,"icon":52},"Go FlowDSL","\u002Fdocs\u002Freference\u002Fgo-flowdsl","docs\u002F4.reference\u002F11.go-flowdsl",11,{"title":188,"path":189,"stem":190,"order":191,"icon":192},"FlowDSL Examples","\u002Fdocs\u002Freference\u002Fflowdsl-examples","docs\u002F4.reference\u002F12.flowdsl-examples",12,"i-lucide-file-code-2",{"title":194,"path":195,"stem":196,"order":197,"icon":198},"FlowDSL Sync","\u002Fdocs\u002Freference\u002Fflowdsl-sync","docs\u002F4.reference\u002F13.flowdsl-sync",13,"i-lucide-refresh-cw",{"title":200,"path":201,"stem":202,"order":203,"icon":204},"Node.js Framework","\u002Fdocs\u002Freference\u002Fjs-framework","docs\u002F4.reference\u002F14.js-framework",14,"i-simple-icons-nodedotjs",{"title":206,"path":207,"stem":208,"order":203,"icon":209},"Python Framework","\u002Fdocs\u002Freference\u002Fpy-framework","docs\u002F4.reference\u002F14.py-framework","i-simple-icons-python",{"title":211,"path":212,"stem":213,"order":214,"icon":204},"Node.js Events","\u002Fdocs\u002Freference\u002Fjs-events","docs\u002F4.reference\u002F15.js-events",15,{"title":216,"path":217,"stem":218,"order":214,"icon":209},"Python Events","\u002Fdocs\u002Freference\u002Fpy-events","docs\u002F4.reference\u002F15.py-events",{"title":220,"path":221,"stem":222,"order":223,"icon":224},"go-ai — LLM Providers, Guard, Ledger","\u002Fdocs\u002Freference\u002Fgo-ai","docs\u002F4.reference\u002F16.go-ai",16,"i-lucide-brain-circuit",{"title":226,"path":227,"stem":228,"order":229,"icon":41},"Infrastructure Modules","\u002Fdocs\u002Freference\u002Fgeneric-infra-modules","docs\u002F4.reference\u002F17.generic-infra-modules",17,{"title":231,"path":232,"stem":233,"order":234,"icon":235},"Flow Templates","\u002Fdocs\u002Freference\u002Fflow-templates","docs\u002F4.reference\u002F18.flow-templates",18,"i-lucide-library-big",{"title":237,"path":238,"stem":239,"order":240,"icon":241},"Assistant (chat + handoff)","\u002Fdocs\u002Freference\u002Fassistant","docs\u002F4.reference\u002F19.assistant",19,"i-lucide-messages-square",{"title":243,"path":244,"stem":245,"order":246,"icon":41},"Coordination","\u002Fdocs\u002Freference\u002Fcoordination","docs\u002F4.reference\u002F20.coordination",20,{"title":248,"path":249,"stem":250,"order":251,"icon":252},"Search (vector)","\u002Fdocs\u002Freference\u002Fsearch","docs\u002F4.reference\u002F21.search",21,"i-lucide-search",{"title":254,"path":255,"stem":256,"order":257,"icon":258},"Profiles","\u002Fdocs\u002Freference\u002Fprofiles","docs\u002F4.reference\u002F22.profiles",22,"i-lucide-bookmark",{"title":260,"path":261,"stem":262},"Flow-driven HTTP endpoints","\u002Fdocs\u002Freference\u002Fflow-driven-endpoints","docs\u002F4.reference\u002F23.flow-driven-endpoints",{"title":264,"path":265,"stem":266},"Deployments","\u002Fdocs\u002Freference\u002Fdeployments","docs\u002F4.reference\u002F24.deployments",{"title":268,"path":269,"stem":270,"order":271,"icon":272},"i18n (translations)","\u002Fdocs\u002Freference\u002Fi18n","docs\u002F4.reference\u002F25.i18n",25,"i-lucide-languages",{"title":274,"path":275,"stem":276,"order":277,"icon":152},"WebSockets","\u002Fdocs\u002Freference\u002Fwebsockets","docs\u002F4.reference\u002F26.websockets",26,{"title":279,"path":280,"stem":281,"order":282,"icon":283},"Localized content","\u002Fdocs\u002Freference\u002Flocalized-content","docs\u002F4.reference\u002F27.localized-content",27,"i-lucide-file-text",{"title":130,"path":285,"stem":286,"order":51},"\u002Fdocs\u002Freference\u002F_dir","docs\u002F4.reference\u002F_dir",{"title":288,"path":289,"stem":290,"children":291,"page":62},"Integrations","\u002Fdocs\u002Fintegrations","docs\u002F5.integrations",[292,296,300,304,308],{"title":293,"path":294,"stem":295,"order":10,"icon":52},"FlowDSL","\u002Fdocs\u002Fintegrations\u002Fflowdsl","docs\u002F5.integrations\u002F1.flowdsl",{"title":297,"path":298,"stem":299,"order":16,"icon":283},"OpenAPI","\u002Fdocs\u002Fintegrations\u002Fopenapi","docs\u002F5.integrations\u002F2.openapi",{"title":301,"path":302,"stem":303,"order":22,"icon":152},"AsyncAPI","\u002Fdocs\u002Fintegrations\u002Fasyncapi","docs\u002F5.integrations\u002F3.asyncapi",{"title":305,"path":306,"stem":307},"MCP Integration","\u002Fdocs\u002Fintegrations\u002Fmcp","docs\u002F5.integrations\u002F4.mcp",{"title":288,"path":309,"stem":310,"order":57},"\u002Fdocs\u002Fintegrations\u002F_dir","docs\u002F5.integrations\u002F_dir",{"title":312,"path":313,"stem":314,"children":315},"FlowDSL Node Catalog","\u002Fdocs\u002Fnodes","docs\u002F5.nodes\u002Findex",[316,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417,421,425,429,433,437,441,445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749,753,757,761,765,769,773,777,781,785,789,793,797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865,869,873,877,881,885,889],{"title":312,"path":313,"stem":314},{"title":318,"path":319,"stem":320,"order":57},"Node Catalog","\u002Fdocs\u002Fnodes\u002F_dir","docs\u002F5.nodes\u002F_dir",{"title":322,"path":323,"stem":324},"Record Alert","\u002Fdocs\u002Fnodes\u002Falerts_record","docs\u002F5.nodes\u002Falerts_record",{"title":326,"path":327,"stem":328},"Log to API Log","\u002Fdocs\u002Fnodes\u002Fapilog_record","docs\u002F5.nodes\u002Fapilog_record",{"title":330,"path":331,"stem":332},"ClickHouse Exec","\u002Fdocs\u002Fnodes\u002Fclickhouse_exec","docs\u002F5.nodes\u002Fclickhouse_exec",{"title":334,"path":335,"stem":336},"ClickHouse Insert","\u002Fdocs\u002Fnodes\u002Fclickhouse_insert","docs\u002F5.nodes\u002Fclickhouse_insert",{"title":338,"path":339,"stem":340},"ClickHouse Query","\u002Fdocs\u002Fnodes\u002Fclickhouse_query","docs\u002F5.nodes\u002Fclickhouse_query",{"title":342,"path":343,"stem":344},"Array Op","\u002Fdocs\u002Fnodes\u002Fcore_array-ops","docs\u002F5.nodes\u002Fcore_array-ops",{"title":346,"path":347,"stem":348},"Assert","\u002Fdocs\u002Fnodes\u002Fcore_assert","docs\u002F5.nodes\u002Fcore_assert",{"title":350,"path":351,"stem":352},"Audit Emit","\u002Fdocs\u002Fnodes\u002Fcore_audit-emit","docs\u002F5.nodes\u002Fcore_audit-emit",{"title":354,"path":355,"stem":356},"Catch","\u002Fdocs\u002Fnodes\u002Fcore_catch","docs\u002F5.nodes\u002Fcore_catch",{"title":358,"path":359,"stem":360},"DateTime","\u002Fdocs\u002Fnodes\u002Fcore_datetime","docs\u002F5.nodes\u002Fcore_datetime",{"title":362,"path":363,"stem":364},"Dead Letter","\u002Fdocs\u002Fnodes\u002Fcore_dead-letter","docs\u002F5.nodes\u002Fcore_dead-letter",{"title":366,"path":367,"stem":368},"Delay","\u002Fdocs\u002Fnodes\u002Fcore_delay","docs\u002F5.nodes\u002Fcore_delay",{"title":370,"path":371,"stem":372},"ForEach","\u002Fdocs\u002Fnodes\u002Fcore_foreach","docs\u002F5.nodes\u002Fcore_foreach",{"title":374,"path":375,"stem":376},"Idempotency Key","\u002Fdocs\u002Fnodes\u002Fcore_idempotency-key","docs\u002F5.nodes\u002Fcore_idempotency-key",{"title":378,"path":379,"stem":380},"If","\u002Fdocs\u002Fnodes\u002Fcore_if","docs\u002F5.nodes\u002Fcore_if",{"title":382,"path":383,"stem":384},"Inspect","\u002Fdocs\u002Fnodes\u002Fcore_inspect","docs\u002F5.nodes\u002Fcore_inspect",{"title":386,"path":387,"stem":388},"JSON Merge","\u002Fdocs\u002Fnodes\u002Fcore_json-merge","docs\u002F5.nodes\u002Fcore_json-merge",{"title":390,"path":391,"stem":392},"JSON Schema Validate","\u002Fdocs\u002Fnodes\u002Fcore_json-schema-validate","docs\u002F5.nodes\u002Fcore_json-schema-validate",{"title":394,"path":395,"stem":396},"JSONPath Extract","\u002Fdocs\u002Fnodes\u002Fcore_jsonpath-extract","docs\u002F5.nodes\u002Fcore_jsonpath-extract",{"title":398,"path":399,"stem":400},"Log","\u002Fdocs\u002Fnodes\u002Fcore_log","docs\u002F5.nodes\u002Fcore_log",{"title":402,"path":403,"stem":404},"Math","\u002Fdocs\u002Fnodes\u002Fcore_math","docs\u002F5.nodes\u002Fcore_math",{"title":406,"path":407,"stem":408},"Merge","\u002Fdocs\u002Fnodes\u002Fcore_merge","docs\u002F5.nodes\u002Fcore_merge",{"title":410,"path":411,"stem":412},"Metric Counter","\u002Fdocs\u002Fnodes\u002Fcore_metric-counter","docs\u002F5.nodes\u002Fcore_metric-counter",{"title":414,"path":415,"stem":416},"Metric Gauge","\u002Fdocs\u002Fnodes\u002Fcore_metric-gauge","docs\u002F5.nodes\u002Fcore_metric-gauge",{"title":418,"path":419,"stem":420},"Mock","\u002Fdocs\u002Fnodes\u002Fcore_mock","docs\u002F5.nodes\u002Fcore_mock",{"title":422,"path":423,"stem":424},"No-op","\u002Fdocs\u002Fnodes\u002Fcore_noop","docs\u002F5.nodes\u002Fcore_noop",{"title":426,"path":427,"stem":428},"Object Omit","\u002Fdocs\u002Fnodes\u002Fcore_object-omit","docs\u002F5.nodes\u002Fcore_object-omit",{"title":430,"path":431,"stem":432},"Object Pick","\u002Fdocs\u002Fnodes\u002Fcore_object-pick","docs\u002F5.nodes\u002Fcore_object-pick",{"title":434,"path":435,"stem":436},"Parallel Fan-Out","\u002Fdocs\u002Fnodes\u002Fcore_parallel","docs\u002F5.nodes\u002Fcore_parallel",{"title":438,"path":439,"stem":440},"Raise","\u002Fdocs\u002Fnodes\u002Fcore_raise","docs\u002F5.nodes\u002Fcore_raise",{"title":442,"path":443,"stem":444},"Rate Limit Check","\u002Fdocs\u002Fnodes\u002Fcore_rate-limit-check","docs\u002F5.nodes\u002Fcore_rate-limit-check",{"title":446,"path":447,"stem":448},"Regex Extract","\u002Fdocs\u002Fnodes\u002Fcore_regex-extract","docs\u002F5.nodes\u002Fcore_regex-extract",{"title":450,"path":451,"stem":452},"Require Fields","\u002Fdocs\u002Fnodes\u002Fcore_require-fields","docs\u002F5.nodes\u002Fcore_require-fields",{"title":454,"path":455,"stem":456},"Rethrow","\u002Fdocs\u002Fnodes\u002Fcore_rethrow","docs\u002F5.nodes\u002Fcore_rethrow",{"title":458,"path":459,"stem":460},"Return","\u002Fdocs\u002Fnodes\u002Fcore_return","docs\u002F5.nodes\u002Fcore_return",{"title":462,"path":463,"stem":464},"HMAC Signature Verify","\u002Fdocs\u002Fnodes\u002Fcore_signature-verify","docs\u002F5.nodes\u002Fcore_signature-verify",{"title":466,"path":467,"stem":468},"String Op","\u002Fdocs\u002Fnodes\u002Fcore_string-ops","docs\u002F5.nodes\u002Fcore_string-ops",{"title":470,"path":471,"stem":472},"Subflow Invoke","\u002Fdocs\u002Fnodes\u002Fcore_subflow-invoke","docs\u002F5.nodes\u002Fcore_subflow-invoke",{"title":474,"path":475,"stem":476},"Switch","\u002Fdocs\u002Fnodes\u002Fcore_switch","docs\u002F5.nodes\u002Fcore_switch",{"title":478,"path":479,"stem":480},"Template Render","\u002Fdocs\u002Fnodes\u002Fcore_template-render","docs\u002F5.nodes\u002Fcore_template-render",{"title":482,"path":483,"stem":484},"Throttle","\u002Fdocs\u002Fnodes\u002Fcore_throttle","docs\u002F5.nodes\u002Fcore_throttle",{"title":486,"path":487,"stem":488},"Timeout","\u002Fdocs\u002Fnodes\u002Fcore_timeout","docs\u002F5.nodes\u002Fcore_timeout",{"title":490,"path":491,"stem":492},"Type Cast","\u002Fdocs\u002Fnodes\u002Fcore_type-cast","docs\u002F5.nodes\u002Fcore_type-cast",{"title":494,"path":495,"stem":496},"Webhook Respond","\u002Fdocs\u002Fnodes\u002Fcore_webhook-respond","docs\u002F5.nodes\u002Fcore_webhook-respond",{"title":498,"path":499,"stem":500},"File Delete","\u002Fdocs\u002Fnodes\u002Ffilesys_delete","docs\u002F5.nodes\u002Ffilesys_delete",{"title":502,"path":503,"stem":504},"Directory List","\u002Fdocs\u002Fnodes\u002Ffilesys_list","docs\u002F5.nodes\u002Ffilesys_list",{"title":506,"path":507,"stem":508},"File Read","\u002Fdocs\u002Fnodes\u002Ffilesys_read","docs\u002F5.nodes\u002Ffilesys_read",{"title":510,"path":511,"stem":512},"File Stat","\u002Fdocs\u002Fnodes\u002Ffilesys_stat","docs\u002F5.nodes\u002Ffilesys_stat",{"title":514,"path":515,"stem":516},"File Write","\u002Fdocs\u002Fnodes\u002Ffilesys_write","docs\u002F5.nodes\u002Ffilesys_write",{"title":518,"path":519,"stem":520},"FTP Delete","\u002Fdocs\u002Fnodes\u002Fftp_delete","docs\u002F5.nodes\u002Fftp_delete",{"title":522,"path":523,"stem":524},"FTP Download","\u002Fdocs\u002Fnodes\u002Fftp_download","docs\u002F5.nodes\u002Fftp_download",{"title":526,"path":527,"stem":528},"FTP List","\u002Fdocs\u002Fnodes\u002Fftp_list","docs\u002F5.nodes\u002Fftp_list",{"title":530,"path":531,"stem":532},"FTP Upload","\u002Fdocs\u002Fnodes\u002Fftp_upload","docs\u002F5.nodes\u002Fftp_upload",{"title":534,"path":535,"stem":536},"HTTP DELETE","\u002Fdocs\u002Fnodes\u002Fhttp_delete","docs\u002F5.nodes\u002Fhttp_delete",{"title":538,"path":539,"stem":540},"HTTP GET","\u002Fdocs\u002Fnodes\u002Fhttp_get","docs\u002F5.nodes\u002Fhttp_get",{"title":542,"path":543,"stem":544},"HTTP POST","\u002Fdocs\u002Fnodes\u002Fhttp_post","docs\u002F5.nodes\u002Fhttp_post",{"title":546,"path":547,"stem":548},"HTTP PUT","\u002Fdocs\u002Fnodes\u002Fhttp_put","docs\u002F5.nodes\u002Fhttp_put",{"title":550,"path":551,"stem":552},"HTTP Request","\u002Fdocs\u002Fnodes\u002Fhttp_request","docs\u002F5.nodes\u002Fhttp_request",{"title":554,"path":555,"stem":556},"Fill Translations","\u002Fdocs\u002Fnodes\u002Fi18n_fill-translations","docs\u002F5.nodes\u002Fi18n_fill-translations",{"title":558,"path":559,"stem":560},"Resolve Locale","\u002Fdocs\u002Fnodes\u002Fi18n_resolve-locale","docs\u002F5.nodes\u002Fi18n_resolve-locale",{"title":562,"path":563,"stem":564},"Translate","\u002Fdocs\u002Fnodes\u002Fi18n_translate","docs\u002F5.nodes\u002Fi18n_translate",{"title":566,"path":567,"stem":568},"Mongo AGGREGATE","\u002Fdocs\u002Fnodes\u002Fmongoops_aggregate","docs\u002F5.nodes\u002Fmongoops_aggregate",{"title":570,"path":571,"stem":572},"Mongo DELETE","\u002Fdocs\u002Fnodes\u002Fmongoops_delete","docs\u002F5.nodes\u002Fmongoops_delete",{"title":574,"path":575,"stem":576},"Mongo FIND","\u002Fdocs\u002Fnodes\u002Fmongoops_find","docs\u002F5.nodes\u002Fmongoops_find",{"title":578,"path":579,"stem":580},"Mongo FIND ONE","\u002Fdocs\u002Fnodes\u002Fmongoops_find-one","docs\u002F5.nodes\u002Fmongoops_find-one",{"title":582,"path":583,"stem":584},"Mongo INSERT","\u002Fdocs\u002Fnodes\u002Fmongoops_insert","docs\u002F5.nodes\u002Fmongoops_insert",{"title":586,"path":587,"stem":588},"Mongo UPDATE","\u002Fdocs\u002Fnodes\u002Fmongoops_update","docs\u002F5.nodes\u002Fmongoops_update",{"title":590,"path":591,"stem":592},"Postgres COPY FROM","\u002Fdocs\u002Fnodes\u002Fpostgres_copy-from","docs\u002F5.nodes\u002Fpostgres_copy-from",{"title":594,"path":595,"stem":596},"Postgres Exec","\u002Fdocs\u002Fnodes\u002Fpostgres_exec","docs\u002F5.nodes\u002Fpostgres_exec",{"title":598,"path":599,"stem":600},"Postgres Query","\u002Fdocs\u002Fnodes\u002Fpostgres_query","docs\u002F5.nodes\u002Fpostgres_query",{"title":602,"path":603,"stem":604},"Postgres Transaction","\u002Fdocs\u002Fnodes\u002Fpostgres_transaction","docs\u002F5.nodes\u002Fpostgres_transaction",{"title":606,"path":607,"stem":608},"RabbitMQ Consume","\u002Fdocs\u002Fnodes\u002Frabbitmq_consume","docs\u002F5.nodes\u002Frabbitmq_consume",{"title":610,"path":611,"stem":612},"RabbitMQ Declare","\u002Fdocs\u002Fnodes\u002Frabbitmq_declare","docs\u002F5.nodes\u002Frabbitmq_declare",{"title":614,"path":615,"stem":616},"RabbitMQ Publish","\u002Fdocs\u002Fnodes\u002Frabbitmq_publish","docs\u002F5.nodes\u002Frabbitmq_publish",{"title":618,"path":619,"stem":620},"Auth Login","\u002Fdocs\u002Fnodes\u002Fredelay_auth-login","docs\u002F5.nodes\u002Fredelay_auth-login",{"title":622,"path":623,"stem":624},"Require Permission","\u002Fdocs\u002Fnodes\u002Fredelay_auth-require-permission","docs\u002F5.nodes\u002Fredelay_auth-require-permission",{"title":626,"path":627,"stem":628},"Validate Token","\u002Fdocs\u002Fnodes\u002Fredelay_auth-validate-token","docs\u002F5.nodes\u002Fredelay_auth-validate-token",{"title":630,"path":631,"stem":632},"Render Email Template","\u002Fdocs\u002Fnodes\u002Fredelay_email-render-template","docs\u002F5.nodes\u002Fredelay_email-render-template",{"title":634,"path":635,"stem":636},"Send Email","\u002Fdocs\u002Fnodes\u002Fredelay_email-send","docs\u002F5.nodes\u002Fredelay_email-send",{"title":638,"path":639,"stem":640},"Send Templated Email","\u002Fdocs\u002Fnodes\u002Fredelay_email-send-templated","docs\u002F5.nodes\u002Fredelay_email-send-templated",{"title":642,"path":643,"stem":644},"Event Source","\u002Fdocs\u002Fnodes\u002Fredelay_event-source","docs\u002F5.nodes\u002Fredelay_event-source",{"title":646,"path":647,"stem":648},"Create Group","\u002Fdocs\u002Fnodes\u002Fredelay_groups-create-group","docs\u002F5.nodes\u002Fredelay_groups-create-group",{"title":650,"path":651,"stem":652},"Delete Group","\u002Fdocs\u002Fnodes\u002Fredelay_groups-delete-group","docs\u002F5.nodes\u002Fredelay_groups-delete-group",{"title":654,"path":655,"stem":656},"Resolve Permissions","\u002Fdocs\u002Fnodes\u002Fredelay_groups-resolve-permissions","docs\u002F5.nodes\u002Fredelay_groups-resolve-permissions",{"title":658,"path":659,"stem":660},"Update Group","\u002Fdocs\u002Fnodes\u002Fredelay_groups-update-group","docs\u002F5.nodes\u002Fredelay_groups-update-group",{"title":662,"path":663,"stem":664},"HTTP Endpoint","\u002Fdocs\u002Fnodes\u002Fredelay_http-endpoint","docs\u002F5.nodes\u002Fredelay_http-endpoint",{"title":666,"path":667,"stem":668},"JSON Stream Source","\u002Fdocs\u002Fnodes\u002Fredelay_json-stream-source","docs\u002F5.nodes\u002Fredelay_json-stream-source",{"title":670,"path":671,"stem":672},"JSON → Event","\u002Fdocs\u002Fnodes\u002Fredelay_json-to-event","docs\u002F5.nodes\u002Fredelay_json-to-event",{"title":674,"path":675,"stem":676},"Kafka Produce","\u002Fdocs\u002Fnodes\u002Fredelay_kafka-produce","docs\u002F5.nodes\u002Fredelay_kafka-produce",{"title":678,"path":679,"stem":680},"Create Short Link","\u002Fdocs\u002Fnodes\u002Fredelay_links-create","docs\u002F5.nodes\u002Fredelay_links-create",{"title":682,"path":683,"stem":684},"Delete Short Link","\u002Fdocs\u002Fnodes\u002Fredelay_links-delete","docs\u002F5.nodes\u002Fredelay_links-delete",{"title":686,"path":687,"stem":688},"Resolve Short Link","\u002Fdocs\u002Fnodes\u002Fredelay_links-resolve","docs\u002F5.nodes\u002Fredelay_links-resolve",{"title":690,"path":691,"stem":692},"LLM Chat","\u002Fdocs\u002Fnodes\u002Fredelay_llm-chat","docs\u002F5.nodes\u002Fredelay_llm-chat",{"title":694,"path":695,"stem":696},"LLM Embed","\u002Fdocs\u002Fnodes\u002Fredelay_llm-embed","docs\u002F5.nodes\u002Fredelay_llm-embed",{"title":698,"path":699,"stem":700},"LLM Guard","\u002Fdocs\u002Fnodes\u002Fredelay_llm-guard","docs\u002F5.nodes\u002Fredelay_llm-guard",{"title":702,"path":703,"stem":704},"LLM Tool Router","\u002Fdocs\u002Fnodes\u002Fredelay_llm-tool-router","docs\u002F5.nodes\u002Fredelay_llm-tool-router",{"title":706,"path":707,"stem":708},"NATS Publish","\u002Fdocs\u002Fnodes\u002Fredelay_nats-publish","docs\u002F5.nodes\u002Fredelay_nats-publish",{"title":710,"path":711,"stem":712},"Mark Notification Read","\u002Fdocs\u002Fnodes\u002Fredelay_notifications-mark-read","docs\u002F5.nodes\u002Fredelay_notifications-mark-read",{"title":714,"path":715,"stem":716},"Send Notification","\u002Fdocs\u002Fnodes\u002Fredelay_notifications-send","docs\u002F5.nodes\u002Fredelay_notifications-send",{"title":718,"path":719,"stem":720},"Redis Stream XADD","\u002Fdocs\u002Fnodes\u002Fredelay_redis-stream-publish","docs\u002F5.nodes\u002Fredelay_redis-stream-publish",{"title":722,"path":723,"stem":724},"S3 Copy Object","\u002Fdocs\u002Fnodes\u002Fredelay_s3-copy-object","docs\u002F5.nodes\u002Fredelay_s3-copy-object",{"title":726,"path":727,"stem":728},"S3 Delete Many","\u002Fdocs\u002Fnodes\u002Fredelay_s3-delete-many","docs\u002F5.nodes\u002Fredelay_s3-delete-many",{"title":730,"path":731,"stem":732},"S3 Head Object","\u002Fdocs\u002Fnodes\u002Fredelay_s3-head-object","docs\u002F5.nodes\u002Fredelay_s3-head-object",{"title":734,"path":735,"stem":736},"S3 List Objects","\u002Fdocs\u002Fnodes\u002Fredelay_s3-list-objects","docs\u002F5.nodes\u002Fredelay_s3-list-objects",{"title":738,"path":739,"stem":740},"Create Schedule","\u002Fdocs\u002Fnodes\u002Fredelay_scheduler-create-schedule","docs\u002F5.nodes\u002Fredelay_scheduler-create-schedule",{"title":742,"path":743,"stem":744},"Cron Trigger","\u002Fdocs\u002Fnodes\u002Fredelay_scheduler-cron-trigger","docs\u002F5.nodes\u002Fredelay_scheduler-cron-trigger",{"title":746,"path":747,"stem":748},"Delete Schedule","\u002Fdocs\u002Fnodes\u002Fredelay_scheduler-delete-schedule","docs\u002F5.nodes\u002Fredelay_scheduler-delete-schedule",{"title":750,"path":751,"stem":752},"Interval Trigger","\u002Fdocs\u002Fnodes\u002Fredelay_scheduler-interval-trigger","docs\u002F5.nodes\u002Fredelay_scheduler-interval-trigger",{"title":754,"path":755,"stem":756},"Search Query","\u002Fdocs\u002Fnodes\u002Fredelay_search-query","docs\u002F5.nodes\u002Fredelay_search-query",{"title":758,"path":759,"stem":760},"Search Upsert","\u002Fdocs\u002Fnodes\u002Fredelay_search-upsert","docs\u002F5.nodes\u002Fredelay_search-upsert",{"title":762,"path":763,"stem":764},"Delete Setting","\u002Fdocs\u002Fnodes\u002Fredelay_settings-delete","docs\u002F5.nodes\u002Fredelay_settings-delete",{"title":766,"path":767,"stem":768},"Get Setting","\u002Fdocs\u002Fnodes\u002Fredelay_settings-get","docs\u002F5.nodes\u002Fredelay_settings-get",{"title":770,"path":771,"stem":772},"Set Setting","\u002Fdocs\u002Fnodes\u002Fredelay_settings-set","docs\u002F5.nodes\u002Fredelay_settings-set",{"title":774,"path":775,"stem":776},"Delete File","\u002Fdocs\u002Fnodes\u002Fredelay_storage-delete","docs\u002F5.nodes\u002Fredelay_storage-delete",{"title":778,"path":779,"stem":780},"Download File","\u002Fdocs\u002Fnodes\u002Fredelay_storage-download","docs\u002F5.nodes\u002Fredelay_storage-download",{"title":782,"path":783,"stem":784},"Generate Presigned URL","\u002Fdocs\u002Fnodes\u002Fredelay_storage-presign-url","docs\u002F5.nodes\u002Fredelay_storage-presign-url",{"title":786,"path":787,"stem":788},"Upload File","\u002Fdocs\u002Fnodes\u002Fredelay_storage-upload","docs\u002F5.nodes\u002Fredelay_storage-upload",{"title":790,"path":791,"stem":792},"Subworkflow","\u002Fdocs\u002Fnodes\u002Fredelay_subworkflow","docs\u002F5.nodes\u002Fredelay_subworkflow",{"title":794,"path":795,"stem":796},"Activate User","\u002Fdocs\u002Fnodes\u002Fredelay_users-activate","docs\u002F5.nodes\u002Fredelay_users-activate",{"title":798,"path":799,"stem":800},"Create Pending User","\u002Fdocs\u002Fnodes\u002Fredelay_users-create-pending","docs\u002F5.nodes\u002Fredelay_users-create-pending",{"title":802,"path":803,"stem":804},"Create User","\u002Fdocs\u002Fnodes\u002Fredelay_users-create-user","docs\u002F5.nodes\u002Fredelay_users-create-user",{"title":806,"path":807,"stem":808},"Delete User","\u002Fdocs\u002Fnodes\u002Fredelay_users-delete-user","docs\u002F5.nodes\u002Fredelay_users-delete-user",{"title":810,"path":811,"stem":812},"Find User By Email","\u002Fdocs\u002Fnodes\u002Fredelay_users-find-by-email","docs\u002F5.nodes\u002Fredelay_users-find-by-email",{"title":814,"path":815,"stem":816},"Get User","\u002Fdocs\u002Fnodes\u002Fredelay_users-get-user","docs\u002F5.nodes\u002Fredelay_users-get-user",{"title":818,"path":819,"stem":820},"List Users","\u002Fdocs\u002Fnodes\u002Fredelay_users-list-users","docs\u002F5.nodes\u002Fredelay_users-list-users",{"title":822,"path":823,"stem":824},"Update User","\u002Fdocs\u002Fnodes\u002Fredelay_users-update-user","docs\u002F5.nodes\u002Fredelay_users-update-user",{"title":826,"path":827,"stem":828},"Request Email Verification (legacy)","\u002Fdocs\u002Fnodes\u002Fredelay_verification-request","docs\u002F5.nodes\u002Fredelay_verification-request",{"title":830,"path":831,"stem":832},"Request Email Verification","\u002Fdocs\u002Fnodes\u002Fredelay_verification-request-email","docs\u002F5.nodes\u002Fredelay_verification-request-email",{"title":834,"path":835,"stem":836},"Request SMS Verification","\u002Fdocs\u002Fnodes\u002Fredelay_verification-request-sms","docs\u002F5.nodes\u002Fredelay_verification-request-sms",{"title":838,"path":839,"stem":840},"Verify Token","\u002Fdocs\u002Fnodes\u002Fredelay_verification-verify","docs\u002F5.nodes\u002Fredelay_verification-verify",{"title":842,"path":843,"stem":844},"Redis DEL","\u002Fdocs\u002Fnodes\u002Fredisops_del","docs\u002F5.nodes\u002Fredisops_del",{"title":846,"path":847,"stem":848},"Redis EXPIRE","\u002Fdocs\u002Fnodes\u002Fredisops_expire","docs\u002F5.nodes\u002Fredisops_expire",{"title":850,"path":851,"stem":852},"Redis GET","\u002Fdocs\u002Fnodes\u002Fredisops_get","docs\u002F5.nodes\u002Fredisops_get",{"title":854,"path":855,"stem":856},"Redis HGET","\u002Fdocs\u002Fnodes\u002Fredisops_hget","docs\u002F5.nodes\u002Fredisops_hget",{"title":858,"path":859,"stem":860},"Redis HSET","\u002Fdocs\u002Fnodes\u002Fredisops_hset","docs\u002F5.nodes\u002Fredisops_hset",{"title":862,"path":863,"stem":864},"Redis INCR","\u002Fdocs\u002Fnodes\u002Fredisops_incr","docs\u002F5.nodes\u002Fredisops_incr",{"title":866,"path":867,"stem":868},"Redis LPOP","\u002Fdocs\u002Fnodes\u002Fredisops_lpop","docs\u002F5.nodes\u002Fredisops_lpop",{"title":870,"path":871,"stem":872},"Redis LPUSH","\u002Fdocs\u002Fnodes\u002Fredisops_lpush","docs\u002F5.nodes\u002Fredisops_lpush",{"title":874,"path":875,"stem":876},"Redis PUBLISH","\u002Fdocs\u002Fnodes\u002Fredisops_publish","docs\u002F5.nodes\u002Fredisops_publish",{"title":878,"path":879,"stem":880},"Redis SET","\u002Fdocs\u002Fnodes\u002Fredisops_set","docs\u002F5.nodes\u002Fredisops_set",{"title":882,"path":883,"stem":884},"SFTP Download","\u002Fdocs\u002Fnodes\u002Fsftp_download","docs\u002F5.nodes\u002Fsftp_download",{"title":886,"path":887,"stem":888},"SFTP Upload","\u002Fdocs\u002Fnodes\u002Fsftp_upload","docs\u002F5.nodes\u002Fsftp_upload",{"title":890,"path":891,"stem":892},"Send SMS","\u002Fdocs\u002Fnodes\u002Fsms_send","docs\u002F5.nodes\u002Fsms_send",{"title":894,"path":895,"stem":896,"children":897,"page":62},"Rfcs","\u002Fdocs\u002Frfcs","docs\u002F6.rfcs",[898],{"title":899,"path":900,"stem":901},"RFC 0001 — Worker Assignment for Flow Deployments","\u002Fdocs\u002Frfcs\u002F0001-worker-assignment","docs\u002F6.rfcs\u002F0001-worker-assignment",{"title":903,"path":904,"stem":905,"children":906,"page":62},"Admin","\u002Fdocs\u002Fadmin","docs\u002F7.admin",[907,912,917,922,927,932,937,941,946],{"title":5,"path":908,"stem":909,"order":910,"icon":911},"\u002Fdocs\u002Fadmin\u002Foverview","docs\u002F7.admin\u002F00.overview",0,"i-lucide-compass",{"title":913,"path":914,"stem":915,"order":10,"icon":916},"Getting started","\u002Fdocs\u002Fadmin\u002Fgetting-started","docs\u002F7.admin\u002F01.getting-started","i-lucide-play",{"title":918,"path":919,"stem":920,"order":16,"icon":921},"Layered architecture","\u002Fdocs\u002Fadmin\u002Flayered-architecture","docs\u002F7.admin\u002F02.layered-architecture","i-lucide-layers",{"title":923,"path":924,"stem":925,"order":22,"icon":926},"Building a custom admin project","\u002Fdocs\u002Fadmin\u002Fbuilding-a-custom-admin-project","docs\u002F7.admin\u002F03.building-a-custom-admin-project","i-lucide-folder-plus",{"title":928,"path":929,"stem":930,"order":51,"icon":931},"Building admin modules","\u002Fdocs\u002Fadmin\u002Fbuilding-admin-modules","docs\u002F7.admin\u002F04.building-admin-modules","i-lucide-package-plus",{"title":933,"path":934,"stem":935,"order":57,"icon":936},"Base module reference","\u002Fdocs\u002Fadmin\u002Freference-base-modules","docs\u002F7.admin\u002F05.reference-base-modules","i-lucide-boxes",{"title":938,"path":939,"stem":940,"order":102,"icon":17},"Deployment","\u002Fdocs\u002Fadmin\u002Fdeployment","docs\u002F7.admin\u002F06.deployment",{"title":942,"path":943,"stem":944,"order":108,"icon":945},"Consuming the base layer (versioned)","\u002Fdocs\u002Fadmin\u002Fconsuming-the-base-layer","docs\u002F7.admin\u002F07.consuming-the-base-layer","i-lucide-package",{"title":947,"path":948,"stem":949,"order":108},"Admin UI","\u002Fdocs\u002Fadmin\u002F_dir","docs\u002F7.admin\u002F_dir",{"title":951,"path":952,"stem":953,"children":954,"page":62},"Services","\u002Fdocs\u002Fservices","docs\u002F8.services",[955,960],{"title":956,"path":957,"stem":958,"order":10,"icon":959},"Custom development & support services","\u002Fdocs\u002Fservices\u002Fcustom-development","docs\u002F8.services\u002F1.custom-development","i-lucide-briefcase",{"title":951,"path":961,"stem":962,"icon":959,"order":963},"\u002Fdocs\u002Fservices\u002F_dir","docs\u002F8.services\u002F_dir",80,{"title":965,"path":966,"stem":967,"order":910},"Dir","\u002Fdocs\u002F_dir","docs\u002F_dir",{"id":969,"title":111,"body":970,"description":2654,"extension":2655,"links":2656,"meta":2657,"navigation":2658,"path":112,"seo":2659,"stem":113,"__hash__":2660},"docs\u002Fdocs\u002F3.guides\u002F8.observability.md",{"type":971,"value":972,"toc":2627},"minimark",[973,977,981,1016,1023,1029,1050,1055,1178,1182,1210,1217,1221,1228,1233,1243,1247,1254,1278,1281,1285,1288,1328,1332,1348,1352,1365,1369,1372,1402,1417,1421,1428,1565,1568,1572,1575,1681,1691,1695,1705,1712,1842,1852,1856,1867,1911,1964,1971,1974,2061,2087,2091,2098,2105,2154,2168,2171,2175,2189,2192,2196,2199,2410,2413,2426,2449,2453,2456,2491,2511,2555,2559,2591,2595,2623],[974,975,111],"h1",{"id":976},"trace-live-observability",[978,979,980],"p",{},"Flow Studio turns your running flow into a live business dashboard.\nEvery published flow ships with two per-flow canvas modes, both free:",[982,983,984,992],"ul",{},[985,986,987,991],"li",{},[988,989,990],"strong",{},"Trace mode"," — pick any single run, scrub through it like a video,\ninspect the exact packet that crossed each edge and the latency of\neach node. One event, one nanosecond-resolution answer.",[985,993,994,997,998,1015],{},[988,995,996],{},"Live mode"," — subscribe to a per-flow metrics frame every second.\nThe canvas heat-maps rate, latency, error rate, or saturation;\npacket dots slide down each edge at a speed proportional to real\ntraffic; a rules engine writes recommendations like ",[999,1000,1001,1002,1006,1007,1010,1011,1014],"em",{},"\"this ",[1003,1004,1005],"code",{},"direct","\nedge is at 800 packets\u002Fs — consider ",[1003,1008,1009],{},"ephemeral"," or ",[1003,1012,1013],{},"stream","\"","\ndirectly onto the canvas.",[978,1017,1018,1019,1022],{},"Neither mode asks you to leave the canvas, context-switch to Grafana,\nor stand up a separate dashboard. The flow graph ",[999,1020,1021],{},"is"," the dashboard.",[978,1024,1025,1026,1028],{},"Two cross-flow views sit above the single-flow canvas, in the admin\nunder ",[988,1027,48],{},":",[982,1030,1031,1041],{},[985,1032,1033,1040],{},[988,1034,1035],{},[1036,1037,1039],"a",{"href":1038},"#lifecycle","Lifecycle"," — the event graph of how all your published\nflows connect (emit → trigger), end to end.",[985,1042,1043,1049],{},[988,1044,1045],{},[1036,1046,1048],{"href":1047},"#alerts","Alerts"," — a durable inbox of every node\u002Frun failure across\nevery flow, captured automatically.",[1051,1052,1054],"h2",{"id":1053},"whats-new-at-a-glance","What's new at a glance",[1056,1057,1058,1074],"table",{},[1059,1060,1061],"thead",{},[1062,1063,1064,1068,1071],"tr",{},[1065,1066,1067],"th",{},"Capability",[1065,1069,1070],{},"Mode",[1065,1072,1073],{},"What you see",[1075,1076,1077,1089,1099,1114,1128,1139,1149,1165],"tbody",{},[1062,1078,1079,1083,1086],{},[1080,1081,1082],"td",{},"Packet dot sliding along an edge in the direction of travel",[1080,1084,1085],{},"both",[1080,1087,1088],{},"Which way traffic moved, how fast",[1062,1090,1091,1094,1096],{},[1080,1092,1093],{},"Per-node heat border + glow ring",[1080,1095,1085],{},[1080,1097,1098],{},"Which node is the bottleneck right now",[1062,1100,1101,1108,1111],{},[1080,1102,1103,1104,1107],{},"Per-node ",[1003,1105,1106],{},"rate · Σtotal · p95 · error"," chip in the header",[1080,1109,1110],{},"live",[1080,1112,1113],{},"Live telemetry + cumulative count without a popup",[1062,1115,1116,1123,1125],{},[1080,1117,1118,1119,1122],{},"Per-edge ",[1003,1120,1121],{},"500\u002Fs · Σ12k · 42ms"," label",[1080,1124,1110],{},[1080,1126,1127],{},"Transport-level throughput + total delivered",[1062,1129,1130,1133,1136],{},[1080,1131,1132],{},"Scrubber (play \u002F pause \u002F 0.25×–4×)",[1080,1134,1135],{},"trace",[1080,1137,1138],{},"Replay any historical run at human speed",[1062,1140,1141,1144,1146],{},[1080,1142,1143],{},"Copy-to-clipboard on every payload",[1080,1145,1135],{},[1080,1147,1148],{},"One-click export of node inputs\u002Foutputs",[1062,1150,1151,1154,1156],{},[1080,1152,1153],{},"Server-computed recommendation cards",[1080,1155,1110],{},[1080,1157,1158,1159,1161,1162,1164],{},"\"Switch ",[1003,1160,1005],{}," → ",[1003,1163,1013],{},"\" with the reason",[1062,1166,1167,1170,1172],{},[1080,1168,1169],{},"SLO violation badges",[1080,1171,1110],{},[1080,1173,1174,1175],{},"When a node breaches ",[1003,1176,1177],{},"p95_latency_ms",[1051,1179,1181],{"id":1180},"prerequisites","Prerequisites",[982,1183,1184,1197,1207],{},[985,1185,1186,1187,1193,1194,1196],{},"A running Redelay app with ",[1036,1188,1190],{"href":1189},"\u002Fdocs\u002Freference\u002Fgo-flowdsl#flowexec",[1003,1191,1192],{},"flowexec","\nwired in (see ",[1036,1195,105],{"href":106},").",[985,1198,1199,1200,1203,1204,1196],{},"Flow Studio reachable at ",[1003,1201,1202],{},"\u002Fflowdsl"," on the admin-api\n(",[1003,1205,1206],{},"FLOWSTUDIO_UI_PATH",[985,1208,1209],{},"At least one published flow with some runs under it.",[978,1211,1212,1213,1216],{},"No new setup — ",[988,1214,1215],{},"both modes are enabled by default"," on any flowexec\ndeployment.",[1051,1218,1220],{"id":1219},"trace-mode-one-run-inspected","Trace mode — one run, inspected",[978,1222,1223,1224,1227],{},"Trace mode is the \"why did this specific run do that?\" tool. Pick a\nrun from the ",[988,1225,1226],{},"Runs"," tab on the left sidebar. The canvas flips to\nTrace mode with the finished run pre-loaded at the final frame.",[1229,1230,1232],"h3",{"id":1231},"anatomy-of-a-traced-run","Anatomy of a traced run",[1234,1235,1240],"pre",{"className":1236,"code":1238,"language":1239},[1237],"language-text"," ┌────────┐        ┌────────┐       ┌────────┐\n │ start  │ ────▶  │  chat  │ ────▶ │  end   │\n │ ✓ 2ms  │  ●●●   │ ✓ 4.0s │  ●●●  │ ✓ 1ms  │\n └────────┘        └────────┘       └────────┘\n      ▲                ▲                ▲\n      └ green border:  │                └ same treatment for terminal\n        node finished  │\n                       └ amber border mid-run, green on completion.\n                         Packet dots (●●●) slide source→target at\n                         a speed derived from real event timestamps.\n","text",[1003,1241,1238],{"__ignoreMap":1242},"",[1229,1244,1246],{"id":1245},"the-scrubber-dock","The scrubber dock",[978,1248,1249,1250,1253],{},"Press ",[988,1251,1252],{},"play"," — the canvas re-animates the run at real time.\nChangeable at the bottom-centre:",[982,1255,1256,1262,1268],{},[985,1257,1258,1261],{},[988,1259,1260],{},"0.25× \u002F 0.5× \u002F 1× \u002F 2× \u002F 4×"," — slow down for presentations or\nspeed up for long runs.",[985,1263,1264,1267],{},[988,1265,1266],{},"Scrub bar"," — drag to any point; earlier nodes un-highlight,\nedges that hadn't fired yet go dark.",[985,1269,1270,1273,1274,1277],{},[988,1271,1272],{},"Elapsed counter"," — ",[1003,1275,1276],{},"0.52 s \u002F 4.03 s"," reads real wall-clock time,\nnot an abstract event index.",[978,1279,1280],{},"The scrubber only appears when you're looking at a historical run —\nlive runs pace themselves off the SSE stream.",[1229,1282,1284],{"id":1283},"the-payload-drawer","The payload drawer",[978,1286,1287],{},"Click any node or any edge:",[982,1289,1290,1314],{},[985,1291,1292,1295,1296,1299,1300,1303,1304,1303,1307,1303,1310,1313],{},[988,1293,1294],{},"Node click"," — right-side drawer opens showing ",[1003,1297,1298],{},"status",",\n",[1003,1301,1302],{},"durationMs",", ",[1003,1305,1306],{},"input",[1003,1308,1309],{},"output",[1003,1311,1312],{},"error",". Inputs and outputs are\npretty-printed JSON with a copy button (flashes a green check for\na second on success).",[985,1315,1316,1319,1320,1323,1324,1327],{},[988,1317,1318],{},"Edge click"," — shows the packet that crossed the edge, its\ntype ref, and the delivery mode it used. The packet body comes\nfrom whichever endpoint actually captured it (source ",[1003,1321,1322],{},"node.done","\noutput, else target ",[1003,1325,1326],{},"node.started"," input) — you never see\n\"not captured\" unless the engine genuinely never materialised\nthe packet.",[1229,1329,1331],{"id":1330},"the-events-popup","The Events popup",[978,1333,1334,1335,1338,1339,1342,1343,1347],{},"Clicking a run row also opens ",[988,1336,1337],{},"Events (N)"," — a flat, sorted, row\nevent list you can expand inline. Each expanded row shows the raw\n",[1003,1340,1341],{},"payload"," as JSON with its own copy button. Events are always in\nemission order regardless of storage quirks (see\n",[1036,1344,1346],{"href":1345},"#event-ordering","Event ordering"," below).",[1051,1349,1351],{"id":1350},"live-mode-aggregate-health","Live mode — aggregate health",[978,1353,1354,1355,1357,1358,1360,1361,1364],{},"Live mode is the \"what's happening across all runs right now?\" tool.\nFlip the mode switch in the header from ",[1003,1356,1135],{}," to ",[1003,1359,1110],{},". The canvas\nsubscribes to ",[1003,1362,1363],{},"GET \u002Fflows\u002F{id}\u002Flive"," and paints a new frame every\nsecond.",[1229,1366,1368],{"id":1367},"what-each-overlay-shows","What each overlay shows",[978,1370,1371],{},"The bottom dock picks which metric drives the heat map:",[982,1373,1374,1380,1386,1392],{},[985,1375,1376,1379],{},[988,1377,1378],{},"rate"," — packets per second (log-scaled so a 1\u002Fs edge is still\nvisible and a 10 000\u002Fs edge doesn't dominate)",[985,1381,1382,1385],{},[988,1383,1384],{},"p95"," — 95th-percentile node latency; latency heat ramps fast\nbecause users feel it",[985,1387,1388,1391],{},[988,1389,1390],{},"err"," — error rate; 10% = full red",[985,1393,1394,1397,1398,1401],{},[988,1395,1396],{},"sat"," — handler saturation; ",[1003,1399,1400],{},"1.0"," = 100% busy",[978,1403,1404,1405,1408,1409,1412,1413,1416],{},"Colour palette is unified across edges and nodes:\n",[988,1406,1407],{},"green"," (healthy) → ",[988,1410,1411],{},"amber"," (warm) → ",[988,1414,1415],{},"red"," (look here). One\ncolour language; no legend to memorise.",[1229,1418,1420],{"id":1419},"recommendations","Recommendations",[978,1422,1423,1424,1427],{},"In the top-right, Flow Studio shows a collapsible stack of\n",[988,1425,1426],{},"server-computed"," recommendation cards. The rule engine runs on\nevery frame before it hits the wire, so the cards update in real time\nand never require a Studio redeploy to iterate the thresholds. The\ncurrent rule catalogue:",[1056,1429,1430,1446],{},[1059,1431,1432],{},[1062,1433,1434,1437,1440,1443],{},[1065,1435,1436],{},"Rule",[1065,1438,1439],{},"Severity",[1065,1441,1442],{},"Trigger",[1065,1444,1445],{},"Action",[1075,1447,1448,1462,1476,1492,1512,1528,1541],{},[1062,1449,1450,1453,1456,1459],{},[1080,1451,1452],{},"Capacity",[1080,1454,1455],{},"warn",[1080,1457,1458],{},"saturation ≥ 80%",[1080,1460,1461],{},"raise concurrency \u002F shard \u002F queue",[1062,1463,1464,1467,1470,1473],{},[1080,1465,1466],{},"Reliability",[1080,1468,1469],{},"warn \u002F critical",[1080,1471,1472],{},"error rate > 1% \u002F > 10%",[1080,1474,1475],{},"check recent deploys \u002F add retries",[1062,1477,1478,1481,1484,1489],{},[1080,1479,1480],{},"SLO",[1080,1482,1483],{},"critical",[1080,1485,1486,1488],{},[1003,1487,1177],{}," exceeded",[1080,1490,1491],{},"profile \u002F split \u002F relax SLO",[1062,1493,1494,1497,1499,1504],{},[1080,1495,1496],{},"Transport: direct hot",[1080,1498,1455],{},[1080,1500,1501,1503],{},[1003,1502,1005],{}," edge ≥ 500\u002Fs",[1080,1505,1506,1507,1509,1510],{},"switch to ",[1003,1508,1009],{}," \u002F ",[1003,1511,1013],{},[1062,1513,1514,1517,1519,1522],{},[1080,1515,1516],{},"Transport: extreme rate",[1080,1518,1455],{},[1080,1520,1521],{},"any edge ≥ 5000\u002Fs",[1080,1523,1524,1525,1527],{},"move to ",[1003,1526,1013],{}," + partition",[1062,1529,1530,1533,1535,1538],{},[1080,1531,1532],{},"Transport: backpressure",[1080,1534,1483],{},[1080,1536,1537],{},"send-blocked events > 0",[1080,1539,1540],{},"scale consumer \u002F use queued transport",[1062,1542,1543,1546,1548,1556],{},[1080,1544,1545],{},"Transport: non-durable failures",[1080,1547,1455],{},[1080,1549,1550,1551,1553,1554],{},"failures on ",[1003,1552,1005],{},"\u002F",[1003,1555,1009],{},[1080,1557,1558,1559,1509,1562],{},"consider ",[1003,1560,1561],{},"checkpoint",[1003,1563,1564],{},"durable",[978,1566,1567],{},"Click a card — the canvas jumps focus to the offending node or edge.",[1229,1569,1571],{"id":1570},"declaring-slos","Declaring SLOs",[978,1573,1574],{},"Service-level objectives live on the flow node, not in a sidecar\nconfig. Add any combination of the three dimensions:",[1234,1576,1580],{"className":1577,"code":1578,"language":1579,"meta":1242,"style":1242},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# in your flow document\nnodes:\n  - id: chat\n    kind: action\n    action_ref: llm.chat\n    slo:\n      p95_latency_ms: 3000      # red alert above this\n      max_error_rate: 0.01      # 1%\n      max_saturation: 0.8       # 80% busy headroom\n","yaml",[1003,1581,1582,1590,1600,1614,1624,1634,1641,1655,1668],{"__ignoreMap":1242},[1583,1584,1586],"span",{"class":1585,"line":10},"line",[1583,1587,1589],{"class":1588},"sHwdD","# in your flow document\n",[1583,1591,1592,1596],{"class":1585,"line":16},[1583,1593,1595],{"class":1594},"swJcz","nodes",[1583,1597,1599],{"class":1598},"sMK4o",":\n",[1583,1601,1602,1605,1608,1610],{"class":1585,"line":22},[1583,1603,1604],{"class":1598},"  -",[1583,1606,1607],{"class":1594}," id",[1583,1609,1028],{"class":1598},[1583,1611,1613],{"class":1612},"sfazB"," chat\n",[1583,1615,1616,1619,1621],{"class":1585,"line":51},[1583,1617,1618],{"class":1594},"    kind",[1583,1620,1028],{"class":1598},[1583,1622,1623],{"class":1612}," action\n",[1583,1625,1626,1629,1631],{"class":1585,"line":57},[1583,1627,1628],{"class":1594},"    action_ref",[1583,1630,1028],{"class":1598},[1583,1632,1633],{"class":1612}," llm.chat\n",[1583,1635,1636,1639],{"class":1585,"line":102},[1583,1637,1638],{"class":1594},"    slo",[1583,1640,1599],{"class":1598},[1583,1642,1643,1646,1648,1652],{"class":1585,"line":108},[1583,1644,1645],{"class":1594},"      p95_latency_ms",[1583,1647,1028],{"class":1598},[1583,1649,1651],{"class":1650},"sbssI"," 3000",[1583,1653,1654],{"class":1588},"      # red alert above this\n",[1583,1656,1657,1660,1662,1665],{"class":1585,"line":114},[1583,1658,1659],{"class":1594},"      max_error_rate",[1583,1661,1028],{"class":1598},[1583,1663,1664],{"class":1650}," 0.01",[1583,1666,1667],{"class":1588},"      # 1%\n",[1583,1669,1670,1673,1675,1678],{"class":1585,"line":120},[1583,1671,1672],{"class":1594},"      max_saturation",[1583,1674,1028],{"class":1598},[1583,1676,1677],{"class":1650}," 0.8",[1583,1679,1680],{"class":1588},"       # 80% busy headroom\n",[978,1682,1683,1684,1687,1688,1690],{},"A breach fires an ",[1003,1685,1686],{},"slo","-kind Suggestion with severity ",[1003,1689,1483],{}," and\na ring pulse on the node. Zero on any field means \"no SLO on that\ndimension\".",[1051,1692,1694],{"id":1693},"lifecycle-the-whole-flow-graph-lifecycle","Lifecycle — the whole flow graph {#lifecycle}",[978,1696,1697,1698,1701,1702,1704],{},"Trace and Live look ",[999,1699,1700],{},"inside"," one flow. The ",[988,1703,1039],{}," view zooms out\nto how your published flows connect to each other.",[978,1706,1707,1708,1711],{},"Reaction flows are deliberately decoupled — each subscribes to an event\nand does one job. That keeps them composable, but it also means the\nend-to-end business process (",[1003,1709,1710],{},"payment.captured → apply → order.paid → issue invoice → capture → …",") is spread across a dozen independent\nflows with no single diagram. The Lifecycle view rebuilds that diagram\nautomatically.",[982,1713,1714,1728,1756,1814],{},[985,1715,1716,1719,1720,1723,1724,1727],{},[988,1717,1718],{},"Where:"," Admin → ",[988,1721,1722],{},"Flows → Lifecycle"," (base admin layer), backed by\n",[1003,1725,1726],{},"GET \u002Fapi\u002Fv1\u002Fflows\u002Flifecycle"," on the admin-api.",[985,1729,1730,1733,1734,1737,1738,1741,1742,1745,1746,1751,1752,1755],{},[988,1731,1732],{},"How it's derived:"," each published flow's ",[988,1735,1736],{},"consumed"," trigger is its\nsource node's ",[1003,1739,1740],{},"eventName","; its ",[988,1743,1744],{},"emitted"," events come from each node's\n",[1036,1747,1748],{"href":184},[1003,1749,1750],{},"emits","\ndeclaration (plus any node that publishes a config-driven topic). A\ndirected edge ",[1003,1753,1754],{},"A →(event) B"," means flow A emits the event that triggers\nflow B — so one emitter fans out to every consumer.",[985,1757,1758,1761,1762,1509,1765,1509,1768,1509,1771,1774,1775,1778,1779],{},[988,1759,1760],{},"What it shows:"," each flow is a card with a trigger badge\n(",[1003,1763,1764],{},"event",[1003,1766,1767],{},"http",[1003,1769,1770],{},"schedule",[1003,1772,1773],{},"manual",") and its consume\u002Femit event\nchips; flows are laid out left-to-right by event-dependency depth (via\n",[1003,1776,1777],{},"dagre","), so entry points sit on the left and the cascade flows right.\nThree summary panels bucket the loose ends:",[982,1780,1781,1787,1808],{},[985,1782,1783,1786],{},[988,1784,1785],{},"external entry points"," — events flows wait for that no flow emits\n(webhooks, direct API, upstream services);",[985,1788,1789,1792,1793,1796,1797,1299,1800,1803,1804,1807],{},[988,1790,1791],{},"module-delivered"," — events a flow emits that a Go module's\n",[1003,1794,1795],{},"Consumers()"," handles rather than another flow (e.g. ",[1003,1798,1799],{},"email.send",[1003,1801,1802],{},"sms.send","); these are ",[999,1805,1806],{},"delivered",", not dead ends, so they render green;",[985,1809,1810,1813],{},[988,1811,1812],{},"dead-end emits"," — events a flow emits that nothing reacts to yet — a\nhook for a step you could add.",[985,1815,1816,1819,1820,1826,1827,1830,1831,1834,1835,1838,1839,1841],{},[988,1817,1818],{},"It's interactive."," The graph is a ",[1036,1821,1825],{"href":1822,"rel":1823},"https:\u002F\u002Fvueflow.dev",[1824],"nofollow","Vue Flow","\ncanvas: pan \u002F zoom, drag cards to rearrange, a minimap and fit-to-view\ncontrols. ",[988,1828,1829],{},"Search"," any flow, event, or node from the box top-left — the\nmatching flow and the full upstream+downstream path it participates in\nhighlight (BFS over the edges) while everything else dims. ",[988,1832,1833],{},"Hover"," a card\nto spotlight its one-hop neighbourhood (direct emitters + consumers). Deep\nlinks work too: ",[1003,1836,1837],{},"\u002Fflows\u002Flifecycle?focus=\u003Cflow-id|workflow-id|name>"," opens\nwith that flow pre-selected and its path lit — the ",[1036,1840,1048],{"href":1047}," inbox\nlinks each alert straight to its flow this way.",[978,1843,1844,1845,1847,1848,1851],{},"The graph is only as complete as your node ",[1003,1846,1750],{}," declarations — a node\nthat publishes an event but doesn't declare it won't draw an edge. See\n",[1036,1849,1850],{"href":184},"FlowDSLNode.Emits",".",[1051,1853,1855],{"id":1854},"alerts-the-failure-inbox-alerts","Alerts — the failure inbox {#alerts}",[978,1857,1858,1859,1862,1863,1866],{},"Every node failure across every flow is captured into a durable,\nfilterable ",[988,1860,1861],{},"alerts inbox"," — with zero per-flow wiring. An ",[1003,1864,1865],{},"AlertSink","\ndecorates the flowexec event sink and records the failure telemetry the\nexecutor already emits:",[1056,1868,1869,1881],{},[1059,1870,1871],{},[1062,1872,1873,1876,1878],{},[1065,1874,1875],{},"Event",[1065,1877,1439],{},[1065,1879,1880],{},"Note",[1075,1882,1883,1897],{},[1062,1884,1885,1890,1894],{},[1080,1886,1887],{},[1003,1888,1889],{},"node.failed",[1080,1891,1892],{},[1003,1893,1312],{},[1080,1895,1896],{},"the actionable, node-level failure",[1062,1898,1899,1904,1908],{},[1080,1900,1901],{},[1003,1902,1903],{},"run.failed",[1080,1905,1906],{},[1003,1907,1483],{},[1080,1909,1910],{},"a run-level failure with no attributable node (deduped when a node already failed the run)",[982,1912,1913,1954],{},[985,1914,1915,1719,1917,1920,1921,1924,1925,1303,1928,1303,1931,1934,1935,1938,1939,1942,1943,1946,1947,1949,1950,1953],{},[988,1916,1718],{},[988,1918,1919],{},"Flows → Alerts",", backed by\n",[1003,1922,1923],{},"GET \u002Fapi\u002Fv1\u002Fflows\u002Falerts"," (filter by ",[1003,1926,1927],{},"severity",[1003,1929,1930],{},"flow_id",[1003,1932,1933],{},"resolved",";\nreturns an ",[1003,1936,1937],{},"openCount"," for the nav badge) and\n",[1003,1940,1941],{},"POST \u002Fapi\u002Fv1\u002Fflows\u002Falerts\u002F{id}\u002Fresolve",". Alerts are ",[988,1944,1945],{},"resolve-only"," —\nacknowledging keeps an audit trail; there is no hard delete. Each alert\nrow links its flow into the ",[1036,1948,1039],{"href":1038}," graph\n(",[1003,1951,1952],{},"?focus=\u003Cflow>",") so you can see where the failing flow sits in the\nend-to-end process in one click.",[985,1955,1956,1959,1960,1963],{},[988,1957,1958],{},"Storage:"," a Mongo ",[1003,1961,1962],{},"flow_alerts"," collection when a DB is configured,\nin-memory otherwise. No setup — capture is on by default on any flowexec\ndeployment.",[1229,1965,1967,1968],{"id":1966},"recording-a-custom-alert-alertsrecord","Recording a custom alert — ",[1003,1969,1970],{},"alerts\u002Frecord",[978,1972,1973],{},"Beyond automatic failure capture, a flow can raise its own alert from an\nexplicit branch — a big order, a risky payment, a failed external check:",[1234,1975,1977],{"className":1577,"code":1976,"language":1579,"meta":1242,"style":1242},"nodes:\n  - id: flag-big-order\n    kind: action\n    action_ref: alerts\u002Frecord\n    config:\n      severity: warning        # warning | error | critical\n      source: risk\n      message: \"Large order flagged for review\"   # an input `message` overrides this\n",[1003,1978,1979,1985,1996,2004,2013,2020,2033,2043],{"__ignoreMap":1242},[1583,1980,1981,1983],{"class":1585,"line":10},[1583,1982,1595],{"class":1594},[1583,1984,1599],{"class":1598},[1583,1986,1987,1989,1991,1993],{"class":1585,"line":16},[1583,1988,1604],{"class":1598},[1583,1990,1607],{"class":1594},[1583,1992,1028],{"class":1598},[1583,1994,1995],{"class":1612}," flag-big-order\n",[1583,1997,1998,2000,2002],{"class":1585,"line":22},[1583,1999,1618],{"class":1594},[1583,2001,1028],{"class":1598},[1583,2003,1623],{"class":1612},[1583,2005,2006,2008,2010],{"class":1585,"line":51},[1583,2007,1628],{"class":1594},[1583,2009,1028],{"class":1598},[1583,2011,2012],{"class":1612}," alerts\u002Frecord\n",[1583,2014,2015,2018],{"class":1585,"line":57},[1583,2016,2017],{"class":1594},"    config",[1583,2019,1599],{"class":1598},[1583,2021,2022,2025,2027,2030],{"class":1585,"line":102},[1583,2023,2024],{"class":1594},"      severity",[1583,2026,1028],{"class":1598},[1583,2028,2029],{"class":1612}," warning",[1583,2031,2032],{"class":1588},"        # warning | error | critical\n",[1583,2034,2035,2038,2040],{"class":1585,"line":108},[1583,2036,2037],{"class":1594},"      source",[1583,2039,1028],{"class":1598},[1583,2041,2042],{"class":1612}," risk\n",[1583,2044,2045,2048,2050,2053,2056,2058],{"class":1585,"line":114},[1583,2046,2047],{"class":1594},"      message",[1583,2049,1028],{"class":1598},[1583,2051,2052],{"class":1598}," \"",[1583,2054,2055],{"class":1612},"Large order flagged for review",[1583,2057,1014],{"class":1598},[1583,2059,2060],{"class":1588},"   # an input `message` overrides this\n",[978,2062,2063,2064,2067,2068,2071,2072,2075,2076,2079,2080,2083,2084,1851],{},"The node emits on the ",[988,2065,2066],{},"Recorded"," port (with ",[1003,2069,2070],{},"output.alert_id",") or on\n",[988,2073,2074],{},"Error"," if the store write fails — it never fails the run. The ",[1003,2077,2078],{},"message","\nis taken from the incoming packet first, so an upstream edge can template\nit (",[1003,2081,2082],{},"{{ .payload.number }}","). Recorded alerts carry ",[1003,2085,2086],{},"kind: custom",[1051,2088,2090],{"id":2089},"historical-retention","Historical retention",[978,2092,2093,2094,2097],{},"The flowexec in-proc aggregator keeps the last ",[988,2095,2096],{},"5 minutes"," of\nframes in a ring buffer. Plenty for \"is anything red right now?\".",[978,2099,2100,2101,2104],{},"For longer retention (capacity planning, postmortems, compare-to-\nyesterday), enable the optional ",[988,2102,2103],{},"ClickHouse"," sink:",[1234,2106,2110],{"className":2107,"code":2108,"language":2109,"meta":1242,"style":1242},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# infra\u002Fdocker-compose.yml\ndocker compose --profile metrics up -d\nexport CLICKHOUSE_URL=clickhouse:\u002F\u002Fredelay:redelay@localhost:9000\u002Fredelay\n","bash",[1003,2111,2112,2117,2138],{"__ignoreMap":1242},[1583,2113,2114],{"class":1585,"line":10},[1583,2115,2116],{"class":1588},"# infra\u002Fdocker-compose.yml\n",[1583,2118,2119,2123,2126,2129,2132,2135],{"class":1585,"line":16},[1583,2120,2122],{"class":2121},"sBMFI","docker",[1583,2124,2125],{"class":1612}," compose",[1583,2127,2128],{"class":1612}," --profile",[1583,2130,2131],{"class":1612}," metrics",[1583,2133,2134],{"class":1612}," up",[1583,2136,2137],{"class":1612}," -d\n",[1583,2139,2140,2144,2148,2151],{"class":1585,"line":22},[1583,2141,2143],{"class":2142},"spNyl","export",[1583,2145,2147],{"class":2146},"sTEyZ"," CLICKHOUSE_URL",[1583,2149,2150],{"class":1598},"=",[1583,2152,2153],{"class":2146},"clickhouse:\u002F\u002Fredelay:redelay@localhost:9000\u002Fredelay\n",[978,2155,2156,2157,2160,2161,2167],{},"The ",[1003,2158,2159],{},"flow_metrics"," table is auto-created at boot with a 30-day TTL;\neach frame fans out to one row per node + one per edge + one per\nchannel. The schema is in\n",[1036,2162,2164],{"href":2163},"\u002Fdocs\u002Freference\u002Fgo-flowdsl#metrics",[1003,2165,2166],{},"go-flowdsl\u002Fflowexec\u002Fmetrics\u002Fclickhouse","\n— point Grafana or your BI tool at it if you want charts beyond\nwhat the canvas renders.",[978,2169,2170],{},"Small deployments can ignore ClickHouse entirely; the in-proc ring\npowers both the live stream and the first-paint history endpoint.",[1051,2172,2174],{"id":2173},"event-ordering-event-ordering","Event ordering {#event-ordering}",[978,2176,2177,2178,2181,2182,2185,2186,1851],{},"FlowEvents carry a per-run monotonic ",[1003,2179,2180],{},"seq"," counter assigned by the\nExecutor in emission order. MongoDB time-series storage can't\ntie-break identical millisecond timestamps (node.started and\nnode.done on the same instant-pass-through node, for example), so\nthe sink sorts by ",[1003,2183,2184],{},"(ts, seq)"," and the client ",[988,2187,2188],{},"never re-sorts",[978,2190,2191],{},"The Studio's event list, payload drawer, scrubber timeline, and Live\naggregator all consume this canonical order.",[1051,2193,2195],{"id":2194},"wire-format","Wire format",[978,2197,2198],{},"Live frames are JSON-encoded over SSE; one frame per tick.",[1234,2200,2204],{"className":2201,"code":2202,"language":2203,"meta":1242,"style":1242},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"ts\": \"2026-04-17T20:11:12.387Z\",\n  \"windowMs\": 1000,\n  \"meta\": {\n    \"flowId\": \"assistant\",\n    \"versionHash\": \"cc2891d2…\"\n  },\n  \"nodes\": {\n    \"chat\": {\n      \"rate\": 45.2,\n      \"latencyP50\": 820,\n      \"latencyP95\": 4120,\n      \"errorRate\": 0.012,\n      \"saturation\": 0.87,\n      \"inflight\": 4,\n      \"completed\": 42, \"failed\": 1,           \u002F\u002F this window only\n      \"completedTotal\": 12843, \"failedTotal\": 27 \u002F\u002F cumulative since aggregator boot\n    }\n  },\n  \"edges\": {\n    \"start__chat\": {\n      \"rate\": 45.2,\n      \"delivered\": 45,            \u002F\u002F this window\n      \"deliveredTotal\": 12870,    \u002F\u002F cumulative\n      \"mode\": \"direct\"\n    }\n  },\n  \"suggestions\": [\n    {\n      \"severity\": \"warn\",\n      \"kind\": \"transport\",\n      \"target\": \"edge:start__chat\",\n      \"reason\": \"45\u002Fs over `direct` — in-proc delivery is saturating\",\n      \"action\": \"Switch to `ephemeral` (Redis) or `stream` (Kafka)\"\n    }\n  ]\n}\n","jsonc",[1003,2205,2206,2211,2216,2221,2226,2231,2236,2241,2246,2251,2256,2261,2266,2271,2276,2281,2289,2297,2302,2306,2311,2316,2320,2329,2338,2343,2347,2351,2357,2363,2369,2375,2381,2387,2393,2398,2404],{"__ignoreMap":1242},[1583,2207,2208],{"class":1585,"line":10},[1583,2209,2210],{},"{\n",[1583,2212,2213],{"class":1585,"line":16},[1583,2214,2215],{},"  \"ts\": \"2026-04-17T20:11:12.387Z\",\n",[1583,2217,2218],{"class":1585,"line":22},[1583,2219,2220],{},"  \"windowMs\": 1000,\n",[1583,2222,2223],{"class":1585,"line":51},[1583,2224,2225],{},"  \"meta\": {\n",[1583,2227,2228],{"class":1585,"line":57},[1583,2229,2230],{},"    \"flowId\": \"assistant\",\n",[1583,2232,2233],{"class":1585,"line":102},[1583,2234,2235],{},"    \"versionHash\": \"cc2891d2…\"\n",[1583,2237,2238],{"class":1585,"line":108},[1583,2239,2240],{},"  },\n",[1583,2242,2243],{"class":1585,"line":114},[1583,2244,2245],{},"  \"nodes\": {\n",[1583,2247,2248],{"class":1585,"line":120},[1583,2249,2250],{},"    \"chat\": {\n",[1583,2252,2253],{"class":1585,"line":181},[1583,2254,2255],{},"      \"rate\": 45.2,\n",[1583,2257,2258],{"class":1585,"line":186},[1583,2259,2260],{},"      \"latencyP50\": 820,\n",[1583,2262,2263],{"class":1585,"line":191},[1583,2264,2265],{},"      \"latencyP95\": 4120,\n",[1583,2267,2268],{"class":1585,"line":197},[1583,2269,2270],{},"      \"errorRate\": 0.012,\n",[1583,2272,2273],{"class":1585,"line":203},[1583,2274,2275],{},"      \"saturation\": 0.87,\n",[1583,2277,2278],{"class":1585,"line":214},[1583,2279,2280],{},"      \"inflight\": 4,\n",[1583,2282,2283,2286],{"class":1585,"line":223},[1583,2284,2285],{},"      \"completed\": 42, \"failed\": 1,",[1583,2287,2288],{},"           \u002F\u002F this window only\n",[1583,2290,2291,2294],{"class":1585,"line":229},[1583,2292,2293],{},"      \"completedTotal\": 12843, \"failedTotal\": 27",[1583,2295,2296],{}," \u002F\u002F cumulative since aggregator boot\n",[1583,2298,2299],{"class":1585,"line":234},[1583,2300,2301],{},"    }\n",[1583,2303,2304],{"class":1585,"line":240},[1583,2305,2240],{},[1583,2307,2308],{"class":1585,"line":246},[1583,2309,2310],{},"  \"edges\": {\n",[1583,2312,2313],{"class":1585,"line":251},[1583,2314,2315],{},"    \"start__chat\": {\n",[1583,2317,2318],{"class":1585,"line":257},[1583,2319,2255],{},[1583,2321,2323,2326],{"class":1585,"line":2322},23,[1583,2324,2325],{},"      \"delivered\": 45,",[1583,2327,2328],{},"            \u002F\u002F this window\n",[1583,2330,2332,2335],{"class":1585,"line":2331},24,[1583,2333,2334],{},"      \"deliveredTotal\": 12870,",[1583,2336,2337],{},"    \u002F\u002F cumulative\n",[1583,2339,2340],{"class":1585,"line":271},[1583,2341,2342],{},"      \"mode\": \"direct\"\n",[1583,2344,2345],{"class":1585,"line":277},[1583,2346,2301],{},[1583,2348,2349],{"class":1585,"line":282},[1583,2350,2240],{},[1583,2352,2354],{"class":1585,"line":2353},28,[1583,2355,2356],{},"  \"suggestions\": [\n",[1583,2358,2360],{"class":1585,"line":2359},29,[1583,2361,2362],{},"    {\n",[1583,2364,2366],{"class":1585,"line":2365},30,[1583,2367,2368],{},"      \"severity\": \"warn\",\n",[1583,2370,2372],{"class":1585,"line":2371},31,[1583,2373,2374],{},"      \"kind\": \"transport\",\n",[1583,2376,2378],{"class":1585,"line":2377},32,[1583,2379,2380],{},"      \"target\": \"edge:start__chat\",\n",[1583,2382,2384],{"class":1585,"line":2383},33,[1583,2385,2386],{},"      \"reason\": \"45\u002Fs over `direct` — in-proc delivery is saturating\",\n",[1583,2388,2390],{"class":1585,"line":2389},34,[1583,2391,2392],{},"      \"action\": \"Switch to `ephemeral` (Redis) or `stream` (Kafka)\"\n",[1583,2394,2396],{"class":1585,"line":2395},35,[1583,2397,2301],{},[1583,2399,2401],{"class":1585,"line":2400},36,[1583,2402,2403],{},"  ]\n",[1583,2405,2407],{"class":1585,"line":2406},37,[1583,2408,2409],{},"}\n",[978,2411,2412],{},"Endpoints:",[982,2414,2415,2420],{},[985,2416,2417,2419],{},[1003,2418,1363],{}," — SSE stream (1 frame \u002F s)",[985,2421,2422,2425],{},[1003,2423,2424],{},"GET \u002Fflows\u002F{id}\u002Fmetrics\u002Fhistory?limit=N&since=RFC3339Nano"," — the\nmost recent frames from the RAM ring (used by the Studio for\nfirst-paint + dock scrubbing)",[978,2427,2428,2429,1303,2432,1303,2435,1303,2438,1299,2441,2444,2445,2448],{},"Identity — ",[1003,2430,2431],{},"tenantId",[1003,2433,2434],{},"flowId",[1003,2436,2437],{},"versionHash",[1003,2439,2440],{},"assistantId",[1003,2442,2443],{},"userId"," — rides on the frame payload (",[1003,2446,2447],{},"meta","), never as routing\nmetadata, so multi-tenant deployments partition on the read side\nwithout carving up topic names.",[1229,2450,2452],{"id":2451},"run-metric-identity-document-id-vs-flow-record-id-run-identity","Run + metric identity: document ID vs flow-record ID {#run-identity}",[978,2454,2455],{},"Two IDs name a flow, and observability keys on the first:",[982,2457,2458,2479],{},[985,2459,2460,2463,2464,2467,2468,2471,2472,1299,2475,2478],{},[988,2461,2462],{},"Workflow document ID"," — the authored ",[1003,2465,2466],{},"id"," inside the flow document\n(e.g. ",[1003,2469,2470],{},"asyncshop-checkout-standard","). The Executor stamps this onto every\nrun record, metric frame, event, and tap hit (",[1003,2473,2474],{},"FlowRun.flowId",[1003,2476,2477],{},"frame.meta.flowId",", …).",[985,2480,2481,1273,2484,2487,2488,1196],{},[988,2482,2483],{},"Flow-record ID",[1003,2485,2486],{},"flow.\u003Cuuid>",", the storage handle the admin URLs use\n(",[1003,2489,2490],{},"\u002Fflows\u002F{id}\u002F...",[978,2492,2156,2493,1303,2496,2499,2500,2503,2504,2507,2508,1851],{},[1003,2494,2495],{},"\u002Fflows\u002F{id}\u002Fruns",[1003,2497,2498],{},"\u002Fmetrics\u002Fhistory",", and ",[1003,2501,2502],{},"\u002Flive"," endpoints resolve the\nrecord ID in the URL to the flow's published (or head) document ID before\nquerying, so a flow's history actually surfaces. Consequence: two flow records\nbuilt from the ",[988,2505,2506],{},"same"," template share one authored document ID and therefore\nshare run\u002Fmetric history on these endpoints — give a flow its own document ID\nto separate them. Taps resolve the same split via ",[1003,2509,2510],{},"Tap.WorkflowID",[978,2512,2513,2516,2517,2520,2521,1303,2523,1553,2526,1303,2529,1303,2531,2534,2535,2538,2539,2542,2543,2545,2546,2549,2550,2554],{},[988,2514,2515],{},"Where a run's output lives."," The run row (",[1003,2518,2519],{},"GET \u002Fruns\u002F{runID}",") carries only\nmetadata — ",[1003,2522,1298],{},[1003,2524,2525],{},"startedAt",[1003,2527,2528],{},"endedAt",[1003,2530,1302],{},[1003,2532,2533],{},"inputDigest",". The\nactual packet each node produced is in the event stream\n(",[1003,2536,2537],{},"GET \u002Fruns\u002F{runID}\u002Fevents\u002Fhistory",", or live via ",[1003,2540,2541],{},"\u002Fevents",") and in any tap hit\n— not on the run summary. ",[1003,2544,2498],{}," reads the ",[988,2547,2548],{},"in-RAM ring"," (last\nfew minutes) unless ClickHouse retention is enabled (see ",[1036,2551,2553],{"href":2552},"#historical-retention","below","),\nso a flow that hasn't run recently returns no frames even though its run\nhistory persists.",[1051,2556,2558],{"id":2557},"whats-next","What's next",[982,2560,2561,2577,2580],{},[985,2562,2563,2564,2569,2570,2572,2573,2576],{},"Wire the matching ",[1036,2565,2566],{"href":2163},[1003,2567,2568],{},"runtime\u002Fobservability","\nhelpers when you embed ",[1003,2571,1192],{}," directly (without the HTTP\nmodule) — the Executor accepts any ",[1003,2574,2575],{},"MetricsRecorder",", so you can\nplug a test double or a remote aggregator.",[985,2578,2579],{},"Declare SLOs on your hot-path nodes and watch the violation badges\nappear during load tests.",[985,2581,2582,2583,2585,2586,1010,2588,2590],{},"Reach for the ",[1036,2584,94],{"href":95},"\nguide when Live mode starts recommending ",[1003,2587,1009],{},[1003,2589,1013],{},"\nupgrades.",[1051,2592,2594],{"id":2593},"further-reading","Further reading",[982,2596,2597,2602,2618],{},[985,2598,2599,2601],{},[1036,2600,105],{"href":106}," — the execution contract\nthat Trace + Live sit on top of.",[985,2603,2604,2607,2608,1303,2611,1303,2614,2617],{},[1036,2605,2606],{"href":2163},"go-flowdsl reference → metrics"," —\n",[1003,2609,2610],{},"MetricsSink",[1003,2612,2613],{},"Frame",[1003,2615,2616],{},"Suggestion"," types.",[985,2619,2620,2622],{},[1036,2621,38],{"href":39}," — the five delivery modes\nthe recommendation engine nudges you between.",[2624,2625,2626],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":1242,"searchDepth":16,"depth":16,"links":2628},[2629,2630,2631,2637,2642,2643,2647,2648,2649,2652,2653],{"id":1053,"depth":16,"text":1054},{"id":1180,"depth":16,"text":1181},{"id":1219,"depth":16,"text":1220,"children":2632},[2633,2634,2635,2636],{"id":1231,"depth":22,"text":1232},{"id":1245,"depth":22,"text":1246},{"id":1283,"depth":22,"text":1284},{"id":1330,"depth":22,"text":1331},{"id":1350,"depth":16,"text":1351,"children":2638},[2639,2640,2641],{"id":1367,"depth":22,"text":1368},{"id":1419,"depth":22,"text":1420},{"id":1570,"depth":22,"text":1571},{"id":1693,"depth":16,"text":1694},{"id":1854,"depth":16,"text":1855,"children":2644},[2645],{"id":1966,"depth":22,"text":2646},"Recording a custom alert — alerts\u002Frecord",{"id":2089,"depth":16,"text":2090},{"id":2173,"depth":16,"text":2174},{"id":2194,"depth":16,"text":2195,"children":2650},[2651],{"id":2451,"depth":22,"text":2452},{"id":2557,"depth":16,"text":2558},{"id":2593,"depth":16,"text":2594},"See every packet, spot bottlenecks, and get transport recommendations — without leaving the canvas. Flow Studio's Trace and Live modes, the cross-flow Lifecycle graph, and the failure Alerts inbox, powered by the flowexec pipeline.","md",null,{},{"order":114,"icon":115},{"title":111,"description":2654},"Fai_KsvU19ndvenQFZyZZNEpT1rokj3v0XHNiGqMxOQ",[2662,2664],{"title":105,"path":106,"stem":107,"description":2663,"order":108,"icon":109,"children":-1},"End-to-end guide for executing FlowDSL flows in a Redelay service — create a flow, save and publish a version, launch a run, and subscribe to live events over SSE.",{"title":117,"path":118,"stem":119,"description":2665,"order":120,"icon":121,"children":-1},"Wire the in-app AI assistant component to a FlowDSL flow executed by your Redelay backend. The frontend stays framework-agnostic; all LLM logic lives in a flow you can edit without a redeploy.",1790332226948]