[{"data":1,"prerenderedAt":1224},["ShallowReactive",2],{"navigation_docs":3,"-docs-capabilities-overview":493,"-docs-capabilities-overview-surround":1219},[4,46,135,218,257,292,355,377,420],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":45},"Getting Started","i-lucide-rocket","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"What is Heximon?","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F01.getting-started\u002F02.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002F01.getting-started\u002F03.quick-start","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Core Concepts","\u002Fdocs\u002Fgetting-started\u002Fcore-concepts","docs\u002F01.getting-started\u002F04.core-concepts","i-lucide-shapes",{"title":31,"path":32,"stem":33,"icon":34},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F01.getting-started\u002F05.examples","i-lucide-library",{"title":36,"path":37,"stem":38,"icon":39},"Where Next?","\u002Fdocs\u002Fgetting-started\u002Fwhere-next","docs\u002F01.getting-started\u002F06.where-next","i-lucide-signpost",{"title":41,"path":42,"stem":43,"icon":44},"Troubleshooting","\u002Fdocs\u002Fgetting-started\u002Ftroubleshooting","docs\u002F01.getting-started\u002F07.troubleshooting","i-lucide-life-buoy",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Essentials","i-lucide-boxes","\u002Fdocs\u002Fessentials","docs\u002F02.essentials",[52,56,61,66,71,76,81,86,91,96,101,105,110,115,120,125,130],{"title":53,"path":54,"stem":55,"icon":48},"Modules & DI","\u002Fdocs\u002Fessentials\u002Fmodules-and-di","docs\u002F02.essentials\u002F01.modules-and-di",{"title":57,"path":58,"stem":59,"icon":60},"Controllers","\u002Fdocs\u002Fessentials\u002Fcontrollers","docs\u002F02.essentials\u002F02.controllers","i-lucide-route",{"title":62,"path":63,"stem":64,"icon":65},"Validation & DTOs","\u002Fdocs\u002Fessentials\u002Fvalidation","docs\u002F02.essentials\u002F03.validation","i-lucide-shield-check",{"title":67,"path":68,"stem":69,"icon":70},"Contracts","\u002Fdocs\u002Fessentials\u002Fcontracts","docs\u002F02.essentials\u002F04.contracts","i-lucide-file-signature",{"title":72,"path":73,"stem":74,"icon":75},"REST Client","\u002Fdocs\u002Fessentials\u002Fclient","docs\u002F02.essentials\u002F05.client","i-lucide-plug",{"title":77,"path":78,"stem":79,"icon":80},"Database","\u002Fdocs\u002Fessentials\u002Fdatabase","docs\u002F02.essentials\u002F06.database","i-lucide-database",{"title":82,"path":83,"stem":84,"icon":85},"Drizzle ORM","\u002Fdocs\u002Fessentials\u002Fdrizzle","docs\u002F02.essentials\u002F07.drizzle","i-lucide-database-zap",{"title":87,"path":88,"stem":89,"icon":90},"Persistence & Transactions","\u002Fdocs\u002Fessentials\u002Fpersistence","docs\u002F02.essentials\u002F08.persistence","i-lucide-database-backup",{"title":92,"path":93,"stem":94,"icon":95},"Migrations","\u002Fdocs\u002Fessentials\u002Fmigrations","docs\u002F02.essentials\u002F09.migrations","i-lucide-git-branch",{"title":97,"path":98,"stem":99,"icon":100},"Authentication","\u002Fdocs\u002Fessentials\u002Fauthentication","docs\u002F02.essentials\u002F10.authentication","i-lucide-key-round",{"title":102,"path":103,"stem":104,"icon":65},"Permissions & scopes","\u002Fdocs\u002Fessentials\u002Fpermissions","docs\u002F02.essentials\u002F11.permissions",{"title":106,"path":107,"stem":108,"icon":109},"Error Handling","\u002Fdocs\u002Fessentials\u002Ferrors","docs\u002F02.essentials\u002F12.errors","i-lucide-triangle-alert",{"title":111,"path":112,"stem":113,"icon":114},"Testing a Heximon App","\u002Fdocs\u002Fessentials\u002Ftesting","docs\u002F02.essentials\u002F13.testing","i-lucide-flask-conical",{"title":116,"path":117,"stem":118,"icon":119},"Test app harness","\u002Fdocs\u002Fessentials\u002Fcreatetestapp","docs\u002F02.essentials\u002F14.createtestapp","i-lucide-test-tube",{"title":121,"path":122,"stem":123,"icon":124},"Logging & Observability","\u002Fdocs\u002Fessentials\u002Flogging","docs\u002F02.essentials\u002F17.logging","i-lucide-scroll-text",{"title":126,"path":127,"stem":128,"icon":129},"Context & Lifecycle","\u002Fdocs\u002Fessentials\u002Fcontext-and-lifecycle","docs\u002F02.essentials\u002F18.context-and-lifecycle","i-lucide-radio",{"title":131,"path":132,"stem":133,"icon":134},"Project Structure","\u002Fdocs\u002Fessentials\u002Fproject-structure","docs\u002F02.essentials\u002F19.project-structure","i-lucide-folder-tree",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":45},"Capabilities","i-lucide-sparkles","\u002Fdocs\u002Fcapabilities","docs\u002F03.capabilities",[141,145,150,155,160,164,169,174,179,184,188,193,198,203,208,213],{"title":142,"path":143,"stem":144,"icon":137},"Overview","\u002Fdocs\u002Fcapabilities\u002Foverview","docs\u002F03.capabilities\u002F01.overview",{"title":146,"path":147,"stem":148,"icon":149},"Events","\u002Fdocs\u002Fcapabilities\u002Fevents","docs\u002F03.capabilities\u002F02.events","i-lucide-radio-tower",{"title":151,"path":152,"stem":153,"icon":154},"Queue","\u002Fdocs\u002Fcapabilities\u002Fbackground-jobs","docs\u002F03.capabilities\u002F03.background-jobs","i-lucide-list-ordered",{"title":156,"path":157,"stem":158,"icon":159},"Scheduled Work","\u002Fdocs\u002Fcapabilities\u002Fscheduled-jobs","docs\u002F03.capabilities\u002F04.scheduled-jobs","i-lucide-clock",{"title":161,"path":162,"stem":163,"icon":85},"Caching","\u002Fdocs\u002Fcapabilities\u002Fcaching","docs\u002F03.capabilities\u002F05.caching",{"title":165,"path":166,"stem":167,"icon":168},"Key\u002FValue Storage","\u002Fdocs\u002Fcapabilities\u002Fkey-value","docs\u002F03.capabilities\u002F06.key-value","i-lucide-hard-drive",{"title":170,"path":171,"stem":172,"icon":173},"Blob Storage","\u002Fdocs\u002Fcapabilities\u002Fblob","docs\u002F03.capabilities\u002F07.blob","i-lucide-folder-open",{"title":175,"path":176,"stem":177,"icon":178},"Health & Readiness","\u002Fdocs\u002Fcapabilities\u002Fhealth","docs\u002F03.capabilities\u002F08.health","i-lucide-heart-pulse",{"title":180,"path":181,"stem":182,"icon":183},"Notifications","\u002Fdocs\u002Fcapabilities\u002Fnotifications","docs\u002F03.capabilities\u002F09.notifications","i-lucide-mail",{"title":185,"path":186,"stem":187,"icon":65},"Idempotency","\u002Fdocs\u002Fcapabilities\u002Fidempotency","docs\u002F03.capabilities\u002F10.idempotency",{"title":189,"path":190,"stem":191,"icon":192},"Security Hardening","\u002Fdocs\u002Fcapabilities\u002Fsecurity","docs\u002F03.capabilities\u002F11.security","i-lucide-shield",{"title":194,"path":195,"stem":196,"icon":197},"Observability & Tracing","\u002Fdocs\u002Fcapabilities\u002Fobservability","docs\u002F03.capabilities\u002F12.observability","i-lucide-activity",{"title":199,"path":200,"stem":201,"icon":202},"OpenAPI","\u002Fdocs\u002Fcapabilities\u002Fopenapi","docs\u002F03.capabilities\u002F13.openapi","i-lucide-book-marked",{"title":204,"path":205,"stem":206,"icon":207},"MCP Server","\u002Fdocs\u002Fcapabilities\u002Fmcp","docs\u002F03.capabilities\u002F14.mcp","i-lucide-bot",{"title":209,"path":210,"stem":211,"icon":212},"Schema DTOs","\u002Fdocs\u002Fcapabilities\u002Fschema","docs\u002F03.capabilities\u002F15.schema","i-lucide-file-json",{"title":214,"path":215,"stem":216,"icon":217},"Branded IDs","\u002Fdocs\u002Fcapabilities\u002Fbranded-ids","docs\u002F03.capabilities\u002F16.branded-ids","i-lucide-tag",{"title":219,"icon":220,"path":221,"stem":222,"children":223,"page":45},"Architecture","i-lucide-building","\u002Fdocs\u002Farchitecture","docs\u002F04.architecture",[224,227,232,237,242,247,252],{"title":142,"path":225,"stem":226,"icon":220},"\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F04.architecture\u002F01.overview",{"title":228,"path":229,"stem":230,"icon":231},"Domain-Driven Design","\u002Fdocs\u002Farchitecture\u002Fddd","docs\u002F04.architecture\u002F02.ddd","i-lucide-hexagon",{"title":233,"path":234,"stem":235,"icon":236},"CQRS","\u002Fdocs\u002Farchitecture\u002Fcqrs","docs\u002F04.architecture\u002F03.cqrs","i-lucide-split",{"title":238,"path":239,"stem":240,"icon":241},"Repository Pattern","\u002Fdocs\u002Farchitecture\u002Frepository-pattern","docs\u002F04.architecture\u002F04.repository-pattern","i-lucide-archive",{"title":243,"path":244,"stem":245,"icon":246},"Integration Events","\u002Fdocs\u002Farchitecture\u002Fintegration-events","docs\u002F04.architecture\u002F05.integration-events","i-lucide-send-horizontal",{"title":248,"path":249,"stem":250,"icon":251},"Saga Orchestration","\u002Fdocs\u002Farchitecture\u002Fsagas","docs\u002F04.architecture\u002F06.sagas","i-lucide-hourglass",{"title":253,"path":254,"stem":255,"icon":256},"Durable Workflows","\u002Fdocs\u002Farchitecture\u002Fworkflows","docs\u002F04.architecture\u002F07.workflows","i-lucide-workflow",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":45},"Realtime","i-lucide-cable","\u002Fdocs\u002Frealtime","docs\u002F05.realtime",[263,266,270,274,279,284,288],{"title":142,"path":264,"stem":265,"icon":259},"\u002Fdocs\u002Frealtime\u002Foverview","docs\u002F05.realtime\u002F01.overview",{"title":267,"path":268,"stem":269,"icon":129},"WebSockets","\u002Fdocs\u002Frealtime\u002Fwebsockets","docs\u002F05.realtime\u002F02.websockets",{"title":271,"path":272,"stem":273,"icon":70},"WebSocket Contracts","\u002Fdocs\u002Frealtime\u002Fwebsocket-contracts","docs\u002F05.realtime\u002F03.websocket-contracts",{"title":275,"path":276,"stem":277,"icon":278},"Server-Sent Events","\u002Fdocs\u002Frealtime\u002Fserver-sent-events","docs\u002F05.realtime\u002F04.server-sent-events","i-lucide-rss",{"title":280,"path":281,"stem":282,"icon":283},"Typed Clients","\u002Fdocs\u002Frealtime\u002Ftyped-clients","docs\u002F05.realtime\u002F05.typed-clients","i-lucide-plug-zap",{"title":285,"path":286,"stem":287,"icon":259},"AsyncAPI","\u002Fdocs\u002Frealtime\u002Fasyncapi","docs\u002F05.realtime\u002F06.asyncapi",{"title":289,"path":290,"stem":291,"icon":80},"Durable Objects","\u002Fdocs\u002Frealtime\u002Fdurable-objects","docs\u002F05.realtime\u002F07.durable-objects",{"title":293,"icon":294,"path":295,"stem":296,"children":297,"page":45},"Deploy","i-lucide-cloud-upload","\u002Fdocs\u002Fdeploy","docs\u002F06.deploy",[298,301,306,311,316,321,326,331,336,341,345,350],{"title":142,"path":299,"stem":300,"icon":6},"\u002Fdocs\u002Fdeploy\u002Foverview","docs\u002F06.deploy\u002F01.overview",{"title":302,"path":303,"stem":304,"icon":305},"Node","\u002Fdocs\u002Fdeploy\u002Fnode","docs\u002F06.deploy\u002F02.node","la:node-js",{"title":307,"path":308,"stem":309,"icon":310},"Cloudflare","\u002Fdocs\u002Fdeploy\u002Fcloudflare","docs\u002F06.deploy\u002F03.cloudflare","simple-icons:cloudflare",{"title":312,"path":313,"stem":314,"icon":315},"Vercel","\u002Fdocs\u002Fdeploy\u002Fvercel","docs\u002F06.deploy\u002F04.vercel","ri:vercel-fill",{"title":317,"path":318,"stem":319,"icon":320},"Netlify","\u002Fdocs\u002Fdeploy\u002Fnetlify","docs\u002F06.deploy\u002F05.netlify","i-simple-icons-netlify",{"title":322,"path":323,"stem":324,"icon":325},"AWS Lambda","\u002Fdocs\u002Fdeploy\u002Faws-lambda","docs\u002F06.deploy\u002F06.aws-lambda","hugeicons:aws-lambda",{"title":327,"path":328,"stem":329,"icon":330},"Deno Deploy","\u002Fdocs\u002Fdeploy\u002Fdeno-deploy","docs\u002F06.deploy\u002F07.deno-deploy","simple-icons:denodeploy",{"title":332,"path":333,"stem":334,"icon":335},"Nitro","\u002Fdocs\u002Fdeploy\u002Fnitro","docs\u002F06.deploy\u002F08.nitro","i-unjs-nitro",{"title":337,"path":338,"stem":339,"icon":340},"Nuxt","\u002Fdocs\u002Fdeploy\u002Fnuxt","docs\u002F06.deploy\u002F09.nuxt","i-devicon-nuxt",{"title":342,"path":343,"stem":344,"icon":236},"Mixed-runtime split","\u002Fdocs\u002Fdeploy\u002Fmixed-runtime-split","docs\u002F06.deploy\u002F10.mixed-runtime-split",{"title":346,"path":347,"stem":348,"icon":349},"Hosts","\u002Fdocs\u002Fdeploy\u002Fhosts","docs\u002F06.deploy\u002F11.hosts","i-lucide-map",{"title":351,"path":352,"stem":353,"icon":354},"Cross-service events","\u002Fdocs\u002Fdeploy\u002Fcross-service-events","docs\u002F06.deploy\u002F12.cross-service-events","i-lucide-network",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":45},"CLI","i-lucide-terminal","\u002Fdocs\u002Fcli","docs\u002F07.cli",[361,365,369,373],{"title":362,"path":363,"stem":364,"icon":357},"The heximon CLI","\u002Fdocs\u002Fcli\u002Foverview","docs\u002F07.cli\u002F01.overview",{"title":366,"path":367,"stem":368,"icon":137},"Create a New App","\u002Fdocs\u002Fcli\u002Fcreate","docs\u002F07.cli\u002F02.create",{"title":370,"path":371,"stem":372,"icon":95},"Migrations from the CLI","\u002Fdocs\u002Fcli\u002Fmigrations","docs\u002F07.cli\u002F03.migrations",{"title":374,"path":375,"stem":376,"icon":6},"Deploying a Heximon app","\u002Fdocs\u002Fcli\u002Fdeploy","docs\u002F07.cli\u002F04.deploy",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":45},"Under the Hood","i-lucide-wrench","\u002Fdocs\u002Funder-the-hood","docs\u002F08.under-the-hood",[383,388,393,397,402,407,411,415],{"title":384,"path":385,"stem":386,"icon":387},"How the Compiler Works","\u002Fdocs\u002Funder-the-hood\u002Fhow-the-compiler-works","docs\u002F08.under-the-hood\u002F01.how-the-compiler-works","i-lucide-cog",{"title":389,"path":390,"stem":391,"icon":392},"Compiler","\u002Fdocs\u002Funder-the-hood\u002Fextending-the-compiler","docs\u002F08.under-the-hood\u002F02.extending-the-compiler","i-lucide-cpu",{"title":394,"path":395,"stem":396,"icon":357},"Compiler Diagnostics","\u002Fdocs\u002Funder-the-hood\u002Fcompiler-diagnostics","docs\u002F08.under-the-hood\u002F03.compiler-diagnostics",{"title":398,"path":399,"stem":400,"icon":401},"Library Mode","\u002Fdocs\u002Funder-the-hood\u002Flibrary-mode","docs\u002F08.under-the-hood\u002F04.library-mode","i-lucide-package",{"title":403,"path":404,"stem":405,"icon":406},"Other bundlers","\u002Fdocs\u002Funder-the-hood\u002Falternate-bundlers","docs\u002F08.under-the-hood\u002F05.alternate-bundlers","i-lucide-blocks",{"title":408,"path":409,"stem":410,"icon":401},"Packages","\u002Fdocs\u002Funder-the-hood\u002Fpackages","docs\u002F08.under-the-hood\u002F06.packages",{"title":412,"path":413,"stem":414,"icon":207},"AI Skills","\u002Fdocs\u002Funder-the-hood\u002Fai-and-agents","docs\u002F08.under-the-hood\u002F07.ai-and-agents",{"title":416,"path":417,"stem":418,"icon":419},"Advanced DI","\u002Fdocs\u002Funder-the-hood\u002Fadvanced-di","docs\u002F08.under-the-hood\u002F08.advanced-di","i-lucide-git-fork",{"title":421,"icon":422,"path":423,"stem":424,"children":425,"page":45},"Recipes","i-lucide-book-open-check","\u002Fdocs\u002Frecipes","docs\u002F09.recipes",[426,431,436,440,444,448,452,456,460,465,469,474,479,484,488],{"title":427,"path":428,"stem":429,"icon":430},"Send an Email","\u002Fdocs\u002Frecipes\u002Fsend-an-email","docs\u002F09.recipes\u002F01.send-an-email","i-lucide-send",{"title":432,"path":433,"stem":434,"icon":435},"Upload a File","\u002Fdocs\u002Frecipes\u002Fupload-a-file","docs\u002F09.recipes\u002F02.upload-a-file","i-lucide-upload",{"title":437,"path":438,"stem":439,"icon":24},"Cache an Expensive Call","\u002Fdocs\u002Frecipes\u002Fcache-an-expensive-call","docs\u002F09.recipes\u002F03.cache-an-expensive-call",{"title":441,"path":442,"stem":443,"icon":154},"Paginate a List","\u002Fdocs\u002Frecipes\u002Fpaginate-a-list","docs\u002F09.recipes\u002F04.paginate-a-list",{"title":445,"path":446,"stem":447,"icon":65},"Protect Admin Routes","\u002Fdocs\u002Frecipes\u002Fprotect-admin-routes","docs\u002F09.recipes\u002F05.protect-admin-routes",{"title":449,"path":450,"stem":451,"icon":178},"Health Probes and a Nightly Job","\u002Fdocs\u002Frecipes\u002Fhealth-probes-and-a-nightly-job","docs\u002F09.recipes\u002F06.health-probes-and-a-nightly-job",{"title":453,"path":454,"stem":455,"icon":80},"Build a CRUD API","\u002Fdocs\u002Frecipes\u002Fcrud-api","docs\u002F09.recipes\u002F07.crud-api",{"title":457,"path":458,"stem":459,"icon":100},"Add Authentication","\u002Fdocs\u002Frecipes\u002Fadd-authentication","docs\u002F09.recipes\u002F08.add-authentication",{"title":461,"path":462,"stem":463,"icon":464},"Background Jobs","\u002Fdocs\u002Frecipes\u002Fbackground-jobs","docs\u002F09.recipes\u002F09.background-jobs","i-lucide-timer",{"title":466,"path":467,"stem":468,"icon":149},"Decouple Features with Events","\u002Fdocs\u002Frecipes\u002Fevent-driven-module","docs\u002F09.recipes\u002F10.event-driven-module",{"title":470,"path":471,"stem":472,"icon":473},"Build a DDD Aggregate","\u002Fdocs\u002Frecipes\u002Fddd-aggregate","docs\u002F09.recipes\u002F11.ddd-aggregate","i-lucide-box",{"title":475,"path":476,"stem":477,"icon":478},"Publish a Feature Package","\u002Fdocs\u002Frecipes\u002Ffeature-package","docs\u002F09.recipes\u002F12.feature-package","i-lucide-package-open",{"title":480,"path":481,"stem":482,"icon":483},"Reliable Integration Events","\u002Fdocs\u002Frecipes\u002Freliable-integration-events","docs\u002F09.recipes\u002F13.reliable-integration-events","i-lucide-inbox",{"title":485,"path":486,"stem":487,"icon":95},"Reactive Choreography","\u002Fdocs\u002Frecipes\u002Freactive-choreography","docs\u002F09.recipes\u002F14.reactive-choreography",{"title":489,"path":490,"stem":491,"icon":492},"Build a Production CRUD API","\u002Fdocs\u002Frecipes\u002Fproduction-crud-api","docs\u002F09.recipes\u002F15.production-crud-api","i-lucide-layers",{"id":494,"title":136,"body":495,"description":1212,"extension":1213,"links":1214,"meta":1215,"navigation":1216,"path":143,"seo":1217,"stem":144,"__hash__":1218},"docs\u002Fdocs\u002F03.capabilities\u002F01.overview.md",{"type":496,"value":497,"toc":1207},"minimark",[498,502,514,519,526,658,661,784,791,806,810,1186,1190,1197,1203],[499,500,501],"p",{},"Your app already has a module, a controller, a database call. Production adds a short, predictable list of\nconcerns on top — none of them change how you got here. Every capability in this section is the same move:",[499,503,504,513],{},[505,506,507,508,512],"strong",{},"add a package, add one config line — a plugin in ",[509,510,511],"code",{},"heximon.config.ts"," and a namespace key in your\nmodule's config — then write a class."," The compiler discovers the class from that namespace key, not from\nscanning your codebase, so nothing you write is \"magically found\" — it's listed, exactly once, where you'd\nexpect to look.",[515,516,518],"h2",{"id":517},"the-one-move-before-and-after","The one move, before and after",[499,520,521,522,525],{},"Start from the shape ",[509,523,524],{},"heximon create"," scaffolds — one plugin, nothing else:",[527,528,533],"pre",{"className":529,"code":530,"filename":511,"language":531,"meta":532,"style":532},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\n\n\u002F\u002F The capability manifest: one compiler plugin per capability. The entire HTTP layer is the one plugin\n\u002F\u002F below; everything you add later (events, CQRS, queues, …) is one more entry in the same list.\nexport default defineHeximonConfig({ plugins: [new HttpPlugin()] });\n","ts","",[509,534,535,571,594,601,608,614],{"__ignoreMap":532},[536,537,540,544,548,552,555,558,561,565,568],"span",{"class":538,"line":539},"line",1,[536,541,543],{"class":542},"s7zQu","import",[536,545,547],{"class":546},"sMK4o"," {",[536,549,551],{"class":550},"sTEyZ"," defineHeximonConfig",[536,553,554],{"class":546}," }",[536,556,557],{"class":542}," from",[536,559,560],{"class":546}," \"",[536,562,564],{"class":563},"sfazB","@heximon\u002Fbuild",[536,566,567],{"class":546},"\"",[536,569,570],{"class":546},";\n",[536,572,574,576,578,581,583,585,587,590,592],{"class":538,"line":573},2,[536,575,543],{"class":542},[536,577,547],{"class":546},[536,579,580],{"class":550}," HttpPlugin",[536,582,554],{"class":546},[536,584,557],{"class":542},[536,586,560],{"class":546},[536,588,589],{"class":563},"@heximon\u002Fhttp\u002Fcompiler",[536,591,567],{"class":546},[536,593,570],{"class":546},[536,595,597],{"class":538,"line":596},3,[536,598,600],{"emptyLinePlaceholder":599},true,"\n",[536,602,604],{"class":538,"line":603},4,[536,605,607],{"class":606},"sHwdD","\u002F\u002F The capability manifest: one compiler plugin per capability. The entire HTTP layer is the one plugin\n",[536,609,611],{"class":538,"line":610},5,[536,612,613],{"class":606},"\u002F\u002F below; everything you add later (events, CQRS, queues, …) is one more entry in the same list.\n",[536,615,617,620,623,626,629,632,636,639,642,645,647,650,653,656],{"class":538,"line":616},6,[536,618,619],{"class":542},"export",[536,621,622],{"class":542}," default",[536,624,551],{"class":625},"s2Zo4",[536,627,628],{"class":550},"(",[536,630,631],{"class":546},"{",[536,633,635],{"class":634},"swJcz"," plugins",[536,637,638],{"class":546},":",[536,640,641],{"class":550}," [",[536,643,644],{"class":546},"new",[536,646,580],{"class":625},[536,648,649],{"class":550},"()] ",[536,651,652],{"class":546},"}",[536,654,655],{"class":550},")",[536,657,570],{"class":546},[499,659,660],{},"Add events — a second package, a second plugin, nothing else touched:",[527,662,664],{"className":529,"code":663,"filename":511,"language":531,"meta":532,"style":532},"import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { EventEmitterPlugin } from \"@heximon\u002Fevents\u002Fcompiler\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\n\nexport default defineHeximonConfig({\n  plugins: [new HttpPlugin(), new EventEmitterPlugin()],\n});\n",[509,665,666,686,708,728,732,745,775],{"__ignoreMap":532},[536,667,668,670,672,674,676,678,680,682,684],{"class":538,"line":539},[536,669,543],{"class":542},[536,671,547],{"class":546},[536,673,551],{"class":550},[536,675,554],{"class":546},[536,677,557],{"class":542},[536,679,560],{"class":546},[536,681,564],{"class":563},[536,683,567],{"class":546},[536,685,570],{"class":546},[536,687,688,690,692,695,697,699,701,704,706],{"class":538,"line":573},[536,689,543],{"class":542},[536,691,547],{"class":546},[536,693,694],{"class":550}," EventEmitterPlugin",[536,696,554],{"class":546},[536,698,557],{"class":542},[536,700,560],{"class":546},[536,702,703],{"class":563},"@heximon\u002Fevents\u002Fcompiler",[536,705,567],{"class":546},[536,707,570],{"class":546},[536,709,710,712,714,716,718,720,722,724,726],{"class":538,"line":596},[536,711,543],{"class":542},[536,713,547],{"class":546},[536,715,580],{"class":550},[536,717,554],{"class":546},[536,719,557],{"class":542},[536,721,560],{"class":546},[536,723,589],{"class":563},[536,725,567],{"class":546},[536,727,570],{"class":546},[536,729,730],{"class":538,"line":603},[536,731,600],{"emptyLinePlaceholder":599},[536,733,734,736,738,740,742],{"class":538,"line":610},[536,735,619],{"class":542},[536,737,622],{"class":542},[536,739,551],{"class":625},[536,741,628],{"class":550},[536,743,744],{"class":546},"{\n",[536,746,747,750,752,754,756,758,761,764,767,769,772],{"class":538,"line":616},[536,748,749],{"class":634},"  plugins",[536,751,638],{"class":546},[536,753,641],{"class":550},[536,755,644],{"class":546},[536,757,580],{"class":625},[536,759,760],{"class":550},"()",[536,762,763],{"class":546},",",[536,765,766],{"class":546}," new",[536,768,694],{"class":625},[536,770,771],{"class":550},"()]",[536,773,774],{"class":546},",\n",[536,776,778,780,782],{"class":538,"line":777},7,[536,779,652],{"class":546},[536,781,655],{"class":550},[536,783,570],{"class":546},[499,785,786,787,790],{},"Your module's config then lists the class under the plugin's namespace — one key, e.g.\n",[509,788,789],{},"events: { handlers: [OrderPlacedHandler] }"," — and you write the handler as a plain class. That's the whole\npattern; every row below is this same move with a different package and namespace key.",[499,792,793,794,797,798,801,802,805],{},"Not every capability needs a plugin at all — several (caching, key\u002Fvalue, blob, notifications, idempotency)\nare ",[505,795,796],{},"plain injectable providers",": you ",[509,799,800],{},"pnpm add"," the package and list a class in ",[509,803,804],{},"providers",", no compiler\nplugin and no namespace key required. The table below says which is which.",[515,807,809],{"id":808},"every-capability-one-line-each","Every capability, one line each",[811,812,813,833],"table",{},[814,815,816],"thead",{},[817,818,819,824,827,830],"tr",{},[820,821,823],"th",{"align":822},"left","Capability",[820,825,826],{"align":822},"Package",[820,828,829],{"align":822},"The one config line",[820,831,832],{"align":822},"Page",[834,835,836,860,882,904,931,950,969,991,1009,1047,1073,1097,1117,1140,1167],"tbody",{},[817,837,838,841,846,855],{},[839,840,146],"td",{"align":822},[839,842,843],{"align":822},[509,844,845],{},"@heximon\u002Fevents",[839,847,848,851,852],{"align":822},[509,849,850],{},"plugins: [new EventEmitterPlugin()]",", module: ",[509,853,854],{},"events: { handlers }",[839,856,857],{"align":822},[858,859,146],"a",{"href":147},[817,861,862,865,870,878],{},[839,863,864],{"align":822},"Background jobs (queue)",[839,866,867],{"align":822},[509,868,869],{},"@heximon\u002Fqueue",[839,871,872,851,875],{"align":822},[509,873,874],{},"plugins: [new QueuePlugin()]",[509,876,877],{},"queue: { handlers }",[839,879,880],{"align":822},[858,881,151],{"href":152},[817,883,884,887,892,900],{},[839,885,886],{"align":822},"Scheduled work (cron)",[839,888,889],{"align":822},[509,890,891],{},"@heximon\u002Fschedule",[839,893,894,851,897],{"align":822},[509,895,896],{},"plugins: [new SchedulePlugin()]",[509,898,899],{},"schedule: { handlers }",[839,901,902],{"align":822},[858,903,156],{"href":157},[817,905,906,908,913,927],{},[839,907,161],{"align":822},[839,909,910],{"align":822},[509,911,912],{},"@heximon\u002Fcache",[839,914,915,916,919,920,923,924],{"align":822},"provider only: ",[509,917,918],{},"providers: [{ provide: Cache, useFactory: ... }]",", ",[509,921,922],{},"http: { middlewares: [CacheMiddleware] }"," \u002F ",[509,925,926],{},"cqrs: { queryInterceptors: [QueryCacheInterceptor] }",[839,928,929],{"align":822},[858,930,161],{"href":162},[817,932,933,936,941,946],{},[839,934,935],{"align":822},"Key\u002Fvalue storage",[839,937,938],{"align":822},[509,939,940],{},"@heximon\u002Fkv",[839,942,915,943],{"align":822},[509,944,945],{},"providers: [{ provide: Storage, useFactory: ... }]",[839,947,948],{"align":822},[858,949,165],{"href":166},[817,951,952,955,960,965],{},[839,953,954],{"align":822},"Blob storage",[839,956,957],{"align":822},[509,958,959],{},"@heximon\u002Fblob",[839,961,915,962],{"align":822},[509,963,964],{},"providers: [{ provide: BlobStore, useFactory: ... }]",[839,966,967],{"align":822},[858,968,170],{"href":171},[817,970,971,974,979,987],{},[839,972,973],{"align":822},"Health & readiness",[839,975,976],{"align":822},[509,977,978],{},"@heximon\u002Fhealth",[839,980,981,851,984],{"align":822},[509,982,983],{},"plugins: [new HealthPlugin()]",[509,985,986],{},"health: { indicators }",[839,988,989],{"align":822},[858,990,175],{"href":176},[817,992,993,995,1000,1005],{},[839,994,180],{"align":822},[839,996,997],{"align":822},[509,998,999],{},"@heximon\u002Fnotifications",[839,1001,915,1002],{"align":822},[509,1003,1004],{},"providers: [EmailTransport-satisfying class]",[839,1006,1007],{"align":822},[858,1008,180],{"href":181},[817,1010,1011,1013,1027,1043],{},[839,1012,185],{"align":822},[839,1014,1015,923,1017,923,1020,1022,1023,1026],{"align":822},[509,1016,845],{},[509,1018,1019],{},"@heximon\u002Fcqrs",[509,1021,869],{}," (",[509,1024,1025],{},".\u002Fidempotency"," subpath)",[839,1028,1029,1030,923,1033,923,1036,1039,1040],{"align":822},"provider only: list the interceptor directly under the existing ",[509,1031,1032],{},"events",[509,1034,1035],{},"cqrs",[509,1037,1038],{},"queue"," namespace, e.g. ",[509,1041,1042],{},"events: { interceptors: [EventIdempotencyInterceptor] }",[839,1044,1045],{"align":822},[858,1046,185],{"href":186},[817,1048,1049,1052,1060,1069],{},[839,1050,1051],{"align":822},"Security hardening",[839,1053,1054,1022,1057,1026],{"align":822},[509,1055,1056],{},"@heximon\u002Fhttp",[509,1058,1059],{},".\u002Fsecurity",[839,1061,915,1062,1065,1066],{"align":822},[509,1063,1064],{},"providers: [RateLimitMiddleware-satisfying class]",", applied per-route via ",[509,1067,1068],{},"middlewares",[839,1070,1071],{"align":822},[858,1072,189],{"href":190},[817,1074,1075,1078,1083,1093],{},[839,1076,1077],{"align":822},"Observability & tracing",[839,1079,1080],{"align":822},[509,1081,1082],{},"@heximon\u002Fotel",[839,1084,1085,1088,1089,1092],{"align":822},[509,1086,1087],{},"plugins: [new OtelPlugin()]",", top-level ",[509,1090,1091],{},"otel: {...}"," config key",[839,1094,1095],{"align":822},[858,1096,194],{"href":195},[817,1098,1099,1101,1106,1113],{},[839,1100,199],{"align":822},[839,1102,1103],{"align":822},[509,1104,1105],{},"@heximon\u002Fopenapi",[839,1107,1108,1109,1112],{"align":822},"no plugin — construct ",[509,1110,1111],{},"new OpenApiGenerator(...)"," from your own controller",[839,1114,1115],{"align":822},[858,1116,199],{"href":200},[817,1118,1119,1122,1127,1136],{},[839,1120,1121],{"align":822},"MCP server",[839,1123,1124],{"align":822},[509,1125,1126],{},"@heximon\u002Fmcp",[839,1128,1108,1129,1132,1133],{"align":822},[509,1130,1131],{},"new McpServerGenerator(...)"," from your own controller, mark routes with ",[509,1134,1135],{},".mcp({})",[839,1137,1138],{"align":822},[858,1139,204],{"href":205},[817,1141,1142,1144,1149,1163],{},[839,1143,209],{"align":822},[839,1145,1146],{"align":822},[509,1147,1148],{},"@heximon\u002Fschema",[839,1150,1151,1152,1155,1156,1159,1160],{"align":822},"no plugin — ",[509,1153,1154],{},"class X extends SchemaObject({...})"," used directly in a route's ",[509,1157,1158],{},"body","\u002F",[509,1161,1162],{},"responses",[839,1164,1165],{"align":822},[858,1166,209],{"href":210},[817,1168,1169,1171,1176,1182],{},[839,1170,214],{"align":822},[839,1172,1173],{"align":822},[509,1174,1175],{},"@heximon\u002Fprimitives",[839,1177,1151,1178,1181],{"align":822},[509,1179,1180],{},"type UserId = Branded\u003Cstring, \"UserId\">",", zero runtime cost",[839,1183,1184],{"align":822},[858,1185,214],{"href":215},[515,1187,1189],{"id":1188},"production-concerns-not-architecture","Production concerns, not architecture",[499,1191,1192,1193,1196],{},"Everything above makes an app that already works ",[505,1194,1195],{},"operationally sound"," — durable retries, observable,\ncache-fast, rate-limited. None of it asks you to restructure how you model your domain.",[499,1198,1199,1200,1202],{},"When your domain itself starts pushing back — multiple features converging on the same invariant, a process\nthat needs a deadline, consistency that has to cross a service boundary — that's a different tier of problem,\nand ",[858,1201,219],{"href":225}," is the gate that tells you which piece to reach for.",[1204,1205,1206],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":532,"searchDepth":573,"depth":573,"links":1208},[1209,1210,1211],{"id":517,"depth":573,"text":518},{"id":808,"depth":573,"text":809},{"id":1188,"depth":573,"text":1189},"The capability map — every production concern (events, background jobs, cron, caching, storage, health, notifications, idempotency, security, tracing, OpenAPI, MCP, schema, branded ids) and the one config line each one adds.","md",null,{},{"icon":137,"title":142},{"title":136,"description":1212},"oYzns1sTR2TXmPmjAS3deIVorsWs7OJm9ePGmlzU_uA",[1220,1222],{"title":131,"path":132,"stem":133,"description":1221,"icon":134,"children":-1},"The recommended directory layout for a Heximon app — one folder per feature module, the three config files, naming conventions, and the generated boot entry.",{"title":146,"path":147,"stem":148,"description":1223,"icon":149,"children":-1},"Decouple features with events across three tiers — the in-process EventBus, EventHandler and NotificationHandler, and domain events on aggregates with DomainEvents.emitFrom.",1783300761903]