[{"data":1,"prerenderedAt":2840},["ShallowReactive",2],{"navigation_docs":3,"-docs-reference-deployments":968,"-docs-reference-deployments-surround":2835},[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":264,"body":970,"description":2829,"extension":2830,"links":2831,"meta":2832,"navigation":1296,"path":265,"seo":2833,"stem":266,"__hash__":2834},"docs\u002Fdocs\u002F4.reference\u002F24.deployments.md",{"type":971,"value":972,"toc":2815},"minimark",[973,977,986,1052,1059,1064,1067,1077,1080,1087,1091,1106,1210,1213,1253,1261,1268,1315,1321,1353,1360,1371,1375,1388,1391,1413,1420,1550,1553,1557,1580,1985,1988,2179,2182,2239,2242,2249,2283,2291,2294,2354,2361,2364,2440,2446,2477,2586,2591,2601,2605,2717,2723,2727,2730,2756,2763,2767,2811],[974,975,264],"h1",{"id":976},"deployments",[978,979,980,981,985],"p",{},"A ",[982,983,984],"strong",{},"deployment"," is the routing record that wires a flow into the\nproject's runtime. Every published flow has exactly one deployment.\nTwo flavours, one shape:",[987,988,989,1005],"table",{},[990,991,992],"thead",{},[993,994,995,999,1002],"tr",{},[996,997,998],"th",{},"Kind",[996,1000,1001],{},"Purpose",[996,1003,1004],{},"Stable ID convention",[1006,1007,1008,1034],"tbody",{},[993,1009,1010,1017,1024],{},[1011,1012,1013],"td",{},[1014,1015,1016],"code",{},"route",[1011,1018,1019,1020,1023],{},"HTTP-mounted flow — dispatcher binds ",[1014,1021,1022],{},"(method, path)"," and serves requests through the variant chain",[1011,1025,1026,1029,1030,1033],{},[1014,1027,1028],{},"route-\u003Cmethod>-\u003Cpath-slug>"," (e.g. ",[1014,1031,1032],{},"route-post-api-v1-users-signup",")",[993,1035,1036,1041,1044],{},[1011,1037,1038],{},[1014,1039,1040],{},"subscriber",[1011,1042,1043],{},"Event-driven flow — variants subscribe to a bus channel, optionally filtered",[1011,1045,1046,1029,1049,1033],{},[1014,1047,1048],{},"subscriber-\u003Ctemplate-slug>",[1014,1050,1051],{},"subscriber-users-email-verify-handler",[978,1053,1054,1055,1058],{},"The deployment is the unit operators reason about — ",[1014,1056,1057],{},"\u002Fflows\u002Fdeployments","\nis the canonical \"what's running in this project\" view. Flows are the\nimplementation behind the variants; the dispatch unit and the contract\nlive on the deployment.",[1060,1061,1063],"h2",{"id":1062},"when-deployments-get-created","When deployments get created",[978,1065,1066],{},"Two paths, both auto-managed and idempotent:",[1068,1069,1074],"pre",{"className":1070,"code":1072,"language":1073},[1071],"language-text","Activate registration template          Publish a non-HTTP flow\n──────────────────────────              ──────────────────────────\nflowexec.ActivateTemplate               flowexec.EnsureTemplatePublished\n  │                                       │\n  │  extract http-endpoint config         │  detect non-HTTP source\n  │                                       │\n  ▼                                       ▼\nensureRouteDeployment                   ensureSubscriberDeployment\n  ID: route-\u003Cmethod>-\u003Cpath>               ID: subscriber-\u003Ctemplate-id>\n  Variants: [{stable, flowID}]            Variants: [{stable, flowID}]\n  Labels:  x-route, x-source              Labels:  x-event, x-event-filter,\n                                                   x-template-id, x-kind: subscriber\n","text",[1014,1075,1072],{"__ignoreMap":1076},"",[978,1078,1079],{},"The IDs are deterministic from the route or template — re-publishing\npatches the existing deployment's stable variant in place; canary \u002F\nA-B variants added by operators are preserved untouched.",[978,1081,1082,1083,1086],{},"You never need to create deployments manually for the common cases.\nThe two paths above cover every template-backed flow. Manual\n",[1014,1084,1085],{},"POST \u002Fapi\u002Fv1\u002Fdeployments"," is for the rare case where a project ships\na hand-built deployment definition (typically: pinning a specific\nversion, custom routing weights, custom labels).",[1060,1088,1090],{"id":1089},"variants-and-routing","Variants and routing",[978,1092,1093,1094,1097,1098,1101,1102,1105],{},"Each deployment carries one or more variants. The ",[1014,1095,1096],{},"stable"," variant is\nthe canonical implementation; canary \u002F A-B \u002F experiment variants are\nnamed however the operator wants. Each variant points at a ",[1014,1099,1100],{},"flowId"," —\noptionally a pinned ",[1014,1103,1104],{},"versionId",".",[1068,1107,1111],{"className":1108,"code":1109,"language":1110,"meta":1076,"style":1076},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","variants:\n  - label:     stable\n    flowId:    flow.0645041f-…    # always-published, follows its own publish pointer\n    weight:    90\n  - label:     canary\n    flowId:    flow.8713d6f7-…    # experimental new flow\n    versionId: ver.df501b50-…    # pinned — independent of flow's publish pointer\n    weight:    10\n","yaml",[1014,1112,1113,1125,1140,1154,1165,1176,1188,1201],{"__ignoreMap":1076},[1114,1115,1117,1121],"span",{"class":1116,"line":10},"line",[1114,1118,1120],{"class":1119},"swJcz","variants",[1114,1122,1124],{"class":1123},"sMK4o",":\n",[1114,1126,1127,1130,1133,1136],{"class":1116,"line":16},[1114,1128,1129],{"class":1123},"  -",[1114,1131,1132],{"class":1119}," label",[1114,1134,1135],{"class":1123},":",[1114,1137,1139],{"class":1138},"sfazB","     stable\n",[1114,1141,1142,1145,1147,1150],{"class":1116,"line":22},[1114,1143,1144],{"class":1119},"    flowId",[1114,1146,1135],{"class":1123},[1114,1148,1149],{"class":1138},"    flow.0645041f-…",[1114,1151,1153],{"class":1152},"sHwdD","    # always-published, follows its own publish pointer\n",[1114,1155,1156,1159,1161],{"class":1116,"line":51},[1114,1157,1158],{"class":1119},"    weight",[1114,1160,1135],{"class":1123},[1114,1162,1164],{"class":1163},"sbssI","    90\n",[1114,1166,1167,1169,1171,1173],{"class":1116,"line":57},[1114,1168,1129],{"class":1123},[1114,1170,1132],{"class":1119},[1114,1172,1135],{"class":1123},[1114,1174,1175],{"class":1138},"     canary\n",[1114,1177,1178,1180,1182,1185],{"class":1116,"line":102},[1114,1179,1144],{"class":1119},[1114,1181,1135],{"class":1123},[1114,1183,1184],{"class":1138},"    flow.8713d6f7-…",[1114,1186,1187],{"class":1152},"    # experimental new flow\n",[1114,1189,1190,1193,1195,1198],{"class":1116,"line":108},[1114,1191,1192],{"class":1119},"    versionId",[1114,1194,1135],{"class":1123},[1114,1196,1197],{"class":1138}," ver.df501b50-…",[1114,1199,1200],{"class":1152},"    # pinned — independent of flow's publish pointer\n",[1114,1202,1203,1205,1207],{"class":1116,"line":114},[1114,1204,1158],{"class":1119},[1114,1206,1135],{"class":1123},[1114,1208,1209],{"class":1163},"    10\n",[978,1211,1212],{},"Routing semantics:",[1214,1215,1216,1232,1239],"ul",{},[1217,1218,1219,1220,1223,1224,1227,1228,1231],"li",{},"Weights are ",[982,1221,1222],{},"relative"," — the runtime normalises across variants at\nselection time. ",[1014,1225,1226],{},"90 + 10"," and ",[1014,1229,1230],{},"9 + 1"," produce the same split.",[1217,1233,1234,1235,1238],{},"Zero-weight variants are ",[982,1236,1237],{},"declared but not selected"," — useful for\nstaging a variant before flipping its weight.",[1217,1240,1241,1244,1245,1248,1249,1252],{},[1014,1242,1243],{},"stickyBy"," (deployment-level) names a field in ",[1014,1246,1247],{},"RunInput.Meta"," whose\nvalue is hashed for sticky bucketing — the same ",[1014,1250,1251],{},"session_id"," always\nroutes to the same variant. Empty = non-sticky random draw weighted\nby share.",[1060,1254,1256,1257,1260],{"id":1255},"the-disabled-flag","The ",[1014,1258,1259],{},"Disabled"," flag",[978,1262,1263,1264,1267],{},"Each deployment has a ",[1014,1265,1266],{},"disabled bool"," (default false = enabled).\nToggle without deletion:",[1068,1269,1273],{"className":1270,"code":1271,"language":1272,"meta":1076,"style":1076},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","PATCH \u002Fapi\u002Fv1\u002Fdeployments\u002F{id}\nContent-Type: application\u002Fjson\n\n{\"disabled\": true}\n","bash",[1014,1274,1275,1284,1292,1298],{"__ignoreMap":1076},[1114,1276,1277,1281],{"class":1116,"line":10},[1114,1278,1280],{"class":1279},"sBMFI","PATCH",[1114,1282,1283],{"class":1138}," \u002Fapi\u002Fv1\u002Fdeployments\u002F{id}\n",[1114,1285,1286,1289],{"class":1116,"line":16},[1114,1287,1288],{"class":1279},"Content-Type:",[1114,1290,1291],{"class":1138}," application\u002Fjson\n",[1114,1293,1294],{"class":1116,"line":22},[1114,1295,1297],{"emptyLinePlaceholder":1296},true,"\n",[1114,1299,1300,1303,1306,1309,1312],{"class":1116,"line":51},[1114,1301,1302],{"class":1123},"{",[1114,1304,1305],{"class":1279},"\"disabled\"",[1114,1307,1135],{"class":1308},"s2Zo4",[1114,1310,1311],{"class":1123}," true",[1114,1313,1314],{"class":1138},"}\n",[978,1316,1317,1318,1135],{},"When ",[1014,1319,1320],{},"disabled = true",[1214,1322,1323,1336,1346],{},[1217,1324,1325,1328,1329,1331,1332,1335],{},[982,1326,1327],{},"Route deployments"," — dispatcher unbinds the ",[1014,1330,1022],{},". Next\nrequest falls through to whatever's registered after flowexec\n(typically a chi 404). The ",[1014,1333,1334],{},"\u002Fopenapi.json"," generator skips the route\ntoo — disabled means \"not part of the published surface right now\".",[1217,1337,1338,1341,1342,1345],{},[982,1339,1340],{},"Subscriber deployments"," — ",[1014,1343,1344],{},"DynamicChannels()"," skips the deployment's\nvariants when emitting AsyncAPI; the event bus consumer is no longer\nannounced. Flows that were subscribed via this deployment unsubscribe\non the next sync.",[1217,1347,1348,1349,1352],{},"The PATCH triggers ",[1014,1350,1351],{},"SyncFlowBindings()"," for every variant flow so\nthe change takes effect on the very next request — no restart.",[978,1354,1355,1356,1359],{},"Re-enable with ",[1014,1357,1358],{},"{\"disabled\": false}"," and the same sync rebinds \u002F\nre-announces.",[1361,1362,1363,1366,1367,1370],"callout",{"icon":11},[982,1364,1365],{},"Why silent removal from specs."," Disabled = \"not currently serving\".\nThe spec describes what the project actually serves; advertising a\nroute that 404s would mislead client SDK generators and ",[1014,1368,1369],{},"\u002Freference","\nviewers. If you want a \"503 maintenance\" semantic instead of a hard\nremove, that's a separate variant on disable (not implemented yet —\nfile a request).",[1060,1372,1374],{"id":1373},"route-uniqueness-invariant","Route-uniqueness invariant",[978,1376,980,1377,1379,1380,1383,1384,1387],{},[1014,1378,1022],{}," route is owned by ",[982,1381,1382],{},"exactly one deployment"," at a\ntime, regardless of ",[1014,1385,1386],{},"disabled"," state. Disabled deployments still hold\ntheir claim — re-enabling can never produce a half-bound state where\ntwo deployments race for the same path.",[978,1389,1390],{},"Enforced at:",[1214,1392,1393,1398,1407],{},[1217,1394,1395,1397],{},[1014,1396,1085],{}," — create",[1217,1399,1400,1403,1404,1406],{},[1014,1401,1402],{},"PATCH \u002Fapi\u002Fv1\u002Fdeployments\u002F{id}"," — when ",[1014,1405,1120],{}," are part of the\npatch",[1217,1408,1409,1412],{},[1014,1410,1411],{},"POST \u002Fapi\u002Fv1\u002Fflows\u002Ftemplates\u002Factivate"," — pre-flight check (the\nauto-managed deployment id is exempt; user-created deployments\nclaiming the same route block activation)",[978,1414,1415,1416,1419],{},"Conflict response is ",[982,1417,1418],{},"409 Conflict"," with structured body:",[1068,1421,1425],{"className":1422,"code":1423,"language":1424,"meta":1076,"style":1076},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"detail\": \"route POST \u002Fapi\u002Fv1\u002Fusers\u002Fsignup is already claimed by deployment \\\"route-post-api-v1-users-signup\\\" — re-bind or delete that deployment before creating one at the same route, OR edit its variants if you want to swap the flow\",\n  \"conflicting_deployment_id\": \"route-post-api-v1-users-signup\",\n  \"conflicting_deployment_name\": \"Registration — basic\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fv1\u002Fusers\u002Fsignup\"\n}\n","json",[1014,1426,1427,1432,1468,1487,1507,1527,1546],{"__ignoreMap":1076},[1114,1428,1429],{"class":1116,"line":10},[1114,1430,1431],{"class":1123},"{\n",[1114,1433,1434,1437,1441,1444,1446,1449,1452,1456,1458,1460,1463,1465],{"class":1116,"line":16},[1114,1435,1436],{"class":1123},"  \"",[1114,1438,1440],{"class":1439},"spNyl","detail",[1114,1442,1443],{"class":1123},"\"",[1114,1445,1135],{"class":1123},[1114,1447,1448],{"class":1123}," \"",[1114,1450,1451],{"class":1138},"route POST \u002Fapi\u002Fv1\u002Fusers\u002Fsignup is already claimed by deployment ",[1114,1453,1455],{"class":1454},"sTEyZ","\\\"",[1114,1457,1032],{"class":1138},[1114,1459,1455],{"class":1454},[1114,1461,1462],{"class":1138}," — re-bind or delete that deployment before creating one at the same route, OR edit its variants if you want to swap the flow",[1114,1464,1443],{"class":1123},[1114,1466,1467],{"class":1123},",\n",[1114,1469,1470,1472,1475,1477,1479,1481,1483,1485],{"class":1116,"line":22},[1114,1471,1436],{"class":1123},[1114,1473,1474],{"class":1439},"conflicting_deployment_id",[1114,1476,1443],{"class":1123},[1114,1478,1135],{"class":1123},[1114,1480,1448],{"class":1123},[1114,1482,1032],{"class":1138},[1114,1484,1443],{"class":1123},[1114,1486,1467],{"class":1123},[1114,1488,1489,1491,1494,1496,1498,1500,1503,1505],{"class":1116,"line":51},[1114,1490,1436],{"class":1123},[1114,1492,1493],{"class":1439},"conflicting_deployment_name",[1114,1495,1443],{"class":1123},[1114,1497,1135],{"class":1123},[1114,1499,1448],{"class":1123},[1114,1501,1502],{"class":1138},"Registration — basic",[1114,1504,1443],{"class":1123},[1114,1506,1467],{"class":1123},[1114,1508,1509,1511,1514,1516,1518,1520,1523,1525],{"class":1116,"line":57},[1114,1510,1436],{"class":1123},[1114,1512,1513],{"class":1439},"method",[1114,1515,1443],{"class":1123},[1114,1517,1135],{"class":1123},[1114,1519,1448],{"class":1123},[1114,1521,1522],{"class":1138},"POST",[1114,1524,1443],{"class":1123},[1114,1526,1467],{"class":1123},[1114,1528,1529,1531,1534,1536,1538,1540,1543],{"class":1116,"line":102},[1114,1530,1436],{"class":1123},[1114,1532,1533],{"class":1439},"path",[1114,1535,1443],{"class":1123},[1114,1537,1135],{"class":1123},[1114,1539,1448],{"class":1123},[1114,1541,1542],{"class":1138},"\u002Fapi\u002Fv1\u002Fusers\u002Fsignup",[1114,1544,1545],{"class":1123},"\"\n",[1114,1547,1548],{"class":1116,"line":108},[1114,1549,1314],{"class":1123},[978,1551,1552],{},"Subscriber deployments don't share this constraint — multiple flows\nsubscribing to the same event channel is legitimate fan-out and\nremains supported.",[1060,1554,1556],{"id":1555},"spec-contributions","Spec contributions",[978,1558,1559,1227,1562,1565,1566,1569,1570,1572,1573,1575,1576,1579],{},[1014,1560,1561],{},"\u002Fapi\u002Fv1\u002Fdeployments",[1014,1563,1564],{},"\u002Fapi\u002Fv1\u002Fdeployments\u002F{id}"," enrich each\ndeployment with a ",[1014,1567,1568],{},"contributes"," block — what it adds to the project's\npublished API surface. Computed at request time from the ",[982,1571,1096],{},"\nvariant's flow document so what the UI shows IS what\n",[1014,1574,1334],{}," + ",[1014,1577,1578],{},"\u002Fasyncapi.json"," publish.",[1068,1581,1583],{"className":1422,"code":1582,"language":1424,"meta":1076,"style":1076},"{\n  \"id\": \"route-post-api-v1-users-signup\",\n  \"name\": \"Registration — email confirmation\",\n  \"kind\": \"route\",\n  \"disabled\": false,\n  \"tags\": [\"auto-publish\"],\n  \"variants\": [{ \"label\": \"stable\", \"flowId\": \"flow.…\", \"weight\": 100 }],\n  \"contributes\": {\n    \"routes\": [\n      {\n        \"method\":         \"POST\",\n        \"path\":           \"\u002Fapi\u002Fv1\u002Fusers\u002Fsignup\",\n        \"success_status\": 202,\n        \"summary\":        \"Public signup with email confirmation\"\n      }\n    ],\n    \"events\":  [],\n    \"packets\": [\n      { \"name\": \"UserCreateInput\", \"$ref\": \"openapi:default#\u002Fcomponents\u002Fschemas\u002FUserCreateInput\" },\n      { \"name\": \"UserResponse\",    \"$ref\": \"openapi:default#\u002Fcomponents\u002Fschemas\u002FUserResponse\" }\n    ]\n  }\n}\n",[1014,1584,1585,1589,1608,1628,1647,1660,1684,1747,1760,1775,1780,1800,1819,1835,1853,1858,1863,1877,1890,1931,1970,1975,1980],{"__ignoreMap":1076},[1114,1586,1587],{"class":1116,"line":10},[1114,1588,1431],{"class":1123},[1114,1590,1591,1593,1596,1598,1600,1602,1604,1606],{"class":1116,"line":16},[1114,1592,1436],{"class":1123},[1114,1594,1595],{"class":1439},"id",[1114,1597,1443],{"class":1123},[1114,1599,1135],{"class":1123},[1114,1601,1448],{"class":1123},[1114,1603,1032],{"class":1138},[1114,1605,1443],{"class":1123},[1114,1607,1467],{"class":1123},[1114,1609,1610,1612,1615,1617,1619,1621,1624,1626],{"class":1116,"line":22},[1114,1611,1436],{"class":1123},[1114,1613,1614],{"class":1439},"name",[1114,1616,1443],{"class":1123},[1114,1618,1135],{"class":1123},[1114,1620,1448],{"class":1123},[1114,1622,1623],{"class":1138},"Registration — email confirmation",[1114,1625,1443],{"class":1123},[1114,1627,1467],{"class":1123},[1114,1629,1630,1632,1635,1637,1639,1641,1643,1645],{"class":1116,"line":51},[1114,1631,1436],{"class":1123},[1114,1633,1634],{"class":1439},"kind",[1114,1636,1443],{"class":1123},[1114,1638,1135],{"class":1123},[1114,1640,1448],{"class":1123},[1114,1642,1016],{"class":1138},[1114,1644,1443],{"class":1123},[1114,1646,1467],{"class":1123},[1114,1648,1649,1651,1653,1655,1657],{"class":1116,"line":57},[1114,1650,1436],{"class":1123},[1114,1652,1386],{"class":1439},[1114,1654,1443],{"class":1123},[1114,1656,1135],{"class":1123},[1114,1658,1659],{"class":1123}," false,\n",[1114,1661,1662,1664,1667,1669,1671,1674,1676,1679,1681],{"class":1116,"line":102},[1114,1663,1436],{"class":1123},[1114,1665,1666],{"class":1439},"tags",[1114,1668,1443],{"class":1123},[1114,1670,1135],{"class":1123},[1114,1672,1673],{"class":1123}," [",[1114,1675,1443],{"class":1123},[1114,1677,1678],{"class":1138},"auto-publish",[1114,1680,1443],{"class":1123},[1114,1682,1683],{"class":1123},"],\n",[1114,1685,1686,1688,1690,1692,1694,1697,1699,1702,1704,1706,1708,1710,1712,1715,1717,1719,1721,1723,1725,1728,1730,1732,1734,1737,1739,1741,1744],{"class":1116,"line":108},[1114,1687,1436],{"class":1123},[1114,1689,1120],{"class":1439},[1114,1691,1443],{"class":1123},[1114,1693,1135],{"class":1123},[1114,1695,1696],{"class":1123}," [{",[1114,1698,1448],{"class":1123},[1114,1700,1701],{"class":1279},"label",[1114,1703,1443],{"class":1123},[1114,1705,1135],{"class":1123},[1114,1707,1448],{"class":1123},[1114,1709,1096],{"class":1138},[1114,1711,1443],{"class":1123},[1114,1713,1714],{"class":1123},",",[1114,1716,1448],{"class":1123},[1114,1718,1100],{"class":1279},[1114,1720,1443],{"class":1123},[1114,1722,1135],{"class":1123},[1114,1724,1448],{"class":1123},[1114,1726,1727],{"class":1138},"flow.…",[1114,1729,1443],{"class":1123},[1114,1731,1714],{"class":1123},[1114,1733,1448],{"class":1123},[1114,1735,1736],{"class":1279},"weight",[1114,1738,1443],{"class":1123},[1114,1740,1135],{"class":1123},[1114,1742,1743],{"class":1163}," 100",[1114,1745,1746],{"class":1123}," }],\n",[1114,1748,1749,1751,1753,1755,1757],{"class":1116,"line":114},[1114,1750,1436],{"class":1123},[1114,1752,1568],{"class":1439},[1114,1754,1443],{"class":1123},[1114,1756,1135],{"class":1123},[1114,1758,1759],{"class":1123}," {\n",[1114,1761,1762,1765,1768,1770,1772],{"class":1116,"line":120},[1114,1763,1764],{"class":1123},"    \"",[1114,1766,1767],{"class":1279},"routes",[1114,1769,1443],{"class":1123},[1114,1771,1135],{"class":1123},[1114,1773,1774],{"class":1123}," [\n",[1114,1776,1777],{"class":1116,"line":181},[1114,1778,1779],{"class":1123},"      {\n",[1114,1781,1782,1785,1787,1789,1791,1794,1796,1798],{"class":1116,"line":186},[1114,1783,1784],{"class":1123},"        \"",[1114,1786,1513],{"class":1163},[1114,1788,1443],{"class":1123},[1114,1790,1135],{"class":1123},[1114,1792,1793],{"class":1123},"         \"",[1114,1795,1522],{"class":1138},[1114,1797,1443],{"class":1123},[1114,1799,1467],{"class":1123},[1114,1801,1802,1804,1806,1808,1810,1813,1815,1817],{"class":1116,"line":191},[1114,1803,1784],{"class":1123},[1114,1805,1533],{"class":1163},[1114,1807,1443],{"class":1123},[1114,1809,1135],{"class":1123},[1114,1811,1812],{"class":1123},"           \"",[1114,1814,1542],{"class":1138},[1114,1816,1443],{"class":1123},[1114,1818,1467],{"class":1123},[1114,1820,1821,1823,1826,1828,1830,1833],{"class":1116,"line":197},[1114,1822,1784],{"class":1123},[1114,1824,1825],{"class":1163},"success_status",[1114,1827,1443],{"class":1123},[1114,1829,1135],{"class":1123},[1114,1831,1832],{"class":1163}," 202",[1114,1834,1467],{"class":1123},[1114,1836,1837,1839,1842,1844,1846,1848,1851],{"class":1116,"line":203},[1114,1838,1784],{"class":1123},[1114,1840,1841],{"class":1163},"summary",[1114,1843,1443],{"class":1123},[1114,1845,1135],{"class":1123},[1114,1847,1784],{"class":1123},[1114,1849,1850],{"class":1138},"Public signup with email confirmation",[1114,1852,1545],{"class":1123},[1114,1854,1855],{"class":1116,"line":214},[1114,1856,1857],{"class":1123},"      }\n",[1114,1859,1860],{"class":1116,"line":223},[1114,1861,1862],{"class":1123},"    ],\n",[1114,1864,1865,1867,1870,1872,1874],{"class":1116,"line":229},[1114,1866,1764],{"class":1123},[1114,1868,1869],{"class":1279},"events",[1114,1871,1443],{"class":1123},[1114,1873,1135],{"class":1123},[1114,1875,1876],{"class":1123},"  [],\n",[1114,1878,1879,1881,1884,1886,1888],{"class":1116,"line":234},[1114,1880,1764],{"class":1123},[1114,1882,1883],{"class":1279},"packets",[1114,1885,1443],{"class":1123},[1114,1887,1135],{"class":1123},[1114,1889,1774],{"class":1123},[1114,1891,1892,1895,1897,1899,1901,1903,1905,1908,1910,1912,1914,1917,1919,1921,1923,1926,1928],{"class":1116,"line":240},[1114,1893,1894],{"class":1123},"      {",[1114,1896,1448],{"class":1123},[1114,1898,1614],{"class":1163},[1114,1900,1443],{"class":1123},[1114,1902,1135],{"class":1123},[1114,1904,1448],{"class":1123},[1114,1906,1907],{"class":1138},"UserCreateInput",[1114,1909,1443],{"class":1123},[1114,1911,1714],{"class":1123},[1114,1913,1448],{"class":1123},[1114,1915,1916],{"class":1163},"$ref",[1114,1918,1443],{"class":1123},[1114,1920,1135],{"class":1123},[1114,1922,1448],{"class":1123},[1114,1924,1925],{"class":1138},"openapi:default#\u002Fcomponents\u002Fschemas\u002FUserCreateInput",[1114,1927,1443],{"class":1123},[1114,1929,1930],{"class":1123}," },\n",[1114,1932,1933,1935,1937,1939,1941,1943,1945,1948,1950,1952,1954,1956,1958,1960,1962,1965,1967],{"class":1116,"line":246},[1114,1934,1894],{"class":1123},[1114,1936,1448],{"class":1123},[1114,1938,1614],{"class":1163},[1114,1940,1443],{"class":1123},[1114,1942,1135],{"class":1123},[1114,1944,1448],{"class":1123},[1114,1946,1947],{"class":1138},"UserResponse",[1114,1949,1443],{"class":1123},[1114,1951,1714],{"class":1123},[1114,1953,1764],{"class":1123},[1114,1955,1916],{"class":1163},[1114,1957,1443],{"class":1123},[1114,1959,1135],{"class":1123},[1114,1961,1448],{"class":1123},[1114,1963,1964],{"class":1138},"openapi:default#\u002Fcomponents\u002Fschemas\u002FUserResponse",[1114,1966,1443],{"class":1123},[1114,1968,1969],{"class":1123}," }\n",[1114,1971,1972],{"class":1116,"line":251},[1114,1973,1974],{"class":1123},"    ]\n",[1114,1976,1977],{"class":1116,"line":257},[1114,1978,1979],{"class":1123},"  }\n",[1114,1981,1983],{"class":1116,"line":1982},23,[1114,1984,1314],{"class":1123},[978,1986,1987],{},"A subscriber deployment's contributions are events + packets:",[1068,1989,1991],{"className":1422,"code":1990,"language":1424,"meta":1076,"style":1076},"{\n  \"id\":   \"subscriber-users-email-verify-handler\",\n  \"kind\": \"subscriber\",\n  \"tags\": [\"auto-publish\", \"subscriber\", \"users\u002Femail-verify-handler\", \"verification.token_verified\"],\n  \"contributes\": {\n    \"events\": [\n      { \"name\": \"verification.token_verified\", \"filter\": \"payload.kind == \\\"email\\\"\", \"direction\": \"subscribe\" }\n    ]\n  }\n}\n",[1014,1992,1993,1997,2016,2034,2080,2092,2104,2167,2171,2175],{"__ignoreMap":1076},[1114,1994,1995],{"class":1116,"line":10},[1114,1996,1431],{"class":1123},[1114,1998,1999,2001,2003,2005,2007,2010,2012,2014],{"class":1116,"line":16},[1114,2000,1436],{"class":1123},[1114,2002,1595],{"class":1439},[1114,2004,1443],{"class":1123},[1114,2006,1135],{"class":1123},[1114,2008,2009],{"class":1123},"   \"",[1114,2011,1051],{"class":1138},[1114,2013,1443],{"class":1123},[1114,2015,1467],{"class":1123},[1114,2017,2018,2020,2022,2024,2026,2028,2030,2032],{"class":1116,"line":22},[1114,2019,1436],{"class":1123},[1114,2021,1634],{"class":1439},[1114,2023,1443],{"class":1123},[1114,2025,1135],{"class":1123},[1114,2027,1448],{"class":1123},[1114,2029,1040],{"class":1138},[1114,2031,1443],{"class":1123},[1114,2033,1467],{"class":1123},[1114,2035,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2067,2069,2071,2073,2076,2078],{"class":1116,"line":51},[1114,2037,1436],{"class":1123},[1114,2039,1666],{"class":1439},[1114,2041,1443],{"class":1123},[1114,2043,1135],{"class":1123},[1114,2045,1673],{"class":1123},[1114,2047,1443],{"class":1123},[1114,2049,1678],{"class":1138},[1114,2051,1443],{"class":1123},[1114,2053,1714],{"class":1123},[1114,2055,1448],{"class":1123},[1114,2057,1040],{"class":1138},[1114,2059,1443],{"class":1123},[1114,2061,1714],{"class":1123},[1114,2063,1448],{"class":1123},[1114,2065,2066],{"class":1138},"users\u002Femail-verify-handler",[1114,2068,1443],{"class":1123},[1114,2070,1714],{"class":1123},[1114,2072,1448],{"class":1123},[1114,2074,2075],{"class":1138},"verification.token_verified",[1114,2077,1443],{"class":1123},[1114,2079,1683],{"class":1123},[1114,2081,2082,2084,2086,2088,2090],{"class":1116,"line":57},[1114,2083,1436],{"class":1123},[1114,2085,1568],{"class":1439},[1114,2087,1443],{"class":1123},[1114,2089,1135],{"class":1123},[1114,2091,1759],{"class":1123},[1114,2093,2094,2096,2098,2100,2102],{"class":1116,"line":102},[1114,2095,1764],{"class":1123},[1114,2097,1869],{"class":1279},[1114,2099,1443],{"class":1123},[1114,2101,1135],{"class":1123},[1114,2103,1774],{"class":1123},[1114,2105,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126,2129,2131,2133,2135,2138,2140,2143,2145,2147,2149,2151,2154,2156,2158,2160,2163,2165],{"class":1116,"line":108},[1114,2107,1894],{"class":1123},[1114,2109,1448],{"class":1123},[1114,2111,1614],{"class":1163},[1114,2113,1443],{"class":1123},[1114,2115,1135],{"class":1123},[1114,2117,1448],{"class":1123},[1114,2119,2075],{"class":1138},[1114,2121,1443],{"class":1123},[1114,2123,1714],{"class":1123},[1114,2125,1448],{"class":1123},[1114,2127,2128],{"class":1163},"filter",[1114,2130,1443],{"class":1123},[1114,2132,1135],{"class":1123},[1114,2134,1448],{"class":1123},[1114,2136,2137],{"class":1138},"payload.kind == ",[1114,2139,1455],{"class":1454},[1114,2141,2142],{"class":1138},"email",[1114,2144,1455],{"class":1454},[1114,2146,1443],{"class":1123},[1114,2148,1714],{"class":1123},[1114,2150,1448],{"class":1123},[1114,2152,2153],{"class":1163},"direction",[1114,2155,1443],{"class":1123},[1114,2157,1135],{"class":1123},[1114,2159,1448],{"class":1123},[1114,2161,2162],{"class":1138},"subscribe",[1114,2164,1443],{"class":1123},[1114,2166,1969],{"class":1123},[1114,2168,2169],{"class":1116,"line":114},[1114,2170,1974],{"class":1123},[1114,2172,2173],{"class":1116,"line":120},[1114,2174,1979],{"class":1123},[1114,2176,2177],{"class":1116,"line":181},[1114,2178,1314],{"class":1123},[978,2180,2181],{},"The three contribution kinds map to the three published-spec consumers:",[987,2183,2184,2194],{},[990,2185,2186],{},[993,2187,2188,2191],{},[996,2189,2190],{},"Contribution",[996,2192,2193],{},"Surfaces in",[1006,2195,2196,2207,2218],{},[993,2197,2198,2202],{},[1011,2199,2200],{},[1014,2201,1767],{},[1011,2203,2204],{},[1014,2205,2206],{},"\u002Fopenapi.json#\u002Fpaths\u002F...",[993,2208,2209,2213],{},[1011,2210,2211],{},[1014,2212,1869],{},[1011,2214,2215],{},[1014,2216,2217],{},"\u002Fasyncapi.json#\u002Fchannels\u002F...",[993,2219,2220,2224],{},[1011,2221,2222],{},[1014,2223,1883],{},[1011,2225,2226,2228,2229,2231,2232,2235,2236,2238],{},[1014,2227,1334],{}," or ",[1014,2230,1578],{}," ",[1014,2233,2234],{},"#\u002Fcomponents\u002F..."," (depending on the ",[1014,2237,1916],{}," namespace)",[1060,2240,2241],{"id":1666},"Tags",[978,2243,2244,2245,2248],{},"Deployments expose a flat ",[1014,2246,2247],{},"tags []string"," derived from their labels:",[1214,2250,2251,2266],{},[1217,2252,2253,2254,2257,2258,2261,2262,2265],{},"Labels with the ",[1014,2255,2256],{},"tag:"," prefix → surfaced as a tag (",[1014,2259,2260],{},"tag:owner=ops"," → ",[1014,2263,2264],{},"owner=ops",").",[1217,2267,2268,2269,2272,2273,2272,2276,2272,2279,2282],{},"Canonical labels (",[1014,2270,2271],{},"x-source",", ",[1014,2274,2275],{},"x-template-id",[1014,2277,2278],{},"x-event",[1014,2280,2281],{},"x-kind",") →\nsurfaced as tags so admins can filter on them without learning the\nlabel vocabulary.",[978,2284,1256,2285,2287,2288,2290],{},[1014,2286,1057],{}," UI shows clickable tag chips that toggle a\nfilter — admins can scope to \"show me everything tagged\n",[1014,2289,2066],{},"\" or \"show me every auto-published\ndeployment\" with one click.",[978,2292,2293],{},"To add custom tags, set them via labels:",[1068,2295,2297],{"className":1270,"code":2296,"language":1272,"meta":1076,"style":1076},"PATCH \u002Fapi\u002Fv1\u002Fdeployments\u002F{id}\n{\"labels\": {\"tag:owner\": \"ops\", \"tag:env\": \"production\"}}\n",[1014,2298,2299,2305],{"__ignoreMap":1076},[1114,2300,2301,2303],{"class":1116,"line":10},[1114,2302,1280],{"class":1279},[1114,2304,1283],{"class":1138},[1114,2306,2307,2309,2312,2314,2317,2319,2322,2324,2326,2328,2331,2333,2335,2337,2340,2342,2344,2346,2349,2351],{"class":1116,"line":16},[1114,2308,1302],{"class":1123},[1114,2310,2311],{"class":1279},"\"labels\"",[1114,2313,1135],{"class":1308},[1114,2315,2316],{"class":1138}," {",[1114,2318,1443],{"class":1123},[1114,2320,2321],{"class":1138},"tag:owner",[1114,2323,1443],{"class":1123},[1114,2325,1135],{"class":1138},[1114,2327,1448],{"class":1123},[1114,2329,2330],{"class":1138},"ops",[1114,2332,1443],{"class":1123},[1114,2334,1714],{"class":1138},[1114,2336,1448],{"class":1123},[1114,2338,2339],{"class":1138},"tag:env",[1114,2341,1443],{"class":1123},[1114,2343,1135],{"class":1138},[1114,2345,1448],{"class":1123},[1114,2347,2348],{"class":1138},"production",[1114,2350,1443],{"class":1123},[1114,2352,2353],{"class":1138},"}}\n",[1060,2355,2357,2358],{"id":2356},"lifecycle-from-metapublish_with","Lifecycle from ",[1014,2359,2360],{},"meta.publish_with",[978,2362,2363],{},"A registration template can declare runtime dependencies that get\nauto-published alongside it:",[1068,2365,2367],{"className":1422,"code":2366,"language":1424,"meta":1076,"style":1076},"{\n  \"id\": \"users-registration-email-confirm\",\n  ...\n  \"meta\": {\n    \"publish_with\": [\"users\u002Femail-verify-handler\"]\n  }\n}\n",[1014,2368,2369,2373,2392,2397,2410,2432,2436],{"__ignoreMap":1076},[1114,2370,2371],{"class":1116,"line":10},[1114,2372,1431],{"class":1123},[1114,2374,2375,2377,2379,2381,2383,2385,2388,2390],{"class":1116,"line":16},[1114,2376,1436],{"class":1123},[1114,2378,1595],{"class":1439},[1114,2380,1443],{"class":1123},[1114,2382,1135],{"class":1123},[1114,2384,1448],{"class":1123},[1114,2386,2387],{"class":1138},"users-registration-email-confirm",[1114,2389,1443],{"class":1123},[1114,2391,1467],{"class":1123},[1114,2393,2394],{"class":1116,"line":22},[1114,2395,2396],{"class":1454},"  ...\n",[1114,2398,2399,2401,2404,2406,2408],{"class":1116,"line":51},[1114,2400,1436],{"class":1123},[1114,2402,2403],{"class":1439},"meta",[1114,2405,1443],{"class":1123},[1114,2407,1135],{"class":1123},[1114,2409,1759],{"class":1123},[1114,2411,2412,2414,2417,2419,2421,2423,2425,2427,2429],{"class":1116,"line":57},[1114,2413,1764],{"class":1123},[1114,2415,2416],{"class":1279},"publish_with",[1114,2418,1443],{"class":1123},[1114,2420,1135],{"class":1123},[1114,2422,1673],{"class":1123},[1114,2424,1443],{"class":1123},[1114,2426,2066],{"class":1138},[1114,2428,1443],{"class":1123},[1114,2430,2431],{"class":1123},"]\n",[1114,2433,2434],{"class":1116,"line":102},[1114,2435,1979],{"class":1123},[1114,2437,2438],{"class":1116,"line":108},[1114,2439,1314],{"class":1123},[978,2441,2442,2443,1135],{},"When the operator activates ",[1014,2444,2445],{},"users\u002Fregistration-email-confirm",[2447,2448,2449,2458,2468,2474],"ol",{},[1217,2450,2451,2454,2455,2457],{},[1014,2452,2453],{},"ActivateTemplate"," publishes the registration flow + creates\n",[1014,2456,1032],{}," deployment.",[1217,2459,2460,2461,2463,2464,2467],{},"Walks ",[1014,2462,2360],{}," → calls ",[1014,2465,2466],{},"EnsureTemplatePublished"," for\neach — idempotent, reuses already-running handler flows.",[1217,2469,2470,2471,2457],{},"Each handler dependency that wasn't already published creates its\n",[1014,2472,2473],{},"subscriber-\u003Ctemplate-id>",[1217,2475,2476],{},"The activation response echoes which deps were freshly published:",[1068,2478,2480],{"className":1422,"code":2479,"language":1424,"meta":1076,"style":1076},"{\n  \"flow_id\":        \"flow.d52767d6-…\",\n  \"template_id\":    \"users\u002Fregistration-email-confirm\",\n  \"method\":         \"POST\",\n  \"path\":           \"\u002Fapi\u002Fv1\u002Fusers\u002Fsignup\",\n  \"published_with\": [\"users\u002Femail-verify-handler\"]\n}\n",[1014,2481,2482,2486,2506,2525,2543,2561,2582],{"__ignoreMap":1076},[1114,2483,2484],{"class":1116,"line":10},[1114,2485,1431],{"class":1123},[1114,2487,2488,2490,2493,2495,2497,2499,2502,2504],{"class":1116,"line":16},[1114,2489,1436],{"class":1123},[1114,2491,2492],{"class":1439},"flow_id",[1114,2494,1443],{"class":1123},[1114,2496,1135],{"class":1123},[1114,2498,1784],{"class":1123},[1114,2500,2501],{"class":1138},"flow.d52767d6-…",[1114,2503,1443],{"class":1123},[1114,2505,1467],{"class":1123},[1114,2507,2508,2510,2513,2515,2517,2519,2521,2523],{"class":1116,"line":22},[1114,2509,1436],{"class":1123},[1114,2511,2512],{"class":1439},"template_id",[1114,2514,1443],{"class":1123},[1114,2516,1135],{"class":1123},[1114,2518,1764],{"class":1123},[1114,2520,2445],{"class":1138},[1114,2522,1443],{"class":1123},[1114,2524,1467],{"class":1123},[1114,2526,2527,2529,2531,2533,2535,2537,2539,2541],{"class":1116,"line":51},[1114,2528,1436],{"class":1123},[1114,2530,1513],{"class":1439},[1114,2532,1443],{"class":1123},[1114,2534,1135],{"class":1123},[1114,2536,1793],{"class":1123},[1114,2538,1522],{"class":1138},[1114,2540,1443],{"class":1123},[1114,2542,1467],{"class":1123},[1114,2544,2545,2547,2549,2551,2553,2555,2557,2559],{"class":1116,"line":57},[1114,2546,1436],{"class":1123},[1114,2548,1533],{"class":1439},[1114,2550,1443],{"class":1123},[1114,2552,1135],{"class":1123},[1114,2554,1812],{"class":1123},[1114,2556,1542],{"class":1138},[1114,2558,1443],{"class":1123},[1114,2560,1467],{"class":1123},[1114,2562,2563,2565,2568,2570,2572,2574,2576,2578,2580],{"class":1116,"line":102},[1114,2564,1436],{"class":1123},[1114,2566,2567],{"class":1439},"published_with",[1114,2569,1443],{"class":1123},[1114,2571,1135],{"class":1123},[1114,2573,1673],{"class":1123},[1114,2575,1443],{"class":1123},[1114,2577,2066],{"class":1138},[1114,2579,1443],{"class":1123},[1114,2581,2431],{"class":1123},[1114,2583,2584],{"class":1116,"line":108},[1114,2585,1314],{"class":1123},[978,2587,2588,2590],{},[1014,2589,2567],{}," is empty when every dep was already running — the\nadmin UI uses this to show a quieter toast on re-activations.",[978,2592,2593,2594,2261,2597,2600],{},"This is how confirmation-style signup ships intact: activate\n",[1014,2595,2596],{},"registration-email-confirm",[1014,2598,2599],{},"email-verify-handler"," becomes an\nevent subscriber automatically → user clicks the verification link →\naccount flips to active. No manual handler-publishing step.",[1060,2602,2604],{"id":2603},"admin-endpoints","Admin endpoints",[987,2606,2607,2619],{},[990,2608,2609],{},[993,2610,2611,2614,2617],{},[996,2612,2613],{},"Method",[996,2615,2616],{},"Path",[996,2618,1001],{},[1006,2620,2621,2644,2657,2670,2689,2703],{},[993,2622,2623,2628,2632],{},[1011,2624,2625],{},[1014,2626,2627],{},"GET",[1011,2629,2630],{},[1014,2631,1561],{},[1011,2633,2634,2635,2272,2637,2272,2639,2272,2641,2643],{},"List all deployments with ",[1014,2636,1634],{},[1014,2638,1666],{},[1014,2640,1386],{},[1014,2642,1568],{}," enrichment",[993,2645,2646,2650,2654],{},[1011,2647,2648],{},[1014,2649,2627],{},[1011,2651,2652],{},[1014,2653,1564],{},[1011,2655,2656],{},"Full deployment with same enrichment",[993,2658,2659,2663,2667],{},[1011,2660,2661],{},[1014,2662,1522],{},[1011,2664,2665],{},[1014,2666,1561],{},[1011,2668,2669],{},"Create — fails 409 if any variant claims an already-owned route",[993,2671,2672,2676,2680],{},[1011,2673,2674],{},[1014,2675,1280],{},[1011,2677,2678],{},[1014,2679,1564],{},[1011,2681,2682,2683,2685,2686,2688],{},"Patch any field; ",[1014,2684,1386],{}," triggers re-sync; ",[1014,2687,1120],{}," triggers route-conflict check",[993,2690,2691,2696,2700],{},[1011,2692,2693],{},[1014,2694,2695],{},"DELETE",[1011,2697,2698],{},[1014,2699,1564],{},[1011,2701,2702],{},"Delete (requires admin)",[993,2704,2705,2709,2714],{},[1011,2706,2707],{},[1014,2708,1522],{},[1011,2710,2711],{},[1014,2712,2713],{},"\u002Fapi\u002Fv1\u002Fdeployments\u002F{id}\u002Fvariants\u002Ffrom-template",[1011,2715,2716],{},"Append a canary variant created from a template in one call",[978,2718,2719,2720,1105],{},"All paths require ",[1014,2721,2722],{},"auth.RequireActiveUser + auth.RequirePermission(\"admin:access\")",[1060,2724,2726],{"id":2725},"statistics-deferred","Statistics (deferred)",[978,2728,2729],{},"Per-deployment usage statistics are scoped for a future iteration:",[1214,2731,2732,2746],{},[1217,2733,2734,2735,2738,2739,2742,2743,1105],{},"Per-flow ",[1014,2736,2737],{},"Frame"," metrics (run rate, latency p50\u002F95\u002F99, error rate,\nsaturation, cost-per-hour) already exist — keyed by ",[1014,2740,2741],{},"flowID"," in\n",[1014,2744,2745],{},"flowexec\u002Fmetrics\u002Ftypes.go",[1217,2747,2748,2749,2752,2753,1105],{},"Aggregating per-deployment requires a weighted rollup across\nvariants; the foundation is in place (deployment ID → variants →\nflow IDs → metrics) and ClickHouse archival is a contained follow-up\nwhen ",[1014,2750,2751],{},"CLICKHOUSE_URL"," is set in ",[1014,2754,2755],{},"infra\u002Fdocker-compose.yml",[978,2757,2758,2759,2762],{},"When wired, the ",[1014,2760,2761],{},"\u002Fflows\u002Fdeployments\u002F{id}"," page gets a sparkline +\nheadline KPIs; the list page gets per-row inline traffic numbers.",[1060,2764,2766],{"id":2765},"design-rationale","Design rationale",[1214,2768,2769,2775,2787,2796,2805],{},[1217,2770,2771,2774],{},[982,2772,2773],{},"Deployment as the dispatch unit."," Flows are the implementation;\ndeployments are the contract. Operators reason about deployments\n(\"which signup flow is live?\", \"is the email handler subscribed?\")\nwithout needing to know which flow ID is currently behind the\nvariant. SDK generators iterate deployments, not flows.",[1217,2776,2777,2780,2781,1467,2784,2786],{},[982,2778,2779],{},"Idempotent IDs."," Deterministic IDs (",[1014,2782,2783],{},"route-\u003Cmethod>-\u003Cpath>",[1014,2785,2473],{},") mean the auto-managed paths never spawn\nduplicates. Re-activating a template patches the existing deployment;\nre-publishing a handler reuses the same subscriber deployment.",[1217,2788,2789,2792,2793,2795],{},[982,2790,2791],{},"Disabled ≠ deleted."," The ",[1014,2794,1386],{}," flag is the soft-pause\nsemantic operators need for maintenance windows + emergency rollback.\nRe-enabling is one PATCH with no flow loss. Deletion is the\ndestructive escape hatch — the UI nudges towards Disable for\nreversible workflows.",[1217,2797,2798,2801,2802,2804],{},[982,2799,2800],{},"Route-uniqueness is structural."," Two deployments claiming the\nsame ",[1014,2803,1022],{}," is representation-impossible regardless of\nactivation state. Avoids the entire class of \"I disabled X then\nenabled Y, why is the route still serving X?\" bugs.",[1217,2806,2807,2810],{},[982,2808,2809],{},"Subscriber deployments fan-out."," Multiple subscriber deployments\non the same event channel is legit (fan-out is the point of an event\nbus). Only routes are unique.",[2812,2813,2814],"style",{},"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 .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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":1076,"searchDepth":16,"depth":16,"links":2816},[2817,2818,2819,2821,2822,2823,2824,2826,2827,2828],{"id":1062,"depth":16,"text":1063},{"id":1089,"depth":16,"text":1090},{"id":1255,"depth":16,"text":2820},"The Disabled flag",{"id":1373,"depth":16,"text":1374},{"id":1555,"depth":16,"text":1556},{"id":1666,"depth":16,"text":2241},{"id":2356,"depth":16,"text":2825},"Lifecycle from meta.publish_with",{"id":2603,"depth":16,"text":2604},{"id":2725,"depth":16,"text":2726},{"id":2765,"depth":16,"text":2766},"The dispatch unit between modules and flows. Wraps every published\nflow with a stable ID, canary\u002FA-B variant routing, an enable\u002Fdisable\ntoggle, and a contract describing what the flow contributes to\n\u002Fopenapi.json + \u002Fasyncapi.json.\n","md",null,{},{"title":264,"description":2829},"nlumk3y1geTQUiRr7aS-R6Htq4e4JFD82PkDJzns9eQ",[2836,2838],{"title":260,"path":261,"stem":262,"description":2837,"children":-1},"Mount FlowDSL flows as HTTP routes. Domain modules contribute nodes;\nflowexec owns the HTTP↔flow bridge. Schemas attach to edges as\npackets (one ref → three rendered forms: stored, \u002Fopenapi.json,\nStudio); the http-endpoint source node carries only routing +\nspec metadata. Flow templates ship in per-module flowtemplates\u002F\npackages and auto-publish at startup so endpoints work out of\nthe box.\n",{"title":268,"path":269,"stem":270,"description":2839,"order":271,"icon":272,"children":-1},"Request-locale resolution, a Mongo-backed message catalog with a locale fallback chain, admin CRUD, and FlowDSL nodes for translating inside flows.",1790332226537]