[{"data":1,"prerenderedAt":3852},["ShallowReactive",2],{"navigation_docs":3,"-docs-reference-go-modules":968,"-docs-reference-go-modules-surround":3847},[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":140,"body":970,"description":3840,"extension":3841,"links":3842,"meta":3843,"navigation":3844,"path":141,"seo":3845,"stem":142,"__hash__":3846},"docs\u002Fdocs\u002F4.reference\u002F02.go-modules.md",{"type":971,"value":972,"toc":3787},"minimark",[973,977,986,993,1007,1012,1167,1171,1174,1235,1238,1241,1243,1248,1255,1262,1267,1327,1330,1384,1388,1447,1451,1573,1577,1580,1601,1603,1605,1610,1613,1619,1623,1825,1828,1926,1929,1971,1975,1978,2010,2013,2086,2088,2090,2095,2102,2108,2112,2211,2214,2256,2259,2262,2265,2292,2296,2304,2333,2335,2337,2342,2348,2351,2374,2384,2386,2388,2393,2396,2402,2406,2438,2442,2445,2521,2525,2528,2566,2573,2599,2602,2659,2661,2663,2668,2685,2691,2694,2729,2733,2743,2749,2764,2767,2830,2832,2834,2839,2850,2856,2860,2888,2892,2970,2974,2980,3083,3090,3094,3101,3200,3202,3204,3209,3212,3218,3221,3253,3257,3319,3323,3328,3595,3598,3679,3681,3685,3688,3694,3701,3705,3768,3770,3774,3783],[974,975,140],"h1",{"id":976},"built-in-modules",[978,979,980,981,985],"p",{},"Redelay's Go framework ships with ",[982,983,984],"strong",{},"8 production-ready modules"," that cover the most common needs of any backend application. Each module is self-contained, auto-discovered via blank imports, and fully described through YAML spec files with auto-generated SVG diagrams.",[987,988,989,992],"callout",{"icon":46},[982,990,991],{},"Zero configuration required"," — every module works out of the box with sensible defaults. Customize behavior via environment variables or programmatic overrides.",[987,994,995,996,999,1000,1003,1004,1006],{"icon":41},"For ",[982,997,998],{},"generic infrastructure nodes"," (Redis, Mongo, HTTP, filesys, SMS, FTP, Postgres, ClickHouse, RabbitMQ) to compose in FlowDSL flows, see ",[1001,1002,226],"a",{"href":227}," and the ",[1001,1005,318],{"href":313},".",[1008,1009,1011],"h2",{"id":1010},"at-a-glance","At a glance",[1013,1014,1015,1031],"table",{},[1016,1017,1018],"thead",{},[1019,1020,1021,1025,1028],"tr",{},[1022,1023,1024],"th",{},"Module",[1022,1026,1027],{},"What it does",[1022,1029,1030],{},"Key features",[1032,1033,1034,1051,1067,1083,1103,1119,1135,1151],"tbody",{},[1019,1035,1036,1045,1048],{},[1037,1038,1039],"td",{},[1001,1040,1042],{"href":1041},"#auth",[982,1043,1044],{},"auth",[1037,1046,1047],{},"JWT authentication & token management",[1037,1049,1050],{},"Access + refresh tokens, OAuth2 password flow, middleware",[1019,1052,1053,1061,1064],{},[1037,1054,1055],{},[1001,1056,1058],{"href":1057},"#users",[982,1059,1060],{},"users",[1037,1062,1063],{},"User CRUD & profile management",[1037,1065,1066],{},"15-field user entity, pagination, bcrypt hashing",[1019,1068,1069,1077,1080],{},[1037,1070,1071],{},[1001,1072,1074],{"href":1073},"#groups",[982,1075,1076],{},"groups",[1037,1078,1079],{},"Groups & permission resolution",[1037,1081,1082],{},"Role-based permissions, group membership",[1019,1084,1085,1093,1096],{},[1037,1086,1087],{},[1001,1088,1090],{"href":1089},"#health",[982,1091,1092],{},"health",[1037,1094,1095],{},"Health check endpoint",[1037,1097,1098,1102],{},[1099,1100,1101],"code",{},"\u002Fhealth"," readiness probe",[1019,1104,1105,1113,1116],{},[1037,1106,1107],{},[1001,1108,1110],{"href":1109},"#openapi",[982,1111,1112],{},"openapi",[1037,1114,1115],{},"OpenAPI 3.0 spec & API docs UI",[1037,1117,1118],{},"Scalar \u002F Swagger UI \u002F Redoc, auto-generated spec",[1019,1120,1121,1129,1132],{},[1037,1122,1123],{},[1001,1124,1126],{"href":1125},"#asyncapi",[982,1127,1128],{},"asyncapi",[1037,1130,1131],{},"AsyncAPI 2.6 spec & event browser UI",[1037,1133,1134],{},"Auto-generated from event definitions, AsyncAPI Studio",[1019,1136,1137,1145,1148],{},[1037,1138,1139],{},[1001,1140,1142],{"href":1141},"#mcp",[982,1143,1144],{},"mcp",[1037,1146,1147],{},"Model Context Protocol server",[1037,1149,1150],{},"Tool auto-discovery from modules",[1019,1152,1153,1161,1164],{},[1037,1154,1155],{},[1001,1156,1158],{"href":1157},"#modspec",[982,1159,1160],{},"modspec",[1037,1162,1163],{},"Module spec browser & diagrams",[1037,1165,1166],{},"Interactive hub with routes, events, consumers + links to OpenAPI & AsyncAPI",[1008,1168,1170],{"id":1169},"quick-start","Quick start",[978,1172,1173],{},"Enable modules with blank imports — the framework auto-discovers and wires them:",[1175,1176,1181],"pre",{"className":1177,"code":1178,"language":1179,"meta":1180,"style":1180},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import (\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fauth\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fusers\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fgroups\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fhealth\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fopenapi\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fasyncapi\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fmcp\"\n    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fmodspec\"\n)\n","go","",[1099,1182,1183,1190,1195,1200,1205,1210,1215,1220,1225,1230],{"__ignoreMap":1180},[1184,1185,1187],"span",{"class":1186,"line":10},"line",[1184,1188,1189],{},"import (\n",[1184,1191,1192],{"class":1186,"line":16},[1184,1193,1194],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fauth\"\n",[1184,1196,1197],{"class":1186,"line":22},[1184,1198,1199],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fusers\"\n",[1184,1201,1202],{"class":1186,"line":51},[1184,1203,1204],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fgroups\"\n",[1184,1206,1207],{"class":1186,"line":57},[1184,1208,1209],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fhealth\"\n",[1184,1211,1212],{"class":1186,"line":102},[1184,1213,1214],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fopenapi\"\n",[1184,1216,1217],{"class":1186,"line":108},[1184,1218,1219],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fasyncapi\"\n",[1184,1221,1222],{"class":1186,"line":114},[1184,1223,1224],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fmcp\"\n",[1184,1226,1227],{"class":1186,"line":120},[1184,1228,1229],{},"    _ \"github.com\u002Fredelay\u002Fgo-framework\u002Fmodules\u002Fmodspec\"\n",[1184,1231,1232],{"class":1186,"line":181},[1184,1233,1234],{},")\n",[978,1236,1237],{},"That's it. All routes, middleware, and cross-module dependencies are resolved automatically.",[1239,1240],"hr",{},[1008,1242,1044],{"id":1044},[978,1244,1245],{},[982,1246,1247],{},"JWT authentication with refresh token rotation, OAuth2 password flow, and fine-grained middleware.",[978,1249,1250,1251,1254],{},"The auth module handles the complete authentication lifecycle — from login to token refresh to revocation. It supports both JSON and ",[1099,1252,1253],{},"application\u002Fx-www-form-urlencoded"," (OAuth2 password flow) for the login endpoint, making it compatible with Scalar, Swagger UI, and any OAuth2 client.",[978,1256,1257],{},[1258,1259],"img",{"alt":1260,"src":1261},"Auth module diagram","\u002Fdiagrams\u002Fauth.svg",[1263,1264,1266],"h3",{"id":1265},"routes","Routes",[1013,1268,1269,1282],{},[1016,1270,1271],{},[1019,1272,1273,1276,1279],{},[1022,1274,1275],{},"Method",[1022,1277,1278],{},"Path",[1022,1280,1281],{},"Description",[1032,1283,1284,1299,1313],{},[1019,1285,1286,1291,1296],{},[1037,1287,1288],{},[1099,1289,1290],{},"POST",[1037,1292,1293],{},[1099,1294,1295],{},"\u002Fauth\u002Flogin",[1037,1297,1298],{},"Authenticate and receive access + refresh tokens",[1019,1300,1301,1305,1310],{},[1037,1302,1303],{},[1099,1304,1290],{},[1037,1306,1307],{},[1099,1308,1309],{},"\u002Fauth\u002Frefresh",[1037,1311,1312],{},"Rotate the refresh token",[1019,1314,1315,1319,1324],{},[1037,1316,1317],{},[1099,1318,1290],{},[1037,1320,1321],{},[1099,1322,1323],{},"\u002Fauth\u002Frevoke",[1037,1325,1326],{},"Revoke a refresh token",[1263,1328,33],{"id":1329},"events",[1013,1331,1332,1342],{},[1016,1333,1334],{},[1019,1335,1336,1339],{},[1022,1337,1338],{},"Event",[1022,1340,1341],{},"Trigger",[1032,1343,1344,1354,1364,1374],{},[1019,1345,1346,1351],{},[1037,1347,1348],{},[1099,1349,1350],{},"auth.login",[1037,1352,1353],{},"Successful authentication",[1019,1355,1356,1361],{},[1037,1357,1358],{},[1099,1359,1360],{},"auth.login_failed",[1037,1362,1363],{},"Failed login attempt (bad credentials)",[1019,1365,1366,1371],{},[1037,1367,1368],{},[1099,1369,1370],{},"auth.token_refreshed",[1037,1372,1373],{},"Token successfully rotated",[1019,1375,1376,1381],{},[1037,1377,1378],{},[1099,1379,1380],{},"auth.token_revoked",[1037,1382,1383],{},"Refresh token revoked",[1263,1385,1387],{"id":1386},"middleware","Middleware",[1175,1389,1391],{"className":1177,"code":1390,"language":1179,"meta":1180,"style":1180},"\u002F\u002F Require valid JWT on all routes in a group\nr.Use(auth.AuthMiddleware)\n\n\u002F\u002F Optional — populate user context if token present\nr.Use(auth.OptionalAuth)\n\n\u002F\u002F Restrict to superusers\nr.Use(auth.RequireSuperuser)\n\n\u002F\u002F Check specific permission\nr.Use(auth.RequirePermission(\"users.write\"))\n",[1099,1392,1393,1398,1403,1409,1414,1419,1423,1428,1433,1437,1442],{"__ignoreMap":1180},[1184,1394,1395],{"class":1186,"line":10},[1184,1396,1397],{},"\u002F\u002F Require valid JWT on all routes in a group\n",[1184,1399,1400],{"class":1186,"line":16},[1184,1401,1402],{},"r.Use(auth.AuthMiddleware)\n",[1184,1404,1405],{"class":1186,"line":22},[1184,1406,1408],{"emptyLinePlaceholder":1407},true,"\n",[1184,1410,1411],{"class":1186,"line":51},[1184,1412,1413],{},"\u002F\u002F Optional — populate user context if token present\n",[1184,1415,1416],{"class":1186,"line":57},[1184,1417,1418],{},"r.Use(auth.OptionalAuth)\n",[1184,1420,1421],{"class":1186,"line":102},[1184,1422,1408],{"emptyLinePlaceholder":1407},[1184,1424,1425],{"class":1186,"line":108},[1184,1426,1427],{},"\u002F\u002F Restrict to superusers\n",[1184,1429,1430],{"class":1186,"line":114},[1184,1431,1432],{},"r.Use(auth.RequireSuperuser)\n",[1184,1434,1435],{"class":1186,"line":120},[1184,1436,1408],{"emptyLinePlaceholder":1407},[1184,1438,1439],{"class":1186,"line":181},[1184,1440,1441],{},"\u002F\u002F Check specific permission\n",[1184,1443,1444],{"class":1186,"line":186},[1184,1445,1446],{},"r.Use(auth.RequirePermission(\"users.write\"))\n",[1263,1448,1450],{"id":1449},"configuration","Configuration",[1013,1452,1453,1465],{},[1016,1454,1455],{},[1019,1456,1457,1460,1463],{},[1022,1458,1459],{},"Variable",[1022,1461,1462],{},"Default",[1022,1464,1281],{},[1032,1466,1467,1483,1498,1513,1528,1543,1558],{},[1019,1468,1469,1474,1480],{},[1037,1470,1471],{},[1099,1472,1473],{},"AUTH_JWT_SECRET",[1037,1475,1476],{},[1477,1478,1479],"em",{},"required",[1037,1481,1482],{},"Secret key for JWT signing",[1019,1484,1485,1490,1495],{},[1037,1486,1487],{},[1099,1488,1489],{},"AUTH_JWT_ALGORITHM",[1037,1491,1492],{},[1099,1493,1494],{},"HS256",[1037,1496,1497],{},"JWT signing algorithm",[1019,1499,1500,1505,1510],{},[1037,1501,1502],{},[1099,1503,1504],{},"AUTH_ACCESS_TOKEN_TTL_MINUTES",[1037,1506,1507],{},[1099,1508,1509],{},"30",[1037,1511,1512],{},"Access token lifetime",[1019,1514,1515,1520,1525],{},[1037,1516,1517],{},[1099,1518,1519],{},"AUTH_REFRESH_TOKEN_TTL_DAYS",[1037,1521,1522],{},[1099,1523,1524],{},"7",[1037,1526,1527],{},"Refresh token lifetime",[1019,1529,1530,1535,1540],{},[1037,1531,1532],{},[1099,1533,1534],{},"AUTH_JWT_ISSUER",[1037,1536,1537],{},[1099,1538,1539],{},"redelay",[1037,1541,1542],{},"JWT issuer claim",[1019,1544,1545,1550,1555],{},[1037,1546,1547],{},[1099,1548,1549],{},"AUTH_MAX_REFRESH_TOKENS",[1037,1551,1552],{},[1099,1553,1554],{},"5",[1037,1556,1557],{},"Max active refresh tokens per user",[1019,1559,1560,1565,1570],{},[1037,1561,1562],{},[1099,1563,1564],{},"AUTH_TOKEN_COLLECTION",[1037,1566,1567],{},[1099,1568,1569],{},"tokens",[1037,1571,1572],{},"MongoDB collection for refresh tokens",[1263,1574,1576],{"id":1575},"cross-module-integration","Cross-module integration",[978,1578,1579],{},"The auth module automatically discovers and integrates with:",[1581,1582,1583,1593],"ul",{},[1584,1585,1586,1588,1589,1592],"li",{},[982,1587,1060],{}," module — as a ",[1099,1590,1591],{},"LookupProvider"," for credential verification",[1584,1594,1595,1588,1597,1600],{},[982,1596,1076],{},[1099,1598,1599],{},"PermissionsProvider"," for permission-based authorization",[1239,1602],{},[1008,1604,1060],{"id":1060},[978,1606,1607],{},[982,1608,1609],{},"Full user CRUD with a rich 15-field entity, pagination, password hashing, and event emission.",[978,1611,1612],{},"The users module provides a complete user management system with create, read, update, delete, and list operations. Every mutation emits a typed event, making it easy to trigger downstream workflows.",[978,1614,1615],{},[1258,1616],{"alt":1617,"src":1618},"Users module diagram","\u002Fdiagrams\u002Fusers.svg",[1263,1620,1622],{"id":1621},"entity-user","Entity: User",[1013,1624,1625,1637],{},[1016,1626,1627],{},[1019,1628,1629,1632,1635],{},[1022,1630,1631],{},"Field",[1022,1633,1634],{},"Type",[1022,1636,1281],{},[1032,1638,1639,1652,1665,1677,1689,1701,1714,1726,1738,1750,1762,1774,1788,1801,1813],{},[1019,1640,1641,1646,1649],{},[1037,1642,1643],{},[1099,1644,1645],{},"id",[1037,1647,1648],{},"ObjectID",[1037,1650,1651],{},"Unique identifier",[1019,1653,1654,1659,1662],{},[1037,1655,1656],{},[1099,1657,1658],{},"email",[1037,1660,1661],{},"string",[1037,1663,1664],{},"Unique, validated email address",[1019,1666,1667,1672,1674],{},[1037,1668,1669],{},[1099,1670,1671],{},"full_name",[1037,1673,1661],{},[1037,1675,1676],{},"Display name",[1019,1678,1679,1684,1686],{},[1037,1680,1681],{},[1099,1682,1683],{},"first_name",[1037,1685,1661],{},[1037,1687,1688],{},"Given name",[1019,1690,1691,1696,1698],{},[1037,1692,1693],{},[1099,1694,1695],{},"last_name",[1037,1697,1661],{},[1037,1699,1700],{},"Family name",[1019,1702,1703,1708,1711],{},[1037,1704,1705],{},[1099,1706,1707],{},"is_active",[1037,1709,1710],{},"boolean",[1037,1712,1713],{},"Account active flag",[1019,1715,1716,1721,1723],{},[1037,1717,1718],{},[1099,1719,1720],{},"is_superuser",[1037,1722,1710],{},[1037,1724,1725],{},"Superuser privileges",[1019,1727,1728,1733,1735],{},[1037,1729,1730],{},[1099,1731,1732],{},"email_validated",[1037,1734,1710],{},[1037,1736,1737],{},"Email verification status",[1019,1739,1740,1745,1747],{},[1037,1741,1742],{},[1099,1743,1744],{},"totp_enabled",[1037,1746,1710],{},[1037,1748,1749],{},"Two-factor auth enabled",[1019,1751,1752,1757,1759],{},[1037,1753,1754],{},[1099,1755,1756],{},"profile_picture",[1037,1758,1661],{},[1037,1760,1761],{},"Avatar URL",[1019,1763,1764,1769,1771],{},[1037,1765,1766],{},[1099,1767,1768],{},"oauth_provider",[1037,1770,1661],{},[1037,1772,1773],{},"External auth provider",[1019,1775,1776,1781,1785],{},[1037,1777,1778],{},[1099,1779,1780],{},"user_groups",[1037,1782,1661,1783],{},[1184,1784],{},[1037,1786,1787],{},"Group membership IDs",[1019,1789,1790,1795,1798],{},[1037,1791,1792],{},[1099,1793,1794],{},"last_login_at",[1037,1796,1797],{},"datetime",[1037,1799,1800],{},"Last successful login",[1019,1802,1803,1808,1810],{},[1037,1804,1805],{},[1099,1806,1807],{},"created_at",[1037,1809,1797],{},[1037,1811,1812],{},"Account creation time",[1019,1814,1815,1820,1822],{},[1037,1816,1817],{},[1099,1818,1819],{},"updated_at",[1037,1821,1797],{},[1037,1823,1824],{},"Last modification time",[1263,1826,1266],{"id":1827},"routes-1",[1013,1829,1830,1840],{},[1016,1831,1832],{},[1019,1833,1834,1836,1838],{},[1022,1835,1275],{},[1022,1837,1278],{},[1022,1839,1281],{},[1032,1841,1842,1857,1871,1884,1898,1912],{},[1019,1843,1844,1849,1854],{},[1037,1845,1846],{},[1099,1847,1848],{},"GET",[1037,1850,1851],{},[1099,1852,1853],{},"\u002Fusers\u002Fme",[1037,1855,1856],{},"Current user profile",[1019,1858,1859,1863,1868],{},[1037,1860,1861],{},[1099,1862,1848],{},[1037,1864,1865],{},[1099,1866,1867],{},"\u002Fusers\u002F",[1037,1869,1870],{},"List users (paginated)",[1019,1872,1873,1877,1881],{},[1037,1874,1875],{},[1099,1876,1290],{},[1037,1878,1879],{},[1099,1880,1867],{},[1037,1882,1883],{},"Create a new user",[1019,1885,1886,1890,1895],{},[1037,1887,1888],{},[1099,1889,1848],{},[1037,1891,1892],{},[1099,1893,1894],{},"\u002Fusers\u002F{id}",[1037,1896,1897],{},"Get user by ID",[1019,1899,1900,1905,1909],{},[1037,1901,1902],{},[1099,1903,1904],{},"PATCH",[1037,1906,1907],{},[1099,1908,1894],{},[1037,1910,1911],{},"Update user",[1019,1913,1914,1919,1923],{},[1037,1915,1916],{},[1099,1917,1918],{},"DELETE",[1037,1920,1921],{},[1099,1922,1894],{},[1037,1924,1925],{},"Delete user",[1263,1927,33],{"id":1928},"events-1",[1013,1930,1931,1939],{},[1016,1932,1933],{},[1019,1934,1935,1937],{},[1022,1936,1338],{},[1022,1938,1341],{},[1032,1940,1941,1951,1961],{},[1019,1942,1943,1948],{},[1037,1944,1945],{},[1099,1946,1947],{},"users.user_created",[1037,1949,1950],{},"New user registered",[1019,1952,1953,1958],{},[1037,1954,1955],{},[1099,1956,1957],{},"users.user_updated",[1037,1959,1960],{},"User profile modified",[1019,1962,1963,1968],{},[1037,1964,1965],{},[1099,1966,1967],{},"users.user_deleted",[1037,1969,1970],{},"User account removed",[1263,1972,1974],{"id":1973},"crud-operations","CRUD operations",[978,1976,1977],{},"All operations are declared in the module spec and support:",[1581,1979,1980,1986,1992,1998,2004],{},[1584,1981,1982,1985],{},[982,1983,1984],{},"Create"," — with password hashing and email uniqueness validation",[1584,1987,1988,1991],{},[982,1989,1990],{},"Read"," — single user by ID",[1584,1993,1994,1997],{},[982,1995,1996],{},"Update"," — partial updates with field-level validation",[1584,1999,2000,2003],{},[982,2001,2002],{},"Delete"," — soft or hard delete",[1584,2005,2006,2009],{},[982,2007,2008],{},"List"," — paginated with configurable page size",[1263,2011,1450],{"id":2012},"configuration-1",[1013,2014,2015,2025],{},[1016,2016,2017],{},[1019,2018,2019,2021,2023],{},[1022,2020,1459],{},[1022,2022,1462],{},[1022,2024,1281],{},[1032,2026,2027,2041,2056,2071],{},[1019,2028,2029,2034,2038],{},[1037,2030,2031],{},[1099,2032,2033],{},"USERS_COLLECTION",[1037,2035,2036],{},[1099,2037,1060],{},[1037,2039,2040],{},"MongoDB collection name",[1019,2042,2043,2048,2053],{},[1037,2044,2045],{},[1099,2046,2047],{},"USERS_DEFAULT_PAGE_SIZE",[1037,2049,2050],{},[1099,2051,2052],{},"20",[1037,2054,2055],{},"Default pagination size",[1019,2057,2058,2063,2068],{},[1037,2059,2060],{},[1099,2061,2062],{},"USERS_MAX_PAGE_SIZE",[1037,2064,2065],{},[1099,2066,2067],{},"100",[1037,2069,2070],{},"Maximum allowed page size",[1019,2072,2073,2078,2083],{},[1037,2074,2075],{},[1099,2076,2077],{},"USERS_REQUIRE_EMAIL_VALIDATION",[1037,2079,2080],{},[1099,2081,2082],{},"false",[1037,2084,2085],{},"Require verified email",[1239,2087],{},[1008,2089,1076],{"id":1076},[978,2091,2092],{},[982,2093,2094],{},"Role-based group management with permission resolution and user membership.",[978,2096,2097,2098,2101],{},"The groups module provides user groups with associated permissions. When combined with the auth module's ",[1099,2099,2100],{},"RequirePermission"," middleware, it enables fine-grained role-based access control (RBAC).",[978,2103,2104],{},[1258,2105],{"alt":2106,"src":2107},"Groups module diagram","\u002Fdiagrams\u002Fgroups.svg",[1263,2109,2111],{"id":2110},"entity-usergroup","Entity: UserGroup",[1013,2113,2114,2124],{},[1016,2115,2116],{},[1019,2117,2118,2120,2122],{},[1022,2119,1631],{},[1022,2121,1634],{},[1022,2123,1281],{},[1032,2125,2126,2136,2148,2160,2178,2189,2200],{},[1019,2127,2128,2132,2134],{},[1037,2129,2130],{},[1099,2131,1645],{},[1037,2133,1648],{},[1037,2135,1651],{},[1019,2137,2138,2143,2145],{},[1037,2139,2140],{},[1099,2141,2142],{},"name",[1037,2144,1661],{},[1037,2146,2147],{},"Group name",[1019,2149,2150,2155,2157],{},[1037,2151,2152],{},[1099,2153,2154],{},"description",[1037,2156,1661],{},[1037,2158,2159],{},"Group purpose",[1019,2161,2162,2167,2171],{},[1037,2163,2164],{},[1099,2165,2166],{},"permissions",[1037,2168,1661,2169],{},[1184,2170],{},[1037,2172,2173,2174,2177],{},"Permission strings (e.g., ",[1099,2175,2176],{},"users.write",")",[1019,2179,2180,2184,2186],{},[1037,2181,2182],{},[1099,2183,1707],{},[1037,2185,1710],{},[1037,2187,2188],{},"Group active flag",[1019,2190,2191,2195,2197],{},[1037,2192,2193],{},[1099,2194,1807],{},[1037,2196,1797],{},[1037,2198,2199],{},"Creation time",[1019,2201,2202,2206,2208],{},[1037,2203,2204],{},[1099,2205,1819],{},[1037,2207,1797],{},[1037,2209,2210],{},"Last modification",[1263,2212,33],{"id":2213},"events-2",[1013,2215,2216,2224],{},[1016,2217,2218],{},[1019,2219,2220,2222],{},[1022,2221,1338],{},[1022,2223,1341],{},[1032,2225,2226,2236,2246],{},[1019,2227,2228,2233],{},[1037,2229,2230],{},[1099,2231,2232],{},"groups.group_created",[1037,2234,2235],{},"New group created",[1019,2237,2238,2243],{},[1037,2239,2240],{},[1099,2241,2242],{},"groups.group_updated",[1037,2244,2245],{},"Group modified",[1019,2247,2248,2253],{},[1037,2249,2250],{},[1099,2251,2252],{},"groups.group_deleted",[1037,2254,2255],{},"Group removed",[1263,2257,1974],{"id":2258},"crud-operations-1",[978,2260,2261],{},"Full CRUD with create, read, update, delete, and list — all with event emission.",[1263,2263,1450],{"id":2264},"configuration-2",[1013,2266,2267,2277],{},[1016,2268,2269],{},[1019,2270,2271,2273,2275],{},[1022,2272,1459],{},[1022,2274,1462],{},[1022,2276,1281],{},[1032,2278,2279],{},[1019,2280,2281,2286,2290],{},[1037,2282,2283],{},[1099,2284,2285],{},"GROUPS_COLLECTION",[1037,2287,2288],{},[1099,2289,1076],{},[1037,2291,2040],{},[1263,2293,2295],{"id":2294},"how-permissions-work","How permissions work",[1175,2297,2302],{"className":2298,"code":2300,"language":2301},[2299],"language-text","User → belongs to Groups → each Group has Permissions → auth middleware checks Permissions\n","text",[1099,2303,2300],{"__ignoreMap":1180},[1175,2305,2307],{"className":1177,"code":2306,"language":1179,"meta":1180,"style":1180},"\u002F\u002F In your routes:\nr.Handle(\"DELETE\", \"\u002F{id}\", handler,\n    modules.Security(\"BearerAuth\"),\n    modules.RequirePermission(\"users.delete\"),\n)\n",[1099,2308,2309,2314,2319,2324,2329],{"__ignoreMap":1180},[1184,2310,2311],{"class":1186,"line":10},[1184,2312,2313],{},"\u002F\u002F In your routes:\n",[1184,2315,2316],{"class":1186,"line":16},[1184,2317,2318],{},"r.Handle(\"DELETE\", \"\u002F{id}\", handler,\n",[1184,2320,2321],{"class":1186,"line":22},[1184,2322,2323],{},"    modules.Security(\"BearerAuth\"),\n",[1184,2325,2326],{"class":1186,"line":51},[1184,2327,2328],{},"    modules.RequirePermission(\"users.delete\"),\n",[1184,2330,2331],{"class":1186,"line":57},[1184,2332,1234],{},[1239,2334],{},[1008,2336,1092],{"id":1092},[978,2338,2339],{},[982,2340,2341],{},"Simple health check endpoint for container orchestration readiness probes.",[978,2343,2344],{},[1258,2345],{"alt":2346,"src":2347},"Health module diagram","\u002Fdiagrams\u002Fhealth.svg",[978,2349,2350],{},"Returns a JSON response indicating the service is running and ready to accept requests.",[1175,2352,2356],{"className":2353,"code":2354,"language":2355,"meta":1180,"style":1180},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fhealth\n# {\"status\": \"ok\"}\n","bash",[1099,2357,2358,2368],{"__ignoreMap":1180},[1184,2359,2360,2364],{"class":1186,"line":10},[1184,2361,2363],{"class":2362},"sBMFI","curl",[1184,2365,2367],{"class":2366},"sfazB"," http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fhealth\n",[1184,2369,2370],{"class":1186,"line":16},[1184,2371,2373],{"class":2372},"sHwdD","# {\"status\": \"ok\"}\n",[978,2375,2376,2377,2380,2381,1006],{},"No configuration required. Ideal for Kubernetes ",[1099,2378,2379],{},"readinessProbe"," and ",[1099,2382,2383],{},"livenessProbe",[1239,2385],{},[1008,2387,1112],{"id":1112},[978,2389,2390],{},[982,2391,2392],{},"Auto-generated OpenAPI 3.0 spec with interactive API documentation UI.",[978,2394,2395],{},"The OpenAPI module introspects all registered routes and their metadata (request bodies, responses, security requirements) to produce a complete OpenAPI 3.0 specification. It serves this spec as JSON and renders an interactive UI for exploring and testing the API.",[978,2397,2398],{},[1258,2399],{"alt":2400,"src":2401},"OpenAPI module diagram","\u002Fdiagrams\u002Fopenapi.svg",[1263,2403,2405],{"id":2404},"endpoints","Endpoints",[1013,2407,2408,2416],{},[1016,2409,2410],{},[1019,2411,2412,2414],{},[1022,2413,1278],{},[1022,2415,1281],{},[1032,2417,2418,2428],{},[1019,2419,2420,2425],{},[1037,2421,2422],{},[1099,2423,2424],{},"\u002Fopenapi.json",[1037,2426,2427],{},"OpenAPI 3.0 spec (JSON)",[1019,2429,2430,2435],{},[1037,2431,2432],{},[1099,2433,2434],{},"\u002Freference",[1037,2436,2437],{},"Interactive API documentation UI",[1263,2439,2441],{"id":2440},"ui-providers","UI providers",[978,2443,2444],{},"Choose your preferred documentation interface:",[1013,2446,2447,2459],{},[1016,2448,2449],{},[1019,2450,2451,2454,2457],{},[1022,2452,2453],{},"Provider",[1022,2455,2456],{},"Setting",[1022,2458,1281],{},[1032,2460,2461,2476,2491,2506],{},[1019,2462,2463,2468,2473],{},[1037,2464,2465],{},[982,2466,2467],{},"Scalar",[1037,2469,2470],{},[1099,2471,2472],{},"OPENAPI_UI=scalar",[1037,2474,2475],{},"Modern, beautiful API reference (default)",[1019,2477,2478,2483,2488],{},[1037,2479,2480],{},[982,2481,2482],{},"Swagger UI",[1037,2484,2485],{},[1099,2486,2487],{},"OPENAPI_UI=swagger",[1037,2489,2490],{},"Classic Swagger interface",[1019,2492,2493,2498,2503],{},[1037,2494,2495],{},[982,2496,2497],{},"Redoc",[1037,2499,2500],{},[1099,2501,2502],{},"OPENAPI_UI=redoc",[1037,2504,2505],{},"Clean read-focused documentation",[1019,2507,2508,2513,2518],{},[1037,2509,2510],{},[982,2511,2512],{},"Disabled",[1037,2514,2515],{},[1099,2516,2517],{},"OPENAPI_UI=disabled",[1037,2519,2520],{},"JSON spec only, no UI",[1263,2522,2524],{"id":2523},"how-schemas-are-generated","How schemas are generated",[978,2526,2527],{},"Route handlers declare metadata using functional options:",[1175,2529,2531],{"className":1177,"code":2530,"language":1179,"meta":1180,"style":1180},"r.Handle(\"POST\", \"\u002F\", handler,\n    modules.Summary(\"Create user\"),\n    modules.Body(UserCreateInput{}),\n    modules.Response(201, \"User created\", UserResponse{}),\n    modules.Response(400, \"Bad request\", modules.RedelayErrorResponse{}),\n    modules.Security(\"BearerAuth\"),\n)\n",[1099,2532,2533,2538,2543,2548,2553,2558,2562],{"__ignoreMap":1180},[1184,2534,2535],{"class":1186,"line":10},[1184,2536,2537],{},"r.Handle(\"POST\", \"\u002F\", handler,\n",[1184,2539,2540],{"class":1186,"line":16},[1184,2541,2542],{},"    modules.Summary(\"Create user\"),\n",[1184,2544,2545],{"class":1186,"line":22},[1184,2546,2547],{},"    modules.Body(UserCreateInput{}),\n",[1184,2549,2550],{"class":1186,"line":51},[1184,2551,2552],{},"    modules.Response(201, \"User created\", UserResponse{}),\n",[1184,2554,2555],{"class":1186,"line":57},[1184,2556,2557],{},"    modules.Response(400, \"Bad request\", modules.RedelayErrorResponse{}),\n",[1184,2559,2560],{"class":1186,"line":102},[1184,2561,2323],{},[1184,2563,2564],{"class":1186,"line":108},[1184,2565,1234],{},[978,2567,2568,2569,2572],{},"The ",[1099,2570,2571],{},"SchemaRegistry"," converts Go structs to JSON Schema using reflection:",[1581,2574,2575,2581,2587,2590,2596],{},[1584,2576,2577,2580],{},[1099,2578,2579],{},"json"," tags → field names",[1584,2582,2583,2586],{},[1099,2584,2585],{},"validate"," tags → constraints (required, email, min, max)",[1584,2588,2589],{},"Pointer types → nullable",[1584,2591,2592,2595],{},[1099,2593,2594],{},"time.Time"," → date-time format",[1584,2597,2598],{},"Slices, maps, embedded structs → proper schema composition",[1263,2600,1450],{"id":2601},"configuration-3",[1013,2603,2604,2614],{},[1016,2605,2606],{},[1019,2607,2608,2610,2612],{},[1022,2609,1459],{},[1022,2611,1462],{},[1022,2613,1281],{},[1032,2615,2616,2631,2645],{},[1019,2617,2618,2623,2628],{},[1037,2619,2620],{},[1099,2621,2622],{},"OPENAPI_UI",[1037,2624,2625],{},[1099,2626,2627],{},"scalar",[1037,2629,2630],{},"UI provider selection",[1019,2632,2633,2638,2642],{},[1037,2634,2635],{},[1099,2636,2637],{},"OPENAPI_SPEC_PATH",[1037,2639,2640],{},[1099,2641,2424],{},[1037,2643,2644],{},"JSON spec path",[1019,2646,2647,2652,2656],{},[1037,2648,2649],{},[1099,2650,2651],{},"OPENAPI_UI_PATH",[1037,2653,2654],{},[1099,2655,2434],{},[1037,2657,2658],{},"UI page path",[1239,2660],{},[1008,2662,1128],{"id":1128},[978,2664,2665],{},[982,2666,2667],{},"Auto-generated AsyncAPI 2.6 spec from all registered events, served with AsyncAPI Studio.",[978,2669,2670,2671,2380,2674,2677,2678,2684],{},"The AsyncAPI module is the event-contract equivalent of the OpenAPI module — it introspects\nevery module's ",[1099,2672,2673],{},"Events()",[1099,2675,2676],{},"Consumers()"," declarations to produce a complete\n",[1001,2679,2683],{"href":2680,"rel":2681},"https:\u002F\u002Fwww.asyncapi.com\u002F",[2682],"nofollow","AsyncAPI 2.6"," specification and serve an interactive UI.",[987,2686,2688,2689],{"icon":2687},"i-lucide-book-open","Full reference: ",[1001,2690,178],{"href":179},[1263,2692,2405],{"id":2693},"endpoints-1",[1013,2695,2696,2704],{},[1016,2697,2698],{},[1019,2699,2700,2702],{},[1022,2701,1278],{},[1022,2703,1281],{},[1032,2705,2706,2719],{},[1019,2707,2708,2713],{},[1037,2709,2710],{},[1099,2711,2712],{},"\u002Fasyncapi.json",[1037,2714,2715,2716,2177],{},"AsyncAPI 2.6 spec (YAML, ",[1099,2717,2718],{},"Content-Type: application\u002Fyaml",[1019,2720,2721,2726],{},[1037,2722,2723],{},[1099,2724,2725],{},"\u002Fasyncapi",[1037,2727,2728],{},"AsyncAPI Studio — interactive event browser",[1263,2730,2732],{"id":2731},"how-events-become-channels","How events become channels",[978,2734,2735,2736,2739,2740,2742],{},"Each ",[1099,2737,2738],{},"ir.Event"," returned by a module's ",[1099,2741,2673],{}," method becomes an AsyncAPI channel:",[1175,2744,2747],{"className":2745,"code":2746,"language":2301},[2299],"Module.Events() → ir.Event{Name: \"order.created\", Topic: \"order.created\", Payload: ...}\n\nasyncapi: \"2.6.0\"\nchannels:\n  order.created:\n    publish:\n      operationId: order.created\n      message:\n        payload:\n          $ref: '#\u002Fcomponents\u002Fschemas\u002FOrderCreatedPayload'\n",[1099,2748,2746],{"__ignoreMap":1180},[978,2750,2751,2752,2755,2756,2759,2760,2763],{},"Consumer registrations produce ",[1099,2753,2754],{},"subscribe"," operations with Kafka ",[1099,2757,2758],{},"groupId"," bindings.\nPayload packets with named fields produce ",[1099,2761,2762],{},"components\u002Fschemas"," entries.",[1263,2765,1450],{"id":2766},"configuration-4",[1013,2768,2769,2779],{},[1016,2770,2771],{},[1019,2772,2773,2775,2777],{},[1022,2774,1459],{},[1022,2776,1462],{},[1022,2778,1281],{},[1032,2780,2781,2802,2816],{},[1019,2782,2783,2788,2793],{},[1037,2784,2785],{},[1099,2786,2787],{},"ASYNCAPI_UI",[1037,2789,2790],{},[1099,2791,2792],{},"studio",[1037,2794,2795,2796,2798,2799,2177],{},"UI provider (",[1099,2797,2792],{}," or ",[1099,2800,2801],{},"disabled",[1019,2803,2804,2809,2813],{},[1037,2805,2806],{},[1099,2807,2808],{},"ASYNCAPI_SPEC_PATH",[1037,2810,2811],{},[1099,2812,2712],{},[1037,2814,2815],{},"YAML spec path",[1019,2817,2818,2823,2827],{},[1037,2819,2820],{},[1099,2821,2822],{},"ASYNCAPI_UI_PATH",[1037,2824,2825],{},[1099,2826,2725],{},[1037,2828,2829],{},"Studio UI path",[1239,2831],{},[1008,2833,1144],{"id":1144},[978,2835,2836],{},[982,2837,2838],{},"Model Context Protocol server with automatic tool discovery from registered modules.",[978,2840,2841,2842,2845,2846,2849],{},"The MCP module exposes your framework's capabilities as tools that AI assistants can invoke. It speaks the ",[982,2843,2844],{},"MCP Streamable HTTP transport"," (protocol ",[1099,2847,2848],{},"2025-03-26",") — compatible with VS Code, Claude Desktop, Cursor, and other MCP clients.",[978,2851,2852],{},[1258,2853],{"alt":2854,"src":2855},"MCP module diagram","\u002Fdiagrams\u002Fmcp.svg",[1263,2857,2859],{"id":2858},"endpoint","Endpoint",[1013,2861,2862,2872],{},[1016,2863,2864],{},[1019,2865,2866,2868,2870],{},[1022,2867,1275],{},[1022,2869,1278],{},[1022,2871,1281],{},[1032,2873,2874],{},[1019,2875,2876,2880,2885],{},[1037,2877,2878],{},[1099,2879,1290],{},[1037,2881,2882],{},[1099,2883,2884],{},"\u002Fmcp",[1037,2886,2887],{},"MCP JSON-RPC endpoint (Streamable HTTP transport)",[1263,2889,2891],{"id":2890},"what-gets-discovered","What gets discovered",[2893,2894,2895,2929,2950,2960],"ol",{},[1584,2896,2897,2900,2901,2904,2905,2904,2908,2904,2911,2904,2914,2904,2917,2904,2920,2904,2923,2904,2926],{},[982,2898,2899],{},"Introspection tools"," (9) — ",[1099,2902,2903],{},"list_modules",", ",[1099,2906,2907],{},"describe_module",[1099,2909,2910],{},"list_flowdsl_nodes",[1099,2912,2913],{},"describe_flowdsl_node",[1099,2915,2916],{},"list_events",[1099,2918,2919],{},"describe_event",[1099,2921,2922],{},"list_packets",[1099,2924,2925],{},"describe_packet",[1099,2927,2928],{},"search_redelay",[1584,2930,2931,2934,2935,2904,2938,2904,2941,2904,2944,2904,2947],{},[982,2932,2933],{},"Developer tools"," (5) — ",[1099,2936,2937],{},"validate_flowdsl",[1099,2939,2940],{},"validate_module",[1099,2942,2943],{},"scaffold_module",[1099,2945,2946],{},"list_api_routes",[1099,2948,2949],{},"explain_flowdsl_node",[1584,2951,2952,2955,2956,2959],{},[982,2953,2954],{},"Route tools"," — every HTTP route from ",[1099,2957,2958],{},"RoutesProvider"," modules becomes a callable tool",[1584,2961,2962,2965,2966,2969],{},[982,2963,2964],{},"Module-contributed tools"," — any module implementing ",[1099,2967,2968],{},"MCPProvider"," contributes its own tools and resources",[1263,2971,2973],{"id":2972},"extending-mcp-from-your-module","Extending MCP from your module",[978,2975,2976,2977,2979],{},"Implement ",[1099,2978,2968],{}," to contribute tools:",[1175,2981,2983],{"className":1177,"code":2982,"language":1179,"meta":1180,"style":1180},"func (m *Module) MCPTools() []modules.MCPTool {\n    return []modules.MCPTool{\n        {\n            Name:        \"my_tool\",\n            Description: \"Does something useful for AI assistants\",\n            InputSchema: map[string]any{\n                \"type\": \"object\",\n                \"properties\": map[string]any{\n                    \"query\": map[string]any{\"type\": \"string\"},\n                },\n            },\n            Handler: func(ctx context.Context, args map[string]any) (any, error) {\n                \u002F\u002F your logic here\n                return result, nil\n            },\n        },\n    }\n}\n\nfunc (m *Module) MCPResources() []modules.MCPResource { return nil }\n",[1099,2984,2985,2990,2995,3000,3005,3010,3015,3020,3025,3030,3035,3040,3045,3050,3055,3059,3064,3069,3074,3078],{"__ignoreMap":1180},[1184,2986,2987],{"class":1186,"line":10},[1184,2988,2989],{},"func (m *Module) MCPTools() []modules.MCPTool {\n",[1184,2991,2992],{"class":1186,"line":16},[1184,2993,2994],{},"    return []modules.MCPTool{\n",[1184,2996,2997],{"class":1186,"line":22},[1184,2998,2999],{},"        {\n",[1184,3001,3002],{"class":1186,"line":51},[1184,3003,3004],{},"            Name:        \"my_tool\",\n",[1184,3006,3007],{"class":1186,"line":57},[1184,3008,3009],{},"            Description: \"Does something useful for AI assistants\",\n",[1184,3011,3012],{"class":1186,"line":102},[1184,3013,3014],{},"            InputSchema: map[string]any{\n",[1184,3016,3017],{"class":1186,"line":108},[1184,3018,3019],{},"                \"type\": \"object\",\n",[1184,3021,3022],{"class":1186,"line":114},[1184,3023,3024],{},"                \"properties\": map[string]any{\n",[1184,3026,3027],{"class":1186,"line":120},[1184,3028,3029],{},"                    \"query\": map[string]any{\"type\": \"string\"},\n",[1184,3031,3032],{"class":1186,"line":181},[1184,3033,3034],{},"                },\n",[1184,3036,3037],{"class":1186,"line":186},[1184,3038,3039],{},"            },\n",[1184,3041,3042],{"class":1186,"line":191},[1184,3043,3044],{},"            Handler: func(ctx context.Context, args map[string]any) (any, error) {\n",[1184,3046,3047],{"class":1186,"line":197},[1184,3048,3049],{},"                \u002F\u002F your logic here\n",[1184,3051,3052],{"class":1186,"line":203},[1184,3053,3054],{},"                return result, nil\n",[1184,3056,3057],{"class":1186,"line":214},[1184,3058,3039],{},[1184,3060,3061],{"class":1186,"line":223},[1184,3062,3063],{},"        },\n",[1184,3065,3066],{"class":1186,"line":229},[1184,3067,3068],{},"    }\n",[1184,3070,3071],{"class":1186,"line":234},[1184,3072,3073],{},"}\n",[1184,3075,3076],{"class":1186,"line":240},[1184,3077,1408],{"emptyLinePlaceholder":1407},[1184,3079,3080],{"class":1186,"line":246},[1184,3081,3082],{},"func (m *Module) MCPResources() []modules.MCPResource { return nil }\n",[978,3084,3085,3086,3089],{},"Your tools appear in ",[1099,3087,3088],{},"tools\u002Flist"," as soon as your module is blank-imported.",[1263,3091,3093],{"id":3092},"ide-setup","IDE setup",[978,3095,3096,3097,3100],{},"Add to ",[1099,3098,3099],{},".vscode\u002Fmcp.json",":",[1175,3102,3105],{"className":3103,"code":3104,"language":2579,"meta":1180,"style":1180},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"servers\": {\n    \"my-app\": {\n      \"type\": \"http\",\n      \"url\": \"http:\u002F\u002Flocalhost:8000\u002Fmcp\"\n    }\n  }\n}\n",[1099,3106,3107,3113,3130,3144,3168,3187,3191,3196],{"__ignoreMap":1180},[1184,3108,3109],{"class":1186,"line":10},[1184,3110,3112],{"class":3111},"sMK4o","{\n",[1184,3114,3115,3118,3122,3125,3127],{"class":1186,"line":16},[1184,3116,3117],{"class":3111},"  \"",[1184,3119,3121],{"class":3120},"spNyl","servers",[1184,3123,3124],{"class":3111},"\"",[1184,3126,3100],{"class":3111},[1184,3128,3129],{"class":3111}," {\n",[1184,3131,3132,3135,3138,3140,3142],{"class":1186,"line":22},[1184,3133,3134],{"class":3111},"    \"",[1184,3136,3137],{"class":2362},"my-app",[1184,3139,3124],{"class":3111},[1184,3141,3100],{"class":3111},[1184,3143,3129],{"class":3111},[1184,3145,3146,3149,3153,3155,3157,3160,3163,3165],{"class":1186,"line":51},[1184,3147,3148],{"class":3111},"      \"",[1184,3150,3152],{"class":3151},"sbssI","type",[1184,3154,3124],{"class":3111},[1184,3156,3100],{"class":3111},[1184,3158,3159],{"class":3111}," \"",[1184,3161,3162],{"class":2366},"http",[1184,3164,3124],{"class":3111},[1184,3166,3167],{"class":3111},",\n",[1184,3169,3170,3172,3175,3177,3179,3181,3184],{"class":1186,"line":57},[1184,3171,3148],{"class":3111},[1184,3173,3174],{"class":3151},"url",[1184,3176,3124],{"class":3111},[1184,3178,3100],{"class":3111},[1184,3180,3159],{"class":3111},[1184,3182,3183],{"class":2366},"http:\u002F\u002Flocalhost:8000\u002Fmcp",[1184,3185,3186],{"class":3111},"\"\n",[1184,3188,3189],{"class":1186,"line":102},[1184,3190,3068],{"class":3111},[1184,3192,3193],{"class":1186,"line":108},[1184,3194,3195],{"class":3111},"  }\n",[1184,3197,3198],{"class":1186,"line":114},[1184,3199,3073],{"class":3111},[1239,3201],{},[1008,3203,1160],{"id":1160},[978,3205,3206],{},[982,3207,3208],{},"Interactive module spec browser with SVG diagrams and YAML definitions.",[978,3210,3211],{},"The modspec module provides a visual overview of all registered modules — similar to how the OpenAPI module provides interactive API reference.",[978,3213,3214],{},[1258,3215],{"alt":3216,"src":3217},"Modspec module diagram","\u002Fdiagrams\u002Fmodspec.svg",[1263,3219,2405],{"id":3220},"endpoints-2",[1013,3222,3223,3231],{},[1016,3224,3225],{},[1019,3226,3227,3229],{},[1022,3228,1278],{},[1022,3230,1281],{},[1032,3232,3233,3243],{},[1019,3234,3235,3240],{},[1037,3236,3237],{},[1099,3238,3239],{},"\u002Fmodules.json",[1037,3241,3242],{},"JSON array of all module specs (includes SVG + YAML)",[1019,3244,3245,3250],{},[1037,3246,3247],{},[1099,3248,3249],{},"\u002Fmodules",[1037,3251,3252],{},"Interactive HTML browser with diagrams",[1263,3254,3256],{"id":3255},"features","Features",[1581,3258,3259,3265,3271,3277,3283,3289,3295,3307,3313],{},[1584,3260,3261,3264],{},[982,3262,3263],{},"Module cards"," — expandable panels for each registered module with badges showing route\u002Fevent\u002Fconsumer counts",[1584,3266,3267,3270],{},[982,3268,3269],{},"Routes tab"," — color-coded HTTP method badges with full paths (sourced from OpenAPI route discovery)",[1584,3272,3273,3276],{},[982,3274,3275],{},"Events tab"," — list of published events with topic and description",[1584,3278,3279,3282],{},[982,3280,3281],{},"Consumers tab"," — list of consumed topics with consumer group IDs",[1584,3284,3285,3288],{},[982,3286,3287],{},"SVG diagrams"," — auto-generated visual diagrams showing entities, events, config, CRUD, settings, and dependencies",[1584,3290,3291,3294],{},[982,3292,3293],{},"YAML specs"," — full module definition with copy button",[1584,3296,3297,3300,3301,3303,3304,3306],{},[982,3298,3299],{},"Top nav links"," — quick links to ",[1099,3302,2434],{}," (OpenAPI UI) and ",[1099,3305,2725],{}," (AsyncAPI Studio)",[1584,3308,3309,3312],{},[982,3310,3311],{},"Dark mode"," — automatic theme switching",[1584,3314,3315,3318],{},[982,3316,3317],{},"Zero external dependencies"," — fully self-contained HTML page",[1263,3320,3322],{"id":3321},"modulesjson-schema","modules.json schema",[978,3324,2568,3325,3327],{},[1099,3326,3239],{}," endpoint returns a JSON array, with each entry including:",[1175,3329,3331],{"className":3103,"code":3330,"language":2579,"meta":1180,"style":1180},"{\n  \"name\": \"auth\",\n  \"description\": \"...\",\n  \"version\": \"1.0.0\",\n  \"routes\": [\n    { \"method\": \"POST\", \"path\": \"\u002Fapi\u002Fv1\u002Fauth\u002Flogin\", \"summary\": \"Login\" }\n  ],\n  \"events\": [\n    { \"name\": \"auth.login\", \"topic\": \"auth.login\", \"description\": \"Successful authentication\" }\n  ],\n  \"consumers\": [],\n  \"svg\": \"...\",\n  \"yaml\": \"...\"\n}\n",[1099,3332,3333,3337,3355,3374,3394,3407,3467,3472,3484,3537,3541,3555,3574,3591],{"__ignoreMap":1180},[1184,3334,3335],{"class":1186,"line":10},[1184,3336,3112],{"class":3111},[1184,3338,3339,3341,3343,3345,3347,3349,3351,3353],{"class":1186,"line":16},[1184,3340,3117],{"class":3111},[1184,3342,2142],{"class":3120},[1184,3344,3124],{"class":3111},[1184,3346,3100],{"class":3111},[1184,3348,3159],{"class":3111},[1184,3350,1044],{"class":2366},[1184,3352,3124],{"class":3111},[1184,3354,3167],{"class":3111},[1184,3356,3357,3359,3361,3363,3365,3367,3370,3372],{"class":1186,"line":22},[1184,3358,3117],{"class":3111},[1184,3360,2154],{"class":3120},[1184,3362,3124],{"class":3111},[1184,3364,3100],{"class":3111},[1184,3366,3159],{"class":3111},[1184,3368,3369],{"class":2366},"...",[1184,3371,3124],{"class":3111},[1184,3373,3167],{"class":3111},[1184,3375,3376,3378,3381,3383,3385,3387,3390,3392],{"class":1186,"line":51},[1184,3377,3117],{"class":3111},[1184,3379,3380],{"class":3120},"version",[1184,3382,3124],{"class":3111},[1184,3384,3100],{"class":3111},[1184,3386,3159],{"class":3111},[1184,3388,3389],{"class":2366},"1.0.0",[1184,3391,3124],{"class":3111},[1184,3393,3167],{"class":3111},[1184,3395,3396,3398,3400,3402,3404],{"class":1186,"line":57},[1184,3397,3117],{"class":3111},[1184,3399,1265],{"class":3120},[1184,3401,3124],{"class":3111},[1184,3403,3100],{"class":3111},[1184,3405,3406],{"class":3111}," [\n",[1184,3408,3409,3412,3414,3417,3419,3421,3423,3425,3427,3430,3432,3435,3437,3439,3441,3444,3446,3448,3450,3453,3455,3457,3459,3462,3464],{"class":1186,"line":102},[1184,3410,3411],{"class":3111},"    {",[1184,3413,3159],{"class":3111},[1184,3415,3416],{"class":2362},"method",[1184,3418,3124],{"class":3111},[1184,3420,3100],{"class":3111},[1184,3422,3159],{"class":3111},[1184,3424,1290],{"class":2366},[1184,3426,3124],{"class":3111},[1184,3428,3429],{"class":3111},",",[1184,3431,3159],{"class":3111},[1184,3433,3434],{"class":2362},"path",[1184,3436,3124],{"class":3111},[1184,3438,3100],{"class":3111},[1184,3440,3159],{"class":3111},[1184,3442,3443],{"class":2366},"\u002Fapi\u002Fv1\u002Fauth\u002Flogin",[1184,3445,3124],{"class":3111},[1184,3447,3429],{"class":3111},[1184,3449,3159],{"class":3111},[1184,3451,3452],{"class":2362},"summary",[1184,3454,3124],{"class":3111},[1184,3456,3100],{"class":3111},[1184,3458,3159],{"class":3111},[1184,3460,3461],{"class":2366},"Login",[1184,3463,3124],{"class":3111},[1184,3465,3466],{"class":3111}," }\n",[1184,3468,3469],{"class":1186,"line":108},[1184,3470,3471],{"class":3111},"  ],\n",[1184,3473,3474,3476,3478,3480,3482],{"class":1186,"line":114},[1184,3475,3117],{"class":3111},[1184,3477,1329],{"class":3120},[1184,3479,3124],{"class":3111},[1184,3481,3100],{"class":3111},[1184,3483,3406],{"class":3111},[1184,3485,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3509,3511,3513,3515,3517,3519,3521,3523,3525,3527,3529,3531,3533,3535],{"class":1186,"line":120},[1184,3487,3411],{"class":3111},[1184,3489,3159],{"class":3111},[1184,3491,2142],{"class":2362},[1184,3493,3124],{"class":3111},[1184,3495,3100],{"class":3111},[1184,3497,3159],{"class":3111},[1184,3499,1350],{"class":2366},[1184,3501,3124],{"class":3111},[1184,3503,3429],{"class":3111},[1184,3505,3159],{"class":3111},[1184,3507,3508],{"class":2362},"topic",[1184,3510,3124],{"class":3111},[1184,3512,3100],{"class":3111},[1184,3514,3159],{"class":3111},[1184,3516,1350],{"class":2366},[1184,3518,3124],{"class":3111},[1184,3520,3429],{"class":3111},[1184,3522,3159],{"class":3111},[1184,3524,2154],{"class":2362},[1184,3526,3124],{"class":3111},[1184,3528,3100],{"class":3111},[1184,3530,3159],{"class":3111},[1184,3532,1353],{"class":2366},[1184,3534,3124],{"class":3111},[1184,3536,3466],{"class":3111},[1184,3538,3539],{"class":1186,"line":181},[1184,3540,3471],{"class":3111},[1184,3542,3543,3545,3548,3550,3552],{"class":1186,"line":186},[1184,3544,3117],{"class":3111},[1184,3546,3547],{"class":3120},"consumers",[1184,3549,3124],{"class":3111},[1184,3551,3100],{"class":3111},[1184,3553,3554],{"class":3111}," [],\n",[1184,3556,3557,3559,3562,3564,3566,3568,3570,3572],{"class":1186,"line":191},[1184,3558,3117],{"class":3111},[1184,3560,3561],{"class":3120},"svg",[1184,3563,3124],{"class":3111},[1184,3565,3100],{"class":3111},[1184,3567,3159],{"class":3111},[1184,3569,3369],{"class":2366},[1184,3571,3124],{"class":3111},[1184,3573,3167],{"class":3111},[1184,3575,3576,3578,3581,3583,3585,3587,3589],{"class":1186,"line":197},[1184,3577,3117],{"class":3111},[1184,3579,3580],{"class":3120},"yaml",[1184,3582,3124],{"class":3111},[1184,3584,3100],{"class":3111},[1184,3586,3159],{"class":3111},[1184,3588,3369],{"class":2366},[1184,3590,3186],{"class":3111},[1184,3592,3593],{"class":1186,"line":203},[1184,3594,3073],{"class":3111},[1263,3596,1450],{"id":3597},"configuration-5",[1013,3599,3600,3610],{},[1016,3601,3602],{},[1019,3603,3604,3606,3608],{},[1022,3605,1459],{},[1022,3607,1462],{},[1022,3609,1281],{},[1032,3611,3612,3625,3638,3651,3664],{},[1019,3613,3614,3619,3623],{},[1037,3615,3616],{},[1099,3617,3618],{},"MODSPEC_SPEC_PATH",[1037,3620,3621],{},[1099,3622,3239],{},[1037,3624,2644],{},[1019,3626,3627,3632,3636],{},[1037,3628,3629],{},[1099,3630,3631],{},"MODSPEC_UI_PATH",[1037,3633,3634],{},[1099,3635,3249],{},[1037,3637,2658],{},[1019,3639,3640,3644,3648],{},[1037,3641,3642],{},[1099,3643,2651],{},[1037,3645,3646],{},[1099,3647,2434],{},[1037,3649,3650],{},"OpenAPI UI link in the top nav",[1019,3652,3653,3657,3661],{},[1037,3654,3655],{},[1099,3656,2822],{},[1037,3658,3659],{},[1099,3660,2725],{},[1037,3662,3663],{},"AsyncAPI Studio link in the top nav",[1019,3665,3666,3671,3676],{},[1037,3667,3668],{},[1099,3669,3670],{},"ROUTE_PREFIX",[1037,3672,3673],{},[1099,3674,3675],{},"\u002Fapi\u002Fv1",[1037,3677,3678],{},"Prepended to route paths in the UI",[1239,3680],{},[1008,3682,3684],{"id":3683},"module-dependency-graph","Module dependency graph",[978,3686,3687],{},"The built-in modules form a clean dependency tree:",[1175,3689,3692],{"className":3690,"code":3691,"language":2301},[2299],"auth ──→ users (credential lookup)\n  │\n  └──→ groups (permission resolution)\n\nopenapi  ──→ reads route metadata from all modules     → \u002Fopenapi.json + \u002Freference\nasyncapi ──→ reads event\u002Fconsumer IR from all modules  → \u002Fasyncapi.json + \u002Fasyncapi\nmcp      ──→ discovers tools from all modules          → \u002Fmcp\nmodspec  ──→ reads IR + routes from all modules        → \u002Fmodules.json + \u002Fmodules\n                (links to openapi + asyncapi UIs)\n\nhealth (standalone)\n",[1099,3693,3691],{"__ignoreMap":1180},[978,3695,3696,3697,3700],{},"Every module is ",[982,3698,3699],{},"optional"," — import only what you need. Dependencies are resolved automatically at bootstrap.",[1263,3702,3704],{"id":3703},"the-three-spec-layers","The three spec layers",[1013,3706,3707,3719],{},[1016,3708,3709],{},[1019,3710,3711,3714,3716],{},[1022,3712,3713],{},"Spec",[1022,3715,1278],{},[1022,3717,3718],{},"Covers",[1032,3720,3721,3737,3752],{},[1019,3722,3723,3727,3734],{},[1037,3724,3725],{},[982,3726,297],{},[1037,3728,3729,3731,3732],{},[1099,3730,2424],{}," + ",[1099,3733,2434],{},[1037,3735,3736],{},"HTTP routes, request\u002Fresponse schemas, security",[1019,3738,3739,3743,3749],{},[1037,3740,3741],{},[982,3742,301],{},[1037,3744,3745,3731,3747],{},[1099,3746,2712],{},[1099,3748,2725],{},[1037,3750,3751],{},"Event channels, message schemas, consumer groups",[1019,3753,3754,3759,3765],{},[1037,3755,3756],{},[982,3757,3758],{},"ModSpec",[1037,3760,3761,3731,3763],{},[1099,3762,3239],{},[1099,3764,3249],{},[1037,3766,3767],{},"Module architecture — entities, CRUD, config, settings, flows; links to both above",[1239,3769],{},[1008,3771,3773],{"id":3772},"creating-custom-modules","Creating custom modules",[978,3775,3776,3777,3779,3780,3782],{},"See the ",[1001,3778,82],{"href":83}," guide and the ",[1001,3781,164],{"href":165}," reference for defining your own modules with YAML specs, JSON Schema validation, and auto-generated diagrams.",[3784,3785,3786],"style",{},"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1180,"searchDepth":16,"depth":16,"links":3788},[3789,3790,3791,3798,3805,3812,3813,3819,3824,3830,3836,3839],{"id":1010,"depth":16,"text":1011},{"id":1169,"depth":16,"text":1170},{"id":1044,"depth":16,"text":1044,"children":3792},[3793,3794,3795,3796,3797],{"id":1265,"depth":22,"text":1266},{"id":1329,"depth":22,"text":33},{"id":1386,"depth":22,"text":1387},{"id":1449,"depth":22,"text":1450},{"id":1575,"depth":22,"text":1576},{"id":1060,"depth":16,"text":1060,"children":3799},[3800,3801,3802,3803,3804],{"id":1621,"depth":22,"text":1622},{"id":1827,"depth":22,"text":1266},{"id":1928,"depth":22,"text":33},{"id":1973,"depth":22,"text":1974},{"id":2012,"depth":22,"text":1450},{"id":1076,"depth":16,"text":1076,"children":3806},[3807,3808,3809,3810,3811],{"id":2110,"depth":22,"text":2111},{"id":2213,"depth":22,"text":33},{"id":2258,"depth":22,"text":1974},{"id":2264,"depth":22,"text":1450},{"id":2294,"depth":22,"text":2295},{"id":1092,"depth":16,"text":1092},{"id":1112,"depth":16,"text":1112,"children":3814},[3815,3816,3817,3818],{"id":2404,"depth":22,"text":2405},{"id":2440,"depth":22,"text":2441},{"id":2523,"depth":22,"text":2524},{"id":2601,"depth":22,"text":1450},{"id":1128,"depth":16,"text":1128,"children":3820},[3821,3822,3823],{"id":2693,"depth":22,"text":2405},{"id":2731,"depth":22,"text":2732},{"id":2766,"depth":22,"text":1450},{"id":1144,"depth":16,"text":1144,"children":3825},[3826,3827,3828,3829],{"id":2858,"depth":22,"text":2859},{"id":2890,"depth":22,"text":2891},{"id":2972,"depth":22,"text":2973},{"id":3092,"depth":22,"text":3093},{"id":1160,"depth":16,"text":1160,"children":3831},[3832,3833,3834,3835],{"id":3220,"depth":22,"text":2405},{"id":3255,"depth":22,"text":3256},{"id":3321,"depth":22,"text":3322},{"id":3597,"depth":22,"text":1450},{"id":3683,"depth":16,"text":3684,"children":3837},[3838],{"id":3703,"depth":22,"text":3704},{"id":3772,"depth":16,"text":3773},"Redelay ships with 8 production-ready modules: auth, users, groups, health, OpenAPI, AsyncAPI, MCP, and module spec browser — all wired up automatically.","md",null,{},{"order":16,"icon":46},{"title":140,"description":3840},"fqv659D0kSQYykJEMkifdW9rfxquK7IxcZieML39JdQ",[3848,3850],{"title":135,"path":136,"stem":137,"description":3849,"order":10,"icon":138,"children":-1},"Full reference for the redelay go-framework — module system, auth, users, groups, CRUD, server, and infrastructure.",{"title":144,"path":145,"stem":146,"description":3851,"order":22,"icon":147,"children":-1},"Domain addon modules: scheduler, settings, storage, notifications, verification, links, metrics, search, i18n, apilog, content, workers, coordination, websockets, and flowexec.",1790332223783]